// SSearchPipeList.cpp: implementation of the SSearchPipeList class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "tapi.h" #include #include #include #include #include #include #include "SSearchPipeList.h" #include "twtdef.h" #include "xtext.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CString I2Str(double i) { CString csText; i = i/1000; int iTmp = int(i * 1000) * 10; int iTmp2 = int(i * 10000); if(iTmp == iTmp2){ iTmp = int(i * 100) * 10; iTmp2 = int(i * 1000); if(iTmp == iTmp2) csText.Format(_T("%.2f"), i); else csText.Format(_T("%.3f"), i); } else csText.Format(_T("%.4f"), i); return csText; } double GetPipeGradient(Entity ent) { double nGradient(0); OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe); if(pPipe && !pPipe->IsVertical()){ nGradient = pPipe->GetPipeGradient(); if(nGradient > 10) //sr 2011-1-26 从大于1改为大于10,坡度还是有大于1的,但几乎没有大于10的。GetPipeGradient调的是小圆半径的值 nGradient = 0; } OPENOBJ_END(); return nGradient; } CString GetWellName(AcDbObjectId id) { CString csWellName; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbWell, pEquip); if(pEquip){ csWellName = pEquip->GetWellName(); } OPENOBJ_END(); return csWellName; } CString GetWellName(Entity ent) { CString csWellName; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbWell, pEquip); if(pEquip){ csWellName = pEquip->GetWellName(); } OPENOBJ_END(); return csWellName; } //差值法 小的值 大的值 小的范围 大的范围 原范围 double GetValBetween2(double n1, double n2, double nRange1, double nRange2, double nFactor) { if(n1 < 0 || n2 < 0) return -1; double nSmall = nRange1 < nRange2 ? nRange1 : nRange2; nRange1 = fabs(nRange1 - nRange2); nSmall = nFactor - nSmall; nSmall = nSmall/nRange1; double nRet = n1 < n2 ? n1 : n2; nRet = nRet + fabs(n1 - n2)*nSmall; return nRet; } BOOL IsAppandEquip(DList &lstNode, AcDbObjectId id) { OPENOBJ_BEGIN(id, AcDb::kForRead, TDbEquipment, pEquip); if(!pEquip){ return FALSE; } OPENOBJ_END(); int len = lstNode.Length(); int Index = -1; for(int j=0;jGetLocation(); OPENOBJ_END(); return entPipe; } CString GetEquipBlkName(Entity ent) { CString csRet; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ const TCHAR *szBlkName = NULL; AcDbObjectId eqId = pEquip->GetBlock2d(); OPENOBJ_BEGIN(eqId, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord) pRecord->getName(szBlkName); OPENOBJ_END(); csRet = szBlkName; } OPENOBJ_END(); OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipeValve, pValve); if(pValve){ const TCHAR *szBlkName = NULL; AcDbObjectId eqId = pValve->GetBlock2d(); OPENOBJ_BEGIN(eqId, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord) pRecord->getName(szBlkName); OPENOBJ_END(); csRet = szBlkName; } OPENOBJ_END(); if(ent.Is(_T("INSERT"))){ TCHAR szBlkName[256]; ent.GetData(2, szBlkName); csRet = szBlkName; } return csRet; } BOOL GetEquipNameById(AcDbObjectId id, CString &csBlkName, CString &csDesName, int &iItem) { CString sDwbPath = g_sDwbPath; csBlkName = _T(""); if(IsEquipment(id)){ OPENOBJ_BEGIN(id, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ const TCHAR *szBlkName = NULL; AcDbObjectId eqId = pEquip->GetBlock2d(); OPENOBJ_BEGIN(eqId, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord) pRecord->getName(szBlkName); OPENOBJ_END(); csBlkName = szBlkName; // if(csBlkName.Find(_T("00000132")) > -1) //sr del 2012-9-19 不记得当初为什么加这个过滤 // return FALSE; if(_tcsicmp(csBlkName, _T("$TwtSys$00000434")) == 0){ // 单消火栓 正方形单一比例 XString xsTmp7; CString csDwb = sDwbPath + _T("Twtsys"); if(LoadDwbBlock(csDwb, _T("00000427"), xsTmp7) != RTNORM) //标准比例 return FALSE; csBlkName = xsTmp7; } else if(_tcsicmp(csBlkName, _T("$TwtSys$00000435")) == 0){// 双消火栓 正方形单一比例 XString xsTmp7; CString csDwb = sDwbPath + _T("Twtsys"); if(LoadDwbBlock(csDwb, _T("00000421"), xsTmp7) != RTNORM) //标准比例 return FALSE; csBlkName = xsTmp7; } CString csTKName, csRocord; //以下图块显示系统图块 if(_tcsicmp(csBlkName, _T("$TwtSys$00000225")) == 0 || // 给水点 _tcsicmp(csBlkName, _T("$TwtSys$00000172")) == 0 || // 淋浴头 _tcsicmp(csBlkName, _T("$TwtSys$00000125")) == 0) // 喷淋头 { csBlkName = pEquip->GetSysBlock(); XString xsTmp; if(LoadDwbBlock(csBlkName, xsTmp) != RTNORM) return TRUE; csBlkName = xsTmp; } if(_tcsicmp(szBlkName, _T("$TwtSys$00000125")) == 0){// 喷淋头 if(pEquip->IsHidePipe()){ csDesName = _T("直立型喷头"); XString xsTmp; if(LoadDwbBlock(_T("TwtSys(00000443)"), xsTmp) != RTNORM) return TRUE; csBlkName = xsTmp; } else csDesName = _T("下垂型喷头"); iItem = 2; return TRUE; } else if(_tcsicmp(szBlkName, _T("$TwtSys$00000128")) == 0){ csDesName = _T("上下喷头"); XString xsTmp; if(LoadDwbBlock(_T("TwtSys(00000444)"), xsTmp) != RTNORM) return TRUE; csBlkName = xsTmp; iItem = 2; return TRUE; } else if (_tcsicmp(szBlkName, _T("$TwtSys$00000529")) == 0) // cet 2014.9.17 add 水喷雾喷头 { csDesName = _T("水喷雾喷头"); iItem = 2; return TRUE; } else if (_tcsicmp(szBlkName, _T("$TwtSys$00000540")) == 0) // cet 2014.9.17 add 直立型水幕喷头 { csDesName = _T("直立型水幕喷头"); iItem = 2; return TRUE; } else if (_tcsicmp(szBlkName, _T("$TwtSys$00000541")) == 0) // cet 2014.9.17 add 下垂型水幕喷头 { csDesName = _T("下垂型水幕喷头"); iItem = 2; return TRUE; } else if (_tcsicmp(szBlkName, _T("$TwtSys$00000129")) == 0) // cet 2014.9.17 add 侧墙喷头 { csDesName = _T("侧墙喷头"); iItem = 2; return TRUE; } else if (_tcsicmp(szBlkName, _T("$TwtSys$00000131")) == 0) // cet 2014.9.17 add 侧喷喷头 { csDesName = _T("侧喷喷头"); iItem = 2; return TRUE; } if(csBlkName.Find(_T("$")) > -1){ SplitBlkStr(csBlkName, csTKName, csRocord); csTKName = sDwbPath + csTKName + _T(".tk"); csDesName = GetBlkDesName((const TCHAR*)csRocord, (const TCHAR*)csTKName); } //描述名中有(打断)或-000000283, 不需要给用户提供 int idx = csDesName.Find(_T("-")); if(idx > 0){ csDesName = csDesName.Left(idx); } int idx2 = csDesName.Find(_T("(")); if(idx2 > 0){ csDesName = csDesName.Left(idx2); } iItem = 2; if(csBlkName != _T("")) return TRUE; } OPENOBJ_END(); } else{ OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipeNode, pNode); if(pNode){ int num = pNode->GetInterfaceNum(); iItem = 3; if(num == 1) csDesName = _T("堵头"); else if(num == 2){ TPipeInterface face1; pNode->GetInterface(0, face1); AcDbObjectId nextPipeId = face1.m_idPipe; AcGeVector3d vt1, vt2; OPENOBJ_BEGIN(nextPipeId, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ XPoint ptS = pPipe->StartPoint(); XPoint ptE = pPipe->EndPoint(); vt1 = AcGeVector3d(ptE.x - ptS.x, ptE.y - ptS.y, ptE.z - ptS.z); } OPENOBJ_END(); TPipeInterface face2; pNode->GetInterface(1, face2); nextPipeId = face2.m_idPipe; OPENOBJ_BEGIN(nextPipeId, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ XPoint ptS = pPipe->StartPoint(); XPoint ptE = pPipe->EndPoint(); vt2 = AcGeVector3d(ptE.x - ptS.x, ptE.y - ptS.y, ptE.z - ptS.z); } OPENOBJ_END(); if(vt1.isParallelTo(vt2) == Adesk::kTrue) csDesName = _T("变径"); else csDesName = _T("弯头"); } else if(num == 3) csDesName = _T("三通"); else if(num == 4) csDesName = _T("四通"); else return FALSE; return TRUE; } OPENOBJ_END(); } return FALSE; } BOOL IsEquipment(AcDbObjectId id) { BOOL ret = FALSE; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) ret = TRUE; OPENOBJ_END(); return ret; } BOOL IsValve(AcDbObjectId id) { BOOL ret = FALSE; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipeValve, pEquip); if(pEquip) ret = TRUE; OPENOBJ_END(); return ret; } BOOL IsPipeLabel(AcDbObjectId id) { BOOL ret = FALSE; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipeLabel, pLabel); if(pLabel) ret = TRUE; OPENOBJ_END(); return ret; } BOOL IsWell(AcDbObjectId id) { CString csDesName, csBlkName; int iItem; GetEquipNameById(id, csBlkName, csDesName, iItem); if(csDesName.Find(_T("井")) < 0) return FALSE; AcDbObjectId idBlk = NULL; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbWell, pEquip); if(pEquip){ CString csName = pEquip->GetWellName(); if(csName != _T("")) return TRUE; } OPENOBJ_END(); return FALSE; } void GetAllPipeAndNodeByNode(AcDbObjectId nodeId, AcDbObjectId idFront, PickSet &ss) { OPENOBJ_BEGIN(nodeId, AcDb::kForRead, TDbPipeNode, pNode); if(pNode){ int num = pNode->GetInterfaceNum(); for(int i=0;iGetInterface(i, face); AcDbObjectId nextPipeId = face.m_idPipe; if(nextPipeId == NULL) continue; // OPENOBJ_BEGIN(nextPipeId, AcDb::kForRead, TDbPipe, pPipe); // if(pPipe){ // if(pPipe->Length() < pPipe->GetPScale()/20) // continue; // } // OPENOBJ_END();// 沈睿 remove it 2008-3-3 【喷淋管径】有时候有特短的管线 if(idFront == nextPipeId) continue; ss += nextPipeId; int len = ss.Length(); } } OPENOBJ_END(); } void GetAllPipeAndNodeByPipe(AcDbObjectId pipeId, AcDbObjectId idFront, PickSet &ss) { Entity entFront; OPENOBJ_BEGIN(pipeId, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ AcDbObjectId nodeId1(NULL), nodeId2(NULL); nodeId1 = pPipe->GetNode(0); nodeId2 = pPipe->GetNode(1); if(idFront != nodeId1 && !!nodeId1){ ss += nodeId1; } if(idFront != nodeId2 && !!nodeId2){ ss += nodeId2; } int len = ss.Length(); } OPENOBJ_END(); return; } BOOL IsSprinkler(Entity ent) { if(!ent) return FALSE; AcDbObjectId idBlk = NULL; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) idBlk = pEquip->GetBlock2d(); else return FALSE; OPENOBJ_END(); XString xsTmp1 = _T("$twtsys$00000125"); XString xsTmp2 = _T("$twtsys$00000128"); XString xsTmp3 = _T("$twtsys$00000129"); XString xsTmp4 = _T("$twtsys$00000131"); XString xsTmp5 = _T("$twtsys$00000283"); XString xsTmp6 = _T("$twtsys$00000126"); XString xsTmp7 = _T("$twtsys$00000130"); XString xsTmp8 = _T("$twtsys$00000529"); XString xsTmp9 = _T("$twtsys$00000540"); //CET 2012-1-6 ADD XString xsTmp10 = _T("$twtsys$00000541"); XString xsTmp11 = _T("$twtsys$00000542"); const TCHAR *szBlkName = NULL; OPENOBJ_BEGIN(idBlk, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord){ pRecord->getName(szBlkName); } OPENOBJ_END(); if(_tcsicmp(szBlkName, xsTmp2) == 0 || _tcsicmp(szBlkName, xsTmp1) == 0 || _tcsicmp(szBlkName, xsTmp4) == 0 || _tcsicmp(szBlkName, xsTmp3) == 0|| _tcsicmp(szBlkName, xsTmp7) == 0 ||_tcsicmp(szBlkName, xsTmp5) == 0 || _tcsicmp(szBlkName, xsTmp9) == 0 ||_tcsicmp(szBlkName, xsTmp10) == 0 ||_tcsicmp(szBlkName, xsTmp11) == 0 || _tcsicmp(szBlkName, xsTmp6) == 0 || _tcsicmp(szBlkName, xsTmp8) == 0) //是喷头 return TRUE; else return FALSE; } BOOL IsHydrant(Entity ent) { AcDbObjectId idBlk = NULL; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) idBlk = pEquip->GetBlock2d(); else return FALSE; OPENOBJ_END(); const TCHAR *szBlkName = NULL; OPENOBJ_BEGIN(idBlk, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord){ pRecord->getName(szBlkName); } OPENOBJ_END(); CString csTKName, csRocord; SplitBlkStr(szBlkName, csTKName, csRocord); CString sDwbPath = g_sDwbPath; csTKName = sDwbPath + csTKName + _T(".tk"); CString csDesName = GetBlkDesName((const TCHAR*)csRocord, (const TCHAR*)csTKName); if(csDesName.Find(_T("消火栓")) > -1) return TRUE; return FALSE; } BOOL IsHydrant(AcDbObjectId idNode) { if(!idNode) return FALSE; AcDbObjectId idBlk = NULL; OPENOBJ_BEGIN(idNode, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) idBlk = pEquip->GetBlock2d(); else return FALSE; OPENOBJ_END(); const TCHAR *szBlkName = NULL; OPENOBJ_BEGIN(idBlk, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord){ pRecord->getName(szBlkName); } OPENOBJ_END(); CString csTKName, csRocord; SplitBlkStr(szBlkName, csTKName, csRocord); CString sDwbPath = g_sDwbPath; csTKName = sDwbPath + csTKName + _T(".tk"); CString csDesName = GetBlkDesName((const TCHAR*)csRocord, (const TCHAR*)csTKName); if(csDesName.Find(_T("系统消火栓")) > -1) return FALSE; if(csDesName.Find(_T("室外消火栓")) > -1) return FALSE; if(csDesName.Find(_T("消火栓")) > -1) return TRUE; return FALSE; } BOOL IsSysSprinkler(AcDbObjectId idNode) { if(!idNode) return FALSE; AcDbObjectId idBlk = NULL; OPENOBJ_BEGIN(idNode, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) idBlk = pEquip->GetBlock2d(); else return FALSE; OPENOBJ_END(); XString xsTmp1 = _T("$twtsys$00000126"); XString xsTmp2 = _T("$twtsys$00000283"); XString xsTmp3 = _T("$twtsys$00000130"); XString xsTmp4 = _T("$twtsys$00000542"); //CET 2012-1-6 ADD const TCHAR *szBlkName = NULL; OPENOBJ_BEGIN(idBlk, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord){ pRecord->getName(szBlkName); } OPENOBJ_END(); if(_tcsicmp(szBlkName, xsTmp2) == 0 || _tcsicmp(szBlkName, xsTmp1) == 0 || _tcsicmp(szBlkName, xsTmp3) == 0 || _tcsicmp(szBlkName, xsTmp4) == 0) //是喷头 return TRUE; else return FALSE; } BOOL IsSprinkler(AcDbObjectId idNode) { if(!idNode) return FALSE; AcDbObjectId idBlk = NULL; OPENOBJ_BEGIN(idNode, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) idBlk = pEquip->GetBlock2d(); else return FALSE; OPENOBJ_END(); CString csTmp1 = _T("$twtsys$00000125"); CString csTmp2 = _T("$twtsys$00000128"); CString csTmp3 = _T("$twtsys$00000129"); CString csTmp4 = _T("$twtsys$00000131"); CString csTmp5 = _T("$twtsys$00000529"); CString csTmp6 = _T("$twtsys$00000540"); //CET 2012-1-6 ADD CString csTmp7 = _T("$twtsys$00000541"); const TCHAR *szBlkName = NULL; OPENOBJ_BEGIN(idBlk, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord){ pRecord->getName(szBlkName); } OPENOBJ_END(); CString csName = szBlkName; csName.MakeLower(); int ret1 = csName.Find(csTmp1); int ret2 = csName.Find(csTmp2); int ret3 = csName.Find(csTmp3); int ret4 = csName.Find(csTmp4); int ret5 = csName.Find(csTmp5); int ret6 = csName.Find(csTmp6); int ret7 = csName.Find(csTmp7); if(ret1 > -1 || ret2 > -1 || ret3 > -1 || ret4 > -1 || ret5 > -1 || ret6 > -1 || ret7 > -1) return TRUE; else return FALSE; // if(_tcsicmp(szBlkName, xsTmp2) == 0 || _tcsicmp(szBlkName, xsTmp1) == 0 || // _tcsicmp(szBlkName, xsTmp4) == 0 || _tcsicmp(szBlkName, xsTmp3) == 0) //是喷头 // return TRUE; // else // return FALSE; } BOOL IsPlanHydrant(AcDbObjectId idNode) { if(!idNode) return FALSE; AcDbObjectId idBlk = NULL; OPENOBJ_BEGIN(idNode, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) idBlk = pEquip->GetBlock2d(); else return FALSE; OPENOBJ_END(); XString xsTmp1 = _T("$twtsys$00000386"); XString xsTmp2 = _T("$twtsys$00000383"); const TCHAR *szBlkName = NULL; OPENOBJ_BEGIN(idBlk, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord){ pRecord->getName(szBlkName); } OPENOBJ_END(); if(_tcsicmp(szBlkName, xsTmp2) == 0 || _tcsicmp(szBlkName, xsTmp1) == 0) return TRUE; else return FALSE; } BOOL IsPool(AcDbObjectId idNode) { if(!idNode) return FALSE; AcDbObjectId idBlk = NULL; OPENOBJ_BEGIN(idNode, AcDb::kForRead, TDbPool, pEquip); if(pEquip) return TRUE; else return FALSE; OPENOBJ_END(); } BOOL IsPool_old(AcDbObjectId idNode) { if(!idNode) return FALSE; AcDbObjectId idBlk = NULL; OPENOBJ_BEGIN(idNode, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) idBlk = pEquip->GetBlock2d(); else return FALSE; OPENOBJ_END(); XString xsTmp1 = _T("$twtsys$00000353"); XString xsTmp2 = _T("$twtsys$00000354"); XString xsTmp3 = _T("$twtsys$00000355"); XString xsTmp4 = _T("$twtsys$00000356"); XString xsTmp5 = _T("$twtsys$00000357"); XString xsTmp6 = _T("$twtsys$00000399"); const TCHAR *szBlkName = NULL; OPENOBJ_BEGIN(idBlk, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord){ pRecord->getName(szBlkName); } OPENOBJ_END(); if(_tcsicmp(szBlkName, xsTmp2) == 0 || _tcsicmp(szBlkName, xsTmp1) == 0 || _tcsicmp(szBlkName, xsTmp5) == 0 || _tcsicmp(szBlkName, xsTmp4) == 0 || _tcsicmp(szBlkName, xsTmp3) == 0 || _tcsicmp(szBlkName, xsTmp6) == 0) return TRUE; else return FALSE; } int GetNodeType(Entity ent) { if(ent.Is(_T("ATS_PIPE")) || ent.Is(_T("ATS_PIPECANAL"))) return 0; else if(ent.Is(_T("ATS_WELL"))) return 3; else if(ent.Is(_T("ATS_EQUIPMENT"))){ AcDbObjectId id = NULL; acdbGetObjectId(id, ent); if(IsSprinkler(id) || IsSysSprinkler(id) || IsPlanHydrant(id)) return 2; // if(IsPool(id)) // return 4; // else return -1; } else if(ent.Is(_T("ATS_POOL"))) return 4; else if(ent.Is(_T("ATS_PIPEFITTING"))) return 1; else return -1; } BOOL SearchSprinkPipeSys(Entity ent, AcDbObjectId idFront, SSearchPipeList *pListAll, PickSet &ssAll) { AcDbObjectId id = NULL; acdbGetObjectId(id, ent); pListAll->m_ID = id; AcDbObjectIdArray idArray; int len(0); { PickSet ss(SS_FREE); if(ent.Is(_T("ATS_PIPE")) || ent.Is(_T("ATS_PIPECANAL"))) GetAllPipeAndNodeByPipe(id, idFront, ss); else GetAllPipeAndNodeByNode(id, idFront, ss); for(long j=0;j 0){ PickSet ssLoop(SS_FREE); ssLoop += entTmp; //发现有回路,一直顺着头找所有的选择集,并把他们亮显 SSearchPipeList *pNode = NULL; if(pListAll->m_pPrevious != NULL) pNode = pListAll->m_pPrevious; while(pNode != NULL){ ssLoop += pNode->m_ID; if(pNode->m_pPrevious != NULL) pNode = pNode->m_pPrevious; else break; } ssLoop.Redraw(3); return FALSE; } } ssAll += ss; len = ss.Length(); for(long i=0;im_ID = idTmp; pList->m_iType = GetNodeType(entTmp); pList->m_pPrevious = pListAll; pListAll->m_lstNode.Append(pList); if(!SearchSprinkPipeSys(entTmp, id, pList, ssAll)){ return FALSE; } } return TRUE; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //给排水,喷淋,给水 计算 //具体本节点进行标注 BOOL DoDimSerialNumber(AcDbObjectId id, int idx) { InitLayer(LAY_CALC_TEXT); InitTwtTextStyle(g_csTwtDimStyle); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipeNode, pNode); if(pNode){ CString csText; csText.Format(_T("%d"), idx); XPoint pt = pNode->GetLocation(); XPoint ptText; double nDist = DocGetPScale(); if(IsWell(id)) nDist = nDist * g_nWellRadius / 2; //如果标注井,距离就大些 ads_polar(pt, PI/2, nDist, ptText); ads_polar(ptText, 0, nDist, ptText); XText text(csText, ptText, g_nTwtDimHeight * DocGetPScale(), g_nDimScale, g_csTwtDimStyle, LAY_CALC_TEXT); text.Draw(); return TRUE; } OPENOBJ_END(); return FALSE; } //管道标注 void DoDimPipeSerialNumber(SSearchPipeList *pListAll) { if(pListAll->m_iType == 0){ CString csNum1 = pListAll->m_pPrevious->m_csName; if(!pListAll->m_pPrevious->m_pPrevious && csNum1 == _T("")) csNum1 = _T("末端"); int len2 = pListAll->m_lstNode.Length(); CString csNum2; if(len2 > 0) csNum2 = pListAll->m_lstNode[0]->m_csName; if(csNum1 != _T("") && csNum2 != _T("")) pListAll->m_csName = csNum2 + _T("-") + csNum1; } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; DoDimPipeSerialNumber(pList); } } //得到最末祖先的节点编号, 为了排序 int GetAncestorSerial(SSearchPipeList *pListLast) { int idx(0); if(pListLast->m_iType == 2 || pListLast->m_iType == 1){ //1:节点 2:喷头 if(pListLast->m_csName != _T("")){ idx = _ttoi(pListLast->m_csName); return idx; } } if(pListLast->m_pPrevious) idx = GetAncestorSerial(pListLast->m_pPrevious); return idx; } //得到最先祖先的节点编号, 最靠近主干管 int GetFirstAncestorSerial(SSearchPipeList *pListLast) { int idx(0); if(pListLast->m_iType == 2 || pListLast->m_iType == 1){ //1:节点 2:喷头 if(pListLast->m_csName != _T("")){ idx = _ttoi(pListLast->m_csName); if(pListLast->m_nDang == 255) return idx; } } if(pListLast->m_pPrevious) idx = GetFirstAncestorSerial(pListLast->m_pPrevious); return idx; } //计算本管线长度 void CalcPipeLength(SSearchPipeList *pListAll) { if(pListAll->m_iType == 0){ OPENOBJ_BEGIN(pListAll->m_ID, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ pListAll->m_nLength = pPipe->Length(); } OPENOBJ_END(); } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; CalcPipeLength(pList); } return; } //计算本节点往后共计管线长度 void CalcPipeLength2(SSearchPipeList *pListAll, SSearchPipeList *pListFront) { if(pListAll->m_iType == 0){ OPENOBJ_BEGIN(pListAll->m_ID, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ pListAll->m_nLength = pPipe->Length(); } OPENOBJ_END(); } if(pListFront) pListAll->m_nLength += pListFront->m_nLength; long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; pList->m_pPrevious = pListAll; CalcPipeLength2(pList, pListAll); } return; } //得到下一个标注节点 根据节点编号是否为空 //3个条件 SSearchPipeList *GetNextDimNode2(SSearchPipeList *pListAll, SSearchPipeList *pDisadvantage) { AcDbObjectId id = NULL; id = pListAll->m_ID; double nCurPipeLength(0); nCurPipeLength = pListAll->m_nLength; if(pListAll->m_csName == _T("") && pListAll->m_iType != 0){ int idx = GetFirstAncestorSerial(pListAll); if(pDisadvantage){ int idx2 = GetFirstAncestorSerial(pDisadvantage); if(idx < idx2){ //条件1: 当前节点的祖先编号小于临时节点的祖先编号 pDisadvantage = pListAll; } else if(idx == 0){ //条件2: if(pDisadvantage && nCurPipeLength > pDisadvantage->m_nLength) pDisadvantage = pListAll; } else if(idx == idx2){//条件3: 当前节点的祖先编号等于临时节点的祖先编号, 但离起始节点最远 int iParentIdx1 = GetAncestorSerial(pListAll); int iParentIdx2 = GetAncestorSerial(pDisadvantage); if(iParentIdx1 == iParentIdx2){ if(pDisadvantage && nCurPipeLength > pDisadvantage->m_nLength) pDisadvantage = pListAll; } else if(iParentIdx1 < iParentIdx2 || iParentIdx2 == idx2){ pDisadvantage = pListAll; } } } else pDisadvantage = pListAll; //条件3: 临时节点为空 } int len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; pDisadvantage = GetNextDimNode2(pList, pDisadvantage); } return pDisadvantage; } //本节点往前所有节点进行标注 int DoSerialNumber2(SSearchPipeList *pListLast, int idx) { AcDbObjectId id = NULL; id = pListLast->m_ID; if(pListLast->m_iType == 2 || pListLast->m_iType == 1 || pListLast->m_iType == -1){ if(pListLast->m_csName != _T("")) return idx; pListLast->m_csName.Format(_T("%d"), idx); if(DoDimSerialNumber(id, idx)) idx++; else return idx; } if(pListLast->m_pPrevious) idx = DoSerialNumber2(pListLast->m_pPrevious, idx); return idx; }