#include "StdAfx.h" #include "PipelineTools.h" #include "aecPipeLine.h" #include "AecAngleWatch.h" #include "AECStatusRecord.h" #include "aecPipeJig.h" #include "aecPipeSupport.h" #include "KTModelLayoutXData.h" #include "coretools.h" #include "AecDbX3dPartEntity.h" #include "KTCADUtilityEx.h" extern CString IDCreate(); #define GRIP_CMD _T("PL_wpipeadd") namespace { 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; } void setInfo2Ent(AecDbObjXDataMap &xData) { CString sys; if (!xData.GetAt(PIPE_SYS, sys)) return; int clr; double dw; AcDbObjectId idLt, idLy; clr = CoreTools::getColorByPipeSys(sys, true); idLy = CoreTools::getLyByPipeSys(sys, true); idLt = CoreTools::getLtByPipeSys(sys, true); dw = CoreTools::getLwByPipeSys(sys, true); xData.SetAt(PIPE_COLOR, clr); xData.SetAt(PIPE_LINETYPE, idLt); xData.SetAt(PIPE_LINEWIDTH, dw); xData.SetAt(PIPE_LINELAYER, idLy); clr = CoreTools::getColorByPipeSys(sys, false); idLy = CoreTools::getLyByPipeSys(sys, false); idLt = CoreTools::getLtByPipeSys(sys, false); dw = CoreTools::getLwByPipeSys(sys, false); xData.SetAt(PIPE_COLOR_OUT, clr); xData.SetAt(PIPE_LINETYPE_OUT, idLt); xData.SetAt(PIPE_LINEWIDTH_OUT, dw); xData.SetAt(PIPE_LINELAYER_OUT, idLy); } AcGePoint3d MidPoint(const AcGePoint3d &pt1, const AcGePoint3d &pt2) { return AcGePoint3d((pt1.x + pt2.x) / 2.0, (pt1.y + pt2.y) / 2.0, (pt1.z + pt2.z) / 2.0); } } TDbPipeLine::TDbPipeLine(TDbPipeJig* 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_bWipeClip = false; KTModelLayoutXData::ReadModelXData(KT_PIPEINIT,m_xInitDataMap); } TDbPipeLine::~TDbPipeLine(void) { if ( m_pAngleWatch != NULL) DELETE_PTR(m_pAngleWatch); } void TDbPipeLine::SetPipeParam(WPipe::PipeParam* pPipePar) { m_pPipeParam = pPipePar; } WPipe::PipeParam* TDbPipeLine::GetPipeParam() { return m_pPipeParam; } double TDbPipeLine::GetEndElevation() const { return m_pPipeParam->m_dEl; } AecInterface* TDbPipeLine::GetLastInterface() { int nLen = m_arHistoryIntfs.GetSize(); if (nLen > 0) { AecInterface& intf = m_arHistoryIntfs[nLen - 1]; return &intf; } return NULL; } void TDbPipeLine::SetInitDataMapPartFrom(AecDbObjXDataMap* pXDataMapSrc) { double dMinSW = 0.0; pXDataMapSrc->GetAt(KEY_SINGLEW,dMinSW); double dOutSW = 0.0; pXDataMapSrc->GetAt(KEY_DBLINEW,dOutSW); double dWD = 0.0; pXDataMapSrc->GetAt(DOC_WELDDIA,dWD); int nCr = 0; pXDataMapSrc->GetAt(PIPE_COLOR,nCr); //如果是米单位 struct resbuf rb; acedGetVar(_T("INSUNITS"), &rb); if (rb.resval.rint == AcDb::kUnitsMeters) { dMinSW *= 1000.0;//还原 dOutSW *= 1000.0;//还原 dWD *= 1000.0;//还原 } double dScale = 1.0; CString sScale; m_xInitDataMap.GetAt(DOC_SCALE, sScale); //出图比例 int nPos = sScale.Find(_T(':')); if (nPos != -1) { dScale = _ttof(sScale.Mid(nPos + 1)); } dMinSW /= dScale; m_xInitDataMap.SetAt(DOC_PLOTWIDTH,dMinSW); //单线线宽 dOutSW /= dScale; m_xInitDataMap.SetAt(DOC_DPLOTWIDTH,dOutSW);//外双线线宽 dWD /= dScale; m_xInitDataMap.SetAt(DOC_WELDDIA, dWD); //焊点直径 m_xInitDataMap.SetAt(PIPE_COLOR,nCr); } void TDbPipeLine::setEApp(WPipe::EApp app) { if (m_pPipeParam) m_pPipeParam->m_app = app; } WPipe::EApp TDbPipeLine::getEApp() { if (m_pPipeParam) return m_pPipeParam->m_app; else return WPipe::eNoneApp; } double TDbPipeLine::GetAngWatchSp() const { return m_pAngleWatch->GetAngWatchSp(); } void TDbPipeLine::SetAngWatchSp(double nSp) { m_pAngleWatch->SetAngWatchSp(nSp); } void TDbPipeLine::SetFittingLayer(AecDbEwFitting *pFitting, LPCTSTR pszSys) { AcDbObjectId idCenLay, idOutLay, idSingle, idDash, idCen; //OLD //idCenLay = CoreTools::AecInitLayerEx(LAY_FITN_CENTER,m_pPipeParam->szSys,4,_T("Center2"),NULL); //idOutLay = CoreTools::AecInitLayerEx(LAY_FITN_OUTSIDE,m_pPipeParam->szSys,6,_T("Continuous"),NULL); //idSingle = CoreTools::AecInitLayerEx(LAY_FITN_SINGLE,m_pPipeParam->szSys,6,_T("Continuous"),NULL); idCenLay = CoreTools::getLyByPipeSys(pszSys, true); idOutLay = CoreTools::getLyByPipeSys(pszSys, false); idSingle = CoreTools::getLyByPipeSys(pszSys, true); AecDbObjXDataMap *pXDataMap = pFitting->GetSpecialtyData(); pXDataMap->SetAt(PIPE_CENTLAY, idCenLay); pXDataMap->SetAt(PIPE_OUTDLAY, idOutLay); pXDataMap->SetAt(PIPE_SINGLAY, idSingle); pXDataMap->SetAt(PIPE_SYS, pszSys); idDash = PipelineTools::AecInitLayerEx(LAY_FITN_DASH, 8, _T("DASH"), NULL); pFitting->setLayer(idCenLay); pFitting->SetDashLayer(idDash); pFitting->SetCenterLayer(idCenLay); pFitting->SetSingleLayer(idCenLay); pFitting->SetDoubleLayer(idOutLay); setInfo2Ent(*pXDataMap); } void TDbPipeLine::SetPipeLayer(AecDbEwPipe *pWpipe, LPCTSTR pszSys) { AcDbObjectId idCenLay, idOutLay, idSingle, idDash, idCen; AcDbObjectId innLy = CoreTools::getLyByPipeSys(pszSys, true); AcDbObjectId outLy = CoreTools::getLyByPipeSys(pszSys, false); pWpipe->GetSpecialtyData(AcDb::kForWrite)->SetAt(PIPE_LINELAYER, innLy); pWpipe->GetSpecialtyData(AcDb::kForWrite)->SetAt(PIPE_LINELAYER, outLy); idCenLay = innLy; idOutLay = outLy; idSingle = innLy; AecDbObjXDataMap *pXDataMap = pWpipe->GetSpecialtyData(); pXDataMap->SetAt(PIPE_CENTLAY, idCenLay); pXDataMap->SetAt(PIPE_OUTDLAY, idOutLay); pXDataMap->SetAt(PIPE_SINGLAY, idSingle); pXDataMap->SetAt(PIPE_SYS, pszSys); // 管线实体的图层 AcDbObjectId idPipeLayer(CoreTools::getLyForPipe(pszSys)); if (idPipeLayer.isValid()) pWpipe->setLayer(idPipeLayer); // end idDash = CoreTools::AecInitLayerEx(LAY_PIPE_DASH, pszSys, 8, _T("dash"), NULL); pWpipe->SetDashLayer(idDash); pWpipe->SetCenterLayer(idCenLay); pWpipe->SetSingleLayer(idCenLay); pWpipe->SetDoubleLayer(idOutLay); setInfo2Ent(*pXDataMap); } BOOL TDbPipeLine::AddPipeNode(AECStatusRecord* pRec,WPipe::PipeDraw ePipe) { switch(ePipe) { case WPipe::eToPreView: { if (m_pCurPipeLine[0] == NULL) m_pCurPipeLine[0] = new AecDbEwPipe; AecDbEwPipe* pWpipe = (AecDbEwPipe*)m_pCurPipeLine[0]; AecDbObjXDataMap* pXDataMap = pWpipe->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); pWpipe->SetSection(m_pPipeParam->m_dD, m_pPipeParam->m_dThick); setInfo2Ent(*pXDataMap); //设置图层 AcDbObjectId idCenLay,idOutLay,idSingle; if (!pXDataMap->GetAt(PIPE_CENTLAY,idCenLay)) { //idCenLay = PipelineTools::getSysLayer(m_pPipeJig->GetAdoDb(),m_pPipeParam->szSys); //idCenLay = CoreTools::AecInitLayerEx(LAY_PIPE_CENTER,m_pPipeParam->szSys,4,_T("center2"),NULL); //idOutLay = CoreTools::AecInitLayerEx(LAY_PIPE_OUTSIDE,m_pPipeParam->szSys,7,_T("Continuous"),NULL); //idSingle = CoreTools::AecInitLayerEx(LAY_PIPE_SINGLE,m_pPipeParam->szSys,7,_T("Continuous"),NULL); //pXDataMap->SetAt(PIPE_CENTLAY,idCenLay); //pXDataMap->SetAt(PIPE_OUTDLAY,idOutLay); //pXDataMap->SetAt(PIPE_SINGLAY,idSingle); } AcGePoint3d ptGe,ptGe1,ptGe2; ptGe = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); ptGe1 = pRec->GetAcquirePoint(); pWpipe->SetStartPoint( ptGe ); pWpipe->SetEndPoint( ptGe1 ); AcGeVector3d vtDir = AcGeVector3d::kXAxis; vtDir = m_pAngleWatch->m_vtDir; 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; vtDir2.normalize();vtDir1.normalize(); double dAng = 0; bool bEx = false; int nLen = m_arHistoryIntfs.GetSize(); if (nLen >= 0) { AcGePoint3d ptCur = pRec->GetAcquirePoint(); AcGePoint3d ptGeM = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); AcGeVector3d vtMaj, vtMin; vtMaj = m_arHistoryIntfs[nLen - 1].vtDir; vtMin = ptCur - ptGeM; dAng = vtMin.angleTo(vtMaj); if (dAng < PI / 40.0) { bEx = true; } } if (vtDir2.isParallelTo(vtDir1) || bEx) //平行,和上次同向,连续画 { ExtendLastWPipe(pRec); } else //添加弯头过渡 { EFittingType type(eElbow); if (getEApp() == WPipe::eDuct) type = eDuctElbow; else if (getEApp() == WPipe::eBridge) type = eBridgeElbow; CreateElbowAndPipe(pRec, type); m_pPipeParam->m_dEl = pRec->GetAcquirePoint().z;//4-24 } } 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 TDbPipeLine::QuerySetProjectLevel(AecDbObjXDataMap *pXDataMap, WPipe::PipeParam *pParam, LPCTSTR pszFitName) { CString sProject = _T("工业"); pXDataMap->GetAt(DOC_PROJECT, sProject); CString sLevel; if (!pXDataMap->GetAt(PIPE_LEVEL, sLevel)) { sLevel = pParam->szLevel; } int nTrade = 0; pXDataMap->GetAt(DOC_TRADE, nTrade); //行业 WPipe::Trade eTrade = (WPipe::Trade)nTrade; CString sSNO; //查询项目等级 管件 if (!TDbPipeSupport::QueryFitSpecsNo(m_pPipeJig->GetAdoDb(), pParam->m_dDN, sSNO, eTrade, pszFitName, sProject, sLevel)) { return FALSE; } //外径系列 pXDataMap->SetAt(PIPE_OD_SN, sSNO); return TRUE; } AcDbObjectId TDbPipeLine::AddFitToModelSpace(AecDbEwFitting *pFitting, bool bIsSureAdd2MSp /*= true*/) { AecDbObjXDataMap *pXDataMap = pFitting->GetSpecialtyData(); CString sProject = _T("工业");; pXDataMap->GetAt(DOC_PROJECT, sProject); CString sLevel; pXDataMap->GetAt(PIPE_LEVEL, sLevel); double dDN = 0.0; pXDataMap->GetAt(PIPE_DN, dDN); double dPre = 1.6; pXDataMap->GetAt(PIPE_PRESSURE, dPre); CString sFitName; pFitting->GetFittingName(sFitName); AcGeVector3d vtOff(0, 0, 0); int nType = 0; pXDataMap->GetAt(KEY_RUNTIME, nType); EFittingType eType = (EFittingType)nType; /* * [项目名称] varchar(255), [等级名称] varchar(250), [类别] varchar(250), [类型] varchar(250), [公称直径] INTEGER, [材质] varchar(50), [表号] varchar(250), [标准号] varchar(250), [外径系列] varchar(255), [描述] varchar(255), */ CString sSQL; sSQL.Format(_T("select [项目名称],[等级名称],[类别],[类型],[公称直径],[材质],[表号],[标准号],[外径系列],[描述] from AecSpecFit where [项目名称]='%s' and") _T(" [等级名称]='%s' and [类别]='管件' and [类型]='%s'") _T(" and [公称直径]=%d"), sProject, sLevel, sFitName, (int)(dDN+0.5)); CString sInfo; CStringArray arValues; m_pPipeJig->GetAdoDb()->GetSelData(sSQL, arValues); if (arValues.GetSize() >= 11) { for (int i = 1; i <= 9; i++)//最后一个为描述 { if (i == 1) { sInfo = arValues.GetAt(i); } else { sInfo += _T("^") + arValues.GetAt(i); } } //统计信息 pXDataMap->SetAt(PIPE_MTOALL, sInfo); } int nTrade = 0; pXDataMap->GetAt(DOC_TRADE, nTrade); //行业 WPipe::Trade eTrade = (WPipe::Trade)nTrade; WPipe::FITSPEC fitSpec; memset(&fitSpec, 0, sizeof(WPipe::FITSPEC)); int nConnectType = 0; pXDataMap->GetAt(PIPE_CONNECT, nConnectType); if (nConnectType == 3 || nConnectType == 5 || eType == eFlange )//法兰管件 需要加 加垫片 和 螺栓 螺母 信息 { //查询 外径系列,表号,标准号,材质,描述 if (TDbPipeSupport::QueryFitSpecInf(m_pPipeJig->GetAdoDb(), dDN, fitSpec, eTrade, sFitName, sProject, sLevel)) { //外径系列 pXDataMap->SetAt(PIPE_OD_SN, fitSpec.szODSN); pXDataMap->SetAt(PIPE_SHTNO, fitSpec.szShtNo); pXDataMap->SetAt(PIPE_STDNO, fitSpec.szStdNo); pXDataMap->SetAt(PIPE_MATERIAL, fitSpec.szMat); pXDataMap->SetAt(PIPE_DESCR, fitSpec.szDesc); } AcArray arInfs; pFitting->GetInterface(arInfs); double dPre = 1.0; pXDataMap->GetAt(PIPE_PRESSURE, dPre); for (int i = 0;i < arInfs.length();i++) { AecInterface &inf = arInfs.at(i); //管嘴 垫片 TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(),i, inf.dSize1, dPre, sProject, sLevel, pXDataMap); //管嘴 螺栓,螺母 TDbPipeSupport::SetBoltData(m_pPipeJig->GetAdoDb(),i, inf.dSize1, dPre, sProject, sLevel, pXDataMap); } } AcDbObjectId id = AcDbObjectId::kNull; if (bIsSureAdd2MSp) { //卡箍 if (nConnectType == 4 && eType != eFlange && eType != eWcap) { CString sSQL; AecInterface inf; for (int i = 0;i < pFitting->GetInterfaceCount();i++) { pFitting->GetInterface(i, inf); AddFlxJoin(pXDataMap, inf); } } id = CoreTools::AddToModelSpace(pFitting); } return id; } AcDbObjectId TDbPipeLine::AddFlxJoin(AecDbObjXDataMap *pXDataMap ,const AecInterface& inf) { CString sProject = _T("工业");; pXDataMap->GetAt(DOC_PROJECT, sProject); CString sLevel; pXDataMap->GetAt(PIPE_LEVEL, sLevel); double dDN = 0.0; pXDataMap->GetAt(PIPE_DN, dDN); double dPre = 1.6; pXDataMap->GetAt(PIPE_PRESSURE, dPre); CString sSQL; sSQL.Format(_T("select [尺寸A],[尺寸B],[尺寸C],[型号],[标准号] from AecFlxJoin where [公称直径]=%d and [压力]>%.3f and [压力]<%.3f"), (int)(inf.dSize1 + 0.5), dPre - 0.01, dPre + 0.01); CStringArray arVals; m_pPipeJig->GetAdoDb()->GetSelData(sSQL, arVals); if (arVals.GetSize() >= 5) { AecDbEwFitting *pFit = new AecDbEwFitting; SetFittingLayer(pFit, m_pPipeParam->szSys); AecDbObjXDataMap *pXD = pFit->GetSpecialtyData(); FillConfigXDataMap(pXD, m_pPipeParam); pXD->SetAt(KEY_RUNTIME, eFlxJoin); pXD->SetAt(KEY_MAJBR, inf.vtDir); pXD->SetAt(KEY_MID, inf.ptPos); pXD->SetAt(KEY_A, _ttof(arVals.GetAt(0))); pXD->SetAt(KEY_B, _ttof(arVals.GetAt(1))); pXD->SetAt(KEY_C, _ttof(arVals.GetAt(2))); pXD->SetAt(KEY_TYPE, arVals.GetAt(3)); pXD->SetAt(PIPE_STDNO, arVals.GetAt(4)); pXD->SetAt(PIPE_DN, inf.dSize1); return CoreTools::AddToModelSpace(pFit); } return AcDbObjectId::kNull; } static BOOL IsGSFMaterial(LPCTSTR pszMertial) { CString sMertial = pszMertial; //目前只能按照材质判断 if (sMertial.Find(_T("衬塑")) != -1 || sMertial.Find(_T("SRPE")) != -1 || sMertial.Find(_T("HG/T 20538")) != -1) { return TRUE; } return FALSE; } AcDbObjectId TDbPipeLine::AddPipeToModelSpace(AecDbEwPipe *pPipe) { AecDbObjXDataMap *pXDataMap = pPipe->GetSpecialtyData(); //法兰管截断为若干单根,保证后期出系统图正确显示法兰 int nConnectType = 0; pXDataMap->GetAt(PIPE_CONNECT, nConnectType); if (nConnectType == 3 || nConnectType == 5) { if (pPipe->GetFlangeCount(FALSE) > 2) { AcDbVoidPtrArray arPipes; pPipe->GetBreakFlangePipes(arPipes); AcDbObjectId id; AecDbEwPipe *pPipeT = NULL; for (int i = 0;i < arPipes.length();i++) { pPipeT = (AecDbEwPipe *)arPipes.at(i); id = AddPipeToModelSpace(pPipeT); } return id;//Last } } CString sProject = _T("工业");; pXDataMap->GetAt(DOC_PROJECT, sProject); CString sLevel; pXDataMap->GetAt(PIPE_LEVEL, sLevel); double dDN = 0.0; pXDataMap->GetAt(PIPE_DN, dDN); int nTrade = 0; pXDataMap->GetAt(DOC_TRADE, nTrade); //行业 WPipe::Trade eTrade = (WPipe::Trade)nTrade; WPipe::PIPESPEC pipeSpec; memset(&pipeSpec, 0, sizeof(WPipe::PIPESPEC)); //查询 外径系列,表号,标准号,材质,描述 if (TDbPipeSupport::QueryPipeSpecInf(m_pPipeJig->GetAdoDb(), dDN, pipeSpec, eTrade, sProject, sLevel)) { //外径系列 pXDataMap->SetAt(PIPE_OD_SN, pipeSpec.szODSN); pXDataMap->SetAt(PIPE_SHTNO, pipeSpec.szShtNo); pXDataMap->SetAt(PIPE_STDNO, pipeSpec.szStdNo); pXDataMap->SetAt(PIPE_MATERIAL, pipeSpec.szMat); pXDataMap->SetAt(PIPE_DESCR, pipeSpec.szDesc); } if (nConnectType == 3 || nConnectType == 5)//法兰管件 需要加 加垫片 和 螺栓 螺母 信息 { AcArray arInfs; pPipe->GetInterface(arInfs); double dPre = 1.0; pXDataMap->GetAt(PIPE_PRESSURE, dPre); for (int i = 0; i < arInfs.length(); i++) { AecInterface &inf = arInfs.at(i); //管嘴 垫片 TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(), i, inf.dSize1, dPre, sProject, sLevel, pXDataMap); //管嘴 螺栓,螺母 TDbPipeSupport::SetBoltData(m_pPipeJig->GetAdoDb(), i, inf.dSize1, dPre, sProject, sLevel, pXDataMap); } } AcDbObjectId id = CoreTools::AddToModelSpace(pPipe); return id; } //UPVC CPVC PVC-C PP-H (PE) HDPE bool TDbPipeLine::IsPlasticsMat(WPipe::PipeParam *pParam, CString &sODNo) { const CString sPlastic = _T("UPVC CPVC PVC-C PP-H (PE) PE100 HDPE"); sODNo = pParam->szODSn; CStringArray arTxts; SplitStrintToArray(sPlastic, arTxts, _T(' ')); CString sMat = pParam->szMertial; CString sMatFit = pParam->szMertialFit; CString sTxt; sMat.MakeUpper(); sMatFit.MakeUpper(); for (int i = 0; i < arTxts.GetSize(); i++) { sTxt = arTxts.GetAt(i); if (sMat.Find(sTxt) != -1 || sMatFit.Find(sTxt) != -1) { return true; } } return false; } BOOL TDbPipeLine::AddReducer(AECStatusRecord* pCurStaRec,WPipe::PipeParam* pParam) { AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); pXDataMap->SetAt(PIPE_INTERFACEL4,m_pPipeParam->m_dInterfaceL3);//记下可能法兰管分段长度 FillConfigXDataMap(pXDataMap,pParam); //查询设置项目等级 if (!QuerySetProjectLevel(pXDataMap, pParam,_T("变径"))) return FALSE; CString sProj = _T("工业");; pXDataMap->GetAt(DOC_PROJECT, sProj); CString sLevel; pXDataMap->GetAt(PIPE_LEVEL, sLevel); pXDataMap->SetAt(PIPE_CONNECT,pParam->m_nConnectType); if (pParam->m_nConnectType > 0) { double dFD = 0.0,dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eReduce,pParam->m_nConnectType, m_pPipeParam->m_dDN,dFD,dFL, sProj,sLevel); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); dFD = 0.0,dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eReduce,pParam->m_nConnectType, pParam->m_dDN,dFD,dFL,sProj,sLevel); pXDataMap->SetAt(PIPE_INTERFACED2,dFD); pXDataMap->SetAt(PIPE_INTERFACEL2,dFL); } pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); if (m_pPipeParam->m_app == WPipe::eDuct) pXDataMap->SetAt(KEY_RUNTIME, eDuctReduce); else if (m_pPipeParam->m_app == WPipe::eBridge) pXDataMap->SetAt(KEY_RUNTIME, eBridgeReduce); else pXDataMap->SetAt(KEY_RUNTIME, eReduce); AcGeVector3d vtDir = AcGeVector3d::kXAxis; AecInterface* pIntf = GetLastInterface(); if (pIntf != NULL) { vtDir = pIntf->vtDir; } AcGePoint3d ptSta = pIntf->ptPos; double dGast = 0.0; //上次是否是衬塑管 if (IsGSFMaterial(pParam->szMertial)) { dGast = GetLastInterface()->dGasket; dGast *= 0.5; } vtDir.normalize(); ptSta += vtDir * dGast; pXDataMap->SetAt(KEY_MAJBR,vtDir); pXDataMap->SetAt(KEY_START,ptSta); pXDataMap->SetAt(KEY_Length,pParam->m_dInterfaceL3); pXDataMap->SetAt(PIPE_DN,m_pPipeParam->m_dDN); pXDataMap->SetAt(PIPE_OD,m_pPipeParam->m_dOD); pXDataMap->SetAt(PIPE_EDN,pParam->m_dDN); pXDataMap->SetAt(PIPE_EOD,pParam->m_dOD); double dPre = pParam->m_dPress; pXDataMap->SetAt(PID_PIPE_DPRESS,dPre); CString sODNo = pParam->szODSn; if (IsPlasticsMat(pParam, sODNo)) { TDbPipeSupport::QueryPVCReducerData(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, pParam->m_dDN, pXDataMap, sODNo); } else { double dL = pParam->m_dInterfaceL3;//查询设置H,h1,h2 pXDataMap->SetAt(KEY_OFFSET, pParam->m_vtECCen); TDbPipeSupport::QueryReduceData(m_pPipeJig->GetAdoDb(), pParam->m_nConnectType, m_pPipeParam->m_dDN, pParam->m_dDN, dL, pXDataMap, sODNo); pXDataMap->SetAt(KEY_Length, dL); pParam->m_dInterfaceL3 = dL; } vtDir.normalize(); AcGePoint3d ptEnd = ptSta + pParam->m_dInterfaceL3 * vtDir; if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5)//法兰连接 { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),pParam->m_dDN,dPre,dWD,dWh,dThk,dN, sProj, sLevel); double dWD2 = 0.0,dWh2 = 0.0,dThk2 = 0.0,dN2 = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,dPre,dWD2,dWh2,dThk2,dN2, sProj, sLevel); //颈法兰焊接方式 //ptSta += dWh * vtDir; //颈法兰焊接方式 //ptSta += dWh * vtDir; if (sODNo.CompareNoCase(_T("S")) == 0 && sODNo.CompareNoCase(_T("GSF")) != 0) { //已经含有 (dWh + dWh) } else { ptEnd += (dWh + dWh) * vtDir; } pXDataMap->SetAt(KEY_START,ptSta); pXDataMap->SetAt(PIPE_WN,dN); pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WN2,dN2); pXDataMap->SetAt(PIPE_WH2, dWh2); //垫片 TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(), 0,m_pPipeParam->m_dDN, dPre, sProj, sLevel, pXDataMap); TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(), 1,pParam->m_dDN, dPre, sProj, sLevel, pXDataMap); //螺栓 TDbPipeSupport::SetBoltData(m_pPipeJig->GetAdoDb(), 0,m_pPipeParam->m_dDN, dPre, sProj, sLevel, pXDataMap); TDbPipeSupport::SetBoltData(m_pPipeJig->GetAdoDb(), 1,pParam->m_dDN, dPre, sProj, sLevel, pXDataMap); } //是否偏移 double dOffset = (pParam->m_dD - m_pPipeParam->m_dD) / 2.0; AcGeLine3d ln3d(AcGePoint3d::kOrigin,vtDir); AcGeVector3d vtDirXY,vcTemp; AcGeVector3d vtOffset = AcGeVector3d::kIdentity; if (!pParam->m_vtECCen.isZeroLength()) { if (pParam->m_vtECCen.isCodirectionalTo(AcGeVector3d::kYAxis)) //平管 向上,立管 向左 { if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//立管 { vtOffset = -AcGeVector3d::kXAxis; } else { if (ln3d.isParallelTo(AcGePlane::kXYPlane))//平管 { vtOffset = vtDir; vtOffset.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); } else//斜管 { vtDirXY = vtDir.orthoProject(AcGeVector3d::kZAxis); vtOffset = vtDirXY; vtOffset.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); } } } else if (pParam->m_vtECCen.isCodirectionalTo(-AcGeVector3d::kYAxis)) //平管 向下 立管 向右 { if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//立管 { vtOffset = AcGeVector3d::kXAxis; } else { if (ln3d.isParallelTo(AcGePlane::kXYPlane))//平管 { vtOffset = vtDir; vtOffset.rotateBy(-PI / 2.0,AcGeVector3d::kZAxis); } else//斜管 { vtDirXY = vtDir.orthoProject(AcGeVector3d::kZAxis); vtOffset = vtDirXY; vtOffset.rotateBy(-PI / 2.0,AcGeVector3d::kZAxis); } } } else if(pParam->m_vtECCen.isCodirectionalTo(AcGeVector3d::kZAxis)) //平管 前 立管 向前 { if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//立管 { vtOffset = AcGeVector3d::kYAxis; } else { if (ln3d.isParallelTo(AcGePlane::kXYPlane))//平管 { vtOffset = AcGeVector3d::kZAxis; } else//斜管 { vtOffset = AcGeVector3d::kZAxis.orthoProject(vtDir); } } } else if(pParam->m_vtECCen.isCodirectionalTo(-AcGeVector3d::kZAxis)) //平管 后 立管 向后 { if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//立管 { vtOffset = -AcGeVector3d::kYAxis; } else { if (ln3d.isParallelTo(AcGePlane::kXYPlane))//平管 { vtOffset = -AcGeVector3d::kZAxis; } else//斜管 { vtOffset = -AcGeVector3d::kZAxis.orthoProject(vtDir); } } } vtOffset.normalize(); vtOffset *= dOffset; } ptEnd += vtOffset; pXDataMap->SetAt(KEY_END,ptEnd); AcGeVector3d vtNorm = AcGeVector3d::kZAxis; AcGeLine3d line(ptSta,ptEnd); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtNorm = AcGeVector3d::kZAxis; } else if (AcGePlane::kYZPlane.isParallelTo(line)) { vtNorm = AcGeVector3d::kXAxis; } else if (AcGePlane::kZXPlane.isParallelTo(line)) { vtNorm = AcGeVector3d::kYAxis; } pXDataMap->SetAt(KEY_NORMAL,vtNorm); pXDataMap->SetAt(KEY_OFFSET,vtOffset); //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); setInfo2Ent(*pXDataMap); AecInterface intf; pFitting->GetInterface(1,intf); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,5); intf.idOwner = id; PushInterface(intf); //更改标高 //覆盖当前的param double dFD = 0.0; pXDataMap->GetAt(PIPE_INTERFACED2,dFD); PushPipeParam(); double dInterfaceL3 = m_pPipeParam->m_dInterfaceL3; memcpy(m_pPipeParam,pParam,sizeof(WPipe::PipeParam));//回退 m_pPipeParam->m_dInterfaceL3 = dInterfaceL3; m_pPipeParam->m_dEl = intf.ptPos.z; dFD = 0.0; double dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eElbow,pParam->m_nConnectType,pParam->m_dDN,dFD,dFL,sProj,sLevel); m_pPipeParam->m_dInterfaceD = dFD; m_pPipeParam->m_dInterfaceL = dFL; pParam->m_dInterfaceD = dFD; pParam->m_dInterfaceL = dFL; //创建余下管子,并插入虚拟状态记录 AECStatusRecord* pRecMid = new AECStatusRecord; pRecMid->CopyFrom(pCurStaRec); pRecMid->SetAcquirePoint(intf.ptPos); m_pPipeJig->PushBackStatusRec(pRecMid); pCurStaRec->SetAcquirePoint(intf.ptPos); return TRUE; } BOOL TDbPipeLine::AddReduceElbow(AECStatusRecord* pCurStaRec,WPipe::PipeParam* pParam,AcGeVector3d& vtMaj,AcGeVector3d& vtMin) { AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); pXDataMap->SetAt(PIPE_INTERFACEL4,m_pPipeParam->m_dInterfaceL3);//记下可能法兰管分段长度 FillConfigXDataMap(pXDataMap,pParam); pXDataMap->SetAt(KEY_RUNTIME, eReduceElbow); pXDataMap->SetAt(KEY_MAJBR,vtMaj); pXDataMap->SetAt(KEY_MINBR,vtMin); AecInterface* pIntf = GetLastInterface(); AcGePoint3d ptSta = pIntf->ptPos; CString sProj = _T("工业");; pXDataMap->GetAt(DOC_PROJECT, sProj); //如果是45度 double dSweep = vtMin.angleTo(vtMaj); if (dSweep - PI / 2.0 > 1.e-3) dSweep -= PI / 2.0; AcGePoint3d ptMid; double dA = m_pPipeParam->m_dRRatio * __max(m_pPipeParam->m_dDN, pParam->m_dDN); if (m_pPipeParam->m_dInterfaceL3 > 1.e-6) dA = m_pPipeParam->m_dInterfaceL3; //如果是45度且是衬塑 特殊处理 if (fabs(dSweep - 0.25 * PI) < 1.e-3)//45 { if (IsGSFMaterial(m_pPipeParam->szMertial)) { TDbPipeSupport::Query45ElbowL(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, pParam->m_dInterfaceL3, m_pPipeParam->m_dRRatio, m_pPipeParam->m_nConnectType, m_pPipeParam->szLevel, m_pPipeParam->szODSn, pXDataMap); pParam->m_dInterfaceL3 /= tan(PI / 8.0); pXDataMap->SetAt(KEY_Length, pParam->m_dInterfaceL3); double dAl = dA * tan(PI / 8.0); ptMid = ptSta + vtMaj * dAl;//vtMaj 向外 } } else { double dDNL = __max(m_pPipeParam->m_dDN, pParam->m_dDN); double dDNs = __min(m_pPipeParam->m_dDN, pParam->m_dDN); if (TDbPipeSupport::QueryRElbowL(m_pPipeJig->GetAdoDb(), dDNL, dDNs, pParam->m_dInterfaceL3, m_pPipeParam->m_dRRatio, m_pPipeParam->m_nConnectType, m_pPipeParam->szLevel, pXDataMap)) dA = pParam->m_dInterfaceL3; ptMid = ptSta + vtMaj * dA;//vtMaj 向外 } vtMaj.normalize();vtMin.normalize(); if (pParam->m_nConnectType > 0) { double dFD = 0.0, dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(), eReduce, pParam->m_nConnectType, m_pPipeParam->m_dDN, dFD, dFL, sProj, m_pPipeParam->szLevel); pXDataMap->SetAt(PIPE_INTERFACED, dFD); pXDataMap->SetAt(PIPE_INTERFACEL, dFL); dFD = 0.0, dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(), eReduce, pParam->m_nConnectType,pParam->m_dDN, dFD, dFL, sProj, m_pPipeParam->szLevel); pXDataMap->SetAt(PIPE_INTERFACED2, dFD); pXDataMap->SetAt(PIPE_INTERFACEL2, dFL); } if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5)//法兰连接 { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0, dWh = 0.0, dThk = 0.0, dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, m_pPipeParam->m_dPress, dWD, dWh, dThk, dN, sProj, m_pPipeParam->szLevel); double dWD2 = 0.0, dWh2 = 0.0, dThk2 = 0.0, dN2 = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(), pParam->m_dDN, pParam->m_dPress, dWD2, dWh2, dThk2, dN2, sProj, m_pPipeParam->szLevel); //颈法兰焊接方式 pXDataMap->SetAt(PIPE_WN, dN); pXDataMap->SetAt(PIPE_WN2, dN2); pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WH2, dWh2); //垫片 TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(), 0, m_pPipeParam->m_dDN, m_pPipeParam->m_dPress, sProj, m_pPipeParam->szLevel, pXDataMap); TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(), 1, pParam->m_dDN, pParam->m_dPress, sProj, pParam->szLevel, pXDataMap); //螺栓 TDbPipeSupport::SetBoltData(m_pPipeJig->GetAdoDb(), 0, m_pPipeParam->m_dDN, m_pPipeParam->m_dPress, sProj, m_pPipeParam->szLevel, pXDataMap); TDbPipeSupport::SetBoltData(m_pPipeJig->GetAdoDb(), 1, pParam->m_dDN, pParam->m_dPress, sProj, pParam->szLevel, pXDataMap); } pXDataMap->SetAt(KEY_MID,ptMid); pXDataMap->SetAt(PIPE_DN,m_pPipeParam->m_dDN); pXDataMap->SetAt(PIPE_OD,m_pPipeParam->m_dOD); pXDataMap->SetAt(PIPE_EDN,pParam->m_dDN); pXDataMap->SetAt(PIPE_EOD,pParam->m_dOD); pXDataMap->SetAt(KEY_Length, pParam->m_dInterfaceL3); pXDataMap->SetAt(PIPE_ELBOWANG,dSweep); pXDataMap->SetAt(KEY_RadRatio, pParam->m_nRadioOn); double dPre = pParam->m_dPress; pXDataMap->SetAt(PID_PIPE_DPRESS,dPre); pXDataMap->SetAt(PIPE_RATIO, m_pPipeParam->m_dRRatio); pXDataMap->SetAt(PIPE_THICK, m_pPipeParam->m_dThick); //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); setInfo2Ent(*pXDataMap); AecInterface intf; pFitting->GetInterface(1,intf); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,5); //创建余下管子,并插入虚拟状态记录 AECStatusRecord* pRecMid = new AECStatusRecord; pRecMid->CopyFrom(pCurStaRec); pRecMid->SetAcquirePoint(intf.ptPos); m_pPipeJig->PushBackStatusRec(pRecMid); pCurStaRec->SetAcquirePoint(intf.ptPos); return TRUE; } BOOL TDbPipeLine::ChangeEl(AECStatusRecord* pRec,double dNewEl,BOOL bCheckRec, double dRedElPos,WPipe::PipeParam* pParamred) { AcGeVector3d vtMaj,vtMin; AcGePoint3d ptMid,ptSta,ptEnd,ptGeT,ptLast; if (GetLastInterface() != NULL) { vtMaj = GetLastInterface()->vtDir; if (vtMaj.isParallelTo(AcGeVector3d::kZAxis))//上次是立管 { AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,GetLastInterface()->idOwner,AcDb::kForWrite)) { AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt); if (pPipe != NULL)//是管子 { //延长 ptEnd = pPipe->EndPoint(); ptSta = pPipe->StartPoint(); double dDis1 = fabs(dNewEl - ptSta.z); double dDis2 = fabs(dNewEl - ptEnd.z); //延长 if (dDis1 < dDis2)//sta { ptSta.z = dNewEl; pPipe->SetStartPoint(ptSta); } else//end { ptEnd.z = dNewEl; pPipe->SetEndPoint(ptEnd); } } AecDbEwFitting* pFitt = AecDbEwFitting::cast(pEnt); if (pFitt != NULL) { int nType = 0; pFitt->GetSpecialtyData()->GetAt(KEY_RUNTIME,nType); EFittingType eType = (EFittingType)nType; if (eType == eReduce) { //增加一段 WPipe::PipeParam* pParamNew = pFitt->GetPipeParam(1); if (pParamNew != NULL) { /*if (fabs(GetLastInterface()->dSize1 - pParamNew->m_dDN) > 1.e-2) { pParamNew->m_dD = GetLastInterface()->dSize1; pFitt->GetSpecialtyData()->GetAt(PIPE_TDN,pParamNew->m_dDN); pFitt->GetSpecialtyData()->GetAt(PIPE_OD,pParamNew->m_dOD); }*/ ptSta = GetLastInterface()->ptPos; ptEnd = ptSta; if (bCheckRec)//创建变径 { if ( fabs(dRedElPos - ptEnd.z) > 1.e-1) { ptEnd.z = dRedElPos; CreatePipe(ptSta,ptEnd,pParamNew); } AECStatusRecord rs; ptEnd.z = dRedElPos; rs.SetAcquirePoint(ptEnd); AddReducer(&rs,pParamred); ptSta = GetLastInterface()->ptPos; ptEnd = ptSta; ptEnd.z = dNewEl; CreatePipe(ptSta,ptEnd,pParamNew); double dInterfaceL3 = m_pPipeParam->m_dInterfaceL3; memcpy(m_pPipeParam,pParamNew,sizeof(WPipe::PipeParam)); m_pPipeParam->m_dEl = dNewEl; //继承法兰管分段 m_pPipeParam->m_dInterfaceL3 = dInterfaceL3; } else { ptEnd.z = dNewEl; CreatePipe(ptSta,ptEnd,pParamNew); memcpy(m_pPipeParam,pParamNew,sizeof(WPipe::PipeParam)); } } } } AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt); if (pEqu != NULL) { // 从 m_pPipeParam->m_dEl -- dNewEl创建立管 ptSta = GetLastInterface()->ptPos; ptEnd = ptSta; if (bCheckRec)//创建变径 { if ( fabs(dRedElPos - ptEnd.z) > 1.e-1) { ptEnd.z = dRedElPos; CreatePipe(ptSta,ptEnd,m_pPipeParam); } AECStatusRecord rs; ptEnd.z = dRedElPos; rs.SetAcquirePoint(ptEnd); AddReducer(&rs,pParamred); ptSta = GetLastInterface()->ptPos; ptEnd = ptSta; ptEnd.z = dNewEl; CreatePipe(ptSta,ptEnd,pParamred); double dInterfaceL3 = m_pPipeParam->m_dInterfaceL3; memcpy(m_pPipeParam,pParamred,sizeof(WPipe::PipeParam)); m_pPipeParam->m_dEl = dNewEl; //继承法兰管分段 m_pPipeParam->m_dInterfaceL3 = dInterfaceL3; } else { ptSta = GetLastInterface()->ptPos; ptEnd = ptSta; ptEnd.z = dNewEl; CreatePipe(ptSta,ptEnd,m_pPipeParam); } } pEnt->close(); } m_pPipeParam->m_dEl = dNewEl; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); return TRUE; } vtMaj.normalize(); vtMin = AcGeVector3d::kZAxis; if (dNewEl - m_pPipeParam->m_dEl < 1.e-3) { vtMin = -AcGeVector3d::kZAxis; } CString sODNo = _T("A"); //如果上段不是管子 AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,GetLastInterface()->idOwner,AcDb::kForWrite)) { AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt); if (pPipe == NULL)//不是管子 { ptMid = GetLastInterface()->ptPos; AecDbObjXDataMap xd; if (IsPlasticsMat(m_pPipeParam, sODNo)) { TDbPipeSupport::QueryPVCElbow(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, &xd, sODNo); double dL = 0; xd.GetAt(KEY_L, dL); ptMid += vtMaj * dL; } else { if (m_pPipeParam->m_nRadioOn) { ptMid += vtMaj * m_pPipeParam->m_dDN * m_pPipeParam->m_dRRatio; } else { double dLA = m_pPipeParam->m_dDN * m_pPipeParam->m_dRRatio; xd.SetAt(KEY_RadRatio, m_pPipeParam->m_nRadioOn); double dAng = 90.0; dAng = vtMin.angleTo(vtMaj); if (dAng - PI / 2.0 > 1.e-3) dAng -= PI / 2.0; xd.SetAt(PIPE_ELBOWANG, dAng); TDbPipeSupport::QueryElbowL(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, dLA, m_pPipeParam->m_dRRatio, m_pPipeParam->m_nConnectType, m_pPipeParam->szLevel,&xd); double dF = 0.0, dR = 0; xd.GetAt(_T("F"), dF); xd.GetAt(_T("R"), dR); if (dR > 1.e-3 && dF > 0) { ptMid += vtMaj * (dR + dF); } else { ptMid += vtMaj * dLA; } } } } else//改短上次管子 { ptLast = GetLastInterface()->ptPos; double dThk = 0.0, dWh = 0.0; if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5)//如果法兰管弯头 { if (!vtMaj.isParallelTo(vtMin))//后续创建弯头 { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); } //如果法兰管弯头 //则上次管子继续改短一个法兰高度 } if (ptLast.distanceTo(pPipe->EndPoint()) < 1.e-3) { ptEnd = pPipe->EndPoint(); ptMid = ptEnd; AecDbObjXDataMap xd; if (IsPlasticsMat(m_pPipeParam, sODNo)) { TDbPipeSupport::QueryPVCElbow(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, &xd, sODNo); double dL = 0; xd.GetAt(KEY_L, dL); ptEnd -= vtMaj * dL; } else { if (vtMaj.isPerpendicularTo(vtMin)) { if (m_pPipeParam->m_nRadioOn) { double dLA = m_pPipeParam->m_dDN * m_pPipeParam->m_dRRatio; xd.SetAt(KEY_RadRatio, m_pPipeParam->m_nRadioOn); double dAng = 90.0; dAng = vtMin.angleTo(vtMaj); if (dAng - PI / 2.0 > 1.e-3) dAng -= PI / 2.0; TDbPipeSupport::QueryElbowL(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, dLA, m_pPipeParam->m_dRRatio, m_pPipeParam->m_nConnectType, m_pPipeParam->szLevel,&xd); double dF = 0.0, dR = 0; xd.GetAt(_T("F"), dF); xd.GetAt(_T("R"), dR); if (dR > 1.e-3 && dF > 0) { if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { ptEnd -= vtMaj * dLA; } else { ptEnd -= vtMaj * (dR + dF); } } else { if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { ptEnd -= vtMaj * (dLA + dWh); } else { ptEnd -= vtMaj * dLA; } } } else { double dLA = m_pPipeParam->m_dDN * m_pPipeParam->m_dRRatio; if (_tcscmp(m_pPipeParam->szODSn, _T("S")) == 0 || _tcscmp(m_pPipeParam->szODSn, _T("GSF")) == 0) ptEnd -= vtMaj * (dLA + dWh); else ptEnd -= vtMaj * dLA; } } else { double dSweepAngle = vtMin.angleTo(vtMaj); AcGePoint3d ptFr; AcDbArc *pArcElbow = KTCADUtilityEx::FormatArc(vtMaj, vtMin, ptMid, ptFr, dSweepAngle, m_pPipeParam->m_dD, m_pPipeParam->m_dRRatio); if (pArcElbow != NULL)//可以合成ARC { double dS = 0.0, dE = 0.0; pArcElbow->getStartParam(dS); pArcElbow->getEndParam(dE); AcGeVector3d vtS, vtE; pArcElbow->getFirstDeriv(dS, vtS); pArcElbow->getFirstDeriv(dE, vtE); if (vtS.isParallelTo(vtMaj)) { pArcElbow->getStartPoint(ptEnd); } else { pArcElbow->getEndPoint(ptEnd); } delete pArcElbow; } else { acutPrintf(_T("\nFormatArc error! create elbow failed!")); } } ptGeT = pPipe->EndPoint(); } pPipe->SetEndPoint(ptEnd); } else { vtMaj = pPipe->StartPoint() - pPipe->EndPoint(); vtMaj.normalize(); ptSta = pPipe->StartPoint(); ptMid = ptSta; AecDbObjXDataMap xd; if (IsPlasticsMat(m_pPipeParam, sODNo)) { TDbPipeSupport::QueryPVCElbow(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, &xd, sODNo); double dL = 0; xd.GetAt(KEY_L, dL); ptSta -= vtMaj * dL; } else { if (vtMaj.isPerpendicularTo(vtMin)) { if (m_pPipeParam->m_nRadioOn) { double dLA = (m_pPipeParam->m_dDN * m_pPipeParam->m_dRRatio + dWh); xd.SetAt(KEY_RadRatio, m_pPipeParam->m_nRadioOn); double dAng = 90.0; dAng = vtMin.angleTo(vtMaj); if (dAng - PI / 2.0 > 1.e-3) dAng -= PI / 2.0; TDbPipeSupport::QueryElbowL(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, dLA, m_pPipeParam->m_dRRatio, m_pPipeParam->m_nConnectType, m_pPipeParam->szLevel,&xd); double dF = 0.0, dR = 0; xd.GetAt(_T("F"), dF); xd.GetAt(_T("R"), dR); if (dR > 1.e-3 && dF > 0) { if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { ptSta -= vtMaj * dLA; } else { ptSta -= vtMaj * (dR + dF); } } else { if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { ptSta -= vtMaj * (dLA+ dWh); } else { ptSta -= vtMaj * dLA; } } } else { double dLA = (m_pPipeParam->m_dDN * m_pPipeParam->m_dRRatio + dWh); if (_tcscmp(m_pPipeParam->szODSn, _T("S")) == 0 || _tcscmp(m_pPipeParam->szODSn, _T("GSF")) == 0) ptSta -= vtMaj * (dLA + dWh); else ptSta -= vtMaj * dLA; } } else { double dSweepAngle = vtMin.angleTo(vtMaj); AcGePoint3d ptFr; AcDbArc *pArcElbow = KTCADUtilityEx::FormatArc(vtMaj, vtMin, ptMid, ptFr, dSweepAngle, m_pPipeParam->m_dD, m_pPipeParam->m_dRRatio); if (pArcElbow != NULL)//可以合成ARC { double dS = 0.0, dE = 0.0; pArcElbow->getStartParam(dS); pArcElbow->getEndParam(dE); AcGeVector3d vtS, vtE; pArcElbow->getFirstDeriv(dS, vtS); pArcElbow->getFirstDeriv(dE, vtE); if (vtS.isParallelTo(vtMaj)) { pArcElbow->getStartPoint(ptSta); } else { pArcElbow->getEndPoint(ptSta); } delete pArcElbow; } else { acutPrintf(_T("\nFormatArc error! create elbow failed!")); } } ptGeT = pPipe->StartPoint(); } pPipe->SetStartPoint(ptSta); } } pEnt->close(); } //压入当前param PushPipeParam(); //1. 如果方向不同创建弯头 if (!vtMaj.isParallelTo(vtMin)) { CreateElbow(vtMaj,ptMid,vtMin,m_pPipeParam); } //2. 创建立管 if (bCheckRec) { AecInterface inf = m_arHistoryIntfs[m_arHistoryIntfs.GetSize() - 1]; ptSta = inf.ptPos; //3.创建立管 ptEnd = ptSta; ptEnd.z = dRedElPos; CreatePipe(ptSta,ptEnd,m_pPipeParam); //4.创建变径 AECStatusRecord rs; rs.SetAcquirePoint(ptEnd); AddReducer(&rs,pParamred); //5. 余下部份创建立管 int nDir = ( dNewEl - m_pPipeParam->m_dEl > 1.e-6) ? 1 : -1; //ptEnd += nDir * AcGeVector3d::kZAxis * pParamred->m_dInterfaceL3; ptEnd = GetLastInterface()->ptPos; if ( nDir == 1 && fabs(ptEnd.z - dNewEl) > 1.e-3) { ptSta = ptEnd; ptEnd.z = dNewEl; if (ptSta.distanceTo(ptEnd) > 1.e-3) CreatePipe(ptSta,ptEnd,pParamred); double dInterfaceL3 = m_pPipeParam->m_dInterfaceL3; memcpy(m_pPipeParam,pParamred,sizeof(WPipe::PipeParam)); m_pPipeParam->m_dEl = dNewEl; //继承法兰管分段 m_pPipeParam->m_dInterfaceL3 = dInterfaceL3; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); } if (nDir == -1 && fabs(ptEnd.z - dNewEl) > 1.e-3) { ptSta = ptEnd; ptEnd.z = dNewEl; CreatePipe(ptSta,ptEnd,pParamred); double dInterfaceL3 = m_pPipeParam->m_dInterfaceL3; memcpy(m_pPipeParam,pParamred,sizeof(WPipe::PipeParam)); m_pPipeParam->m_dEl = dNewEl; //继承法兰管分段 m_pPipeParam->m_dInterfaceL3 = dInterfaceL3; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); } } else { //4. 创建管子 AecInterface intf; intf = m_arHistoryIntfs[m_arHistoryIntfs.GetSize() - 1]; ptSta = intf.ptPos; ptEnd = ptSta; ptEnd.z = dNewEl; CreatePipe(ptSta,ptEnd,m_pPipeParam); memcpy(m_pPipeParam,pParamred,sizeof(WPipe::PipeParam)); m_pPipeParam->m_dEl = dNewEl; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); } } return TRUE; } BOOL TDbPipeLine::ChangeEl2(AECStatusRecord* pRec,AECStatusRecord* pRecLast,double dNewEl,BOOL bCheckRec, double dRedElPos,WPipe::PipeParam* pParamred) { 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_EWPIPE")); 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); WPipe::PipeParam wparamMain; memcpy(&wparamMain,m_pPipeParam,sizeof(WPipe::PipeParam)); 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) ) { AecDbEwPipe* pWPipe = AecDbEwPipe::cast(pEnt); if (pWPipe != NULL) { AecDbObjXDataMap* pXDataMap = pWPipe->GetSpecialtyData(AcDb::kForRead); TDbPipeSupport::XData2PipeParam(&wparamMain,pXDataMap); 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.m_dDN - m_pPipeParam->m_dDN) > -1.e-6) //可能的创建三通,否则只创建立管 { bCreateTee = true; } //创建立管 AcGePoint3d ptSta,ptEnd; ptSta = pRec->GetAcquirePoint(); if (bCreateTee) { AcGeVector3d vtMin = AcGeVector3d::kZAxis; if (dNewEl - ptSta.z < 1.e-3) { vtMin = -AcGeVector3d::kZAxis; } AcGePoint3d ptMid = pRec->GetAcquirePoint(); double dL = 0.0,dB = 0.0; TDbPipeSupport::QueryTeeData(m_pPipeJig->GetAdoDb(),wparamMain.m_dDN,m_pPipeParam->m_dDN,dL,dB); if (m_pPipeParam->m_dInterfaceL > 1.e-3)//法兰管 { dL += m_pPipeParam->m_dInterfaceL; dB += m_pPipeParam->m_dInterfaceL; if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5)//法兰连接 { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,1.0,dWD,dWh,dThk,dN); //颈法兰焊接方式 dL -= m_pPipeParam->m_dInterfaceL; dB -= m_pPipeParam->m_dInterfaceL; //颈法兰焊接方式 CString sDNo = m_pPipeParam->szODSn; if (sDNo.CompareNoCase(_T("S")) != 0 && sDNo.CompareNoCase(_T("GSF")) != 0) { dL += dWh; dB += dWh; } } } //创建三通 AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) { AecDbEwPipe* pWPipe = AecDbEwPipe::cast(pEnt); if (pWPipe != NULL) { //对方断为两个管子 SplitWPipe(ptMid,dL,pWPipe); AddTee(pWPipe,dL,ptMid,dB,vtMin, &wparamMain); ptSta += vtMin * dB; } pEnt->close(); } } //3.创建立管 ptEnd = ptSta; //4.创建变径 if (bCheckRec) { ptEnd.z = dRedElPos; CreatePipe(ptSta,ptEnd,m_pPipeParam); AECStatusRecord rs; rs.SetAcquirePoint(ptEnd); AddReducer(&rs,pParamred); //5. 余下部份创建立管 int nDir = ( dNewEl - m_pPipeParam->m_dEl > 1.e-6) ? 1 : -1; //ptEnd += nDir * AcGeVector3d::kZAxis * pParamred->m_dInterfaceL3; ptEnd = GetLastInterface()->ptPos; if ( nDir == 1 && ptEnd.z < dNewEl) { ptSta = ptEnd; ptEnd.z = dNewEl; CreatePipe(ptSta,ptEnd,pParamred); double dInterfaceL3 = m_pPipeParam->m_dInterfaceL3; memcpy(m_pPipeParam,pParamred,sizeof(WPipe::PipeParam)); m_pPipeParam->m_dEl = dNewEl; m_pPipeParam->m_dInterfaceL3 = dInterfaceL3; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); } if (nDir == -1 && ptEnd.z > dNewEl) { ptSta = ptEnd; ptEnd.z = dNewEl; CreatePipe(ptSta,ptEnd,pParamred); double dInterfaceL3 = m_pPipeParam->m_dInterfaceL3; memcpy(m_pPipeParam,pParamred,sizeof(WPipe::PipeParam)); m_pPipeParam->m_dEl = dNewEl; m_pPipeParam->m_dInterfaceL3 = dInterfaceL3; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); } } else { //4. 创建管子 ptEnd.z = dNewEl; memcpy(m_pPipeParam,pParamred,sizeof(WPipe::PipeParam)); CreatePipe(ptSta,ptEnd,m_pPipeParam); m_pPipeParam->m_dEl = dNewEl; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); } return TRUE; } BOOL TDbPipeLine::ChangeEl3(AECStatusRecord* pRec,AcGePoint3d& ptThis) { double dNewEl = ptThis.z; AcGeVector3d vtMaj,vtMin; if (GetLastInterface() != NULL) { vtMaj = GetLastInterface()->vtDir; vtMaj.normalize(); vtMin = ptThis - GetLastInterface()->ptPos; vtMaj.normalize(); vtMin.normalize(); AcGeVector3d vtMajN = vtMaj; vtMajN.negate(); AcGeVector3d vtHalf = vtMin + vtMajN; vtHalf.normalize(); double dA = vtHalf.angleTo(vtMaj); if ( (dA - PI / 2.0 ) > 1.e-10) { dA = PI - dA; } double dR = m_pPipeParam->m_dDN * m_pPipeParam->m_dRRatio; double dX = dR / tan(dA); AcGePoint3d ptMid,ptSta,ptEnd,ptGeT,ptLast; //如果上段不是管子 AcDbObjectId idLast = GetLastInterface()->idOwner; AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idLast,AcDb::kForWrite)) { AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt); if (pPipe == NULL)//不是管子 { ptMid = GetLastInterface()->ptPos; ptMid += vtMaj * dX; } else//改短上次管子 { ptLast = GetLastInterface()->ptPos; if (ptLast.distanceTo(pPipe->EndPoint()) < 1.e-3) { ptEnd = pPipe->EndPoint(); ptMid = ptEnd; ptEnd -= vtMaj * dX; ptGeT = pPipe->EndPoint(); pPipe->SetEndPoint(ptEnd); ptLast = ptEnd; } else { vtMaj = pPipe->StartPoint() - pPipe->EndPoint(); vtMaj.normalize(); ptSta = pPipe->StartPoint(); ptMid = ptSta; ptSta -= vtMaj * dX; ptGeT = pPipe->StartPoint(); pPipe->SetStartPoint(ptSta); ptLast = ptSta; } } pEnt->close(); } //压入当前param PushPipeParam(); //1. 如果方向不同创建弯头 if (!vtMaj.isParallelTo(vtMin)) { CreateElbow(vtMaj,ptMid,vtMin,m_pPipeParam); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5)//法兰管 { //再次调整管线末端,一个法兰厚度 if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idLast,AcDb::kForWrite)) { AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt); if (pPipe != NULL) { if (ptLast.distanceTo(pPipe->EndPoint()) < 1.e-3) { ptEnd = pPipe->EndPoint(); ptEnd -= vtMaj * m_pPipeParam->m_dWh; pPipe->SetEndPoint(ptEnd); } else { ptSta = pPipe->StartPoint(); ptSta -= vtMaj * m_pPipeParam->m_dWh; pPipe->SetStartPoint(ptSta); } } pEnt->close(); } } } //2. 创建斜管 AecInterface intf; intf = m_arHistoryIntfs[m_arHistoryIntfs.GetSize() - 1]; ptSta = intf.ptPos; ptEnd = ptThis; CreatePipe(ptSta,ptEnd,m_pPipeParam); m_pPipeParam->m_dEl = dNewEl; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); return TRUE; } else//没有,创建一段斜管 { if (pRec != NULL) { AECStatusRecord* pLast = m_pPipeJig->GetTailStatusRec(); if (pLast != NULL) { AcGePoint3d ptSta = pLast->GetAcquirePoint(); AcGePoint3d ptEnd = ptThis; CreatePipe(ptSta,ptEnd,m_pPipeParam); m_pPipeParam->m_dEl = dNewEl; //调整本次状态点 pRec->SetAcquirePoint(ptEnd); return TRUE; } } } return FALSE; } BOOL TDbPipeLine::CreateWPipe(AECStatusRecord* pRec,BOOL bMaybeAddTee) { AcGePoint3d ptGe,ptGe1; AecDbEwPipe* pWpipe = new AecDbEwPipe; AecDbObjXDataMap* pXDataMap = pWpipe->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); // 根据 管线系统 设置相关信息 AcDbObjectId innLy = CoreTools::getLyByPipeSys(m_pPipeParam->szSys, true); AcDbObjectId outLy = CoreTools::getLyByPipeSys(m_pPipeParam->szSys, false); // 管线实体的图层 SetPipeLayer(pWpipe, m_pPipeParam->szSys); if (getEApp() == WPipe::eDuct || getEApp() == WPipe::eBridge) pWpipe->SetSection(m_pPipeParam->m_dW, m_pPipeParam->m_dH, m_pPipeParam->m_dThick); else pWpipe->SetSection(m_pPipeParam->m_dD, m_pPipeParam->m_dThick); 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 pWpipe->SetStartPoint( ptGe ); pWpipe->SetEndPoint( ptGe1 ); AcGeVector3d vtDir = ptGe1 - ptGe; AecInterface intf; pWpipe->GetInterface(1, intf); //pWpipe->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddPipeToModelSpace(pWpipe); AddUserData(id,pXDataMap,0); //记录接口到历史记录 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 TDbPipeLine::CreatePipe(AcGePoint3d ptSta,AcGePoint3d ptEnd,WPipe::PipeParam* pPipeParam) { AecDbEwPipe* pWpipe = new AecDbEwPipe; AecDbObjXDataMap* pXDataMap = pWpipe->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); if (getEApp() == WPipe::eDuct || getEApp() == WPipe::eBridge) pWpipe->SetSection(pPipeParam->m_dW, pPipeParam->m_dH, pPipeParam->m_dThick); else pWpipe->SetSection(pPipeParam->m_dD, pPipeParam->m_dThick); pXDataMap->SetAt(KEY_RUNTIME, ePipe); //设置图层 SetPipeLayer(pWpipe, m_pPipeParam->szSys); pWpipe->SetStartPoint( ptSta ); pWpipe->SetEndPoint( ptEnd ); if ( fabs(ptSta.z - ptEnd.z) > 1.e-6) { pWpipe->GetSpecialtyData()->SetAt(KEY_DRAWGRAD,TRUE); } AecInterface intf; pWpipe->GetInterface(1, intf); //pWpipe->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddPipeToModelSpace(pWpipe); AddUserData(id,pXDataMap,0); AcGeVector3d vtDir = ptEnd - ptSta; vtDir.normalize(); //记录接口到历史记录 intf.ptPos = ptEnd; intf.vtDir = vtDir; intf.idOwner = id; PushInterface(intf); return TRUE; } BOOL TDbPipeLine::CreatePipe(AcDbCurve *pCrv, WPipe::PipeParam *pPipeParam) { if (pCrv == NULL) return FALSE; AecDbEwPipe *pWpipe = new AecDbEwPipe; AecDbObjXDataMap *pXDataMap = pWpipe->GetSpecialtyData(); FillConfigXDataMap(pXDataMap, m_pPipeParam); if (getEApp() == WPipe::eDuct || getEApp() == WPipe::eBridge) pWpipe->SetSection(pPipeParam->m_dW, pPipeParam->m_dH, pPipeParam->m_dThick); else pWpipe->SetSection(pPipeParam->m_dD, pPipeParam->m_dThick); pXDataMap->SetAt(KEY_RUNTIME, ePipe); AcDbObjectId innLy = CoreTools::getLyByPipeSys(m_pPipeParam->szSys, true); AcDbObjectId outLy = CoreTools::getLyByPipeSys(m_pPipeParam->szSys, false); pWpipe->GetSpecialtyData(AcDb::kForWrite)->SetAt(PIPE_LINELAYER, innLy); pWpipe->GetSpecialtyData(AcDb::kForWrite)->SetAt(PIPE_LINELAYER, outLy); //设置图层 AcDbObjectId idCenLay, idOutLay, idSingle, idDash, idCen; idCenLay = innLy; idOutLay = outLy; idSingle = innLy; pXDataMap->SetAt(PIPE_CENTLAY, idCenLay); pXDataMap->SetAt(PIPE_OUTDLAY, idOutLay); pXDataMap->SetAt(PIPE_SINGLAY, idSingle); // 管线实体的图层 SetPipeLayer(pWpipe, m_pPipeParam->szSys); //pWpipe->SetStartPoint(ptSta); //pWpipe->SetEndPoint(ptEnd); pWpipe->SetBaseCurve(pCrv); //if (fabs(ptSta.z - ptEnd.z) > 1.e-6) //{ // pWpipe->GetSpecialtyData()->SetAt(KEY_DRAWGRAD, TRUE); //} AecInterface intf; pWpipe->GetInterface(1, intf); //pWpipe->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddPipeToModelSpace(pWpipe); AddUserData(id, pXDataMap, 0); AcGeVector3d vtDir; double dS = 0; pCrv->getStartParam(dS); pCrv->getFirstDeriv(dS, vtDir); vtDir.normalize(); AcGePoint3d ptEnd; pCrv->getEndPoint(ptEnd); //记录接口到历史记录 intf.ptPos = ptEnd; intf.vtDir = vtDir; intf.idOwner = id; PushInterface(intf); return TRUE; } BOOL TDbPipeLine::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)) { AecDbEwPipe* pDbWpipe = AecDbEwPipe::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()); } //先关闭 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; } AecDbEwFitting* pDbFit = AecDbEwFitting::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 度 { //获取另一方向 double dDn = 100.0; AcGeVector3d vt1,vt2; pXDataMap->GetAt(KEY_MAJBR,vt1); pXDataMap->GetAt(KEY_MINBR,vt2); pXDataMap->GetAt(PIPE_DN,dDn); 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 TDbPipeLine::CreateElbowAndPipe(AECStatusRecord* pRec, const EFittingType &type) { int nLen = m_arHistoryIntfs.GetSize(); if (nLen == 0) return FALSE; AecInterface intf; intf = m_arHistoryIntfs[nLen - 1]; AcDbObjectId id = intf.idOwner; AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); CString sODNo = m_pPipeParam->szODSn; IsPlasticsMat(m_pPipeParam, sODNo); pXDataMap->SetAt(PIPE_CONNECT,m_pPipeParam->m_nConnectType); if (m_pPipeParam->m_nConnectType > 0) { double dFD = 0.0,dFL = 0.0; int nConnType = m_pPipeParam->m_nConnectType; if (nConnType == 4) // 卡箍数据与承插一致 nConnType = 1; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eElbow,nConnType,m_pPipeParam->m_dDN,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); m_pPipeParam->m_dWh = dWh; pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WN,dN); } } pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); if (getEApp() == WPipe::eDuct) pXDataMap->SetAt(KEY_RUNTIME, eDuctElbow); else if(getEApp() == WPipe::eBridge) pXDataMap->SetAt(KEY_RUNTIME, eBridgeElbow); else pXDataMap->SetAt(KEY_RUNTIME, eElbow); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); if (getEApp() == WPipe::eDuct || getEApp() == WPipe::eBridge) { pXDataMap->SetAt(DUCT_W, m_pPipeParam->m_dW); pXDataMap->SetAt(DUCT_H, m_pPipeParam->m_dH); pXDataMap->SetAt(DUCT_THICK, m_pPipeParam->m_dThick); pXDataMap->SetAt(DUCT_W2, m_pPipeParam->m_dW); pXDataMap->SetAt(DUCT_H2, m_pPipeParam->m_dH); pXDataMap->SetAt(DUCT_THICK2, m_pPipeParam->m_dThick); } AcGePoint3d ptCur = pRec->GetAcquirePoint(); AcGePoint3d ptGeM = m_pPipeJig->GetTailStatusRec()->GetAcquirePoint(); AcGeVector3d vtMaj,vtMin; vtMaj = intf.vtDir; vtMin = ptCur - ptGeM; pXDataMap->SetAt(KEY_MAJBR,vtMaj); pXDataMap->SetAt(KEY_MINBR,vtMin); pXDataMap->SetAt(KEY_MID,ptGeM); //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); double dAng = 90.0; dAng = vtMin.angleTo(vtMaj); if (dAng - PI / 2.0 > 1.e-3) dAng -= PI / 2.0; //dAng *= 180 / PI; pXDataMap->SetAt(PIPE_RATIO,m_pPipeParam->m_dRRatio); pXDataMap->SetAt(PIPE_ELBOWANG,dAng); //角度 //pFitting->ReCreateByXDataMap(); //查询设置项目等级 if (!QuerySetProjectLevel(pXDataMap, m_pPipeParam, _T("弯头"))) return FALSE; double dL = 0.0; if (IsPlasticsMat(m_pPipeParam, sODNo)) { TDbPipeSupport::QueryPVCElbow(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, pXDataMap, sODNo); } else { TDbPipeSupport::QueryElbowL(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, dL, m_pPipeParam->m_dRRatio, m_pPipeParam->m_nConnectType, m_pPipeParam->szLevel,pXDataMap); pXDataMap->SetAt(KEY_Length, dL); } //改变上次intf 的末端点 AecInterface intf0,intf1; pFitting->GetInterface(0,intf0); pFitting->GetInterface(1,intf1); AcGeVector3d vtMove = vtMaj; vtMove.normalize(); AcGePoint3d ptGeT; AcGeVector3d vtPipe(0,0,0); AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { // 如果上次是管子,则改变上次管子的终点 AecDbEwPipe* pWPipe = AecDbEwPipe::cast(pEnt); if (pWPipe != NULL) { 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); } } } AecDbEwFitting* pDbFit = AecDbEwFitting::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); //pFitting->ReCreateByXDataMap(); pFitting->GetInterface(0,intf0); pFitting->GetInterface(1,intf1); } pEnt->close(); } //添加本次到数据库 dAng *= 180.0; dAng /= PI; bool bFittingAdded = false; if (dAng - 1.0 > 1.e-3) { AcArray arInfs; pFitting->GetInterface(arInfs); AddUserData(pFitting,pXDataMap,1,&arInfs); setInfo2Ent(*pXDataMap); id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,1); bFittingAdded = true; //绘制立管参考,建立关系, if (vtPipe.isParallelTo(AcGeVector3d::kZAxis)) { if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { // 如果上次是管子,则改变上次管子的终点 AecDbEwPipe* pWPipe = AecDbEwPipe::cast(pEnt); if (pWPipe != NULL) { TCHAR szHandle[33]; memset(szHandle,0,sizeof(TCHAR) * 33); id.handle().getIntoAsciiBuffer(szHandle); pWPipe->GetSpecialtyData()->SetAt(PIPE_CONNECT,szHandle); } pEnt->close(); } } } //创建余下的管子 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); if ( !bFittingAdded ) { delete pFitting; } return TRUE; } AcDbObjectId TDbPipeLine::CreateElbow(AcGeVector3d vtMaj ,AcGePoint3d ptMid ,AcGeVector3d vtMin ,WPipe::PipeParam* pparam ,BOOL bInsertBeforLast) { if (pparam == NULL) pparam = m_pPipeParam; AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap, pparam); CString sODNo = m_pPipeParam->szODSn; IsPlasticsMat(m_pPipeParam, sODNo); CString sProj = _T("工业");; pXDataMap->GetAt(DOC_PROJECT, sProj); CString sLevel; pXDataMap->GetAt(PIPE_LEVEL, sLevel); if (pparam->m_nConnectType > 0) { double dFD = 0.0, dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(), eElbow, pparam->m_nConnectType, pparam->m_dDN, dFD, dFL, sProj,pparam->szLevel); pparam->m_dInterfaceD = dFD; pparam->m_dInterfaceL = dFL; if (pparam->m_nConnectType == 3 || pparam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0, dWh = 0.0, dThk = 0.0, dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, m_pPipeParam->m_dPress, dWD, dWh, dThk, dN, sProj, pparam->szLevel); pparam->m_dWh = dWh; pparam->m_dWn = dN; } } pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); if (pparam->m_app == WPipe::eDuct) pXDataMap->SetAt(KEY_RUNTIME,eDuctElbow); else if (pparam->m_app == WPipe::eBridge) pXDataMap->SetAt(KEY_RUNTIME,eBridgeElbow); else pXDataMap->SetAt(KEY_RUNTIME,eElbow); if (pparam->m_app == WPipe::eDuct || pparam->m_app == WPipe::eBridge) { pXDataMap->SetAt(DUCT_W, pparam->m_dW); pXDataMap->SetAt(DUCT_H, pparam->m_dH); pXDataMap->SetAt(DUCT_THICK, pparam->m_dThick); pXDataMap->SetAt(DUCT_W2, pparam->m_dW); pXDataMap->SetAt(DUCT_H2, pparam->m_dH); pXDataMap->SetAt(DUCT_THICK2, pparam->m_dThick); } pXDataMap->SetAt(PIPE_WH,pparam->m_dWh); pXDataMap->SetAt(PIPE_WN,pparam->m_dWn); pXDataMap->SetAt(KEY_MAJBR,vtMaj); pXDataMap->SetAt(KEY_MINBR,vtMin); pXDataMap->SetAt(KEY_MID,ptMid); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); pXDataMap->SetAt(KEY_2DSTYLE, PipelineTools::isDoubleLine(m_pPipeParam->m_dDN) ? 2 : 1); //结构长度 double dL = 0.0; TDbPipeSupport::QueryElbowL(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, dL, m_pPipeParam->m_dRRatio, m_pPipeParam->m_nConnectType, m_pPipeParam->szLevel,pXDataMap); pXDataMap->SetAt(KEY_Length, dL); if (IsPlasticsMat(pparam, sODNo)) { TDbPipeSupport::QueryPVCElbow(m_pPipeJig->GetAdoDb(), pparam->m_dDN, pXDataMap, sODNo); } //查询设置项目等级 if (!QuerySetProjectLevel(pXDataMap, pparam, _T("弯头"))) return FALSE; dL = 0.0; if (IsPlasticsMat(m_pPipeParam, sODNo)) { TDbPipeSupport::QueryPVCElbow(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, pXDataMap, sODNo); } else { TDbPipeSupport::QueryElbowL(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, dL, m_pPipeParam->m_dRRatio, m_pPipeParam->m_nConnectType, m_pPipeParam->szLevel,pXDataMap); } pXDataMap->SetAt(KEY_Length, dL); if (pparam->m_nConnectType == 3 || pparam->m_nConnectType == 5) { //垫片 TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(),0, m_pPipeParam->m_dDN, m_pPipeParam->m_dPress, sProj, sLevel, pXDataMap); //螺栓 TDbPipeSupport::SetBoltData(m_pPipeJig->GetAdoDb(), 0,m_pPipeParam->m_dDN, m_pPipeParam->m_dPress, sProj, sLevel, pXDataMap); } //设置图层 SetFittingLayer(pFitting, pparam->szSys); double dAng = PI / 2.0; dAng = vtMin.angleTo(vtMaj); if (dAng - PI / 2.0 > 1.e-3) dAng -= PI / 2.0; pXDataMap->SetAt(PIPE_RATIO, pparam->m_dRRatio); pXDataMap->SetAt(PIPE_ELBOWANG,dAng); //角度 //pFitting->ReCreateByXDataMap(); AecInterface intf0,intf1; pFitting->GetInterface(0,intf0); pFitting->GetInterface(1,intf1); m_intf0 = intf0; m_intf1 = intf1; //pFitting->ReCreateByXDataMap(); //添加本次到数据库 //至少弯头的角度>1度,否则不加 dAng *= 180.0; dAng /= PI; AcDbObjectId id; bool bFittingAdded = false; if (dAng - 1.0 > 1.e-3) { AcArray arInfs; pFitting->GetInterface(arInfs); AddUserData(pFitting,pXDataMap,1,&arInfs); setInfo2Ent(*pXDataMap); id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,1); bFittingAdded = true; } //记录接口到历史记录 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); } if (!bFittingAdded) { delete pFitting; } return id; } void TDbPipeLine::AddUserData(AcDbObjectId id,AecDbObjXDataMap* pXDataMap,int nType) { // 增加参数 [10/24/2016 Rex] if(!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; } } } CString sKey; CString 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; } } //添加ObjectId 序列表 m_arIdLast.append(id); int nEType = 0; pXDataMap->GetAt(KEY_RUNTIME,nEType); m_arETypeLast.append(nEType); } bool TDbPipeLine::HasWipeClip() { return m_bWipeClip; } void TDbPipeLine::AddUserData(AecDbEwFitting* pFit,AecDbObjXDataMap* pXDataMap,int nType,AcArray* parInfs) { int nEType = 0; pXDataMap->GetAt(KEY_RUNTIME,nEType); if (nEType == eElbow && parInfs != NULL)//如果是弯头 { //并且有一个接口上下 bool bUpOrDown = false; for (int i = 0;i < parInfs->length();i++) { if ( parInfs->at(i).vtDir.isParallelTo(AcGeVector3d::kZAxis)) { bUpOrDown = true; m_bWipeClip = true; break; } } //如果是上或者下 if (bUpOrDown && !m_arETypeLast.isEmpty()) { //找到前面一个弯头 int nLast = m_arETypeLast.length() - 1; int nLastType = -1; while(nLast > -1) { //前次是elbow nLastType = m_arETypeLast.at(nLast); if (nLastType == eElbow) { AcDbObjectId idLastLast = m_arIdLast.at(nLast); TCHAR szHandle[33]; memset(szHandle,0,sizeof(szHandle)); idLastLast.handle().getIntoAsciiBuffer(szHandle); pXDataMap->SetAt(KEY_LASTHANDLE,szHandle); break; } nLast --; } } } } void TDbPipeLine::SetAngleWath(AcGePoint3d& ptCen,const AcGePoint3d& ptGeTo,const AcGeVector3d& vtDir) { if (m_pAngleWatch != NULL) { m_pAngleWatch->SetAngleWath(ptCen,ptGeTo,vtDir); } } void TDbPipeLine::SwitchAutoSnapOrF8() { if (m_pAngleWatch != NULL) { m_pAngleWatch->SwitchAutoSnapOrF8(); } } void TDbPipeLine::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 TDbPipeLine::AngWatchTo(const AcGePoint3d& ptGeTo) { if (m_pAngleWatch != NULL) { m_pAngleWatch->m_ptGeTo = ptGeTo; } } BOOL TDbPipeLine::PipeFinished() { return m_bStopCommand; } void TDbPipeLine::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) { //回上次管道参数 WPipe::PipeParam* pLast = (WPipe::PipeParam*)m_lstLastPipeParam.GetTail(); if (pLast->m_nGroupID == nGroupID) { m_lstLastPipeParam.RemoveTail(); DELETE_PTR(pLast); } else { memcpy(m_pPipeParam,pLast,sizeof(WPipe::PipeParam)); break; } } } void TDbPipeLine::PushPipeParam() { WPipe::PipeParam* pParam = new WPipe::PipeParam; memcpy(pParam,m_pPipeParam,sizeof(WPipe::PipeParam)); pParam->m_nGroupID = m_pPipeJig->GetUndoGroupID(); m_lstLastPipeParam.AddTail(pParam); } void TDbPipeLine::PushInterface(AecInterface& intf,BOOL bStartDragFromIt) { m_arHistoryIntfs.Add(intf); if (bStartDragFromIt)//拖出的源对象 { m_idStartDragFrom = intf.idOwner; } } Acad::ErrorStatus TDbPipeLine::Draw2d(AcGiDraw &mode) const { if (m_pCurPipeLine[0] != NULL ) { ((TDbPipeLine*)(m_pCurPipeLine[0]))->Draw2d(mode); } if (m_pAngleWatch != NULL && m_pCurPipeLine[0] != NULL) { m_pAngleWatch->Draw2d(mode); } return Acad::eOk; } void TDbPipeLine::FillConfigXDataMap(AecDbObjXDataMap* pXDataMap,WPipe::PipeParam* pParam) { if (pXDataMap != NULL && pParam != NULL) { pXDataMap->SetAt(PIPE_DRAWDIR,pParam->m_eD); //绘制类型 //pXDataMap->SetAt(KEY_2DSTYLE,1); //双线 pXDataMap->SetAt(KEY_2DSTYLE,PipelineTools::isDoubleLine(pParam->m_dDN) ? 2 : 1); pXDataMap->SetAt(KEY_SINGLE,0); pXDataMap->SetAt(PIPE_DN,pParam->m_dDN); pXDataMap->SetAt(PIPE_OD,pParam->m_dOD); pXDataMap->SetAt(PIPE_TDN,pParam->m_dDN); pXDataMap->SetAt(PIPE_TOD,pParam->m_dOD); pXDataMap->SetAt(PIPE_CONNECT,pParam->m_nConnectType); pXDataMap->SetAt(PIPE_COLOR,pParam->m_nPipeColor); if (pParam->m_eD == WPipe::eDN) { pXDataMap->SetAt(PIPE_D,pParam->m_dDN); } else if(pParam->m_eD == WPipe::eOD) { pXDataMap->SetAt(PIPE_D,pParam->m_dOD); } else if(pParam->m_eD == WPipe::eID) { pXDataMap->SetAt(PIPE_D,pParam->m_dOD - 2.0 * pParam->m_dThick); } pXDataMap->SetAt(PIPE_RATIO,pParam->m_dRRatio); pXDataMap->SetAt(KEY_RadRatio, pParam->m_nRadioOn); pXDataMap->SetAt(PIPE_PIPCMD, pParam->nPIPCmd); pXDataMap->SetAt(PIPE_RRADFLG, 1); pXDataMap->SetAt(PIPE_ODSN, pParam->szODSn); pXDataMap->SetAt(PIPE_SHTNO, pParam->szShtNo); pXDataMap->SetAt(PIPE_THICK,pParam->m_dThick); pXDataMap->SetAt(PIPE_MATERIAL,pParam->szMertial); pXDataMap->SetAt(PIPE_MATERIALFT,pParam->szMertialFit); pXDataMap->SetAt(PIPE_LEVEL,pParam->szLevel); pXDataMap->SetAt(PID_PIPE_DPRESS,pParam->m_dPress); pXDataMap->SetAt(PIPE_ELBOWFLG,FALSE); pXDataMap->SetAt(PIPE_BWELDDOT,FALSE); pXDataMap->SetAt(PIPE_ZONE,pParam->szZoneNo); pXDataMap->SetAt(PIPE_UNITNO, pParam->szUnitNo); pXDataMap->SetAt(PIPE_INSTHICK,10.0); pXDataMap->SetAt(PIPE_NO,pParam->szPipeno); pXDataMap->SetAt(KEY_NO, pParam->szNo); pXDataMap->SetAt(DOC_INSMATER,pParam->szInsMtr); pXDataMap->SetAt(PIPE_DESCR,pParam->szDescr); pXDataMap->SetAt(PIPE_SYS,pParam->szSys); pXDataMap->SetAt(PIPE_PIDD,100.0);//设置pid画法的直径 pXDataMap->SetAt(PIPE_CONNECT,pParam->m_nConnectType); pXDataMap->SetAt(PIPE_INTERFACED,pParam->m_dInterfaceD); pXDataMap->SetAt(PIPE_INTERFACED2,pParam->m_dInterfaceD2); pXDataMap->SetAt(PIPE_INTERFACEL,pParam->m_dInterfaceL); pXDataMap->SetAt(PIPE_INTERFACEL2,pParam->m_dInterfaceL2); pXDataMap->SetAt(PIPE_INTERFACEL3,pParam->m_dInterfaceL3); pXDataMap->SetAt(PIPE_Z2DDRAW,pParam->m_bZPipe2DDraw); pXDataMap->SetAt(PIPE_EL, pParam->m_dEl); pXDataMap->SetAt(PIPE_FLANGF, pParam->m_szEndF); pXDataMap->SetAt(PIPE_GASKET, pParam->m_szGastInf); pXDataMap->SetAt(PIPE_EAPP, (int)pParam->m_app); if (pParam->m_app == WPipe::eDuct || pParam->m_app == WPipe::eBridge) { pXDataMap->SetAt(DUCT_W, pParam->m_dW); pXDataMap->SetAt(DUCT_H, pParam->m_dH); pXDataMap->SetAt(DUCT_THICK, pParam->m_dThick); } } FillInInitXDataMap(pXDataMap); } void TDbPipeLine::FillConfigXDataMap(AecDbObjXDataMap* pXDataMap,AecDbEwPipe* pWPipeSrc) { //先整体复制 AecDbObjXDataMap* pXDataMapSrc = pWPipeSrc->GetSpecialtyData(); pXDataMap->CopyFrom(pXDataMapSrc); CString sGUID = IDCreate(); pXDataMap->SetAt(KEY_NO,sGUID); //以下填满可能没有的KEY-DATA [必须项] int nEd(0); int nDir = 0; pXDataMapSrc->GetAt(PIPE_DRAWDIR,nDir); pXDataMap->SetAt(PIPE_DRAWDIR,nDir); nEd = nDir; nDir = 0; pXDataMapSrc->GetAt(KEY_2DSTYLE,nDir); pXDataMap->SetAt(KEY_2DSTYLE,nDir); nDir = 0; pXDataMapSrc->GetAt(KEY_SINGLE,nDir); pXDataMap->SetAt(KEY_SINGLE,nDir); nDir = 0; pXDataMapSrc->GetAt(PIPE_COLOR,nDir); pXDataMap->SetAt(PIPE_COLOR,nDir); double dDn(.0), dOd(.0); double dVal = 100.0; pXDataMapSrc->GetAt(PIPE_DN,dVal); pXDataMap->SetAt(PIPE_DN,dVal); dDn = dVal; dVal = 100.0; pXDataMapSrc->GetAt(PIPE_OD,dVal); pXDataMap->SetAt(PIPE_OD,dVal); dOd = dVal; // PIPE_D 必须存在 dVal = .0; if (!pXDataMapSrc->GetAt(PIPE_D, dVal) || dVal < 1e-6) { if (nEd == WPipe::eDN) pXDataMap->SetAt(PIPE_D, dDn); else if (nEd == WPipe::eOD) pXDataMap->SetAt(PIPE_D, dOd); else pXDataMap->SetAt(PIPE_D, dDn); } pXDataMapSrc->GetAt(PIPE_TDN,dVal); pXDataMap->SetAt(PIPE_TDN,dVal); dVal = 100.0; pXDataMapSrc->GetAt(PIPE_TOD,dVal); pXDataMap->SetAt(PIPE_TOD,dVal); pXDataMapSrc->GetAt(PIPE_RATIO,dVal); pXDataMap->SetAt(PIPE_RATIO,dVal); dVal = 100.0; pXDataMapSrc->GetAt(PIPE_THICK,dVal); pXDataMap->SetAt(PIPE_THICK,dVal); CString sVal; pXDataMapSrc->GetAt(PIPE_MATERIAL,sVal); pXDataMap->SetAt(PIPE_MATERIAL,sVal); pXDataMapSrc->GetAt(PIPE_LEVEL,sVal); pXDataMap->SetAt(PIPE_LEVEL,sVal); dVal = 1.0; pXDataMapSrc->GetAt(PIPE_PRESSURE, dVal); pXDataMap->SetAt(PIPE_PRESSURE, dVal); pXDataMapSrc->GetAt(PIPE_MATERIALFT,sVal); pXDataMap->SetAt(PIPE_MATERIALFT,sVal); nDir = 0; pXDataMapSrc->GetAt(PIPE_ELBOWFLG,nDir); pXDataMap->SetAt(PIPE_ELBOWFLG,nDir); nDir = 0; pXDataMapSrc->GetAt(PIPE_BWELDDOT,nDir); pXDataMap->SetAt(PIPE_BWELDDOT,nDir); dVal = 1.0; pXDataMapSrc->GetAt(DOC_PLOTWIDTH,dVal); pXDataMap->SetAt(DOC_PLOTWIDTH,dVal); dVal = 1.0; pXDataMapSrc->GetAt(DOC_WELDDIA,dVal); pXDataMap->SetAt(DOC_WELDDIA,dVal); pXDataMapSrc->GetAt(PIPE_ZONE,sVal); pXDataMap->SetAt(PIPE_ZONE,sVal); dVal = 1.0; pXDataMapSrc->GetAt(PIPE_INSTHICK,dVal); pXDataMap->SetAt(PIPE_INSTHICK,dVal); pXDataMapSrc->GetAt(PIPE_NO,sVal); pXDataMap->SetAt(PIPE_NO,sVal); pXDataMapSrc->GetAt(DOC_INSMATER,sVal); pXDataMap->SetAt(DOC_INSMATER,sVal); pXDataMapSrc->GetAt(PIPE_DESCR,sVal); pXDataMap->SetAt(PIPE_DESCR,sVal); pXDataMapSrc->GetAt(PIPE_SYS,sVal); pXDataMap->SetAt(PIPE_SYS,sVal); pXDataMapSrc->GetAt(PIPE_PIDD,dVal); pXDataMap->SetAt(PIPE_PIDD,dVal); nDir = 0; pXDataMapSrc->GetAt(PIPE_CONNECT,nDir); pXDataMap->SetAt(PIPE_CONNECT,nDir); dVal = 0.0; pXDataMapSrc->GetAt(PIPE_INTERFACED,dVal); pXDataMap->SetAt(PIPE_INTERFACED,dVal); dVal = 0.0; pXDataMapSrc->GetAt(PIPE_INTERFACEL,dVal); pXDataMap->SetAt(PIPE_INTERFACEL,dVal); dVal = 0.0; pXDataMapSrc->GetAt(PIPE_INTERFACED2,dVal); pXDataMap->SetAt(PIPE_INTERFACED2,dVal); dVal = 0.0; pXDataMapSrc->GetAt(PIPE_INTERFACEL2,dVal); pXDataMap->SetAt(PIPE_INTERFACEL2,dVal); dVal = 0.0; pXDataMapSrc->GetAt(PIPE_INTERFACEL3,dVal); pXDataMap->SetAt(PIPE_INTERFACEL3,dVal); nDir = (int)WPipe::eNoneApp; pXDataMapSrc->GetAt(PIPE_EAPP, nDir); pXDataMap->SetAt(PIPE_EAPP, nDir); if ((WPipe::EApp)nDir == WPipe::eDuct || (WPipe::EApp)nDir == WPipe::eBridge) { dVal = 0.0; pXDataMapSrc->GetAt(DUCT_W, dVal); pXDataMap->SetAt(DUCT_W, dVal); dVal = 0.0; pXDataMapSrc->GetAt(DUCT_H, dVal); pXDataMap->SetAt(DUCT_H, dVal); dVal = 0.0; pXDataMapSrc->GetAt(DUCT_THICK, dVal); pXDataMap->SetAt(DUCT_THICK, dVal); } FillInInitXDataMap(pXDataMap); } void TDbPipeLine::FillInInitXDataMap(AecDbObjXDataMap* pXDataMap) { double dScale = 1.0; CString sScale; m_xInitDataMap.GetAt(DOC_SCALE, sScale); //出图比例 int nPos = sScale.Find(_T(':')); if (nPos != -1) { dScale = _ttof(sScale.Mid(nPos + 1)); } //行业 int nTrade = 0; m_xInitDataMap.GetAt(DOC_TRADE, nTrade); //行业 pXDataMap->SetAt(DOC_TRADE,nTrade); //项目 CString sPro = _T("工业");; m_xInitDataMap.GetAt(DOC_PROJECT, sPro); pXDataMap->SetAt(DOC_PROJECT, sPro); double dMinDia = 0.0;//最小单线管道直径,弯头扣完使用 m_xInitDataMap.GetAt(DOC_PIPEMINDIA,dMinDia);//最小单线管道直径 double dMaxDia = 0.0; m_xInitDataMap.GetAt(DOC_PIPEMAXDIA,dMaxDia);//最小双线 double d90ElbowDN = 60.0; m_xInitDataMap.GetAt(DOC_PERELBOWDIA,d90ElbowDN);//垂直弯头直径 double dMaxDiaDrawScale = 1.5; m_xInitDataMap.GetAt(DOC_PIPEMAXDIASCALE,dMaxDiaDrawScale); //最大管线直径 BOOL bMaxDiaScale; m_xInitDataMap.GetAt(DOC_PIPEMAXDIASYES,bMaxDiaScale);//是否最大管线直径 double dMinSW = 0.5; m_xInitDataMap.GetAt(DOC_PLOTWIDTH,dMinSW); //单线线宽 double dOutSW = 0.0; m_xInitDataMap.GetAt(DOC_DPLOTWIDTH,dOutSW);//外双线线宽 double dWD = 0.5; m_xInitDataMap.GetAt(DOC_WELDDIA, dWD); //焊点直径 //如果是米单位 struct resbuf rb; acedGetVar(_T("INSUNITS"), &rb); if (rb.resval.rint == AcDb::kUnitsMeters) { dMinSW *= 0.001; dOutSW *= 0.001; dWD *= 0.001; dMinDia *= 0.001; dMaxDia *= 0.001; } pXDataMap->SetAt(KEY_SINGLEW,dScale * dMinSW); pXDataMap->SetAt(KEY_DBLINEW,dScale * dOutSW); pXDataMap->SetAt(DOC_WELDDIA,dScale * dWD); pXDataMap->SetAt(DOC_PIPEMINDIA,dMinDia); pXDataMap->SetAt(DOC_PIPEMAXDIA,dMaxDia); pXDataMap->SetAt(DOC_PIPEMAXDIASCALE,dMaxDiaDrawScale); pXDataMap->SetAt(DOC_PIPEMAXDIASYES,bMaxDiaScale); pXDataMap->SetAt(DOC_PERELBOWDIA,d90ElbowDN);//垂直弯头直径 } void TDbPipeLine::XDataMapToPipeParam(const AecDbObjXDataMap* pXDataMapSrc,WPipe::PipeParam* pParamL) { TDbPipeSupport::XData2PipeParam(pParamL,pXDataMapSrc); } void TDbPipeLine::PipeParamToXDataMap(const WPipe::PipeParam* pParamL,AecDbObjXDataMap* pXDataMapSrc) { if (pParamL == NULL || pXDataMapSrc == NULL) return; //D pXDataMapSrc->SetAt(PIPE_D,pParamL->m_dD); //eD pXDataMapSrc->SetAt(PIPE_DRAWDIR,(int)pParamL->m_eD); //DN pXDataMapSrc->SetAt(PIPE_DN,pParamL->m_dDN); //OD pXDataMapSrc->SetAt(PIPE_OD,pParamL->m_dOD); //Thick pXDataMapSrc->SetAt(PIPE_THICK,pParamL->m_dThick); //补充风管壁厚 pXDataMapSrc->SetAt(DUCT_THICK, pParamL->m_dThick); //EL //pXDataMapSrc->SetAt(PIPE_EL, pParamL->m_dEl); //Ratio pXDataMapSrc->SetAt(PIPE_RATIO,pParamL->m_dRRatio); //dW pXDataMapSrc->SetAt(DUCT_W, pParamL->m_dW); //dH pXDataMapSrc->SetAt(DUCT_H, pParamL->m_dH); //app pXDataMapSrc->SetAt(PIPE_EAPP, (int)pParamL->m_app); //nConnectType pXDataMapSrc->SetAt(PIPE_CONNECT,pParamL->m_nConnectType); //dInterfaceL pXDataMapSrc->SetAt(PIPE_INTERFACEL,pParamL->m_dInterfaceL); //dInterfaceD pXDataMapSrc->SetAt(PIPE_INTERFACED,pParamL->m_dInterfaceD); //dInterfaceD2 pXDataMapSrc->SetAt(PIPE_INTERFACED2,pParamL->m_dInterfaceD2); //dInterfaceL2 pXDataMapSrc->SetAt(PIPE_INTERFACEL2,pParamL->m_dInterfaceL2); pXDataMapSrc->SetAt(PIPE_FLANGF, pParamL->m_szEndF); pXDataMapSrc->SetAt(PIPE_GASKET, pParamL->m_szGastInf); //dInsThk pXDataMapSrc->SetAt(PIPE_INSTHICK,pParamL->m_dInsThk); //dInterfaceL3 pXDataMapSrc->SetAt(PIPE_INTERFACEL3,pParamL->m_dInterfaceL3); //m_eRed //m_vtECCen //m_vtDir //m_eElBase //szPipeno pXDataMapSrc->SetAt(PIPE_NO,pParamL->szPipeno); //szMertial pXDataMapSrc->SetAt(PIPE_MATERIAL,pParamL->szMertial); //szMertialFit pXDataMapSrc->SetAt(PIPE_MATERIALFT,pParamL->szMertialFit); //szZoneNo pXDataMapSrc->SetAt(PIPE_ZONE,pParamL->szZoneNo); pXDataMapSrc->SetAt(KEY_NO, pParamL->szNo); //szInsMtr pXDataMapSrc->SetAt(DOC_INSMATER,pParamL->szInsMtr); //szDescr pXDataMapSrc->SetAt(PIPE_DESCR,pParamL->szDescr); //szSys pXDataMapSrc->SetAt(PIPE_SYS,pParamL->szSys); //m_nGroupID //? //LEVEL pXDataMapSrc->SetAt(PIPE_LEVEL,pParamL->szLevel); pXDataMapSrc->SetAt(PID_PIPE_DPRESS,pParamL->m_dPress); //szZone pXDataMapSrc->SetAt(PIPE_ZONE,pParamL->szZone); //szMedia pXDataMapSrc->SetAt(PIPE_MEDIA,pParamL->szMedia); //szNo pXDataMapSrc->SetAt(PIPE_NO,pParamL->szNo); //Spec pXDataMapSrc->SetAt(PIPE_SPEC,pParamL->szSpec); //LineNo pXDataMapSrc->SetAt(PIPE_LINENO,pParamL->szLineNo); //szInsTag pXDataMapSrc->SetAt(PIPE_INSTAG,pParamL->szInsTag); //szInsDim pXDataMapSrc->SetAt(DOC_INSDIM,pParamL->szInsDim); //szInsMateral pXDataMapSrc->SetAt(DOC_INSMATER,pParamL->szInsMateral); //szInsSpec pXDataMapSrc->SetAt(DOC_INSSPEC,pParamL->szInsSpec); //DOC_TRAMTOINF pXDataMapSrc->SetAt(DOC_TRAMTOINF,pParamL->szTraMtoInfo); //szTraDescr pXDataMapSrc->SetAt(DOC_TRADESCR,pParamL->szTraDescr); //szFitType pXDataMapSrc->SetAt(PIPE_FITTYPE,pParamL->szFitType); pXDataMapSrc->SetAt(PIPE_MTOALL,pParamL->szMtoInfo); } BOOL TDbPipeLine::MaybeAddTeeConnectToThis(AcGePoint3d& ptGe,AcGeVector3d& vtDir,AcDbObjectId id,int nPos) { //以ptGe的,以管子公称直径为搜索 ads_point pt[5]; vtDir.normalize(); AcGeVector3d vtV = vtDir; vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); AcGePoint3d ptGeT = ptGe; ptGeT = ptGe + m_pPipeParam->m_dDN * 0.5 * vtDir; ptGeT += m_pPipeParam->m_dDN * 0.5 * vtV; AcGePoint3d ptGeX[5]; ptGeX[0] = ptGeT; ptGeX[1] = ptGeX[0] - m_pPipeParam->m_dDN * vtDir; ptGeX[2] = ptGeX[1] - m_pPipeParam->m_dDN * vtV; ptGeX[3] = ptGeX[0] - m_pPipeParam->m_dDN * 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_EWPIPE")); 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); #ifdef ZWCAD if (id == idT) continue; #endif if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idT,AcDb::kForWrite)) { AecDbEwPipe* pWPipe = AecDbEwPipe::cast(pEnt); if (pWPipe != NULL) { vtPipe = pWPipe->EndPoint() - pWPipe->StartPoint(); vtPipe.normalize(); if (!vtPipe.isParallelTo(vtDir)) { //且两管子中心线能相交 AcGeLine3d ln1(pWPipe->EndPoint(),vtPipe); AcGeLine3d ln2(ptGe,vtDir); double dDn = m_pPipeParam->m_dDN; pWPipe->GetSpecialtyData()->GetAt(PIPE_DN,dDn); if (ln1.intersectWith(ln2,ptMid)) { double dL = 0.0,dS = 0.0; if ( TDbPipeSupport::QueryTeeData(m_pPipeJig->GetAdoDb(),dDn,m_pPipeParam->m_dDN,dL,dS) ) { double dInterfaceL = 0.0; pWPipe->GetSpecialtyData()->GetAt(PIPE_INTERFACEL,dInterfaceL); if (dInterfaceL > 1.e-3)//法兰管 { dL += dInterfaceL; dS += dInterfaceL; } if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5)//法兰连接 { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); dL -= dInterfaceL; dS -= dInterfaceL; //颈法兰焊接方式 CString sDNo = m_pPipeParam->szODSn; if (sDNo.CompareNoCase(_T("S")) != 0 && sDNo.CompareNoCase(_T("GSF")) != 0) { dL += dWh; dS += dWh; } } //也可能加弯头,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->m_dDN) < 1.e-3) //==DN { pEnt->close(); bAddTee = FALSE; if ( AddElbow(idT,ptMid,id)) { bModified = TRUE; } return bModified; } else// 只能加三通 { bAddTee = TRUE; } } if (bAddTee) { //可能 焊接方式,加补强圈!!!,半管接头 CString sLevel; pWPipe->GetAt(PIPE_LEVEL,sLevel); int nTStyle = TDbPipeSupport::QueryRPorHP(m_pPipeJig->GetAdoDb(), sLevel, dDn, m_pPipeParam->m_dDN); if (nTStyle <= 1)//0,1 RT T { //对方断为两个管子 SplitWPipe(ptMid,dL,pWPipe); if (nPos == 1) vtDir.negate(); //改变this管子的位置 ptGe = ptMid + dS * vtDir; ModifyWPipe(ptGe,id,nPos); //添加三通,继承pWPipe属性 AddTee(pWPipe,id,dL,ptMid,dS,vtDir); } else//焊接方式,加补强圈 { TDbPipeLine::AddRPorHP(pWPipe,id,ptMid); } } bModified = TRUE; } else { //焊接方式,加补强圈,或半管接头 TDbPipeLine::AddRPorHP(pWPipe,id,ptMid); } acedSSFree(ss); pEnt->close(); return bModified; } } else //平行,是否可以融合 { //规格相同, 且不是从夹点拖出的命令 if (m_idStartDragFrom != id) { double dDn = 0.0; pWPipe->GetSpecialtyData()->GetAt(PIPE_DN,dDn); if (fabs(dDn - m_pPipeParam->m_dDN) < 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; int nAddTeeOrCross;//0 Cross 1 Tee 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 } static double GetPipeDoubleLineMaxD() { AecDbObjXDataMap xDataMap; CString sDia(_T("")); double dMaD(.0); if (KTModelLayoutXData::ReadModelXData(EW_EARTHWORMINIT, xDataMap)) { dMaD = 500; if (xDataMap.GetAt(DOC_PIPEMAXDIA, sDia)) dMaD = _ttof(sDia); return AS_MUNIT(dMaD); } else if (KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, xDataMap)) { dMaD = 200.; xDataMap.GetAt(DOC_PIPEMAXDIA, dMaD); return dMaD; } return 100.; } BOOL TDbPipeLine::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(); //选择范围缩小, 至少长度超过四通的长度 ptFr += m_pPipeParam->m_dD * 2.0 * vtDir; ptTo -= m_pPipeParam->m_dD * 2.0 * vtDir; ptGe[0] = ptFr; ptGe[0] += vtV * m_pPipeParam->m_dD * 0.8; ptGe[1] = ptTo; ptGe[1] += vtV * m_pPipeParam->m_dD * 0.8; ptGe[2] = ptGe[1] - vtV * 1.6 * m_pPipeParam->m_dD; ptGe[3] = ptGe[0] - vtV * 1.6 * m_pPipeParam->m_dD; 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_EWPIPE")); 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; int nStyleOther = 1; int nStyleThis = 1; std::vector vtPtids; //交叉短线间距 double dOffFrSta = 0,dBreakSpace = 0,dBrkSpBk = 0; m_xInitDataMap.GetAt(DOC_BREAKSPACE,dBreakSpace); double dScale = 1.0; CString sScale; m_xInitDataMap.GetAt(DOC_SCALE, sScale); //出图比例 int nPos = sScale.Find(_T(':')); if (nPos != -1) { dScale = _ttof(sScale.Mid(nPos + 1)); } dBreakSpace *= dScale; dBrkSpBk = dBreakSpace; double dM = 0.0,dB = 0.0; for ( i = 0;i < lLen;i++) { acedSSName(ss,i,ent); acdbGetObjectId(idT,ent); if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idT,AcDb::kForRead)) { idLay2 = pEnt->layerId(); if (idLay1 != idLay2) { pEnt->close(); continue; } AecDbEwPipe* pWPipe = AecDbEwPipe::cast(pEnt); if (pWPipe != NULL) { pWPipe->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_DN,dDN); //判断标高是否一致,方向是否垂直,且 公称直径一致?? if ( fabs(pWPipe->EndPoint().z - ptTo.z) < 1.e-6 && fabs(m_pPipeParam->m_dDN - dDN) < 1.e-6) { vtDir2 = pWPipe->EndPoint() - pWPipe->StartPoint(); if (vtDir2.isPerpendicularTo(vtDir)) { line2.set(pWPipe->StartPoint(),pWPipe->EndPoint()); Point_ID ptid; ptid.nAddTeeOrCross = 0; ptid.id = idT; ptid.pCurve = &line; if ( line1.intersectWith(line2,ptid.ptInt)) { if (dM < 1.e-6) { //四通的主支 DN 相同 if ( !TDbPipeSupport::QueryCrossData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dDN,dM,dB) ) { pEnt->close(); return FALSE; } if (m_pPipeParam->m_dInterfaceL > 1.e-3)//法兰管 { dM += m_pPipeParam->m_dInterfaceL; dB += m_pPipeParam->m_dInterfaceL; } } //判断交点和本线的距离 double dL1 = ptid.ptInt.distanceTo(pWPipe->StartPoint()); double dL2 = ptid.ptInt.distanceTo(pWPipe->EndPoint()); ptid.nAddTeeOrCross = 0; if (dL1 < dM || dL2 < dM) { //加三通的可能 ptid.nAddTeeOrCross = 1; } vtPtids.push_back(ptid); } } } else { //否则单线管线添加遮挡 if ( (pWPipe->EndPoint().z - ptTo.z) < -1.e-1)//对方标高小于本次标高 { nStyleThis = 1; nStyleOther = 1; if (dDN - GetPipeDoubleLineMaxD() > 1.e-3) { nStyleOther = 2; } if (nStyleOther == 2) { dBreakSpace = dBrkSpBk + m_pPipeParam->m_dD; } AcDbLine ln2(pWPipe->StartPoint(),pWPipe->EndPoint()); AcDbLine ln1(ptFr,ptTo); AcGePoint3dArray arIntPtrs; ln1.intersectWith(&ln2,AcDb::kOnBothOperands,AcGePlane::kXYPlane,arIntPtrs); //交点位置加遮挡打断符号 if ( !arIntPtrs.isEmpty() ) { pEnt->upgradeOpen(); pWPipe->getClosestPointTo(arIntPtrs.first(),ptGe[0],Adesk::kFalse); dOffFrSta = ptGe[0].distanceTo(pWPipe->StartPoint()); dOffFrSta -= 0.5 * dBreakSpace;//取中位置 //真实距离负数为遮挡 pWPipe->AddBrokenOpen(dOffFrSta,dBreakSpace,-m_pPipeParam->m_dD); pEnt->downgradeOpen(); } } } } 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++) { if ( (*it).nAddTeeOrCross == 0 ) { AddCross( (*it).id,(*it).ptInt,id); } else { AddTee((*it).id,(*it).ptInt,id); } } } acedSSFree(ss); return FALSE; } BOOL TDbPipeLine::SplitWPipe(AcGePoint3d& ptMid,double dL,AecDbEwPipe* pWPipe,BOOL bEraseWhiletooShort) { AcGePoint3d ptSta = pWPipe->StartPoint(); AcGePoint3d ptEnd = pWPipe->EndPoint(); AcGeVector3d vtDir = ptEnd - ptSta; vtDir.normalize(); AecDbObjXDataMap* pXDataMapt = pWPipe->GetSpecialtyData(); AcDbObjectId idCenLay,idOutLay,idSingle; pXDataMapt->GetAt(PIPE_CENTLAY,idCenLay); pXDataMapt->GetAt(PIPE_OUTDLAY,idOutLay); pXDataMapt->GetAt(PIPE_SINGLAY,idSingle); double dd; pXDataMapt->GetAt(PIPE_D, dd); AcGePoint3d ptTemp = ptMid - dL * vtDir; AcGeVector3d vtDir1 = ptTemp - ptSta; if (vtDir.isCodirectionalTo(vtDir1)) //同向,说明放得下L的 Tee { //新建管子 //放得下L的 Tee 的情况,新建vtDir 方向的end端 AecDbEwPipe* pWPipe1 = new AecDbEwPipe; AecDbObjXDataMap* pXDataMap = pWPipe1->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,pWPipe); //pWPipe1->RemoveBrokenOpen(-1); double dDn(.0), dThick(.0),dD(0.0); pXDataMap->GetAt(PIPE_TDN, dDn); pXDataMap->GetAt(PIPE_D,dD); pXDataMap->GetAt(PIPE_THICK, dThick); int app; pXDataMap->GetAt(PIPE_EAPP, app); if ((WPipe::EApp)app == WPipe::eDuct || (WPipe::EApp)app == WPipe::eBridge) { double dW(.0), dH(.0), dT(.0); pXDataMap->GetAt(DUCT_W, dW); pXDataMap->GetAt(DUCT_H, dH); pXDataMap->GetAt(DUCT_THICK, dT); pWPipe1->SetSection(dW, dH, dT); } else { if (dD < 1e-6) { int ed; dD = dDn; pXDataMapt->GetAt(PIPE_DRAWDIR, ed); if (ed == WPipe::eDN) pXDataMapt->GetAt(PIPE_DN, dD); else if (ed == WPipe::eOD) pXDataMapt->GetAt(PIPE_OD, dD); else pXDataMapt->GetAt(PIPE_DN, dD); pXDataMap->SetAt(PIPE_D, dD); } pWPipe1->SetSection(dD, dThick); } ptTemp = ptMid - dL * vtDir; pWPipe1->SetStartPoint(ptSta); pWPipe1->SetEndPoint(ptTemp); pWPipe1->setLayer(pWPipe->layerId()); pXDataMap->SetAt(PIPE_CENTLAY,idCenLay); pXDataMap->SetAt(PIPE_OUTDLAY,idOutLay); pXDataMap->SetAt(PIPE_SINGLAY,idSingle); pWPipe1->SetDoubleLayer(pWPipe->GetDoubleLayer()); pWPipe1->SetDoubleLineType(pWPipe->GetDoubleLineType()); pWPipe1->SetSingleLayer(pWPipe->GetSingleLayer()); pWPipe1->SetSingleLineType(pWPipe->GetSingleLineType()); pWPipe1->SetDashLayer(pWPipe->GetDashLayer()); pWPipe1->SetCenterLayer(pWPipe->GetCenterLayer()); pWPipe1->setLayer(idOutLay); //套管,洞口 //移除内部关联的套管,如果位置在其中 RemoveHolePipe(pWPipe1); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddPipeToModelSpace(pWPipe1); AddUserData(id,pXDataMap,0); //改变现有的管子的起点 ptTemp = ptMid + dL * vtDir; pWPipe->SetStartPoint(ptTemp); //套管,洞口 //移除内部关联的套管,如果位置在其中 RemoveHolePipe(pWPipe); //删除断管符号 //pWPipe->RemoveBrokenOpen(-1); 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); //删除断管符号 //pWPipe->RemoveBrokenOpen(-1); } return FALSE; } void TDbPipeLine::RemoveHolePipe(AecDbEwPipe* 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); //AddFitToModelSpace(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 TDbPipeLine::ModifyWPipe(AcGePoint3d& ptGe,AcDbObjectId id,int nPos) { AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { AecDbEwPipe* pWPipe = AecDbEwPipe::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 TDbPipeLine::ModifyWPipe(AcGePoint3d& ptGe,AecDbEwPipe* pWPipe,int nPos) { 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); } return TRUE; } return FALSE; } BOOL TDbPipeLine::AddTee(AecDbEwPipe *pWPipe, double dL, AcGePoint3d ptMid, double dB, AcGeVector3d vtMin, WPipe::PipeParam* pParmMain) { if (pParmMain == NULL) return AddTee(pWPipe, dL, ptMid, dB, vtMin); AecDbEwFitting *pFitting = new AecDbEwFitting; AecDbObjXDataMap *pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap, m_pPipeParam); pXDataMap->SetAt(PIPE_CONNECT, m_pPipeParam->m_nConnectType); AecDbObjXDataMap *pXDataMapmaj = pWPipe->GetSpecialtyData(); //查询设置项目等级 if (!QuerySetProjectLevel(pXDataMap, m_pPipeParam, _T("三通"))) return FALSE; CString sODNo = m_pPipeParam->szODSn; IsPlasticsMat(m_pPipeParam, sODNo); if (m_pPipeParam->m_nConnectType > 0) { double dFD = 0.0, dFL = 0.0; double dWD = 0.0, dWh = 0.0, dThk = 0.0, dN = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(), eTee, m_pPipeParam->m_nConnectType, m_pPipeParam->m_dDN, dFD, dFL); pXDataMap->SetAt(PIPE_INTERFACED2, dFD); pXDataMap->SetAt(PIPE_INTERFACEL2, dFL); pXDataMap->SetAt(PIPE_INTERFACED, dFD); pXDataMap->SetAt(PIPE_INTERFACEL, dFL); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, m_pPipeParam->m_dPress, dWD, dWh, dThk, dN); pXDataMap->SetAt(PIPE_WH2, dWh); pXDataMap->SetAt(PIPE_WN2, dN); //垫片 /*TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, m_pPipeParam->m_dPress, sProj, sLevel, pXDataMap); TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, dPre, sProj, sLevel, pXDataMap); //螺栓 TDbPipeSupport::SetBoltData(m_pPipeJig->GetAdoDb(), pParam->m_dDN, dPre, sProj, sLevel, pXDataMap); TDbPipeSupport::SetBoltData(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, dPre, sProj, sLevel, pXDataMap);*/ } double dDnMaj = pParmMain->m_dDN; //pXDataMapmaj->GetAt(PIPE_DN, dDnMaj); TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(), eTee, m_pPipeParam->m_nConnectType, dDnMaj, dFD, dFL); pXDataMap->SetAt(PIPE_INTERFACED, dFD); pXDataMap->SetAt(PIPE_INTERFACEL, dFL); if (m_pPipeParam->m_nConnectType == 3) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(), dDnMaj, m_pPipeParam->m_dPress, dWD, dWh, dThk, dN); pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WN, dN); } } pXDataMap->SetAt(KEY_FITSRV, KEY_FITWPIPE); if (m_pPipeParam->m_app == WPipe::eDuct) pXDataMap->SetAt(KEY_RUNTIME, eDuctTee); else if (m_pPipeParam->m_app == WPipe::eBridge) pXDataMap->SetAt(KEY_RUNTIME, eBridgeTee); else pXDataMap->SetAt(KEY_RUNTIME, eTee); AcGeVector3d vtMaj = pWPipe->EndPoint() - pWPipe->StartPoint(); vtMaj.normalize(); pXDataMap->SetAt(KEY_MAJBR, vtMaj); vtMin.normalize(); pXDataMap->SetAt(KEY_MINBR, vtMin); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); AcGeVector3d vtNro = vtMin.crossProduct(vtMaj); pXDataMap->SetAt(KEY_NORMAL, vtNro); pXDataMap->SetAt(KEY_MID, ptMid); double dDn = pParmMain->m_dDN; pXDataMapmaj->GetAt(PIPE_DN, dDn); pXDataMap->SetAt(PIPE_DN, dDn); double dOD = pParmMain->m_dOD; pXDataMapmaj->GetAt(PIPE_OD, dOD); pXDataMap->SetAt(PIPE_OD, dOD); double dTDn = m_pPipeParam->m_dDN; pXDataMap->SetAt(PIPE_TDN, dTDn); double dTOD = m_pPipeParam->m_dOD; pXDataMap->SetAt(PIPE_TOD, dTOD); pXDataMap->SetAt(PIPE_THICK, m_pPipeParam->m_dThick); pXDataMap->SetAt(KEY_L, dL * 2); pXDataMap->SetAt(KEY_T, dB); double dWidth = 1.0; pXDataMapmaj->GetAt(KEY_Width, dWidth); pXDataMap->SetAt(KEY_Width, dWidth); int nDir = 0; pXDataMapmaj->GetAt(PIPE_BWELDDOT, nDir); pXDataMap->SetAt(PIPE_BWELDDOT, nDir); nDir = 0; pXDataMapmaj->GetAt(PIPE_COLOR, nDir); pXDataMap->SetAt(PIPE_COLOR, nDir); pXDataMapmaj->GetAt(DOC_WELDDIA, dWidth); pXDataMap->SetAt(DOC_WELDDIA, dWidth); CString strTemp, sMaterial; pXDataMap->SetAt(KEY_TYPE, _T("GBTEE")); pXDataMapmaj->GetAt(PIPE_MATERIAL, sMaterial); pXDataMap->SetAt(PIPE_MATERIAL, sMaterial); pXDataMapmaj->GetAt(PIPE_MATERIALFT, sMaterial); pXDataMap->SetAt(PIPE_MATERIALFT, sMaterial); pXDataMap->SetAt(PIPE_SYS, m_pPipeParam->szSys); if (IsPlasticsMat(m_pPipeParam, sODNo)) { TDbPipeSupport::QueryPVCTeeData(m_pPipeJig->GetAdoDb(), dDn, dTDn, pXDataMap, sODNo); } //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); //pFitting->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id, pXDataMap, 2); return TRUE; } BOOL TDbPipeLine::AddTee(AecDbEwPipe* pWPipe,double dL,AcGePoint3d ptMid,double dB,AcGeVector3d vtMin) { AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); pXDataMap->SetAt(PIPE_CONNECT,m_pPipeParam->m_nConnectType); AecDbObjXDataMap* pXDataMapmaj = pWPipe->GetSpecialtyData(); CString sODNo = m_pPipeParam->szODSn; IsPlasticsMat(m_pPipeParam, sODNo); if (m_pPipeParam->m_nConnectType > 0) { double dFD = 0.0,dFL = 0.0; double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eTee,m_pPipeParam->m_nConnectType,m_pPipeParam->m_dDN,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED2,dFD); pXDataMap->SetAt(PIPE_INTERFACEL2,dFL); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); pXDataMap->SetAt(PIPE_WH2, dWh); pXDataMap->SetAt(PIPE_WN2,dN); } double dDnMaj = 0.0; pXDataMapmaj->GetAt(PIPE_DN,dDnMaj); TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eTee,m_pPipeParam->m_nConnectType,dDnMaj,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),dDnMaj,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WN,dN); } } pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); if (m_pPipeParam->m_app == WPipe::eDuct) pXDataMap->SetAt(KEY_RUNTIME, eDuctTee); else if (m_pPipeParam->m_app == WPipe::eBridge) pXDataMap->SetAt(KEY_RUNTIME, eBridgeTee); else pXDataMap->SetAt(KEY_RUNTIME,eTee); AcGeVector3d vtMaj = pWPipe->EndPoint() - pWPipe->StartPoint(); vtMaj.normalize(); pXDataMap->SetAt(KEY_MAJBR,vtMaj); vtMin.normalize(); pXDataMap->SetAt(KEY_MINBR,vtMin); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); AcGeVector3d vtNro = vtMin.crossProduct(vtMaj); pXDataMap->SetAt(KEY_NORMAL,vtNro); pXDataMap->SetAt(KEY_MID,ptMid); double dDn = m_pPipeParam->m_dDN; pXDataMapmaj->GetAt(PIPE_DN,dDn); pXDataMap->SetAt(PIPE_DN,dDn); double dOD = m_pPipeParam->m_dOD; pXDataMapmaj->GetAt(PIPE_OD,dOD); pXDataMap->SetAt(PIPE_OD,dOD); double dTDn = m_pPipeParam->m_dDN; pXDataMapmaj->GetAt(PIPE_TDN,dTDn); pXDataMap->SetAt(PIPE_TDN,dTDn); double dTOD = m_pPipeParam->m_dOD; pXDataMapmaj->GetAt(PIPE_TOD,dTOD); pXDataMap->SetAt(PIPE_TOD,dTOD); pXDataMap->SetAt(PIPE_THICK,m_pPipeParam->m_dThick); pXDataMap->SetAt(KEY_L,dL * 2); pXDataMap->SetAt(KEY_T,dB); double dWidth = 1.0; pXDataMapmaj->GetAt(KEY_Width,dWidth); pXDataMap->SetAt(KEY_Width,dWidth); int nDir = 0; pXDataMapmaj->GetAt(PIPE_BWELDDOT,nDir); pXDataMap->SetAt(PIPE_BWELDDOT,nDir); nDir = 0; pXDataMapmaj->GetAt(PIPE_COLOR,nDir); pXDataMap->SetAt(PIPE_COLOR,nDir); pXDataMapmaj->GetAt(DOC_WELDDIA,dWidth); pXDataMap->SetAt(DOC_WELDDIA,dWidth); CString strTemp,sMaterial; pXDataMap->SetAt(KEY_TYPE,_T("GBTEE")); pXDataMapmaj->GetAt(PIPE_MATERIAL,sMaterial); pXDataMap->SetAt(PIPE_MATERIAL,sMaterial); pXDataMapmaj->GetAt(PIPE_MATERIALFT,sMaterial); pXDataMap->SetAt(PIPE_MATERIALFT,sMaterial); pXDataMap->SetAt(PIPE_SYS,m_pPipeParam->szSys); if (IsPlasticsMat(m_pPipeParam, sODNo)) { TDbPipeSupport::QueryPVCTeeData(m_pPipeJig->GetAdoDb(), dDn, dTDn, pXDataMap, sODNo); } //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); //pFitting->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,2); return TRUE; } BOOL TDbPipeLine::AddTee(AecDbEwPipe* pWPipeMaj,AecDbEwPipe* pPipeMin,double dL,AcGePoint3d ptMid,double dB,AcGeVector3d vtMin) { AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); pXDataMap->SetAt(PIPE_CONNECT,m_pPipeParam->m_nConnectType); AecDbObjXDataMap* pXDataMapmaj = pWPipeMaj->GetSpecialtyData(); AecDbObjXDataMap* pXDataMapmin = pPipeMin->GetSpecialtyData(); CString sODNo = m_pPipeParam->szODSn; IsPlasticsMat(m_pPipeParam, sODNo); if (m_pPipeParam->m_nConnectType > 0) { double dFD = 0.0,dFL = 0.0; double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eTee,m_pPipeParam->m_nConnectType,m_pPipeParam->m_dDN,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED2,dFD); pXDataMap->SetAt(PIPE_INTERFACEL2,dFL); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); pXDataMap->SetAt(PIPE_WH2, dWh); pXDataMap->SetAt(PIPE_WN2,dN); } double dDnMaj = 0.0; pXDataMapmaj->GetAt(PIPE_DN,dDnMaj); TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eTee,m_pPipeParam->m_nConnectType,dDnMaj,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),dDnMaj,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WN,dN); } } pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); if (m_pPipeParam->m_app == WPipe::eDuct) pXDataMap->SetAt(KEY_RUNTIME, eDuctTee); else if (m_pPipeParam->m_app == WPipe::eBridge) pXDataMap->SetAt(KEY_RUNTIME, eBridgeTee); else pXDataMap->SetAt(KEY_RUNTIME,eTee); AcGeVector3d vtMaj = pWPipeMaj->EndPoint() - pWPipeMaj->StartPoint(); vtMaj.normalize(); pXDataMap->SetAt(KEY_MAJBR,vtMaj); vtMin.normalize(); pXDataMap->SetAt(KEY_MINBR,vtMin); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); AcGeVector3d vtNro = vtMin.crossProduct(vtMaj); pXDataMap->SetAt(KEY_NORMAL,vtNro); pXDataMap->SetAt(KEY_MID,ptMid); double dDn = m_pPipeParam->m_dDN; pXDataMapmaj->GetAt(PIPE_DN,dDn); pXDataMap->SetAt(PIPE_DN,dDn); double dOD = m_pPipeParam->m_dOD; pXDataMapmaj->GetAt(PIPE_OD,dOD); pXDataMap->SetAt(PIPE_OD,dOD); double dTDn = m_pPipeParam->m_dDN; pXDataMapmin->GetAt(PIPE_TDN,dTDn); pXDataMap->SetAt(PIPE_TDN,dTDn); double dTOD = m_pPipeParam->m_dOD; pXDataMapmin->GetAt(PIPE_TOD,dTOD); pXDataMap->SetAt(PIPE_TOD,dTOD); pXDataMap->SetAt(PIPE_THICK,m_pPipeParam->m_dThick); pXDataMap->SetAt(KEY_L,dL * 2); pXDataMap->SetAt(KEY_T,dB); double dWidth = 1.0; pXDataMapmaj->GetAt(KEY_Width,dWidth); pXDataMap->SetAt(KEY_Width,dWidth); int nDir = 0; pXDataMapmaj->GetAt(PIPE_BWELDDOT,nDir); pXDataMap->SetAt(PIPE_BWELDDOT,nDir); nDir = 0; pXDataMapmaj->GetAt(PIPE_COLOR,nDir); pXDataMap->SetAt(PIPE_COLOR,nDir); pXDataMapmaj->GetAt(DOC_WELDDIA,dWidth); pXDataMap->SetAt(DOC_WELDDIA,dWidth); CString strTemp,sMaterial; pXDataMap->SetAt(KEY_TYPE,_T("GBTEE")); pXDataMapmaj->GetAt(PIPE_MATERIAL,sMaterial); pXDataMap->SetAt(PIPE_MATERIAL,sMaterial); pXDataMapmaj->GetAt(PIPE_MATERIALFT,sMaterial); pXDataMap->SetAt(PIPE_MATERIALFT,sMaterial); pXDataMap->SetAt(PIPE_SYS,m_pPipeParam->szSys); if (IsPlasticsMat(m_pPipeParam, sODNo)) { TDbPipeSupport::QueryPVCTeeData(m_pPipeJig->GetAdoDb(), dDn, dTDn, pXDataMap, sODNo); } //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); //pFitting->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,2); return TRUE; } BOOL TDbPipeLine::AddRPorHP(AecDbEwPipe* pWPipeMaj,AecDbEwPipe* pPipeMin,AcGePoint3d ptMid) { double dDn = 0.0; pWPipeMaj->GetAt(PIPE_D,dDn); double ddn = 0.0; pPipeMin->GetAt(PIPE_D,ddn); CString sLevel;//等级 pWPipeMaj->GetAt(PIPE_LEVEL,sLevel); double dOd = 0.0; pWPipeMaj->GetAt(PIPE_OD, dOd); double dTod = 0; pPipeMin->GetAt(PIPE_OD, dTod); EFittingType eType; AecDbObjXDataMap *pXDataMapmaj = pWPipeMaj->GetSpecialtyData(); double dD = 0.0; pXDataMapmaj->GetAt(PIPE_D, dD); //调整 AcGePoint3d ptE; AcGeVector3d vtMin = pPipeMin->EndPoint() - pPipeMin->StartPoint(); AcGeVector3d vt = MidPoint(pPipeMin->EndPoint(), pPipeMin->StartPoint()) - ptMid; /* 0 RT REDUCING TEE 1 T EQUAL TEE 2 H HALF COUPLING 3 P BRANCH WELD 4 RP REINFORCING PAD 5 SO SOCKOLET 6 W WELDOLET */ int nRporHP = TDbPipeSupport::QueryRPorHP(m_pPipeJig->GetAdoDb(),sLevel,dDn,ddn); if (nRporHP == 2 || nRporHP == 4) { if (nRporHP == 2) eType = eHP; if (nRporHP == 4) eType = eRP; } else if (nRporHP == 3 || nRporHP == 5 || nRporHP == 6) //焊接 或承插 { if (vt.isCodirectionalTo(vtMin)) { vt.normalize(); vt *= (0.5 * dD); ptE = ptMid + vt; pPipeMin->SetStartPoint(ptE); } else { vt.normalize(); vt *= (0.5 * dD); ptE = ptMid + vt; pPipeMin->SetEndPoint(ptE); } return FALSE; } //加入RP AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); pXDataMap->SetAt(KEY_RUNTIME,eType); pXDataMap->SetAt(PIPE_THICK, m_pPipeParam->m_dThick); double dD2 = 0,dh = 0.0; if (eType == eRP) //补强圈 { TDbPipeSupport::QueryRP(m_pPipeJig->GetAdoDb(), ddn, pXDataMap); if (vt.isCodirectionalTo(vtMin)) { vt.normalize(); vt *= (0.5 * dD - dh); ptE = ptMid + vt; pPipeMin->SetStartPoint(ptE); } else { vt.normalize(); vt *= (0.5 * dD - dh); ptE = ptMid + vt; pPipeMin->SetEndPoint(ptE); } } else if (eType == eHP) //半管接头 { TDbPipeSupport::QueryHP(m_pPipeJig->GetAdoDb(), ddn, pXDataMap); pXDataMap->GetAt(KEY_L, dh);//长度 pXDataMap->GetAt(PIPE_D, dD2);//外径 if (vt.isCodirectionalTo(vtMin)) { vt.normalize(); vt *= (0.5 * dD + dh); ptE = ptMid + vt; pPipeMin->SetStartPoint(ptE); } else { vt.normalize(); vt *= (0.5 * dD + dh - 0.25 * dD2);//大约 ptE = ptMid + vt; pPipeMin->SetEndPoint(ptE); } } AcGeVector3d vtMaj = pWPipeMaj->EndPoint() - pWPipeMaj->StartPoint(); vtMaj.normalize(); pXDataMap->SetAt(KEY_MAJBR,vtMaj); vtMin.normalize(); pXDataMap->SetAt(KEY_MINBR,vt); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); AcGeVector3d vtNro = vtMin.crossProduct(vtMaj); pXDataMap->SetAt(KEY_NORMAL,vtNro); pXDataMap->SetAt(KEY_MID,ptMid); dDn = m_pPipeParam->m_dDN; pXDataMapmaj->GetAt(PIPE_DN,dDn); pXDataMap->SetAt(PIPE_DN,dDn); double dOD = m_pPipeParam->m_dOD; pXDataMapmaj->GetAt(PIPE_OD,dOD); pXDataMap->SetAt(PIPE_OD,dOD); double dTDn = m_pPipeParam->m_dDN; pPipeMin->GetAt(PIPE_TDN,dTDn); pXDataMap->SetAt(PIPE_TDN,dTDn); double dTOD = m_pPipeParam->m_dOD; pPipeMin->GetAt(PIPE_TOD,dTOD); pXDataMap->SetAt(PIPE_TOD,dTOD); double dWidth = 1.0; pXDataMapmaj->GetAt(KEY_Width,dWidth); pXDataMap->SetAt(KEY_Width,dWidth); int nDir = 0; pXDataMapmaj->GetAt(PIPE_BWELDDOT,nDir); pXDataMap->SetAt(PIPE_BWELDDOT,nDir); nDir = 0; pXDataMapmaj->GetAt(PIPE_COLOR,nDir); pXDataMap->SetAt(PIPE_COLOR,nDir); pXDataMapmaj->GetAt(DOC_WELDDIA,dWidth); pXDataMap->SetAt(DOC_WELDDIA,dWidth); CString strTemp,sMaterial; pXDataMap->SetAt(KEY_TYPE,_T("GBTEE")); pXDataMapmaj->GetAt(PIPE_MATERIAL,sMaterial); pXDataMap->SetAt(PIPE_MATERIAL,sMaterial); pXDataMapmaj->GetAt(PIPE_MATERIALFT,sMaterial); pXDataMap->SetAt(PIPE_MATERIALFT,sMaterial); pXDataMap->SetAt(PIPE_SYS,m_pPipeParam->szSys); //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); //pFitting->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,2); return TRUE; } BOOL TDbPipeLine::AddRPorHP(AecDbEwPipe* pWPipeMaj,AcDbObjectId& idMin,AcGePoint3d ptMid) { AcDbEntity* pEnt1 = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt1, idMin, AcDb::kForWrite)) { AecDbEwPipe* pPipeMin = AecDbEwPipe::cast(pEnt1); if (pPipeMin != NULL) { AddRPorHP(pWPipeMaj,pPipeMin,ptMid); } pEnt1->close(); } return TRUE; } BOOL TDbPipeLine::AddTee(AecDbEwPipe* pWPipeMaj,AcDbObjectId& idMin,double dL,AcGePoint3d ptMid,double dB,AcGeVector3d vtMin) { AcDbEntity* pEnt1 = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt1, idMin, AcDb::kForWrite)) { AecDbEwPipe* pPipeMin = AecDbEwPipe::cast(pEnt1); if (pPipeMin != NULL) { AddTee(pWPipeMaj,pPipeMin,dL,ptMid,dB,vtMin); } pEnt1->close(); } return TRUE; } BOOL TDbPipeLine::AddTee(AecInterface& inf,AcGeVector3d& vtNorm, AcGeVector3d& vtMin,double dL, double dS) { AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); pXDataMap->SetAt(PIPE_CONNECT,m_pPipeParam->m_nConnectType); if (m_pPipeParam->m_nConnectType > 0) { double dFD = 0.0,dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eLateral,m_pPipeParam->m_nConnectType,m_pPipeParam->m_dDN,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); pXDataMap->SetAt(PIPE_INTERFACED2,dFD); pXDataMap->SetAt(PIPE_INTERFACEL2,dFL); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); pXDataMap->SetAt(PIPE_WH2, dWh); pXDataMap->SetAt(PIPE_WN2,dN); pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WN,dN); } } pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); pXDataMap->SetAt(KEY_RUNTIME,eTee); AcGeVector3d vtMaj = inf.vtDir; vtMaj.normalize(); pXDataMap->SetAt(KEY_MAJBR,vtMaj); vtMin.normalize(); pXDataMap->SetAt(KEY_MINBR,vtMin); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); AcGeVector3d vtNro = vtMin.crossProduct(vtMaj); pXDataMap->SetAt(KEY_NORMAL,vtNro); AcGePoint3d ptMid; ptMid = inf.ptPos + vtMaj * dL; pXDataMap->SetAt(KEY_MID,ptMid); double dDn = m_pPipeParam->m_dDN; pXDataMap->SetAt(PIPE_DN,dDn); double dOD = m_pPipeParam->m_dOD; pXDataMap->SetAt(PIPE_OD,dOD); pXDataMap->SetAt(PIPE_TDN,inf.dSize1); pXDataMap->SetAt(PIPE_TOD,inf.dSize2); pXDataMap->SetAt(PIPE_THICK,m_pPipeParam->m_dThick); pXDataMap->SetAt(KEY_L,dL * 2); pXDataMap->SetAt(KEY_T,dS); double dWidth = 1.0; pXDataMap->SetAt(KEY_Width,dWidth); int nDir = 0; pXDataMap->SetAt(PIPE_BWELDDOT,nDir); nDir = 0; m_xInitDataMap.GetAt(PIPE_COLOR,nDir); pXDataMap->SetAt(PIPE_COLOR,nDir); pXDataMap->SetAt(DOC_WELDDIA,dWidth); CString strTemp,sMaterial; pXDataMap->SetAt(KEY_TYPE,_T("GBTEE")); pXDataMap->SetAt(PIPE_MATERIAL,sMaterial); pXDataMap->SetAt(PIPE_MATERIALFT,sMaterial); pXDataMap->SetAt(PIPE_SYS,m_pPipeParam->szSys); //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); //pFitting->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,2); return TRUE; } BOOL TDbPipeLine::AddLTee(AecInterface& inf,AcGeVector3d& vtBr,double dE,double dM,double dB,double dInsL,double dInfD) { AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); pXDataMap->SetAt(PIPE_CONNECT,m_pPipeParam->m_nConnectType); if (m_pPipeParam->m_nConnectType > 0) { double dFD = 0.0,dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eLateral,m_pPipeParam->m_nConnectType,m_pPipeParam->m_dDN,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); pXDataMap->SetAt(PIPE_INTERFACED2,dFD); pXDataMap->SetAt(PIPE_INTERFACEL2,dFL); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); pXDataMap->SetAt(PIPE_WH2, dWh); pXDataMap->SetAt(PIPE_WN2,dN); pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WN,dN); } } pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); pXDataMap->SetAt(KEY_RUNTIME,eLateral); AcGeVector3d vtMaj = inf.vtDir; pXDataMap->SetAt(KEY_MAJBR,vtMaj); pXDataMap->SetAt(KEY_MINBR,vtBr); AcGeVector3d vtNormal = vtBr.crossProduct(vtMaj); pXDataMap->SetAt(KEY_NORMAL,vtNormal); vtMaj.normalize(); AcGePoint3d ptMid = inf.ptPos + vtMaj * dE; pXDataMap->SetAt(KEY_MID,ptMid); pXDataMap->SetAt(PIPE_DRAWDIR,m_pPipeParam->m_eD); pXDataMap->SetAt(KEY_2DSTYLE,PipelineTools::isDoubleLine(m_pPipeParam->m_dDN) ? 2 : 1); pXDataMap->SetAt(PIPE_DN,m_pPipeParam->m_dDN); pXDataMap->SetAt(PIPE_OD,m_pPipeParam->m_dOD); pXDataMap->SetAt(PIPE_TDN,m_pPipeParam->m_dDN); pXDataMap->SetAt(PIPE_TOD,m_pPipeParam->m_dOD); pXDataMap->SetAt(PIPE_THICK,m_pPipeParam->m_dThick); pXDataMap->SetAt(PIPE_E,dE); pXDataMap->SetAt(PIPE_M,dM); pXDataMap->SetAt(PIPE_B,dB); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); pXDataMap->SetAt(PIPE_COLOR,m_pPipeParam->m_nPipeColor); //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); //pFitting->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,2); return TRUE; } BOOL TDbPipeLine::AddYTee(AecInterface& inf,AcGeVector3d& vtNormal,double dM,double dB,double dInsL,double dInfD) { AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); pXDataMap->SetAt(PIPE_CONNECT,m_pPipeParam->m_nConnectType); if (m_pPipeParam->m_nConnectType > 0) { double dFD = 0.0,dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eWye,m_pPipeParam->m_nConnectType,m_pPipeParam->m_dDN,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); pXDataMap->SetAt(PIPE_INTERFACED2,dFD); pXDataMap->SetAt(PIPE_INTERFACEL2,dFL); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); pXDataMap->SetAt(PIPE_WH2, dWh); pXDataMap->SetAt(PIPE_WN2,dN); pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WN,dN); } } pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); pXDataMap->SetAt(KEY_RUNTIME,eWye); AcGeVector3d vtMaj = inf.vtDir; pXDataMap->SetAt(KEY_MAJBR,vtMaj); AcGeLine3d ln(AcGePoint3d::kOrigin,vtMaj); if (AcGePlane::kXYPlane.isParallelTo(ln)) { vtNormal = AcGeVector3d::kZAxis; } else if (AcGePlane::kXYPlane.isPerpendicularTo(ln)) { vtNormal = AcGeVector3d::kXAxis; } pXDataMap->SetAt(KEY_NORMAL,vtNormal); vtMaj.normalize(); AcGePoint3d ptMid = inf.ptPos + vtMaj * dM; pXDataMap->SetAt(KEY_MID,ptMid); pXDataMap->SetAt(PIPE_DRAWDIR,m_pPipeParam->m_eD); pXDataMap->SetAt(KEY_2DSTYLE, PipelineTools::isDoubleLine(m_pPipeParam->m_dDN) ? 2 : 1); pXDataMap->SetAt(PIPE_DN,m_pPipeParam->m_dDN); pXDataMap->SetAt(PIPE_OD,m_pPipeParam->m_dOD); pXDataMap->SetAt(PIPE_TDN,m_pPipeParam->m_dDN); pXDataMap->SetAt(PIPE_TOD,m_pPipeParam->m_dOD); pXDataMap->SetAt(PIPE_THICK,m_pPipeParam->m_dThick); pXDataMap->SetAt(PIPE_M,dM); pXDataMap->SetAt(PIPE_B,dB); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); pXDataMap->SetAt(PIPE_COLOR,m_pPipeParam->m_nPipeColor); //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); //pFitting->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,2); return TRUE; } BOOL TDbPipeLine::AddCap(AecInterface& inf,AcGeVector3d& vtNormal,double dL) { AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); pXDataMap->SetAt(KEY_RUNTIME,eWcap); AcGeVector3d vtMaj = inf.vtDir; pXDataMap->SetAt(KEY_MAJBR,vtMaj); AcGeLine3d ln(AcGePoint3d::kOrigin,vtMaj); if (AcGePlane::kXYPlane.isParallelTo(ln)) { vtNormal = AcGeVector3d::kZAxis; } else if (AcGePlane::kXYPlane.isPerpendicularTo(ln)) { vtNormal = AcGeVector3d::kXAxis; } pXDataMap->SetAt(KEY_NORMAL,vtNormal); vtMaj.normalize(); pXDataMap->SetAt(PIPE_DRAWDIR,m_pPipeParam->m_eD); pXDataMap->SetAt(KEY_2DSTYLE, PipelineTools::isDoubleLine(m_pPipeParam->m_dDN) ? 2 : 1); pXDataMap->SetAt(KEY_START,inf.ptPos); pXDataMap->SetAt(PIPE_DN,m_pPipeParam->m_dDN); pXDataMap->SetAt(PIPE_OD,m_pPipeParam->m_dOD); pXDataMap->SetAt(PIPE_TDN,m_pPipeParam->m_dDN); pXDataMap->SetAt(PIPE_TOD,m_pPipeParam->m_dOD); pXDataMap->SetAt(PIPE_THICK,m_pPipeParam->m_dThick); pXDataMap->SetAt(KEY_L,dL); pXDataMap->SetAt(KEY_GRIPCMD, GRIP_CMD); pXDataMap->SetAt(PIPE_COLOR,m_pPipeParam->m_nPipeColor); //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); //pFitting->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,6); return TRUE; } BOOL TDbPipeLine::AddCross( AcDbObjectId id1,AcGePoint3d& ptInt,AcDbObjectId idThis,WPipe::PipeParam* pParamT/* = NULL*/) { AecDbEwPipe* pWPipe = NULL; double dL = 0.0,dB = 0.0,dTDn = 0.0,dTOD = 0.0; AcGeVector3d vtMaj,vtMin; CString sDNo = m_pPipeParam->szODSn; IsPlasticsMat(m_pPipeParam, sDNo); if (pParamT == NULL) pParamT = m_pPipeParam; if ( TDbPipeSupport::QueryCrossData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dDN,dL,dB) ) { if (m_pPipeParam->m_dInterfaceL > 1.e-3)//法兰管 { dL += m_pPipeParam->m_dInterfaceL; dB += m_pPipeParam->m_dInterfaceL; } if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5)//法兰连接 { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); dL -= m_pPipeParam->m_dInterfaceL; dB -= m_pPipeParam->m_dInterfaceL; //颈法兰焊接方式 if (sDNo.CompareNoCase(_T("S")) != 0 && sDNo.CompareNoCase(_T("GSF")) != 0) { dL += dWh; dB += dWh; } } if (pParamT != NULL) { dL = 0.0,dB = 0.0; if ( TDbPipeSupport::QueryCrossData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,pParamT->m_dDN,dL,dB) ) { if (m_pPipeParam->m_dInterfaceL > 1.e-3)//法兰管 { dL += m_pPipeParam->m_dInterfaceL; dB += pParamT->m_dInterfaceL; } if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5)//法兰连接 { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),pParamT->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); dL -= m_pPipeParam->m_dInterfaceL; dB -= pParamT->m_dInterfaceL; //颈法兰焊接方式 if (sDNo.CompareNoCase(_T("S")) != 0 && sDNo.CompareNoCase(_T("GSF")) != 0) { dL += dWh; dB += dWh; } } } } //idThis 支管分割为两部分 AcDbEntity* pEnt2 = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt2,idThis,AcDb::kForWrite)) { pWPipe = AecDbEwPipe::cast(pEnt2); if (pWPipe != NULL) { pWPipe->GetSpecialtyData(AcDb::kForWrite)->GetAt(PIPE_TDN,dTDn); pWPipe->GetSpecialtyData(AcDb::kForWrite)->GetAt(PIPE_TOD,dTOD); vtMin = pWPipe->EndPoint() - pWPipe->StartPoint(); 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 * dB); } else { pWPipe->SetEndPoint(ptInt - vtMin * dB); } } } pEnt2->close(); } // id1 主管分割为两部分 AcDbEntity* pEnt1 = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt1,id1,AcDb::kForWrite)) { pWPipe = AecDbEwPipe::cast(pEnt1); if (pWPipe != NULL) { vtMaj = pWPipe->EndPoint() - pWPipe->StartPoint(); 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(); } //加入四通 AcGeVector3d vtNro = vtMin.crossProduct(vtMaj); AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); if (pParamT != NULL) { dTDn = pParamT->m_dDN; dTOD = pParamT->m_dOD; } pXDataMap->SetAt(PIPE_CONNECT,m_pPipeParam->m_nConnectType); if (m_pPipeParam->m_nConnectType > 0) { double dFD = 0.0,dFL = 0.0; TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eCross,m_pPipeParam->m_nConnectType,m_pPipeParam->m_dDN,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED,dFD); pXDataMap->SetAt(PIPE_INTERFACEL,dFL); pXDataMap->SetAt(PIPE_INTERFACED2,dFD); pXDataMap->SetAt(PIPE_INTERFACEL2,dFL); if (pParamT != NULL) { TDbPipeSupport::QueryInfFDFL(m_pPipeJig->GetAdoDb(),eCross,m_pPipeParam->m_nConnectType,pParamT->m_dDN,dFD,dFL); pXDataMap->SetAt(PIPE_INTERFACED2,dFD); pXDataMap->SetAt(PIPE_INTERFACEL2,dFL); } if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); pXDataMap->SetAt(PIPE_WH, dWh); pXDataMap->SetAt(PIPE_WN,dN); pXDataMap->SetAt(PIPE_WH2, dWh); pXDataMap->SetAt(PIPE_WN2,dN); if (pParamT != NULL) { TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),pParamT->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); pXDataMap->SetAt(PIPE_WH2, dWh); pXDataMap->SetAt(PIPE_WN2,dN); } } } pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); if (m_pPipeParam->m_app == WPipe::eDuct) pXDataMap->SetAt(KEY_RUNTIME, eDuctCross); else if (m_pPipeParam->m_app == WPipe::eBridge) pXDataMap->SetAt(KEY_RUNTIME, eBridgeCross); else pXDataMap->SetAt(KEY_RUNTIME, eCross); pXDataMap->SetAt(KEY_MAJBR,vtMaj); pXDataMap->SetAt(KEY_MINBR,vtMin);// vtNro = vtMaj.crossProduct(vtMin);// pXDataMap->SetAt(KEY_NORMAL,vtNro); pXDataMap->SetAt(KEY_MID,ptInt); pXDataMap->SetAt(KEY_L,dL * 2); pXDataMap->SetAt(KEY_T,dB * 2); pXDataMap->SetAt(PIPE_TDN,dTDn); pXDataMap->SetAt(PIPE_TOD,dTOD); pXDataMap->SetAt(KEY_Width,2.0); pXDataMap->SetAt(PIPE_BWELDDOT,0); pXDataMap->SetAt(PIPE_SYS,m_pPipeParam->szSys); CString sODNo = m_pPipeParam->szODSn; if (IsPlasticsMat(m_pPipeParam, sODNo)) { TDbPipeSupport::QueryPVCCrossData(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, dTDn, pXDataMap, sODNo); } //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); //pFitting->ReCreateByXDataMap(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMap,3); return TRUE; } return FALSE; } BOOL TDbPipeLine::AddTee(AcDbObjectId id1,AcGePoint3d& ptInt,AcDbObjectId idThis) { AecDbEwPipe* pWPipe = NULL; double dL = 0.0,dB = 0.0,dTDn,dTOD; AcGeVector3d vtMaj,vtMin,vtNorm; if ( TDbPipeSupport::QueryTeeData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dDN,dL,dB) ) { if (m_pPipeParam->m_dInterfaceL > 1.e-3)//法兰管 { dL += m_pPipeParam->m_dInterfaceL; dB += m_pPipeParam->m_dInterfaceL; } if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5)//法兰连接 { //[法兰外径],[法兰厚度],[法兰高度],[法兰颈] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dPress,dWD,dWh,dThk,dN); dL -= m_pPipeParam->m_dInterfaceL; dB -= m_pPipeParam->m_dInterfaceL; //颈法兰焊接方式 CString sDNo = m_pPipeParam->szODSn; if (sDNo.CompareNoCase(_T("S")) != 0 && sDNo.CompareNoCase(_T("GSF")) != 0) { dL += dWh; dB += dWh; } } // id1管子接近ptInt点 缩短 WPipe::PipeParam* pParm2 = NULL; AcDbEntity* pEnt1 = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt1,id1,AcDb::kForWrite)) { pWPipe = AecDbEwPipe::cast(pEnt1); if (pWPipe != NULL) { pParm2 = pWPipe->GetPipeParam(); if ( ( pParm2->m_dDN - m_pPipeParam->m_dDN) < 1.e-2 )//分支管子小于主管 { vtMin = pWPipe->EndPoint() - pWPipe->StartPoint(); vtMin.normalize(); double dDis1 = ptInt.distanceTo(pWPipe->StartPoint()); double dDis2 = ptInt.distanceTo(pWPipe->EndPoint()); if (dDis1 < dDis2)//距离sta近 { pWPipe->SetStartPoint(ptInt + vtMin * dB); } else { pWPipe->SetEndPoint(ptInt - vtMin * dB); vtMin.negate(); } } } pEnt1->close(); } //idThis 管分割为两部分 if ( (pParm2->m_dDN - m_pPipeParam->m_dDN) < 1.e-2) //分支管子小于主管 { AcDbEntity* pEnt2 = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEnt2,idThis,AcDb::kForWrite)) { pWPipe = AecDbEwPipe::cast(pEnt2); if (pWPipe != NULL) { pWPipe->GetSpecialtyData(AcDb::kForWrite)->GetAt(PIPE_TDN,dTDn); pWPipe->GetSpecialtyData(AcDb::kForWrite)->GetAt(PIPE_TOD,dTOD); vtMaj = pWPipe->EndPoint() - pWPipe->StartPoint(); AcGeLineSeg3d ln(pWPipe->StartPoint(),pWPipe->EndPoint()); if (ln.isOn(ptInt)) //落在管子上,两管线相交 { if ( !SplitWPipe(ptInt,dB,pWPipe,FALSE) ) { //太短,放不下四通 pEnt2->close(); delete pParm2; return FALSE; } } } pEnt2->close(); } } if ( (pParm2->m_dDN - m_pPipeParam->m_dDN) < 1.e-2) //分支管子小于主管 { //加入Tee vtMaj.normalize(); vtMin.normalize(); AecInterface inf; inf.ptPos = ptInt - vtMaj * dL; inf.vtDir = vtMaj; inf.dSize1 = pParm2->m_dDN; inf.dSize2 = pParm2->m_dOD; vtNorm = vtMin.crossProduct(vtMaj); return AddTee(inf,vtNorm,vtMin,dL,dB); } } else //焊接方式,加补强圈 { } return FALSE; } BOOL TDbPipeLine::AddElbow(AcDbObjectId id1,AcGePoint3d& ptGe,AcDbObjectId idThis) { AecDbEwPipe* pWPipe1 = NULL; AecDbEwPipe* 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 = AecDbEwPipe::cast(pEnt1); pWPipe2 = AecDbEwPipe::cast(pEnt2); if (pWPipe1 != NULL && pWPipe2 != NULL) { AcGeLine3d ln1(pWPipe1->StartPoint(),pWPipe1->EndPoint()); AcGeLine3d ln2(pWPipe2->StartPoint(),pWPipe2->EndPoint()); AcGePoint3d ptMid = ptGe; if ( ln1.intersectWith(ln2,ptMid) ) { ptGe = ptMid;//?? } else { pEnt1->close(); pEnt2->close(); return FALSE; } WPipe::PipeParam param1,param2; AecDbObjXDataMap* pXDatamap1 = NULL; AecDbObjXDataMap* pXDatamap2 = NULL; pXDatamap1 = pWPipe1->GetSpecialtyData(); pXDatamap2 = pWPipe2->GetSpecialtyData(); TDbPipeSupport::XData2PipeParam(¶m1,pXDatamap1); TDbPipeSupport::XData2PipeParam(¶m2,pXDatamap2); 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(); 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.m_dDN - param2.m_dDN) < 1.e-3) { //创建弯头,是插入到当前管子的接口记录的前面 AcDbObjectId id = CreateElbow(vtMaj,ptMid,vtMin,¶m1,TRUE); //获取万头接口,改变边的管子 AcDbEntity* pEnt3 = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt3,id,AcDb::kForRead)) { AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt3); if (pFit != NULL) { AecInterface inf1,inf2; pFit->GetInterface(0,inf1); pFit->GetInterface(1,inf2); AcGeVector3d vtPipe = pWPipe1->EndPoint() - pWPipe1->StartPoint(); 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 TDbPipeLine::ChangeElbowToTree(AecDbEwFitting* pDbFit,AcGeVector3d vtMaj,AcGePoint3d ptGeM,AcGeVector3d vtMin, double dDn,AECStatusRecord* pCurRec) { //查询 Tee 数据 WPipe::PipeParam param; AecDbObjXDataMap* pXDataMapmaj = pDbFit->GetSpecialtyData(); TDbPipeSupport::XData2PipeParam(¶m,pXDataMapmaj); double dL = 0.0,dS = 0.0; if ( TDbPipeSupport::QueryTeeData( m_pPipeJig->GetAdoDb(), dDn,dDn,dL,dS) ) { double dInterfaceL = 0.0; pXDataMapmaj->GetAt(PIPE_INTERFACEL,dInterfaceL); if (dInterfaceL > 1.e-3)//法兰管 { dL += dInterfaceL; dS += dInterfaceL; } AecInterface intf1,intf2; pDbFit->GetInterface(0,intf1); pDbFit->GetInterface(1,intf2); //创建三通 AecDbEwFitting* pFitting = new AecDbEwFitting; AecDbObjXDataMap* pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap,m_pPipeParam); pXDataMap->SetAt(KEY_FITSRV,KEY_FITWPIPE); if (m_pPipeParam->m_app == WPipe::eDuct) pXDataMap->SetAt(KEY_RUNTIME, eDuctTee); else if (m_pPipeParam->m_app == WPipe::eBridge) pXDataMap->SetAt(KEY_RUNTIME, eBridgeTee); else pXDataMap->SetAt(KEY_RUNTIME, eTee); vtMaj.normalize(); pXDataMap->SetAt(KEY_MAJBR,vtMaj); vtMin.normalize(); pXDataMap->SetAt(KEY_MINBR,vtMin); AcGeVector3d vtNro = vtMin.crossProduct(vtMaj); pXDataMap->SetAt(KEY_NORMAL,vtNro); pXDataMap->SetAt(KEY_MID,ptGeM); pXDataMapmaj->GetAt(PIPE_DN,dDn); pXDataMap->SetAt(PIPE_DN,dDn); pXDataMap->SetAt(PIPE_OD,param.m_dOD); pXDataMap->SetAt(PIPE_TDN,dDn); pXDataMap->SetAt(PIPE_TOD,param.m_dOD); pXDataMap->SetAt(PIPE_THICK,param.m_dThick); pXDataMap->SetAt(KEY_L,dL); pXDataMap->SetAt(KEY_T,dS); double dWidth = 1.0; pXDataMapmaj->GetAt(KEY_Width,dWidth); pXDataMap->SetAt(KEY_Width,dWidth); int nDir = 0; pXDataMapmaj->GetAt(PIPE_BWELDDOT,nDir); pXDataMap->SetAt(PIPE_BWELDDOT,nDir); pXDataMapmaj->GetAt(DOC_WELDDIA,dWidth); pXDataMap->SetAt(DOC_WELDDIA,dWidth); CString strTemp,sMaterial; pXDataMap->SetAt(KEY_TYPE,_T("GBTEE")); pXDataMapmaj->GetAt(PIPE_MATERIAL,sMaterial); pXDataMap->SetAt(PIPE_MATERIAL,sMaterial); pXDataMapmaj->GetAt(PIPE_MATERIALFT,sMaterial); pXDataMap->SetAt(PIPE_MATERIALFT,sMaterial); if (m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) { pXDataMapmaj->GetAt(PIPE_INTERFACEL,dWidth); pXDataMap->SetAt(PIPE_INTERFACEL,dWidth); pXDataMapmaj->GetAt(PIPE_INTERFACED,dWidth); pXDataMap->SetAt(PIPE_INTERFACED,dWidth); } //设置图层 SetFittingLayer(pFitting, param.szSys); //pFitting->ReCreateByXDataMap(); //可能的几种修改,更改弯头两头的管子的位置 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(); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id,pXDataMapmaj,2); // AECStatusRecord* pRecMid = new AECStatusRecord; pRecMid->CopyFrom(pCurRec); ptGe = ptGeM + vtMaj * dL; pRecMid->SetAcquirePoint(ptGe); m_pPipeJig->PushBackStatusRec(pRecMid); return TRUE; } else//焊接方式,加补强圈 { } return FALSE; } BOOL TDbPipeLine::ChangeTeeToCross(AecDbEwFitting* pDbFit,AcGeVector3d& vtMaj,AcGeVector3d& vtMin,AECStatusRecord* pCurRec) { CString sDNo = m_pPipeParam->szODSn; IsPlasticsMat(m_pPipeParam, sDNo); double dL = 0.0,dB = 0.0; TDbPipeSupport::QueryCrossData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,m_pPipeParam->m_dDN,dL,dB); AecDbObjXDataMap* pXDataMap = pDbFit->GetSpecialtyData(); double dInterfaceL = 0.0; pXDataMap->GetAt(PIPE_INTERFACEL,dInterfaceL); if (dInterfaceL > 1.e-3)//法兰管 { dL += dInterfaceL; dB += dInterfaceL; } if (m_pPipeParam->m_app == WPipe::eDuct) pXDataMap->SetAt(KEY_RUNTIME, eDuctCross); else if (m_pPipeParam->m_app == WPipe::eBridge) pXDataMap->SetAt(KEY_RUNTIME, eBridgeCross); else 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); pXDataMap->SetAt(PIPE_TDN,m_pPipeParam->m_dDN); pXDataMap->SetAt(PIPE_TOD,m_pPipeParam->m_dOD); AcGePoint3d ptMid; pXDataMap->GetAt(KEY_MID,ptMid); //pDbFit->ReCreateByXDataMap(); if (IsPlasticsMat(m_pPipeParam, sDNo)) { TDbPipeSupport::QueryPVCCrossData(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, m_pPipeParam->m_dDN, pXDataMap, sDNo); } vtMin.normalize(); AcGePoint3d ptGe = ptMid - vtMin * dB; AECStatusRecord* pRecMid = new AECStatusRecord; pRecMid->CopyFrom(pCurRec); pRecMid->SetAcquirePoint(ptGe); m_pPipeJig->PushBackStatusRec(pRecMid); return TRUE; } void TDbPipeLine::ModifyPipeOfElbow(AcDbObjectId id,AcGePoint3d ptOld,AcGePoint3d ptNew) { AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt); if (pPipe != NULL) { AcGePoint3d ptGeT; AcGeVector3d vtPipe = pPipe->EndPoint() - pPipe->StartPoint(); if ( pPipe->EndPoint().distanceTo(ptOld) < 1.e-3) { ptGeT = pPipe->EndPoint(); pPipe->SetEndPoint(ptNew); } if (pPipe->StartPoint().distanceTo(ptOld) < 1.e-3) { ptGeT = pPipe->StartPoint(); pPipe->SetStartPoint(ptNew); } } pEnt->close(); } } BOOL TDbPipeLine::Add2Flange(AcGePoint3d& ptMid,double dSpaceHalf,double dPressure,AcGeVector3d& vtDir,CStringArray& arValuesG, CString& sEndF1, CString & sEndF2) { if (m_pPipeJig == NULL) return FALSE; //[法兰外径],[法兰厚度],[法兰高度] double dWD = 0.0,dWh = 0.0,dThk = 0.0,dN = 0.0; TDbPipeSupport::QueryFlangData(m_pPipeJig->GetAdoDb(),m_pPipeParam->m_dDN,dPressure,dWD,dWh,dThk,dN); dThk = dWh;//默认一律不带颈 AcGePoint3d ptGe1 = ptMid + vtDir * dSpaceHalf; AcGeVector3d vtMaj = vtDir; vtMaj.negate(); Add1Flange(ptGe1,vtMaj,dWD,dWh,dThk,dN,arValuesG,sEndF1); ptGe1 = ptMid - vtDir * dSpaceHalf; vtMaj = vtDir; Add1Flange(ptGe1,vtMaj,dWD,dWh,dThk,dN,arValuesG,sEndF2); return TRUE; } BOOL TDbPipeLine::Add2Flange(AcGePoint3d &ptMid, double dWD, double dWh, double dSpaceHalf,double dThk, double dN, AcGeVector3d &vtDir,CStringArray &arValuesG, CString &sEndF1, CString &sEndF2) { AcGePoint3d ptGe1 = ptMid + vtDir * dSpaceHalf; AcGeVector3d vtMaj = vtDir; vtMaj.negate(); Add1Flange(ptGe1, vtMaj, dWD, dWh, dThk, dN, arValuesG,sEndF1); ptGe1 = ptMid - vtDir * dSpaceHalf; vtMaj = vtDir; Add1Flange(ptGe1, vtMaj, dWD, dWh, dThk, dN, arValuesG,sEndF2); return TRUE; } BOOL TDbPipeLine::Add1Flange(AcGePoint3d ptSta,AcGeVector3d vtMaj,double dWD,double dWh,double dThk,double dN, CStringArray& arValuesG,CString& sEndF,BOOL bIsMangBan/* = false*/) { AecDbEwFitting* pFlange = new AecDbEwFitting; AecDbObjXDataMap* pXDataMapF = pFlange->GetSpecialtyData(); FillConfigXDataMap(pXDataMapF,m_pPipeParam); pXDataMapF->SetAt(KEY_FITSRV,KEY_FITWPIPE); pXDataMapF->SetAt(KEY_RUNTIME,eFlange); pXDataMapF->SetAt(KEY_MAJBR,vtMaj); pXDataMapF->SetAt(KEY_NORMAL,AcGeVector3d::kZAxis); pXDataMapF->SetAt(PIPE_DRAWDIR,m_pPipeParam->m_eD); //绘制类型 //pXDataMapF->SetAt(KEY_2DSTYLE,1); //单线 pXDataMapF->SetAt(KEY_2DSTYLE, PipelineTools::isDoubleLine(dN) ? 2 : 1); pXDataMapF->SetAt(PIPE_DN,m_pPipeParam->m_dDN); pXDataMapF->SetAt(PIPE_N,dN); pXDataMapF->SetAt(PIPE_OD,m_pPipeParam->m_dOD); pXDataMapF->SetAt(PIPE_WD,dWD); //发兰盘外径 pXDataMapF->SetAt(PIPE_WTHICK,dWh); //大盘面厚度 pXDataMapF->SetAt(PIPE_THICK, dWh);//总厚 pXDataMapF->SetAt(KEY_START,ptSta); pXDataMapF->SetAt(KEY_GRIPCMD, GRIP_CMD); pXDataMapF->SetAt(PIPE_SYS,m_pPipeParam->szSys); pXDataMapF->SetAt(PIPE_FLANGF, sEndF); //市政法兰不带颈画法 pXDataMapF->SetAt(KEY_FLANGNECK,(m_pPipeParam->m_nConnectType == 3 || m_pPipeParam->m_nConnectType == 5) ? FALSE : TRUE); //盲板不带颈 if (bIsMangBan) { pXDataMapF->SetAt(KEY_FLANGNECK,FALSE); } //根据等级->法兰标准号 TDbPipeSupport::QueryFlangSpec(m_pPipeJig->GetAdoDb(), m_pPipeParam->m_dDN, m_pPipeParam->m_dPress,m_pPipeParam->szLevel, pXDataMapF); //垫片 /* (0,_T("公称直径"),LVCFMT_LEFT,100,80); (1,_T("材质"),LVCFMT_LEFT,100,80); (2,_T("压力"),LVCFMT_LEFT,50,50); (3,_T("垫片厚度"),LVCFMT_LEFT,50,50); (4,_T("描述"),LVCFMT_LEFT,200,200); */ if (arValuesG.GetCount() > 4) { pXDataMapF->SetAt(PIPE_GASKETM, arValuesG.GetAt(1)); pXDataMapF->SetAt(PIPE_PRESSURE, _ttof(arValuesG.GetAt(2))); pXDataMapF->SetAt(PIPE_GASKET, _ttof(arValuesG.GetAt(3))); pXDataMapF->SetAt(PIPE_GASKETDSC, arValuesG.GetAt(4)); } pXDataMapF->SetAt(KEY_FLANGSLAB,bIsMangBan); //设置图层 SetFittingLayer(pFlange, m_pPipeParam->szSys); setInfo2Ent(*pXDataMapF); AcDbObjectId id = AddFitToModelSpace(pFlange); AddUserData(id,pXDataMapF,4); m_idTemp = id; return TRUE; } double TDbPipeLine::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; } //8字盲板 BOOL TDbPipeLine::AddSBFlange(CString& sLevel,double dDn,AcGePoint3d &ptOn,const AcGeVector3d& vtMaj,BOOL bIsMB) { AecDbEwFitting *pFitting = new AecDbEwFitting; AecDbObjXDataMap *pXDataMap = pFitting->GetSpecialtyData(); FillConfigXDataMap(pXDataMap, m_pPipeParam); //先到等级中查询 double dPress = 1.0; if (!TDbPipeSupport::QuerySBFSpec(m_pPipeJig->GetAdoDb(), sLevel, dDn, pXDataMap)) { delete pFitting; acutPrintf(_T("\n没有查询到公称直径%d 等级%s的八字盲板等级记录!"), (int)(dDn + 0.5), sLevel); return FALSE; } //盲板表 pXDataMap->GetAt(PID_PIPE_DPRESS,dPress); if ( !TDbPipeSupport::QuerySBFlange(m_pPipeJig->GetAdoDb(),dDn, dPress, pXDataMap)) { delete pFitting; acutPrintf(_T("\n没有查询到公称直径%d 压力%.1f 八字盲板数据!创建失败!"),(int)(dDn+0.5),dPress); return FALSE; } //TDbPipeSupport::QueryGasketData(pDb, dDn,sLevel, pXDataMap); //m_mapSpecXData.GetAt(PIPE_GASKET, dGasket); pXDataMap->SetAt(PIPE_GASKET, 1.5); double dThk = 0.0; pXDataMap->GetAt(PIPE_THICK, dThk);//总厚 pXDataMap->SetAt(KEY_FITSRV, KEY_FITWPIPE); pXDataMap->SetAt(KEY_RUNTIME, eSPB); pXDataMap->SetAt(KEY_KIND, bIsMB); AcGeVector3d vtMin = vtMaj.perpVector(); AcGeLine3d ln(AcGePoint3d(100,100,100),vtMaj); if (ln.isParallelTo(AcGePlane::kXYPlane)) { vtMin = vtMaj; vtMin.rotateBy(PI / 2.0, AcGeVector3d::kZAxis); } pXDataMap->SetAt(KEY_MAJBR, vtMaj); pXDataMap->SetAt(KEY_MINBR, vtMin); pXDataMap->SetAt(KEY_MID, ptOn); pXDataMap->SetAt(PIPE_GASKET, 0.0); pXDataMap->SetAt(KEY_2DSTYLE, 1); CString sPro = _T("工业"); pXDataMap->GetAt(DOC_PROJECT, sPro); //管嘴 垫片 TDbPipeSupport::SetGasketData(m_pPipeJig->GetAdoDb(), 0, dDn, dPress, sPro, sLevel, pXDataMap); //设置图层 SetFittingLayer(pFitting, m_pPipeParam->szSys); setInfo2Ent(*pXDataMap); AcDbObjectId id = AddFitToModelSpace(pFitting); AddUserData(id, pXDataMap, 4); m_idTemp = id; return TRUE; }