#include "stdafx.h" #include #include "PidlineTools.h" #include "KTModelLayoutXData.h" #include "uiiado.h" #include "EarThwormDef.h" #define PIPE_CENTER_SYS _T("管线中心线") #define PIPE_OUTSIDE_SYS _T("管线边线") #define PIPE_SINGLE_SYS _T("管线中心线") #define FITN_CENTER_SYS _T("管件中心线") #define FITN_OUTSIDE_SYS _T("管件边线") #define FITN_SINGLE_SYS _T("管件中心线") #define EQU_SYS _T("设备") namespace { int ScrSize(ads_real *width, ads_real *height) { struct resbuf screensize, viewsize; ads_getvar(_T("SCREENSIZE"), &screensize); ads_getvar(_T("VIEWSIZE"), &viewsize); *height = viewsize.resval.rreal; *width = screensize.resval.rpoint[X] / screensize.resval.rpoint[Y] * (*height); return RTNORM; } void ParsalToArray(CString& sMtoAll, CStringArray& arValues) { int nIndex = -1; CString sTemp = sMtoAll, sText; while (TRUE) { nIndex = sTemp.Find(_T("^"), 0); if (nIndex != -1) { arValues.Add(sTemp.Mid(0, nIndex)); sText = sTemp.Mid(nIndex + 1, sTemp.GetLength() - nIndex - 1); sTemp = sText; } else { if (!sTemp.IsEmpty()) { arValues.Add(sTemp); } break; } } } BOOL GetNextOpenCloseCharText(CString& sScript, CString& sText) { sScript.TrimLeft(); sScript.TrimRight(); sText = _T(""); int nIndex1 = sScript.Find(KT_OPEN_BRACE_CHAR, 0); int nIndex2 = sScript.Find(KT_CLOSE_BRACE_CHAR, 0); if (nIndex1 != -1 && nIndex2 != -1) { sText = sScript.Mid(nIndex1 + 1, nIndex2 - nIndex1 - 1); if (nIndex2 + 1 < sScript.GetLength()) { sScript = sScript.Mid(nIndex2 + 1); } else { sScript = _T(""); } return !sText.IsEmpty(); } return FALSE; } BOOL ElDescr2EveryOne(CString& sText, CString& sEl, CString& sTopEl, CString& sCenEl, CString& sBomEl) { //--|--|-- int nLen = sText.GetLength(); if (nLen == 0) return FALSE; int nIndex = sText.Find(KT_SEPARATOR_CHAR, 0); sEl = sText.Mid(0, nIndex); sText.SetAt(nIndex, KT_SUBTRACT_CHAR); //'-' int nIndex1 = nIndex; nIndex = sText.Find(KT_SEPARATOR_CHAR, 0); //'|' if (nIndex != -1) { sTopEl = sText.Mid(nIndex1 + 1, nIndex - nIndex1 - 1); sText.SetAt(nIndex, KT_SUBTRACT_CHAR); } nIndex1 = nIndex; nIndex = sText.Find(KT_SEPARATOR_CHAR, 0); if (nIndex != -1) { sCenEl = sText.Mid(nIndex1 + 1, nIndex - nIndex1 - 1); sText.SetAt(nIndex, KT_SUBTRACT_CHAR); } nIndex1 = nIndex; nIndex = sText.Find(KT_SEPARATOR_CHAR, 0); if (nIndex != -1) { sBomEl = sText.Mid(nIndex1 + 1, nIndex - nIndex1 - 1); sText.SetAt(nIndex, KT_SUBTRACT_CHAR); return TRUE; } return FALSE; } } namespace PIDLineTools { void loadToolbar() { CString sCUI(_T("")); #if ARX >17 sCUI = FilePath::GetSysDir() + _T("\\shs-ew.cuix"); #else sCUI = FilePath::GetSysDir() + _T("\\shs-ew.cui"); #endif if (!acedIsMenuGroupLoaded(_T("shs-ew"))) SHads_command(RTSTR, _T(".MENULOAD"), RTSTR, sCUI, RTNONE); } bool getSqliteDB(LPCTSTR dbName, CUIISQLiteServer & db) { CString dbPath = FilePath::GetSysDir(); dbPath += _T("\\"); dbPath += dbName; if (!db.InitADOServer(dbPath)) return false; return true; } double getPScale() { double dPScale(100.); CString sScale(_T("1:100")); AecDbObjXDataMap xDataMap; if (KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, xDataMap)) xDataMap.GetAt(_T("DOC_SCALE"), sScale); int idx = sScale.Find(':'); if (idx != -1) { sScale = sScale.Right(sScale.GetLength() - idx - 1); dPScale = _ttof(sScale); } return dPScale; } CString getCurrentLayerSys() { CString sysName(_T("")); AecDbObjXDataMap xDataMap; if (KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, xDataMap)) xDataMap.GetAt(_T("PIPE_LAY_SYS"), sysName); return sysName; } void setCurrentLayerSys(LPCTSTR sys) { AecDbObjXDataMap xDataMap; if (KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, xDataMap)) { xDataMap.SetAt(_T("PIPE_LAY_SYS"), sys); KTModelLayoutXData::WriteModelXData(KT_PIPEINIT, xDataMap); } } Acad::ErrorStatus generateGroup(LPCTSTR name, AcDbObjectIdArray & ids, AcDbObjectId &id) { if (ids.isEmpty()) return Acad::eInvalidInput; Acad::ErrorStatus es; AcDbGroup *pGroup = new AcDbGroup; AcDbObjectId groupObjectId; AcDbDictionary *pGroupDict(NULL); es = acdbCurDwg()->getGroupDictionary(pGroupDict, AcDb::kForWrite); if (es != Acad::eOk) return es; es = pGroupDict->setAt(_T("*A"), pGroup, groupObjectId); if (es != Acad::eOk) { DELETE_PTR(pGroup); return es; } pGroupDict->close(); if (!name) pGroup->setAnonymous(); else pGroup->setName(name); pGroup->setSelectable(true); id = pGroup->objectId(); pGroup->append(ids); pGroup->close(); return es; } int GetSamplePoints(AcDbCurve* pCrv, AcGePoint3dArray& arPoints) { double dSta = 0.0, dEnd = 0.0; pCrv->getStartParam(dSta); pCrv->getEndParam(dEnd); double dStep = (dEnd - dSta) / 16.0; AcGePoint3d ptGeT; for (int i = 0; i < 16; i++) { pCrv->getPointAtParam(dSta + i * dStep, ptGeT); arPoints.append(ptGeT); } arPoints.append(arPoints.first()); return arPoints.length(); } void ReSetPID(AecDbObjXDataMap & xDataMap) { xDataMap.SetAt(DOC_PIDTRADE, WPipe::ePetro); //应用行业,石油 xDataMap.SetAt(DOC_PIDSCRIPTT, _T("{0}{-}{1}{-}{2}{-}{3}"));//上标脚本 xDataMap.SetAt(DOC_PIDSCRIPTB, _T("{4}{-}{5}"));//下标脚本 xDataMap.SetAt(DOC_PIDBSPACE, 3.0); //交叉断线间距 xDataMap.SetAt(DOC_PIDEWITHDIM, TRUE); //设备插入标注 xDataMap.SetAt(DOC_PIDVWITHDIM, TRUE); //阀门插入标注 xDataMap.SetAt(DOC_PIDINSRDN, 12); //仪表泡直径 xDataMap.SetAt(DOC_CONSIGN, 30.0); //续接符号 xDataMap.SetAt(DOC_PIDBARROW, 6.0); //大箭头 xDataMap.SetAt(DOC_PIDEQPTXTH, 3.5); //设备标注文字高度 xDataMap.SetAt(DOC_PIDEQPTXTF, 1.0); //设备文字宽度系数 xDataMap.SetAt(DOC_PIDMARROW, 3.0); //中箭头 xDataMap.SetAt(DOC_PIDSARROW, 1.5); //小箭头 xDataMap.SetAt(DOC_PIDVALVTXTH, 3.5); //阀门文字高度 xDataMap.SetAt(DOC_PIDVALVTXTF, 1.0); //阀门文字宽度系数 xDataMap.SetAt(DOC_PIDDIMTXTH, 3.5); //标注文字高度 xDataMap.SetAt(DOC_PIDDIMTXTF, 1.0); //标注文字宽度系数 xDataMap.SetAt(DOC_EQUSCALE, 6.0); //设备比例 xDataMap.SetAt(DOC_LINEARSCALE, 10.0); //线性比例 xDataMap.SetAt(DOC_PIDMPIPE1W, 1.0); //主管道线宽1 xDataMap.SetAt(DOC_PIDMPIPE2W, 0.5); //主管道线宽2 xDataMap.SetAt(DOC_NODESCALE, 6.0); //管嘴比例 xDataMap.SetAt(DOC_PIDSPIPE1W, 0.25); //次管道线宽1 xDataMap.SetAt(DOC_PIDSPIPE2W, 0.125); //次管道线宽2 xDataMap.SetAt(DOC_VALVESCALE, 100.0); //阀门比例 xDataMap.SetAt(DOC_PIDUNIT, 0); //单位 xDataMap.SetAt(DOC_PIDDIMTERM, 0); //标注端符 } void ReSet(AecDbObjXDataMap & xDataMap) { xDataMap.SetAt(DOC_TRADE, WPipe::ePetro); //应用行业,石油 xDataMap.SetAt(DOC_SCALE, _T("1:50")); //出图比例 xDataMap.SetAt(DOC_PLOTWIDTH, 0.5); //最小打印线宽 xDataMap.SetAt(DOC_DPLOTWIDTH, 0.5); //双线打印线宽 xDataMap.SetAt(DOC_WELDDIA, 1.0); //焊点直径 xDataMap.SetAt(DOC_PIPEMINDIA, 65.0); //最小管道直径 xDataMap.SetAt(DOC_PIPEMAXDIA, 200.0); //最大管线直径 xDataMap.SetAt(DOC_PERELBOWDIA, 40.0); //垂直弯头直径 xDataMap.SetAt(DOC_BREAKSPACE, 2.0); //交叉断线间距 xDataMap.SetAt(DOC_UNIT, 0); //单位 xDataMap.SetAt(DOC_DIMTERM, 0); //标注端符 xDataMap.SetAt(DOC_DIMTXTH, 2.0); //标注文字高度 xDataMap.SetAt(DOC_DIMTXTF, 0.7); //标注文字宽度系数 xDataMap.SetAt(DOC_EQPTXTH, 2.0); //设备标注文字高度 xDataMap.SetAt(DOC_EQPTXTF, 1.0); //设备标注文字宽度系数 xDataMap.SetAt(DOC_STRTXTH, 2.0); //结构标注文字高度 xDataMap.SetAt(DOC_STRTXTF, 0.7); //结构标注文字宽度系数 xDataMap.SetAt(DOC_SCRIPTT, _T("{0}{-}{1}{-}{2}{-}{3}"));//上标脚本 xDataMap.SetAt(DOC_SCRIPTB, _T("{4}{-}{5}"));//下标脚本 xDataMap.SetAt(DOC_ELTYPE, 0); //标高设置 xDataMap.SetAt(DOC_ELDESCR, _T("--")); //标高文本 } void FormatDimText(CString& sText, AecDbObjXDataMap& objXData, AecDbObjXDataMap& modelXData, CString& sDimText) { int nIndex = _ttoi(sText); if (nIndex >= 0 && nIndex <= WPipe::kSystem)//kZone { //默认 CString sDim = _T(""); objXData.GetAt(g_pszPipeDimTag[nIndex], sDim); if (nIndex == 0) //DN { sDim.TrimRight(_T('0')); sDim.TrimRight(_T('.')); //如果前面加上DN BOOL bDN = 0; modelXData.GetAt(DOC_DNPRE,bDN); if (bDN) { sDim.Insert(0,_T("DN")); } BOOL bO = 0; modelXData.GetAt(DOC_ADPRE,bO); if (bO) { sDim.TrimLeft(_T("DN")); sDim.Insert(0,_T("%%c")); } int nUnit = 0; modelXData.GetAt(DOC_UNIT, nUnit); if (nUnit == 1)//英制 { objXData.GetAt(DOC_INCH, sDim); } } //标高特殊处理 if (nIndex == 5) //标高,获取标高类型 { CString sElGroup = _T(""); int nElType = -1; modelXData.GetAt(DOC_ELDESCR, sElGroup); modelXData.GetAt(DOC_ELTYPE, nElType); //获取标高类型 int nElBase = 0; objXData.GetAt(PIPE_ELBASE, nElBase); WPipe::ElBase eElBase = (WPipe::ElBase)nElBase; if (sElGroup.CompareNoCase(_T("0")) == 0) //标高图案 + 数值表达 { switch (eElBase) { case WPipe::kTop: { sDimText = _T("^0^") + sDim; break; } case WPipe::kCen: { sDimText = _T("^1^") + sDim; break; } case WPipe::kBom: { sDimText = _T("^2^") + sDim; break; } case WPipe::kDefault: { sDimText = _T("^3^") + sDim; break; } default: break; } } else //标高文字符号 + 数值 表达 { //解析标高文字符号 CString sEl, sTopEl, sCenEl, sBomEl; ElDescr2EveryOne(sElGroup, sEl, sTopEl, sCenEl, sBomEl); switch (eElBase) { case WPipe::kTop: { sDimText = sTopEl + sDim; break; } case WPipe::kCen: { sDimText = sCenEl + sDim; break; } case WPipe::kBom: { sDimText = sBomEl + sDim; break; } case WPipe::kDefault: { sDimText = sEl + sDim; break; } default: break; } } } else if (nIndex == 4)//外径 x 壁厚", //4 { CString sDim1 = _T(""), sDim2 = _T(""); objXData.GetAt(PIPE_OD, sDim1); sDim1.TrimRight(_T('0')); sDim1.TrimRight(_T('.')); //如果前面加上D BOOL bD = 0; modelXData.GetAt(DOC_DPRE,bD); if (bD) { sDim1.Insert(0,_T("D")); } BOOL bO = 0; modelXData.GetAt(DOC_ADPRE,bO); if (bO) { sDim1.TrimLeft(_T("D")); sDim1.Insert(0,_T("%%c")); } objXData.GetAt(PIPE_THICK, sDim2); sDimText = sDim1 + _T("x") + sDim2; } else { sDimText = sDim; } } } void FormatPIDDimText(CString& sText, AecDbObjXDataMap& objXData, AecDbObjXDataMap& modelXData, CString& sDimText) { int nIndex = _ttoi(sText); if (nIndex >= 0 && nIndex <= WPipe::kSystem)//kZone { //默认 CString sDim = _T(""); objXData.GetAt(g_pszPIDPipeDimTag[nIndex], sDim); if (nIndex == 0) //DN { int nUnit = 0; modelXData.GetAt(DOC_PIDUNIT, nUnit); if (nUnit == 1)//英制 { objXData.GetAt(DOC_PIDINCH, sDim); } } if (nIndex == 4)//外径 x 壁厚", KPipe//4 { CString sDim1 = _T(""), sDim2 = _T(""); modelXData.GetAt(PIPE_OD, sDim1); sDim1.TrimRight(_T('0')); sDim1.TrimRight(_T('.')); //如果前面加上D BOOL bD = 0; modelXData.GetAt(DOC_DPRE,bD); if (bD) { sDim1.Insert(0,_T("D")); } BOOL bO = 0; modelXData.GetAt(DOC_ADPRE,bO); if (bO) { sDim1.TrimLeft(_T("D")); sDim1.Insert(0,_T("%%c")); } objXData.GetAt(PIPE_THICK, sDim2); sDimText = sDim1 + _T("x") + sDim2; } else { sDimText = sDim; } } } BOOL FormatPIDPipeDimTxt(AcDbEntity* pEnt, CString& sTopDimTxt, CString& sBomDimTxt) { /* const LPCTSTR g_pszPIDPipeDim[] = { _T("公称直径"), _T("介质"), _T("管号"), _T("管道等级"), _T("外径x 壁厚"), _T("类型"), _T("保温伴热"), _T("标准"), _T("材质"), _T("区号"), NULL }; */ AecDbObjXDataMap objXData; if (objXData.Read((AcDbObject*)pEnt, PIDPIPE_APP)) { //从moto中解析 CString sMotoInfo; objXData.GetAt(PIPE_MTOALL, sMotoInfo); int nType = -1; objXData.GetAt(PIPE_FITTING, nType); if (nType == 0)//管子 { //项目名称 等级名称 类别 类型 公称直径 材质 表号 标准号 外径 壁厚 外径系列 CStringArray arValues; ParsalToArray(sMotoInfo, arValues); if (arValues.GetSize() == 11) { objXData.SetAt(g_pszPIDPipeDimTag[7], arValues.GetAt(7));//标准号 objXData.SetAt(g_pszPIDPipeDimTag[8], arValues.GetAt(5));//材质 } } AecDbObjXDataMap modelXData; if (KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, modelXData)) { //_T("{0}{-}{1}{-}{2}{-}{3}")); //上标脚本 公称直径-介质-管号-管道等级 //_T("{4}{-}{5}")); //下标脚本 外径x 壁-标高 CString sScriptTop = _T(""), sScriptDown = _T(""); modelXData.GetAt(DOC_PIDSCRIPTT, sScriptTop); modelXData.GetAt(DOC_PIDSCRIPTB, sScriptDown); CString sText = _T(""), sDimText = _T(""); int nIndex = 0; while (TRUE) { if (sScriptTop.IsEmpty()) break; GetNextOpenCloseCharText(sScriptTop, sText); if (nIndex % 2 == 0) //条目 { FormatPIDDimText(sText, objXData, modelXData, sDimText); sTopDimTxt += sDimText; } else //间隔 { sTopDimTxt += sText; } nIndex += 1; } sText = _T(""), sDimText = _T(""); nIndex = 0; while (TRUE) { if (sScriptDown.IsEmpty()) break; GetNextOpenCloseCharText(sScriptDown, sText); if (nIndex % 2 == 0) //条目 { FormatPIDDimText(sText, objXData, modelXData, sDimText); sBomDimTxt += sDimText; } else //间隔 { sBomDimTxt += sText; } nIndex += 1; } return (!sBomDimTxt.IsEmpty() || !sTopDimTxt.IsEmpty()); } } return FALSE; } BOOL FormatPIDPipeDimTxt(AcDbObjectId& id, CString& sTopDimTxt, CString& sBomDimTxt) { AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)) { BOOL bSuccess = FormatPIDPipeDimTxt(pEnt, sTopDimTxt, sBomDimTxt); pEnt->close(); return bSuccess; } return FALSE; } BOOL FormatPipeDimTxt(AecDbObjXDataMap& objXData, CString& sTopDimTxt, CString& sBomDimTxt) { //从moto中解析 CString sMotoInfo; objXData.GetAt(PIPE_MTOALL, sMotoInfo); int nType = -1; objXData.GetAt(PIPE_FITTING, nType); if (nType == 0)//管子 { //项目名称 等级名称 类别 类型 公称直径 材质 表号 标准号 外径 壁厚 外径系列 CStringArray arValues; ParsalToArray(sMotoInfo, arValues); if (arValues.GetSize() == 11) { objXData.SetAt(g_pszPipeDimTag[9], arValues.GetAt(7));//标准号 objXData.SetAt(g_pszPipeDimTag[10], arValues.GetAt(5));//材质 } } else { //项目名称 等级名称 类别 类型 公称直径 材质 表号 标准号 外径系列 CStringArray arValues; ParsalToArray(sMotoInfo, arValues); if (arValues.GetSize() == 9) { objXData.SetAt(g_pszPipeDimTag[9], arValues.GetAt(7));//标准号 objXData.SetAt(g_pszPipeDimTag[10], arValues.GetAt(5));//材质 } } AecDbObjXDataMap modelXData; if (KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, modelXData)) { //_T("{0}{-}{1}{-}{2}{-}{3}")); //上标脚本 公称直径-介质-管号-管道等级 //_T("{4}{-}{5}")); //下标脚本 外径x 壁-标高 CString sScriptTop = _T(""), sScriptDown = _T(""); modelXData.GetAt(DOC_SCRIPTT, sScriptTop); modelXData.GetAt(DOC_SCRIPTB, sScriptDown); CString sText = _T(""), sDimText = _T(""); int nIndex = 0; while (TRUE) { if (sScriptTop.IsEmpty()) break; GetNextOpenCloseCharText(sScriptTop, sText); if (nIndex % 2 == 0) //条目 { FormatDimText(sText, objXData, modelXData, sDimText); sTopDimTxt += sDimText; } else //间隔 { sTopDimTxt += sText; } nIndex += 1; } sText = _T(""), sDimText = _T(""); nIndex = 0; while (TRUE) { if (sScriptDown.IsEmpty()) break; GetNextOpenCloseCharText(sScriptDown, sText); if (nIndex % 2 == 0) //条目 { FormatDimText(sText, objXData, modelXData, sDimText); sBomDimTxt += sDimText; } else //间隔 { sBomDimTxt += sText; } nIndex += 1; } return (!sBomDimTxt.IsEmpty() || !sTopDimTxt.IsEmpty()); } return TRUE; } BOOL FormatPipeDimTxt(AcDbEntity* pEnt, CString& sTopDimTxt, CString& sBomDimTxt) { /* const LPCTSTR g_pszPipeDim[] = {"公称直径", //0 "介质", //1 "管号", //2 "管道等级", //3 "外径 x 壁厚", //4 "标高", //5 "类型", //6 "保温伴热", //7 "弯头比率", //8 "标准", //9 "材质", //10 "区号", //11 NULL }; */ AecDbObjXDataMap objXData; if (objXData.Read((AcDbObject*)pEnt, PIDPIPE_APP)) { return FormatPipeDimTxt(objXData, sTopDimTxt, sBomDimTxt); } return FALSE; } BOOL FormatPipeDimTxt(AcDbObjectId& id, CString& sTopDimTxt, CString& sBomDimTxt) { AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)) { BOOL bSuccess = FormatPipeDimTxt(pEnt, sTopDimTxt, sBomDimTxt); pEnt->close(); return bSuccess; } return FALSE; } }