#include "stdafx.h" #include "DbPipeLabel.h" #include "DbPipe.h" #include "PipeTools.h" #include "acgiutil.h " #include "DbDoubleLinePipe.h" // 处理双击修改标注的辅助函数 cet 2014.6.3 add extern CString ReadXdata(const AcDbEntity*pEnt, const TCHAR*szName); namespace { // 从左侧开始寻找第一个数字 int FindFirstDigit(const CString &sText) { int nDigitIndex = -1; int nCount = sText.GetLength(); for (int i = 0; i < nCount; ++i) { TCHAR ch = sText.GetAt(i); if (ch >= _T('0') && ch <= _T('9')) { nDigitIndex = i; break; } } return nDigitIndex; } // 判断是否值修改改了管径值,如果是则dDn返回管径值 bool IsOnlyModifiedPipeDn(CString sNewText, CString sOldText, double &dDn) { int nIndex1 = sNewText.Find(_T("x")); int nIndex2 = sOldText.Find(_T("x")); if(nIndex1 == -1 && nIndex2 != -1 || nIndex1 != -1 && nIndex2 == -1) { return false; } if (nIndex1 != -1) // 外径标注如“φ50x2.8” { CString sRight1 = sNewText.Right(sNewText.GetLength() - nIndex1); CString sRight2 = sOldText.Right(sOldText.GetLength() - nIndex2); if (sRight1 != sRight2) { return false; } CString sLeft1 = sNewText.Left(nIndex1); CString sLeft2 = sOldText.Left(nIndex2); sNewText = sLeft1; sOldText = sLeft2; } // 从左侧寻找第一个数字 int nDigitIndex1 = FindFirstDigit(sNewText); int nDigitIndex2 = FindFirstDigit(sOldText); if (nDigitIndex1 == -1 || nDigitIndex2 == -1 || nDigitIndex1 != nDigitIndex2) { return false; } CString sLeft1 = sNewText.Left(nDigitIndex1); // 前缀 CString sLeft2 = sOldText.Left(nDigitIndex1); // 前缀 if (sLeft1 != sLeft2) // 修改了前缀值 { return false; } int nCount = sNewText.GetLength(); CString sDn = sNewText.Right(nCount - nDigitIndex1); // 管径 dDn = _tstof(sDn); return true; } // 标注文字类型 -1 未知 0 管径标注文字 1 管线文字 int DimTextType(TDbPipeText *pText) { int nType = pText->DimTextType(); if (nType != -1) { return nType; } // 未知情况继续分析 nType = 1; // 默认管线文字 CString sPipeText = pText->GetText(); OPENOBJ_BEGIN(pText->GetPipeId(), AcDb::kForRead, TDbPipe, pPipe) if (pPipe != NULL) { CString sPipeR; sPipeR.Format(_T("%.0f"),pPipe->GetDnDiameter()); if (sPipeText.Find(sPipeR) != -1) // 当做管径标注文字 { nType = 0; } } OPENOBJ_END() return nType; } //以下数据采用《钢制管件》02S403 P75 void GetFlangeDataByDn(int m_iPn, double m_dRetDn, double &m_nFlangeDn, double &m_nFlangeThick) { if(m_iPn == 0){ //0.25MPa if(fabs(m_dRetDn - 50) < 0.01){ m_nFlangeDn = 140; m_nFlangeThick = 12; } else if(fabs(m_dRetDn - 65) < 0.01){ m_nFlangeDn = 160; m_nFlangeThick = 14; } else if(fabs(m_dRetDn - 80) < 0.01){ m_nFlangeDn = 190; m_nFlangeThick = 14; } else if(fabs(m_dRetDn - 100) < 0.01){ m_nFlangeDn = 210; m_nFlangeThick = 14; } else if(fabs(m_dRetDn - 125) < 0.01){ m_nFlangeDn = 240; m_nFlangeThick = 14; } else if(fabs(m_dRetDn - 150) < 0.01){ m_nFlangeDn = 265; m_nFlangeThick = 16; } else if(fabs(m_dRetDn - 200) < 0.01){ m_nFlangeDn = 320; m_nFlangeThick = 18; } else if(fabs(m_dRetDn - 250) < 0.01){ m_nFlangeDn = 375; m_nFlangeThick = 22; } else if(fabs(m_dRetDn - 300) < 0.01){ m_nFlangeDn = 440; m_nFlangeThick = 22; } else if(fabs(m_dRetDn - 350) < 0.01){ m_nFlangeDn = 490; m_nFlangeThick = 22; } else if(fabs(m_dRetDn - 400) < 0.01){ m_nFlangeDn = 540; m_nFlangeThick = 22; } else if(fabs(m_dRetDn - 450) < 0.01){ m_nFlangeDn = 595; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 500) < 0.01){ m_nFlangeDn = 645; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 600) < 0.01){ m_nFlangeDn = 755; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 700) < 0.01){ m_nFlangeDn = 860; m_nFlangeThick = 26; } else if(fabs(m_dRetDn - 800) < 0.01){ m_nFlangeDn = 975; m_nFlangeThick = 26; } else if(fabs(m_dRetDn - 900) < 0.01){ m_nFlangeDn = 1075; m_nFlangeThick = 28; } else if(fabs(m_dRetDn - 1000) < 0.01){ m_nFlangeDn = 1175; m_nFlangeThick = 30; } else if(fabs(m_dRetDn - 1200) < 0.01){ m_nFlangeDn = 1375; m_nFlangeThick = 30; } else if(fabs(m_dRetDn - 1400) < 0.01){ m_nFlangeDn = 1575; m_nFlangeThick = 32; } else if(fabs(m_dRetDn - 1600) < 0.01){ m_nFlangeDn = 1790; m_nFlangeThick = 32; } else if(fabs(m_dRetDn - 1800) < 0.01){ m_nFlangeDn = 1990; m_nFlangeThick = 34; } else if(fabs(m_dRetDn - 2000) < 0.01){ m_nFlangeDn = 2190; m_nFlangeThick = 34; } } else if(m_iPn == 1){//0.6MPa if(fabs(m_dRetDn - 50) < 0.01){ m_nFlangeDn = 140; m_nFlangeThick = 16; } else if(fabs(m_dRetDn - 65) < 0.01){ m_nFlangeDn = 160; m_nFlangeThick = 16; } else if(fabs(m_dRetDn - 80) < 0.01){ m_nFlangeDn = 190; m_nFlangeThick = 18; } else if(fabs(m_dRetDn - 100) < 0.01){ m_nFlangeDn = 210; m_nFlangeThick = 18; } else if(fabs(m_dRetDn - 125) < 0.01){ m_nFlangeDn = 240; m_nFlangeThick = 20; } else if(fabs(m_dRetDn - 150) < 0.01){ m_nFlangeDn = 265; m_nFlangeThick = 20; } else if(fabs(m_dRetDn - 200) < 0.01){ m_nFlangeDn = 320; m_nFlangeThick = 22; } else if(fabs(m_dRetDn - 250) < 0.01){ m_nFlangeDn = 375; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 300) < 0.01){ m_nFlangeDn = 440; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 350) < 0.01){ m_nFlangeDn = 490; m_nFlangeThick = 26; } else if(fabs(m_dRetDn - 400) < 0.01){ m_nFlangeDn = 540; m_nFlangeThick = 28; } else if(fabs(m_dRetDn - 450) < 0.01){ m_nFlangeDn = 595; m_nFlangeThick = 28; } else if(fabs(m_dRetDn - 500) < 0.01){ m_nFlangeDn = 645; m_nFlangeThick = 30; } else if(fabs(m_dRetDn - 600) < 0.01){ m_nFlangeDn = 755; m_nFlangeThick = 30; } else if(fabs(m_dRetDn - 700) < 0.01){ m_nFlangeDn = 860; m_nFlangeThick = 32; } else if(fabs(m_dRetDn - 800) < 0.01){ m_nFlangeDn = 975; m_nFlangeThick = 32; } else if(fabs(m_dRetDn - 900) < 0.01){ m_nFlangeDn = 1075; m_nFlangeThick = 34; } else if(fabs(m_dRetDn - 1000) < 0.01){ m_nFlangeDn = 1175; m_nFlangeThick = 36; } else if(fabs(m_dRetDn - 1200) < 0.01){ m_nFlangeDn = 1405; m_nFlangeThick = 38; } else if(fabs(m_dRetDn - 1400) < 0.01){ m_nFlangeDn = 1630; m_nFlangeThick = 44; } else if(fabs(m_dRetDn - 1600) < 0.01){ m_nFlangeDn = 1830; m_nFlangeThick = 46; } else if(fabs(m_dRetDn - 1800) < 0.01){ m_nFlangeDn = 2045; m_nFlangeThick = 52; } else if(fabs(m_dRetDn - 2000) < 0.01){ m_nFlangeDn = 2265; m_nFlangeThick = 54; } } else if(m_iPn == 2){//1.0MPa if(fabs(m_dRetDn - 50) < 0.01){ m_nFlangeDn = 165; m_nFlangeThick = 18; } else if(fabs(m_dRetDn - 65) < 0.01){ m_nFlangeDn = 185; m_nFlangeThick = 20; } else if(fabs(m_dRetDn - 80) < 0.01){ m_nFlangeDn = 200; m_nFlangeThick = 20; } else if(fabs(m_dRetDn - 100) < 0.01){ m_nFlangeDn = 220; m_nFlangeThick = 22; } else if(fabs(m_dRetDn - 125) < 0.01){ m_nFlangeDn = 250; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 150) < 0.01){ m_nFlangeDn = 285; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 200) < 0.01){ m_nFlangeDn = 340; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 250) < 0.01){ m_nFlangeDn = 395; m_nFlangeThick = 26; } else if(fabs(m_dRetDn - 300) < 0.01){ m_nFlangeDn = 445; m_nFlangeThick = 28; } else if(fabs(m_dRetDn - 350) < 0.01){ m_nFlangeDn = 505; m_nFlangeThick = 28; } else if(fabs(m_dRetDn - 400) < 0.01){ m_nFlangeDn = 565; m_nFlangeThick = 30; } else if(fabs(m_dRetDn - 450) < 0.01){ m_nFlangeDn = 615; m_nFlangeThick = 30; } else if(fabs(m_dRetDn - 500) < 0.01){ m_nFlangeDn = 670; m_nFlangeThick = 32; } else if(fabs(m_dRetDn - 600) < 0.01){ m_nFlangeDn = 780; m_nFlangeThick = 36; } else if(fabs(m_dRetDn - 700) < 0.01){ m_nFlangeDn = 895; m_nFlangeThick = 36; } else if(fabs(m_dRetDn - 800) < 0.01){ m_nFlangeDn = 1015; m_nFlangeThick = 38; } else if(fabs(m_dRetDn - 900) < 0.01){ m_nFlangeDn = 1115; m_nFlangeThick = 42; } else if(fabs(m_dRetDn - 1000) < 0.01){ m_nFlangeDn = 1230; m_nFlangeThick = 44; } else if(fabs(m_dRetDn - 1200) < 0.01){ m_nFlangeDn = 1455; m_nFlangeThick = 48; } else if(fabs(m_dRetDn - 1400) < 0.01){ m_nFlangeDn = 1675; m_nFlangeThick = 54; } else if(fabs(m_dRetDn - 1600) < 0.01){ m_nFlangeDn = 1915; m_nFlangeThick = 62; } else if(fabs(m_dRetDn - 1800) < 0.01){ m_nFlangeDn = 2115; m_nFlangeThick = 66; } else if(fabs(m_dRetDn - 2000) < 0.01){ m_nFlangeDn = 2325; m_nFlangeThick = 72; } } else if(m_iPn == 3){//1.6MPa if(fabs(m_dRetDn - 50) < 0.01){ m_nFlangeDn = 165; m_nFlangeThick = 22; } else if(fabs(m_dRetDn - 65) < 0.01){ m_nFlangeDn = 185; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 80) < 0.01){ m_nFlangeDn = 200; m_nFlangeThick = 24; } else if(fabs(m_dRetDn - 100) < 0.01){ m_nFlangeDn = 220; m_nFlangeThick = 26; } else if(fabs(m_dRetDn - 125) < 0.01){ m_nFlangeDn = 250; m_nFlangeThick = 28; } else if(fabs(m_dRetDn - 150) < 0.01){ m_nFlangeDn = 285; m_nFlangeThick = 28; } else if(fabs(m_dRetDn - 200) < 0.01){ m_nFlangeDn = 340; m_nFlangeThick = 30; } else if(fabs(m_dRetDn - 250) < 0.01){ m_nFlangeDn = 405; m_nFlangeThick = 32; } else if(fabs(m_dRetDn - 300) < 0.01){ m_nFlangeDn = 460; m_nFlangeThick = 32; } else if(fabs(m_dRetDn - 350) < 0.01){ m_nFlangeDn = 520; m_nFlangeThick = 34; } else if(fabs(m_dRetDn - 400) < 0.01){ m_nFlangeDn = 580; m_nFlangeThick = 38; } else if(fabs(m_dRetDn - 450) < 0.01){ m_nFlangeDn = 640; m_nFlangeThick = 42; } else if(fabs(m_dRetDn - 500) < 0.01){ m_nFlangeDn = 715; m_nFlangeThick = 48; } else if(fabs(m_dRetDn - 600) < 0.01){ m_nFlangeDn = 840; m_nFlangeThick = 50; } ////////////////// pn 1。6MPA 没有以下管径,数据按1.0 else if(fabs(m_dRetDn - 700) < 0.01){ m_nFlangeDn = 895; m_nFlangeThick = 36; } else if(fabs(m_dRetDn - 800) < 0.01){ m_nFlangeDn = 1015; m_nFlangeThick = 38; } else if(fabs(m_dRetDn - 900) < 0.01){ m_nFlangeDn = 1115; m_nFlangeThick = 42; } else if(fabs(m_dRetDn - 1000) < 0.01){ m_nFlangeDn = 1230; m_nFlangeThick = 44; } else if(fabs(m_dRetDn - 1200) < 0.01){ m_nFlangeDn = 1450; m_nFlangeThick = 48; } else if(fabs(m_dRetDn - 1400) < 0.01){ m_nFlangeDn = 1675; m_nFlangeThick = 54; } else if(fabs(m_dRetDn - 1600) < 0.01){ m_nFlangeDn = 1915; m_nFlangeThick = 62; } else if(fabs(m_dRetDn - 1800) < 0.01){ m_nFlangeDn = 2115; m_nFlangeThick = 66; } else if(fabs(m_dRetDn - 2000) < 0.01){ m_nFlangeDn = 2325; m_nFlangeThick = 72; } } } } const Adesk::UInt8 TLabelStyle::g_nVersion = 1; TLabelStyle::TLabelStyle(): m_dTextHeight(3.5),m_dTextRotation(0) { } void TLabelStyle::CopyPropertiesFrom(AcDbEntity *pSrc,unsigned gMatchFlag) { TLabelStyle *pLabel = (TLabelStyle *)pSrc; if(pLabel) { m_idTextStyle = pLabel->m_idTextStyle; m_dTextHeight = pLabel->m_dTextHeight; m_dTextRotation = pLabel->m_dTextRotation; } } BOOL TLabelStyle::IsValid() const { return m_idTextStyle.isValid() && m_dTextHeight>1.0E-3; } Acad::ErrorStatus TLabelStyle::dwgInFields(AcDbDwgFiler* pFiler) { Acad::ErrorStatus es=Acad::eOk; Adesk::UInt8 nVer; pFiler->readItem(&nVer); if(nVer>g_nVersion) {// Version is too new return Acad::eMakeMeProxy; } pFiler->readItem(&m_idTextStyle); pFiler->readItem(&m_dTextHeight); pFiler->readItem(&m_dTextRotation); return pFiler->filerStatus(); } Acad::ErrorStatus TLabelStyle::dwgOutFields(AcDbDwgFiler* pFiler) const { Acad::ErrorStatus es=Acad::eOk; pFiler->writeItem(g_nVersion); pFiler->writeItem(m_idTextStyle); pFiler->writeItem(m_dTextHeight); pFiler->writeItem(m_dTextRotation); return pFiler->filerStatus(); } Acad::ErrorStatus TLabelStyle::dxfInFields(AcDbDxfFiler* pFiler) { Acad::ErrorStatus es=Acad::eOk; resbuf rb; while((es==Acad::eOk) && ((es=pFiler->readResBuf(&rb))==Acad::eOk)) { switch (rb.restype) { case AcDb::kDxfXReal: m_dTextHeight=rb.resval.rreal; break; default: pFiler->pushBackItem(); es = Acad::eEndOfFile; break; } } if(es!=Acad::eEndOfFile) return Acad::eInvalidResBuf; return pFiler->filerStatus(); } Acad::ErrorStatus TLabelStyle::dxfOutFields(AcDbDxfFiler* pFiler) const { Acad::ErrorStatus es=Acad::eOk; pFiler->writeDouble(AcDb::kDxfXReal,m_dTextHeight); return es; } Acad::ErrorStatus TLabelStyle::subTransformBy(const AcGeMatrix3d& xform) { AngleTransform(xform,m_dTextRotation);// 旋转角度 ScaleTransform(xform,m_dTextHeight);// 字高 return Acad::eOk; } ////////////////////////////////////////////////////////////////////////// ACRX_DXF_DEFINE_MEMBERS(ATSPipeLabel, ATSPipeAttachment, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,1,ATS_PIPELABEL, "ATS_PIPELABEL图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbPipeLabel); const Adesk::UInt8 TDbPipeLabel::g_nVersion = 1; TDbPipeLabel::TDbPipeLabel(): m_dDistToPipe(-300),m_typePipe(kCommon), m_dPipeWidth(-1),m_dPipeHeight(-1) { } void TDbPipeLabel::CopyPropertiesFrom(AcDbEntity *pSrc,unsigned gMatchFlag) { assertWriteEnabled(); TDbPipeAttachment::CopyPropertiesFrom(pSrc, gMatchFlag); TLabelStyle::CopyPropertiesFrom(pSrc, gMatchFlag); TDbPipeLabel *pLabel = TDbPipeLabel::cast(pSrc); if(pLabel) { m_dDistToPipe = pLabel->m_dDistToPipe; } } Acad::ErrorStatus TDbPipeLabel::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } BOOL TDbPipeLabel::IsValid() const { return TDbPipeAttachment::IsValid() && TLabelStyle::IsValid(); } Acad::ErrorStatus TDbPipeLabel::subGetOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& ptPick, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const { Acad::ErrorStatus es=Acad::eOk; if(osnapMode==AcDb::kOsModeIns || osnapMode==AcDb::kOsModeNode) { XPoint ptLabel=GetLabelLocation(); snapPoints.append(ptLabel); } es=TDbPipeAttachment::subGetOsnapPoints(osnapMode,gsSelectionMark, ptPick,lastPoint,viewXform,snapPoints,geomIds); return es; } // 从DWG读入数据: Acad::ErrorStatus TDbPipeLabel::dwgInFields(AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dwgInFields(pFiler); if(es!=Acad::eOk) return es; es = TLabelStyle::dwgInFields(pFiler); if(es!=Acad::eOk) return es; Adesk::UInt8 nVer; pFiler->readItem(&nVer); if(nVer>g_nVersion) {// Version is too new return Acad::eMakeMeProxy; } pFiler->readItem(&m_dDistToPipe); pFiler->readItem(&m_dPipeWidth); pFiler->readItem(&m_dPipeHeight); Adesk::UInt8 nVar=0; pFiler->readItem(&nVar); m_typePipe = (PipeType)((int)nVar); ReadString(pFiler, m_sLeftText); return pFiler->filerStatus(); } Acad::ErrorStatus TDbPipeLabel::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dwgOutFields(pFiler); if(es!=Acad::eOk) return es; es = TLabelStyle::dwgOutFields(pFiler); if(es!=Acad::eOk) return es; pFiler->writeItem(g_nVersion); pFiler->writeItem(m_dDistToPipe); pFiler->writeItem(m_dPipeWidth); pFiler->writeItem(m_dPipeHeight); pFiler->writeItem((Adesk::UInt8)((int)m_typePipe)); pFiler->writeItem((const TCHAR *)m_sLeftText); return pFiler->filerStatus(); } Acad::ErrorStatus TDbPipeLabel::dxfInFields(AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dxfInFields(pFiler); if(es!=Acad::eOk) return es; es = TLabelStyle::dxfInFields(pFiler); if(es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbPipeLabel"))) { return Acad::eBadDxfSequence; } return pFiler->filerStatus(); } Acad::ErrorStatus TDbPipeLabel::dxfOutFields(AcDbDxfFiler* pFiler) const { Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dxfOutFields(pFiler); assert(es == Acad::eOk); es = TLabelStyle::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbPipeLabel")); assert(es == Acad::eOk); return es; } double TDbPipeLabel::GetMinLabelTextLen() const { double nVal=0.0; TDbText text; text.setPropertiesFrom(this); XPoint ptLabel=GetLabelLocation(); text.SetStyleId(m_idTextStyle); text.SetText(GetLabelText()); text.SetRotation(0); text.SetLocation(ptLabel); text.SetHeight(m_dTextHeight); text.SetAlignment(XExplodeDraw::kMiddleCenter); XPoint ptExt=text.GetExtents(); nVal=max(nVal, ptExt.x); return nVal; } Acad::ErrorStatus TDbPipeLabel::ExplodeOrDraw2d(XExplodeDraw &dc) const { // cet 2016.10.17 add 图层关闭时,实体不显示,不进行绘制(打印时,也不会绘制) AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead); if (player.openStatus() == Acad::eOk && player->isOff()) { return Acad::eOk; } if(!IsValid()) return Acad::eInvalidInput; TDbText text; text.setPropertiesFrom(this); text.SetStyleId(m_idTextStyle); text.SetText(GetLabelText()); text.SetRotation(GetTextRotation()); XPoint ptLabel=GetLabelLocation(); text.SetLocation(ptLabel); text.SetHeight(m_dTextHeight); text.SetAlignment(XExplodeDraw::kMiddleCenter); text.ExplodeOrDraw2d(dc); return Acad::eOk; } XString TDbPipeLabel::GetLabelText() const { OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbPipe, pPipe); if (pPipe) { if(pPipe->GetSysType() == TPipeSys::kVRVMedia) { CString sTmp = _T("%%C"); CString sLabel = _T(""), sGasDn = _T(""),sLiqDn = _T(""),sDGasDn = _T(""); sLabel = pPipe->GetLabel(); // change by hh 2014.6.24 冷媒管增加两种分隔符 CString sSplit = _T(","); // int nStr = sLabel.Find(_T(",")); int nStr = sLabel.Find(sSplit); if(0 > nStr) { sSplit = _T("/"); nStr = sLabel.Find(sSplit); if(0 > nStr) { sSplit = _T(" "); nStr = sLabel.Find(sSplit); } } int nLength = sLabel.GetLength(); if (nStr < 0) return sLabel; //液管 sLiqDn = sLabel.Left(nStr); sGasDn = sLabel.Right(nLength - nStr - 1); // nStr = sGasDn.Find(_T(",")); nStr = sGasDn.Find(sSplit); nLength = sGasDn.GetLength(); //气管 if (nStr < 0) { // sLabel.Format(_T("%s%s,%s%s"),sTmp,sLiqDn,sTmp,sGasDn); sLabel.Format(_T("%s%s%s%s%s"),sTmp,sLiqDn,sSplit,sTmp,sGasDn); } //低压气管 else { CString sGasTmp = sGasDn; sGasDn = sGasTmp.Left(nStr); sDGasDn = sGasTmp.Right(nLength - nStr - 1); // sLabel.Format(_T("%s%s,%s%s,%s%s"),sTmp,sLiqDn,sTmp,sGasDn,sTmp,sDGasDn); sLabel.Format(_T("%s%s%s%s%s%s%s%s"),sTmp,sLiqDn,sSplit,sTmp,sGasDn,sSplit,sTmp,sDGasDn); } return sLabel; } } OPENOBJ_END(); CString csLabel = _T(""),csLabelTemp = _T(""); csLabelTemp = m_sLeftText; XString sLabel; CString csTmp; csTmp.Format(_T("%.0f"), m_dPipeWidth); if(m_typePipe == kCommon) { csLabel.Format(_T("%s%s"), csLabelTemp, csTmp); } else { csLabel = csLabelTemp; } sLabel = (const TCHAR*)csLabel; return sLabel; } void TDbPipeLabel::GetTips(DList &info) const { info.Append(new TObjInfoUnit(_T("对象类型"), _T("管线标注"))); if(!m_idPipe.isValid()) info.Append(new TObjInfoUnit(_T("所属管线"), _T("无"))); // ... } Acad::ErrorStatus TDbPipeLabel::GetGripText(int idx, CString &cs) const { Acad::ErrorStatus es=Acad::eOk; switch(idx) { case 0: cs=_T("移动基点"); break; case 1: cs=_T("移动文字"); break; default: ASSERT(0); } return es; } Acad::ErrorStatus TDbPipeLabel::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { assertReadEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::subGetGripPoints(gripPoints,osnapModes,geomIds); if(es!=Acad::eOk) return es; XPoint ptLabel=GetLabelLocation(); gripPoints.append((AcGePoint3d)ptLabel); return es; } Acad::ErrorStatus TDbPipeLabel::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const { assertReadEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::subGetStretchPoints(stretchPoints); //if(es!=Acad::eOk) return es; return es; } Acad::ErrorStatus TDbPipeLabel::GetExtents(XPoint &ptLow,XPoint &ptUp) const { Acad::ErrorStatus es=Acad::eOk; es=TDbPipeAttachment::GetExtents(ptLow,ptUp); if(es==Acad::eOk) { if(ptLow==XPoint()&&ptUp==XPoint()) { ptLow = m_ptLocation; ptUp = m_ptLocation; } else { ptLow = Min(ptLow,m_ptLocation); ptUp = Max(ptUp,m_ptLocation); } } return es; } Acad::ErrorStatus TDbPipeLabel::MoveGSPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { AcGeMatrix3d mat; mat.setToTranslation(offset); TADSGePoint3d ptStart, ptEnd; for(int i=0; igetClosestPointTo(ptOffset,m_ptLocation); } OPENOBJ_END(); break; default: ; } } return Acad::eOk; } Acad::ErrorStatus TDbPipeLabel::subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::subMoveGripPointsAt(indices,offset); if(es!=Acad::eOk) return es; es = MoveGSPointsAt(indices,offset); return es; } Acad::ErrorStatus TDbPipeLabel::subMoveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::subMoveStretchPointsAt(indices,offset); //if(es!=Acad::eOk) return es; //es = MoveGSPointsAt(indices,offset); return es; } Acad::ErrorStatus TDbPipeLabel::subClose() { Acad::ErrorStatus es=TDbPipeAttachment::subClose(); return es; } Acad::ErrorStatus TDbPipeLabel::subTransformBy(const AcGeMatrix3d& xform) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::subTransformBy(xform); if(es!=Acad::eOk) return es; es = TLabelStyle::subTransformBy(xform); if(es!=Acad::eOk) return es; // 离管线的距离 ScaleTransform(xform,m_dDistToPipe); return es; } XPoint TDbPipeLabel::GetLabelLocation() const { assertReadEnabled(); XPoint ptLabel; //double dDir=ads_angle(Wcs2Ucs(m_vtLocation),XPoint()); cet 2012.2.6 modify double dDir=ads_angle(Wcs2Ucs(XPoint()), Wcs2Ucs(m_vtLocation)); //dDir += PI/2; cet 2012.7. 13 modify dDir -= PI/2; dDir = CT_std_angle(dDir); // acutPolar(m_ptLocation,dDir,m_dDistToPipe,ptLabel); cet 2012.2.6 modify acutPolar(Wcs2Ucs(m_ptLocation),dDir,m_dDistToPipe,ptLabel); ptLabel = Ucs2Wcs(ptLabel); return ptLabel; } double TDbPipeLabel::GetTextRotation() const { assertReadEnabled(); AcGeVector3d vtDir = m_vtLocation; vtDir.z = 0.0; vtDir = Wcs2Ucs(vtDir, TRUE); // 支持ucs下原点改变的情况 double dRotation= AcGeVector3d::kXAxis.angleTo(vtDir, AcGeVector3d::kZAxis); dRotation = CT_std_angle(dRotation); if(dRotation - 0.001 > PI/2 && dRotation< 3*PI/2 + 0.001) // (PI * 0.5, PI * .15] { dRotation += PI; dRotation = CT_std_angle(dRotation); } dRotation = Ucs2Wcs(dRotation); return dRotation; } BOOL TDbPipeLabel::IsSingle(const TDbPipePrototype *pipe) const { BOOL bRet=TRUE; const DList& lstAttach=pipe->GetAttachments(); int nCount = lstAttach.Length(); for(int i=0; iobjectId() != objectId()) { bRet = FALSE; } } OPENOBJ_END(); } return bRet; } void TDbPipeLabel::SetSubText( long i,CString sText ) { assertWriteEnabled(); // 未曾修改 CString sOldText = GetLabelText().cs(); sText.TrimLeft(); sText.TrimRight(); if (sOldText == sText) { return; } // 未关联管线的标注可以随意更改文字 AcDbObjectId idPipe = GetPipeId(); if (!idPipe.isValid()) { SetPipeType(TDbPipeLabel::kDuct); SetLeftText(sText); return; } // 是否只修改了管径 double dDn = 0.0; if (!IsOnlyModifiedPipeDn(sText, sOldText, dDn)) { return; } TDbPipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForWrite); if (pPipe != NULL) { pPipe->SetDnDiameter(dDn); // 双线水管,需更新法兰信息 if (pPipe->isKindOf(TDbDoubleLinePipe::desc())) { TDbDoubleLinePipe *pDoublePipe = (TDbDoubleLinePipe*)pPipe; double dPipeDn = pDoublePipe->GetDnDiameter(); CString sPn = ReadXdata(pDoublePipe, _T("TG-PIPE-FLANGE-PN")); int nPn = 0; if(sPn == _T("0.25MPa")) { nPn = 0; } else if(sPn == _T("0.6MPa")) { nPn = 1; } else if(sPn == _T("1.0MPa")) { nPn = 2; } else if(sPn == _T("1.6MPa")) { nPn = 3; } double dFlangeDn = 0.0, dFlangeThick = 0.0; GetFlangeDataByDn(nPn, dPipeDn, dFlangeDn, dFlangeThick); pDoublePipe->SetWidth(dPipeDn); pDoublePipe->SetFlangeDn(dFlangeDn); pDoublePipe->SetFlangeThick(dFlangeThick); } pPipe->close(); } SetPipeType(TDbPipeLabel::kDuct); SetLeftText(sText); } ////////////////////////////////////////////////////////////////////////// ACRX_DXF_DEFINE_MEMBERS(ATSPipeText, ATSPipeAttachment, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,1,ATS_PIPETEXT, "ATS_PIPETEXT图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbPipeText); const Adesk::UInt8 TDbPipeText::g_nVersion = 1; TDbPipeText::TDbPipeText() { } void TDbPipeText::CopyPropertiesFrom(AcDbEntity *pSrc,unsigned gMatchFlag) { assertWriteEnabled(); TDbPipeAttachment::CopyPropertiesFrom(pSrc, gMatchFlag); TLabelStyle::CopyPropertiesFrom(pSrc, gMatchFlag); TDbPipeText *pText = TDbPipeText::cast(pSrc); if(pText) { m_sText = pText->m_sText; } } Acad::ErrorStatus TDbPipeText::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } BOOL TDbPipeText::IsValid() const { return TDbPipeAttachment::IsValid() && TLabelStyle::IsValid(); } // 从DWG读入数据: Acad::ErrorStatus TDbPipeText::dwgInFields(AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dwgInFields(pFiler); if(es!=Acad::eOk) return es; es = TLabelStyle::dwgInFields(pFiler); if(es!=Acad::eOk) return es; Adesk::UInt8 nVer; pFiler->readItem(&nVer); if(nVer>g_nVersion) {// Version is too new return Acad::eMakeMeProxy; } ReadString(pFiler, m_sText); return pFiler->filerStatus(); } Acad::ErrorStatus TDbPipeText::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dwgOutFields(pFiler); if(es!=Acad::eOk) return es; es = TLabelStyle::dwgOutFields(pFiler); if(es!=Acad::eOk) return es; pFiler->writeItem(g_nVersion); pFiler->writeItem((const TCHAR *)m_sText); return pFiler->filerStatus(); } Acad::ErrorStatus TDbPipeText::dxfInFields(AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dxfInFields(pFiler); if(es!=Acad::eOk) return es; es = TLabelStyle::dxfInFields(pFiler); if(es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbPipeText"))) { return Acad::eBadDxfSequence; } resbuf rb; while((es==Acad::eOk) && ((es=pFiler->readResBuf(&rb))==Acad::eOk)) { switch (rb.restype) { case AcDb::kDxfXTextString: m_sText=rb.resval.rstring; break; default: pFiler->pushBackItem(); es = Acad::eEndOfFile; break; } } if(es!=Acad::eEndOfFile) return Acad::eInvalidResBuf; return pFiler->filerStatus(); } Acad::ErrorStatus TDbPipeText::dxfOutFields(AcDbDxfFiler* pFiler) const { Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dxfOutFields(pFiler); assert(es == Acad::eOk); es = TLabelStyle::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbPipeText")); assert(es == Acad::eOk); pFiler->writeString(AcDb::kDxfXTextString,(const TCHAR*)m_sText); return es; } Acad::ErrorStatus TDbPipeText::ExplodeOrDraw2d(XExplodeDraw &dc) const { // cet 2016.10.17 add 图层关闭时,实体不显示,不进行绘制(打印时,也不会绘制) AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead); if (player.openStatus() == Acad::eOk && player->isOff()) { return Acad::eOk; } if(!IsValid()) return Acad::eInvalidInput; XPoint ptLocation=m_ptLocation; ptLocation.z=0; TDbText text; text.setPropertiesFrom(this); text.SetStyleId(m_idTextStyle); text.SetText(m_sText); text.SetRotation(GetTextRotation()); text.SetLocation(ptLocation); text.SetHeight(m_dTextHeight); text.SetAlignment(XExplodeDraw::kMiddleCenter); TPushProperty vProp(&text, dc); if(dc.IsFullExplode()) text.ExplodeOrDraw2d(dc); else dc.DrawEntity(text); // dc.SetStyle(m_idTextStyle); // dc.SetRotation(GetTextRotation()); // dc.SetLocation(ptLocation); // dc.SetHeight(m_dTextHeight*GetPScale()); // dc.SetAlignment(XExplodeDraw::kMiddleCenter); // dc.DrawText(m_sText); return Acad::eOk; } Acad::ErrorStatus TDbPipeText::GetGripText(int idx, CString &cs) const { Acad::ErrorStatus es=Acad::eOk; switch(idx) { case 0: cs=_T("平移"); break; default: ASSERT(0); } return es; } double TDbPipeText::GetWidth() const { AcGiTextStyle txtStyle; if(!m_idTextStyle.isValid()) return GetPScale(); Acad::ErrorStatus es=fromAcDbTextStyle(txtStyle, m_idTextStyle); txtStyle.setTextSize(m_dTextHeight*GetPScale()); Adesk::Boolean bIncludeSpace=Adesk::kTrue; // Windows字体,都需要包括前后空隙 TCHAR *pTypeface=NULL; Adesk::Boolean bBold, bItalic; #if ADS <= 20 int tmp0, tmp1; BOOL bWinFont=(txtStyle.font(pTypeface, bBold ,bItalic, tmp0, tmp1)==Acad::eOk); #else Charset charset; Autodesk::AutoCAD::PAL::FontUtils::FontPitch pitch; Autodesk::AutoCAD::PAL::FontUtils::FontFamily family; BOOL bWinFont = (txtStyle.font(pTypeface, bBold, bItalic, charset, pitch, family) == Acad::eOk); #endif if(bWinFont) { if(!pTypeface || !pTypeface[0]) bWinFont=FALSE; } if(pTypeface) delete[] pTypeface; if(bWinFont) bIncludeSpace=Adesk::kTrue; else { bIncludeSpace=Adesk::kFalse; const TCHAR *pShxFile=txtStyle.fileName(); if(pShxFile) { XPathParser paser(pShxFile); _tcsupr(paser.m_sFileName); TCHAR sFilter[]=_T("GBE*,GOTH*,ISO*,SCRIPT*,ROMAN*"); if(ads_wcmatch(paser.m_sFileName, sFilter)==RTNORM) bIncludeSpace=Adesk::kTrue; } } double nWidthScale(0.8),nHeightFactor(0); OPENOBJ_BEGIN(m_idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pRec); if(pRec){ resbuf *pxData = pRec->xData(TCHXD); // 读扩展数据 if(pxData) { resbuf *pNext = pxData->rbnext; if(pNext && pNext->restype == 1040) { nHeightFactor = pNext->resval.rreal; pNext = pNext->rbnext; if(pNext && pNext->restype == 1040) nWidthScale = pNext->resval.rreal; } ads_relrb(pxData); } } OPENOBJ_END(); AcGePoint2d ptExt=txtStyle.extents(m_sText, bIncludeSpace, -1, Adesk::kFalse); double dScale=GetPScale(); double dWidth=0; //txtStyle.extents计算出来的外框,是英文宽度比例为1时候的,注意nWidthScale是上华的扩展数据 dWidth = fabs(ptExt.x)*nWidthScale; // cet 2012.2.7 modify 由于某些未知原因,得到的宽度值有时不对 // 为保险起见,再求一次其外包框 用最大值 // return dWidth+2*dScale*g_dPipeTextDis; double dPipeTextDist = GetPsPipeTextDis(this->database()); dWidth = dWidth+2*dScale*dPipeTextDist; TDbText text; text.setPropertiesFrom(this); text.SetStyleId(m_idTextStyle); text.SetText(m_sText); text.SetRotation(0.0); text.SetLocation(m_ptLocation); text.SetHeight(m_dTextHeight); text.SetAlignment(XExplodeDraw::kMiddleCenter); double dWidth2 = fabs(text.GetExtents().x); dWidth2 += 2 * dScale * dPipeTextDist; return (dWidth > dWidth2 ? dWidth : dWidth2); } extern BOOL StringAnalysis(const TCHAR *src, XString &sPrefix, int *num, int *numWidth); //注意2种标注 // --- H ------ 管线类型标注, 如果修改了, 则同时修改同管线其它标注 // --- DN50 --- 单管管径标注, 如果修改了, 则同时更新管线标注 void TDbPipeText::SetSubText(long i,CString sText) { // cet 2014.6.3 modify 细化标注 // assertWriteEnabled(); // SetText(sText); // // XString xsText; // int num, numWith; // StringAnalysis((const TCHAR*)sText, xsText, &num, &numWith); // BOOL bIsDn = FALSE; // if((sText.Find(_T("D")) > -1 || sText.Find(_T("d")) > -1 || sText.Find(_T("φ")) > -1 || sText.Find(_T("Φ")) > -1) && num > 0.1) // bIsDn = TRUE; // OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbPipe, pPipe); // if(pPipe){ // double dDn = pPipe->GetDnDiameter(); // CString csDn, csLabel, csOld; // csLabel = pPipe->GetLabel(); // csDn.Format(_T("%.0f"), dDn); // csOld.Format(_T("%s%s"), csLabel, csDn); // DList lstAttachment; // pPipe->GetAttachments(lstAttachment); // int leng = lstAttachment.Length(); // for(int m=0;mGetText(); // if(csText2.Find(csDn) < 0 && !bIsDn) // pText->SetText(sText); //更新其它类型标注 // else if(csText2 == csOld && bIsDn) // pText->SetText(sText); //更新其它管径标注 // } // OPENOBJ_END(); // } // if(bIsDn && pPipe->upgradeOpen()==Acad::eOk){ // pPipe->SetSysLabel(xsText); // pPipe->SetDnDiameter(num); // pPipe->downgradeOpen(); // } // } // OPENOBJ_END(); assertWriteEnabled(); // 未曾修改 CString sOldText = GetText(); sText.TrimLeft(); sText.TrimRight(); if (sOldText == sText) { return; } // 未关联管线的标注可以随意更改文字 AcDbObjectId idPipe = GetPipeId(); if (!idPipe.isValid()) { SetText(sText); return; } int nDimTextType = ::DimTextType(this); if (nDimTextType == 0) // 处理管径标注文字 { if (DimTextType() == -1) { DimTextType(0); } // 是否只修改了管径 double dDn = 0.0; if (!IsOnlyModifiedPipeDn(sText, sOldText, dDn)) { return; } bool bUpdateOtherDim = false; DList lstAttachment; TDbPipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (pPipe != NULL) { bUpdateOtherDim = pPipe->IsLinkedPipeDnDimText(); pPipe->GetAttachments(lstAttachment); pPipe->close(); } SetText(sText); // 更新其他管线关联标注 if (!bUpdateOtherDim) { int nLen = lstAttachment.Length(); for(int m = 0; m < nLen; m++) { AcDbObjectId idTmp = *lstAttachment[m]; OPENOBJ_BEGIN(idTmp, AcDb::kForWrite, TDbPipeText, pText); if(pText != NULL) { if (::DimTextType(pText) == 0) { pText->SetText(sText); } } OPENOBJ_END(); } } // 更新管径 acdbOpenObject(pPipe, idPipe, AcDb::kForWrite); if (pPipe != NULL) { pPipe->SetDnDiameter(dDn); // 双线水管,需更新法兰信息 if (pPipe->isKindOf(TDbDoubleLinePipe::desc())) { TDbDoubleLinePipe *pDoublePipe = (TDbDoubleLinePipe*)pPipe; double dPipeDn = pDoublePipe->GetDnDiameter(); CString sPn = ReadXdata(pDoublePipe, _T("TG-PIPE-FLANGE-PN")); int nPn = 0; if(sPn == _T("0.25MPa")) { nPn = 0; } else if(sPn == _T("0.6MPa")) { nPn = 1; } else if(sPn == _T("1.0MPa")) { nPn = 2; } else if(sPn == _T("1.6MPa")) { nPn = 3; } double dFlangeDn = 0.0, dFlangeThick = 0.0; GetFlangeDataByDn(nPn, dPipeDn, dFlangeDn, dFlangeThick); pDoublePipe->SetWidth(dPipeDn); pDoublePipe->SetFlangeDn(dFlangeDn); pDoublePipe->SetFlangeThick(dFlangeThick); } pPipe->close(); } } else if (nDimTextType == 1) // 管线文字 { SetText(sText); if (DimTextType() == -1) { DimTextType(1); } TDbPipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForWrite); if (pPipe != NULL) { pPipe->SetLinkedPipeText(sText); pPipe->close(); } } } void TDbPipeText::GetTips(DList &info) const { info.Append(new TObjInfoUnit(_T("对象类型"), _T("管线文字"))); if(!m_idPipe.isValid()) info.Append(new TObjInfoUnit(_T("所属管线"), _T("无"))); info.Append(new TObjInfoUnit(_T("文字内容"), (const TCHAR*)m_sText)); } double TDbPipeText::GetTextRotation() const { assertReadEnabled(); AcGeVector3d vt = m_vtLocation; vt.z = 0.0; vt = Wcs2Ucs(vt, TRUE); // 支持ucs下原点改变的情况 double dRotation =( AcGeVector3d::kXAxis).angleTo(vt, AcGeVector3d::kZAxis); if((dRotation-0.001)>PI/2 && dRotation< 3*PI/2 + 0.001) // (PI * 0.5, PI *1.5] { dRotation += PI; dRotation = CT_std_angle(dRotation); } dRotation = Ucs2Wcs(dRotation); return dRotation; } int TDbPipeText::DimTextType() { TEntityFields &fd = Fields(); Adesk::Int8 nVal = -1; fd.GFD(_T("DIM_TEXT_TYPE"), nVal); return nVal; } void TDbPipeText::DimTextType( Adesk::Int8 nDimTextType ) { assertWriteEnabled(); TEntityFields &fd = Fields(); fd.SFD(_T("DIM_TEXT_TYPE"), nDimTextType); } bool TDbPipeText::UpdateLinkedPipe( const CString &sDimText ) { // 未关联管线的标注可以随意更改文字 AcDbObjectId idPipe = GetPipeId(); if (!idPipe.isValid()) { return true; } // 未曾修改 CString sOldText = GetText(); CString sText = sDimText; sText.TrimLeft(); sText.TrimRight(); int nDimTextType = ::DimTextType(this); if (nDimTextType == 0) // 处理管径标注文字 { if (DimTextType() == -1) { DimTextType(0); } // 是否只修改了管径 double dDn = 0.0; if (!IsOnlyModifiedPipeDn(sText, sOldText, dDn)) { return false; } bool bUpdateOtherDim = false; DList lstAttachment; TDbPipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (pPipe != NULL) { bUpdateOtherDim = pPipe->IsLinkedPipeDnDimText(); pPipe->GetAttachments(lstAttachment); pPipe->close(); } // 更新其他管线关联标注 if (!bUpdateOtherDim) { int nLen = lstAttachment.Length(); for(int m = 0; m < nLen; m++) { AcDbObjectId idTmp = *lstAttachment[m]; OPENOBJ_BEGIN(idTmp, AcDb::kForWrite, TDbPipeText, pText); if(pText != NULL) { if (::DimTextType(pText) == 0) { pText->SetText(sText); } } OPENOBJ_END(); } } // 更新管径 acdbOpenObject(pPipe, idPipe, AcDb::kForWrite); if (pPipe != NULL) { pPipe->SetDnDiameter(dDn); // 双线水管,需更新法兰信息 if (pPipe->isKindOf(TDbDoubleLinePipe::desc())) { TDbDoubleLinePipe *pDoublePipe = (TDbDoubleLinePipe*)pPipe; double dPipeDn = pDoublePipe->GetDnDiameter(); CString sPn = ReadXdata(pDoublePipe, _T("TG-PIPE-FLANGE-PN")); int nPn = 0; if(sPn == _T("0.25MPa")) { nPn = 0; } else if(sPn == _T("0.6MPa")) { nPn = 1; } else if(sPn == _T("1.0MPa")) { nPn = 2; } else if(sPn == _T("1.6MPa")) { nPn = 3; } double dFlangeDn = 0.0, dFlangeThick = 0.0; GetFlangeDataByDn(nPn, dPipeDn, dFlangeDn, dFlangeThick); pDoublePipe->SetWidth(dPipeDn); pDoublePipe->SetFlangeDn(dFlangeDn); pDoublePipe->SetFlangeThick(dFlangeThick); } pPipe->close(); } return true; } else if (nDimTextType == 1) // 管线文字 { if (DimTextType() == -1) { DimTextType(1); } TDbPipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForWrite); if (pPipe != NULL) { pPipe->SetLinkedPipeText(sText); pPipe->close(); } return true; } return false; } ////////////////////////////////////////////////////////////////////////// void InitDbLabel(BOOL bTrue) { if(bTrue) { TDbPipeLabel::rxInit(); TDbPipeText::rxInit(); TDbPipeLabel::InitMatchProtocol(TRUE); TDbPipeText::InitMatchProtocol(TRUE); } else { TDbPipeLabel::InitMatchProtocol(FALSE); TDbPipeText::InitMatchProtocol(FALSE); deleteAcRxClass(TDbPipeLabel::desc()); deleteAcRxClass(TDbPipeText::desc()); } }