Files
envi-code/SourceCode/Code2026/PIDLineCmd/PIDLineTools.cpp
T
2026-09-28 15:28:50 +08:00

719 lines
17 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;
}
}