#include "stdafx.h" #include "TPipeCanalJig.h" #include "TVirtualPipeCanal.h" #include "DbPipeCanal.h" #include "TwtDef.h" #include "TAPI.h" #include #include "DrawPipeCanalDlg.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #define NUM_PI 180.0 void DrawPipeCanal1() { CTemporaryResourceOverride vTemp; CDrawPipeCanalDlg *pDlg = new CDrawPipeCanalDlg; if (pDlg != NULL) { pDlg->Create(IDD_DRAW_PIPECANAL); pDlg->ShowWindow(SW_SHOW); } AcDbLine *pLine = new AcDbLine; XPoint ptS,ptE; acedGetPoint(NULL,_T("\n请选择起点<退出>:"),ptS); acedGetPoint(NULL,_T("\n请选择终点<退出>:"),ptE); pLine->setStartPoint(ptS); pLine->setEndPoint(ptE); AddToCurrentSpace(pLine,Adesk::kTrue); if (pDlg != NULL) { delete pDlg; pDlg = NULL; } } //绘制方沟 void DrawPipeCanal() { int nKey = 0; XPoint ptS,ptE; // double dWidth = 5*DocGetPScale(); // acedGetReal(_T("\n请输入方沟宽度(500mm):"),&dWidth); // int nStyle = 1; // acedGetInt(_T("\n请输入方沟样式(1-5):"),&nStyle); // if (nStyle < 1 || nStyle > 5) // nStyle = 1; // 绘制方沟对话框实现 zxl 2012.10.11 modify double dWidth = 5*DocGetPScale(); int nStyle = 1; CTemporaryResourceOverride vTemp; CDrawPipeCanalDlg *pDlg = new CDrawPipeCanalDlg; if (pDlg != NULL) { pDlg->Create(IDD_DRAW_PIPECANAL); pDlg->ShowWindow(SW_SHOW); } int nEs = acedGetPoint(NULL,_T("\n请选择方沟起点<退出>:"),ptS); // cet 2012.3.26 add if (nEs != RTNORM) { pDlg->DestroyWindow(); delete pDlg; pDlg = NULL; SHads_command(RTNONE); return; } if (pDlg != NULL) { pDlg->UpdateData(TRUE); nStyle = pDlg->m_nCanalType; dWidth = pDlg->m_dCanalWidth; } xg_setvar(_T("CMDECHO"), 0); // 关闭回显 static bool bUseDial = false; // 记录刻度盘上次是否使用 TPipeCanalJig jig; jig.EnableDial(bUseDial); // cet 2012.3.26 add while (nEs == RTNORM) { AcGePoint3d ptGeS = Ucs2Wcs(ptS); while (TRUE) { TDbPipeCanal *pCanal = new TDbPipeCanal; pCanal->SetDoteLayer(InitLayer(LAY_TWT_DOTE)); pCanal->setLinetype(_T("CONTINUOUS")); pCanal->SetPipeWeight(g_nPipeWidth[0]); pCanal->SetModelType(TPipeSys::kModel); pCanal->SetMaterial(0); pCanal->SetWidth(dWidth); pCanal->SetHeight(dWidth); pCanal->SetSpare(dWidth/2.5); pCanal->SetCanalType(nStyle); // cet 2014.4.21 modify // pCanal->setLayer(InitLayer(LAY_PIPE_RAIN)); pCanal->setLayer(InitLayer(LAY_TWT_BOX_DRAIN)); pCanal->setColor(AcCmColor()); //随层 //cet 2012.3.26 modify 控制刻度盘使用 //jig.setDispPrompt(_T("\n请选择下一点[回退(u)]:")); //jig.SetKeyword(_T("u ")); jig.setDispPrompt(_T("\n请选择下一点[启用刻度盘(A)/禁用刻度盘(S)/回退(U)]:")); jig.SetKeyword(_T("A S U")); jig.SetPipeCanalPtr(pCanal); jig.SetStartPoint(ptGeS); jig.GetDlgData(pDlg); nEs = jig.DoIt(&nKey); if (pDlg != NULL) { pDlg->UpdateData(TRUE); nStyle = pDlg->m_nCanalType; dWidth = pDlg->m_dCanalWidth; } jig.GetStartPoint(ptGeS); if (nEs != RTNORM && nEs != RTKWORD) { break; } bUseDial = jig.IsDrawDial(); // cet 2012.3.26 add } AcGeVector3d vtDir; jig.SetVtBefore(vtDir); nEs = acedGetPoint(NULL,_T("\n请选择方沟起点<退出>:"),ptS); if (nEs != RTNORM) break; if (pDlg != NULL) { pDlg->UpdateData(TRUE); nStyle = pDlg->m_nCanalType; dWidth = pDlg->m_dCanalWidth; } } if (pDlg != NULL) { pDlg->DestroyWindow(); delete pDlg; pDlg = NULL; } SHads_command(RTNONE); // acedPostCommand(_T("\33")); } TPipeCanalJig::TPipeCanalJig() { m_pVirtual = new TVirtualPipeCanal; m_pCanal = NULL; m_dAverageAng = PI/12; m_bUseDial = false; // cet 2012.3.26 add } TPipeCanalJig::~TPipeCanalJig() { if (m_pVirtual != NULL) delete m_pVirtual; } int TPipeCanalJig::DoIt(int *pKeyIndex) { m_ptE = m_ptS; if (m_pVirtual != NULL) m_pVirtual->SetCanalPtr(m_pCanal); int nRet = TSymbEdJig::DoIt(pKeyIndex); if (nRet == RTNORM) { m_vtBefore = m_ptE - m_ptS; m_vtBefore.normalize(); m_arBeforePt.append(m_ptS); m_ptS = m_ptE; SHads_command(RTSTR, _T(".UNDO"), RTSTR, _T("MARK"), NULL); AddToCurrentSpace(m_pCanal,Adesk::kTrue); TPipePerDocData *pData = GetCurPipeDocData(); pData->ApplyUpdates(); } else if (nRet == RTKWORD) { // cet 2012.3.26 modify 控制刻度盘的使用 // if (m_arBeforePt.length() > 0) // { // m_ptS = m_arBeforePt.last(); // m_arBeforePt.removeLast(); // SHads_command(RTSTR, _T("UNDO"), RTSTR, _T("BACK"), NULL); // } if (pKeyIndex != NULL) { if (*pKeyIndex == 0) //O { m_bUseDial = true; } else if (*pKeyIndex == 1) //S { m_bUseDial = false; } else if (*pKeyIndex == 2) //U { if (m_arBeforePt.length() > 0) { m_ptS = m_arBeforePt.last(); m_arBeforePt.removeLast(); SHads_command(RTSTR, _T("UNDO"), RTSTR, _T("BACK"), NULL); } } } } return nRet; } AcEdJig::DragStatus TPipeCanalJig::GetPoint(XPoint &pt) { AcEdJig::DragStatus sta = acquirePoint(pt,m_ptS); // cet 2012.3.26 add 不使用刻度盘 if (!m_bUseDial) { m_ptE = pt; return sta; } //得到起点和终点的连线向量 AcGeVector3d vtNorm = AcGeVector3d::kZAxis; AcGeVector3d vt = pt - m_ptS; if (vt.isZeroLength()) return kNoChange; vt = vt.orthoProject(vtNorm); //得到起始方向向量 AcGeVector3d vtT = AcGeVector3d::kXAxis; if (!m_vtBefore.isZeroLength()) { vtT = m_vtBefore; vtT.normalize(); } //按固定角度旋转 int nIndex = (int)((vt.angleTo(vtT) + m_dAverageAng/2)/ m_dAverageAng); CString sText; sText.Format(_T("%.0f"),vt.angleTo(vtT) * (NUM_PI / PI)); AcGeVector3d vtT2 = vtT; vtT2.rotateBy(PI/2,vtNorm); if (vt.angleTo(vtT2) < PI/2) { vt = vtT; vt.rotateBy(m_dAverageAng*nIndex,vtNorm); } else { vt = vtT; vt.rotateBy(2*PI - m_dAverageAng*nIndex,vtNorm); } if (m_pVirtual != NULL) m_pVirtual->SetStartVector(vt); sText.Format(_T("%.0f"),(NUM_PI / PI) * m_dAverageAng * nIndex); if (m_pVirtual != NULL) m_pVirtual->SetText(pt,sText); AcDbLine line(m_ptS,m_ptS + vt); AcGePoint3d ptOth; line.getClosestPointTo(pt,ptOth,Adesk::kTrue); if (sta == kNormal) { if (ptOth.distanceTo(m_ptE) > 1e-3) { m_ptE = ptOth; } else return kNoChange; } return sta; } Adesk::Boolean TPipeCanalJig::update() { if (m_pVirtual != NULL) { m_pDlg->UpdateData(TRUE); m_pCanal->SetWidth(m_pDlg->m_dCanalWidth); m_pCanal->SetHeight(m_pDlg->m_dCanalWidth); m_pCanal->SetSpare(m_pDlg->m_dCanalWidth/2.5); m_pCanal->SetCanalType(m_pDlg->m_nCanalType); m_pVirtual->SetCanalStartPt(m_ptS); m_pVirtual->SetCanalEndPt(m_ptE); m_pVirtual->SetCenPoint(m_ptS); m_pVirtual->SetPanState(FALSE); m_pVirtual->SetAverageAng(m_dAverageAng); // cet 2012.3.26 add 是否使用刻度盘 m_pVirtual->EnabelDrawWatch(m_bUseDial); } return Adesk::kTrue; } void TPipeCanalJig::GetDlgData(CDrawPipeCanalDlg *pDlg) { m_pDlg = pDlg; } AcDbEntity* TPipeCanalJig::entity() const { return m_pVirtual; } void TPipeCanalJig::SetStartPoint(const AcGePoint3d &pt) { m_ptS = pt; } void TPipeCanalJig::GetEndPoint(AcGePoint3d &pt) { pt = m_ptE; } void TPipeCanalJig::SetPipeCanalPtr(TDbPipeCanal *&pCanal) { m_pCanal = pCanal; } void TPipeCanalJig::GetStartPoint(AcGePoint3d &pt) { pt = m_ptS; } void TPipeCanalJig::SetVtBefore(const AcGeVector3d &vtBefore) { m_vtBefore = vtBefore; } void TPipeCanalJig::EnableDial( bool bEnable ) { m_bUseDial = bEnable; } bool TPipeCanalJig::IsDrawDial() { return m_bUseDial; }