// 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 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 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 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 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(); }