#include "stdafx.h" #include "AecDbECableLine.h" #include "AecDbECableTray.h" #include "AecDbEcFitting.h" #include "AecAngleWatch.h" #include "AecDbECableJig.h" #include "AECStatusRecord.h" #include "KTSetting.h" #include "CoreTools.h" #include "AecDbEwEquipment.h" #include "CablelineTools.h" #include "AecDbX3dPartEntity.h" #include "CWTXXDlg.h" CMapStringToString *g_pMapData = NULL; extern AcGePoint3d MidPoint(const AcGePoint3d& pt1,const AcGePoint3d& pt2); double AsDNUnit(double dVal) { struct resbuf rb; acedGetVar(_T("INSUNITS"), &rb); if (rb.resval.rint == AcDb::kUnitsMeters) { dVal *= 0.001; } return dVal; } double GetElbowL(AecHvac::DuctParam* pParam) { double dL = 0.0; if (pParam->eType == eCircle) dL = pParam->dSize[0]; double dD = __max(pParam->dSize[3], pParam->dSize[0]); double dRatio = pParam->m_dRatio; double dLx = (int)(dRatio * dD / 3.0 + 0.5);//默认50 if (dLx > AsDNUnit(50.0)) dLx = AsDNUnit(50.0); dL = dRatio * dD + dLx; return dL; } double GetElbowLx(AecHvac::DuctParam* pParam) { double dD = __max(pParam->dSize[3], pParam->dSize[0]); double dRatio = pParam->m_dRatio; double dLx = (int)(dRatio * dD / 3.0 + 0.5);//默认50 if (dLx > AsDNUnit(50.0)) dLx = AsDNUnit(50.0); if (pParam->eType == eCircle) dLx = AsDNUnit(50.0); return dLx; } static AcDbObjectId GetConnectObject(const AecInterface &intf, const CArray &arr) { for (int i = 0; i < arr.GetSize(); ++i) { const AecInterface &ff(arr[i]); if (intf.ptPos == ff.ptPos && intf.idOwner != ff.idOwner) return ff.idOwner; } return AcDbObjectId::kNull; } typedef struct PointParam { AcGePoint3d ptOn; double dParam; }POINTPARAM; static bool ComparePtparam(PointParam ptParam1,PointParam ptParam2) { if (ptParam1.dParam - ptParam2.dParam < 1.e-10) { return true; } return false; } void SortPoints(AcGePoint3dArray& points,AcDbCurve* pLine) { PointParam ptParam; std::vector points2; for (int i = 0;i < points.length();i++) { ptParam.ptOn = points.at(i); pLine->getParamAtPoint(points.at(i),ptParam.dParam); points2.push_back(ptParam); } std::sort(points2.begin(),points2.end(),ComparePtparam); points.setLogicalLength(0); std::vector::iterator it; for (it = points2.begin(); it < points2.end(); it++) { points.append((*it).ptOn); } } AecDbECableLine::AecDbECableLine() { m_pAngleWatch = NULL; m_pPipeJig = NULL; m_pPipeParam = NULL; m_pCurPipeLine[0] = NULL; m_pCurPipeLine[1] = NULL; m_bStopCommand = FALSE; m_idStartDragFrom = AcDbObjectId::kNull; m_bHasFit = true; memset(&m_lHolder, 0, sizeof(XHolder)); memset(&m_rHolder, 0, sizeof(XHolder)); m_bHasHolder = FALSE; } AecDbECableLine::AecDbECableLine(AecDbECableJig* pJig) { m_pAngleWatch = new AecAngleWatch; m_pPipeJig = pJig; m_pPipeParam = NULL; m_pCurPipeLine[0] = NULL; m_pCurPipeLine[1] = NULL; m_bStopCommand = FALSE; m_idStartDragFrom = AcDbObjectId::kNull; m_bHasFit = true; memset(&m_lHolder, 0, sizeof(XHolder)); memset(&m_rHolder, 0, sizeof(XHolder)); m_bHasHolder = FALSE; } AecDbECableLine::~AecDbECableLine(void) { if ( m_pAngleWatch != NULL) DELETE_PTR(m_pAngleWatch); if (m_pPipeParam) delete m_pPipeParam; } Acad::ErrorStatus AecDbECableLine::Draw2d(AcGiDraw &mode) const { if (m_pCurPipeLine[0] != NULL ) { ((AecDbECableLine*)(m_pCurPipeLine[0]))->Draw2d(mode); } if (m_pAngleWatch != NULL && m_pCurPipeLine[0] != NULL) { m_pAngleWatch->Draw2d(mode); } return Acad::eOk; } void AecDbECableLine::SetPipeParam(AecHvac::DuctParam* pPipePar) { if (m_pPipeParam == NULL) m_pPipeParam = new AecHvac::DuctParam; memcpy(m_pPipeParam,pPipePar,sizeof(AecHvac::DuctParam)); } AecHvac::DuctParam* AecDbECableLine::GetPipeParam() { return m_pPipeParam; } void AecDbECableLine::SetXHolder(const XHolder &lHolder, const XHolder &rHolder) { memcpy(&m_lHolder, &lHolder, sizeof(XHolder)); memcpy(&m_rHolder, &rHolder, sizeof(XHolder)); m_bHasHolder = TRUE; } AecInterface* AecDbECableLine::GetLastInterface() { int nLen = m_arHistoryIntfs.GetSize(); if (nLen > 0) { AecInterface& intf = m_arHistoryIntfs[nLen - 1]; return &intf; } return NULL; } double AecDbECableLine::GetEndElevation() const { return m_pPipeParam->m_dEl; } void AecDbECableLine::SetElbowAndPipe(bool bHasFit) { m_bHasFit = bHasFit; } BOOL AecDbECableLine::AddPipeNode(AECStatusRecord* pRec ,WPipe::PipeDraw ePipe ) { switch(ePipe) { case WPipe::eToPreView: { //预览 if (m_pCurPipeLine[0] == NULL) m_pCurPipeLine[0] = new AecDbECableTray; AecDbECableTray* pWpipe = (AecDbECableTray*)m_pCurPipeLine[0]; AecDbObjXDataMap* pXDataMap = pWpipe->GetSpecialtyData(); pWpipe->SetDuctParam(m_pPipeParam); pWpipe->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pWpipe->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); AcGePoint3d ptGe,ptGe1,ptGe2; ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); ptGe1 = pRec->GetAcquirePoint(); //第一次对齐即可 BOOL bAdjust3d = FALSE; AcGeVector3d vtAg(0,0,0); if (m_arHistoryIntfs.GetSize() == 0) { bAdjust3d = TRUE; vtAg = ptGe1 - ptGe; vtAg.normalize(); switch(m_pPipeParam->m_nAlign) { case 0://底部左 { vtAg.rotateBy(-PI / 2.0,AcGeVector3d::kZAxis); vtAg *= 0.5 * m_pPipeParam->dSize[0]; break; } case 1://底部中 { vtAg.set(0,0,0); break; } case 2://底部右 { vtAg.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); vtAg *= 0.5 * m_pPipeParam->dSize[0]; break; } default: break; } ptGe += vtAg; ptGe1 += vtAg; } pWpipe->SetStartPoint( ptGe ); pWpipe->SetEndPoint( ptGe1 ); if (bAdjust3d) { ptGe1 -= vtAg; } //水平桥架 AcGeVector3d vtDir = AcGeVector3d::kXAxis; vtDir = m_pAngleWatch->m_vtDir; AcGeVector3d vtWDir = vtDir; vtWDir.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); AcGeVector3d vtNorm = vtDir.crossProduct(vtWDir); pWpipe->GetSpecialtyData()->SetAt(KEY_NORMAL,vtNorm); m_pAngleWatch->m_bFallInSnap = FALSE; m_pAngleWatch->snapWatch(ptGe,ptGe1,vtDir); pRec->SetAcquirePoint(ptGe1); m_pAngleWatch->m_bFallInSnap = TRUE; break; } case WPipe::eToCreate: { AcGePoint3d ptGe,ptGe1; ptGe1 = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); ptGe = pRec->GetAcquirePoint(); //判断方向是否一致 int nLen = m_arHistoryIntfs.GetSize(); if (nLen == 0) { //第一次创建 CreateWPipe(pRec,TRUE); //考虑首尾三通 } else { AecInterface tInf = m_arHistoryIntfs[nLen - 1]; AcGeVector3d vtDir1 = tInf.vtDir; AcGeVector3d vtDir2 = ptGe - ptGe1; if (vtDir2.isParallelTo(vtDir1)) //平行,和上次同向,连续画 { if ( !ExtendLastWPipe(pRec) ) { CreateWPipe(pRec,FALSE); } } else //添加弯头过渡 { if (m_bHasFit) { EFittingType type(eElbow); CreateElbowAndPipe(pRec, type); m_pPipeParam->m_dEl = pRec->GetAcquirePoint().z;//4-24 } else { CreateWPipe(pRec, FALSE); } } } AcGeVector3d vtDir = AcGeVector3d::kXAxis; vtDir = m_pAngleWatch->m_vtDir; ptGe1.z = m_pPipeParam->m_dEl; ptGe.z = m_pPipeParam->m_dEl; m_pAngleWatch->m_bFallInSnap = FALSE; m_pAngleWatch->snapWatch(ptGe1,ptGe,vtDir); m_pAngleWatch->m_bFallInSnap = TRUE; break; } default: break; } return TRUE; } BOOL AecDbECableLine::AddReducer(AECStatusRecord* pCurStaRec,AecHvac::DuctParam* pParam) { AecDbEcFitting* pFit = new AecDbEcFitting; AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData(); AcGeVector3d vtDir = AcGeVector3d::kXAxis; AecInterface* pIntf = GetLastInterface(); if (pIntf != NULL) { vtDir = pIntf->vtDir; } vtDir.normalize(); AcGePoint3d ptSta = pIntf->ptPos; AcGePoint3d ptEnd = ptSta + vtDir * pParam->m_dL; AcGeVector3d vtNorm = pParam->m_vtNrom; pParam->dSize[3] = m_pPipeParam->dSize[0]; //电缆沟设置分支 pParam->dSize[12] = pParam->dSize[4]; pParam->dSize[13] = pParam->dSize[5]; pParam->dSize[14] = pParam->dSize[6]; pParam->dSize[15] = pParam->dSize[7]; pParam->dSize[16] = pParam->dSize[8]; pParam->dSize[17] = pParam->dSize[9]; pParam->dSize[18] = pParam->dSize[10]; pFit->SetDuctParam(*pParam); if (pParam->m_app == WPipe::eTrench && m_bHasHolder) { pFit->SetXHolder(kLeft, m_lHolder); pFit->SetXHolder(kRight, m_rHolder); } pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eReduce); pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtDir); pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtDir); AcGePoint3d ptMid = MidPoint(ptSta,ptEnd); pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid); pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, pParam->m_dRatio); pFit->GetSpecialtyData()->SetAt(PIPE_THICK, pParam->dSize[2]); pFit->GetSpecialtyData()->SetAt(HELB_LX, 0.0);//没有直边长度 //是否偏移 pFit->GetSpecialtyData()->SetAt(KEY_ECCEN,pParam->m_nEcCen); pFit->GetSpecialtyData()->SetAt(KEY_NORMAL,vtNorm); if (pParam->m_nEcCen != 0) { AecInterface inf1; pFit->GetInterface(1,inf1); ptEnd = inf1.ptPos; } if (pParam->m_app == WPipe::eTrench && m_bHasHolder) { pFit->SetXHolder(kLeft, m_lHolder); pFit->SetXHolder(kRight, m_rHolder); } //设置图层 AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN,m_pPipeParam->szSys,4,_T("center2"),NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT,m_pPipeParam->szSys,nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG,m_pPipeParam->szSys,7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"),NULL); pFit->setLayer(idOutLay); pFit->SetDoubleLayer(idOutLay); pFit->SetCenterLayer(idCenLay); pFit->SetCenterLayer(idCenLay); AcDbObjectId id = CoreTools::AddToModelSpace(pFit); AddUserData(id,pXDataMap,5); AecInterface intf; intf.ptPos = ptEnd; intf.vtDir = vtDir; intf.idOwner = id; PushInterface(intf); //覆盖当前的param PushPipeParam(); memcpy(m_pPipeParam,pParam,sizeof(AecHvac::DuctParam));//回退 //创建余下管子,并插入虚拟状态记录 AECStatusRecord* pRecMid = new AECStatusRecord; pRecMid->CopyFrom(pCurStaRec); pRecMid->SetAcquirePoint(ptEnd); m_pPipeJig->PushBackStatusRec(pRecMid); pCurStaRec->SetAcquirePoint(ptEnd); return TRUE; } AcDbObjectId AecDbECableLine::CreateElbow(AcGeVector3d vtMaj ,AcGePoint3d ptMid ,AcGeVector3d vtMin ,AecHvac::DuctParam* pparam ,BOOL bInsertBeforLast/* = FALSE*/) { AecDbEcFitting* pFit = new AecDbEcFitting; AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData(); //图层 //设置图层 AecHvac::DuctParam *pParam = pparam; AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); pFit->setLayer(idOutLay); pFit->SetDoubleLayer(idOutLay); pFit->SetCenterLayer(idCenLay); pFit->SetCenterLayer(idCenLay); pFit->SetDuctParam(*pparam); double dLx = GetElbowLx(pparam); double dL = GetElbowL(pparam); double dRatio = pparam->m_dRatio; bool bIsLastInfParamFit = false; if (m_pPipeParam != NULL) { if (fabs(m_pPipeParam->dSize[0] - pparam->dSize[0]) < 1.e-6 && //D W fabs(m_pPipeParam->dSize[1] - pparam->dSize[1]) < 1.e-6 && //H fabs(m_pPipeParam->dSize[2] - pparam->dSize[2]) < 1.e-6) //t { bIsLastInfParamFit = true; } } if (!bIsLastInfParamFit)//不一致 { //m_pPipeParam param2 AecHvac::DuctParam *pLParam = pparam;//param1 if (!m_lstLastPipeParam.IsEmpty()) pLParam = (AecHvac::DuctParam *)m_lstLastPipeParam.GetTail(); //电缆沟设置分支 //产生非等径弯头! AecHvac::DuctParam param; memcpy(¶m, pparam, sizeof(AecHvac::DuctParam)); //分支 但是高度必须相等! param.dSize[3] = pLParam->dSize[0]; //高度必须相等! if (fabs(param.dSize[1] - pLParam->dSize[1]) < 1.e-6) { //电缆沟 param.dSize[12] = pLParam->dSize[4]; param.dSize[13] = pLParam->dSize[5]; param.dSize[14] = pLParam->dSize[6]; param.dSize[15] = pLParam->dSize[7]; param.dSize[16] = pLParam->dSize[8]; param.dSize[17] = pLParam->dSize[9]; param.dSize[18] = pLParam->dSize[10]; pFit->SetDuctParam(param); dLx = GetElbowLx(¶m); dL = GetElbowL(¶m); AcGeVector3d vtTmp = vtMaj; vtMaj = vtMin; vtMin = vtTmp; } } //弹出界面,选择弯头样式 int nElbowStyle = 0; if (vtMaj.isParallelTo(AcGeVector3d::kZAxis) || vtMin.isParallelTo(AcGeVector3d::kZAxis)) { CAcModuleResourceOverride myResources; CWTXXDlg dlg; dlg.SetMajDir(vtMaj); dlg.SetMinDir(vtMin); if (IDOK == dlg.DoModal()) { nElbowStyle = dlg.GetElbowStyle(); } } if (pParam->m_app == WPipe::eTrench && m_bHasHolder) { pFit->SetXHolder(kLeft, m_lHolder); pFit->SetXHolder(kRight, m_rHolder); } pFit->GetSpecialtyData()->SetAt(KEY_ELBOWSTYLE, nElbowStyle); pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eElbow); pFit->GetSpecialtyData()->SetAt(HELB_Type,(int)AecHvac::eIncline); pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj); pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin); AcGeVector3d vtNorm = vtMin.crossProduct(vtMaj); double dAngle = vtMin.angleTo(vtMaj,vtNorm); pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid); pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, dRatio); pFit->GetSpecialtyData()->SetAt(PIPE_ELBOWANG,dAngle); pFit->GetSpecialtyData()->SetAt(PIPE_THICK, pparam->dSize[2]); pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度 AecInterface intf0,intf1; pFit->GetInterface(0,intf0); pFit->GetInterface(1,intf1); m_intf0 = intf0; m_intf1 = intf1; //添加本次到数据库 AcDbObjectId id = CoreTools::AddToModelSpace(pFit); m_intf0.idOwner = id; m_intf1.idOwner = id; AddUserData(id,pXDataMap,1); //记录接口到历史记录 intf1.idOwner = id; if (m_pPipeJig != NULL) intf1.nType = m_pPipeJig->GetUndoGroupID(); if (bInsertBeforLast) { if (m_arHistoryIntfs.GetSize() > 0) { AecInterface inf = m_arHistoryIntfs[m_arHistoryIntfs.GetSize() - 1]; m_arHistoryIntfs.RemoveAt(m_arHistoryIntfs.GetSize() - 1); PushInterface(intf0); PushInterface(inf); } else { PushInterface(intf0); } } else { PushInterface(intf0); } AddUserData(id,pXDataMap,1); return id; } BOOL AecDbECableLine::ChangeEl(AECStatusRecord* pRec,double dNewEl,BOOL bCheckRec,double dRedElPos,AecHvac::DuctParam* pParamred) { //dNewEl 为底部高,调整到中心标高 dNewEl += m_pPipeParam->dSize[1] * 0.5; AcGeVector3d vtMaj,vtMin; if (GetLastInterface() != NULL) { vtMaj = GetLastInterface()->vtDir; vtMaj.normalize(); vtMin = AcGeVector3d::kZAxis; if (dNewEl - m_pPipeParam->m_dEl < 1.e-6) { vtMin = -AcGeVector3d::kZAxis; } AcGePoint3d ptMid,ptSta,ptEnd,ptGeT,ptLast; double dRatio = m_pPipeParam->m_dRatio; double dLx = GetElbowLx(m_pPipeParam); double dL = GetElbowL(m_pPipeParam); //如果上段不是管子 AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,GetLastInterface()->idOwner,AcDb::kForWrite)) { AecDbECableTray* pPipe = AecDbECableTray::cast(pEnt); if (pPipe == NULL)//不是管子 { ptMid = GetLastInterface()->ptPos; ptSta = ptMid; ptMid += vtMaj * dL; ptLast = ptMid; ptEnd = ptMid; ptEnd.z = dNewEl; //创建立管... if (vtMaj.isParallelTo(AcGeVector3d::kZAxis)) { double dAng = 0;//需要计算 CreatePipe(ptSta, ptEnd, m_pPipeParam, dAng); pRec->SetAcquirePoint(ptEnd); } } else//改短上次管子 { ptLast = GetLastInterface()->ptPos; if (ptLast.distanceTo(pPipe->EndPoint()) < 1.e-6) { ptEnd = pPipe->EndPoint(); ptMid = ptEnd; ptEnd -= vtMaj * dL; ptGeT = pPipe->EndPoint(); pPipe->SetEndPoint(ptEnd); ptLast = ptEnd; } else { vtMaj = pPipe->StartPoint() - pPipe->EndPoint(); vtMaj.normalize(); ptSta = pPipe->StartPoint(); ptMid = ptSta; ptSta -= vtMaj * dL; ptGeT = pPipe->StartPoint(); pPipe->SetStartPoint(ptSta); ptLast = ptSta; } } pEnt->close(); } //压入当前param PushPipeParam(); //1. 如果方向不同创建弯头 if (!vtMaj.isParallelTo(vtMin)) { //底部弯头 AecHvac::DuctParam param; memcpy(¶m,m_pPipeParam,sizeof(AecHvac::DuctParam)); vtMaj.negate(); CreateElbow(vtMaj,ptMid,vtMin,¶m); if (m_intf0.vtDir.isParallelTo(vtMin) ) { ptSta = m_intf0.ptPos; } else { ptSta = m_intf1.ptPos; } //顶部弯头 ptMid.z = dNewEl; vtMin = vtMaj; vtMin.negate(); vtMaj = -AcGeVector3d::kZAxis; if (dNewEl < m_pPipeParam->m_dEl) vtMaj.negate(); //顶部不需要创建 2023-11-22 //CreateElbow(vtMaj,ptMid,vtMin,¶m); if (m_intf0.vtDir.isParallelTo(vtMaj)) { ptEnd = m_intf0.ptPos; ptLast = m_intf1.ptPos; } else { ptEnd = m_intf1.ptPos; ptLast = m_intf0.ptPos; } AcGeVector3d vtDirXY = vtMaj.isParallelTo(AcGeVector3d::kZAxis) ? vtMin : vtMaj; double dAng = AcGeVector3d::kXAxis.angleTo(vtDirXY,AcGeVector3d::kZAxis); if (vtMaj.isParallelTo(AcGeVector3d::kZAxis) || vtMin.isParallelTo(AcGeVector3d::kZAxis)) dAng += PI / 2.0; //2. 创建立管 AecHvac::DuctParam paramT; memcpy(¶mT,m_pPipeParam,sizeof(AecHvac::DuctParam)); paramT.m_vtNrom = vtMin; paramT.m_bCover = TRUE; ptEnd.z = dNewEl; CreatePipe(ptSta,ptEnd,¶mT,dAng); m_pPipeParam->m_dEl = dNewEl; //重新调整历史记录 // //CreatePipe 已经加入最后管嘴 2023-11-22 去掉 //AecInterface inf = m_intf0; //inf.vtDir = vtMin; //inf.ptPos = ptLast; //PushInterface(inf); //pRec->SetAcquirePoint(ptLast); //调整本次状态点 pRec->SetAcquirePoint(ptEnd); } } return TRUE; } BOOL AecDbECableLine::ChangeEl2(AECStatusRecord* pRec,AECStatusRecord* pRecLast,double dNewEl, BOOL bCheckRec,double dRedElPos,AecHvac::DuctParam* pParamred) { //dNewEl 为底部高,调整到中心标高 dNewEl += m_pPipeParam->dSize[1] * 0.5; ads_point pt[5]; AcGePoint3d ptGe = pRecLast->GetAcquirePoint(); double dSize = 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, _T("AEC_DBCABTRY")); 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); AecHvac::DuctParam wparamMain; memcpy(&wparamMain,m_pPipeParam,sizeof(AecHvac::DuctParam)); 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) ) { AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt); if (pWPipe != NULL) { pWPipe->GetDuctParam(wparamMain); AcGePoint3d ptOn1 = pRec->GetAcquirePoint(); AcDbLine ln(pWPipe->StartPoint(),pWPipe->EndPoint()); ln.getClosestPointTo(ptOn1,ptOn); pRec->SetAcquirePoint(ptOn); } pEnt->close(); } } acedSSFree(ss); bool bCreateTee = false; if ( ( wparamMain.dSize[0] - m_pPipeParam->dSize[0] ) > -1.e-6) //可能的创建三通,否则只创建立管 { bCreateTee = true; } //创建立管 AcGePoint3d ptSta,ptEnd; ptSta = pRec->GetAcquirePoint(); if (bCreateTee) { if ( fabs(wparamMain.dSize[1] - m_pPipeParam->dSize[1]) < 1.e-6) { AcGeVector3d vtMin = AcGeVector3d::kZAxis; if (dNewEl - ptSta.z < 1.e-6) { vtMin = -AcGeVector3d::kZAxis; } AcGePoint3d ptMid = pRec->GetAcquirePoint(); double dL = 0.0,dB = 0.0; double dLx = GetElbowLx(m_pPipeParam); dL = GetElbowL(m_pPipeParam); dB = dL; //创建三通 AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) { AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt); if (pWPipe != NULL) { //对方断为两个管子 SplitWPipe(ptMid,dL,pWPipe); AddTee(pWPipe,dL,ptMid,dB,vtMin); ptSta += vtMin * dB; } pEnt->close(); } } else { acutPrintf(_T("\n选择的两桥架高度不同,不能创建三通!")); } } //3.创建立管 ptEnd = ptSta; { ptEnd.z = dNewEl; //立管必须带盖子 AecHvac::DuctParam param; memcpy(¶m,m_pPipeParam,sizeof(AecHvac::DuctParam)); param.m_bCover = TRUE; CreatePipe(ptSta,ptEnd,¶m); m_pPipeParam->m_dEl = dNewEl; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); } return TRUE; } BOOL AecDbECableLine::ChangeEl3(AECStatusRecord* pRec,AcGePoint3d& ptThis) { double dNewEl = ptThis.z; //dNewEl 为底部高,调整到中心标高 dNewEl += m_pPipeParam->dSize[1] * 0.5; AcGeVector3d vtMaj,vtMin; if (GetLastInterface() != NULL) { vtMaj = GetLastInterface()->vtDir; vtMaj.normalize(); vtMin = ptThis - GetLastInterface()->ptPos; vtMaj.normalize(); vtMin.normalize(); double dX = GetElbowL(m_pPipeParam); AcGePoint3d ptMid,ptSta,ptEnd,ptGeT,ptLast; //如果上段不是管子 AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,GetLastInterface()->idOwner,AcDb::kForWrite)) { AecDbECableTray* pPipe = AecDbECableTray::cast(pEnt); if (pPipe == NULL)//不是管子 { ptMid = GetLastInterface()->ptPos; ptMid += vtMaj * dX; } else//改短上次管子 { ptLast = GetLastInterface()->ptPos; if (ptLast.distanceTo(pPipe->EndPoint()) < 1.e-6) { ptEnd = pPipe->EndPoint(); ptMid = ptEnd; ptEnd -= vtMaj * dX; ptGeT = pPipe->EndPoint(); pPipe->SetEndPoint(ptEnd); } else { vtMaj = pPipe->StartPoint() - pPipe->EndPoint(); vtMaj.normalize(); ptSta = pPipe->StartPoint(); ptMid = ptSta; ptSta -= vtMaj * dX; ptGeT = pPipe->StartPoint(); pPipe->SetStartPoint(ptSta); } } pEnt->close(); } //压入当前param PushPipeParam(); //1. 如果方向不同创建弯头->乙字弯结构 if (!vtMaj.isParallelTo(vtMin)) { vtMaj.negate(); AecHvac::DuctParam param; memcpy(¶m,m_pPipeParam,sizeof(AecHvac::DuctParam)); double dTmp = param.dSize[0]; param.dSize[0] = param.dSize[1]; param.dSize[0] = dTmp; CreateElbow(vtMaj,ptMid,vtMin,¶m); AcGeVector3d vtPipe = vtMaj; if (m_intf0.vtDir.isParallelTo(vtMin) ) { ptSta = m_intf0.ptPos; vtPipe = m_intf0.vtDir; } else { ptSta = m_intf1.ptPos; vtPipe = m_intf1.vtDir; } //2. 创建斜管 vtPipe.normalize(); ptEnd = ptThis; ptEnd -= vtPipe * dX; CreatePipe(ptSta,ptEnd,m_pPipeParam); //在创建弯头 vtMin = vtMaj; vtMin.negate(); ptMid = ptThis; vtMaj = vtPipe; vtMaj.negate(); CreateElbow(vtMaj,ptMid,vtMin,¶m); if (m_intf0.vtDir.isParallelTo(vtMin) ) { ptEnd = m_intf0.ptPos; PushInterface(m_intf0); } else { ptEnd = m_intf1.ptPos; PushInterface(m_intf1); } } m_pPipeParam->m_dEl = dNewEl; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); return TRUE; } return FALSE; } void AecDbECableLine::SetAngleWath(AcGePoint3d& ptCen,const AcGePoint3d& ptGeTo,const AcGeVector3d& vtDir/* = AcGeVector3d::kXAxis*/) { if (m_pAngleWatch != NULL) { m_pAngleWatch->SetAngleWath(ptCen,ptGeTo,vtDir); } } void AecDbECableLine::SwitchAutoSnapOrF8() { if (m_pAngleWatch != NULL) { m_pAngleWatch->SwitchAutoSnapOrF8(); } } void AecDbECableLine::MoveAngWatchPosition() { //导航表盘 if (m_pPipeJig->GetTailStatusRec() != NULL && m_pPipeJig->GetTailStatusRec()->GetStatusType() >= AECStatusRecord::kAngle && m_pPipeJig->GetTailStatusRec()->GetStatusType() <= AECStatusRecord::kPoint) { AcGePoint3d ptGe,ptGe1; ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); ptGe1 = m_pPipeJig->m_pCurStaRec->GetAcquirePoint(); AcGeVector3d vtDir; vtDir = m_pAngleWatch->m_vtDir; AecInterface* pLast = GetLastInterface(); if (pLast != NULL) { vtDir = pLast->vtDir; } m_pAngleWatch->SetAngleWath(ptGe,ptGe1,vtDir); } } void AecDbECableLine::AngWatchTo(const AcGePoint3d& ptGeTo) { if (m_pAngleWatch != NULL) { m_pAngleWatch->m_ptGeTo = ptGeTo; } } //画管线停止 BOOL AecDbECableLine::PipeFinished() { return m_bStopCommand; } void AecDbECableLine::PopUpInterface(int nGroupID) { while(m_arHistoryIntfs.GetSize() > 0) { if (m_arHistoryIntfs[m_arHistoryIntfs.GetSize() - 1].nType == nGroupID) { m_arHistoryIntfs.RemoveAt(m_arHistoryIntfs.GetSize() - 1); } else { break; } } //回退上次参数 while (m_lstLastPipeParam.GetCount() > 0) { //回上次管道参数 AecHvac::DuctParam* pLast = (AecHvac::DuctParam*)m_lstLastPipeParam.GetTail(); if (pLast->m_nGroupID == nGroupID) { m_lstLastPipeParam.RemoveTail(); DELETE_PTR(pLast); } else { memcpy(m_pPipeParam,pLast,sizeof(AecHvac::DuctParam)); break; } } } void AecDbECableLine::PushPipeParam() { AecHvac::DuctParam* pParam = new AecHvac::DuctParam; memcpy(pParam,m_pPipeParam,sizeof(AecHvac::DuctParam)); pParam->m_nGroupID = m_pPipeJig->GetUndoGroupID(); m_lstLastPipeParam.AddTail(pParam); } void AecDbECableLine::PushInterface(AecInterface& intf,BOOL bStartDragFromIt/* = FALSE*/) { m_arHistoryIntfs.Add(intf); if (bStartDragFromIt)//拖出的源对象 { m_idStartDragFrom = intf.idOwner; } } BOOL AecDbECableLine::CreateWPipe(AECStatusRecord* pRec,BOOL bMaybeAddTee/* = FALSE*/) { AcGePoint3d ptGe,ptGe1; AecDbECableTray* pWpipe = new AecDbECableTray; AecDbObjXDataMap* pXDataMap = pWpipe->GetSpecialtyData(); pWpipe->SetDuctParam(m_pPipeParam); pWpipe->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pWpipe->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); //设置图层 AecHvac::DuctParam *pParam = m_pPipeParam; AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); pXDataMap->SetAt(PIPE_CENTLAY,idCenLay); pXDataMap->SetAt(PIPE_OUTDLAY,idOutLay); pXDataMap->SetAt(PIPE_SINGLAY,idSingle); pWpipe->SetDoubleLayer(idOutLay); pWpipe->SetSingleLayer(idSingle); pWpipe->SetCenterLayer(idCenLay); pWpipe->setLayer(idOutLay); ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); ptGe1 = pRec->GetAcquirePoint(); #//ifndef _DEBUG_WAS_DEFINED // acutPrintf(_T("\n%.3f-%.3f"), ptGe.x, ptGe.y); // acutPrintf(_T("\n%.3f-%.3f"), ptGe1.x, ptGe1.y); //#endif //第一次对齐即可 AcGeVector3d vtAg(0,0,0); if (m_arHistoryIntfs.GetSize() == 0) { vtAg = ptGe1 - ptGe; vtAg.normalize(); switch(m_pPipeParam->m_nAlign) { case 0://底部左 { vtAg.rotateBy(-PI / 2.0,AcGeVector3d::kZAxis); vtAg *= 0.5 * m_pPipeParam->dSize[0]; break; } case 1://底部中 { vtAg.set(0,0,0); break; } case 2://底部右 { vtAg.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); vtAg *= 0.5 * m_pPipeParam->dSize[0]; break; } default: break; } ptGe += vtAg; m_pPipeJig->GetTailStatusRec()->SetAcquirePoint(ptGe); } pWpipe->SetStartPoint( ptGe ); pWpipe->SetEndPoint( ptGe1 ); AcGeVector3d vtDir = ptGe1 - ptGe; vtDir.normalize(); //法向量,水平桥架 AcGeVector3d vtWDir = vtDir; vtWDir.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); AcGeVector3d vtNorm = vtDir.crossProduct(vtWDir); pWpipe->GetSpecialtyData()->SetAt(KEY_NORMAL,vtNorm); m_pPipeParam->m_vtNrom = vtNorm; if (pParam->m_app == WPipe::eTrench && m_bHasHolder) { pWpipe->SetXHolder(kLeft, m_lHolder); pWpipe->SetXHolder(kRight, m_rHolder); } //pWpipe->ReCreateByXDataMap(); AcDbObjectId id = CoreTools::AddToModelSpace(pWpipe); AddUserData(id,pXDataMap,0); //记录接口到历史记录 AecInterface intf; intf.ptPos = ptGe1; intf.vtDir = vtDir; intf.idOwner = id; PushInterface(intf); if (bMaybeAddTee) //开始端或末端考虑添加三通的可能性 { //1. 可能的与其他管子在开始端合成三通 MaybeAddTeeConnectToThis(ptGe,vtDir,id,0); //2. 可能的与其他管子在末端合成三通,从而结束命令 if ( MaybeAddTeeConnectToThis(ptGe1,vtDir,id,1) ) { //结束命令 m_bStopCommand = TRUE; } //1.可能与其他的管子在中间端合成四通的可能性 MaybeAddCrossConnectToThis(ptGe,ptGe1,id); } else //末端或中间部分添加三通或四通的可能性 { //1.可能与其他的管子在中间端合成四通的可能性 MaybeAddCrossConnectToThis(ptGe,ptGe1,id); //2. 可能的与其他管子在末端合成三通,从而结束命令 if ( MaybeAddTeeConnectToThis(ptGe1,vtDir,id,1) ) { //结束命令 m_bStopCommand = TRUE; } } return TRUE; } BOOL AecDbECableLine::CreatePipe(AcGePoint3d ptSta,AcGePoint3d ptEnd,AecHvac::DuctParam* pPipeParam,double dSectRot/* = 0.0*/) { AecDbECableTray* pWpipe = new AecDbECableTray; AecDbObjXDataMap* pXDataMap = pWpipe->GetSpecialtyData(); //设置图层 AecHvac::DuctParam *pParam = pPipeParam; AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); pXDataMap->SetAt(PIPE_CENTLAY,idCenLay); pXDataMap->SetAt(PIPE_OUTDLAY,idOutLay); pXDataMap->SetAt(PIPE_SINGLAY,idSingle); pWpipe->SetDoubleLayer(idOutLay); pWpipe->SetSingleLayer(idSingle); pWpipe->SetCenterLayer(idCenLay); pWpipe->setLayer(idOutLay); // 增加参数 [10/24/2016 Rex] if(g_pMapData != NULL) { CMapStringToString mapData; CString sKey,sVal; for (POSITION ps = g_pMapData->GetStartPosition();ps != NULL;) { g_pMapData->GetNextAssoc(ps,sKey,sVal); pXDataMap->SetAt(sKey,sVal); } } if (fabs(dSectRot) > 1.e-6) pWpipe->SetSectionRotation(dSectRot); pWpipe->SetDuctParam(pPipeParam); pWpipe->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pWpipe->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); pWpipe->SetStartPoint( ptSta ); pWpipe->SetEndPoint( ptEnd ); pXDataMap->SetAt(KEY_NORMAL,pPipeParam->m_vtNrom); if ( fabs(ptSta.z - ptEnd.z) > 1.e-6) { pWpipe->GetSpecialtyData()->SetAt(KEY_DRAWGRAD,TRUE); } if (pParam->m_app == WPipe::eTrench && m_bHasHolder) { pWpipe->SetXHolder(kLeft, m_lHolder); pWpipe->SetXHolder(kRight, m_rHolder); } AcDbObjectId id = CoreTools::AddToModelSpace(pWpipe); AddUserData(id,pXDataMap,0); AcGeVector3d vtDir = ptEnd - ptSta; //记录接口到历史记录 AecInterface intf; intf.ptPos = ptEnd; intf.vtDir = vtDir; intf.idOwner = id; PushInterface(intf); return TRUE; } BOOL AecDbECableLine::ExtendLastWPipe(AECStatusRecord* pRec) { int nLen = m_arHistoryIntfs.GetSize(); if (nLen == 0) return FALSE; AecInterface& intf = m_arHistoryIntfs[nLen - 1]; AcDbObjectId id = intf.idOwner; AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { AecDbECableTray* pDbWpipe = AecDbECableTray::cast(pEnt); if (pDbWpipe != NULL) { AcGePoint3d ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); AcGePoint3d ptGe1 = pRec->GetAcquirePoint(); AcGeVector3d vtThis = ptGe1 - ptGe; AcGePoint3d ptGeT; int nPos = 0; AcGeVector3d vt = pDbWpipe->EndPoint() - pDbWpipe->StartPoint(); if (vtThis.isCodirectionalTo(vt)) { ptGeT = pDbWpipe->EndPoint(); pDbWpipe->SetEndPoint(pRec->GetAcquirePoint()); nPos = 1; } else { ptGeT = pDbWpipe->StartPoint(); pDbWpipe->SetStartPoint(pRec->GetAcquirePoint()); } //pDbWpipe->UpdateInterfaceRec(ptGeT,pRec->GetAcquirePoint()); //先关闭 pEnt->close(); //1.可能与其他的管子在中间端合成四通的可能性 MaybeAddCrossConnectToThis(ptGe,ptGe1,id); //2. 可能的与其他管子在末端合成三通,从而结束命令 AcGeVector3d vtDir = ptGe1 - ptGe; if ( MaybeAddTeeConnectToThis(ptGe1,vtDir,id,nPos) ) { //结束命令 m_bStopCommand = TRUE; } intf.ptPos = pRec->GetAcquirePoint(); PushInterface(intf,FALSE); return TRUE; } AecDbEcFitting* pDbFit = AecDbEcFitting::cast(pEnt); if (pDbFit != NULL) //上次是管件,本次创建管子 { AecDbObjXDataMap* pXDataMap = pDbFit->GetSpecialtyData(); int nVal = 0; pXDataMap->GetAt(KEY_RUNTIME,nVal); EFittingType eKind = (EFittingType)nVal; //可能的改上次弯头为三通,当方向不一致 if (nVal == eElbow) { AcGeVector3d vtIntf = intf.vtDir; AcGePoint3d ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); AcGePoint3d ptGe1 = pRec->GetAcquirePoint(); AcGeVector3d vtThis = ptGe1 - ptGe; if (vtThis.isParallelTo(vtIntf)) { if (!vtThis.isCodirectionalTo(vtIntf)) // 反向,改弯头为三通 { //判断弯头是否是90度弯头 double dAng = 0.0; pXDataMap->GetAt(PIPE_ELBOWANG,dAng); if ( fabs( dAng - 90.0 ) < 1.e-6) //是90 度 { AecHvac::DuctParam data; memset(&data,0,sizeof(AecHvac::DuctParam)); pDbFit->GetDuctParam(data); //获取另一方向 double dDn = data.dSize[0]; AcGeVector3d vt1,vt2; pXDataMap->GetAt(KEY_MAJBR,vt1); pXDataMap->GetAt(KEY_MINBR,vt2); AcGeVector3d vtMin; if (vt1.isParallelTo(vtIntf)) // 本位置 { vtMin = vt2; } else { vtMin = vt1; vtMin.negate(); } AcGePoint3d ptGeM; pXDataMap->GetAt(KEY_MID,ptGeM); ChangeElbowToTree(pDbFit,vtThis,ptGeM,vtMin,dDn,pRec); } } } } else if(nVal == eTee) { AcGeVector3d vtIntf = intf.vtDir; AcGePoint3d ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); AcGePoint3d ptGe1 = pRec->GetAcquirePoint(); AcGeVector3d vtThis = ptGe1 - ptGe; AecInterface inf2,inf0; pDbFit->GetInterface(2,inf2); pDbFit->GetInterface(0,inf0); AcGeVector3d vtInf2 = inf2.vtDir; AcGeVector3d vtInf0 = inf0.vtDir; if (vtInf0.isPerpendicularTo(vtInf2)) //正十字三通 { //如果是支管拉,才可能创建四通; if (vtThis.isParallelTo(vtIntf) && vtIntf.isParallelTo(vtInf2) ) { if (!vtThis.isCodirectionalTo(vtIntf)) // 反向,改三通为四通 { //直接改三通为四通 ChangeTeeToCross(pDbFit,vtInf0,vtInf2,pRec); } } } } pEnt->close(); return CreateWPipe(pRec); } AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt); if (pWEqu != NULL) { pEnt->close(); return CreateWPipe(pRec); } pEnt->close(); intf.ptPos = pRec->GetAcquirePoint(); return TRUE; } return FALSE; } BOOL AecDbECableLine::IsLastParamAndInfFit() { int nLen = m_arHistoryIntfs.GetSize(); if (nLen == 0) return FALSE; if (m_lstLastPipeParam.IsEmpty()) return FALSE; AecHvac::DuctParam *pLParam = m_pPipeParam; AecInterface intf = m_arHistoryIntfs[nLen - 1]; AcDbObjectId id = intf.idOwner; AecHvac::DuctParam param; memset(¶m, 0, sizeof(AecHvac::DuctParam)); AcDbEntity *pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)) { AecDbEcFitting *pFitLast = AecDbEcFitting::cast(pEnt); if (pFitLast != NULL) { pFitLast->GetDuctParam(param); } AecDbECableTray *pWPipe = AecDbECableTray::cast(pEnt); if (pWPipe != NULL) { pWPipe->GetDuctParam(param); } pEnt->close(); } if ( fabs(pLParam->dSize[0] - param.dSize[0]) < 1.e-6 && //D W fabs(pLParam->dSize[1] - param.dSize[1]) < 1.e-6 && //H fabs(pLParam->dSize[2] - param.dSize[2]) < 1.e-6) //t { return TRUE;//相等 } return FALSE; } BOOL AecDbECableLine::CreateElbowAndPipe(AECStatusRecord* pRec, const EFittingType &type/* = eElbow*/) { int nLen = m_arHistoryIntfs.GetSize(); if (nLen == 0) return FALSE; AecInterface intf; intf = m_arHistoryIntfs[nLen - 1]; AcDbObjectId id = intf.idOwner; AcGePoint3d ptCur = pRec->GetAcquirePoint(); AcGePoint3d ptGeM = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); AcGeVector3d vtMaj,vtMin,vtPipe; vtMaj = intf.vtDir; vtMaj.normalize(); vtMaj.negate(); vtMin = ptCur - ptGeM; vtMin.normalize(); AcGeVector3d vtNom = vtMin.crossProduct(vtMaj); //弹出界面,选择弯头样式 int nElbowStyle = 0; //影响绘制效率 /*if (vtMin.isParallelTo(AcGeVector3d::kZAxis) || vtMaj.isParallelTo(AcGeVector3d::kZAxis ) ) { CAcModuleResourceOverride myResources; CWTXXDlg dlg; dlg.SetMajDir(vtMaj); dlg.SetMinDir(vtMin); if (IDOK == dlg.DoModal()) { nElbowStyle = dlg.GetElbowStyle(); } }*/ //设置图层 AecHvac::DuctParam *pParam = m_pPipeParam; AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, pParam->szSys, 4, _T("center2"), NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, pParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, pParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AecDbEcFitting* pFit = new AecDbEcFitting; AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData(); pFit->setLayer(idOutLay); pFit->SetDoubleLayer(idOutLay); pFit->SetCenterLayer(idCenLay); pFit->SetCenterLayer(idCenLay); BOOL bIsLastInfParamFit = FALSE; if (nLen > 0 && !m_lstLastPipeParam.IsEmpty()) { //并且和上次参数一致 bIsLastInfParamFit = IsLastParamAndInfFit(); } //末端接口 pFit->SetDuctParam(*m_pPipeParam); double dLx = GetElbowLx(m_pPipeParam); double dL = GetElbowL(m_pPipeParam); if (!bIsLastInfParamFit)//不一致 { AecHvac::DuctParam *pLParam = m_pPipeParam; if (!m_lstLastPipeParam.IsEmpty()) pLParam = (AecHvac::DuctParam *)m_lstLastPipeParam.GetTail(); //电缆沟设置分支 //产生非等径弯头! AecHvac::DuctParam param; memcpy(¶m, m_pPipeParam, sizeof(AecHvac::DuctParam)); //分支 但是高度必须相等! param.dSize[3] = pLParam->dSize[0]; //高度必须相等! if (fabs(param.dSize[1] - pLParam->dSize[1]) < 1.e-6) { //电缆沟 param.dSize[12] = pLParam->dSize[4]; param.dSize[13] = pLParam->dSize[5]; param.dSize[14] = pLParam->dSize[6]; param.dSize[15] = pLParam->dSize[7]; param.dSize[16] = pLParam->dSize[8]; param.dSize[17] = pLParam->dSize[9]; param.dSize[18] = pLParam->dSize[10]; pFit->SetDuctParam(param); dLx = GetElbowLx(¶m); dL = GetElbowL(¶m); } } pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eElbow); pFit->GetSpecialtyData()->SetAt(HELB_Type,(int)AecHvac::eIncline); pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj); pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin); pFit->GetSpecialtyData()->SetAt(KEY_ELBOWSTYLE, nElbowStyle); double dAngle = vtMin.angleTo(vtMaj,vtNom); pFit->GetSpecialtyData()->SetAt(KEY_MID, ptGeM); pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio); pFit->GetSpecialtyData()->SetAt(PIPE_ELBOWANG,dAngle); pFit->GetSpecialtyData()->SetAt(PIPE_THICK, m_pPipeParam->dSize[2]); pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度 //改变上次intf 的末端点 AecInterface intf0,intf1; pFit->GetInterface(0,intf0); pFit->GetInterface(1,intf1); AcGeVector3d vtMove = vtMaj; vtMove.normalize(); AcGePoint3d ptGeT; //判断id 是管件 AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead)) { AecDbEcFitting* pFitLast = AecDbEcFitting::cast(pEnt); if (pFitLast != NULL) { double dMove = 0.0; if (intf.vtDir.isParallelTo(intf0.vtDir)) { dMove = intf.ptPos.distanceTo(intf0.ptPos); vtMove = intf.vtDir; vtMove.normalize(); vtMove *= dMove; ptGeM += vtMove; } else { dMove = intf.ptPos.distanceTo(intf1.ptPos); vtMove = intf.vtDir; vtMove.normalize(); vtMove *= dMove; ptGeM += vtMove; } AcGeMatrix3d xformMove; xformMove.setToTranslation(vtMove); pFit->transformBy(xformMove); pFit->GetInterface(0,intf0); pFit->GetInterface(1,intf1); vtMove = vtMaj; vtMove.normalize(); } pEnt->close(); } if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { // 如果上次是管子,则改变上次管子的终点 AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt); if (pWPipe != NULL) { AcGeVector3d vtPipe = pWPipe->EndPoint() - pWPipe->StartPoint(); if (intf0.vtDir.isParallelTo(vtPipe)) { //距离那个点近, 则修改哪个点 double dDis1 = ptGeM.distanceTo(pWPipe->StartPoint()); double dDis2 = ptGeM.distanceTo(pWPipe->EndPoint()); if (dDis1 < dDis2) { ptGeT = pWPipe->StartPoint(); pWPipe->SetStartPoint(intf0.ptPos); } else { ptGeT = pWPipe->EndPoint(); pWPipe->SetEndPoint(intf0.ptPos); } } if (intf1.vtDir.isParallelTo(vtPipe)) { //距离那个点近, 则修改哪个点 double dDis1 = ptGeM.distanceTo(pWPipe->StartPoint()); double dDis2 = ptGeM.distanceTo(pWPipe->EndPoint()); if (dDis1 < dDis2) { ptGeT = pWPipe->StartPoint(); pWPipe->SetStartPoint(intf1.ptPos); } else { ptGeT = pWPipe->EndPoint(); pWPipe->SetEndPoint(intf1.ptPos); } } //如果上次是立管子,本次水平 vtPipe = pWPipe->GetTailDir(); if (vtPipe.isParallelTo(AcGeVector3d::kZAxis)) { AcGeLine3d ln3d(AcGePoint3d::kOrigin,vtMin); if (ln3d.isParallelTo(AcGePlane::kXYPlane)) { // double dAng = AcGeVector3d::kXAxis.angleTo(vtMin,AcGeVector3d::kZAxis); pWPipe->SetSectionRotation(PI / 2.0 + dAng); } } } AecDbEcFitting* pDbFit = AecDbEcFitting::cast(pEnt); AecDbEwEquipment* pDbWEqu = AecDbEwEquipment::cast(pEnt); if (pDbFit != NULL || pDbWEqu != NULL) //如果是管件或设备元件,则加入的弯头需要调整M点,因为上次对象不可更改接口点 { AcGeVector3d vtPipe = intf.vtDir; if (intf0.vtDir.isParallelTo(vtPipe)) { vtMove = intf.ptPos - intf0.ptPos; } if (intf1.vtDir.isParallelTo(vtPipe)) { vtMove = intf.ptPos - intf1.ptPos; } ptGeM += vtMove; pXDataMap->SetAt(KEY_MID,ptGeM); pFit->GetInterface(0,intf0); pFit->GetInterface(1,intf1); } pEnt->close(); } if (pParam->m_app == WPipe::eTrench && m_bHasHolder) { pFit->SetXHolder(kLeft, m_lHolder); pFit->SetXHolder(kRight, m_rHolder); } //添加本次到数据库 id = CoreTools::AddToModelSpace(pFit); AddUserData(id,pXDataMap,1); //创建余下的管子 AcGePoint3d ptSta,ptEnd; if (intf0.vtDir.isParallelTo(vtMin)) { ptSta = intf1.ptPos; ptEnd = intf0.ptPos; } if (intf1.vtDir.isParallelTo(vtMin)) { ptSta = intf0.ptPos; ptEnd = intf1.ptPos; } //记录弯头末接口到历史记录 intf.ptPos = ptEnd; intf.vtDir = vtMin; intf.idOwner = id; PushInterface(intf); ptGeT = pRec->GetAcquirePoint(); ptGeT += vtMove; pRec->SetAcquirePoint(ptGeT); //校正 AcGePoint3d ptTemp; AcDbLine ln; ln.setStartPoint(ptEnd); ptTemp = ptEnd + 1000.0 * vtMin; ln.setEndPoint(ptTemp); ln.getClosestPointTo(ptGeT,ptGeT,Adesk::kTrue); pRec->SetAcquirePoint(ptGeT); //创建余下管子,并插入虚拟状态记录 AECStatusRecord* pRecMid = new AECStatusRecord; pRecMid->CopyFrom(pRec); pRecMid->SetAcquirePoint(ptEnd); m_pPipeJig->PushBackStatusRec(pRecMid); CreateWPipe(pRec); return TRUE; } BOOL AecDbECableLine::MaybeAddTeeConnectToThis(AcGePoint3d& ptGe,AcGeVector3d& vtDir,AcDbObjectId id,int nPos) { AcDbObjectId idLay1,idLay2; AcDbEntity* pEnt1 = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt1,id,AcDb::kForRead)) { idLay1 = pEnt1->layerId(); pEnt1->close(); } else { return FALSE; } //以ptGe的,以管子公称直径为搜索 ads_point pt[5]; vtDir.normalize(); AcGeVector3d vtV = vtDir; vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); AcGePoint3d ptGeT = ptGe; ptGeT = ptGe + m_pPipeParam->dSize[0] * 0.5 * vtDir; ptGeT += m_pPipeParam->dSize[0] * 0.5 * vtV; AcGePoint3d ptGeX[5]; ptGeX[0] = ptGeT; ptGeX[1] = ptGeX[0] - m_pPipeParam->dSize[0] * vtDir; ptGeX[2] = ptGeX[1] - m_pPipeParam->dSize[0] * vtV; ptGeX[3] = ptGeX[0] - m_pPipeParam->dSize[0] * vtV; 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, _T("AEC_DBCABTRY")); 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); double dTemp = 0.0; CString sSQL,sTemp; AcDbObjectId idT; AcDbEntity* pEnt = NULL; AcGeVector3d vtPipe; AcGePoint3d ptMid,ptTemp1,ptTemp2; BOOL bModified = FALSE; for (long i = 0;i < lLen;i++) { acedSSName(ss,i,ent); acdbGetObjectId(idT,ent); if (idT == id) continue; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idT,AcDb::kForWrite)) { AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt); if (pWPipe != NULL) { //判断是否同系统 idLay2 = pWPipe->layerId(); if (idLay1 != idLay2) { pEnt->close(); continue; } AecHvac::DuctParam data; pWPipe->GetDuctParam(data); if (data.m_app != m_pPipeParam->m_app) { pEnt->close(); continue; } vtPipe = pWPipe->EndPoint() - pWPipe->StartPoint(); vtPipe.normalize(); if (!vtPipe.isParallelTo(vtDir)) { //且两管子中心线能相交 AcGeLine3d ln1(pWPipe->EndPoint(),vtPipe); AcGeLine3d ln2(ptGe,vtDir); double dDn = m_pPipeParam->dSize[0]; pWPipe->GetSpecialtyData()->GetAt(KEY_SIZE1,dDn); if (ln1.intersectWith(ln2,ptMid)) { double dL = GetElbowL(m_pPipeParam); double dS = dL; //也可能加弯头,ptMid的两头有一在管子外 ptTemp1 = ptMid + vtPipe * dL; ptTemp2 = ptMid - vtPipe * dL; AcGeLineSeg3d lineGe(pWPipe->StartPoint(),pWPipe->EndPoint()); BOOL bAddTee = TRUE; if ( !lineGe.isOn(ptTemp1) || !lineGe.isOn(ptTemp2) ) { if ( fabs(dDn - m_pPipeParam->dSize[0]) < 1.e-6) //==DN { pEnt->close(); bAddTee = FALSE; if ( AddElbow(idT,ptMid,id)) { bModified = TRUE; } return bModified; } else// 只能加三通 { bAddTee = TRUE; } } if (bAddTee) { AecHvac::DuctParam paramMj; pWPipe->GetDuctParam(paramMj); dL = GetElbowL(¶mMj); dS = dL; //对方断为两个管子 SplitWPipe(ptMid,dL,pWPipe); if (nPos == 1) vtDir.negate(); //改变this管子的位置 ptGe = ptMid + dS * vtDir; ModifyWPipe(ptGe,id,nPos); //添加三通,继承pWPipe属性 AddTee(pWPipe,dL,ptMid,dS,vtDir); } bModified = TRUE; acedSSFree(ss); pEnt->close(); return bModified; } } else //平行,是否可以融合 { //规格相同, 且不是从夹点拖出的命令 if (m_idStartDragFrom != id) { double dDn = 0.0; pWPipe->GetSpecialtyData()->GetAt(KEY_SIZE1,dDn); if (fabs(dDn - m_pPipeParam->dSize[0]) < 1.e-3)//公称相同 { if ( fabs(pWPipe->EndPoint().z - m_pPipeParam->m_dEl) < 1.e-3)//等标高 { AcGePoint3d ptEnd = pWPipe->EndPoint(); AcGePoint3d ptSta = pWPipe->StartPoint(); if (!vtPipe.isCodirectionalTo(vtDir)) { AcGePoint3d ptTemp = ptSta; ptSta = ptEnd; ptEnd = ptTemp; } //删除原来的管子 pEnt->erase(); //改变this管子的位置 ModifyWPipe( nPos == 0 ? ptSta : ptEnd,id,nPos); bModified = TRUE; } } } } } pEnt->close(); } } acedSSFree(ss); return bModified; } typedef struct Point_ID { AcDbObjectId id; AcGePoint3d ptInt; AcDbCurve* pCurve; }POINT_ID; static bool ComparePointID(Point_ID& pt1,Point_ID& pt2) { double dP1 = 0.0,dP2 = 0.0; pt1.pCurve->getParamAtPoint(pt1.ptInt,dP1); pt1.pCurve->getParamAtPoint(pt2.ptInt,dP2); if (dP1 - dP2 < 1.e-6) { return true;//up sort } return false;//down sort } BOOL AecDbECableLine::MaybeAddCrossConnectToThis(AcGePoint3d ptFr,AcGePoint3d ptTo,AcDbObjectId id) { AcDbObjectId idLay1,idLay2; AcDbEntity* pEnt1 = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt1,id,AcDb::kForRead)) { idLay1 = pEnt1->layerId(); pEnt1->close(); } else { return FALSE; } //等标高的情况下 if (fabs(ptFr.z - ptTo.z) > 1.0) { return FALSE; } //id 的范围内选择实体,只考虑XY 面,其他三维单加四通 AcGePoint3d ptGe[4]; AcGeVector3d vtDir = ptTo - ptFr; AcGeVector3d vtV = vtDir; vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); vtV.normalize(); vtDir.normalize(); //四通的主支 DN 相同 double dM = 0.0,dB = 0.0; double dL = GetElbowL(m_pPipeParam); dM = dL; dB = dL; //选择范围缩小, 至少长度超过四通的长度 ptFr += m_pPipeParam->dSize[0] * 2.0 * vtDir; ptTo -= m_pPipeParam->dSize[0] * 2.0 * vtDir; ptGe[0] = ptFr; ptGe[0] += vtV * m_pPipeParam->dSize[0] * 0.8; ptGe[1] = ptTo; ptGe[1] += vtV * m_pPipeParam->dSize[0] * 0.8; ptGe[2] = ptGe[1] - vtV * 1.6 * m_pPipeParam->dSize[0]; ptGe[3] = ptGe[0] - vtV * 1.6 * m_pPipeParam->dSize[0]; ads_point pt[4]; for (int i = 0;i < 4;i++) { acdbWcs2Ucs(asDblArray(ptGe[i]),pt[i],false); } TCHAR szBuf[64]; memset(szBuf,0,sizeof(szBuf)); _tcscpy(szBuf, _T("AEC_DBCABTRY")); struct resbuf rb; rb.restype = 0; rb.resval.rstring = szBuf; rb.rbnext = NULL; struct resbuf* pointlist = NULL; 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 idT; AcDbEntity* pEnt = NULL; AcGeVector3d vtDir2; AcDbLine line; line.setStartPoint(ptFr); line.setEndPoint(ptTo); AcGeLineSeg3d line1; line1.set(ptFr,ptTo); AcGeLineSeg3d line2; double dDN = 0.0; std::vector vtPtids; for ( i = 0;i < lLen;i++) { acedSSName(ss,i,ent); acdbGetObjectId(idT,ent); if (idT == id) continue; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idT,AcDb::kForRead)) { idLay2 = pEnt->layerId(); if (idLay1 != idLay2) { pEnt->close(); continue; } AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt); if (pWPipe != NULL) { AecHvac::DuctParam data; memset(&data,0,sizeof(AecHvac::DuctParam)); pWPipe->GetDuctParam(data); if (data.m_app != m_pPipeParam->m_app) { pEnt->close(); continue; } //判断标高是否一致,方向是否垂直,且 公称直径一致?? if ( fabs(pWPipe->EndPoint().z - ptTo.z) < 1.e-6 /*&& fabs(m_pPipeParam->dSize[0] - data.dSize[0]) < 1.e-6*/) { vtDir2 = pWPipe->EndPoint() - pWPipe->StartPoint(); if (vtDir2.isPerpendicularTo(vtDir)) { line2.set(pWPipe->StartPoint(),pWPipe->EndPoint()); Point_ID ptid; ptid.id = idT; ptid.pCurve = &line; if ( line1.intersectWith(line2,ptid.ptInt)) { vtPtids.push_back(ptid); } } } } pEnt->close(); } } //排序 if (!vtPtids.empty()) { std::sort(vtPtids.begin(),vtPtids.end(),ComparePointID); typedef std::vector::iterator PIDIT; for (PIDIT it = vtPtids.begin();it != vtPtids.end();it++) { AddCross( (*it).id,(*it).ptInt,id); } } acedSSFree(ss); return FALSE; return FALSE; } BOOL AecDbECableLine::SplitWPipe(AcGePoint3d& ptMid,double dL,AecDbECableTray* pWPipe,BOOL bEraseWhiletooShort/* = TRUE*/) { AcGePoint3d ptSta = pWPipe->StartPoint(); AcGePoint3d ptEnd = pWPipe->EndPoint(); AcGeVector3d vtDir = ptEnd - ptSta; vtDir.normalize(); AecDbObjXDataMap* pXDataMapt = pWPipe->GetSpecialtyData(); AcGePoint3d ptTemp = ptMid - dL * vtDir; AcGeVector3d vtDir1 = ptTemp - ptSta; if (vtDir.isCodirectionalTo(vtDir1)) //同向,说明放得下L的 Tee { AecHvac::DuctParam data; pWPipe->GetDuctParam(data); //新建管子 //放得下L的 Tee 的情况,新建vtDir 方向的end端 AecDbECableTray* pWPipe1 = new AecDbECableTray; AecDbObjXDataMap* pXDataMap = pWPipe1->GetSpecialtyData(); XHolder lH, rH; memset(&lH, 0, sizeof(XHolder)); memset(&rH, 0, sizeof(XHolder)); if (data.m_app == WPipe::eTrench) { pWPipe->GetXHolder(kLeft, lH); pWPipe->GetXHolder(kRight, rH); } //设置图层 AecHvac::DuctParam *pParam = &data; AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, pParam->szSys, 4, _T("center2"), NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, pParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, pParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); pXDataMap->SetAt(PIPE_CENTLAY,idCenLay); pXDataMap->SetAt(PIPE_OUTDLAY,idOutLay); pXDataMap->SetAt(PIPE_SINGLAY,idSingle); pWPipe1->SetDoubleLayer(idOutLay); pWPipe1->SetSingleLayer(idSingle); pWPipe1->SetCenterLayer(idCenLay); pWPipe1->setLayer(idOutLay); pWPipe1->SetDuctParam(&data); pWPipe1->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pWPipe1->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); ptTemp = ptMid - dL * vtDir; pWPipe1->SetStartPoint(ptSta); pWPipe1->SetEndPoint(ptTemp); pWPipe1->setLayer(pWPipe->layerId()); //套管,洞口 //移除内部关联的套管,如果位置在其中 RemoveHolePipe(pWPipe1); if (pParam->m_app == WPipe::eTrench) { pWPipe1->SetXHolder(kLeft, lH); pWPipe1->SetXHolder(kRight, rH); } AcDbObjectId id = CoreTools::AddToModelSpace(pWPipe1); AddUserData(id,pXDataMap,0); //改变现有的管子的起点 ptTemp = ptMid + dL * vtDir; pWPipe->SetStartPoint(ptTemp); //套管,洞口 //移除内部关联的套管,如果位置在其中 RemoveHolePipe(pWPipe); return TRUE; } else //放不下,直接更改 start 或 end 腾出L位置 { double dDis1 = ptMid.distanceTo(ptSta); double dDis2 = ptMid.distanceTo(ptEnd); if (dDis1 < dDis2 )//靠近sta { ptTemp = ptMid + dL * vtDir; vtDir1 = ptEnd - ptTemp; if (vtDir1.isCodirectionalTo(vtDir)) { pWPipe->SetStartPoint(ptTemp); return TRUE; } } else//靠近 end { ptTemp = ptMid - dL * vtDir; vtDir1 = ptTemp - ptSta; if (vtDir1.isCodirectionalTo(vtDir)) { pWPipe->SetEndPoint(ptTemp); return TRUE; } } //套管,洞口 //移除内部关联的套管,如果位置在其中 RemoveHolePipe(pWPipe); } return FALSE; } void AecDbECableLine::RemoveHolePipe(AecDbECableTray* pWPipe) { AcGePoint3d ptS = pWPipe->StartPoint(); AcGePoint3d ptE = pWPipe->EndPoint(); AcGePoint3d ptOn; AcGeVector3d vt1,vt2; AecDbObjXDataMap* pXDatMap = pWPipe->GetSpecialtyData(); if (pXDatMap == NULL) return; //关联的洞口和套管联动 AecDbObjXDataMap::It it = pXDatMap->Begin(); AecDbObjXDataMap::It end = pXDatMap->End(); CString sKey; AecXData cVal; memset(&cVal,0,sizeof(AecXData)); CStringArray arKeysRemove; AcDbObjectId idSrc,idCloned; for (; it != end;) { if (!pXDatMap->GetNext(it, sKey, cVal)) break; if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 { AcDbHandle handle(cVal.pszVal); AcDbObjectId idHole; acdbCurDwg()->getAcDbObjectId(idHole,false,handle); AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idHole,AcDb::kForRead)) { AecDbX3dPartEntity* pX3dPartEnt = AecDbX3dPartEntity::cast(pEnt); if (pX3dPartEnt != NULL) { ptOn = pX3dPartEnt->GetOrgPoint(true); vt1 = ptOn - ptS; vt2 = ptOn - ptE; //TEST //AcDbCircle* pCir = new AcDbCircle; //pCir->setCenter(ptOn); //pCir->setRadius(100.0); //CoreTools::AddToModelSpace(pCir); if (vt1.dotProduct(vt2) > 1.e-10)//同向 { } else { arKeysRemove.Add(sKey); } } pEnt->close(); } } } for (int i = 0;i < arKeysRemove.GetSize();i++) { pXDatMap->RemoveAt(arKeysRemove.GetAt(i)); //acutPrintf(_T("\nRemove key %s"),arKeysRemove.GetAt(i)); } } BOOL AecDbECableLine::ModifyWPipe(AcGePoint3d& ptGe,AcDbObjectId id,int nPos) { AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { AecDbECableTray* pWPipe = AecDbECableTray::cast(pEnt); if (pWPipe != NULL) { if (nPos == 0) { AcGePoint3d ptGeT; ptGeT = pWPipe->StartPoint(); pWPipe->SetStartPoint(ptGe); } if (nPos == 1) { AcGePoint3d ptGeT; ptGeT = pWPipe->EndPoint(); pWPipe->SetEndPoint(ptGe); } } pEnt->close(); } return TRUE; } BOOL AecDbECableLine::AddTee(AecDbECableTray* pWPipe,double dL,const AcGePoint3d& ptMid,double dB, const AcGeVector3d& vtMin) { AecDbEcFitting* pFit = new AecDbEcFitting; AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData(); AcGeVector3d vtMaj = pWPipe->EndPoint() - pWPipe->StartPoint(); vtMaj.normalize(); double dRatio = m_pPipeParam->m_dRatio; AecHvac::DuctParam paramMaj; pWPipe->GetDuctParam(paramMaj);//取主宽 double dLx = GetElbowLx(¶mMaj); paramMaj.dSize[3] = m_pPipeParam->dSize[0];// //电缆沟设置分支 paramMaj.dSize[12] = m_pPipeParam->dSize[4]; paramMaj.dSize[13] = m_pPipeParam->dSize[5]; paramMaj.dSize[14] = m_pPipeParam->dSize[6]; paramMaj.dSize[15] = m_pPipeParam->dSize[7]; paramMaj.dSize[16] = m_pPipeParam->dSize[8]; paramMaj.dSize[17] = m_pPipeParam->dSize[9]; paramMaj.dSize[18] = m_pPipeParam->dSize[10]; pFit->SetDuctParam(paramMaj); if (paramMaj.m_app == WPipe::eTrench) { XHolder lH, rH; memset(&lH, 0, sizeof(XHolder)); memset(&rH, 0, sizeof(XHolder)); bool bLeft = pWPipe->GetXHolder(kLeft, lH); bool bRight = pWPipe->GetXHolder(kRight, rH); if (bLeft) pFit->SetXHolder(kLeft, m_lHolder); if (bRight) pFit->SetXHolder(kRight, m_rHolder); } pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eTee); pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid); pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度 pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio); pFit->GetSpecialtyData()->SetAt(HTEE_Type,(int)AecHvac::eIncline2Branch); pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj); pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin); //设置图层 AecHvac::DuctParam *pParam = m_pPipeParam; AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); pFit->setLayer(idOutLay); pFit->SetDoubleLayer(idOutLay); pFit->SetCenterLayer(idCenLay); pFit->SetCenterLayer(idCenLay); AcDbObjectId id = CoreTools::AddToModelSpace(pFit); AddUserData(id,pXDataMap,2); return TRUE; } BOOL AecDbECableLine::AddTee3(const AcGePoint3d &ptMid, double dL, const AcGeVector3d& vtMaj,const AcGeVector3d &vtMin, AecUserInterface &uinf) { AecDbEcFitting *pFit = new AecDbEcFitting; AecDbObjXDataMap *pXDataMap = pFit->GetSpecialtyData(); double dLx = GetElbowLx(m_pPipeParam); pFit->SetDuctParam(*m_pPipeParam); pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE, 2); pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW, 0); pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME, (int)eTee); pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid); pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度 pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio); pFit->GetSpecialtyData()->SetAt(HTEE_Type, (int)AecHvac::eIncline2Branch); pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj); pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin); int nTeeStyle = 3; pFit->GetSpecialtyData()->SetAt(KEY_TEESTYLE, nTeeStyle); pFit->AddUserInterface(uinf); //设置图层 AecHvac::DuctParam *pParam = m_pPipeParam; AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); pFit->setLayer(idOutLay); pFit->SetDoubleLayer(idOutLay); pFit->SetCenterLayer(idCenLay); pFit->SetCenterLayer(idCenLay); AcDbObjectId id = CoreTools::AddToModelSpace(pFit); AddUserData(id, pXDataMap, 2); return TRUE; } BOOL AecDbECableLine::AddTee5(const AcGePoint3d &ptMid, double dL, const AcGeVector3d &vtMaj, const AcGeVector3d &vtMin, AecUserInterface &uinf) { AecDbEcFitting *pFit = new AecDbEcFitting; AecDbObjXDataMap *pXDataMap = pFit->GetSpecialtyData(); double dLx = GetElbowLx(m_pPipeParam); pFit->SetDuctParam(*m_pPipeParam); pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE, 2); pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW, 0); pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME, (int)eTee); pFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid); pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度 pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio); pFit->GetSpecialtyData()->SetAt(HTEE_Type, (int)AecHvac::eIncline2Branch); pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj); pFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin); int nTeeStyle = 5; pFit->GetSpecialtyData()->SetAt(KEY_TEESTYLE, nTeeStyle); pFit->AddUserInterface(uinf); //设置图层 AecHvac::DuctParam *pParam = m_pPipeParam; AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); pFit->setLayer(idOutLay); pFit->SetDoubleLayer(idOutLay); pFit->SetCenterLayer(idCenLay); pFit->SetCenterLayer(idCenLay); AcDbObjectId id = CoreTools::AddToModelSpace(pFit); AddUserData(id, pXDataMap, 2); return TRUE; } BOOL AecDbECableLine::AddCross(AcDbObjectId id1,AcGePoint3d& ptInt,AcDbObjectId idThis) { AecHvac::DuctParam paramMaj,paramMin; AecHvac::DuctParam param1,param2; AecDbECableTray* pWPipe = NULL; double dL = 0.0,dB = 0.0; AcGeVector3d vtMaj,vtMin; double dRatio = m_pPipeParam->m_dRatio; double dLx = GetElbowLx(m_pPipeParam); dL = GetElbowL(m_pPipeParam); dB = dL; XHolder lH, rH; memset(&lH, 0, sizeof(XHolder)); memset(&rH, 0, sizeof(XHolder)); AcDbEntity* pEnt1 = NULL; AcDbEntity* pEnt2 = NULL; //确定maj if ( Acad::eOk == acdbOpenAcDbEntity(pEnt1,id1,AcDb::kForRead)) { pWPipe = AecDbECableTray::cast(pEnt1); if (pWPipe != NULL) { pWPipe->GetDuctParam(param1);//取主宽 if (param1.m_app == WPipe::eTrench) { pWPipe->GetXHolder(kLeft, lH); pWPipe->GetXHolder(kRight, rH); } } pEnt1->close(); } if ( Acad::eOk == acdbOpenAcDbEntity(pEnt2,idThis,AcDb::kForRead)) { pWPipe = AecDbECableTray::cast(pEnt2); if (pWPipe != NULL) { pWPipe->GetDuctParam(param2);//取主宽 } pEnt2->close(); } bool b2isMaj = false; if (param1.dSize[0] > param2.dSize[0]) { memcpy(¶mMaj,¶m1,sizeof(AecHvac::DuctParam)); memcpy(¶mMin,¶m2,sizeof(AecHvac::DuctParam)); } else { memcpy(¶mMaj,¶m2,sizeof(AecHvac::DuctParam)); memcpy(¶mMin,¶m1,sizeof(AecHvac::DuctParam)); b2isMaj = true; } dLx = GetElbowLx(¶mMaj); dL = GetElbowL(¶mMaj); dB = dL; if ( fabs(param1.dSize[1] - param2.dSize[1]) > 1.e-1) { acutPrintf(_T("\n选择的两桥架高度不同,不能创建四通!")); return FALSE; } AcDbObjectId idLay; // id1 管分割为两部分 if ( Acad::eOk == acdbOpenAcDbEntity(pEnt1,id1,AcDb::kForWrite)) { pWPipe = AecDbECableTray::cast(pEnt1); if (pWPipe != NULL) { vtMaj = pWPipe->EndPoint() - pWPipe->StartPoint(); vtMaj.normalize(); AcGeLineSeg3d ln(pWPipe->StartPoint(),pWPipe->EndPoint()); if (ln.isOn(ptInt)) //落在管子上,两管线相交 { SplitWPipe(ptInt,dL,pWPipe,TRUE); } else //不落在管子上,两管线延长相交, 外部加四通命令调用 { vtMaj.normalize(); double dDis1 = ptInt.distanceTo(pWPipe->StartPoint()); double dDis2 = ptInt.distanceTo(pWPipe->EndPoint()); if (dDis1 < dDis2)//距离sta近 { pWPipe->SetStartPoint(ptInt + vtMaj * dL); } else { pWPipe->SetEndPoint(ptInt - vtMaj * dL); } } } pEnt1->close(); } //idThis 管分割为两部分 if ( Acad::eOk == acdbOpenAcDbEntity(pEnt2,idThis,AcDb::kForWrite)) { idLay = pEnt2->layerId(); pWPipe = AecDbECableTray::cast(pEnt2); if (pWPipe != NULL) { vtMin = pWPipe->EndPoint() - pWPipe->StartPoint(); vtMin.normalize(); AcGeLineSeg3d ln(pWPipe->StartPoint(),pWPipe->EndPoint()); if (ln.isOn(ptInt)) //落在管子上,两管线相交 { if ( !SplitWPipe(ptInt,dB,pWPipe,FALSE) ) { //太短,放不下四通 pEnt2->close(); return FALSE; } } else //不落在管子上,两管线延长相交, 外部加四通命令调用 { vtMin.normalize(); double dDis1 = ptInt.distanceTo(pWPipe->StartPoint()); double dDis2 = ptInt.distanceTo(pWPipe->EndPoint()); if (dDis1 < dDis2)//距离sta近 { pWPipe->SetStartPoint(ptInt + vtMin * dL); } else { pWPipe->SetEndPoint(ptInt - vtMin * dL); } } } pEnt2->close(); } //加入四通 AcGeVector3d vtNro = vtMin.crossProduct(vtMaj); AecDbEcFitting* pFit = new AecDbEcFitting; AecDbObjXDataMap* pXDataMap = pFit->GetSpecialtyData(); //设置图层 int nColor = KTSetting::GetLayerColor(LAY_CABTRY_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx(LAY_CABTRY_CEN,m_pPipeParam->szSys,4,_T("center2"),NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((m_pPipeParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT,m_pPipeParam->szSys,nColor, (m_pPipeParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"),NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((m_pPipeParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG,m_pPipeParam->szSys,7, (m_pPipeParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"),NULL); pFit->setLayer(idOutLay); pFit->SetDoubleLayer(idOutLay); pFit->SetCenterLayer(idCenLay); pFit->SetCenterLayer(idCenLay); paramMaj.dSize[3] = paramMin.dSize[0];// //电缆沟设置分支 paramMaj.dSize[12] = m_pPipeParam->dSize[4]; paramMaj.dSize[13] = m_pPipeParam->dSize[5]; paramMaj.dSize[14] = m_pPipeParam->dSize[6]; paramMaj.dSize[15] = m_pPipeParam->dSize[7]; paramMaj.dSize[16] = m_pPipeParam->dSize[8]; paramMaj.dSize[17] = m_pPipeParam->dSize[9]; paramMaj.dSize[18] = m_pPipeParam->dSize[10]; pFit->SetDuctParam(paramMaj); if (paramMaj.m_app == WPipe::eTrench) { pFit->SetXHolder(kLeft,lH); pFit->SetXHolder(kRight, rH); } pFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); pFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eCross); pFit->GetSpecialtyData()->SetAt(KEY_MID, ptInt); pFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度 pFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio); pFit->GetSpecialtyData()->SetAt(HTEE_Type,(int)AecHvac::eInterCross); pFit->GetSpecialtyData()->SetAt(KEY_MAJBR, b2isMaj ? vtMin : vtMaj); pFit->GetSpecialtyData()->SetAt(KEY_MINBR, b2isMaj ? vtMaj : vtMin); AcDbObjectId id = CoreTools::AddToModelSpace(pFit); AddUserData(id,pXDataMap,2); return TRUE; } BOOL AecDbECableLine::AddElbow(AcDbObjectId id1,AcGePoint3d& ptGe,AcDbObjectId idThis) { AecDbECableTray* pWPipe1 = NULL; AecDbECableTray* pWPipe2 = NULL; AcDbEntity* pEnt1 = NULL; AcDbEntity* pEnt2 = NULL; BOOL bSuccess = FALSE; if (Acad::eOk == acdbOpenAcDbEntity(pEnt1,id1,AcDb::kForWrite)) { if (Acad::eOk == acdbOpenAcDbEntity(pEnt2,idThis,AcDb::kForWrite)) { pWPipe1 = AecDbECableTray::cast(pEnt1); pWPipe2 = AecDbECableTray::cast(pEnt2); if (pWPipe1 != NULL && pWPipe2 != NULL) { AcGeLine3d ln1(pWPipe1->StartPoint(),pWPipe1->EndPoint()); AcGeLine3d ln2(pWPipe2->StartPoint(),pWPipe2->EndPoint()); AcGePoint3d ptMid = ptGe; ln1.intersectWith(ln2,ptMid); ptGe = ptMid;//?? AecHvac::DuctParam param1,param2; pWPipe1->GetDuctParam(param1); pWPipe2->GetDuctParam(param2); int npos1 = 1,npos2 = 1; AcGeVector3d vtMaj,vtMin; double dDis1 = ptMid.distanceTo(pWPipe1->EndPoint()); double dDis2 = ptMid.distanceTo(pWPipe1->StartPoint()); vtMaj = pWPipe1->EndPoint() - pWPipe1->StartPoint();//默认靠近 end if (dDis1 > dDis2) { vtMaj = pWPipe1->StartPoint() - pWPipe1->EndPoint();//靠近 sta npos1 = 0; } vtMaj.normalize(); vtMaj.negate(); dDis1 = ptMid.distanceTo(pWPipe2->EndPoint()); dDis2 = ptMid.distanceTo(pWPipe2->StartPoint()); vtMin = pWPipe2->EndPoint() - pWPipe2->StartPoint();//默认靠近 end if (dDis1 > dDis2) { vtMin = pWPipe2->StartPoint() - pWPipe2->EndPoint();//靠近 sta npos2 = 0; } vtMin.normalize(); vtMin.negate(); //if ( fabs(param1.dSize[0] - param2.dSize[0]) < 1.e-6) { //创建弯头,是插入到当前管子的接口记录的前面 AcDbObjectId id = CreateElbow(vtMaj,ptMid,vtMin,¶m1,TRUE); //获取万头接口,改变边的管子 AcDbEntity* pEnt3 = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt3,id,AcDb::kForRead)) { AecDbEcFitting* pFit = AecDbEcFitting::cast(pEnt3); if (pFit != NULL) { AecInterface inf1,inf2; pFit->GetInterface(0,inf1); pFit->GetInterface(1,inf2); AcGeVector3d vtPipe = pWPipe1->EndPoint() - pWPipe1->StartPoint(); if (vtPipe.isParallelTo(inf1.vtDir)) { if (npos1 == 0)//改sta pWPipe1->SetStartPoint(inf1.ptPos); else pWPipe1->SetEndPoint(inf1.ptPos); if (npos2 == 0) pWPipe2->SetStartPoint(inf2.ptPos); else pWPipe2->SetEndPoint(inf2.ptPos); } else { if (npos1 == 0)//改sta pWPipe1->SetStartPoint(inf2.ptPos); else pWPipe1->SetEndPoint(inf2.ptPos); if (npos2 == 0) pWPipe2->SetStartPoint(inf1.ptPos); else pWPipe2->SetEndPoint(inf1.ptPos); } } pEnt3->close(); } } bSuccess = TRUE; } pEnt2->close(); } pEnt1->close(); } return bSuccess; } BOOL AecDbECableLine::ChangeElbowToTree(AecDbEcFitting* pDbFit,AcGeVector3d vtMaj,AcGePoint3d ptGeM,AcGeVector3d vtMin,double dDn,AECStatusRecord* pCurRec) { //查询 Tee 数据 AecHvac::DuctParam param; memset(¶m,0,sizeof(AecHvac::DuctParam)); pDbFit->GetDuctParam(param); double dL = 0.0,dS = 0.0; dL = GetElbowL(¶m); dS = dL; double dLx = GetElbowLx(¶m); AecInterface intf1,intf2; pDbFit->GetInterface(0,intf1); pDbFit->GetInterface(1,intf2); vtMaj.normalize(); vtMin.normalize(); //创建三通 AecDbEcFitting* pFitting = new AecDbEcFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); pFitting->SetDuctParam(param); if (param.m_app == WPipe::eTrench) { XHolder lHolder, rHolder; memset(&lHolder, 0, sizeof(XHolder)); memset(&rHolder, 0, sizeof(XHolder)); bool bLeft = pDbFit->GetXHolder(kLeft, lHolder); bool bRight = pDbFit->GetXHolder(kRight, rHolder); if (bLeft) pFitting->SetXHolder(kLeft, m_lHolder); if (bRight) pFitting->SetXHolder(kRight, m_rHolder); } pFitting->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pFitting->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); pFitting->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eTee); pFitting->GetSpecialtyData()->SetAt(KEY_MID, ptGeM); pFitting->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度 pFitting->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio); pFitting->GetSpecialtyData()->SetAt(HTEE_Type,(int)AecHvac::eIncline2Branch); pFitting->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj); pFitting->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin); AcGeVector3d vtNro = vtMin.crossProduct(vtMaj); pXDataMap->SetAt(KEY_NORMAL,vtNro); //设置图层 AecHvac::DuctParam *pParam = ¶m; AcDbObjectId idLay = KTSetting::InitLayer((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); int nColor = KTSetting::GetLayerColor((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT); AcDbObjectId idCenLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_CEN : LAY_TRENCH_CEN, m_pPipeParam->szSys, 4, _T("center2"), NULL); AcDbObjectId idOutLay = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_OUT : LAY_TRENCH_OUT, m_pPipeParam->szSys, nColor, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); AcDbObjectId idSingle = CablelineTools::AecInitLayerEx((pParam->m_app == WPipe::eBridge) ? LAY_CABTRY_SIG : LAY_TRENCH_SIG, m_pPipeParam->szSys, 7, (pParam->m_app == WPipe::eBridge) ? _T("Continuous") : _T("Dashed"), NULL); pFitting->setLayer(idOutLay); pFitting->SetDoubleLayer(idOutLay); pFitting->SetCenterLayer(idCenLay); pFitting->SetCenterLayer(idCenLay); //可能的几种修改,更改弯头两头的管子的位置 AcGePoint3d ptGe; if (intf1.vtDir.isParallelTo(vtMin)) { ptGe = ptGeM + dS * vtMin; ModifyPipeOfElbow(GetConnectObject(intf1, m_arHistoryIntfs),intf1.ptPos,ptGe); } if (intf2.vtDir.isParallelTo(vtMin)) { ptGe = ptGeM + dS * vtMin; ModifyPipeOfElbow(GetConnectObject(intf2, m_arHistoryIntfs),intf2.ptPos,ptGe); } if (intf1.vtDir.isParallelTo(vtMaj)) { ptGe = ptGeM - dL * vtMaj; ModifyPipeOfElbow(GetConnectObject(intf1, m_arHistoryIntfs),intf1.ptPos,ptGe); } if (intf2.vtDir.isParallelTo(vtMaj)) { ptGe = ptGeM - dL * vtMaj;//反向 ModifyPipeOfElbow(GetConnectObject(intf2, m_arHistoryIntfs),intf2.ptPos,ptGe); } //替换pdbfit pDbFit->erase(); AcDbObjectId id = CoreTools::AddToModelSpace(pFitting); AddUserData(id,pXDataMap,2); // AECStatusRecord* pRecMid = new AECStatusRecord; pRecMid->CopyFrom(pCurRec); ptGe = ptGeM + vtMaj * dL; pRecMid->SetAcquirePoint(ptGe); m_pPipeJig->PushBackStatusRec(pRecMid); return TRUE; } BOOL AecDbECableLine::ChangeTeeToCross(AecDbEcFitting* pDbFit,AcGeVector3d& vtMaj,AcGeVector3d& vtMin,AECStatusRecord* pCurRec) { AecHvac::DuctParam param; memset(¶m,0,sizeof(AecHvac::DuctParam)); pDbFit->GetDuctParam(param); double dL = 0.0,dB = 0.0; dL = GetElbowL(¶m); dB = dL; double dLx = GetElbowLx(¶m); AecDbObjXDataMap* pXDataMap = pDbFit->GetSpecialtyData(); pXDataMap->SetAt(KEY_RUNTIME, eCross); pXDataMap->SetAt(KEY_MAJBR,vtMaj); pXDataMap->SetAt(KEY_MINBR,vtMin);// AcGeVector3d vtNro = vtMaj.crossProduct(vtMin);// pXDataMap->SetAt(KEY_NORMAL,vtNro); pXDataMap->SetAt(KEY_L,dL); pXDataMap->SetAt(KEY_T,dB); AcGePoint3d ptMid; pXDataMap->GetAt(KEY_MID,ptMid); pDbFit->GetSpecialtyData()->SetAt(KEY_2DSTYLE,2); pDbFit->GetSpecialtyData()->SetAt(KEY_SINGLEW,0); pDbFit->GetSpecialtyData()->SetAt(KEY_RUNTIME,(int)eCross); pDbFit->GetSpecialtyData()->SetAt(KEY_MID, ptMid); pDbFit->GetSpecialtyData()->SetAt(HELB_LX, dLx);//直边长度 pDbFit->GetSpecialtyData()->SetAt(HELB_RadRatio, m_pPipeParam->m_dRatio); pDbFit->GetSpecialtyData()->SetAt(HTEE_Type,(int)AecHvac::eInterCross); pDbFit->GetSpecialtyData()->SetAt(KEY_MAJBR, vtMaj); pDbFit->GetSpecialtyData()->SetAt(KEY_MINBR, vtMin); vtMin.normalize(); AcGePoint3d ptGe = ptMid - vtMin * dB; AECStatusRecord* pRecMid = new AECStatusRecord; pRecMid->CopyFrom(pCurRec); pRecMid->SetAcquirePoint(ptGe); m_pPipeJig->PushBackStatusRec(pRecMid); return TRUE; } void AecDbECableLine::ModifyPipeOfElbow(AcDbObjectId id,AcGePoint3d ptOld,AcGePoint3d ptNew) { AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { AecDbECableTray* pPipe = AecDbECableTray::cast(pEnt); if (pPipe != NULL) { AcGePoint3d ptGeT; AcGeVector3d vtPipe = pPipe->EndPoint() - pPipe->StartPoint(); if ( pPipe->EndPoint().distanceTo(ptOld) < 1.e-6) { ptGeT = pPipe->EndPoint(); pPipe->SetEndPoint(ptNew); } if (pPipe->StartPoint().distanceTo(ptOld) < 1.e-6) { ptGeT = pPipe->StartPoint(); pPipe->SetStartPoint(ptNew); } } pEnt->close(); } } double AecDbECableLine::PixelToWcs(int nPixel) { ads_point ptScreenSize; double nViewSize; struct resbuf rb1,rb2; acedGetVar(_T("ScreenSize"), &rb1); acedGetVar(_T("ViewSize"), &rb2); nViewSize = rb2.resval.rreal; ads_point_set(rb1.resval.rpoint,ptScreenSize); if (ptScreenSize[1] < 1.0E-6 || nViewSize < 1.0E-6) return 0.0; double hight = (nViewSize / ptScreenSize[Y]) * nPixel; return hight; } void AecDbECableLine::AddUserData(AcDbObjectId id,AecDbObjXDataMap* pXDataMap,int nType) { // 增加参数 [10/24/2016 Rex] if(g_pMapData != NULL && !id.isNull()) { AecDbObjXDataMap* pXTempDataMap = new AecDbObjXDataMap(); CMapStringToString mapData; if(pXTempDataMap->Read(id,_T("BIMEQUIP"),TRUE)) { //用户数据USER0~999 CString sKey,sVal; for (int i = 0;i < MAX_BIM_DATA_LEN;i++) { sKey.Format(_T("user%d"),i) ; if (pXDataMap->GetAt(sKey,sVal)) { mapData.SetAt(sKey,sVal); } else { break; } } } mapData.RemoveAll(); CString sKey; CString sVal; for (POSITION ps = g_pMapData->GetStartPosition();ps != NULL;) { g_pMapData->GetNextAssoc(ps,sKey,sVal); mapData.SetAt(sKey,sVal); } for (int i = 0;i < MAX_BIM_DATA_LEN;i++) { sKey.Format(_T("user%d"),i) ; pXTempDataMap->RemoveAt(sKey); } for (POSITION ps = mapData.GetStartPosition();ps != NULL;) { mapData.GetNextAssoc(ps,sKey,sVal); if(sVal.Find(_T("物料描述")) != -1) { //nType == 0 Pipe,1 Elbow,2 Tee,3 Cross,4 Flange CString szTempKey = _T(""); switch (nType) { case 1: case 2: case 3: case 4: case 5: { if(nType == 1) szTempKey = _T("弯头"); else if(nType == 2) szTempKey = _T("三通"); else if(nType == 3) szTempKey = _T("四通"); else if(nType == 4) szTempKey = _T("法兰"); else if(nType == 5) szTempKey = _T("变径"); else szTempKey = _T(""); CString szTemp; szTemp = sVal; int nIndex = szTemp.Find(_T("(")); if(nIndex >= 0) { szTemp = szTemp.Mid(nIndex); szTempKey = _T("物料描述:") + szTempKey; szTemp = szTempKey + szTemp; sVal = szTemp; } } break; default: break; } } pXTempDataMap->SetAt(sKey,sVal); } //pXTempDataMap->SetAt(_T("user0"),_T("test:test")); if(pXTempDataMap->Write(id,_T("BIMEQUIP"),TRUE)) { DELETE_PTR(pXTempDataMap); pXTempDataMap = NULL; } } }