Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipewire/DbRadiator.cpp
T

1321 lines
32 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#include "stdafx.h"
2026-09-28 15:28:50 +08:00
#include "DbRadiator.h"
#include "DbPipe.h"
#include "DbRect.h"
#include "PipeTools.h"
#include "dbtext.h"
ACRX_DXF_DEFINE_MEMBERS(ATSRadiator, ATSPipeNode, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
2026-10-04 00:04:20 +08:00
1, ATS_RADIATOR, "ATS_RADIATOR图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
2026-09-28 15:28:50 +08:00
IMPLEMENT_TENTBASE(TDbRadiator);
// const Adesk::UInt8 TDbRadiator::g_nVersion = 1;
const Adesk::UInt8 TDbRadiator::g_nVersion = 2; // sg modify
extern BOOL Is2DView();
2026-10-04 00:04:20 +08:00
#define SHOW_UNIT _T("ShowUnit") // 是否显示单位i
2026-09-28 15:28:50 +08:00
//////////////////////////////////////////////////////////////////////
// Construction
//////////////////////////////////////////////////////////////////////
TDbRadiator::TDbRadiator():
m_typeIFace(kSide), m_dSysAngle(0), m_bHasValve(TRUE), m_bIsReverse(FALSE),
m_nType(0), m_dWeight(0.35), m_dLoad(1000)
{
m_visibility = TPipeSys::kVisible;
m_dSizeX = 800.0;
m_dSizeY = 200.0;
m_dSizeZ = 600.0;
m_dRotation = 0.0;
2026-10-04 00:04:20 +08:00
// 添加2个接口
2026-09-28 15:28:50 +08:00
TPipeInterface iFace;
iFace.m_faceType = TPipeInterface::kBoundry;
2026-10-04 00:04:20 +08:00
iFace.m_flowDir = TPipeSys::kInlet; // 第1个接口流进
2026-09-28 15:28:50 +08:00
AddInterface(iFace);
2026-10-04 00:04:20 +08:00
iFace.m_flowDir = TPipeSys::kOutlet; // 第2个接口流出
2026-09-28 15:28:50 +08:00
AddInterface(iFace);
m_iDrawMode = 0;
m_iNum = 20;
m_dNum = 1.0; // sg add
2026-10-04 00:04:20 +08:00
m_sFactory = _T("无");
m_sType = _T("无");
2026-09-28 15:28:50 +08:00
m_nFormula = 0;
m_dA = 0;
m_dB = 0;
m_dUnitArea = 0;
m_dUnitQ = 0;
}
//////////////////////////////////////////////////////////////////////
// Override TDbEntity
//////////////////////////////////////////////////////////////////////
void TDbRadiator::CopyPropertiesFrom(AcDbEntity *pSrc, unsigned gMatchFlag)
{
assertWriteEnabled();
TDbPipeNode::CopyPropertiesFrom(pSrc, gMatchFlag);
TDbRadiator *pRadiator = TDbRadiator::cast(pSrc);
if (pRadiator != NULL)
{
m_dSizeX = pRadiator->m_dSizeX;
m_dSizeY = pRadiator->m_dSizeY;
m_dSizeZ = pRadiator->m_dSizeZ;
m_bHasValve = pRadiator->m_bHasValve;
m_bIsReverse = pRadiator->m_bIsReverse;
m_dRotation = pRadiator->m_dRotation;
m_dSysAngle = pRadiator->m_dSysAngle;
m_dWeight = pRadiator->m_dWeight;
m_iDrawMode = pRadiator->m_iDrawMode;
m_iNum = pRadiator->m_iNum;
m_dLoad = pRadiator->m_dLoad;
m_dNum = pRadiator->m_dNum;
m_sFactory = pRadiator->m_sFactory;
m_sType = pRadiator->m_sType;
m_nFormula = pRadiator->m_nFormula;
m_dA = pRadiator->m_dA;
m_dB = pRadiator->m_dB;
m_dUnitArea = pRadiator->m_dUnitArea;
m_dUnitQ = pRadiator->m_dUnitQ;
}
}
//AOLAPI double g_nAcadVer;
Acad::ErrorStatus TDbRadiator::subGetClassID(CLSID* pClsid) const
{
2026-10-04 00:04:20 +08:00
// delete by hh 2013-1-15 18及以上平台 开启特性表
2026-09-28 15:28:50 +08:00
// if (g_nAcadVer > 17.19)
// return Acad::eOk;
return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
// 取动态属性显示数据
2026-09-28 15:28:50 +08:00
void TDbRadiator::GetTips(DList<TObjInfoUnit> &info) const
{
2026-10-04 00:04:20 +08:00
info.Append(new TObjInfoUnit(_T("对象类型"), _T("散热器")));
2026-09-28 15:28:50 +08:00
BOOL bValidIn = FALSE;
BOOL bValidOut = FALSE;
if (m_lstInterface.Length() == 2)
{
bValidIn = HasInPipe();
bValidOut = HasOutPipe();
}
2026-10-04 00:04:20 +08:00
info.Append(new TObjInfoUnit(_T("散热器厂家"), m_sFactory));
info.Append(new TObjInfoUnit(_T("散热器型号"), m_sType));
info.Append(new TObjInfoUnit(_T("散热器长"), Dist2Str(m_dSizeX)));
info.Append(new TObjInfoUnit(_T("散热器宽"), Dist2Str(m_dSizeY)));
info.Append(new TObjInfoUnit(_T("散热器高"), Dist2Str(m_dSizeZ)));
info.Append(new TObjInfoUnit(_T("负荷"), XString(_T("%.1f"), m_dLoad)));
2026-09-28 15:28:50 +08:00
if (m_iDrawMode == 1)
{
2026-10-04 00:04:20 +08:00
info.Append(new TObjInfoUnit(_T("片数"), XString(_T("%.d"), m_iNum)));
2026-09-28 15:28:50 +08:00
}
else if (m_iDrawMode == 3)
{
2026-10-04 00:04:20 +08:00
info.Append(new TObjInfoUnit(_T("片数"), XString(_T("%.1f"), m_dNum)));
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
info.Append(new TObjInfoUnit(_T("进口连接"), bValidIn? _T("完成") : _T("未连")));
info.Append(new TObjInfoUnit(_T("出口连接"), bValidOut? _T("完成") : _T("未连")));
2026-09-28 15:28:50 +08:00
}
//////////////////////////////////////////////////////////////////////
// Override AcTDbEntity
//////////////////////////////////////////////////////////////////////
Acad::ErrorStatus
TDbRadiator::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::kOsModeCen ||
osnapMode == AcDb::kOsModeNode)
{
snapPoints.append(m_ptLocation);
}
es = TDbPipeNode::subGetOsnapPoints(osnapMode, gsSelectionMark, ptPick,
lastPoint, viewXform, snapPoints, geomIds);
return es;
}
Acad::ErrorStatus
TDbRadiator::GetGripText(int idx, CString &cs) const
{
Acad::ErrorStatus es = Acad::eOk;
switch(idx) {
case 0:
2026-10-04 00:04:20 +08:00
cs = _T("流进接口");
2026-09-28 15:28:50 +08:00
break;
case 1:
2026-10-04 00:04:20 +08:00
cs = _T("流出接口");
2026-09-28 15:28:50 +08:00
break;
case 2:
2026-10-04 00:04:20 +08:00
cs = _T("移动散热器");
2026-09-28 15:28:50 +08:00
break;
case 3:
2026-10-04 00:04:20 +08:00
cs = _T("移动标注点");
2026-09-28 15:28:50 +08:00
break;
default:
es = Acad::eInvalidInput;
}
return es;
}
Acad::ErrorStatus
TDbRadiator::subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
assertReadEnabled();
Acad::ErrorStatus es = Acad::eOk;
es = TDbPipeNode::subGetGripPoints(gripPoints, osnapModes, geomIds);
if (es != Acad::eOk)
{
return es;
}
return GetGSPoints(gripPoints);
}
Acad::ErrorStatus
TDbRadiator::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const
{
assertReadEnabled();
Acad::ErrorStatus es = Acad::eOk;
es = TDbPipeNode::subGetStretchPoints(stretchPoints);
if (es != Acad::eOk)
{
return es;
}
return GetGSPoints(stretchPoints);
}
Acad::ErrorStatus
TDbRadiator::GetGSPoints(AcGePoint3dArray & stretchPoints) const
{
Acad::ErrorStatus es = Acad::eOk;
XPoint pt1, pt2, pt3, pt4;
if (GetExplodeMode()==DRAW_2D || IsSysType())
{
GetVertexs2d(pt1, pt2, pt3, pt4);
}
else
{
GetRectVertexs(pt1, pt2, pt3, pt4, FALSE);
}
stretchPoints.append(m_ptLocation);
if (!!m_ptLabel)
{
stretchPoints.append(m_ptLabel);
}
return es;
}
Acad::ErrorStatus
TDbRadiator::subMoveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
Acad::ErrorStatus es = MoveGSPointsAt(indices, offset);
if (objectId().isValid())
{
ApplyChangeToPipe();
}
return es;
}
Acad::ErrorStatus
TDbRadiator::MoveGSPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
Acad::ErrorStatus es = Acad::eOk;
XPoint ptFix = m_ptLocation;
int idx = 0;
for (int i = 0; i < indices.length(); i++)
{
idx = indices[i];
switch(idx) {
case 2:
{
m_ptLocation += offset;
OutLocation() += offset;
InLocation() += offset;
break;
}
case 3:
{
m_ptLabel += offset;
break;
}
default:
break;
}
}
return Acad::eOk;
}
Acad::ErrorStatus
TDbRadiator::subMoveStretchPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
Acad::ErrorStatus es = Acad::eOk;
es = TDbPipeNode::subMoveStretchPointsAt(indices, offset);
if (es != Acad::eOk)
{
return es;
}
return MoveGSPointsAt(indices, offset);
}
Acad::ErrorStatus TDbRadiator::subTransformBy(const AcGeMatrix3d& xform)
{
assertWriteEnabled();
/*TDbPipeNode::subTransformBy(xform);
m_ptLocation.TransformBy(xform);
if (!!m_ptLabel)
{
m_ptLabel.TransformBy(xform); // gesp added
}
XVector3D vtRot(cos(m_dRotation), sin(m_dRotation));
((AcGeVector3d &)vtRot).transformBy(xform);
m_dRotation = ads_angle(XPoint(), vtRot);
2026-10-04 00:04:20 +08:00
// 系统图的角度 ywb 2009-6-11
2026-09-28 15:28:50 +08:00
XVector3D vtRot1(cos(m_dSysAngle), sin(m_dSysAngle));
((AcGeVector3d &)vtRot1).transformBy(xform);
m_dSysAngle = ads_angle(XPoint(), vtRot1);*/
// if (objectId().isValid()) {
// ApplyChangeToPipe();
// } // gesp
2026-10-04 00:04:20 +08:00
// change by hh 2012-08-16 move或copy时,忽略标高差
2026-09-28 15:28:50 +08:00
AcGeMatrix3d matNew(xform);
XString &sCmd = GetCurDocData()->m_sCurCommand;
if((0 == _tcsicmp(sCmd, _T("move")) || 0 == _tcsicmp(sCmd, _T("copy"))
|| 0 == _tcsicmp(sCmd, _T("pasteclip"))) && Is2DView())
{
/*AcGeVector3d vtNoneZ = xform.translation();
vtNoneZ = vtNoneZ.orthoProject(GetUcsZvt());
matNew.setToTranslation(vtNoneZ);*/
2026-10-04 00:04:20 +08:00
// delete by yxx 20150708 修改散热器在ucs下角度问题
2026-09-28 15:28:50 +08:00
}
TDbPipeNode::subTransformBy(matNew);
m_ptLocation.TransformBy(matNew);
if (!!m_ptLabel)
{
m_ptLabel.TransformBy(matNew);
}
XVector3D vtRot(cos(m_dRotation), sin(m_dRotation));
((AcGeVector3d &)vtRot).transformBy(matNew);
m_dRotation = ads_angle(XPoint(), vtRot);
2026-10-04 00:04:20 +08:00
// 系统图的角度
2026-09-28 15:28:50 +08:00
XVector3D vtRot1(cos(m_dSysAngle), sin(m_dSysAngle));
((AcGeVector3d &)vtRot1).transformBy(matNew);
m_dSysAngle = ads_angle(XPoint(), vtRot1);
return Acad::eOk;
}
//////////////////////////////////////////////////////////////////////
2026-10-04 00:04:20 +08:00
// 读写数据
2026-09-28 15:28:50 +08:00
//////////////////////////////////////////////////////////////////////
Acad::ErrorStatus TDbRadiator::dwgInFields(AcDbDwgFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es = TDbPipeNode::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((AcGePoint3d *)&m_ptLocation);
pFiler->readItem((AcGePoint3d *)&m_ptLabel);
pFiler->readItem(&m_dRotation);
pFiler->readItem(&m_dSizeX);
pFiler->readItem(&m_dSizeY);
pFiler->readItem(&m_dSizeZ);
pFiler->readItem(&m_dSysAngle);
//pFiler->readItem(&m_bHasValve);
//pFiler->readItem(&m_bIsReverse);
FilerRead(pFiler, m_bHasValve);
FilerRead(pFiler, m_bIsReverse);
pFiler->readItem(&m_nType);
pFiler->readItem(&m_dWeight);
pFiler->readItem(&m_iNum);
pFiler->readItem(&m_iDrawMode);
pFiler->readItem(&m_idLabelLayer);
pFiler->readItem(&m_dLoad);
if (nVer > 1)
{
pFiler->readItem(&m_dNum);
ReadString(pFiler, m_sFactory);
ReadString(pFiler, m_sType);
pFiler->readItem(&m_nFormula);
pFiler->readItem(&m_dA);
pFiler->readItem(&m_dB);
pFiler->readItem(&m_dUnitArea);
pFiler->readItem(&m_dUnitQ);
}
else
{
m_dNum = 1.0;
2026-10-04 00:04:20 +08:00
m_sFactory = _T("无");
m_sType = _T("无");
2026-09-28 15:28:50 +08:00
m_nFormula = 0;
m_dA = 0;
m_dB = 0;
m_dUnitArea = 0;
m_dUnitQ = 0;
}
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbRadiator::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es = TDbPipeNode::dwgOutFields(pFiler);
if (es != Acad::eOk)
{
return es;
}
es = TLabelStyle::dwgOutFields(pFiler);
if (es != Acad::eOk)
{
return es;
}
2026-10-04 00:04:20 +08:00
// if (g_nSaveTArchVer == 7) // 8.0使用
2026-09-28 15:28:50 +08:00
// {
// pFiler->writeItem((Adesk::UInt8)1);
// }
// else
// {
// pFiler->writeItem(g_nVersion);
// }
pFiler->writeItem(g_nVersion);
pFiler->writeItem((const AcGePoint3d &)m_ptLocation);
pFiler->writeItem((const AcGePoint3d &)m_ptLabel);
pFiler->writeItem(m_dRotation);
pFiler->writeItem(m_dSizeX);
pFiler->writeItem(m_dSizeY);
pFiler->writeItem(m_dSizeZ);
pFiler->writeItem(m_dSysAngle);
//pFiler->writeItem(m_bHasValve);
//pFiler->writeItem(m_bIsReverse);
FilerWrite(pFiler, m_bHasValve);
FilerWrite(pFiler, m_bIsReverse);
pFiler->writeItem(m_nType);
pFiler->writeItem(m_dWeight);
pFiler->writeItem(m_iNum);
pFiler->writeItem(m_iDrawMode);
pFiler->writeItem(m_idLabelLayer);
pFiler->writeItem(m_dLoad);
2026-10-04 00:04:20 +08:00
// if (g_nSaveTArchVer > 7) // 8.0使用
2026-09-28 15:28:50 +08:00
// {
pFiler->writeItem(m_dNum);
pFiler->writeItem((const TCHAR *)m_sFactory);
pFiler->writeItem((const TCHAR *)m_sType);
pFiler->writeItem(m_nFormula);
pFiler->writeItem(m_dA);
pFiler->writeItem(m_dB);
pFiler->writeItem(m_dUnitArea);
pFiler->writeItem(m_dUnitQ);
// }
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbRadiator::dxfInFields(AcDbDxfFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es = TDbPipeNode::dxfInFields(pFiler);
if (es!=Acad::eOk)
{
return es;
}
if (!pFiler->atSubclassData(_T("TDbRadiator")))
{
return Acad::eBadDxfSequence;
}
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbRadiator::dxfOutFields(AcDbDxfFiler* pFiler) const
{
Acad::ErrorStatus es;
es = TDbPipeNode::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = pFiler->writeItem(AcDb::kDxfSubclass, _T("TDbRadiator"));
assert(es == Acad::eOk);
return es;
}
//////////////////////////////////////////////////////////////////////
2026-10-04 00:04:20 +08:00
// 有关Rect
2026-09-28 15:28:50 +08:00
//////////////////////////////////////////////////////////////////////
void TDbRadiator::AsRect(TDbRect &rect) const
{
rect.setPropertiesFrom(this);
rect.SetCenter(m_ptLocation);
rect.SetSizeX(m_dSizeX);
rect.SetSizeY(m_dSizeY);
rect.SetSizeZ(m_dSizeZ);
rect.SetRotation(m_dRotation);
}
void TDbRadiator::GetVertexs2d(XPoint &pt1, XPoint &pt2, XPoint &pt3,
XPoint &pt4) const
{
if (IsSysType())
{
GetSysVertexs2d(pt1, pt2, pt3, pt4);
}
else
{
GetRectVertexs(pt1, pt2, pt3, pt4, TRUE);
}
}
void TDbRadiator::GetSysVertexs2d(XPoint &pt1, XPoint &pt2, XPoint &pt3,
XPoint &pt4) const
{
double dAngle = CT_std_angle(m_dSysAngle);
double dSizeX = cos(dAngle) * m_dSizeX;
double dSubZ = sin(dAngle) * m_dSizeX;
pt1.x = m_ptLocation.x;
pt1.y = m_ptLocation.y - m_dSizeZ/2;
pt2.x = pt1.x + dSizeX;
pt2.y = pt1.y + dSubZ;
pt3.x = pt2.x;
pt3.y = pt2.y + m_dSizeZ;
pt4.x = m_ptLocation.x;
pt4.y = m_ptLocation.y + m_dSizeZ/2;
pt1.z = pt2.z = pt3.z = pt4.z = 0;
}
void TDbRadiator::GetSysVertexs(XPoint &ptLeftLow, XPoint &ptRightLow,
XPoint &ptRightUp, XPoint &ptLeftUp) const
{
GetSysVertexs2d(ptLeftLow, ptRightLow, ptRightUp, ptLeftUp);
double dAngle = CT_std_angle(m_dSysAngle);
if (dAngle>PI/2 && dAngle<PI*3/2)
{
TchPrivate::Exchange(ptLeftLow, ptRightLow);
TchPrivate::Exchange(ptRightUp, ptLeftUp);
}
}
void TDbRadiator::GetRectVertexs(XPoint &ptLeftLow, XPoint &ptRightLow,
XPoint &ptRightUp, XPoint &ptLeftUp, BOOL b2d) const
{
double dSizeX = fabs(m_dSizeX/2);
double dSizeY = fabs(m_dSizeY/2);
ptLeftLow.x = m_ptLocation.x - dSizeX;
ptLeftLow.y = m_ptLocation.y - dSizeY;
ptRightLow.x = m_ptLocation.x + dSizeX;
ptRightLow.y = m_ptLocation.y - dSizeY;
ptRightUp.x = m_ptLocation.x + dSizeX;
ptRightUp.y = m_ptLocation.y + dSizeY;
ptLeftUp.x = m_ptLocation.x - dSizeX;
ptLeftUp.y = m_ptLocation.y + dSizeY;
ads_matrix mat;
m_ptLocation.GetRotationMatrix(m_dRotation, mat);
ptLeftLow.TransformBy(mat);
ptRightLow.TransformBy(mat);
ptRightUp.TransformBy(mat);
ptLeftUp.TransformBy(mat);
if (b2d)
{
ptLeftLow.z = ptRightLow.z = ptRightUp.z = ptLeftUp.z = 0;
}
else
{
ptLeftLow.z = ptRightLow.z = ptRightUp.z = ptLeftUp.z = m_ptLocation.z;
}
}
void TDbRadiator::GetOutline(XPoly2D &poly) const
{
poly.Reset();
poly.SetFlag(1);
XPoint pt1, pt2, pt3, pt4;
GetVertexs2d(pt1, pt2, pt3, pt4);
poly.AppendNode(pt1);
poly.AppendNode(pt2);
poly.AppendNode(pt3);
poly.AppendNode(pt4);
}
//////////////////////////////////////////////////////////////////////
2026-10-04 00:04:20 +08:00
// 有关绘制
2026-09-28 15:28:50 +08:00
//////////////////////////////////////////////////////////////////////
extern void DrawWeight(XExplodeDraw &dc, double dWeight, XPoly2D &poly,
int nColorIndex, double nScale);
2026-10-04 00:04:20 +08:00
// 绘制2D散热器实体
2026-09-28 15:28:50 +08:00
Acad::ErrorStatus TDbRadiator::DrawRadiator2d(XExplodeDraw &dc) const
{
XAcGiViewDraw &viewDraw = (XAcGiViewDraw &)dc;
XPoly2D poly;
GetOutline(poly);
if (!IsSysType())
{
double dWeight = GetPScale()*m_dWeight;
DrawWeight(dc, dWeight, poly, colorIndex(), linetypeScale());
}
else
{
2026-10-04 00:04:20 +08:00
// change by zh 解决系统散热器不加粗的问题
2026-09-28 15:28:50 +08:00
//dc << poly;
double dWeight = GetPScale()*m_dWeight;
DrawWeight(dc, dWeight, poly, colorIndex(), linetypeScale());
}
return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
// 绘制2D阀门
2026-09-28 15:28:50 +08:00
Acad::ErrorStatus TDbRadiator::DrawValve2d(XExplodeDraw &dc) const
{
if (m_bHasValve && IsSysType())
{
XPoint ptLeftLow, ptRightLow, ptRightUp, ptLeftUp;
2026-10-04 00:04:20 +08:00
// 散热器的系统图边框
2026-09-28 15:28:50 +08:00
GetSysVertexs2d(ptLeftLow, ptRightLow, ptRightUp, ptLeftUp);
// double dAngle = CT_std_angle(m_dSysAngle); // sg modify
double dAngle(0);
XPoint pt0, pt1, pt2;
2026-10-04 00:04:20 +08:00
if (m_bIsReverse) // 相反
2026-09-28 15:28:50 +08:00
{
dAngle = CT_std_angle(m_dSysAngle - PI);
pt0 = ptLeftLow;
}
2026-10-04 00:04:20 +08:00
else // 相同
2026-09-28 15:28:50 +08:00
{
dAngle = CT_std_angle(m_dSysAngle);
pt0 = ptRightLow;
}
pt0.y += m_dSizeZ * 5/6;
ads_polar(pt0, dAngle, m_dSizeZ/6, pt1);
pt2 = pt1;
pt2.y += m_dSizeZ * 2/6;
2026-10-04 00:04:20 +08:00
dc << XLine(pt0, pt1) << XLine(pt1, pt2); // 排气阀
2026-09-28 15:28:50 +08:00
}
return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
// 绘制2D标注文字
2026-09-28 15:28:50 +08:00
Acad::ErrorStatus TDbRadiator::DrawLabelText(XExplodeDraw &dc) const
{
AcDbObjectId idLayerOld = dc.GetLayerId();
if (m_idLabelLayer.isValid())
{
dc.SetLayer(m_idLabelLayer);
}
TDbText text;
text.setPropertiesFrom(this);
text.setLayer(m_idLabelLayer);
text.SetStyleId(m_idTextStyle);
BOOL bUnit = GetUnit();
if (m_iDrawMode == 1)
{
2026-10-04 00:04:20 +08:00
// text.SetText(XString(_T("%d"), m_iNum)); // 标注片数,片单位 modify yxx 2015 -5-29
2026-09-28 15:28:50 +08:00
if ( !bUnit )
text.SetText(XString(_T("%d"), m_iNum));
else
2026-10-04 00:04:20 +08:00
text.SetText(XString(_T("%d 片"), m_iNum));
2026-09-28 15:28:50 +08:00
}
else if (m_iDrawMode == 2) // sg add
{
2026-10-04 00:04:20 +08:00
//text.SetText(XString(_T("%.1f"), m_dLoad)); // 标注负荷 modify yxx 2015 -5-29
2026-09-28 15:28:50 +08:00
if ( !bUnit )
text.SetText(XString(_T("%.1f"), m_dLoad));
else
text.SetText(XString(_T("%.1f W"), m_dLoad));
}
else if (m_iDrawMode == 3)
{
2026-10-04 00:04:20 +08:00
//text.SetText(XString(_T("%.1f"), m_dNum)); // 标注片数,m单位 modify yxx 2015 -5-29
2026-09-28 15:28:50 +08:00
if ( !bUnit )
text.SetText(XString(_T("%.1f"), m_dNum));
else
text.SetText(XString(_T("%.1f M"), m_dNum));
}
text.SetHeight(m_dTextHeight);
double dAngle = GetAngle(); // sg add
dAngle = CT_std_angle(dAngle);
if ((dAngle > -1.0E-5) && (dAngle < PI/2 + 1.0E-5)) // [0, PI/2]
{
dAngle = dAngle;
}
else if ((dAngle > PI/2 + 1.0E-5) && (dAngle < PI*1.5 + 1.0E-5)) // (PI/2, 1.5*PI]
{
dAngle = dAngle + PI;
}
else if ((dAngle > PI*1.5 + 1.0E-5) && (dAngle < 2*PI - 1.0E-5)) // (1.5*PI, 2*PI)
{
dAngle = dAngle - PI*2;
}
text.SetAlignment(XExplodeDraw::kMiddleCenter);
text.SetLocation(m_ptLabel);
text.SetRotation(dAngle);
dc.DrawEntity(text);
dc.SetLayer(idLayerOld);
return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
// 2D绘制
2026-09-28 15:28:50 +08:00
Acad::ErrorStatus TDbRadiator::ExplodeOrDraw2d(XExplodeDraw &dc) const
{
2026-10-04 00:04:20 +08:00
// cet 2016.10.17 add 图层关闭时,实体不显示,不进行绘制(打印时,也不会绘制)
2026-09-28 15:28:50 +08:00
AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead);
if (player.openStatus() == Acad::eOk && player->isOff())
{
return Acad::eOk;
}
Acad::ErrorStatus es = Acad::eOk;
2026-10-04 00:04:20 +08:00
es = DrawRadiator2d(dc); // 散热器
es = DrawValve2d(dc); // 排气阀
if (m_iDrawMode > 0) // 标注,支持模型图也标注
2026-09-28 15:28:50 +08:00
{
DrawLabelText(dc);
}
return es;
}
2026-10-04 00:04:20 +08:00
// 3D绘制
2026-09-28 15:28:50 +08:00
Acad::ErrorStatus TDbRadiator::ExplodeOrDraw3d(XExplodeDraw &dc) const
{
Acad::ErrorStatus es = Acad::eOk;
2026-10-04 00:04:20 +08:00
if (!IsSysType()) // 实体,平面图
2026-09-28 15:28:50 +08:00
{
if (fabs(m_dSizeX)>1.0E-3 || fabs(m_dSizeY)>1.0E-3)
{
TDbRect rect;
AsRect(rect);
es = rect.ExplodeOrDraw3d(dc);
}
}
2026-10-04 00:04:20 +08:00
else // 系统图
2026-09-28 15:28:50 +08:00
{
return ExplodeOrDraw2d(dc);
}
return es;
}
//////////////////////////////////////////////////////////////////////
2026-10-04 00:04:20 +08:00
// 有关连接
2026-09-28 15:28:50 +08:00
//////////////////////////////////////////////////////////////////////
2026-10-04 00:04:20 +08:00
// 判断节点是否可以连接管段,nPos:0——start;1——end
2026-09-28 15:28:50 +08:00
BOOL TDbRadiator::CanLinkSide(const AcDbObjectId &idPipe, int nPos) const
{
BOOL bRet = FALSE;
OPENOBJ_BEGIN(idPipe, AcDb::kForRead, TDbPipe, pPipe);
if (pPipe != NULL)
{
XPoint ptRef = nPos ? pPipe->EndPoint() : pPipe->StartPoint();
2026-10-04 00:04:20 +08:00
if (IsSysType()) // 系统图
2026-09-28 15:28:50 +08:00
{
XPoly2D poly;
GetOutline(poly);
XPoint pt(ptRef.x, ptRef.y);
if (poly.HitTestOnCurve(pt) != 0)
{
bRet = TRUE;
}
}
2026-10-04 00:04:20 +08:00
else // 平面图
2026-09-28 15:28:50 +08:00
{
TDbRect rect;
AsRect(rect);
rect.SetElevation(0.0);
XPoint pt(ptRef.x, ptRef.y);
XPoint ptHit;
if (rect.getClosestPointTo(pt, ptHit)==Acad::eOk &&
pt.Distance2d(ptHit)<PS_SNAP)
{
bRet = TRUE;
}
2026-10-04 00:04:20 +08:00
if (bRet == FALSE) // 下接口情况
2026-09-28 15:28:50 +08:00
{
TDbRect newRect;
AsRect(newRect);
XPoint ptLeft, ptRight, ptHit;
ads_polar(m_ptLocation, m_dRotation, -m_dSizeX/2, ptLeft);
ads_polar(m_ptLocation, m_dRotation, m_dSizeX/2, ptRight);
AcDbLine helpLine(ptLeft, ptRight);
if (helpLine.getClosestPointTo(ptRef, ptHit, false) == Acad::eOk
&& ptRef.Distance(ptHit)<PS_SNAP)
{
bRet = TRUE;
}
}
}
}
OPENOBJ_END();
return bRet;
}
BOOL TDbRadiator::CanInLinkSide(const AcDbObjectId &idPipe) const
{
BOOL bRet = FALSE;
OPENOBJ_BEGIN(idPipe, AcDb::kForRead, TDbPipe, pPipe);
if (pPipe != NULL)
{
if (CanInLinkSide(pPipe, 0))
{
bRet = TRUE;
}
else if (CanInLinkSide(pPipe, 1))
{
bRet = TRUE;
}
}
OPENOBJ_END();
return bRet;
}
BOOL TDbRadiator::CanOutLinkSide(const AcDbObjectId &idPipe) const
{
BOOL bRet = FALSE;
OPENOBJ_BEGIN(idPipe, AcDb::kForRead, TDbPipe, pPipe);
if (pPipe != NULL)
{
if (CanOutLinkSide(pPipe, 0))
{
bRet = TRUE;
}
else if (CanOutLinkSide(pPipe, 1))
{
bRet = TRUE;
}
}
OPENOBJ_END();
return bRet;
}
// nPos: 0--start; 1--end
BOOL TDbRadiator::CanInLinkSide(const TDbPipe* pPipe, int nPos) const
{
BOOL bRet = FALSE;
const XPoint &ptRef = nPos==1 ? pPipe->EndPoint() : pPipe->StartPoint();
double dDist = ptRef.Distance(GetInLocation());
2026-10-04 00:04:20 +08:00
if (dDist < PS_SNAP) // 进口
2026-09-28 15:28:50 +08:00
{
bRet = TRUE;
}
return bRet;
}
// nPos: 0--start; 1--end
BOOL TDbRadiator::CanOutLinkSide(const TDbPipe* pPipe, int nPos) const
{
BOOL bRet=FALSE;
const XPoint &ptRef = nPos==1 ? pPipe->EndPoint() : pPipe->StartPoint();
double dDist = ptRef.Distance(GetOutLocation());
2026-10-04 00:04:20 +08:00
if (dDist < PS_SNAP) // 出口
2026-09-28 15:28:50 +08:00
{
bRet=TRUE;
}
return bRet;
}
2026-10-04 00:04:20 +08:00
//对st类型的接口进行重新连接
2026-09-28 15:28:50 +08:00
void TDbRadiator::UpdateLinkage(const XPoint &ptAt, TPipeSys::SysType st,
const DList<AcDbObjectId> &idPipes)
{
assertWriteEnabled();
if (m_lstInterface.Length() != 2)
{
return;
}
TPipeInterface &inFace = *m_lstInterface.Head();
TPipeInterface &outFace = *m_lstInterface.Tail();
XPoint ptConnet;
if (!CanInLinkSide(inFace.m_idPipe))
{
inFace.m_idPipe = AcDbObjectId::kNull;
for (int i = 0; i < idPipes.Length(); i++)
{
const AcDbObjectId &id1 = idPipes[i];
if (id1 == outFace.m_idPipe)
{
continue;
}
OPENOBJ_BEGIN(id1, AcDb::kForRead, TDbPipe, pPipe);
if (pPipe != NULL)
{
if (ptAt.Distance(pPipe->StartPoint()) < ptAt.Distance(pPipe->EndPoint()))
{
ptConnet = pPipe->StartPoint();
}
else
{
ptConnet = pPipe->EndPoint();
}
if (ptConnet.Distance(InLocation())<ptConnet.Distance(OutLocation())
|| HasOutPipe())
{
inFace.m_idPipe = id1;
inFace.m_ptLocation = ptConnet;
}
else
{
outFace.m_idPipe = id1;
outFace.m_ptLocation = ptConnet;
}
}
OPENOBJ_END();
}
}
if (!CanOutLinkSide(outFace.m_idPipe))
{
outFace.m_idPipe = AcDbObjectId::kNull;
for (int i = 0; i < idPipes.Length(); i++)
{
const AcDbObjectId &id1 = idPipes[i];
if (id1 == inFace.m_idPipe)
{
continue;
}
OPENOBJ_BEGIN(id1, AcDb::kForRead, TDbPipe, pPipe);
if (pPipe != NULL)
{
if (ptAt.Distance(pPipe->StartPoint()) < ptAt.Distance(pPipe->EndPoint()))
{
ptConnet = pPipe->StartPoint();
}
else
{
ptConnet = pPipe->EndPoint();
}
if (ptConnet.Distance(InLocation())>ptConnet.Distance(OutLocation())
|| HasInPipe())
{
outFace.m_idPipe = id1;
outFace.m_ptLocation = ptConnet;
}
else
{
inFace.m_idPipe = id1;
inFace.m_ptLocation = ptConnet;
}
}
OPENOBJ_END();
}
}
}
void TDbRadiator::UpdateInterface()
{
assertWriteEnabled();
if (!IsSysType())
{
TDbRect rect;
AsRect(rect);
XPoint ptLowLeft = rect.GetLowLeft();
XPoint ptUpRight = rect.GetUpRight();
Midpoint(rect.GetLowLeft(), rect.GetUpLeft(), InLocation())
Midpoint(rect.GetLowRight(), rect.GetUpRight(), OutLocation())
}
else
{
XPoint pt1, pt2, pt3, pt4;
GetSysVertexs2d(pt1,pt2,pt3,pt4);
double dAngle = CT_std_angle(m_dSysAngle) + PI/2;
ads_polar(m_ptLocation, dAngle, 200, InLocation());
ads_polar(m_ptLocation, -dAngle, 200, OutLocation());
}
}
2026-10-04 00:04:20 +08:00
// nPos:0-start,1-end
// pt——与接口连接的点;vt——接口向量;pPipe——AcDb::kForWrite
2026-09-28 15:28:50 +08:00
void TDbRadiator::ChangePipe(TDbPipe *pPipe, const XPoint &pt) const
{
if (pPipe == NULL)
{
return;
}
if (pPipe->isWriteEnabled() && pPipe->Is(CURVE_LINE))
{
int nFlag = pt&(*pPipe);
BOOL bChangeOneSide = nFlag==PR_INSIDE || nFlag==PR_EXTEND || nFlag==PR_ONPT1
|| nFlag==PR_ONPT2;
if (bChangeOneSide)
{
pPipe->assertWriteEnabled();
double nAng = ads_angle(pPipe->GetStartPoint(), pPipe->GetEndPoint());
if (pPipe->GetNode(1) == objectId())
{
double nAng2 = ads_angle(pPipe->GetStartPoint(), pt);
if (fabs(nAng - nAng2) < 0.01)
{
pPipe->EndPoint() = pt;
}
}
else if (pPipe->GetNode(0) == objectId())
{
double nAng2 = ads_angle(pt, pPipe->EndPoint());
if (fabs(nAng - nAng2) < 0.01)
{
pPipe->StartPoint() = pt;
}
}
}
}
}
2026-10-04 00:04:20 +08:00
// 将散热器的变化应用到连接的管线
2026-09-28 15:28:50 +08:00
void TDbRadiator::ApplyChangeToPipe() const
{
TPipeInterface &inFace = *m_lstInterface.Head();
TPipeInterface &outFace = *m_lstInterface.Tail();
OPENOBJ_BEGIN(GetInPipe(), AcDb::kForWrite, TDbPipe, pPipe);
if (pPipe != NULL)
{
ChangePipe(pPipe, GetInLocation());
}
OPENOBJ_END();
OPENOBJ_BEGIN(GetOutPipe(), AcDb::kForWrite, TDbPipe, pPipe);
if (pPipe != NULL)
{
ChangePipe(pPipe, GetOutLocation());
}
OPENOBJ_END();
inFace.m_idPipe = AcDbObjectId::kNull;
outFace.m_idPipe = AcDbObjectId::kNull;
}
2026-10-04 00:04:20 +08:00
// 导出XML
2026-09-28 15:28:50 +08:00
CString TDbRadiator::GetXml(const AcGeMatrix3d& mat) const
{
2026-10-04 00:04:20 +08:00
if (1 == m_nType) // 系统图不导出
2026-09-28 15:28:50 +08:00
return CString();
2026-10-04 00:04:20 +08:00
int nPtPreci = 6; // 位置精度
int nWhPreci = 0; // 宽度、高度精度
2026-09-28 15:28:50 +08:00
TXmlTree xmlTree;
CString csText;
POSITION posRoot = xmlTree.Insert(_T("ATS_RADIATOR"), NULL, NULL);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posRoot, _T("name"), _T("散热器"));
xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称"));
2026-09-28 15:28:50 +08:00
}
POSITION posItemDrawType = xmlTree.Insert(_T("DrawType"), posRoot, NULL);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItemDrawType, _T("name"), _T("绘制类型"));
xmlTree.SetAttribute(posItemDrawType, _T("comment"), _T("0:模型图,1:系统图"));
2026-09-28 15:28:50 +08:00
csText.Format(_T("%d"), m_nType);
xmlTree.SetItemText(posItemDrawType, csText);
}
POSITION posItemLoc = xmlTree.Insert(_T("Location"), posRoot, posItemDrawType);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItemLoc, _T("name"), _T("位置"));
xmlTree.SetAttribute(posItemLoc, _T("comment"), _T("基准点为底面中心点"));
2026-09-28 15:28:50 +08:00
AcGePoint3d ptLoc = m_ptLocation;
ptLoc.transformBy(mat);
csText.Format(_T("%s,%s,%s"), DoubleToString(ptLoc.x, nPtPreci),
DoubleToString(ptLoc.y, nPtPreci), DoubleToString(ptLoc.z, nPtPreci));
xmlTree.SetItemText(posItemLoc, csText);
}
POSITION posItemRotation = xmlTree.Insert(_T("Rotation"), posRoot, posItemLoc);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItemRotation, _T("name"), _T("角度"));
xmlTree.SetAttribute(posItemRotation, _T("comment"), _T("布置时旋转的角度(角度制)"));
2026-09-28 15:28:50 +08:00
csText = DoubleToString(m_dRotation * 180.0 / PI, 2);
xmlTree.SetItemText(posItemRotation, csText);
}
POSITION posItemLength = xmlTree.Insert(_T("Length"), posRoot, posItemRotation);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItemLength, _T("name"), _T("长度"));
xmlTree.SetAttribute(posItemLength, _T("comment"), _T("散热器的长度"));
2026-09-28 15:28:50 +08:00
csText = DoubleToString(m_dSizeX, nWhPreci);
xmlTree.SetItemText(posItemLength, csText);
}
POSITION posItemWidth = xmlTree.Insert(_T("Width"), posRoot, posItemLength);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItemWidth, _T("name"), _T("宽度"));
xmlTree.SetAttribute(posItemWidth, _T("comment"), _T("散热器的宽度"));
2026-09-28 15:28:50 +08:00
csText = DoubleToString(m_dSizeY, nWhPreci);
xmlTree.SetItemText(posItemWidth, csText);
}
POSITION posItemHeight = xmlTree.Insert(_T("Height"), posRoot, posItemLength);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItemHeight, _T("name"), _T("高度"));
xmlTree.SetAttribute(posItemHeight, _T("comment"), _T("散热器的高度"));
2026-09-28 15:28:50 +08:00
csText = DoubleToString(m_dSizeZ, nWhPreci);
xmlTree.SetItemText(posItemHeight, csText);
}
POSITION posItemFactory = xmlTree.Insert(_T("Factory"), posRoot, posItemHeight);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItemFactory, _T("name"), _T("厂家"));
xmlTree.SetAttribute(posItemFactory, _T("comment"), _T("厂家"));
2026-09-28 15:28:50 +08:00
xmlTree.SetItemText(posItemFactory, m_sFactory);
}
POSITION posItemModel = xmlTree.Insert(_T("Model"), posRoot, posItemFactory);
{
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posItemModel, _T("name"), _T("型号"));
xmlTree.SetAttribute(posItemModel, _T("comment"), _T("型号"));
2026-09-28 15:28:50 +08:00
xmlTree.SetItemText(posItemModel, m_sType);
}
POSITION posObjId = xmlTree.Insert(_T("Object_ID"), posRoot, posItemModel);
{
xmlTree.SetAttribute(posObjId, _T("name"),_T("ID"));
2026-10-04 00:04:20 +08:00
xmlTree.SetAttribute(posObjId, _T("comment"),_T("散热器ID"));
2026-09-28 15:28:50 +08:00
csText.Format(_T("%ld"), 0x7FFFFFFF & objectId().asOldId());
xmlTree.SetItemText(posObjId, csText);
}
CString csXml = xmlTree.GetXml();
CString csBase = TEntityBase::GetXml(mat);
int nIndex = csXml.Find(_T("</TCH_"));
if (nIndex > -1)
csXml.Insert(nIndex, csBase);
return csXml;
}
bool TDbRadiator::GetSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir,
std::vector<TObjSectionRecord> &sectionRecord, AcDbVoidPtrArray& arFillPtrs) const
{
2026-10-04 00:04:20 +08:00
TGGeSectionPlane section_pln(face, vtPlaneSecDir); // 构造一个辅助剖面
2026-09-28 15:28:50 +08:00
AcDbVoidPtrArray arFaces;
XExplodeStream dc(arFaces);
ExplodeOrDraw3d(dc);
double dElevation(0.0);
AcDbEntity* pEnt = NULL;
AcDbFace* pFace = NULL;
int i(0);
for (i = 0; i < arFaces.length(); ++i)
{
pEnt = (AcDbEntity*)arFaces[i];
if (NULL == pEnt)
continue;
pFace = AcDbFace::cast(pEnt);
if (pFace)
{
TGGeSectionPlane pln(*pFace, vtPlaneSecDir);
TGGePoly2D poly;
dElevation = SectionUtility::Projection_plane2plane(section_pln, pln, poly);
sectionRecord.push_back(TObjSectionRecord(objectId(), layerId(), TObjSectionRecord::eTCH_RADIATOR, dElevation, poly));
}
delete pEnt;
}
return true;
}
Acad::ErrorStatus TDbRadiator::GetExtents(TADSGePoint3d &ptLow, TADSGePoint3d &ptUp) const
{
2026-10-04 00:04:20 +08:00
// mcl add 2011.4.7. 解决自由复制、自由移动时 消失(跑远)问题
2026-09-28 15:28:50 +08:00
XPoly2D poly;
GetOutline(poly);
if (RTNORM == poly.GetExtend(ptLow, ptUp))
return Acad::eOk;
return Acad::eNotImplementedYet;
}
//////////////////////////////////////////////////////////////////////
2026-10-04 00:04:20 +08:00
// 有关标注
2026-09-28 15:28:50 +08:00
//////////////////////////////////////////////////////////////////////
2026-10-04 00:04:20 +08:00
// 设置标注方式
2026-09-28 15:28:50 +08:00
void TDbRadiator::SetDrawMode(int iMode)
{
assertWriteEnabled();
m_iDrawMode = iMode;
if (m_iDrawMode > 0 && !m_ptLabel)
{
XPoint pt1, pt2, pt3, pt4;
GetSysVertexs2d(pt1, pt2, pt3, pt4);
Midpoint(pt1, pt3, m_ptLabel);
2026-10-04 00:04:20 +08:00
if (!IsSysType()) // 默认标在散热器上面
2026-09-28 15:28:50 +08:00
{
m_ptLabel.y += m_dSizeY/2 + m_dTextHeight*DocGetPScale();
}
}
}
BOOL TDbRadiator::GetUnit() const
{
assertReadEnabled();
BOOL bUnit;
const TEntityFields &fd = GetFields();
if( !fd.GFD(SHOW_UNIT, bUnit) )
{
bUnit = FALSE;
}
return bUnit;
}
void TDbRadiator::SetUnit(BOOL bUnit)
{
assertWriteEnabled();
TEntityFields &fd = Fields();
fd.SFD(SHOW_UNIT, bUnit);
}
2026-10-04 00:04:20 +08:00
// 在位编辑
2026-09-28 15:28:50 +08:00
double StringAnalysis(const CString &src, const Adesk::UInt8 &nType);
void TDbRadiator::SetSubText(long i, CString sText) // sg add
{
assertWriteEnabled();
double dRet = ::StringAnalysis(sText, m_iDrawMode);
if (dRet < 0)
{
return;
}
2026-10-04 00:04:20 +08:00
if (m_iDrawMode == 3) // 散热器片数(M)
2026-09-28 15:28:50 +08:00
{
SetMNum(dRet);
}
2026-10-04 00:04:20 +08:00
else if (m_iDrawMode == 2) // 负荷
2026-09-28 15:28:50 +08:00
{
SetLoad(dRet);
}
2026-10-04 00:04:20 +08:00
else if (m_iDrawMode == 1) // 散热器片数(片)
2026-09-28 15:28:50 +08:00
{
SetNum((int)dRet);
}
}
//////////////////////////////////////////////////////////////////////////
void InitDbRadiator(BOOL bTrue)
{
if (bTrue)
{
TDbRadiator::rxInit();
TDbRadiator::InitMatchProtocol(TRUE);
}
else
{
TDbRadiator::InitMatchProtocol(FALSE);
deleteAcRxClass(TDbRadiator::desc());
}
}
//////////////////////////////////////////////////////////////////////////
2026-10-04 00:04:20 +08:00
// 用于分析系统散热器的标注。sg add
// Adesk::UInt8 nType; // 1:标注片数(片);2:标注负荷;3:标注片数(m)
2026-09-28 15:28:50 +08:00
double StringAnalysis(const CString &src, const Adesk::UInt8 &nType)
{
double dRet = -1.0;
BOOL bFlag(TRUE);
int nLen = src.GetLength();
for (int i = 0; i < nLen; i++)
{
if (_istdigit(src[i]))
{
continue;
}
else if (src[i] == _T('.'))
{
if ((nType == 2) || (nType == 3))
{
continue;
}
else if (nType == 1)
{
dRet = _tstof(src.Left(i));
dRet++;
bFlag = FALSE;
break;
}
}
else
{
bFlag = FALSE;
2026-10-04 00:04:20 +08:00
ads_alert(_T("请输入数字!"));
2026-09-28 15:28:50 +08:00
break;
}
}
if (bFlag)
{
dRet = _tstof(src);
}
return dRet;
}