719 lines
18 KiB
C++
719 lines
18 KiB
C++
#include "stdafx.h"
|
|
#include <xutility>
|
|
#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;
|
|
}
|
|
}
|
|
|
|
|
|
|