#include "stdafx.h" #include "PipeSettingFrameDlg.h" #include "PipeWireMonitor.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////管线升降//////////////////////////////////////////////////// void CreatNewPipe(const TDbPipe *const &pPipe, const std::vector &vecPts) { std::vector::const_iterator it = vecPts.begin(); XPoint ptS = *it++, ptE; for (; it != vecPts.end(); it++) { ptE = *it; TDbPipe *pPipeNew = (TDbPipe *)pPipe->clone(); if (ptS.Distance2d(ptE) < 0.001) { pPipeNew->SetRadiusIn(0.0); } pPipeNew->SetStartPoint(ptS); pPipeNew->SetEndPoint(ptE); pPipeNew->ResetAllShip(); ptS = ptE; AddToCurrentSpace(pPipeNew, Adesk::kTrue); } } bool UpDownPipe(Entity entPipe, const AcGePoint3d pt1, const AcGePoint3d pt2) { double dDist = 0.0; double dUnit = 1000; if (DocGetMeterUnitDraw()) { dUnit = 1.0; } OPENOBJ_BEGIN(entPipe, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe != NULL) { AcGePoint3d ptOnPipe1, ptOnPipe2, ptS, ptE; ptS = pPipe->GetStartPoint(); ptE = pPipe->GetEndPoint(); pPipe->getClosestPointTo(pt1, ptOnPipe1); pPipe->getClosestPointTo(pt2, ptOnPipe2); double dElev = (ptOnPipe1.z + ptOnPipe2.z) / 2 / dUnit; CString sText; sText.Format(_T("\n请输入升降高差[当前管段管中心标高:%.3fm]:<退出>"), dElev); while (true) { int nRet = ads_getreal(sText, &dDist); if (nRet != RTNORM) { return false; } if (fabs(dDist) < 0.001) { ads_printf(_T("\n请正确输入升降高差!")); } else { break; } } AcGePoint3d ptUp1 = ptOnPipe1; ptUp1.z += (dDist * dUnit); AcGePoint3d ptUp2 = ptOnPipe2; ptUp2.z += (dDist * dUnit); std::vector vecPts; double d1 = ptS.distanceTo(ptOnPipe1); double d2 = ptS.distanceTo(ptOnPipe2); if (d1 - d2 > 0.0) { pPipe->SetEndPoint(ptOnPipe2); vecPts.push_back(ptOnPipe2); vecPts.push_back(ptUp2); vecPts.push_back(ptUp1); vecPts.push_back(ptOnPipe1); } else { pPipe->SetEndPoint(ptOnPipe1); vecPts.push_back(ptOnPipe1); vecPts.push_back(ptUp1); vecPts.push_back(ptUp2); vecPts.push_back(ptOnPipe2); } vecPts.push_back(ptE); CreatNewPipe(pPipe, vecPts); } OPENOBJ_END(); return true; } void PipeWireUpDown() { RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); Entity entSel, entSel2; XPoint ptPick, ptPick2; while(SelectEntity1(g_nCurPipeWidth*DocGetPScale(), _T("\n请选取水管上第一点<退出>:"), entSel, ptPick, rbMask) == RTNORM) { int nOsMode=0; nOsMode |= OS_INT|OS_NEA; XPushVar vOsMode(_T("OSMODE"), nOsMode); if(SelectEntity1(g_nCurPipeWidth*DocGetPScale(), _T("\n请选取该水管上第二点<退出>:"), entSel2, ptPick2, rbMask) != RTNORM) return; if (!(entSel == entSel2)) { ads_printf(_T("\n两次点取的水管不一致,请重新点取!")); continue; } ptPick = Ucs2Wcs(ptPick); ptPick2 = Ucs2Wcs(ptPick2); if (!UpDownPipe(entSel, ptPick, ptPick2)) { return; } TPipePerDocData *pData = GetCurPipeDocData(); pData->ApplyUpdates(); } } /////////////////////////////////////////////////////end///////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// BOOL InvokeLineTypeMan() { RBList rbCmd=ads_buildlist(RTSTR, _T("ILineTypeMan"), NULL); resbuf *rbRes=NULL; if(ads_invoke(rbCmd, &rbRes)==RTNORM && rbRes) { ads_relrb(rbRes); return TRUE; } return FALSE; } extern TARCH_IMPEXP void InitLayers(BOOL bTrue); CPipeSettingFrameDlg::CPipeSettingFrameDlg(CWnd* pParent /*=NULL*/) : CDialog(CPipeSettingFrameDlg::IDD, pParent) { //{{AFX_DATA_INIT(CPipeSettingFrameDlg) m_bCheckByLayer = FALSE; m_bModify = FALSE; //}}AFX_DATA_INIT } void CPipeSettingFrameDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPipeSettingFrameDlg) DDX_Control(pDX, IDC_TAB_PIPE_SET, m_tabPipeSet); DDX_Check(pDX, IDC_CHECK_BYLAYER, m_bCheckByLayer); DDX_Check(pDX, IDC_CHECK_MODIFY, m_bModify); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPipeSettingFrameDlg, CDialog) //{{AFX_MSG_MAP(CPipeSettingFrameDlg) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_PIPE_SET, OnSelchangeTabPipeSet) ON_BN_CLICKED(IDC_BUTTON_NEW, OnButtonNew) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CPipeSettingFrameDlg::OnInitDialog() { CDialog::OnInitDialog(); //加载项目 m_tabPipeSet.InsertItem(0,_T("常用")); m_tabPipeSet.InsertItem(1,_T("自定义")); m_tabPipeSet.InsertItem(2,_T("中高区")); m_normDlg.Create(IDD_PIPE_SET_CHILD1,&m_tabPipeSet); m_defineDlg.Create(IDD_PIPE_SET_CHILD2,&m_tabPipeSet); m_altDlg.Create(IDD_PIPE_SET_CHILD3,&m_tabPipeSet); CRect rtTab; m_tabPipeSet.GetClientRect(&rtTab); rtTab.top += 20; m_normDlg.MoveWindow(rtTab); m_defineDlg.MoveWindow(rtTab); m_altDlg.MoveWindow(rtTab); m_normDlg.ShowWindow(SW_SHOW); return TRUE; } void CPipeSettingFrameDlg::OnSelchangeTabPipeSet(NMHDR* pNMHDR, LRESULT* pResult) { int nCur = m_tabPipeSet.GetCurSel(); switch(nCur) { case 0: m_normDlg.ShowWindow(SW_SHOW); m_defineDlg.ShowWindow(SW_HIDE); m_altDlg.ShowWindow(SW_HIDE); break; case 1: m_normDlg.ShowWindow(SW_HIDE); m_defineDlg.ShowWindow(SW_SHOW); m_altDlg.ShowWindow(SW_HIDE); break; case 2: m_normDlg.ShowWindow(SW_HIDE); m_defineDlg.ShowWindow(SW_HIDE); m_altDlg.ShowWindow(SW_SHOW); break; default: break; } *pResult = 0; } void CPipeSettingFrameDlg::OnOK() { UpdateData(); m_normDlg.m_bModify = m_bModify; m_defineDlg.m_bModify = m_bModify; m_altDlg.m_bModify = m_bModify; m_normDlg.m_bLineTypeByLayer = m_bCheckByLayer; m_defineDlg.m_bLineTypeByLayer = m_bCheckByLayer; m_altDlg.m_bLineTypeByLayer = m_bCheckByLayer; m_normDlg.UpdateDlgData(FALSE); m_defineDlg.UpdateDlgData(FALSE); m_altDlg.UpdateDlgData(FALSE); InitLayers(TRUE); CDialog::OnOK(); } void CPipeSettingFrameDlg::OnButtonNew() { InvokeLineTypeMan(); m_normDlg.ResetLineCombox(); m_defineDlg.ResetLineCombox(); m_altDlg.ResetLineCombox(); }