Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/HandRailDlg.cpp
T
2026-09-28 15:28:50 +08:00

288 lines
7.5 KiB
C++

// RailDlg.cpp : implementation file
//
#include "stdafx.h"
#include "HandRailDlg.h"
#include "actrans.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHandRailDlg dialog
CHandRailDlg::CHandRailDlg(TDbHandRail *pRail, CWnd* pParent /*=NULL*/)
: CAcUiDialog(CHandRailDlg::IDD, pParent)
{
m_pRail = pRail;
//{{AFX_DATA_INIT(CHandRailDlg)
m_bShow2D = TRUE;
m_bShow3D = TRUE;
m_csHeight = _T("");
m_csThick = _T("");
m_csWidth = _T("");
m_nAlign = 0;
m_nShape = 0;
//}}AFX_DATA_INIT
Obj2Dlg(pRail);
}
void CHandRailDlg::DoDataExchange(CDataExchange* pDX)
{
CAcUiDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CHandRailDlg)
DDX_Check(pDX, IDC_CHECK_SHOW2D, m_bShow2D);
DDX_Check(pDX, IDC_CHECK_SHOW3D, m_bShow3D);
DDX_Text(pDX, IDC_EDIT_HEIGHT, m_csHeight);
DDX_Text(pDX, IDC_EDIT_THICK, m_csThick);
DDX_Text(pDX, IDC_EDIT_WIDTH, m_csWidth);
DDX_Radio(pDX, IDC_RADIO_ALIGN_MID, m_nAlign);
DDX_Radio(pDX, IDC_RADIO_RECT, m_nShape);
//}}AFX_DATA_MAP
if (!pDX->m_bSaveAndValidate) {
CWnd *pWnd1, *pWnd2, *pWnd3;
pWnd1 = GetDlgItem(IDC_STATIC_SHAPE);
pWnd2 = GetDlgItem(IDC_EDIT_THICK);
pWnd3 = GetDlgItem(IDC_STATIC_THICK);
if (m_nShape == 1) {
pWnd1->SetWindowText(_T("直径:"));
} else {
pWnd1->SetWindowText(_T("宽度:"));
}
if (m_nShape==0) {
pWnd2->EnableWindow(TRUE);
pWnd3->EnableWindow(TRUE);
} else {
pWnd2->EnableWindow(FALSE);
pWnd3->EnableWindow(FALSE);
}
}
}
BEGIN_MESSAGE_MAP(CHandRailDlg, CAcUiDialog)
//{{AFX_MSG_MAP(CHandRailDlg)
ON_BN_CLICKED(IDC_RADIO_CIRLE, OnUpdateDlg)
ON_BN_CLICKED(IDC_RADIO_RECT, OnUpdateDlg)
ON_BN_CLICKED(IDC_BT_ADD, OnBtAdd)
ON_BN_CLICKED(IDC_BT_REMOVE, OnBtRemove)
ON_BN_CLICKED(IDC_BT_MODIFY, OnBtModify)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHandRailDlg message handlers
BOOL CHandRailDlg::OnInitDialog()
{
CAcUiDialog::OnInitDialog();
UpdateData(TRUE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CHandRailDlg::Dlg2Obj()
{
UpdateData(TRUE);
if (m_pRail->upgradeOpen()!=Acad::eOk)
return;
m_pRail->assertWriteEnabled();
m_pRail->SetWidth(_tstof(m_csWidth));
m_pRail->SetThickness(_tstof(m_csThick));
m_pRail->SetHeight(_tstof(m_csHeight));
m_pRail->SetHas2D(m_bShow2D);
m_pRail->SetHas3D(m_bShow3D);
m_pRail->SetAlignment(m_nAlign);
if (m_nShape == 0)
m_pRail->SetStyle(TDbHandRail::RS_RAIL1);
else if (m_nShape == 1)
m_pRail->SetStyle(TDbHandRail::RS_RAIL2);
else
m_pRail->SetStyle(TDbHandRail::RS_SLAB);
m_pRail->downgradeOpen();
}
void CHandRailDlg::Obj2Dlg(const TDbHandRail *pRail)
{
m_csWidth = Dist2Str(pRail->GetWidth());
m_csThick = Dist2Str(pRail->GetThickness());
m_csHeight = Dist2Str(pRail->GetHeight());
m_bShow2D = pRail->Has2D();
m_bShow3D = pRail->Has3D();
m_nAlign = (int)pRail->GetAlignment();
if (pRail->GetStyle() == TDbHandRail::RS_RAIL1) //矩形长条
m_nShape = 0;
else if (pRail->GetStyle() == TDbHandRail::RS_RAIL2)//圆形
m_nShape = 1;
else
m_nShape = 2;
}
void CHandRailDlg::OnUpdateDlg()
{
UpdateData(TRUE);
UpdateData(FALSE);
}
void CHandRailDlg::OnBtAdd()
{
BeginEditorCommand();
int nOsMode=0;
xg_getvar(_T("OSMODE"), &nOsMode);
nOsMode &= ~0x4000;
nOsMode |= OS_INT;
XPushVar<int> tVar(_T("OSMODE"), nOsMode);
XPoint ptAdd;
if (XGetPoint(NULL, _T("\n点取新的顶点位置"), ptAdd)==RTNORM) {
if (m_pRail->upgradeOpen()!=Acad::eOk) {
CancelEditorCommand();
return;
}
if (!m_pRail->AddVertex(ptAdd)) {
adsout << _T("\n请正确点取!");
}
m_pRail->downgradeOpen();
}
actrTransactionManager->flushGraphics(); //acad 刷新
acedUpdateDisplay();
//acedGetAcadDwgView()->Invalidate(); //或用MFC刷新 (一样)
CompleteEditorCommand();
}
void CHandRailDlg::OnBtRemove()
{
BeginEditorCommand();
XPushVar<int> osmode(_T("OSMODE"), OS_NOD);
XPoint ptVert;
while(ads_getpoint(NULL, _T("\n选取顶点: "), ptVert)==RTNORM) {
int nPos=m_pRail->HitTestOnRail2d(ptVert);
if (nPos>0) {
nPos--;
if (m_pRail->upgradeOpen()!=Acad::eOk) {
CancelEditorCommand();
return;
}
m_pRail->RemoveVertexAt(nPos);
m_pRail->downgradeOpen();
}
}
actrTransactionManager->flushGraphics(); //acad 刷新
acedUpdateDisplay();
CompleteEditorCommand();
}
void CHandRailDlg::OnBtModify()
{
BeginEditorCommand();
XPushVar<int> osmode(_T("OSMODE"), OS_NOD);
XPoint ptVert;
while(ads_getpoint(NULL, _T("\n选取顶点: "), ptVert)==RTNORM) {
int nPos=m_pRail->HitTestOnRail2d(ptVert);
if (nPos>0) {
nPos--;
if (nPos==0) {
XPoly2D poly2d;
m_pRail->GetBaseline2d(poly2d);
if (poly2d.IsClosed()) {
int nAns=YesNoQuestion(_T("\n起点和终点的平面投影相同,您指的是起点吗"));
if (nAns==RTCAN)
continue;
else if (nAns==Q_NO)
nPos = poly2d.Length();
}
}
double nElev=m_pRail->GetElevationAt(nPos);
adsout << _T("\n改夹角[A]/点取[P]/输入顶点标高<")
<< Dist2Str(nElev)
<< _T(">: ");
int nCode;
INITGET_BEG(0, _T("A P"));
nCode=ads_getreal(_T(""), &nElev);
INITGET_END();
if (nCode==RTKWORD) {
TCHAR szKey[80]=_T("");
ads_getinput(szKey);
if (szKey[0]==_T('P')) {
XPushVar<int> osMode(_T("OSMODE"), OS_NEA);
XPoint ptElev;
nCode=ads_getpoint(NULL, _T("\n点取参照物:"), ptElev);
if (nCode==RTNORM) {
nElev=ptElev.z;
if (m_pRail->upgradeOpen()!=Acad::eOk) {
CancelEditorCommand();
return;
}
m_pRail->assertWriteEnabled();
m_pRail->SetElevationAt(nPos, nElev);
m_pRail->downgradeOpen();
actrTransactionManager->flushGraphics(); //acad 刷新
acedUpdateDisplay();
}
} else if (szKey[0]==_T('A')) {
double nOldAng=m_pRail->GetSweepAngleAt(nPos)*180.0/PI;
nCode=GetReal(_T("\n输入夹角"), nOldAng);
if (nCode==RTNORM) {
nOldAng *= PI/180.0;
if (m_pRail->upgradeOpen()!=Acad::eOk) {
CancelEditorCommand();
return;
}
m_pRail->assertWriteEnabled();
m_pRail->SetSweepAngleAt(nPos, nOldAng);
m_pRail->downgradeOpen();
actrTransactionManager->flushGraphics(); //acad 刷新
acedUpdateDisplay();
}
}
} else if (nCode==RTNORM) {
if (m_pRail->upgradeOpen()!=Acad::eOk) {
CancelEditorCommand();
return;
}
m_pRail->assertWriteEnabled();
m_pRail->SetElevationAt(nPos, nElev);
m_pRail->downgradeOpen();
actrTransactionManager->flushGraphics(); //acad 刷新
acedUpdateDisplay();
}
} else {
adsout << _T("\n请正确点取!");
}
}
CompleteEditorCommand();
}
void CHandRailDlg::OnOK()
{
UpdateData(TRUE);
Dlg2Obj();
CAcUiDialog::OnOK();
}