Files
envi-code/SourceCode/Code2026/CoreLibrary/Implement/i_ImpHvacReducer.cpp
T

2273 lines
58 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 "ImpHvacReducer.h"
#include "AecDbObjXDataMap.h"
#include "AuxTools.h"
#include "math.h"
#include "dbxutil.h"
#include "dbsymutl.h"
using namespace AecEqui;
extern double MayAsMUnit(double dVal);
ImpHvacReducer::ImpHvacReducer()
{
m_pXDataMap = NULL;
m_pOwnerEnt = NULL;
}
ImpHvacReducer::~ImpHvacReducer()
{
}
void ImpHvacReducer::list() const
{
if (NULL == m_pXDataMap)
return;
2026-10-04 00:04:20 +08:00
// 管件类型
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 暖通:变径"));
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
// 截面类型
2026-09-28 15:28:50 +08:00
ESection eStartSectType = eRect;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType);
switch (eStartSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:矩形")); break;
case eCircle: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:圆形")); break;
case eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:扁圆形")); break;
2026-09-28 15:28:50 +08:00
}
ESection eEndSectType = eRect;
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:矩形")); break;
case eCircle: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:圆形")); break;
case eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:扁圆形")); break;
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
// 圆型截面显示直径
2026-09-28 15:28:50 +08:00
if (eCircle == eStartSectType)
{
double dDiameter = 0.0;
m_pXDataMap->GetAt(HRED_StartDiameter, dDiameter);
2026-10-04 00:04:20 +08:00
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t始端直径:%.2f"), dDiameter);
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
// 非圆型截面显示宽度和厚度
2026-09-28 15:28:50 +08:00
else
{
double dWidth = 0.0, dThick = 0.0;
m_pXDataMap->GetAt(HRED_StartWidth, dWidth);
m_pXDataMap->GetAt(HRED_StartThick, dThick);
2026-10-04 00:04:20 +08:00
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t始端宽度:%.2f 始端厚度:%.2f"), dWidth, dThick);
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
// 圆型截面显示直径
2026-09-28 15:28:50 +08:00
if (eCircle == eEndSectType)
{
double dDiameter = 0.0;
m_pXDataMap->GetAt(HRED_EndDiameter, dDiameter);
2026-10-04 00:04:20 +08:00
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t末端直径:%.2f"), dDiameter);
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
// 非圆型截面显示宽度和厚度
2026-09-28 15:28:50 +08:00
else
{
double dWidth = 0.0, dThick = 0.0;
m_pXDataMap->GetAt(HRED_EndWidth, dWidth);
m_pXDataMap->GetAt(HRED_EndThick, dThick);
2026-10-04 00:04:20 +08:00
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t末端宽度:%.2f 末端厚度:%.2f"), dWidth, dThick);
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
// 起点
2026-09-28 15:28:50 +08:00
AcGePoint3d pt;
m_pXDataMap->GetAt(HRED_StartPoint, pt);
2026-10-04 00:04:20 +08:00
acutPrintf(_T("\n\t\t\t\t\t\t\t\t自 点,X=%.4f\t Y=%.4f\t Z=%.4f"), pt.x, pt.y, pt.z);
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
// 终点
2026-09-28 15:28:50 +08:00
m_pXDataMap->GetAt(HRED_EndPoint, pt);
2026-10-04 00:04:20 +08:00
acutPrintf(_T("\n\t\t\t\t\t\t\t\t到 点,X=%.4f\t Y=%.4f\t Z=%.4f"), pt.x, pt.y, pt.z);
2026-09-28 15:28:50 +08:00
}
BOOL ImpHvacReducer::IsHorzAlignment() const
{
2026-10-04 00:04:20 +08:00
// 获得法向量
2026-09-28 15:28:50 +08:00
AcGeVector3d vtSect;
m_pXDataMap->GetAt(HRED_StartDir, vtSect);
2026-10-04 00:04:20 +08:00
// 获得UCS坐标Z向量
2026-09-28 15:28:50 +08:00
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
return vtSect.isPerpendicularTo(vtZAxis);
}
BOOL ImpHvacReducer::IsVertAlignment() const
{
2026-10-04 00:04:20 +08:00
// 获得法向量
2026-09-28 15:28:50 +08:00
AcGeVector3d vtSect;
m_pXDataMap->GetAt(HRED_StartDir, vtSect);
2026-10-04 00:04:20 +08:00
// 获得UCS坐标Z向量
2026-09-28 15:28:50 +08:00
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
return vtSect.isParallelTo(vtZAxis);
}
BOOL ImpHvacReducer::IsInclineAlignment() const
{
2026-10-04 00:04:20 +08:00
// 获得法向量
2026-09-28 15:28:50 +08:00
AcGeVector3d vtSect;
m_pXDataMap->GetAt(HRED_StartDir, vtSect);
2026-10-04 00:04:20 +08:00
// 获得UCS坐标Z向量
2026-09-28 15:28:50 +08:00
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
return !vtSect.isPerpendicularTo(vtZAxis) && !vtSect.isParallelTo(vtZAxis);
}
BOOL ImpHvacReducer::IsSingleLine() const
{
ASSERT(NULL != m_pXDataMap);
BOOL bSingleLine = FALSE;
m_pXDataMap->GetAt(HVAC_IsSingleLine, (int&)bSingleLine);
return bSingleLine;
}
AcGeVector3d ImpHvacReducer::GetSectNormal() const
{
ASSERT(NULL != m_pXDataMap);
AcGeVector3d vtSta;
m_pXDataMap->GetAt(HRED_StartDir, vtSta);
if (!vtSta.isParallelTo(TAuxTools::GetUcsZvt()))
{
if (!vtSta.isPerpendicularTo(TAuxTools::GetUcsZvt()))
return vtSta;
else
vtSta = vtSta.orthoProject(TAuxTools::GetUcsZvt());
}
return vtSta;
}
Acad::ErrorStatus ImpHvacReducer::Draw3d(AcGiDraw& mode) const
{
if (NULL == m_pXDataMap)
return Acad::eOk;
2026-10-04 00:04:20 +08:00
// 变径类型
2026-09-28 15:28:50 +08:00
ESection eStartSectType = eRect;
ESection eEndSectType = eRect;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
AcDbObjectId idLayBk = mode.GetLayerId();
mode.SetLayer(m_idDoubleLayer);
2026-10-04 00:04:20 +08:00
// 始端截面
2026-09-28 15:28:50 +08:00
switch (eStartSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
// 末端截面
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
ExplodeRect2Rect3d(mode);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
ExplodeRect2Cir3d(mode);
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
// 末端截面
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
ExplodeCir2Rect3d(mode);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
ExplodeCir2Cir3d(mode);
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
// 末端截面
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
}
mode.SetLayer(idLayBk);
return Acad::eOk;
}
BOOL ImpHvacReducer::DrawMesh(AcGiDraw &mode,const Adesk::UInt32 rows,const Adesk::UInt32 columns,const AcGePoint3d* pVertexList) const
{
AcGePoint3dArray vertexArray;
AcArray<Adesk::Int32> faceArray;
int nV0 = 0,nV1 = 0,nV2 = 0;
int nV3= 0;
int nFaceIndex = 0;
AcGePoint3d ptFace[4];
for (int i = 0;i < rows - 1;i++)
{
for (int j = 0;j < columns - 1;j++)
{
nV0 = i * columns + j;
nV1 = nV0 + 1;
2026-10-04 00:04:20 +08:00
//第二行,第一个
2026-09-28 15:28:50 +08:00
nV2 = (i + 1) * columns + j;
nV3 = nV2 + 1;
2026-10-04 00:04:20 +08:00
//三角:nV0-nV1-nV2
2026-09-28 15:28:50 +08:00
faceArray.append(3);
faceArray.append(nV0);//v0
faceArray.append(nV1);//v1
faceArray.append(nV2);//v2
ptFace[0] = pVertexList[nV0];
ptFace[1] = pVertexList[nV1];
ptFace[2] = pVertexList[nV2];
ptFace[3] = ptFace[0];
//mode.DrawFace(ptFace);
2026-10-04 00:04:20 +08:00
//三角:nV2-nV1-nV3
2026-09-28 15:28:50 +08:00
faceArray.append(3);
faceArray.append(nV2);//v2
faceArray.append(nV1);//v1
faceArray.append(nV3);//v3
ptFace[0] = pVertexList[nV2];
ptFace[1] = pVertexList[nV1];
ptFace[2] = pVertexList[nV3];
ptFace[3] = ptFace[0];
//mode.DrawFace(ptFace);
}
}
if (!faceArray.isEmpty())
{
int nIndex = 0;
for (int i = 0;i < rows;i++)
{
for (int j = 0;j < columns;j++)
{
nIndex = i * columns + j;
vertexArray.append(pVertexList[nIndex]);
}
}
AcDbSubDMesh* pSubMesh = new AcDbSubDMesh;
if ( Acad::eOk == pSubMesh->setSubDMesh(vertexArray,faceArray,0) )
{
mode.DrawEntity(pSubMesh);
m_ar3DDrableBufPtrs_.append(pSubMesh);
2026-10-04 00:04:20 +08:00
//有时候失败?
2026-09-28 15:28:50 +08:00
/*Acad::ErrorStatus es;
AcDb3dSolid* pSolid = new AcDb3dSolid;
if ( Acad::eOk == (es = pSubMesh->convertToSolid(false,false,pSolid) ) )
{
mode.DrawEntity(pSolid);
}
delete pSubMesh;
*/
return TRUE;
}
delete pSubMesh;
}
mode.DrawMeshS (rows,columns,pVertexList,false);
return FALSE;
}
BOOL ImpHvacReducer::DrawShell(AcGiDraw &mode,const Adesk::UInt32 nbVertex,const AcGePoint3d* pVertexList,const Adesk::UInt32 faceListSize,const Adesk::Int32* pFaceList) const
{
AcGePoint3dArray vertexArray;
AcArray<Adesk::Int32> faceArray;
for(int i = 0;i < nbVertex;i++)
{
vertexArray.append(pVertexList[i]);
}
for (int j = 0;j < faceListSize;j++)
{
faceArray.append(pFaceList[j]);
}
AcDbSubDMesh* pSubMesh = new AcDbSubDMesh;
if ( Acad::eOk == pSubMesh->setSubDMesh(vertexArray,faceArray,0) )
{
mode.DrawEntity(pSubMesh);
m_ar3DDrableBufPtrs_.append(pSubMesh);
2026-10-04 00:04:20 +08:00
//有时候失败?
2026-09-28 15:28:50 +08:00
/*Acad::ErrorStatus es;
AcDb3dSolid* pSolid = new AcDb3dSolid;
if ( Acad::eOk == (es = pSubMesh->convertToSolid(false,false,pSolid) ) )
{
mode.DrawEntity(pSolid);
}
delete pSubMesh;
*/
return TRUE;
}
delete pSubMesh;
mode.DrawShell (nbVertex,pVertexList,faceListSize,pFaceList);
return FALSE;
}
void ImpHvacReducer::Move3DBuffer(AcDbVoidPtrArray& ar3DBuffer) const
{
if (!m_ar3DDrableBufPtrs_.isEmpty())
{
ar3DBuffer.append(m_ar3DDrableBufPtrs_);
m_ar3DDrableBufPtrs_.removeAll();
}
}
bool ImpHvacReducer::Has3DBuffer() const
{
return !m_ar3DDrableBufPtrs_.isEmpty();
}
Acad::ErrorStatus ImpHvacReducer::Draw2d(AcGiDraw& mode) const
{
if (m_pXDataMap == NULL)
{
return Acad::eNotImplementedYet;
}
AecComplexCurve cplCurve;
MakeCurves(cplCurve);
AecComplexCurveDraw edage;
edage.SetEdage(cplCurve);
BOOL bWeight = FALSE;
AcDbObjectId idReal = m_idDoubleLayer;
AcDbObjectId idDash = m_idDashLayer;
AcDbObjectId idCent = m_idCenterLayer;
edage.Draw2d(mode,idReal,idDash,idCent,NULL,bWeight,FALSE);
AecComplexCurve cplCen;
GetCurvesInSide(cplCen);
edage.SetEdage(cplCen);
edage.Draw2d(mode,idReal,idDash,idCent,NULL,bWeight,FALSE);
return Acad::eOk;
}
BOOL ImpHvacReducer::MakeCurves(AecComplexCurve& cplCurve) const
{
if (NULL == m_pXDataMap)
return FALSE;
2026-10-04 00:04:20 +08:00
// 变径类型
2026-09-28 15:28:50 +08:00
ESection eStartSectType = eRect;
ESection eEndSectType = eRect;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
int nType = 0;
2026-10-04 00:04:20 +08:00
if (IsHorzAlignment()) // 水平
2026-09-28 15:28:50 +08:00
{
switch (eStartSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeRect2Rect2DCurves(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
return MakeRect2Cir2DCurves(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeCir2Rect2DCurves(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
return MakeCir2Cir2DCurves(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
}
}
2026-10-04 00:04:20 +08:00
else if(IsVertAlignment()) // 立管
2026-09-28 15:28:50 +08:00
{
switch (eStartSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeRect2Rect2DCurvesVer(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
return MakeRect2Cir2DCurvesVer(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeCir2Rect2DCurvesVer(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
return MakeCir2Cir2DCurvesVer(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
}
}
2026-10-04 00:04:20 +08:00
else if (IsInclineAlignment()) //倾斜变径二维Lixl
2026-09-28 15:28:50 +08:00
{
switch (eStartSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeRect2Rect2DCurves(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
return MakeRect2Cir2DCurves(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeCir2Rect2DCurves(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
return MakeIncCir2Cir2DCurves(cplCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eOblate: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
}
}
return FALSE;
}
BOOL ImpHvacReducer::GetCurvesInSide(AecComplexCurve& compCurve) const
{
if (NULL == m_pXDataMap)
return FALSE;
2026-10-04 00:04:20 +08:00
// 变径类型
2026-09-28 15:28:50 +08:00
ESection eStartSectType = eRect;
ESection eEndSectType = eRect;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
int nType = 1;
2026-10-04 00:04:20 +08:00
if (IsHorzAlignment()) // 水平
2026-09-28 15:28:50 +08:00
{
switch (eStartSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeRect2Rect2DCurves(compCurve, nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
return MakeRect2Cir2DCurves(compCurve, nType);
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeCir2Rect2DCurves(compCurve, nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
return MakeCir2Cir2DCurves(compCurve, nType);
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
}
}
2026-10-04 00:04:20 +08:00
else if(IsVertAlignment()) // 立管
2026-09-28 15:28:50 +08:00
{
switch (eStartSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeRect2Rect2DCurvesVer(compCurve, nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
return MakeRect2Cir2DCurvesVer(compCurve, nType);
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeCir2Rect2DCurvesVer(compCurve, nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
return MakeCir2Cir2DCurvesVer(compCurve, nType);
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 园形
2026-09-28 15:28:50 +08:00
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
}
}
else if (IsInclineAlignment())
{
switch (eStartSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeRect2Rect2DCurves(compCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
return MakeRect2Cir2DCurves(compCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
switch (eEndSectType)
{
2026-10-04 00:04:20 +08:00
case eRect: // 矩形
2026-09-28 15:28:50 +08:00
return MakeCir2Rect2DCurves(compCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eCircle: // 圆形
2026-09-28 15:28:50 +08:00
return MakeIncCir2Cir2DCurves(compCurve,nType);
break;
2026-10-04 00:04:20 +08:00
case eEllispe: // 扁圆形
2026-09-28 15:28:50 +08:00
break;
}
break;
}
}
return FALSE;
}
Acad::ErrorStatus ImpHvacReducer::transformBy(const AcGeMatrix3d& xform)
{
if (NULL == m_pXDataMap)
return Acad::eNotApplicable;
2026-10-04 00:04:20 +08:00
// 取得位置点和法向
2026-09-28 15:28:50 +08:00
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal, vtSta;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
m_pXDataMap->GetAt(HRED_StartDir, vtSta);
2026-10-04 00:04:20 +08:00
// 变换位置
2026-09-28 15:28:50 +08:00
ptStart.transformBy(xform);
ptEnd.transformBy(xform);
vtNormal.transformBy(xform);
vtSta.transformBy(xform);
vtNormal.normalize();
vtSta.normalize();
2026-10-04 00:04:20 +08:00
// 更新点和法向
2026-09-28 15:28:50 +08:00
m_pXDataMap->SetAt(HRED_StartPoint, ptStart);
m_pXDataMap->SetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->SetAt(KEY_NORMAL, vtNormal);
m_pXDataMap->SetAt(HRED_StartDir, vtSta);
2026-10-04 00:04:20 +08:00
// 设置尺寸
2026-09-28 15:28:50 +08:00
double dScale = xform.scale();
double dStaWidth(0.0), dEndWidth(0.), dStaThick(0.0), dEndThick(0.0);
m_pXDataMap->GetAt(HRED_StartWidth, dStaWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStaThick);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
dStaWidth *= dScale;
dEndWidth *= dScale;
dStaThick *= dScale;
dEndThick *= dScale;
m_pXDataMap->SetAt(HRED_StartWidth, dStaWidth);
m_pXDataMap->SetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->SetAt(HRED_StartThick, dStaThick);
m_pXDataMap->SetAt(HRED_EndThick, dEndThick);
return Acad::eOk;
}
AecEqui::Position ImpHvacReducer::ExplainGripIndex(int nIndex) const
{
AecEqui::Position ePos = AecEqui::eStart;
switch(nIndex)
{
case 0:
ePos = AecEqui::eStart;
break;
case 1:
ePos = AecEqui::eEnd;
break;
case 2:
ePos = AecEqui::eCommand0;
break;
case 3:
ePos = AecEqui::eCommand1;
break;
}
return ePos;
}
2026-10-04 00:04:20 +08:00
// 绘制三维图形(方对方)
2026-09-28 15:28:50 +08:00
void ImpHvacReducer::ExplodeRect2Rect3d(AcGiDraw& mode) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = MayAsMUnit(200.0), dStartThick = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0),
dEndThick = MayAsMUnit(400.0), dPlusEdge(GetPlusEdge());
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
2026-10-04 00:04:20 +08:00
// 计算8顶点
2026-09-28 15:28:50 +08:00
AcGeVector3d vtSect = GetSectNormal();
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arPtS, arPtE;
arPtS.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0);
arPtS.append(arPtS.at(0) - dStartWidth * vt);
arPtS.append(arPtS.at(1) - dStartThick * vtNormal);
arPtS.append(arPtS.at(0) - dStartThick * vtNormal);
arPtS.append(arPtS.at(0));
arPtE.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0);
arPtE.append(arPtE.at(0) - dEndWidth * vt);
arPtE.append(arPtE.at(1) - dEndThick * vtNormal);
arPtE.append(arPtE.at(0) - dEndThick * vtNormal);
arPtE.append(arPtE.at(0));
2026-10-04 00:04:20 +08:00
// 考虑法兰余量添加5行4列点
2026-09-28 15:28:50 +08:00
AcGePoint3dArray arPoint;
for(int i = 0; i < 5; i++)
{
arPoint.append(arPtS.at(i));
arPoint.append(arPtS.at(i) - dPlusEdge * vtSect);
arPoint.append(arPtE.at(i) + dPlusEdge * vtSect);
arPoint.append(arPtE.at(i));
}
DrawMesh(mode,5, 4, arPoint.asArrayPtr());
}
2026-10-04 00:04:20 +08:00
// 构建二维图形(方对方)
2026-09-28 15:28:50 +08:00
BOOL ImpHvacReducer::MakeRect2Rect2DCurves(AecComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dPlusEdge = GetPlusEdge();
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
ESection eSectType = eRect;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectType);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
2026-10-04 00:04:20 +08:00
if ((eSectType == eRect) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚
2026-09-28 15:28:50 +08:00
{
m_pXDataMap->GetAt(HRED_StartThick, dStartWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
AcDbObjectId idEndLayer, idBaseLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
BOOL bHasBaseLine = FALSE;
m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine);
AecCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
curEle.idSubLay = m_idDoubleLayer;
AcGeVector3d vtSect = GetSectNormal();
2026-10-04 00:04:20 +08:00
// 2D下绘制,截面方向向XY平面投影,后计算图形在XY平面上的关键点Lixl
2026-09-28 15:28:50 +08:00
vtSect = vtSect.orthoProject(TAuxTools::GetUcsZvt());
2026-10-04 00:04:20 +08:00
// 绘单线
2026-09-28 15:28:50 +08:00
if (IsSingleLine())
{
AcGeVector3d vtDir = ptStart - ptEnd;
AcGePoint3d ptS, ptM, ptE;
vtDir.normalize();
ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0;
if (ptStart.distanceTo(ptEnd) > MayAsMUnit(120.0))
{
ptS = ptM + vtDir * 60.0;
ptE = ptM - vtDir * 60.0;
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd;
curEle.ptGe[1] = ptE;
curEle.ptGe[2] = ptE;
cplCurve.append(curEle);
}
else
{
ptS = ptStart;
ptE = ptEnd;
}
vtDir.rotateBy(PI/2, TAuxTools::GetUcsZvt());
double dS = MayAsMUnit(20.0), dE = MayAsMUnit(50.0);
if (dStartWidth > dEndWidth)
{
dS = MayAsMUnit(50.0);
dE = MayAsMUnit(20.0);
}
curEle.ptGe[0] = ptS + (dS + MayAsMUnit(10.0)) * vtDir;
curEle.ptGe[1] = ptS - (dS + MayAsMUnit(10.0)) * vtDir;
curEle.ptGe[2] = ptS - (dS + MayAsMUnit(10.0)) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE + (dE + MayAsMUnit(10.0)) * vtDir;
curEle.ptGe[1] = ptE - (dE + MayAsMUnit(10.0)) * vtDir;
curEle.ptGe[2] = ptE - (dE + MayAsMUnit(10.0)) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptS + dS * vtDir;
curEle.ptGe[1] = ptE + dE * vtDir;
curEle.ptGe[2] = ptE + dE * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptS - dS * vtDir;
curEle.ptGe[1] = ptE - dE * vtDir;
curEle.ptGe[2] = ptE - dE * vtDir;
cplCurve.append(curEle);
return TRUE;
}
if (0 == nType)
{
AcGeVector3d vt = vtSect;
//vt.rotateBy(PI / 2.0, vtNormal);
vt.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt());
vt.normalize();
AcGePoint3d arPoint[4], arPointIn[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
arPointIn[0] = arPoint[0] - dPlusEdge * vtSect;
arPointIn[1] = arPoint[1] - dPlusEdge * vtSect;
arPointIn[2] = arPoint[2] + dPlusEdge * vtSect;
arPointIn[3] = arPoint[3] + dPlusEdge * vtSect;
curEle.dWidth = GetEdgeLineWidth();
curEle.ptGe[0] = arPoint[1];
curEle.ptGe[1] = arPointIn[1];
curEle.ptGe[2] = arPointIn[1];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPointIn[0];
curEle.ptGe[2] = arPointIn[0];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[1];
curEle.ptGe[1] = arPointIn[2];
curEle.ptGe[2] = arPointIn[2];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[0];
curEle.ptGe[1] = arPointIn[3];
curEle.ptGe[2] = arPointIn[3];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[2];
curEle.ptGe[1] = arPoint[2];
curEle.ptGe[2] = arPoint[2];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[3];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
2026-10-04 00:04:20 +08:00
curEle.idSubLay = idEndLayer; // 两端图层
2026-09-28 15:28:50 +08:00
curEle.dWidth = GetEndLineWidth();
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPoint[1];
curEle.ptGe[2] = arPoint[1];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[2];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
}
else if (1 == nType)
{
if (bHasBaseLine)
{
2026-10-04 00:04:20 +08:00
curEle.idSubLay = m_idCenterLayer; // 基线图层
2026-09-28 15:28:50 +08:00
curEle.dWidth = GetCentLineWidth();
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[2] = ptStart - dPlusEdge * vtSect;
cplCurve.append(curEle);
curEle.ptGe[0] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[1] = ptEnd + dPlusEdge * vtSect;
curEle.ptGe[2] = ptEnd + dPlusEdge * vtSect;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd + dPlusEdge * vtSect;
curEle.ptGe[1] = ptEnd;
curEle.ptGe[2] = ptEnd;
cplCurve.append(curEle);
}
}
return TRUE;
}
2026-10-04 00:04:20 +08:00
// 倾斜变径: 圆对圆
2026-09-28 15:28:50 +08:00
BOOL ImpHvacReducer::MakeIncCir2Cir2DCurves(AecComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dPlusEdge = 0.0;
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
ESection eStaSectType = eRect;
ESection eEndSectType = eRect;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStaSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
2026-10-04 00:04:20 +08:00
if ((eStaSectType == eRect) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚
2026-09-28 15:28:50 +08:00
{
m_pXDataMap->GetAt(HRED_StartThick, dStartWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
AcDbObjectId idEndLayer, idBaseLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
2026-10-04 00:04:20 +08:00
// 中心线图层
2026-09-28 15:28:50 +08:00
BOOL bHasBaseLine = FALSE;
m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine);
AecCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
curEle.idSubLay = m_idDoubleLayer;
AcGeVector3d vtSect = GetSectNormal();
int i(0), nRet(0);
AcDbPolyline* pLine = new AcDbPolyline;
if (NULL == pLine)
return FALSE;
AcGePoint3dArray arPtsCir;
AcGeVector3d vt = vtSect.crossProduct(vtNormal);
vt.normalize();
2026-10-04 00:04:20 +08:00
// 绘单线
2026-09-28 15:28:50 +08:00
if (IsSingleLine())
{
AcGeVector3d vtDir = ptStart - ptEnd;
vtDir.orthoProject(TAuxTools::GetUcsZvt());
vtDir.normalize();
AcGePoint3d ptS, ptM, ptE;
ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0;
if (ptStart.distanceTo(ptEnd) > MayAsMUnit(120.0))
{
ptS = ptM + vtDir * MayAsMUnit(60.0);
ptE = ptM - vtDir * MayAsMUnit(60.0);
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd;
curEle.ptGe[1] = ptE;
curEle.ptGe[2] = ptE;
cplCurve.append(curEle);
}
else
{
ptS = ptStart;
ptE = ptEnd;
}
vtDir.rotateBy(PI/2, TAuxTools::GetUcsZvt());
double dS = MayAsMUnit(20.0), dE = MayAsMUnit(50.0);
if (dStartWidth > dEndWidth)
{
dS = MayAsMUnit(50.0);
dE = MayAsMUnit(20.0);
}
curEle.ptGe[0] = ptS + (dS + MayAsMUnit(10.0)) * vtDir;
curEle.ptGe[1] = ptS - (dS + MayAsMUnit(10.0))* vtDir;
curEle.ptGe[2] = ptS - (dS + MayAsMUnit(10.0)) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE + (dE + MayAsMUnit(10.0)) * vtDir;
curEle.ptGe[1] = ptE - (dE + MayAsMUnit(10.0)) * vtDir;
curEle.ptGe[2] = ptE - (dE + MayAsMUnit(10.0)) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptS + dS * vtDir;
curEle.ptGe[1] = ptE + dE * vtDir;
curEle.ptGe[2] = ptE + dE * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptS - dS * vtDir;
curEle.ptGe[1] = ptE - dE * vtDir;
curEle.ptGe[2] = ptE - dE * vtDir;
cplCurve.append(curEle);
return TRUE;
}
if (0 == nType)
{
AcGePoint3d arPoint[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
2026-10-04 00:04:20 +08:00
curEle.idSubLay = idEndLayer; // 两端图层
2026-09-28 15:28:50 +08:00
curEle.dWidth = GetEndLineWidth();
2026-10-04 00:04:20 +08:00
// 末端半个椭圆
vt = -vtSect;//起点指向终点
2026-09-28 15:28:50 +08:00
if (eEndSectType == eCircle)
{
nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pLine, vt);
if (-1 != nRet)
{
for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23
{
curEle.ptGe[0] = arPtsCir[i];
curEle.ptGe[1] = arPtsCir[i+1];
curEle.ptGe[2] = arPtsCir[i+1];
cplCurve.append(curEle);
}
arPoint[2] = arPtsCir.first();
arPoint[3] = arPtsCir.last();
}
}
else
{
}
arPtsCir.setLogicalLength(0);
pLine->reset(Adesk::kFalse, i);
if (eStaSectType == eCircle)
{
nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptStart, dStartWidth, -vt, TAuxTools::GetUcsZvt(), *pLine, -vt);
if (-1 != nRet)
{
for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23
{
curEle.ptGe[0] = arPtsCir[i];
curEle.ptGe[1] = arPtsCir[i+1];
curEle.ptGe[2] = arPtsCir[i+1];
cplCurve.append(curEle);
}
arPoint[0] = arPtsCir.first();
arPoint[1] = arPtsCir.last();
}
}
else
{
}
vt = -vtSect.crossProduct(vtNormal);
AcGePoint3d ptJudge = ptStart + vt * MayAsMUnit(10000);
ptJudge.z = (ptStart.z + ptEnd.z) * 0.5;
arPoint[0].z = ptJudge.z;
arPoint[1].z = ptJudge.z;
arPoint[2].z = ptJudge.z;
arPoint[3].z = ptJudge.z;
AcGePoint3d ptTmp;
2026-10-04 00:04:20 +08:00
// 0,3点在上, 1,2点在下
2026-09-28 15:28:50 +08:00
if (arPoint[0].distanceTo(ptJudge) < arPoint[1].distanceTo(ptJudge))
{
ptTmp = arPoint[0];
arPoint[0] = arPoint[1];
arPoint[1] = ptTmp;
}
if (arPoint[3].distanceTo(ptJudge) < arPoint[2].distanceTo(ptJudge))
{
ptTmp = arPoint[3];
arPoint[3] = arPoint[2];
arPoint[2] = ptTmp;
}
2026-10-04 00:04:20 +08:00
// 变径边线
2026-09-28 15:28:50 +08:00
curEle.idSubLay = AcDbObjectId::kNull;
curEle.dWidth = GetEdgeLineWidth();
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[1];
curEle.ptGe[1] = arPoint[2];
curEle.ptGe[2] = arPoint[2];
cplCurve.append(curEle);
}
else if (1 == nType)
{
if (bHasBaseLine)
{
2026-10-04 00:04:20 +08:00
curEle.idSubLay = m_idCenterLayer; // 基线图层
2026-09-28 15:28:50 +08:00
curEle.dWidth = GetCentLineWidth();
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptEnd;
curEle.ptGe[2] = ptEnd;
cplCurve.append(curEle);
}
2026-10-04 00:04:20 +08:00
// 内部端线
2026-09-28 15:28:50 +08:00
curEle.idSubLay = idEndLayer;
curEle.dWidth = GetEndLineWidth();
vt = -vtSect;
2026-10-04 00:04:20 +08:00
// 起点高,画起点内半个椭圆
2026-09-28 15:28:50 +08:00
if (ptStart.z > ptEnd.z)
{
nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptStart, dStartWidth, vt, TAuxTools::GetUcsZvt(), *pLine, vt);
if (-1 != nRet)
{
for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23
{
curEle.ptGe[0] = arPtsCir[i];
curEle.ptGe[1] = arPtsCir[i+1];
curEle.ptGe[2] = arPtsCir[i+1];
cplCurve.append(curEle);
}
}
}
2026-10-04 00:04:20 +08:00
else // 终点高,画终点内部半个椭圆
2026-09-28 15:28:50 +08:00
{
nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pLine, -vt);
if (-1 != nRet)
{
for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23
{
curEle.ptGe[0] = arPtsCir[i];
curEle.ptGe[1] = arPtsCir[i+1];
curEle.ptGe[2] = arPtsCir[i+1];
cplCurve.append(curEle);
}
}
}
}
if (NULL != pLine)
delete pLine;
return TRUE;
}
2026-10-04 00:04:20 +08:00
// 绘制三维图形(方对圆)
2026-09-28 15:28:50 +08:00
void ImpHvacReducer::ExplodeRect2Cir3d(AcGiDraw& mode, BOOL bStartIsRound) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = MayAsMUnit(200.0), dStartThick = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0),
dEndThick = MayAsMUnit(400.0), dPlusEdge = GetPlusEdge();
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
AcGeVector3d vtSect = GetSectNormal();
if (bStartIsRound)
{
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
}
else
{
m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartThick, dEndThick);
m_pXDataMap->GetAt(HRED_EndWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndThick, dStartThick);
m_pXDataMap->GetAt(HRED_StartPoint, ptEnd);
m_pXDataMap->GetAt(HRED_EndPoint, ptStart);
vtSect = -vtSect;
}
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
2026-10-04 00:04:20 +08:00
double dMinDiffAng = PI / 12.0; // 圆弧分割的角度
2026-09-28 15:28:50 +08:00
//GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinDiffAng);
m_pXDataMap->GetAt(KEY_MINDIFFANG, dMinDiffAng);
2026-10-04 00:04:20 +08:00
int nSect = int(PI / (2.0 * dMinDiffAng)) + 1; // 每PI/2圆弧分成的段数
2026-09-28 15:28:50 +08:00
dMinDiffAng = PI / (2.0 * nSect);
2026-10-04 00:04:20 +08:00
// 起始端圆分割点
2026-09-28 15:28:50 +08:00
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arCirPt;
AcGePoint3d ptCir;
ptCir = ptStart + vt * dStartWidth / 2.0;
arCirPt.append(ptCir);
for (int i = 1; i < 4 * nSect; i++)
{
ptCir.rotateBy(dMinDiffAng, vtSect, ptStart);
arCirPt.append(ptCir);
}
2026-10-04 00:04:20 +08:00
arCirPt.append(ptStart + vt * dStartWidth / 2.0); // 最后一个封闭,可消除计算误差
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
// 终止端矩形顶点
2026-09-28 15:28:50 +08:00
AcGePoint3dArray arRectPt;
arRectPt.append(ptEnd + dEndWidth * vt / 2.0 - dEndThick * vtNormal / 2.0);
arRectPt.append(arRectPt.at(0) + dEndThick * vtNormal);
arRectPt.append(arRectPt.at(1) - dEndWidth * vt);
arRectPt.append(arRectPt.at(0) - dEndWidth * vt);
arRectPt.append(arRectPt.at(0));
2026-10-04 00:04:20 +08:00
// 4*(nSect+1)+1行4列网格点
2026-09-28 15:28:50 +08:00
AcGePoint3dArray arPoint;
for (i = 0; i < 4; i++)
{
2026-10-04 00:04:20 +08:00
// 圆上点和矩形边
2026-09-28 15:28:50 +08:00
arPoint.append(arCirPt.at(i * nSect));
arPoint.append(arCirPt.at(i * nSect) - dPlusEdge * vtSect);
arPoint.append(arRectPt.at(i) + dPlusEdge * vtSect);
arPoint.append(arRectPt.at(i));
2026-10-04 00:04:20 +08:00
// 圆上边和矩形顶点
2026-09-28 15:28:50 +08:00
for (int j = 0; j < nSect; j++)
{
arPoint.append(arCirPt.at(i * nSect + j));
arPoint.append(arCirPt.at(i * nSect + j) - dPlusEdge * vtSect);
arPoint.append(arRectPt.at(i + 1) + dPlusEdge * vtSect);
arPoint.append(arRectPt.at(i + 1));
}
}
arPoint.append(arCirPt.at(0));
arPoint.append(arCirPt.at(0) - dPlusEdge * vtSect);
arPoint.append(arRectPt.at(0) + dPlusEdge * vtSect);
arPoint.append(arRectPt.at(0));
DrawMesh(mode,4 * (nSect + 1) + 1, 4, arPoint.asArrayPtr());
}
2026-10-04 00:04:20 +08:00
// 构建二维图形(方对圆)
2026-09-28 15:28:50 +08:00
BOOL ImpHvacReducer::MakeRect2Cir2DCurves(AecComplexCurve& cplCurve, int &nType, BOOL bStartIsRound) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dPlusEdge = GetPlusEdge();
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
AcGeVector3d vtSect = GetSectNormal();
if (bStartIsRound)
{
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
2026-10-04 00:04:20 +08:00
if (vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 宽厚颠倒
2026-09-28 15:28:50 +08:00
{
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
}
2026-10-04 00:04:20 +08:00
// LixlModify支持倾斜管上的变径
2026-09-28 15:28:50 +08:00
else if (!vtNormal.isPerpendicularTo(TAuxTools::GetUcsZvt()))
{
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
}
else
{
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
}
else
{
vtSect = -vtSect;
if (vtNormal.isParallelTo(TAuxTools::GetUcsZvt()))
{
m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth);
}
2026-10-04 00:04:20 +08:00
// LixlModify支持倾斜管上的变径
2026-09-28 15:28:50 +08:00
else if (!vtNormal.isPerpendicularTo(TAuxTools::GetUcsZvt()))
{
m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth);
}
else
{
m_pXDataMap->GetAt(HRED_StartThick, dEndWidth);
}
m_pXDataMap->GetAt(HRED_EndWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_StartPoint, ptEnd);
m_pXDataMap->GetAt(HRED_EndPoint, ptStart);
}
AcDbObjectId idEndLayer, idBaseLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
//TDbFittingBase* pFit = TDbFittingBase::cast(m_pOwnerEnt);
//if (NULL != pFit)
// idBaseLayer = pFit->CenterLayer();
BOOL bHasBaseLine = FALSE;
m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine);
AecCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
curEle.idSubLay = m_idDoubleLayer;
2026-10-04 00:04:20 +08:00
// 绘单线
2026-09-28 15:28:50 +08:00
if (IsSingleLine())
{
AcGeVector3d vtDir = ptStart - ptEnd;
AcGePoint3d ptS, ptM, ptE;
vtDir.normalize();
ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0;
if (ptStart.distanceTo(ptEnd) > MayAsMUnit(120.0))
{
ptS = ptM + vtDir * MayAsMUnit(60.0);
ptE = ptM - vtDir * MayAsMUnit(60.0);
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd;
curEle.ptGe[1] = ptE;
curEle.ptGe[2] = ptE;
cplCurve.append(curEle);
}
else
{
ptS = ptStart;
ptE = ptEnd;
}
vtDir.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt());
2026-10-04 00:04:20 +08:00
curEle.ptGe[0] = ptS + MayAsMUnit(10.0) * vtDir; // ptS是圆断面
2026-09-28 15:28:50 +08:00
curEle.ptGe[1] = ptS - MayAsMUnit(10.0) * vtDir;
curEle.ptGe[2] = ptS - MayAsMUnit(10.0) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE + MayAsMUnit(60.0) * vtDir;
curEle.ptGe[1] = ptE - MayAsMUnit(60.0) * vtDir;
curEle.ptGe[2] = ptE - MayAsMUnit(60.0) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE + MayAsMUnit(50.0) * vtDir;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE - MayAsMUnit(50.0) * vtDir;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
return TRUE;
}
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3d arPoint[4], arPointIn[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
arPointIn[0] = arPoint[0] - dPlusEdge * vtSect;
arPointIn[1] = arPoint[1] - dPlusEdge * vtSect;
arPointIn[2] = arPoint[2] + dPlusEdge * vtSect;
arPointIn[3] = arPoint[3] + dPlusEdge * vtSect;
2026-10-04 00:04:20 +08:00
if (1 == nType) // 内部线
2026-09-28 15:28:50 +08:00
{
curEle.ptGe[0] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[1] = arPointIn[2];
curEle.ptGe[2] = arPointIn[2];
cplCurve.append(curEle);
curEle.ptGe[0] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[1] = arPointIn[3];
curEle.ptGe[2] = arPointIn[3];
cplCurve.append(curEle);
if (bHasBaseLine)
{
2026-10-04 00:04:20 +08:00
curEle.idSubLay = m_idCenterLayer; // 基线图层
2026-09-28 15:28:50 +08:00
curEle.dWidth = GetCentLineWidth();
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[2] = ptStart - dPlusEdge * vtSect;
cplCurve.append(curEle);
curEle.ptGe[0] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[1] = ptEnd + dPlusEdge * vtSect;
curEle.ptGe[2] = ptEnd + dPlusEdge * vtSect;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd + dPlusEdge * vtSect;
curEle.ptGe[1] = ptEnd;
curEle.ptGe[2] = ptEnd;
cplCurve.append(curEle);
}
}
2026-10-04 00:04:20 +08:00
else if (0 == nType) // 外边线
2026-09-28 15:28:50 +08:00
{
curEle.dWidth = GetEdgeLineWidth();
curEle.ptGe[0] = arPoint[1];
curEle.ptGe[1] = arPointIn[1];
curEle.ptGe[2] = arPointIn[1];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPointIn[0];
curEle.ptGe[2] = arPointIn[0];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[1];
curEle.ptGe[1] = arPointIn[2];
curEle.ptGe[2] = arPointIn[2];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[0];
curEle.ptGe[1] = arPointIn[3];
curEle.ptGe[2] = arPointIn[3];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[2];
curEle.ptGe[1] = arPoint[2];
curEle.ptGe[2] = arPoint[2];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[3];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
2026-10-04 00:04:20 +08:00
curEle.idSubLay = idEndLayer; // 两端图层
2026-09-28 15:28:50 +08:00
curEle.dWidth = GetEndLineWidth();
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPoint[1];
curEle.ptGe[2] = arPoint[1];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[2];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
}
return TRUE;
}
2026-10-04 00:04:20 +08:00
// 绘制三维图形(圆对方)
2026-09-28 15:28:50 +08:00
void ImpHvacReducer::ExplodeCir2Rect3d(AcGiDraw& mode) const
{
ExplodeRect2Cir3d(mode, TRUE);
}
2026-10-04 00:04:20 +08:00
// 构建二维图形(圆对方)
2026-09-28 15:28:50 +08:00
BOOL ImpHvacReducer::MakeCir2Rect2DCurves(AecComplexCurve& cplCurve, int &nType) const
{
return MakeRect2Cir2DCurves(cplCurve, nType, TRUE);
}
2026-10-04 00:04:20 +08:00
// 绘制三维图形(圆对圆)
2026-09-28 15:28:50 +08:00
void ImpHvacReducer::ExplodeCir2Cir3d(AcGiDraw& mode) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dPlusEdge = GetPlusEdge();
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
AcGeVector3d vtSect = GetSectNormal();
2026-10-04 00:04:20 +08:00
double dMinDiffAng = PI / 12.0; // 圆弧分割的角度
2026-09-28 15:28:50 +08:00
//GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinDiffAng);
m_pXDataMap->GetAt(KEY_MINDIFFANG, dMinDiffAng);
int nSect = int(2.0 * PI / dMinDiffAng) + 1;
dMinDiffAng = 2.0 * PI / nSect;
2026-10-04 00:04:20 +08:00
// 起始端圆分割点
2026-09-28 15:28:50 +08:00
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arCirPtStart;
AcGePoint3d ptCir;
ptCir = ptStart + vt * dStartWidth / 2.0;
arCirPtStart.append(ptCir);
for (int i = 1; i < nSect; i++)
{
ptCir.rotateBy(dMinDiffAng, vtSect, ptStart);
arCirPtStart.append(ptCir);
}
2026-10-04 00:04:20 +08:00
arCirPtStart.append(ptStart + vt * dStartWidth / 2.0); // 最后一个封闭,可消除计算误差
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
// 终止端端圆分割点
2026-09-28 15:28:50 +08:00
AcGePoint3dArray arCirPtEnd;
ptCir = ptEnd + vt * dEndWidth / 2.0;
arCirPtEnd.append(ptCir);
for (i = 1; i < nSect; i++)
{
ptCir.rotateBy(dMinDiffAng, vtSect, ptEnd);
arCirPtEnd.append(ptCir);
}
arCirPtEnd.append(ptEnd + vt * dEndWidth / 2.0);
2026-10-04 00:04:20 +08:00
// nSect+1行2列网格点
2026-09-28 15:28:50 +08:00
AcGePoint3dArray arPoint;
for (i = 0; i < nSect + 1; i++)
{
arPoint.append(arCirPtStart.at(i));
arPoint.append(arCirPtStart.at(i) - dPlusEdge * vtSect);
arPoint.append(arCirPtEnd.at(i) + dPlusEdge * vtSect);
arPoint.append(arCirPtEnd.at(i));
}
DrawMesh(mode,nSect + 1, 4, arPoint.asArrayPtr());
}
2026-10-04 00:04:20 +08:00
// 构建二维图形(圆对圆)
2026-09-28 15:28:50 +08:00
BOOL ImpHvacReducer::MakeCir2Cir2DCurves(AecComplexCurve& cplCurve, int &nType) const
{
return MakeRect2Rect2DCurves(cplCurve, nType);
}
2026-10-04 00:04:20 +08:00
// 获得外轮廓点
2026-09-28 15:28:50 +08:00
void ImpHvacReducer::GetOutVertex(AcGePoint3dArray& arPoint, ESection eStart, ESection eEnd) const
{
double dStartWidth = MayAsMUnit(200.0), dStartThick = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dEndThick = MayAsMUnit(400.0);
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
if (eStart == eRect)
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
else
2026-10-04 00:04:20 +08:00
dStartThick = dStartWidth; // 圆形取厚度为宽
2026-09-28 15:28:50 +08:00
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
if (eStart == eRect)
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
else
dEndThick = dEndWidth;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
2026-10-04 00:04:20 +08:00
// 计算8顶点(圆形近似为方形计算)
2026-09-28 15:28:50 +08:00
AcGeVector3d vtSect = AcGeVector3d::kZAxis;
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arStartPt;
arStartPt.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0);
arStartPt.append(arStartPt.at(0) - dStartWidth * vt);
arStartPt.append(arStartPt.at(1) - dStartThick * vtNormal);
arStartPt.append(arStartPt.at(0) - dStartThick * vtNormal);
AcGePoint3dArray arEndPt;
arEndPt.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0);
arEndPt.append(arEndPt.at(0) - dEndWidth * vt);
arEndPt.append(arEndPt.at(1) - dEndThick * vtNormal);
arEndPt.append(arEndPt.at(0) - dEndThick * vtNormal);
2026-10-04 00:04:20 +08:00
// 边旋转到与x,y轴平行
2026-09-28 15:28:50 +08:00
double dAngle = vtNormal.angleTo(AcGeVector3d::kXAxis);
for (int i = 0; i < 4; i++)
{
arStartPt.at(i).rotateBy(dAngle, vtSect, ptStart);
arEndPt.at(i).rotateBy(dAngle, vtSect, ptStart);
}
2026-10-04 00:04:20 +08:00
// 寻找外轮廓点
2026-09-28 15:28:50 +08:00
if (arStartPt.at(0).x < arEndPt.at(0).x)
{
arPoint.append(arEndPt.at(0));
arPoint.append(arEndPt.at(1));
if (arStartPt.at(1).y < arEndPt.at(1).y)
{
arPoint.append(arEndPt.at(2));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(2));
arPoint.append(arStartPt.at(3));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(3).y < arEndPt.at(3).y) // 左,下偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(0));
}
2026-10-04 00:04:20 +08:00
else // 左偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arEndPt.at(3));
}
}
else
{
arPoint.append(arEndPt.at(3));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(3).y < arEndPt.at(3).y) // 下偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(3));
arPoint.append(arStartPt.at(0));
}
2026-10-04 00:04:20 +08:00
else // 全在里面
2026-09-28 15:28:50 +08:00
{
}
}
}
2026-10-04 00:04:20 +08:00
else // 上偏
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(1));
arPoint.append(arStartPt.at(2));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(3));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(3).y < arEndPt.at(3).y) // 上,左,下偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(0));
}
2026-10-04 00:04:20 +08:00
else // 上,左偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arEndPt.at(3));
}
}
else
{
arPoint.append(arEndPt.at(2));
arPoint.append(arEndPt.at(3));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(3).y < arEndPt.at(3).y) // 上,下偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(3));
arPoint.append(arStartPt.at(0));
}
2026-10-04 00:04:20 +08:00
else // 上偏出
2026-09-28 15:28:50 +08:00
{
}
}
}
}
2026-10-04 00:04:20 +08:00
else // 右偏
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(0));
arPoint.append(arStartPt.at(1));
if (arStartPt.at(1).y < arEndPt.at(1).y)
{
arPoint.append(arEndPt.at(1));
arPoint.append(arEndPt.at(2));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(2));
arPoint.append(arStartPt.at(3));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,左,下偏出
2026-09-28 15:28:50 +08:00
{
}
2026-10-04 00:04:20 +08:00
else // 右,左偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arEndPt.at(3));
arPoint.append(arEndPt.at(0));
}
}
else
{
arPoint.append(arEndPt.at(3));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,下偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(3));
}
2026-10-04 00:04:20 +08:00
else // 右偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arEndPt.at(0));
}
}
}
2026-10-04 00:04:20 +08:00
else // 上偏
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(2));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(3));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,上,左,下偏出
2026-09-28 15:28:50 +08:00
{
}
2026-10-04 00:04:20 +08:00
else // 右,上,左偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arEndPt.at(3));
arPoint.append(arEndPt.at(0));
}
}
else
{
arPoint.append(arEndPt.at(2));
arPoint.append(arEndPt.at(3));
2026-10-04 00:04:20 +08:00
if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,上,下偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arStartPt.at(3));
}
2026-10-04 00:04:20 +08:00
else // 右,上偏出
2026-09-28 15:28:50 +08:00
{
arPoint.append(arEndPt.at(0));
}
}
}
}
2026-10-04 00:04:20 +08:00
// 恢复点的原位置
2026-09-28 15:28:50 +08:00
for (i = 0; i < arPoint.length(); i++)
{
arPoint.at(i).rotateBy(-dAngle, vtSect, ptStart);
}
}
/*
2______________________1
| |
| 0 |
| |
3______________________4|
*/
2026-10-04 00:04:20 +08:00
// bGetStartVertex 真:取起点截面周围顶点,假:取终点截面周围顶点
// 矩形截面,执行此函数后6个点,圆形界面26个点,顺序,中心点,逆时针24个点,逆时针起点终点重复一个点
2026-09-28 15:28:50 +08:00
void ImpHvacReducer::GetOutVertex2(AcGePoint3dArray& arPoint, bool bGetStartVertex) const
{
ASSERT(NULL != m_pXDataMap);
2026-10-04 00:04:20 +08:00
// 竖直放置时的外轮廓
2026-09-28 15:28:50 +08:00
if (IsVertAlignment())
{
AcGeVector3d vtSect, vtNor;
m_pXDataMap->GetAt(HRED_StartDir, vtSect);
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
AcGePoint3d ptCenter, ptTmp;
double dWidth(0.0), dThick(0.0);
ESection eSect(eRect);
if (bGetStartVertex)
{
m_pXDataMap->GetAt(HRED_StartPoint, ptCenter);
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSect);
m_pXDataMap->GetAt(HRED_StartWidth, dWidth);
m_pXDataMap->GetAt(HRED_StartThick, dThick);
}
else
{
m_pXDataMap->GetAt(HRED_EndPoint, ptCenter);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSect);
m_pXDataMap->GetAt(HRED_EndWidth, dWidth);
m_pXDataMap->GetAt(HRED_EndThick, dThick);
}
AcGeVector3d vtDir = vtNor.crossProduct(vtSect);
AcGeVector3d vtDirV = vtDir.normalize();
vtDirV.rotateBy(PI*0.5, vtSect);
// 0
arPoint.append(ptCenter);
if (eRect == eSect)
{
ptTmp = ptCenter + vtDir * dWidth * 0.5;
ptTmp = ptTmp + vtDirV * dThick * 0.5;
arPoint.append(ptTmp);//1
ptTmp = arPoint[1] - vtDir * dWidth;
arPoint.append(ptTmp);//2
ptTmp = arPoint[2] - vtDirV * dThick;
arPoint.append(ptTmp);//3
ptTmp = arPoint[1] - vtDirV * dThick;
arPoint.append(ptTmp);//4
2026-10-04 00:04:20 +08:00
// 为闭合,增加1点为重复点
2026-09-28 15:28:50 +08:00
arPoint.append(arPoint[1]);
}
else if (eCircle == eSect)
{
2026-10-04 00:04:20 +08:00
// 把圆按照最小分度角,分成几部分,取圆上点
2026-09-28 15:28:50 +08:00
double dMixAngle = TAuxTools::GetMinDiffAngle();
int nPart = 24;
dMixAngle = PI*2.0 / nPart;
ptTmp = ptCenter + vtDir * dWidth * 0.5;
arPoint.append(ptTmp);
for (int i = 0; i < nPart; i++)
{
ptTmp.rotateBy(dMixAngle, vtSect, ptCenter);
arPoint.append(ptTmp);
}
}
}
}
BOOL ImpHvacReducer::MakeRect2Rect2DCurvesVer(AecComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
AcGePoint3dArray arSta, arEnd;
GetOutVertex2(arSta, true);
GetOutVertex2(arEnd, false);
if (arSta.length() != arEnd.length()
|| arSta.length() != 6)
return FALSE;
double dEndWidht = GetEndLineWidth();
double dEdgeWidth = GetEdgeLineWidth();
AcDbObjectId idEndLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
AecCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
curEle.idSubLay = m_idDoubleLayer;
{
curEle.idSubLay = idEndLayer;
curEle.dWidth = dEndWidht;
2026-10-04 00:04:20 +08:00
// 起点截面边线
2026-09-28 15:28:50 +08:00
int i = 0;
for (i = 1; i < arSta.length()-1; i++)
{
curEle.ptGe[0] = arSta[i];
curEle.ptGe[1] = arSta[i+1];
curEle.ptGe[2] = arSta[i+1];
cplCurve.append(curEle);
}
2026-10-04 00:04:20 +08:00
// 终点截面边线
2026-09-28 15:28:50 +08:00
for (i = 1; i < arSta.length()-1; i++)
{
curEle.ptGe[0] = arEnd[i];
curEle.ptGe[1] = arEnd[i+1];
curEle.ptGe[2] = arEnd[i+1];
cplCurve.append(curEle);
}
2026-10-04 00:04:20 +08:00
// 绘制两个截面顶点之间的连线
2026-09-28 15:28:50 +08:00
curEle.idSubLay.setNull();
curEle.dWidth = dEdgeWidth;
for (i = 1; i <= 4; i++)
{
curEle.ptGe[0] = arSta[i];
curEle.ptGe[1] = arEnd[i];
curEle.ptGe[2] = arEnd[i];
cplCurve.append(curEle);
}
}
return TRUE;
}
2026-10-04 00:04:20 +08:00
// 垂直构建二维图形(方对圆)
2026-09-28 15:28:50 +08:00
BOOL ImpHvacReducer::MakeRect2Cir2DCurvesVer(AecComplexCurve& cplCurve, int &nType, BOOL bStartIsRound) const
{
ASSERT(NULL != m_pXDataMap);
double dStartDia = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dEndThick = MayAsMUnit(400.0);
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
if (bStartIsRound)
{
m_pXDataMap->GetAt(HRED_StartDiameter, dStartDia);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
}
else
{
m_pXDataMap->GetAt(HRED_EndDiameter, dStartDia);
m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartThick, dEndThick);
m_pXDataMap->GetAt(HRED_EndPoint, ptStart);
m_pXDataMap->GetAt(HRED_StartPoint, ptEnd);
}
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
AcDbObjectId idEndLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
2026-10-04 00:04:20 +08:00
// 计算顶点
2026-09-28 15:28:50 +08:00
AcGeVector3d vtSect = GetSectNormal();
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arStartPt;
AcGePoint3d ptCir = ptStart + dStartDia * vt / 2.0;
arStartPt.append(ptCir);
for (int i = 1; i < 8; i++)
{
ptCir.rotateBy(PI / 4.0, vtSect, ptStart);
arStartPt.append(ptCir);
}
arStartPt.append(ptStart + dStartDia * vt / 2.0);
AcGePoint3dArray arEndPt;
arEndPt.append(ptEnd + dEndWidth * vt / 2.0 - dEndThick * vtNormal / 2.0);
arEndPt.append(arEndPt.at(0) + dEndThick * vtNormal);
arEndPt.append(arEndPt.at(1) - dEndWidth * vt);
arEndPt.append(arEndPt.at(0) - dEndWidth * vt);
arEndPt.append(arEndPt.at(0));
AecCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
curEle.idSubLay = m_idDoubleLayer;
// if (0 == nType)
{
curEle.dWidth = GetEdgeLineWidth();
for (i = 0; i < 4; i++)
{
curEle.ptGe[0] = arStartPt.at(2 * i);
curEle.ptGe[1] = arEndPt.at(i);
curEle.ptGe[2] = arEndPt.at(i);
cplCurve.append(curEle);
curEle.ptGe[0] = arStartPt.at(2 * i);
curEle.ptGe[1] = arEndPt.at(i + 1);
curEle.ptGe[2] = arEndPt.at(i + 1);
cplCurve.append(curEle);
}
2026-10-04 00:04:20 +08:00
curEle.idSubLay = idEndLayer; // 两端图层
2026-09-28 15:28:50 +08:00
curEle.dWidth = GetEndLineWidth();
for (i = 0; i < 4; i++)
{
curEle.ptGe[0] = arStartPt.at(2 * i);
curEle.ptGe[1] = arStartPt.at(2 * i + 1);
curEle.ptGe[2] = arStartPt.at(2 * i + 2);
cplCurve.append(curEle);
curEle.ptGe[0] = arEndPt.at(i);
curEle.ptGe[1] = arEndPt.at(i + 1);
curEle.ptGe[2] = arEndPt.at(i + 1);
cplCurve.append(curEle);
}
}
return TRUE;
}
2026-10-04 00:04:20 +08:00
// 垂直构建二维图形(圆对方)
2026-09-28 15:28:50 +08:00
BOOL ImpHvacReducer::MakeCir2Rect2DCurvesVer(AecComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
MakeRect2Cir2DCurvesVer(cplCurve, nType, TRUE);
return TRUE;
}
2026-10-04 00:04:20 +08:00
// 垂直构建二维图形(圆对圆)
2026-09-28 15:28:50 +08:00
BOOL ImpHvacReducer::MakeCir2Cir2DCurvesVer(AecComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
double dStartDia = MayAsMUnit(200.0), dEndDia = MayAsMUnit(400.0);
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(HRED_StartDiameter, dStartDia);
m_pXDataMap->GetAt(HRED_EndDiameter, dEndDia);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
AcDbObjectId idEndLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
2026-10-04 00:04:20 +08:00
// 计算顶点
2026-09-28 15:28:50 +08:00
AcGeVector3d vtSect = GetSectNormal();
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arStartPt;
AcGePoint3d ptCir = ptStart + dStartDia * vt / 2.0;
arStartPt.append(ptCir);
for (int i = 1; i < 8; i++)
{
ptCir.rotateBy(PI / 4.0, vtSect, ptStart);
arStartPt.append(ptCir);
}
arStartPt.append(ptStart + dStartDia * vt / 2.0);
AcGePoint3dArray arEndPt;
ptCir = ptEnd + dEndDia * vt / 2.0;
arEndPt.append(ptCir);
for (i = 1; i < 8; i++)
{
ptCir.rotateBy(PI / 4.0, vtSect, ptEnd);
arEndPt.append(ptCir);
}
arEndPt.append(ptEnd + dEndDia * vt / 2.0);
AecCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
curEle.idSubLay = m_idDoubleLayer;
if (0 == nType)
{
2026-10-04 00:04:20 +08:00
curEle.idSubLay = idEndLayer; // 两端图层
2026-09-28 15:28:50 +08:00
curEle.dWidth = GetEndLineWidth();
for (i = 0; i < 4; i++)
{
curEle.ptGe[0] = arStartPt.at(2 * i);
curEle.ptGe[1] = arStartPt.at(2 * i + 1);
curEle.ptGe[2] = arStartPt.at(2 * i + 2);
cplCurve.append(curEle);
curEle.ptGe[0] = arEndPt.at(2 * i);
curEle.ptGe[1] = arEndPt.at(2 * i + 1);
curEle.ptGe[2] = arEndPt.at(2 * i + 2);
cplCurve.append(curEle);
}
}
return TRUE;
}
double ImpHvacReducer::GetEdgeLineWidth() const
{
ASSERT(NULL != m_pXDataMap);
double dWidth(0.0);
m_pXDataMap->GetAt(HVAC_EdgeWidth, dWidth);
return dWidth;
}
double ImpHvacReducer::GetCentLineWidth() const
{
ASSERT(NULL != m_pXDataMap);
double dWidth(0.0);
m_pXDataMap->GetAt(HVAC_CentWidth, dWidth);
return dWidth;
}
double ImpHvacReducer::GetEndLineWidth() const
{
ASSERT(NULL != m_pXDataMap);
double dWidth(0.0);
m_pXDataMap->GetAt(HVAC_EndWidth, dWidth);
return dWidth;
}
double ImpHvacReducer::GetPlusEdge() const
{
return 0.0;
}
AcGePoint3d ImpHvacReducer::GetEndPtAuto()
{
ASSERT(NULL != m_pXDataMap);
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtEnd, vtOffset;
double dPlus(0.0);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_StartDir, vtEnd);
m_pXDataMap->GetAt(HRED_Offset, vtOffset);
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlus);
vtEnd *= -1;
double dSizeSub = GetMaxSizeSub();
double dHoriLen = dSizeSub * 1.5 + MayAsMUnit(100);
if (dHoriLen < MayAsMUnit(200.0))
dHoriLen = MayAsMUnit(200.0);
ptEnd = ptStart + (dHoriLen + dPlus * 2) * vtEnd;
ptEnd += vtOffset;
return ptEnd;
}
2026-10-04 00:04:20 +08:00
// 不支持既不同心又没有一边对其情况心情况
2026-09-28 15:28:50 +08:00
AcGePoint3d ImpHvacReducer::GetEndPtByangle()
{
ASSERT(NULL != m_pXDataMap);
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtEnd, vtOffset;
double dSizeSub(0.0), dPlus(0.0), dAngle(0.0);
m_pXDataMap->GetAt(HRED_Angle, dAngle);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_StartDir, vtEnd);
m_pXDataMap->GetAt(HRED_Offset, vtOffset);
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlus);
dSizeSub = GetMaxSizeSub();
vtEnd *= -1;
double dHoriLen(0.0);
2026-10-04 00:04:20 +08:00
if (vtOffset.length() < 1e-3) // 同心
2026-09-28 15:28:50 +08:00
dHoriLen = dSizeSub * 0.5 / tan(dAngle*0.5);
else
dHoriLen = dSizeSub / tan(dAngle);
double dAllDist = dHoriLen + dPlus * 2;
2026-10-04 00:04:20 +08:00
if (dAllDist < MayAsMUnit(200)) // 避免天圆地方是看不出来
2026-09-28 15:28:50 +08:00
dAllDist = MayAsMUnit(200);
ptEnd = ptStart + dAllDist * vtEnd;
ptEnd += vtOffset;
return ptEnd;
}
AcGePoint3d ImpHvacReducer::GetEndPtByLen()
{
ASSERT(NULL != m_pXDataMap);
double dLen(0.0);
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtEnd, vtOffset;
m_pXDataMap->GetAt(HRED_Length, dLen);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(HRED_StartDir, vtEnd);
vtEnd *= -1;
if (dLen < MayAsMUnit(200))
dLen = MayAsMUnit(200);
vtOffset = ptEnd - ptStart;
vtOffset = vtOffset.orthoProject(vtEnd);
ptEnd = ptStart + dLen * vtEnd;
ptEnd += vtOffset;
return ptEnd;
}
double ImpHvacReducer::GetMaxSizeSub()
{
ESection eStartSect = eRect;
ESection eEndSect = eRect;
double dStartWidth(0.0), dEndWidth(0.0), dStartThick(0.0), dEndThick(0.0),
dMaxSizeSub(0.0);
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSect);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSect);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
if (eStartSect == eEndSect)
{
double dWidthSub = fabs(dStartWidth - dEndWidth);
if (eStartSect == eRect)
{
double dThickSub = fabs(dStartThick - dEndThick);
dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub;
}
else
{
dMaxSizeSub = dWidthSub;
}
}
else
{
if (eStartSect == eRect)
{
double dWidthSub = fabs(dStartWidth - dEndWidth);
double dThickSub = fabs(dStartThick - dEndWidth);
dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub;
}
else
{
double dWidthSub = fabs(dStartWidth - dEndWidth);
double dThickSub = fabs(dStartWidth - dEndThick);
dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub;
}
}
return dMaxSizeSub;
}
AcGeVector3d ImpHvacReducer::normal() const
{
return AcGeVector3d::kZAxis;
}
BOOL ImpHvacReducer::GetInterfaceSizeData(int nIndex, AecInterface& inf) const
{
if(NULL == m_pXDataMap)
return FALSE;
2026-10-04 00:04:20 +08:00
// 获取截面类型
2026-09-28 15:28:50 +08:00
ESection eSectType = eRect;
2026-10-04 00:04:20 +08:00
// 获取接口截面、宽度、厚度数据key值
2026-09-28 15:28:50 +08:00
LPCTSTR pszWidthKey, pszThickKey;
switch (nIndex)
{
case 0:
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectType);
pszWidthKey = ((eCircle == eSectType) ? HRED_StartDiameter : HRED_StartWidth);
pszThickKey = HRED_StartThick;
break;
case 1:
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSectType);
pszWidthKey = ((eCircle == eSectType) ? HRED_EndDiameter : HRED_EndWidth);
pszThickKey = HRED_EndThick;
break;
default:
return FALSE;
}
2026-10-04 00:04:20 +08:00
// 获取尺寸
2026-09-28 15:28:50 +08:00
double dWidth = 0.0, dThick = 0.0;
m_pXDataMap->GetAt(pszWidthKey, dWidth);
m_pXDataMap->GetAt(pszThickKey, dThick);
2026-10-04 00:04:20 +08:00
// 设置接口数据
2026-09-28 15:28:50 +08:00
inf.nSectType = eSectType;
inf.dSize1 = dWidth;
inf.dSize2 = dThick;
return TRUE;
}
bool ImpHvacReducer::GetInterface(AcArray<AecInterface>& arInfs) const
{
if (NULL == m_pXDataMap)
return false;
2026-10-04 00:04:20 +08:00
// 获取变径各点位置
2026-09-28 15:28:50 +08:00
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
2026-10-04 00:04:20 +08:00
// 求两端方向
2026-09-28 15:28:50 +08:00
AcGeVector3d vtStart = GetSectNormal();
AcGeVector3d vtEnd = -vtStart;
AecInterface inf;
inf.idOwner = m_pOwnerEnt->objectId();
for (int nIndex = 0;nIndex < 2;nIndex++)
{
switch(nIndex)
{
case 0:
{
inf.vtDir = vtStart;
inf.ptPos = ptStart;
GetInterfaceSizeData(nIndex, inf);
break;
}
case 1:
{
inf.vtDir = vtEnd;
inf.ptPos = ptEnd;
GetInterfaceSizeData(nIndex, inf);
break;
}
default:
break;
}
arInfs.append(inf);
}
return true;
}