#include "stdafx.h" #include "AECStatusRecord.h" #include "AecDbDuctJig.h" #include "FGBZDlg.h" #include "AecDbDuctLine.h" #include "ReducerDlg.h" #include "ChangElDlg.h" #include "TJXGDlg.h" #include "CoreTools.h" #include "AecDbHvacDuct.h" #include "KTCADSysVar.h" #ifndef DXF_PIPE #define DXF_PIPE _T("AEC_DBDUCT") #endif static double FormatZero(double dVal) { if ( fabs(dVal) < 1.e-6 ) return 0.0; int nVal = (int)(dVal * 1000.0); return nVal / 1000.0; } AecDbDuctJig::AecDbDuctJig(void) { m_pPipeLine = new AecDbDuctLine(this); m_tStartIntf.vtDir = AcGeVector3d::kIdentity; m_tStartIntf.ptPos = AcGePoint3d::kOrigin; m_vtStaDir.set(0.0,0.0,0.0); InitStatusRecs(); m_nUndoGoupid = 0; } AecDbDuctJig::AecDbDuctJig(AecHvac::DuctParam ¶m) { m_pPipeLine = new AecDbDuctLine(this); m_pPipeLine->SetPipeParam(¶m); m_tStartIntf.vtDir = AcGeVector3d::kIdentity; m_tStartIntf.ptPos = AcGePoint3d::kOrigin; m_vtStaDir.set(0.0, 0.0, 0.0); InitStatusRecs(); m_nUndoGoupid = 0; } AecDbDuctJig::~AecDbDuctJig(void) { } void AecDbDuctJig::InitStatusRecs() { //1.起端为管子的状态 AECStatusRecord* pRec1 = NULL; pRec1 = new AECStatusRecord; m_arStaPtrs.Add(pRec1); pRec1->SetPrompt(_T("\n指定起点<退出>:")); pRec1->SetStatusType(AECStatusRecord::kPoint); pRec1->SetPlanPosition(0); AECStatusRecord* pRec2 = NULL; pRec2 = new AECStatusRecord; m_arStaPtrs.Add(pRec2); pRec2->SetPrompt(_T("\n指定下一点或 [变径(R)/立管(E)/斜管(X)/回退(U)<退出>:")); pRec2->SetStatusType(AECStatusRecord::kPoint); pRec2->SetKeywordList(_T("R E X U")); pRec1->SetNextStatus(pRec2); pRec2->SetPlanPosition(1); pRec2->SetNextStatus(pRec2,1); m_pCurStaRec = pRec1; } void AecDbDuctJig::SetAngleWath(AcGePoint3d& ptCen,const AcGePoint3d& ptGeTo,const AcGeVector3d& vtDir) { ((AecDbDuctLine *)m_pPipeLine)->SetAngleWath(ptCen,ptGeTo,vtDir); } void AecDbDuctJig::CalReferencePoint() { AcGePoint3d ptWcs; ads_point ptBase,pt22,pt33; acedInitGet(RSG_NONULL,_T("R")); int nRes = acedGetPoint(NULL,_T("\n指定起点或[参考点(R)]<退出>:"),ptBase); switch(nRes) { case RTNORM: { acdbUcs2Wcs(ptBase,pt22,false); ptWcs = asPnt3d(pt22); ptWcs.z = ((AecDbDuctLine*)m_pPipeLine)->GetEndElevation(); m_pCurStaRec->SetAcquirePoint(ptWcs); //压入本次状态,起点 m_pCurStaRec->SetAcquirePoint(ptWcs); AECStatusRecord * pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); pRec->SetUndoGroupId(0); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos()); m_pCurStaRec->SetAcquirePoint(ptWcs); break; } case RTKWORD: { TCHAR szKey[2]; szKey[0] = '0'; acedGetInput(szKey); switch(szKey[0]) { case _T('R'): case _T('r'): { //参考点<退出>: nRes = acedGetPoint(NULL,_T("\n参考点<退出>:"),ptBase); if (nRes == RTNORM) { //起点<退出>: nRes = acedGetPoint(ptBase,_T("\n指定起点<退出>:"),pt22); if (nRes == RTNORM) { acdbUcs2Wcs(pt22,pt33,false); ptWcs = asPnt3d(pt33); ptWcs.z = ((AecDbDuctLine*)m_pPipeLine)->GetEndElevation(); m_pCurStaRec->SetAcquirePoint(ptWcs); //压入本次状态,起点 m_pCurStaRec->SetAcquirePoint(ptWcs); AECStatusRecord * pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); pRec->SetUndoGroupId(0); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos()); m_pCurStaRec->SetAcquirePoint(ptWcs); } } break; } default: break; } } default: { break; } } } BOOL AecDbDuctJig::DoIt(WPipe::EApp app, BOOL bParamDlg/* = TRUE*/,BOOL bCalRefPoint/* = TRUE*/) { CAcModuleResourceOverride myResources; if (bParamDlg) { CFGBZDlg drawCnfgDLg; drawCnfgDLg.EnableLoadLast(TRUE); int nRes = drawCnfgDLg.DoModal(); if (nRes != IDOK) { return FALSE; } AecHvac::DuctParam param; memset(¶m,0,sizeof(AecHvac::DuctParam)); param.m_app = app; drawCnfgDLg.GetPipeParam(¶m); ((AecDbDuctLine*)m_pPipeLine)->SetPipeParam(¶m); } //参考 if (bCalRefPoint) { CalReferencePoint(); } AcEdJig::DragStatus eStat; int nPlanPos = 0; while(TRUE) { CString sPrompt = m_pCurStaRec->Prompt(); SetDispPromptWithEleTip(sPrompt); setDispPrompt(sPrompt); if (((AecDbDuctLine*)m_pPipeLine)->PipeFinished()) { break; } eStat = drag(); nPlanPos = m_pCurStaRec->GetPlanPosition(); switch(eStat) { case AcEdJig::kNormal: { if (nPlanPos == 1) //Create Pipe { //设置回退记录 SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("BE"),RTNONE); SetUndoGroupBegin(); if ( ((AecDbDuctLine *)m_pPipeLine)->AddPipeNode(m_pCurStaRec,WPipe::eToCreate) ) { AECStatusRecord* pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); if (m_pCurStaRec->IsCommand2Stop()) { return TRUE; } } else { ((AecDbDuctLine *)m_pPipeLine)->PipeFinished(); return FALSE; } m_vtStaDir.set(0,0,0);//reset SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("E"),RTNONE); SetUndoGroupEnd(); } break; } case AcEdJig::kCancel: case AcEdJig::kNull:// 退出 { acutPrintf(_T("\n")); return FALSE; } case AcEdJig::kKW1://R 变径 { //至少创建了一个管段 if (((AecDbDuctLine*)m_pPipeLine)->GetLastInterface() == NULL) { acutPrintf(_T("\n之前没有创建管段,无法变径!")); continue; } AcGeVector3d vtDir; AecInterface* pIntf = ((AecDbDuctLine*)m_pPipeLine)->GetLastInterface(); if (pIntf == NULL) vtDir = AcGeVector3d::kXAxis; else vtDir = pIntf->vtDir; CReducerDlg redDLg; AecHvac::DuctParam param; memset(¶m,0,sizeof(AecHvac::DuctParam)); memcpy(¶m,((AecDbDuctLine*)m_pPipeLine)->GetPipeParam(),sizeof(AecHvac::DuctParam)); param.dSize[3] = param.dSize[0]; redDLg.SetCurWidth(param.dSize[0],param.m_dRatio * param.dSize[0]); redDLg.SetCurHeight(param.dSize[1]); int nRes = redDLg.DoModal(); if (nRes == IDOK) { AcGePoint3d ptSize; CPoint ptEc = redDLg.GetReducer(ptSize,param.dSize[4]); param.dSize[3] = ptSize.y;//End param.m_dL = ptSize.z; param.m_nEcCen = ptEc.x; param.m_nZEcCen = ptEc.y; //设置回退记录 SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("BE"),RTNONE); SetUndoGroupBegin(); if ( ( (AecDbDuctLine *)m_pPipeLine)->AddReducer(m_pCurStaRec,¶m) ) { AECStatusRecord* pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); //后续管子继承变径 AecHvac::DuctParam* pCurParm = ((AecDbDuctLine*)m_pPipeLine)->GetPipeParam(); pCurParm->dSize[0] = param.dSize[3];//开始宽度 pCurParm->dSize[1] = param.dSize[4];//高度 } SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("E"),RTNONE); SetUndoGroupEnd(); } break; } case AcEdJig::kKW2://E 标高 { CChangElDlg chelDlg; double dEl = ((AecDbDuctLine*)m_pPipeLine)->GetPipeParam()->m_dEl; double dH = m_pPipeLine->GetPipeParam()->dSize[1]; //上来就绘制立管,至少创建了一个管段 if (((AecDbDuctLine*)m_pPipeLine)->GetLastInterface() == NULL) { //可以改为仅仅改标高对话框,当没有状态记录时 //acutPrintf(_T("\n之前没有创建管段,无法变标高!")); //当前位置选择到实体的话,更新标高 AECStatusRecord* pRec = GetTailStatusRec(); dEl = PickWPipehereEl(pRec->GetAcquirePoint()); ((AecDbDuctLine*)m_pPipeLine)->GetPipeParam()->m_dEl = dEl; //弹出标高对话框,创建立管,如果选择位置有三通,则三通连接 chelDlg.m_dCurEl = dEl + 0.5 * dH; int nRes = chelDlg.DoModal(); if (nRes == IDOK) { //设置回退记录 SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("BE"),RTNONE); SetUndoGroupBegin(); //原位置 的改标高 m_pCurStaRec->SetAcquirePoint(pRec->GetAcquirePoint()); if ( ( (AecDbDuctLine *)m_pPipeLine)->ChangeEl2(m_pCurStaRec,pRec,chelDlg.m_dNewEl - 0.5 * dH, FALSE,0.0,NULL ) ) { AECStatusRecord* pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); } SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("E"),RTNONE); SetUndoGroupEnd(); } continue; } //标高的变化 chelDlg.m_dCurEl = dEl + 0.5 * dH; int nRes = chelDlg.DoModal(); if (nRes == IDOK) { //设置回退记录 SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("BE"),RTNONE); SetUndoGroupBegin(); if ( ( (AecDbDuctLine *)m_pPipeLine)->ChangeEl(m_pCurStaRec,chelDlg.m_dNewEl - 0.5 * dH,FALSE,0.0,NULL ) ) { AECStatusRecord* pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); } SHacedCommand(RTSTR,_T("_undo"),RTSTR,_T("E"),RTNONE); SetUndoGroupEnd(); } break; } case AcEdJig::kKW3://U 回退 { //至少创建了一个管段 AECStatusRecord* pLast = GetTailStatusRec(); if ( pLast == NULL) { acutPrintf(_T("\n之前没有拾取位置点!请先拾取第一点!")); continue; } //添加斜管 CTJXGDlg dlg; dlg.m_dLastEl = ((AecDbDuctLine*)m_pPipeLine)->GetPipeParam()->m_dEl; int nRes = dlg.DoModal(); if (nRes == IDOK) { if ( fabs(dlg.m_dNewEl - dlg.m_dLastEl) < 1.e-6 )//同标高 { continue; } //设置回退记录 SHacedCommand(RTSTR, _T("_undo"), RTSTR, _T("BE"), RTNONE); SetUndoGroupBegin(); AcGePoint3d ptLast = pLast->GetAcquirePoint(); //选择下一点 ads_point pt,pt2,pt3; acdbWcs2Ucs(asDblArray(ptLast),pt,false); nRes = acedGetPoint(pt,_T("\n指定下一点:"),pt2); if (nRes == RTNORM) { AcGePoint3d ptThis; acdbUcs2Wcs(pt2,pt3,false); ptThis = asPnt3d(pt3); ptThis.z = dlg.m_dNewEl; if (((AecDbDuctLine *)m_pPipeLine)->ChangeEl3(m_pCurStaRec,ptThis)) { AECStatusRecord* pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); } } SHacedCommand(RTSTR, _T("_undo"), RTSTR, _T("E"), RTNONE); SetUndoGroupEnd(); } break; } case AcEdJig::kKW4://U 回退 { if (m_lstStaPtrsBack.GetCount() > 1) { SHacedCommand(RTSTR,_T("u"),RTNONE); PopUpStatusRec(); } else { continue; } break; } default: break; } //获取下个状态,plane判断是? if (m_pCurStaRec->GetPlanPosition() == 0 ) { AECStatusRecord * pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); pRec->SetUndoGroupId(0); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos()); } } acutPrintf(_T("\n")); return TRUE; } BOOL AecDbDuctJig::DoIt(AecInterface* pIntf,AecHvac::DuctParam* pParam) { if (pIntf == NULL) return FALSE; if (pParam == NULL) //用户确定壁厚和外径 etc. { CAcModuleResourceOverride myResources; CFGBZDlg drawCnfgDLg; double dSize(pIntf->dSize1),dSize1(pIntf->dSize2); drawCnfgDLg.SetEleReadOnly(TRUE,FormatZero(pIntf->ptPos.z));//圆整 int nRes = drawCnfgDLg.DoModal(); if (nRes == IDOK) { AecHvac::DuctParam param; memset(¶m,0,sizeof(AecHvac::DuctParam)); drawCnfgDLg.GetPipeParam(¶m); param.m_dEl = pIntf->ptPos.z;//标高确定不变 ((AecDbDuctLine*)m_pPipeLine)->SetPipeParam(¶m); } else { return FALSE; } } else { // ((AecDbDuctLine*)m_pPipeLine)->SetPipeParam(pParam); } //压入本次接口 if ( /*pParam != NULL &&*/ pIntf->idOwner.isValid()) { ((AecDbDuctLine*)m_pPipeLine)->PushInterface(*pIntf,TRUE); } //压入本次状态,起点 m_pCurStaRec->SetAcquirePoint(pIntf->ptPos); AECStatusRecord * pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); pRec->SetUndoGroupId(0); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->SetAngleWath(pIntf->ptPos,pRec->GetAcquirePoint(),pIntf->vtDir); m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos()); return DoIt(WPipe::eBridge, FALSE,FALSE); } BOOL AecDbDuctJig::DoItOnPath(WPipe::EApp app, const AcGePoint3dArray &arPts, bool bHasFit,bool bShowParamDlg) { if (bShowParamDlg) { CAcModuleResourceOverride myResources; CFGBZDlg drawCnfgDLg; drawCnfgDLg.EnableLoadLast(TRUE); int nRes = drawCnfgDLg.DoModal(); if (nRes != IDOK) { return FALSE; } AecHvac::DuctParam param; memset(¶m, 0, sizeof(AecHvac::DuctParam)); param.m_app = app; drawCnfgDLg.GetPipeParam(¶m); ((AecDbDuctLine *)m_pPipeLine)->SetPipeParam(¶m); } else { //必须构造函数设置!!!!! AecHvac::DuctParam *pParm = ((AecDbDuctLine *)m_pPipeLine)->GetPipeParam(); if (pParm == NULL) { CAcModuleResourceOverride myResources; CFGBZDlg drawCnfgDLg; drawCnfgDLg.EnableLoadLast(TRUE); int nRes = drawCnfgDLg.DoModal(); if (nRes != IDOK) { return FALSE; } AecHvac::DuctParam param; memset(¶m, 0, sizeof(AecHvac::DuctParam)); param.m_app = app; drawCnfgDLg.GetPipeParam(¶m); ((AecDbDuctLine *)m_pPipeLine)->SetPipeParam(¶m); } } //关闭提示 KTCADSysVar var1(_T("CMDECHO"), 0); AcGePoint3d ptGe; for (int i = 0; i < arPts.length(); i++) { ptGe = arPts.at(i); ptGe.z = ((AecDbDuctLine *)m_pPipeLine)->GetEndElevation(); m_pCurStaRec->SetAcquirePoint(ptGe); AfterDrag(); EndDragRecord(); } } void AecDbDuctJig::EndDragRecord() { //获取下个状态,plane判断是? if (m_pCurStaRec->GetPlanPosition() == 0) { AECStatusRecord *pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); pRec->SetUndoGroupId(0); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); m_pCurStaRec = m_pCurStaRec->GetNextStatus(m_pCurStaRec->GetPos()); } } int AecDbDuctJig::AfterDrag() { int nPlanPos = m_pCurStaRec->GetPlanPosition(); if (nPlanPos != 1) return -1; //设置回退记录 SHacedCommand(RTSTR, _T("_undo"), RTSTR, _T("BE"), RTNONE); SetUndoGroupBegin(); if (((AecDbDuctLine *)m_pPipeLine)->AddPipeNode(m_pCurStaRec, WPipe::eToCreate)) { AECStatusRecord *pRec = new AECStatusRecord; pRec->CopyFrom(m_pCurStaRec); PushBackStatusRec(pRec); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); if (m_pCurStaRec->IsCommand2Stop()) { return TRUE; } } else { ((AecDbDuctLine *)m_pPipeLine)->PipeFinished(); return FALSE; } m_vtStaDir.set(0, 0, 0);//reset SHacedCommand(RTSTR, _T("_undo"), RTSTR, _T("E"), RTNONE); SetUndoGroupEnd(); return -1; } AcEdJig::DragStatus AecDbDuctJig::sampler() { setUserInputControls( ( UserInputControls) ( AcEdJig::kAccept3dCoordinates | AcEdJig::kNullResponseAccepted ) ); CString sKeywordsList; sKeywordsList = m_pCurStaRec->KeywordList(); if (!sKeywordsList.IsEmpty()) { setKeywordList(sKeywordsList); } AcEdJig::DragStatus eStat; AcGePoint3d ptGe,ptGeBase,ptGe2; ptGeBase = AcGePoint3d::kOrigin; AECStatusRecord::EAcquire eAcquire = m_pCurStaRec->GetStatusType(); switch(eAcquire) { case AECStatusRecord::kPoint: { m_pPipeLine->SwitchAutoSnapOrF8(); //开始状态 int nPos = m_pCurStaRec->GetPlanPosition(); if (nPos == 0) { eStat = acquirePoint(ptGe); //动态获取的点的标高始终和上次一致 ptGe.z = ((AecDbDuctLine*)m_pPipeLine)->GetEndElevation(); } else { //管线的末端点 GetLastStatusAquire(ptGeBase); eStat = acquirePoint(ptGe,ptGeBase); ptGe.z = ((AecDbDuctLine*)m_pPipeLine)->GetEndElevation(); double dDist = ptGeBase.distanceTo(ptGe); if (!m_vtStaDir.isZeroLength()) { m_vtStaDir.normalize(); ptGe = ptGeBase + dDist * m_vtStaDir; } } if (eStat == AcEdJig::kNormal) { if (m_pCurStaRec->IsValSeted()) { ptGe2 = m_pCurStaRec->GetAcquirePoint(); double dDis = ptGe2.distanceTo(ptGe); if (dDis < 1.e-6) { //鼠标原地不动 return AcEdJig::kNoChange; } } ptGe2 = m_pCurStaRec->GetAcquirePoint(); m_pCurStaRec->SetAcquirePoint(ptGe); ((AecDbDuctLine *)m_pPipeLine)->AngWatchTo(ptGe); if (m_pCurStaRec->GetPlanPosition() > 0 && m_lstStaPtrsBack.GetCount() > 0) { ((AecDbDuctLine *)m_pPipeLine)->AddPipeNode(m_pCurStaRec,WPipe::eToPreView); //if (AecAngleWatch::m_bFallInSnap ) //{ ptGe = m_pCurStaRec->GetAcquirePoint(); if (ptGe.distanceTo(ptGe2) < 1.e-6) { return AcEdJig::kNoChange; } //} return AcEdJig::kNormal; } } break; } default: break; } return eStat; } AcDbEntity* AecDbDuctJig::entity() const { return m_pPipeLine; } Adesk::Boolean AecDbDuctJig::update() { return Adesk::kTrue; } BOOL AecDbDuctJig::GetLastStatusAquire(AcGePoint3d& ptGe) { int nSize = m_lstStaPtrsBack.GetCount(); if (nSize > 0) { AECStatusRecord* pRec = (AECStatusRecord*)m_lstStaPtrsBack.GetTail(); if (pRec != NULL) ptGe = pRec->GetAcquirePoint(); return TRUE; } return FALSE; } AECStatusRecord* AecDbDuctJig::GetTailStatusRec() { int nSize = m_lstStaPtrsBack.GetCount(); if (nSize > 0) { return (AECStatusRecord*)m_lstStaPtrsBack.GetTail(); } return NULL; } void AecDbDuctJig::PushBackStatusRec(AECStatusRecord* pRec) { pRec->SetUndoGroupId(m_nUndoGoupid); m_lstStaPtrsBack.AddTail(pRec); } void AecDbDuctJig::SetUndoGroupBegin() { m_nUndoGoupid += 1; } void AecDbDuctJig::SetUndoGroupEnd() { ((AecDbDuctLine *)m_pPipeLine)->PushPipeParam(); } int AecDbDuctJig::GetUndoGroupID() { return m_nUndoGoupid; } void AecDbDuctJig::PopUpStatusRec() { //按 id 回退一次,调整当前状态 if (m_lstStaPtrsBack.GetCount() > 0) { AECStatusRecord* pLast = (AECStatusRecord*)m_lstStaPtrsBack.GetTail(); int nID = pLast->GetUndoGroupId(); while(m_lstStaPtrsBack.GetCount() > 0) { m_lstStaPtrsBack.RemoveTail(); DELETE_PTR(pLast); pLast = NULL; if (m_lstStaPtrsBack.GetCount() == 0) { break; } pLast = (AECStatusRecord*)m_lstStaPtrsBack.GetTail(); if (nID != pLast->GetUndoGroupId()) { break; } } //pipeline 回退一次,调整接口记录 ((AecDbDuctLine *)m_pPipeLine)->PopUpInterface(nID); ((AecDbDuctLine *)m_pPipeLine)->MoveAngWatchPosition(); } } void AecDbDuctJig::SetDispPromptWithEleTip(CString& sPrompt) { CString sEl; if (m_pCurStaRec != NULL) { sEl.Format(_T("(当前标高:%g)"),m_pCurStaRec->GetAcquirePoint().z); int nIndex = sPrompt.ReverseFind(_T(':')); if (nIndex != -1) { sPrompt.Insert(nIndex,sEl); } } } double AecDbDuctJig::PickWPipehereEl(const AcGePoint3d& ptGe) { double dEl = ptGe.z; ads_point pt[5]; double dSize = CoreTools::PixelToWcs(5);//5 AcGePoint3d ptGeX[5]; ptGeX[0] = ptGe; ptGeX[0] -= dSize * AcGeVector3d::kYAxis; ptGeX[0] -= dSize * AcGeVector3d::kXAxis; ptGeX[1] = ptGeX[0] + 2 * dSize * AcGeVector3d::kYAxis; ptGeX[2] = ptGeX[1] + 2 * dSize * AcGeVector3d::kXAxis; ptGeX[3] = ptGeX[0] + 2 * dSize * AcGeVector3d::kXAxis; ptGeX[4] = ptGeX[0]; for (int i = 0;i < 5;i++) { acdbWcs2Ucs(asDblArray(ptGeX[i]),pt[i],false); } TCHAR szBuf[64]; memset(szBuf,0,sizeof(szBuf)); _tcscpy(szBuf, DXF_PIPE); struct resbuf rb; rb.restype = 0; rb.resval.rstring = szBuf; rb.rbnext = NULL; struct resbuf* pointlist; pointlist = acutBuildList(RTPOINT, pt[0], RTPOINT, pt[1], RTPOINT, pt[2], RTPOINT, pt[3], 0); ads_name ss,ent; acedSSGet(_T("CP"),pointlist,NULL,&rb,ss); acutRelRb(pointlist); Adesk::Int32 lLen = 0; acedSSLength(ss,&lLen); AcDbObjectId id; AcGePoint3d ptOn; if (lLen > 0) { acedSSName(ss,0,ent); acdbGetObjectId(id,ent); AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead) ) { AecDbHvacDuct* pWPipe = AecDbHvacDuct::cast(pEnt); if (pWPipe != NULL) { dEl = pWPipe->EndPoint().z; } pEnt->close(); } } acedSSFree(ss); return dEl; }