8166 lines
239 KiB
C++
8166 lines
239 KiB
C++
#include "stdafx.h"
|
||
#include "ImpHvacTee.h"
|
||
#include "AuxTools.h"
|
||
#include "AecDbObjXDataMap.h"
|
||
#include "AecDbEntityBase.h"
|
||
#include "KTCADUtilityEx.h"
|
||
|
||
extern double MayAsMUnit(double dVal);
|
||
extern AcDb3dPolyline *Format3dPolyline(const AcGePoint3dArray &arPts);
|
||
static AcGeTol g_stol;
|
||
void GetEndPointIndex(const AcGePoint3dArray &ptArr, int &nIndex1, int &nIndex2, AcGeVector3d* pRangeDir = NULL)
|
||
{
|
||
if (NULL == pRangeDir)
|
||
{
|
||
double dMaxDist(0.0), dDistNow(0.0);
|
||
int i(0);
|
||
// 先找出一端的点索引
|
||
for (i = 0; i < ptArr.length(); i++)
|
||
{
|
||
dDistNow = ptArr[i].distanceTo(AcGePoint3d::kOrigin);
|
||
if (dDistNow > dMaxDist)
|
||
{
|
||
nIndex1 = i;
|
||
dMaxDist = dDistNow;
|
||
}
|
||
}
|
||
|
||
// 另一端
|
||
dMaxDist = 0.0;
|
||
for (i = 0; i < ptArr.length(); i++)
|
||
{
|
||
dDistNow = ptArr[i].distanceTo(ptArr[nIndex1]);
|
||
if (dDistNow > dMaxDist)
|
||
{
|
||
nIndex2 = i;
|
||
dMaxDist = dDistNow;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
const int iLen = ptArr.length();
|
||
if (iLen < 1)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 获取投影后的点集
|
||
AcGeLine3d line(ptArr[0], *pRangeDir);
|
||
AcGePoint3dArray arpt;
|
||
arpt.append(ptArr[0]);
|
||
for (int i = 1; i < iLen; ++i)
|
||
{
|
||
arpt.append(line.closestPointTo(ptArr[i]));
|
||
}
|
||
|
||
// 查找极值
|
||
nIndex1 = 0;
|
||
double dPositive = 0.0;
|
||
nIndex2 = 0;
|
||
double dMinus = 0.0;
|
||
AcGeVector3d vtIterate;
|
||
for (i = 1; i < iLen; ++i)
|
||
{
|
||
vtIterate = arpt[i] - arpt[0];
|
||
if (pRangeDir->angleTo(vtIterate) <1e-6)
|
||
{
|
||
if (vtIterate.length() > dPositive)
|
||
{
|
||
dPositive = vtIterate.length();
|
||
nIndex1 = i;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (vtIterate.length() > -dMinus)
|
||
{
|
||
dMinus = -vtIterate.length();
|
||
nIndex2 = i;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
ImpHvacTee::ImpHvacTee()
|
||
{
|
||
g_stol.setEqualPoint(1.0);
|
||
g_stol.setEqualVector(1.0 / 10.0);
|
||
m_pXDataMap = NULL;
|
||
m_pOwnerEnt = NULL;
|
||
}
|
||
|
||
ImpHvacTee::~ImpHvacTee()
|
||
{
|
||
}
|
||
|
||
Acad::ErrorStatus ImpHvacTee::transformBy( const AcGeMatrix3d& xform )
|
||
{
|
||
if (NULL == m_pXDataMap)
|
||
return Acad::eNotApplicable;
|
||
|
||
// 获取各点位置
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
|
||
// 变换位置
|
||
ptStart.transformBy(xform);
|
||
ptBran.transformBy(xform);
|
||
ptEnd.transformBy(xform);
|
||
|
||
// 更新点
|
||
m_pXDataMap->SetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->SetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->SetAt(HTEE_EndPoint, ptEnd);
|
||
|
||
// 向量变换
|
||
AcGeVector3d vtStart, vtEnd, vtBran;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
|
||
vtStart.transformBy(xform);
|
||
vtEnd.transformBy(xform);
|
||
vtBran.transformBy(xform);
|
||
vtStart.normalize();
|
||
vtEnd.normalize();
|
||
vtBran.normalize();
|
||
|
||
m_pXDataMap->SetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->SetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->SetAt(HTEE_BranchDir, vtBran);
|
||
|
||
// 设置尺寸
|
||
double dScale = xform.scale();
|
||
double dStaWidth(0.0), dEndWidth(0.), dBranWidth(0.0), dThick(0.0), dBranThick(0.0);
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStaWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
m_pXDataMap->GetAt(HTEE_Thick, dThick);
|
||
m_pXDataMap->GetAt(HTEE_BranchThick, dBranThick);
|
||
|
||
dStaWidth *= dScale;
|
||
dEndWidth *= dScale;
|
||
dBranWidth *= dScale;
|
||
dThick *= dScale;
|
||
dBranThick *= dScale;
|
||
|
||
m_pXDataMap->SetAt(HTEE_StartWidth, dStaWidth);
|
||
m_pXDataMap->SetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->SetAt(HTEE_BranchWidth, dBranWidth);
|
||
m_pXDataMap->SetAt(HTEE_Thick, dThick);
|
||
m_pXDataMap->SetAt(HTEE_BranchThick, dBranThick);
|
||
|
||
double dEndThick(0.0);
|
||
if (m_pXDataMap->GetAt(HTEE_EndThick, dEndThick))
|
||
{
|
||
dEndThick *= dScale;
|
||
m_pXDataMap->SetAt(HTEE_EndThick, dEndThick);
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
|
||
AecEqui::Position ImpHvacTee::ExplainGripIndex( int nIndex ) const
|
||
{
|
||
AecEqui::Position ePos = AecEqui::eStart;
|
||
|
||
AecHvac::HvacTeeType eType = AecHvac::eOrthoBranch;
|
||
ESection eSectType = eRect;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
|
||
if (IsHorzAlignment())
|
||
{
|
||
if (nIndex == 0)
|
||
ePos = AecEqui::eStart;
|
||
else if (nIndex == 1)
|
||
ePos = AecEqui::eEnd;
|
||
else if (nIndex == 2)
|
||
ePos = AecEqui::eBr1;
|
||
else if (nIndex == 3)
|
||
ePos = AecEqui::eCommand0;
|
||
else if (nIndex == 4)
|
||
ePos = AecEqui::eCommand1;
|
||
else if (nIndex == 5)
|
||
ePos = AecEqui::eCommand2;
|
||
else if (nIndex == 6)
|
||
ePos = AecEqui::eCommand3;
|
||
}
|
||
else if (IsSideVertAlignment())
|
||
{
|
||
if (nIndex == 0)
|
||
ePos = AecEqui::eStart;
|
||
else if (nIndex == 1)
|
||
ePos = AecEqui::eEnd;
|
||
else if (nIndex == 2)
|
||
ePos = AecEqui::eBr1;
|
||
else if (nIndex == 3)
|
||
{
|
||
if (eType == AecHvac::eVShapeBranch && eSectType == eCircle)
|
||
ePos = AecEqui::eCommand2;
|
||
else
|
||
ePos = AecEqui::eCommand0;
|
||
}
|
||
else if (nIndex == 4)
|
||
ePos = AecEqui::eCommand2;
|
||
}
|
||
else if (IsFaceVertAlignment())
|
||
{
|
||
if (nIndex == 0)
|
||
ePos = AecEqui::eStart;
|
||
else if (nIndex == 1)
|
||
ePos = AecEqui::eEnd;
|
||
else if (nIndex == 2)
|
||
ePos = AecEqui::eBr1;
|
||
else if (nIndex == 3)
|
||
{
|
||
if (eType == AecHvac::eVShapeBranch && eSectType == eCircle)
|
||
ePos = AecEqui::eCommand2;
|
||
else
|
||
ePos = AecEqui::eCommand0;
|
||
}
|
||
else if (nIndex == 4)
|
||
ePos = AecEqui::eCommand1;
|
||
else if (nIndex == 5)
|
||
ePos = AecEqui::eCommand2;
|
||
}
|
||
return ePos;
|
||
}
|
||
|
||
void ImpHvacTee::list() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
// 管件类型
|
||
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 暖通:三通"));
|
||
|
||
// 截面类型
|
||
ESection eSectType = eRect;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
switch (eSectType)
|
||
{
|
||
case eRect: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 截面:矩形")); break;
|
||
case eCircle: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 截面:圆形")); break;
|
||
case eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 截面:扁圆形")); break;
|
||
}
|
||
|
||
double dRadRatio = 0.0;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRadRatio);
|
||
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t曲率值:%.2f"), dRadRatio);
|
||
|
||
// 圆型截面显示直径
|
||
if (eCircle == eSectType)
|
||
{
|
||
double dStartDiameter = 0.0, dEndDiameter = 0.0;
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartDiameter);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndDiameter);
|
||
acutPrintf(_T("\n\t\t\t\t\t\t\t\t始端直径:%.2f 末端直径:%.2f"), dStartDiameter, dEndDiameter);
|
||
double dBranchDiameter = 0.0;
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranchDiameter);
|
||
acutPrintf(_T("\n\t\t\t\t\t\t\t\t支管直径:%.2f"), dBranchDiameter);
|
||
}
|
||
// 非圆型截面显示宽度和厚度
|
||
else
|
||
{
|
||
double dStartWidth = 0.0, dEndWidth = 0.0, dThick = 0.0;
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_Thick, dThick);
|
||
acutPrintf(_T("\n\t\t\t\t\t\t\t\t始端宽度:%.2f 末端宽度:%.2f 厚度:%.2f"), dStartWidth, dEndWidth, dThick);
|
||
double dBranchWidth = 0.0, dBranchThick = 0.0;
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranchWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchThick, dBranchThick);
|
||
acutPrintf(_T("\n\t\t\t\t\t\t\t\t支管宽度:%.2f 支管宽度:%.2f"), dBranchWidth, dBranchThick);
|
||
|
||
double dEndThick(0.0);
|
||
if (m_pXDataMap->GetAt(HTEE_EndThick, dEndThick))
|
||
acutPrintf(_T("\n\t\t\t\t\t\t\t\t末端厚度:%.2f"), dEndThick);
|
||
}
|
||
|
||
// 起点
|
||
AcGePoint3d pt;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, pt);
|
||
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);
|
||
|
||
// 终点
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, pt);
|
||
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);
|
||
|
||
// 支管
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, pt);
|
||
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);
|
||
}
|
||
|
||
AcGeVector3d ImpHvacTee::StartVect() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
AcGeVector3d vt;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vt);
|
||
return vt.normalize();
|
||
}
|
||
|
||
AcGeVector3d ImpHvacTee::EndVect() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
AcGeVector3d vt;
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vt);
|
||
return vt.normalize();
|
||
}
|
||
|
||
AcGeVector3d ImpHvacTee::BranVect() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
AcGeVector3d vt;
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vt);
|
||
return vt.normalize();
|
||
}
|
||
|
||
AcGeVector3d ImpHvacTee::normal() const
|
||
{
|
||
AecHvac::HvacTeeType eType = AecHvac::eOrthoBranch;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
ESection eSectType = eRect;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
AcGeVector3d vtNormal;
|
||
if (AecHvac::eVShapeBranch == eType && eRect == eSectType)
|
||
{
|
||
AcGePoint3d ptStart, ptEnd;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
AcGeVector3d vtEToS = ptStart - ptEnd;
|
||
vtNormal = vtEToS.crossProduct(BranVect());
|
||
vtNormal.normalize();
|
||
}
|
||
else
|
||
{
|
||
vtNormal = StartVect().crossProduct(BranVect());
|
||
if (vtNormal.length() < 1e-6)
|
||
{
|
||
AcGePoint3d ptS;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptS);
|
||
AcGePoint3d ptE;
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptE);
|
||
AcGePoint3d ptB;
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptB);
|
||
AcGeVector3d vtFakeS = ptS - ptE;
|
||
AcGeVector3d vtFakeB = ptB - ptE;
|
||
vtNormal = vtFakeS.crossProduct(vtFakeB);
|
||
}
|
||
vtNormal.normalize();
|
||
}
|
||
return vtNormal;
|
||
}
|
||
|
||
BOOL ImpHvacTee::GetInclineCirPts(AcGePoint3dArray &arPts) const
|
||
{
|
||
ASSERT(m_pXDataMap != NULL);
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
AcGeVector3d vtStart, vtEnd, vtBran;
|
||
double dStartWidth = 0.0;
|
||
double dEndWidth = 0.0;
|
||
double dBranWidth = 0.0;
|
||
double dPlusEdge = 0.0;
|
||
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge);
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
|
||
AcGeVector3d vtStartP = vtStart;
|
||
AcGeVector3d vtEndP = vtEnd;
|
||
AcGeVector3d vtBranP = vtBran;
|
||
|
||
if(!IsValidConst(NULL))
|
||
{
|
||
AcGePlane plane(ptStart, normal());
|
||
ptBran = ptBran.orthoProject(plane);
|
||
ptEnd = ptEnd.orthoProject(plane);
|
||
}
|
||
|
||
vtStartP.rotateBy(PI * 0.5, normal());
|
||
vtEndP.rotateBy(PI * 0.5, normal());
|
||
vtBranP.rotateBy(PI * 0.5, normal());
|
||
vtStartP.normalize();
|
||
vtEndP.normalize();
|
||
vtBranP.normalize();
|
||
|
||
// 0 - 17
|
||
arPts.append(ptStart - vtStartP * dStartWidth * 0.5);
|
||
arPts.append(ptStart);
|
||
arPts.append(ptStart + vtStartP * dStartWidth * 0.5);
|
||
arPts.append(ptEnd - vtEndP * dEndWidth * 0.5);
|
||
arPts.append(ptEnd);
|
||
arPts.append(ptEnd + vtEndP * dEndWidth * 0.5);
|
||
arPts.append(ptBran - vtBranP * dBranWidth * 0.5);
|
||
arPts.append(ptBran);
|
||
arPts.append(ptBran + vtBranP * dBranWidth * 0.5);
|
||
arPts.append(arPts[0] - vtStart * dPlusEdge);
|
||
arPts.append(arPts[1] - vtStart * dPlusEdge);
|
||
arPts.append(arPts[2] - vtStart * dPlusEdge);
|
||
arPts.append(arPts[3] - vtEnd * dPlusEdge);
|
||
arPts.append(arPts[4] - vtEnd * dPlusEdge);
|
||
arPts.append(arPts[5] - vtEnd * dPlusEdge);
|
||
arPts.append(arPts[6] - vtBran * dPlusEdge);
|
||
arPts.append(arPts[7] - vtBran * dPlusEdge);
|
||
arPts.append(arPts[8] - vtBran * dPlusEdge);
|
||
|
||
AcGeVector3d vtTmp1, vtTmp2;
|
||
vtTmp1 = arPts[15] - arPts[11];
|
||
vtTmp2 = arPts[16] - arPts[10];
|
||
|
||
// 18
|
||
AcGePoint3d ptTmp = AcGePoint3d::kOrigin;
|
||
AcGeVector3d vtTmp = AcGeVector3d::kIdentity;
|
||
if (GetIntersectWith(arPts[10], arPts[11], vtTmp2.normalize(), vtTmp1.normalize(), ptTmp))
|
||
{
|
||
vtTmp = ptTmp - arPts[17];
|
||
}
|
||
else
|
||
{
|
||
vtTmp = BranVect();
|
||
}
|
||
|
||
vtTmp1 = arPts[12] - arPts[11];
|
||
vtTmp1.normalize();
|
||
vtTmp.normalize();
|
||
if (!GetIntersectWith(arPts[17], arPts[12], vtTmp, vtTmp1, ptTmp))
|
||
return FALSE;
|
||
|
||
arPts.append(ptTmp);
|
||
|
||
// 19
|
||
vtTmp = arPts[18] - arPts[17];
|
||
vtTmp.normalize();
|
||
ptTmp = arPts[17] + vtTmp * arPts[11].distanceTo(arPts[15]);
|
||
ptTmp = TAuxTools::Mid(ptTmp, arPts[11]);
|
||
arPts.append(ptTmp);
|
||
|
||
return arPts.length() > 0;
|
||
}
|
||
|
||
BOOL ImpHvacTee::GetInclineCirPts2d(AcGePoint3dArray &arPts) const
|
||
{
|
||
ASSERT(m_pXDataMap != NULL);
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
AcGeVector3d vtStart, vtEnd, vtBran, vtNor(normal());
|
||
double dStartWidth = 0.0;
|
||
double dEndWidth = 0.0;
|
||
double dBranWidth = 0.0;
|
||
double dPlusEdge = 0.0;
|
||
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge);
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
AcGeVector3d vtStartP = vtStart;
|
||
AcGeVector3d vtEndP = vtEnd;
|
||
AcGeVector3d vtBranP = vtBran;
|
||
|
||
if(!IsValidConst(NULL))
|
||
{
|
||
AcGePlane plane(ptStart, normal());
|
||
ptBran = ptBran.orthoProject(plane);
|
||
ptEnd = ptEnd.orthoProject(plane);
|
||
}
|
||
|
||
vtStartP.rotateBy(PI * 0.5, normal());
|
||
vtEndP.rotateBy(PI * 0.5, normal());
|
||
vtBranP.rotateBy(PI * 0.5, normal());
|
||
vtStartP.normalize();
|
||
vtEndP.normalize();
|
||
vtBranP.normalize();
|
||
|
||
// 0 - 17
|
||
arPts.append(ptStart - vtStartP * dStartWidth * 0.5);
|
||
arPts.append(ptStart);
|
||
arPts.append(ptStart + vtStartP * dStartWidth * 0.5);
|
||
arPts.append(ptEnd - vtEndP * dEndWidth * 0.5);
|
||
arPts.append(ptEnd);
|
||
arPts.append(ptEnd + vtEndP * dEndWidth * 0.5);
|
||
arPts.append(ptBran - vtBranP * dBranWidth * 0.5);
|
||
arPts.append(ptBran);
|
||
arPts.append(ptBran + vtBranP * dBranWidth * 0.5);
|
||
arPts.append(arPts[0] - vtStart * dPlusEdge);
|
||
arPts.append(arPts[1] - vtStart * dPlusEdge);
|
||
arPts.append(arPts[2] - vtStart * dPlusEdge);
|
||
arPts.append(arPts[3] - vtEnd * dPlusEdge);
|
||
arPts.append(arPts[4] - vtEnd * dPlusEdge);
|
||
arPts.append(arPts[5] - vtEnd * dPlusEdge);
|
||
arPts.append(arPts[6] - vtBran * dPlusEdge);
|
||
arPts.append(arPts[7] - vtBran * dPlusEdge);
|
||
arPts.append(arPts[8] - vtBran * dPlusEdge);
|
||
|
||
AcGeVector3d vtTmp1, vtTmp2;
|
||
vtTmp1 = arPts[15] - arPts[11];
|
||
vtTmp2 = arPts[16] - arPts[10];
|
||
|
||
// 18
|
||
AcGePoint3d ptTmp = AcGePoint3d::kOrigin;
|
||
AcGeVector3d vtTmp = AcGeVector3d::kIdentity;
|
||
if (GetIntersectWith(arPts[10], arPts[11], vtTmp2.normalize(), vtTmp1.normalize(), ptTmp))
|
||
vtTmp = ptTmp - arPts[17];
|
||
else
|
||
vtTmp = BranVect();
|
||
|
||
vtTmp1 = arPts[12] - arPts[11];
|
||
vtTmp1.normalize();
|
||
vtTmp.normalize();
|
||
if (!GetIntersectWith(arPts[17], arPts[12], vtTmp, vtTmp1, ptTmp))
|
||
return FALSE;
|
||
|
||
arPts.append(ptTmp);
|
||
|
||
// 19
|
||
vtTmp = arPts[18] - arPts[17];
|
||
vtTmp.normalize();
|
||
ptTmp = arPts[17] + vtTmp * arPts[11].distanceTo(arPts[15]);
|
||
|
||
Midpoint(ptTmp, arPts[11], ptTmp)
|
||
arPts.append(ptTmp);
|
||
|
||
// 对于倾斜三通和竖直三通,特殊处理,找到合适的点
|
||
AcGeVector3d vtZAxis = TAuxTools::GetUcsZvt();
|
||
AcGePlane plan(TAuxTools::Mid(ptStart, ptEnd), vtZAxis);
|
||
|
||
// 翻边余量在平面上的距离
|
||
double dStrPlus(0.0), dBranPlus(0.0), dDis(0.0);
|
||
vtTmp = arPts[10] - arPts[1];
|
||
vtTmp = vtTmp.orthoProject(vtZAxis);
|
||
dStrPlus = vtTmp.length();
|
||
vtTmp = arPts[7] - arPts[16];
|
||
vtTmp = vtTmp.orthoProject(vtZAxis);
|
||
dBranPlus = vtTmp.length();
|
||
double dRatio = arPts[11].distanceTo(arPts[19]);
|
||
|
||
double dMinDiffAng = PI/12;
|
||
//GetGlobalContext()->GetAt(KEY_MINDIFFANG,dMinDiffAng);
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG,dMinDiffAng);
|
||
if (dMinDiffAng < 1e-6)
|
||
dMinDiffAng = PI / 12;
|
||
|
||
// 分成nSect个扇形截面
|
||
int nSect = int(PI * 2 / dMinDiffAng);
|
||
|
||
// ptJudge用来判断三通投影到平面后的内外边线,距离ptJudge近的为内边线,远的为外边线
|
||
if (vtNor.isPerpendicularTo(TAuxTools::GetUcsZvt()))
|
||
vtTmp1 = vtNor; // 竖直三通(法向量垂直于Z轴,但vtStart不平行Z轴)
|
||
else
|
||
vtTmp1 = ptBran - ptEnd; // 一般倾斜三通
|
||
|
||
AcGePoint3d ptJudge;
|
||
ptJudge = ptEnd + vtTmp1 * 10000;
|
||
ptJudge = ptJudge.orthoProject(plan);
|
||
|
||
// 主管截面
|
||
AcGePoint3dArray arptSides, arPtJudge;
|
||
AcGePoint3d pt = ptStart + vtNor * dStartWidth * 0.5;
|
||
int i(0);
|
||
for (; i <= nSect; i++)
|
||
{
|
||
if (i < 3)
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtStart, ptStart));
|
||
else
|
||
break;
|
||
}
|
||
arPtJudge.append(ptJudge);
|
||
|
||
// 尾管截面
|
||
pt = ptEnd + vtNor * dEndWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
if (i < 3)
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtEnd, ptEnd));
|
||
else
|
||
break;
|
||
}
|
||
arPtJudge.append(ptJudge);
|
||
|
||
// 支管截面
|
||
pt = ptBran + vtNor * dBranWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
if (i < 3)
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtBran, ptBran));
|
||
else
|
||
break;
|
||
}
|
||
arPtJudge.append(ptJudge);
|
||
|
||
// 支管近主管端截面(插入主管的截面)
|
||
pt = arPts[19] + vtNor * dRatio;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
if (i < 3)
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtBran, arPts[19]));
|
||
else
|
||
break;
|
||
}
|
||
arPtJudge.append(ptJudge);
|
||
|
||
// 每个截面圆投影后求两个焦点,并设置高度为中点高度
|
||
if (!TAuxTools::GetPrjPtsFromCircle(arptSides, arPtJudge))
|
||
return FALSE;
|
||
|
||
Midpoint(ptStart, ptEnd, ptTmp);
|
||
for (i = 0; i < arPtJudge.length(); i++)
|
||
{
|
||
arPtJudge[i].z = ptTmp.z;
|
||
}
|
||
|
||
// 新的0-8
|
||
arPts[2] = arPtJudge[0];
|
||
arPts[0] = arPtJudge[1];
|
||
Midpoint(arPts[0], arPts[2], arPts[1]);
|
||
arPts[3] = arPtJudge[2];
|
||
arPts[5] = arPtJudge[3];
|
||
Midpoint(arPts[3], arPts[5], arPts[4]);
|
||
arPts[6] = arPtJudge[4];
|
||
arPts[8] = arPtJudge[5];
|
||
Midpoint(arPts[6], arPts[8], arPts[7]);
|
||
|
||
// 新的9-17
|
||
vtStart = vtStart.orthoProject(vtZAxis);
|
||
vtEnd = vtEnd.orthoProject(vtZAxis);
|
||
vtBran = vtBran.orthoProject(vtZAxis);
|
||
arPts[9] = arPts[0] - vtStart.normalize() * dStrPlus;
|
||
arPts[10] = arPts[1] - vtStart * dStrPlus;
|
||
arPts[11] = arPts[2] - vtStart * dStrPlus;
|
||
|
||
arPts[12] = arPts[3] - vtEnd.normalize() * dStrPlus;
|
||
arPts[13] = arPts[4] - vtEnd * dStrPlus;
|
||
arPts[14] = arPts[5] - vtEnd * dStrPlus;
|
||
|
||
arPts[15] = arPts[6] - vtBran.normalize() * dBranPlus;
|
||
arPts[16] = arPts[7] - vtBran * dBranPlus;
|
||
arPts[17] = arPts[8] - vtBran * dBranPlus;
|
||
|
||
// 竖直三通,主管支管重叠
|
||
if (IsIncVertAlignment())
|
||
{
|
||
vtNor = arPts[8] - arPts[6];
|
||
arPts[18] = arPts[19] - vtNor.normalize() * dRatio;
|
||
|
||
// 20
|
||
arPts.append(arPts[19] + vtNor * dRatio);
|
||
if (arPts[20].distanceTo(ptJudge) < arPts[18].distanceTo(ptJudge))
|
||
{
|
||
ptTmp = arPts[18];
|
||
arPts[20] = arPts[18];
|
||
arPts[18] = ptTmp;
|
||
}
|
||
}
|
||
// 一般倾斜三通
|
||
else if (IsInclineAlignment())
|
||
{
|
||
// 18
|
||
AcGeLine3d line(arPts[11], arPts[12]);
|
||
AcGeLine3d line2(arPts[8], arPts[17]);
|
||
if (Adesk::kTrue != line.intersectWith(line2, arPts[18]))
|
||
return FALSE;
|
||
// 19
|
||
Midpoint(arPtJudge[6], arPtJudge[7], arPts[19]);
|
||
}
|
||
else
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
return arPts.length() > 0;
|
||
}
|
||
|
||
BOOL ImpHvacTee::IsNeedMakeAllCurves(AcGePoint3dArray& arPtJudge) const
|
||
{
|
||
AcGeLineSeg3d seg1(arPtJudge[11], arPtJudge[12]);
|
||
return (Adesk::kFalse == seg1.isOn(arPtJudge[18]));
|
||
}
|
||
|
||
void ImpHvacTee::GetArcPoint(AcDbPolyline &polyLine, AcGePoint3dArray &ptArcArr) const
|
||
{
|
||
if (polyLine.numVerts() != 4)
|
||
return;
|
||
|
||
double dPara1(0.0), dPara2(0.0);
|
||
double dPar1, dPar2;
|
||
AcGePoint3d pt0, pt1, pt2, pt3, ptMid;
|
||
|
||
polyLine.getPointAt(0, pt0);
|
||
polyLine.getPointAt(1, pt1);
|
||
polyLine.getPointAt(2, pt2);
|
||
polyLine.getPointAt(3, pt3);
|
||
|
||
polyLine.getParamAtPoint(pt0, dPar1);
|
||
polyLine.getParamAtPoint(pt1, dPar2);
|
||
polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid);
|
||
ptArcArr.append(pt0);
|
||
ptArcArr.append(ptMid);
|
||
ptArcArr.append(pt1);
|
||
|
||
polyLine.getParamAtPoint(pt1, dPar1);
|
||
polyLine.getParamAtPoint(pt2, dPar2);
|
||
polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid);
|
||
ptArcArr.append(ptMid);
|
||
ptArcArr.append(pt2);
|
||
|
||
polyLine.getParamAtPoint(pt2, dPar1);
|
||
polyLine.getParamAtPoint(pt3, dPar2);
|
||
polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid);
|
||
ptArcArr.append(ptMid);
|
||
ptArcArr.append(pt3);
|
||
}
|
||
|
||
BOOL ImpHvacTee::GetInsertCirPts(AcGePoint3dArray &arPts) const
|
||
{
|
||
ASSERT(m_pXDataMap != NULL);
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
AcGeVector3d vtStart, vtEnd, vtBran, vtNormal(normal());// Lixl add 调用一次就好
|
||
double dStartWidth = 0.0;
|
||
double dEndWidth = 0.0;
|
||
double dBranWidth = 0.0;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
AcGeVector3d vtStartP = vtStart;
|
||
AcGeVector3d vtEndP = vtEnd;
|
||
AcGeVector3d vtBranP = vtBran;
|
||
|
||
if(!IsValidConst(NULL))
|
||
{
|
||
AcGePlane plane(ptStart, /*normal()*/vtNormal);
|
||
ptBran = ptBran.orthoProject(plane);
|
||
ptEnd = ptEnd.orthoProject(plane);
|
||
}
|
||
|
||
vtStartP.rotateBy(PI * 0.5, /*normal()*/vtNormal);
|
||
vtEndP.rotateBy(PI * 0.5, /*normal()*/vtNormal);
|
||
vtBranP.rotateBy(PI * 0.5, /*normal()*/vtNormal);
|
||
vtStartP.normalize();
|
||
vtEndP.normalize();
|
||
vtBranP.normalize();
|
||
|
||
// 0 - 8
|
||
arPts.append(ptStart - vtStartP * dStartWidth * 0.5);
|
||
arPts.append(ptStart);
|
||
arPts.append(ptStart + vtStartP * dStartWidth * 0.5);
|
||
arPts.append(ptEnd - vtEndP * dEndWidth * 0.5);
|
||
arPts.append(ptEnd);
|
||
arPts.append(ptEnd + vtEndP * dEndWidth * 0.5);
|
||
arPts.append(ptBran - vtBranP * dBranWidth * 0.5);
|
||
arPts.append(ptBran);
|
||
arPts.append(ptBran + vtBranP * dBranWidth * 0.5);
|
||
|
||
AcGeVector3d vtTmp1, vtTmp2;
|
||
vtTmp1 = arPts[2] - arPts[3];
|
||
vtTmp2 = - vtTmp1;
|
||
// 9 - 10
|
||
AcGePoint3d ptTmp = AcGePoint3d::kOrigin;
|
||
if (!GetIntersectWith(arPts[6], arPts[3], vtBran.normalize(), vtTmp1.normalize(), ptTmp))
|
||
return FALSE;
|
||
arPts.append(ptTmp);
|
||
if (!GetIntersectWith(arPts[8], arPts[2], vtBran.normalize(), vtTmp2.normalize(), ptTmp))
|
||
return FALSE;
|
||
arPts.append(ptTmp);
|
||
|
||
// 11
|
||
vtBran.normalize();
|
||
double dDis1 = arPts[6].distanceTo(arPts[9]);
|
||
double dDis2 = arPts[8].distanceTo(arPts[10]);
|
||
ptTmp = ptBran - vtBran * ((dDis1 + dDis2) * 0.5 + dBranWidth * 0.15);
|
||
arPts.append(ptTmp);
|
||
|
||
// 12
|
||
if (!GetIntersectWith(ptStart, ptBran, vtStart.normalize(), vtBran.normalize(), ptTmp))
|
||
return FALSE;
|
||
arPts.append(ptTmp);
|
||
|
||
return arPts.length() > 0;
|
||
}
|
||
|
||
BOOL ImpHvacTee::GetInsertCirPtsOnHidePlan(AcGePoint3dArray &arPts) const
|
||
{
|
||
ASSERT(m_pXDataMap != NULL);
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran, ptCenter;
|
||
AcGeVector3d vtStart, vtEnd, vtBran;
|
||
double dStartWidth = 0.0;
|
||
double dEndWidth = 0.0;
|
||
double dBranWidth = 0.0;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
// 计算三通中点消隐面
|
||
Midpoint(ptStart, ptEnd, ptCenter);
|
||
AcGePlane prjPlan(ptCenter, TAuxTools::GetUcsZvt());
|
||
|
||
// 点和向量向消隐面投影
|
||
ptStart = ptStart.orthoProject(prjPlan);
|
||
ptEnd = ptEnd.orthoProject(prjPlan);
|
||
ptBran = ptBran.orthoProject(prjPlan);
|
||
|
||
// 平面向量
|
||
vtStart = ptStart - ptCenter;
|
||
vtBran = ptBran - ptCenter;
|
||
vtEnd = ptEnd - ptCenter;
|
||
vtStart.normalize();
|
||
vtBran.normalize();
|
||
vtEnd.normalize();
|
||
|
||
AcGeVector3d vtStartP = vtStart;
|
||
AcGeVector3d vtEndP = vtEnd;
|
||
AcGeVector3d vtBranP = vtBran;
|
||
|
||
AcGeVector3d vtRotateNor = vtStart.crossProduct(vtBran);
|
||
vtStartP.rotateBy(PI * 0.5, vtRotateNor);
|
||
vtEndP.rotateBy(PI * 0.5, vtRotateNor);
|
||
vtBranP.rotateBy(PI * 0.5, vtRotateNor);
|
||
|
||
// 0 - 8
|
||
AcGePoint3d pt3d;
|
||
arPts.append(ptStart - vtStartP * dStartWidth * 0.5);
|
||
arPts.append(ptStart);
|
||
arPts.append(ptStart + vtStartP * dStartWidth * 0.5);
|
||
|
||
arPts.append(ptEnd - vtEndP * dEndWidth * 0.5);
|
||
arPts.append(ptEnd);
|
||
arPts.append(ptEnd + vtEndP * dEndWidth * 0.5);
|
||
|
||
AcGePoint3d pt = ptBran - vtBranP * dBranWidth * 0.5;
|
||
arPts.append(pt);
|
||
arPts.append(ptBran);
|
||
pt = ptBran + vtBranP * dBranWidth * 0.5;
|
||
arPts.append(pt);
|
||
|
||
AcGeVector3d vtTmp1, vtTmp2;
|
||
vtTmp1 = arPts[2] - arPts[3];
|
||
vtTmp2 = - vtTmp1;
|
||
// 9 - 10
|
||
AcGePoint3d ptTmp = AcGePoint3d::kOrigin;
|
||
if (!GetIntersectWith(arPts[6], arPts[3], vtBran, vtTmp1, ptTmp))
|
||
return FALSE;
|
||
arPts.append(ptTmp);
|
||
if (!GetIntersectWith(arPts[8], arPts[2], vtBran, vtTmp2, ptTmp))
|
||
return FALSE;
|
||
arPts.append(ptTmp);
|
||
|
||
// 11
|
||
vtBran.normalize();
|
||
double dDis1 = arPts[6].distanceTo(arPts[9]);
|
||
double dDis2 = arPts[8].distanceTo(arPts[10]);
|
||
ptTmp = ptBran - vtBran * ((dDis1 + dDis2) * 0.5 + dBranWidth * 0.15);
|
||
arPts.append(ptTmp);
|
||
|
||
// 12
|
||
if (!GetIntersectWith(ptStart, ptBran, vtStart, vtBran, ptTmp))
|
||
return FALSE;
|
||
arPts.append(ptTmp);
|
||
|
||
return arPts.length() > 0;
|
||
}
|
||
|
||
BOOL ImpHvacTee::GetIntersectWith(AcGePoint3d &pt1,AcGePoint3d &pt2,AcGeVector3d &vt1,AcGeVector3d &vt2,AcGePoint3d &ptIntersect) const
|
||
{
|
||
AcGeLine3d line1,line2;
|
||
line1.set(pt1,vt1);
|
||
line2.set(pt2,vt2);
|
||
return line1.intersectWith(line2, ptIntersect);
|
||
}
|
||
|
||
BOOL ImpHvacTee::GetIntersectWith(AcGePoint3d &pt1,AcGePoint3d &pt2,AcGePoint3d &pt3,AcGePoint3d &pt4,AcGePoint3d &ptIntersect) const
|
||
{
|
||
AcGeLine3d line1,line2;
|
||
line1.set(pt1,pt2);
|
||
line2.set(pt3,pt4);
|
||
return line1.intersectWith(line2, ptIntersect);
|
||
}
|
||
|
||
BOOL ImpHvacTee::IsHorzAlignment() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
// 获得UCS坐标Z向量
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
|
||
return normal().isParallelTo(vtZAxis, g_stol);
|
||
}
|
||
|
||
BOOL ImpHvacTee::IsSideVertAlignment() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGeVector3d vtNormal = normal();
|
||
if (vtNormal.length() < 1e-3)
|
||
return FALSE;
|
||
|
||
// 取得位置点
|
||
AcGePoint3d ptStart, ptEnd;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
|
||
// 获得UCS坐标Z向量
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
|
||
AecHvac::HvacTeeType eType;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
if (AecHvac::eVShapeBranch == eType)
|
||
{
|
||
return StartVect().isPerpendicularTo(vtZAxis, g_stol) && vtNormal.isPerpendicularTo(vtZAxis, g_stol);
|
||
}
|
||
else
|
||
{
|
||
return StartVect().isParallelTo(vtZAxis, g_stol);
|
||
}
|
||
}
|
||
|
||
BOOL ImpHvacTee::IsFaceVertAlignment() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGeVector3d vtNormal = normal();
|
||
if (vtNormal.length() < 1e-3)
|
||
return FALSE;
|
||
|
||
// 获得UCS坐标Z向量
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
|
||
AecHvac::HvacTeeType eType;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
ESection eSectType;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
if (AecHvac::eVShapeBranch == eType && eRect == eSectType)
|
||
{
|
||
return StartVect().isParallelTo(vtZAxis, g_stol);
|
||
}
|
||
if (AecHvac::eVShapeBranch == eType && eCircle == eSectType)
|
||
{
|
||
AcGePoint3d ptStart, ptEnd;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
AcGeVector3d vtStart = ptEnd - ptStart;
|
||
return vtStart.isPerpendicularTo(vtZAxis, g_stol) && vtNormal.isPerpendicularTo(vtZAxis, g_stol);
|
||
}
|
||
else
|
||
{
|
||
return StartVect().isPerpendicularTo(vtZAxis, g_stol) && vtNormal.isPerpendicularTo(vtZAxis, g_stol);
|
||
}
|
||
}
|
||
|
||
// 倾斜垂直放置
|
||
BOOL ImpHvacTee::IsIncVertAlignment() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGeVector3d vtNormal = normal();
|
||
if (vtNormal.length() < 1e-3)
|
||
return FALSE;
|
||
|
||
// 获得UCS坐标Z向量
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
|
||
AecHvac::HvacTeeType eType;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
ESection eSectType;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
if (AecHvac::eVShapeBranch == eType && eRect == eSectType)
|
||
{
|
||
return StartVect().isPerpendicularTo(vtZAxis, g_stol);
|
||
}
|
||
else
|
||
{
|
||
return vtNormal.isPerpendicularTo(vtZAxis, g_stol);
|
||
}
|
||
}
|
||
|
||
BOOL ImpHvacTee::IsInclineAlignment() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGeVector3d vtNormal(normal());
|
||
if (vtNormal.length() < 1e-3)
|
||
return FALSE;
|
||
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
|
||
AcGeVector3d vtStart;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
|
||
AecHvac::HvacTeeType eType;
|
||
ESection eSectType;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
if (AecHvac::eVShapeBranch == eType && eRect == eSectType)
|
||
{
|
||
return !vtStart.isParallelTo(vtZAxis, g_stol) && !vtStart.isPerpendicularTo(vtZAxis, g_stol) ;
|
||
}
|
||
return !(vtNormal.isParallelTo(vtZAxis, g_stol)) && !(vtNormal.isPerpendicularTo(vtZAxis, g_stol));
|
||
}
|
||
|
||
BOOL ImpHvacTee::IsSingleLine() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
BOOL bSingleLine = FALSE;
|
||
m_pXDataMap->GetAt(HVAC_IsSingleLine, (int&)bSingleLine);
|
||
return bSingleLine;
|
||
}
|
||
|
||
BOOL ImpHvacTee::IsBaseLine() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
BOOL bBaseLine = FALSE;
|
||
m_pXDataMap->GetAt(HVAC_HasBaseLine, (int&)bBaseLine);
|
||
return bBaseLine;
|
||
}
|
||
|
||
Acad::ErrorStatus ImpHvacTee::Draw3d(AcGiDraw &mode) const
|
||
{
|
||
if (NULL == m_pXDataMap)
|
||
return Acad::eNotImplementedYet;
|
||
|
||
AecHvac::HvacTeeType eType = AecHvac::eOrthoBranch;
|
||
ESection eSectType = eRect;
|
||
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
|
||
if(!IsValidConst(NULL) && eRect == eSectType)
|
||
{
|
||
DrawSpecial3d(mode);
|
||
return Acad::eOk;
|
||
}
|
||
|
||
if (eType == AecHvac::eOrthoBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
DrawOrthoRect3d(mode);
|
||
else if (eSectType == eCircle)
|
||
DrawInsertCircle3d(mode);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eInsertBranch || eType == AecHvac::eInsertIntubBranch)//承插
|
||
{
|
||
if (eSectType == eRect)
|
||
DrawInsertRect3d(mode);
|
||
else if (eSectType == eCircle)
|
||
{
|
||
DrawInsertBranchCircle3d(mode);//承插
|
||
}
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eInclineBranch)//斜接
|
||
{
|
||
if (eSectType == eRect)
|
||
DrawInclineRect3d(mode);
|
||
else if (eSectType == eCircle)
|
||
{
|
||
DrawInclineBranchCircle3d(mode);//斜接
|
||
}
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eYShapeBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
DrawYShapeRect3d(mode);
|
||
else if (eSectType == eCircle)
|
||
DrawYShapeCircle3d(mode);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eVShapeBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
DrawVShapeRect3d(mode);
|
||
else if (eSectType == eCircle)
|
||
DrawVShapeCircle3d(mode);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eTShapeBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
DrawTShapeRect3d(mode);
|
||
else if (eSectType == eCircle)
|
||
DrawTShapeCircle3d(mode);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eArcuateBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
DrawArcuateRect3d(mode);
|
||
else if (eSectType == eCircle)
|
||
DrawArcuateCircle3d(mode);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if(eType == AecHvac::eArcuateIntubBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
DrawArcuateIntubRect3d(mode);
|
||
else if (eSectType == eCircle)
|
||
DrawArcuateCircle3d(mode);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
static bool GetSamplePoints(AcDbCurve *pCurve, int nDivSegs, AcGePoint3dArray &arPts)
|
||
{
|
||
if (pCurve == NULL) return FALSE;
|
||
|
||
double dS = 0, dE = 0;
|
||
pCurve->getStartParam(dS);
|
||
pCurve->getEndParam(dE);
|
||
|
||
double dStep = (dE - dS) / nDivSegs;
|
||
AcGePoint3d pt;
|
||
|
||
for (int i = 0; i <= nDivSegs; i++)
|
||
{
|
||
if (Acad::eOk == pCurve->getPointAtParam(dS, pt))
|
||
{
|
||
arPts.append(pt);
|
||
}
|
||
dS += dStep;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
void ImpHvacTee::DrawInsertBranchCircle3d(AcGiDraw &mode) const
|
||
{
|
||
//开始端斜接直边长度 50
|
||
double dLDisFrSta = 50;//毫米
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtEnd, vtBran,vtStart;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
|
||
double dStartWidth = 0, dEndWidth = 0, dBranWidth = 0;
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
|
||
vtEnd.normalize(); vtBran.normalize();
|
||
AcGeVector3d vtBran45 = vtEnd + vtBran;
|
||
vtBran45.normalize();
|
||
|
||
//示意弧弦高
|
||
double dArch = 50;
|
||
|
||
AcGeVector3d vtNorm = vtEnd.crossProduct(vtBran);
|
||
|
||
AcGePoint3d ptB1 = ptStart;
|
||
ptB1 += vtBran * dStartWidth * 0.5;
|
||
ptB1 += vtEnd * dLDisFrSta;
|
||
|
||
AcGeVector3d vtL = vtEnd.orthoProject(vtBran45);
|
||
vtL.normalize();
|
||
|
||
AcGePoint3d ptB2Cen = ptB1 + vtL * dBranWidth * 0.5;
|
||
|
||
AcGeLine3d lnC(ptB2Cen, vtBran45);
|
||
AcGeLine3d lnM(ptStart, ptEnd);
|
||
|
||
AcGePoint3d ptInt;
|
||
if (lnM.intersectWith(lnC, ptInt))
|
||
{
|
||
double dM = ptStart.distanceTo(ptEnd);
|
||
AcGePoint3d ptBrnFr = lnM.closestPointTo(ptBran);
|
||
double dB = ptBrnFr.distanceTo(ptBran);
|
||
|
||
double dL = dB * sqrt(2.0);
|
||
AcGePoint3d ptBr2 = ptInt + dL * vtBran45;
|
||
|
||
//down arc
|
||
AcGePoint3d pt2 = ptBr2 + vtL * dBranWidth * 0.5;
|
||
AcGeLine3d rayL2(pt2, vtBran45);
|
||
|
||
AcGePoint3d ptSD = ptStart + vtBran * dStartWidth * 0.5;
|
||
AcGePoint3d ptED = ptEnd + vtBran * dEndWidth * 0.5;
|
||
AcGeLine3d lnD(ptSD, ptED);
|
||
|
||
//下面弧段 45度
|
||
double dRadRatio = 1.0;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRadRatio);
|
||
|
||
double dR = dRadRatio * dBranWidth;
|
||
AcGePoint3d ptCen = ptBr2 - dR * vtL;
|
||
|
||
//内弧
|
||
AcGeVector3d vtM = vtL + vtEnd;
|
||
vtM.normalize();
|
||
|
||
double dMinDiffAng = PI / 12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG, dMinDiffAng);
|
||
if (dMinDiffAng < 1e-6)
|
||
{
|
||
dMinDiffAng = PI / 12;
|
||
}
|
||
|
||
//按照90°弯头分成nSect1个圆截面,每个圆截面分成nSect个点
|
||
int nSect = int(PI * 2 / dMinDiffAng);
|
||
AcGeVector3d vtNor = normal();
|
||
|
||
// 直管
|
||
AcGePoint3dArray arptSides;
|
||
AcGePoint3d pt = ptStart + vtNor * dStartWidth * 0.5;
|
||
for (int i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtStart, ptStart));
|
||
}
|
||
pt = ptEnd + vtNor * dEndWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtStart, ptEnd));
|
||
}
|
||
DrawMesh(mode, 2, nSect + 1, arptSides.asArrayPtr());
|
||
|
||
//支管
|
||
arptSides.setLogicalLength(0);
|
||
pt = ptInt + vtNor * dBranWidth * 0.5;
|
||
AcGeVector3d vtAxis = ptBr2 - ptInt;
|
||
for (int i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtAxis, ptInt));
|
||
}
|
||
pt = ptBr2 + vtNor * dBranWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtAxis, ptBr2));
|
||
}
|
||
DrawMesh(mode, 2, nSect + 1, arptSides.asArrayPtr());
|
||
|
||
//弯头段
|
||
AcDbArc *pArc = KTCADUtilityEx::FormatArc(ptCen + vtL * dR, ptCen + vtM * dR, ptCen + vtEnd * dR);
|
||
if (pArc != NULL)
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
GetSamplePoints(pArc, 4, arPts);
|
||
|
||
AcGePoint3d pt0, pt1;
|
||
AcGeVector3d vtSeg;
|
||
for (int ii = 0; ii < arPts.length() - 1; ii++)
|
||
{
|
||
pt0 = arPts.at(ii);
|
||
pt1 = arPts.at(ii + 1);
|
||
|
||
arptSides.setLogicalLength(0);
|
||
pt = pt0 + vtNor * dBranWidth * 0.5;
|
||
pArc->getFirstDeriv(pt0, vtAxis);
|
||
for (int i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtAxis, pt0));
|
||
}
|
||
pt = pt1 + vtNor * dBranWidth * 0.5;
|
||
pArc->getFirstDeriv(pt1, vtAxis);
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtAxis, pt1));
|
||
}
|
||
DrawMesh(mode, 2, nSect + 1, arptSides.asArrayPtr());
|
||
}
|
||
delete pArc;
|
||
}
|
||
}
|
||
}
|
||
|
||
bool ImpHvacTee::GetInsertBranchCircle2DInfs(AcArray<AecInterface> &arInfs) const
|
||
{
|
||
//开始端斜接直边长度 50
|
||
double dLDisFrSta = 50;//毫米
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtEnd, vtBran, vtStart;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
|
||
double dStartWidth = 0, dEndWidth = 0, dBranWidth = 0;
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
|
||
vtEnd.normalize(); vtBran.normalize();
|
||
AcGeVector3d vtBran45 = vtEnd + vtBran;
|
||
vtBran45.normalize();
|
||
|
||
AecInterface inf;
|
||
inf.ptPos = ptStart;
|
||
inf.vtDir = vtStart;
|
||
inf.dSize1 = dStartWidth;
|
||
inf.dSize2 = 0.0;
|
||
inf.nSectType = 1;
|
||
arInfs.append(inf);
|
||
|
||
inf.ptPos = ptEnd;
|
||
inf.vtDir = vtEnd;
|
||
arInfs.append(inf);
|
||
|
||
|
||
//示意弧弦高
|
||
double dArch = 50;
|
||
|
||
AcGeVector3d vtNorm = vtEnd.crossProduct(vtBran);
|
||
|
||
AcGePoint3d ptB1 = ptStart;
|
||
ptB1 += vtBran * dStartWidth * 0.5;
|
||
ptB1 += vtEnd * dLDisFrSta;
|
||
|
||
AcGeVector3d vtL = vtEnd.orthoProject(vtBran45);
|
||
vtL.normalize();
|
||
|
||
AcGePoint3d ptB2Cen = ptB1 + vtL * dBranWidth * 0.5;
|
||
|
||
AcGeLine3d lnC(ptB2Cen, vtBran45);
|
||
AcGeLine3d lnM(ptStart, ptEnd);
|
||
|
||
AcGePoint3d ptInt;
|
||
if (lnM.intersectWith(lnC, ptInt))
|
||
{
|
||
double dM = ptStart.distanceTo(ptEnd);
|
||
AcGePoint3d ptBrnFr = lnM.closestPointTo(ptBran);
|
||
double dB = ptBrnFr.distanceTo(ptBran);
|
||
|
||
double dL = dB * sqrt(2.0);
|
||
AcGePoint3d ptBr2 = ptInt + dL * vtBran45;
|
||
|
||
//down arc
|
||
AcGePoint3d pt2 = ptBr2 + vtL * dBranWidth * 0.5;
|
||
AcGeLine3d rayL2(pt2, vtBran45);
|
||
|
||
AcGePoint3d ptSD = ptStart + vtBran * dStartWidth * 0.5;
|
||
AcGePoint3d ptED = ptEnd + vtBran * dEndWidth * 0.5;
|
||
AcGeLine3d lnD(ptSD, ptED);
|
||
|
||
//下面弧段 45度
|
||
double dRadRatio = 1.0;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRadRatio);
|
||
|
||
double dR = dRadRatio * dBranWidth;
|
||
AcGePoint3d ptCen = ptBr2 - dR * vtL;
|
||
|
||
//内弧
|
||
AcGeVector3d vtM = vtL + vtEnd;
|
||
vtM.normalize();
|
||
|
||
double dMinDiffAng = PI / 12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG, dMinDiffAng);
|
||
if (dMinDiffAng < 1e-6)
|
||
{
|
||
dMinDiffAng = PI / 12;
|
||
}
|
||
|
||
//按照90°弯头分成nSect1个圆截面,每个圆截面分成nSect个点
|
||
int nSect = int(PI * 2 / dMinDiffAng);
|
||
AcGeVector3d vtNor = normal();
|
||
|
||
inf.ptPos = ptCen + vtEnd * dR;
|
||
inf.vtDir = vtBran;
|
||
inf.dSize1 = dBranWidth;
|
||
arInfs.append(inf);
|
||
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool ImpHvacTee::GetInclineBranchCircle2DInfs(AcArray<AecInterface> &arInfs) const
|
||
{
|
||
//开始端斜接直边长度 50
|
||
double dLDisFrSta = 0;//毫米
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtEnd, vtBran, vtStart;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
|
||
double dStartWidth = 0, dEndWidth = 0, dBranWidth = 0;
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
|
||
vtEnd.normalize(); vtBran.normalize();
|
||
AcGeVector3d vtBran45 = vtEnd + vtBran;
|
||
vtBran45.normalize();
|
||
|
||
AecInterface inf;
|
||
inf.ptPos = ptStart;
|
||
inf.vtDir = vtStart;
|
||
inf.dSize1 = dStartWidth;
|
||
inf.dSize2 = 0.0;
|
||
inf.nSectType = 1;
|
||
arInfs.append(inf);
|
||
|
||
inf.ptPos = ptEnd;
|
||
inf.vtDir = vtEnd;
|
||
arInfs.append(inf);
|
||
|
||
//示意弧弦高
|
||
double dArch = 50;
|
||
|
||
AcGeVector3d vtNorm = vtEnd.crossProduct(vtBran);
|
||
|
||
AcGePoint3d ptB1 = ptStart;
|
||
ptB1 += vtBran * dStartWidth * 0.5;
|
||
ptB1 += vtEnd * dLDisFrSta;
|
||
|
||
AcGeVector3d vtL = vtEnd.orthoProject(vtBran45);
|
||
vtL.normalize();
|
||
|
||
AcGePoint3d ptB2Cen = ptStart;
|
||
|
||
AcGeLine3d lnC(ptB2Cen, vtBran45);
|
||
AcGeLine3d lnM(ptStart, ptEnd);
|
||
|
||
AcGePoint3d ptInt;
|
||
//if (lnM.intersectWith(lnC, ptInt))
|
||
{
|
||
ptInt = ptStart;
|
||
double dM = ptStart.distanceTo(ptEnd);
|
||
AcGePoint3d ptBrnFr = lnM.closestPointTo(ptBran);
|
||
double dB = ptBrnFr.distanceTo(ptBran);
|
||
|
||
double dL = dB * sqrt(2.0);
|
||
AcGePoint3d ptBr2 = ptInt + dL * vtBran45;
|
||
|
||
double dInR = lnC.distanceTo(ptB1);
|
||
|
||
//down arc
|
||
AcGePoint3d pt2 = ptBr2 + vtL * dBranWidth * 0.5;
|
||
AcGePoint3d pt1 = ptB1 + vtL * dInR * 2.0;
|
||
|
||
AcGeLine3d rayL2(pt2, pt1);
|
||
|
||
AcGePoint3d ptSD = ptStart + vtBran * dStartWidth * 0.5;
|
||
AcGePoint3d ptED = ptEnd + vtBran * dEndWidth * 0.5;
|
||
AcGeLine3d lnD(ptSD, ptED);
|
||
|
||
AcGePoint3d pt3;
|
||
if (lnD.intersectWith(rayL2, pt3))
|
||
{
|
||
AcGePoint3d ptM;
|
||
Midpoint(ptB1, pt3, ptM);
|
||
ptM -= vtBran * dArch;
|
||
}
|
||
|
||
//下面弧段 45度
|
||
double dRadRatio = 1.0;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRadRatio);
|
||
|
||
double dR = dRadRatio * dBranWidth;
|
||
AcGePoint3d ptCen = ptBr2 - dR * vtL;
|
||
|
||
//内弧
|
||
AcGeVector3d vtM = vtL + vtEnd;
|
||
vtM.normalize();
|
||
|
||
double dMinDiffAng = PI / 12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG, dMinDiffAng);
|
||
if (dMinDiffAng < 1e-6)
|
||
{
|
||
dMinDiffAng = PI / 12;
|
||
}
|
||
|
||
//按照90°弯头分成nSect1个圆截面,每个圆截面分成nSect个点
|
||
int nSect = int(PI * 2 / dMinDiffAng);
|
||
AcGeVector3d vtNor = normal();
|
||
|
||
inf.ptPos = ptCen + vtEnd * dR;
|
||
inf.vtDir = vtBran;
|
||
inf.dSize1 = dBranWidth;
|
||
arInfs.append(inf);
|
||
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void ImpHvacTee::DrawInclineBranchCircle3d(AcGiDraw &mode) const
|
||
{
|
||
//开始端斜接直边长度 50
|
||
double dLDisFrSta = 0;//毫米
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtEnd, vtBran, vtStart;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
|
||
double dStartWidth = 0, dEndWidth = 0, dBranWidth = 0;
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
|
||
vtEnd.normalize(); vtBran.normalize();
|
||
AcGeVector3d vtBran45 = vtEnd + vtBran;
|
||
vtBran45.normalize();
|
||
|
||
//示意弧弦高
|
||
double dArch = 50;
|
||
|
||
AcGeVector3d vtNorm = vtEnd.crossProduct(vtBran);
|
||
|
||
AcGePoint3d ptB1 = ptStart;
|
||
ptB1 += vtBran * dStartWidth * 0.5;
|
||
ptB1 += vtEnd * dLDisFrSta;
|
||
|
||
AcGeVector3d vtL = vtEnd.orthoProject(vtBran45);
|
||
vtL.normalize();
|
||
|
||
AcGePoint3d ptB2Cen = ptStart;
|
||
|
||
AcGeLine3d lnC(ptB2Cen, vtBran45);
|
||
AcGeLine3d lnM(ptStart, ptEnd);
|
||
|
||
AcGePoint3d ptInt;
|
||
//if (lnM.intersectWith(lnC, ptInt))
|
||
{
|
||
ptInt = ptStart;
|
||
double dM = ptStart.distanceTo(ptEnd);
|
||
AcGePoint3d ptBrnFr = lnM.closestPointTo(ptBran);
|
||
double dB = ptBrnFr.distanceTo(ptBran);
|
||
|
||
double dL = dB * sqrt(2.0);
|
||
AcGePoint3d ptBr2 = ptInt + dL * vtBran45;
|
||
|
||
double dInR = lnC.distanceTo(ptB1);
|
||
|
||
//down arc
|
||
AcGePoint3d pt2 = ptBr2 + vtL * dBranWidth * 0.5;
|
||
AcGePoint3d pt1 = ptB1 + vtL * dInR * 2.0;
|
||
|
||
AcGeLine3d rayL2(pt2, pt1);
|
||
|
||
AcGePoint3d ptSD = ptStart + vtBran * dStartWidth * 0.5;
|
||
AcGePoint3d ptED = ptEnd + vtBran * dEndWidth * 0.5;
|
||
AcGeLine3d lnD(ptSD, ptED);
|
||
|
||
AcGePoint3d pt3;
|
||
if (lnD.intersectWith(rayL2, pt3))
|
||
{
|
||
AcGePoint3d ptM;
|
||
Midpoint(ptB1, pt3, ptM);
|
||
ptM -= vtBran * dArch;
|
||
}
|
||
|
||
//下面弧段 45度
|
||
double dRadRatio = 1.0;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRadRatio);
|
||
|
||
double dR = dRadRatio * dBranWidth;
|
||
AcGePoint3d ptCen = ptBr2 - dR * vtL;
|
||
|
||
//内弧
|
||
AcGeVector3d vtM = vtL + vtEnd;
|
||
vtM.normalize();
|
||
|
||
double dMinDiffAng = PI / 12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG, dMinDiffAng);
|
||
if (dMinDiffAng < 1e-6)
|
||
{
|
||
dMinDiffAng = PI / 12;
|
||
}
|
||
|
||
//按照90°弯头分成nSect1个圆截面,每个圆截面分成nSect个点
|
||
int nSect = int(PI * 2 / dMinDiffAng);
|
||
AcGeVector3d vtNor = normal();
|
||
|
||
// 直管
|
||
AcGePoint3dArray arptSides;
|
||
AcGePoint3d pt = ptStart + vtNor * dStartWidth * 0.5;
|
||
for (int i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtStart, ptStart));
|
||
}
|
||
pt = ptEnd + vtNor * dEndWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtStart, ptEnd));
|
||
}
|
||
DrawMesh(mode, 2, nSect + 1, arptSides.asArrayPtr());
|
||
|
||
//支管
|
||
AcGeLine3d lnS(ptB1, ptBr2 - vtL * 0.5 * dBranWidth);
|
||
double dSInR = lnS.distanceTo(ptStart);
|
||
|
||
arptSides.setLogicalLength(0);
|
||
pt = ptInt + vtNor * dSInR;
|
||
AcGeVector3d vtAxis = ptBr2 - ptInt;
|
||
for (int i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtAxis, ptInt));
|
||
}
|
||
pt = ptBr2 + vtNor * dBranWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtAxis, ptBr2));
|
||
}
|
||
DrawMesh(mode, 2, nSect + 1, arptSides.asArrayPtr());
|
||
|
||
//弯头段
|
||
AcDbArc *pArc = KTCADUtilityEx::FormatArc(ptCen + vtL * dR, ptCen + vtM * dR, ptCen + vtEnd * dR);
|
||
if (pArc != NULL)
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
GetSamplePoints(pArc, 4, arPts);
|
||
|
||
AcGePoint3d pt0, pt1;
|
||
AcGeVector3d vtSeg;
|
||
for (int ii = 0; ii < arPts.length() - 1; ii++)
|
||
{
|
||
pt0 = arPts.at(ii);
|
||
pt1 = arPts.at(ii + 1);
|
||
|
||
arptSides.setLogicalLength(0);
|
||
pt = pt0 + vtNor * dBranWidth * 0.5;
|
||
pArc->getFirstDeriv(pt0, vtAxis);
|
||
for (int i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtAxis, pt0));
|
||
}
|
||
pt = pt1 + vtNor * dBranWidth * 0.5;
|
||
pArc->getFirstDeriv(pt1, vtAxis);
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtAxis, pt1));
|
||
}
|
||
DrawMesh(mode, 2, nSect + 1, arptSides.asArrayPtr());
|
||
}
|
||
delete pArc;
|
||
}
|
||
}
|
||
}
|
||
|
||
BOOL ImpHvacTee::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;
|
||
|
||
//第二行,第一个
|
||
nV2 = (i + 1) * columns + j;
|
||
|
||
nV3 = nV2 + 1;
|
||
|
||
//三角:nV0-nV1-nV2
|
||
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);
|
||
|
||
//三角:nV2-nV1-nV3
|
||
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);
|
||
|
||
//有时候失败?
|
||
/*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 ImpHvacTee::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);
|
||
|
||
//有时候失败?
|
||
/*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 ImpHvacTee::Move3DBuffer(AcDbVoidPtrArray& ar3DBuffer) const
|
||
{
|
||
if (!m_ar3DDrableBufPtrs_.isEmpty())
|
||
{
|
||
ar3DBuffer.append(m_ar3DDrableBufPtrs_);
|
||
m_ar3DDrableBufPtrs_.removeAll();
|
||
}
|
||
}
|
||
|
||
bool ImpHvacTee::Has3DBuffer() const
|
||
{
|
||
return !m_ar3DDrableBufPtrs_.isEmpty();
|
||
}
|
||
|
||
/*
|
||
常规三通三维画法,各点示意图
|
||
//
|
||
// 0━━━━━━━━━8━━━━━━━7
|
||
// ┃ ┃
|
||
// ┃ ┃
|
||
// ━━━━━━━━━━━━━━━━━
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 1━━━━━2 ┃ 5━━━━━6
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 3━━━━━4
|
||
//
|
||
*/
|
||
|
||
// 不同厚度、不同对齐方式或不同高度的三通绘制(暂定) add by hh 2011-01-11
|
||
BOOL ImpHvacTee::DrawSpecial3d(AcGiDraw &mode) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGePoint3dArray arptUp, arptDown;
|
||
if (!GetInterfaceKeyPt(arptUp, arptDown))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
// 上面
|
||
AcGePoint3d ptArUpPoly[4] = {arptUp[0], arptUp[1], arptUp[5], arptUp[4]};
|
||
// 下面
|
||
AcGePoint3d ptArDownPoly[4] = {arptDown[0], arptDown[1], arptDown[5], arptDown[4]};
|
||
// 背面
|
||
AcGePoint3d ptArBack[4] = {arptUp[0], arptDown[0], arptUp[5], arptDown[5]};
|
||
// 左侧面
|
||
AcGePoint3d ptArLeft[4] = {arptUp[1], arptDown[1], arptUp[2], arptDown[2]};
|
||
// 右侧面
|
||
AcGePoint3d ptArRight[4] = {arptUp[3], arptDown[3], arptUp[4], arptDown[4]};
|
||
// 支管上
|
||
AcGePoint3d ptArColUp[4] = {arptUp[1], arptUp[2], arptUp[4], arptUp[3]};
|
||
// 支管下
|
||
AcGePoint3d ptArColDown[4] = {arptDown[1], arptDown[2], arptDown[4], arptDown[3]};
|
||
|
||
DrawMesh(mode,2, 2, ptArUpPoly);
|
||
DrawMesh(mode,2, 2, ptArDownPoly);
|
||
DrawMesh(mode,2, 2, ptArBack);
|
||
DrawMesh(mode,2, 2, ptArLeft);
|
||
DrawMesh(mode,2, 2, ptArRight);
|
||
DrawMesh(mode,2, 2, ptArColUp);
|
||
DrawMesh(mode,2, 2, ptArColDown);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void ImpHvacTee::DrawOrthoRect3d(AcGiDraw &mode) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGePoint3dArray arptUp, arptDown;
|
||
if (!GetTwoSideKeyPt(arptUp, arptDown, TRUE))
|
||
{
|
||
return;
|
||
}
|
||
if (9 != arptUp.length() || 9 != arptDown.length())
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 上面
|
||
AcGePoint3d ptArrUpPoly[9] = {arptUp[0], arptUp[1], arptUp[2], arptUp[3],
|
||
arptUp[4], arptUp[5], arptUp[6], arptUp[7], arptUp[8]};
|
||
// 下面
|
||
AcGePoint3d ptArrDownPoly[9] = {arptDown[0], arptDown[1], arptDown[2], arptDown[3],
|
||
arptDown[4], arptDown[5], arptDown[6], arptDown[7], arptDown[8]};
|
||
// 背面
|
||
AcGePoint3d ptArrBack[6] = {arptUp[0], arptDown[0], arptUp[8], arptDown[8], arptUp[7], arptDown[7]};
|
||
// 左侧面
|
||
AcGePoint3d ptArrLeft[6] = {arptUp[1], arptDown[1], arptUp[2], arptDown[2], arptUp[3], arptDown[3]};
|
||
// 右侧面
|
||
AcGePoint3d ptArrRight[6] = {arptUp[4], arptDown[4], arptUp[5], arptDown[5], arptUp[6], arptDown[6]};
|
||
|
||
#if ARX > 20
|
||
int lFaceList[10] = { 9,0,1,2,3,4,5,6,7,8 };
|
||
#else
|
||
long lFaceList[10] = { 9,0,1,2,3,4,5,6,7,8 };
|
||
#endif
|
||
DrawShell(mode,9, ptArrUpPoly, 10, lFaceList);
|
||
DrawShell(mode,9, ptArrDownPoly, 10, lFaceList);
|
||
DrawMesh(mode,3, 2, ptArrBack);
|
||
DrawMesh(mode,3, 2, ptArrLeft);
|
||
DrawMesh(mode,3, 2, ptArrRight);
|
||
}
|
||
|
||
void ImpHvacTee::DrawInsertRect3d( AcGiDraw &mode ) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGePoint3dArray arptUp, arptDown;
|
||
if (!GetTwoSideKeyPt(arptUp, arptDown, TRUE))
|
||
{
|
||
return;
|
||
}
|
||
if (10 != arptUp.length() || 10 != arptDown.length())
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 上面
|
||
AcGePoint3d ptArrUp[10] = {arptUp[0], arptUp[1], arptUp[7], arptUp[8], arptUp[9],
|
||
arptUp[2], arptUp[3], arptUp[4], arptUp[5], arptUp[6]};
|
||
// 下面
|
||
AcGePoint3d ptArrDown[10] = {arptDown[0], arptDown[1], arptDown[7], arptDown[8], arptDown[9],
|
||
arptDown[2], arptDown[3], arptDown[4], arptDown[5], arptDown[6]};
|
||
// 洞面
|
||
AcGePoint3d ptArrHoleFace[8] = {arptUp[1], arptUp[7], arptDown[7], arptDown[1], arptUp[2], arptUp[6],
|
||
arptDown[6], arptDown[2]};
|
||
// 背面
|
||
AcGePoint3d ptArrBackSide[6] = {arptUp[0], arptDown[0], arptUp[9], arptDown[9], arptUp[8], arptDown[8]};
|
||
// 左侧面
|
||
AcGePoint3d ptArrBranchLeft[6] = {arptUp[2], arptDown[2], arptUp[3], arptDown[3], arptUp[4], arptDown[4]};
|
||
// 右侧面
|
||
AcGePoint3d ptArrBranchRight[4] = {arptUp[5], arptDown[5], arptUp[6], arptDown[6]};
|
||
|
||
#if ARX > 20
|
||
int lFaceList[12] = { 5, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9 };
|
||
int lHoleFace[10] = { 4, 0, 1, 2, 3, -4, 4, 5, 6, 7 };
|
||
#else
|
||
long lFaceList[12] = { 5, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9 };
|
||
long lHoleFace[10] = { 4, 0, 1, 2, 3, -4, 4, 5, 6, 7 };
|
||
#endif
|
||
DrawShell(mode,10, ptArrUp, 12, lFaceList);
|
||
DrawShell(mode,10, ptArrDown, 12, lFaceList);
|
||
DrawShell(mode,8, ptArrHoleFace, 10, lHoleFace);
|
||
DrawMesh(mode,3, 2, ptArrBackSide);
|
||
DrawMesh(mode,3, 2, ptArrBranchLeft);
|
||
DrawMesh(mode,2, 2, ptArrBranchRight);
|
||
}
|
||
|
||
void ImpHvacTee::DrawInclineRect3d( AcGiDraw &mode ) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGePoint3dArray arptUp, arptDown;
|
||
if (!GetTwoSideKeyPt(arptUp, arptDown, TRUE))
|
||
{
|
||
return;
|
||
}
|
||
if (10 != arptUp.length() || 10 != arptDown.length())
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 上面
|
||
AcGePoint3d ptArrUpPoly[10] = {arptUp[0], arptUp[1], arptUp[2], arptUp[3], arptUp[4],
|
||
arptUp[5], arptUp[6], arptUp[7], arptUp[8], arptUp[9]};
|
||
// 下面
|
||
AcGePoint3d ptArrDownPoly[10] = {arptDown[0], arptDown[1], arptDown[2], arptDown[3], arptDown[4],
|
||
arptDown[5], arptDown[6], arptDown[7], arptDown[8], arptDown[9]};
|
||
// 背面
|
||
AcGePoint3d ptArrBack[6] = {arptUp[0], arptDown[0], arptUp[9], arptDown[9], arptUp[8], arptDown[8]};
|
||
// 左侧面
|
||
AcGePoint3d ptArrLeft[8] = {arptUp[1], arptDown[1], arptUp[2], arptDown[2], arptUp[3], arptDown[3],
|
||
arptUp[4], arptDown[4]};
|
||
// 右侧面
|
||
AcGePoint3d ptArrRight[6] = {arptUp[5], arptDown[5], arptUp[6], arptDown[6], arptUp[7], arptDown[7]};
|
||
|
||
DrawMesh(mode,3, 2, ptArrBack);
|
||
#if ARX > 20
|
||
int lFaceList[11] = { 10,0,1,2,3,4,5,6,7,8,9 };
|
||
#else
|
||
long lFaceList[11] = { 10,0,1,2,3,4,5,6,7,8,9 };
|
||
#endif
|
||
DrawShell(mode,10, ptArrUpPoly, 11, lFaceList);
|
||
DrawShell(mode,10, ptArrDownPoly, 11, lFaceList);
|
||
DrawMesh(mode,4, 2, ptArrLeft);
|
||
DrawMesh(mode,3, 2, ptArrRight);
|
||
}
|
||
|
||
void ImpHvacTee::DrawYShapeRect3d( AcGiDraw &mode ) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
// 获取上下表面关键点数据
|
||
AcGePoint3dArray arptUp, arptDown;
|
||
if (!GetTwoSideKeyPt(arptUp, arptDown, TRUE))
|
||
{
|
||
return;
|
||
}
|
||
if (17 != arptUp.length() || 17 != arptDown.length())
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 在上表面上添加弧线部分的数据
|
||
double dAng = PI / 12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG, dAng);
|
||
if (dAng < 1e-6)
|
||
{
|
||
dAng = PI / 12;
|
||
}
|
||
AcGeVector3d vtNormal(normal());
|
||
int iLen15 = -1;
|
||
iLen15 = FixPtsData(arptUp, 15, dAng, vtNormal);
|
||
if (-1 == iLen15)
|
||
{
|
||
return;
|
||
}
|
||
int iLen13 = -1;
|
||
iLen13 = FixPtsData(arptUp, 13, dAng, vtNormal);
|
||
if (-1 == iLen13)
|
||
{
|
||
return;
|
||
}
|
||
int iLen8 = -1;
|
||
iLen8 = FixPtsData(arptUp, 8, dAng, vtNormal);
|
||
if (-1 == iLen8)
|
||
{
|
||
return;
|
||
}
|
||
int iLen3 = -1;
|
||
iLen3 = FixPtsData(arptUp, 3, dAng, vtNormal);
|
||
if (-1 == iLen3)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 在下表面上添加弧线部分的数据
|
||
if (iLen15 != FixPtsData(arptDown, 15, dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
if (iLen13 != FixPtsData(arptDown, 13, dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
if (iLen8 != FixPtsData(arptDown, 8 ,dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
if (iLen3 != FixPtsData(arptDown, 3, dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 背面
|
||
AcGePoint3dArray arptBack;
|
||
arptBack.append(arptUp[0]);
|
||
arptBack.append(arptDown[0]);
|
||
int iEnd = 10 - 2 + iLen3 + iLen8;
|
||
for (int i = arptUp.length() - 1; i > iEnd; i--)
|
||
{
|
||
arptBack.append(arptUp[i]);
|
||
arptBack.append(arptDown[i]);
|
||
}
|
||
|
||
// 左侧面
|
||
AcGePoint3dArray arptLeft;
|
||
int iIndex = 1;
|
||
for (i = 0; i < iLen3 + 4; i++)
|
||
{
|
||
arptLeft.append(arptUp[iIndex]);
|
||
arptLeft.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
|
||
// 右侧面
|
||
AcGePoint3dArray arptRight;
|
||
for (i = 0; i < iLen8 + 4; i++)
|
||
{
|
||
arptRight.append(arptUp[iIndex]);
|
||
arptRight.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
|
||
#if ARX > 20
|
||
CArray<int, int> arlgIndex;
|
||
#else
|
||
CArray<long, long> arlgIndex;
|
||
#endif
|
||
|
||
int iTot = arptUp.length();
|
||
arlgIndex.Add(iTot);
|
||
for (i = 0; i < iTot; i++)
|
||
{
|
||
arlgIndex.Add(i);
|
||
}
|
||
DrawShell(mode,iTot, arptUp.asArrayPtr(), (iTot + 1), &(arlgIndex[0]));
|
||
DrawShell(mode,iTot, arptDown.asArrayPtr(), (iTot + 1), &(arlgIndex[0]));
|
||
DrawMesh(mode,arptBack.length() / 2, 2, arptBack.asArrayPtr());
|
||
DrawMesh(mode,arptLeft.length() / 2, 2, arptLeft.asArrayPtr());
|
||
DrawMesh(mode,arptRight.length() / 2, 2, arptRight.asArrayPtr());
|
||
}
|
||
|
||
void ImpHvacTee::DrawVShapeRect3d( AcGiDraw &mode ) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGePoint3dArray arptUp, arptDown;
|
||
if (!GetTwoSideKeyPt(arptUp, arptDown, TRUE))
|
||
{
|
||
return;
|
||
}
|
||
if (13 != arptUp.length() || 13 != arptDown.length())
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 上面
|
||
AcGePoint3d ptArrUpPoly[13] = {arptUp[0], arptUp[1], arptUp[2], arptUp[3], arptUp[4], arptUp[5],
|
||
arptUp[6], arptUp[7], arptUp[8], arptUp[9], arptUp[10], arptUp[11],
|
||
arptUp[12]};
|
||
// 下面
|
||
AcGePoint3d ptArrDownPoly[13] = {arptDown[0], arptDown[1], arptDown[2], arptDown[3], arptDown[4],
|
||
arptDown[5], arptDown[6], arptDown[7], arptDown[8], arptDown[9],
|
||
arptDown[10], arptDown[11], arptDown[12]};
|
||
// 背面
|
||
AcGePoint3d ptArrBack[10] = {arptUp[12], arptDown[12], arptUp[11], arptDown[11], arptUp[10],
|
||
arptDown[10], arptUp[9], arptDown[9], arptUp[8], arptDown[8]};
|
||
// 左侧面
|
||
AcGePoint3d ptArrLeft[8] = {arptUp[0], arptDown[0], arptUp[1], arptDown[1], arptUp[2], arptDown[2],
|
||
arptUp[3], arptDown[3]};
|
||
// 右侧面
|
||
AcGePoint3d ptArrRight[8] = {arptUp[4], arptDown[4], arptUp[5], arptDown[5], arptUp[6], arptDown[6],
|
||
arptUp[7], arptDown[7]};
|
||
|
||
#if ARX > 20
|
||
int lFaceList[14] = { 13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
|
||
#else
|
||
long lFaceList[14] = { 13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
|
||
#endif
|
||
DrawShell(mode,13, ptArrUpPoly, 14, lFaceList);
|
||
DrawShell(mode,13, ptArrDownPoly, 14, lFaceList);
|
||
DrawMesh(mode,5, 2, ptArrBack);
|
||
DrawMesh(mode,4, 2, ptArrLeft);
|
||
DrawMesh(mode,4, 2, ptArrRight);
|
||
}
|
||
|
||
void ImpHvacTee::DrawTShapeRect3d( AcGiDraw &mode ) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
// 获取上下表面关键点数据
|
||
AcGePoint3dArray arptUp, arptDown;
|
||
if (!GetTwoSideKeyPt(arptUp, arptDown, TRUE))
|
||
{
|
||
return;
|
||
}
|
||
if (14 != arptUp.length() || 14 != arptDown.length())
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 在上表面上添加弧线部分的数据
|
||
double dAng = PI / 12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG, dAng);
|
||
if (dAng < 1e-6)
|
||
{
|
||
dAng = PI / 12;
|
||
}
|
||
AcGePoint3dArray arptInsert;
|
||
AcGeVector3d vtNormal(normal());
|
||
int iLen8 = -1;
|
||
iLen8 = FixPtsData(arptUp, 8, dAng, vtNormal);
|
||
if (-1 == iLen8)
|
||
{
|
||
return;
|
||
}
|
||
int iLen3 = -1;
|
||
iLen3 = FixPtsData(arptUp, 3, dAng, vtNormal);
|
||
if (-1 == iLen3)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 在下表面上添加弧线部分的数据
|
||
if (iLen8 != FixPtsData(arptDown, 8 ,dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
if (iLen3 != FixPtsData(arptDown, 3, dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
|
||
int iFix = iLen3 + iLen8 - 2;
|
||
|
||
// 背面
|
||
AcGePoint3d ptArrBack[4] = {arptUp[0], arptDown[0], arptUp[11 + iFix], arptDown[11 + iFix]};
|
||
// 左侧面
|
||
AcGePoint3dArray arptLeft;
|
||
int iIndex = 1;
|
||
int iEnd = iLen3 + 4;
|
||
for (int i = 0; i < iEnd; i++)
|
||
{
|
||
arptLeft.append(arptUp[iIndex]);
|
||
arptLeft.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
// 右侧面
|
||
AcGePoint3dArray arptRight;
|
||
iEnd = iLen8 + 4;
|
||
for (i = 0; i < iEnd; i++)
|
||
{
|
||
arptRight.append(arptUp[iIndex]);
|
||
arptRight.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
|
||
#if ARX > 20
|
||
CArray<int, int> arlgIndex;
|
||
#else
|
||
CArray<long, long> arlgIndex;
|
||
#endif
|
||
int iTot = arptUp.length();
|
||
arlgIndex.Add(iTot);
|
||
for (i = 0; i < iTot; i++)
|
||
{
|
||
arlgIndex.Add(i);
|
||
}
|
||
DrawShell(mode,iTot, arptUp.asArrayPtr(), (iTot + 1), &(arlgIndex[0]));
|
||
DrawShell(mode,iTot, arptDown.asArrayPtr(), (iTot + 1), &(arlgIndex[0]));
|
||
DrawMesh(mode,2, 2, ptArrBack);
|
||
DrawMesh(mode,arptLeft.length() / 2, 2, arptLeft.asArrayPtr());
|
||
DrawMesh(mode,arptRight.length() / 2, 2, arptRight.asArrayPtr());
|
||
}
|
||
|
||
void ImpHvacTee::DrawArcuateRect3d( AcGiDraw &mode ) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
// 获取上下表面关键点数据
|
||
AcGePoint3dArray arptUp, arptDown;
|
||
if (!GetTwoSideKeyPt(arptUp, arptDown, TRUE))
|
||
{
|
||
return;
|
||
}
|
||
if (13 != arptUp.length() || 13 != arptDown.length())
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 在上表面上添加弧线部分的数据
|
||
double dAng = PI / 12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG, dAng);
|
||
if (dAng < 1e-6)
|
||
{
|
||
dAng = PI / 12;
|
||
}
|
||
AcGePoint3dArray arptInsert;
|
||
AcGeVector3d vtNormal(normal());
|
||
int iLen8 = -1;
|
||
iLen8 = FixPtsData(arptUp, 8, dAng, vtNormal);
|
||
if (-1 == iLen8)
|
||
{
|
||
return;
|
||
}
|
||
int iLen3 = -1;
|
||
iLen3 = FixPtsData(arptUp, 3, dAng, vtNormal);
|
||
if (-1 == iLen3)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 在下表面上添加弧线部分的数据
|
||
if (iLen8 != FixPtsData(arptDown, 8 ,dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
if (iLen3 != FixPtsData(arptDown, 3, dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
|
||
int iFix = iLen3 + iLen8 -2;
|
||
|
||
// 背面
|
||
AcGePoint3d ptArrBack[4] = {arptUp[0], arptDown[0], arptUp[11 + iFix], arptDown[11 + iFix]};
|
||
|
||
// 左侧面
|
||
AcGePoint3dArray arptLeft;
|
||
int iIndex = 1;
|
||
int iEnd = iLen3 + 4;
|
||
for (int i = 0; i < iEnd; i++)
|
||
{
|
||
arptLeft.append(arptUp[iIndex]);
|
||
arptLeft.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
// 右侧面
|
||
AcGePoint3dArray arptRight;
|
||
iEnd = iLen8 + 4;
|
||
for (i = 0; i < iEnd; i++)
|
||
{
|
||
arptRight.append(arptUp[iIndex]);
|
||
arptRight.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
|
||
#if ARX > 20
|
||
CArray<int, int> arlgIndex;
|
||
#else
|
||
CArray<long, long> arlgIndex;
|
||
#endif
|
||
|
||
int iTot = arptUp.length();
|
||
arlgIndex.Add(iTot);
|
||
for (i = 0; i < iTot; i++)
|
||
{
|
||
arlgIndex.Add(i);
|
||
}
|
||
DrawShell(mode,iTot, arptUp.asArrayPtr(), (iTot + 1), &(arlgIndex[0]));
|
||
DrawShell(mode,iTot, arptDown.asArrayPtr(), (iTot + 1), &(arlgIndex[0]));
|
||
DrawMesh(mode,2, 2, ptArrBack);
|
||
DrawMesh(mode,arptLeft.length() / 2, 2, arptLeft.asArrayPtr());
|
||
DrawMesh(mode,arptRight.length() / 2, 2, arptRight.asArrayPtr());
|
||
}
|
||
|
||
void ImpHvacTee::DrawArcuateIntubRect3d( AcGiDraw &mode ) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
// 获取上下表面关键点数据
|
||
AcGePoint3dArray arptUp, arptDown;
|
||
if (!GetTwoSideKeyPt(arptUp, arptDown, TRUE))
|
||
{
|
||
return;
|
||
}
|
||
if (13 != arptUp.length() || 13 != arptDown.length())
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 在上表面上添加弧线部分的数据
|
||
double dAng = PI / 12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG, dAng);
|
||
if (dAng < 1e-6)
|
||
{
|
||
dAng = PI / 12;
|
||
}
|
||
AcGePoint3dArray arptInsert;
|
||
AcGeVector3d vtNormal(normal());
|
||
int iLen8 = -1;
|
||
iLen8 = FixPtsData(arptUp, 8, dAng, vtNormal);
|
||
if (-1 == iLen8)
|
||
{
|
||
return;
|
||
}
|
||
int iLen3 = -1;
|
||
iLen3 = FixPtsData(arptUp, 3, dAng, vtNormal);
|
||
if (-1 == iLen3)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 在下表面上添加弧线部分的数据
|
||
if (iLen8 != FixPtsData(arptDown, 8 ,dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
if (iLen3 != FixPtsData(arptDown, 3, dAng, vtNormal))
|
||
{
|
||
return;
|
||
}
|
||
|
||
int iFix = iLen3 + iLen8 -2;
|
||
|
||
// 上面
|
||
AcGePoint3dArray arptUpFace;
|
||
arptUpFace.append(arptUp[0]);
|
||
arptUpFace.append(arptUp[1]);
|
||
arptUpFace.append(arptUp[10 + iFix]);
|
||
arptUpFace.append(arptUp[11 + iFix]);
|
||
arptUpFace.append(arptUp[2]);
|
||
int iIndex = 3;
|
||
for (int i = 0; i < iLen3; i++)
|
||
{
|
||
arptUpFace.append(arptUp[iIndex]);
|
||
iIndex++;
|
||
}
|
||
arptUpFace.append(arptUp[4 + iLen3 - 1]);
|
||
arptUpFace.append(arptUp[5 + iLen3 - 1]);
|
||
arptUpFace.append(arptUp[6 + iLen3 - 1]);
|
||
arptUpFace.append(arptUp[7 + iLen3 - 1]);
|
||
iIndex = 7 + iLen3;
|
||
for (i = 0; i < iLen8; i++)
|
||
{
|
||
arptUpFace.append(arptUp[iIndex]);
|
||
iIndex++;
|
||
}
|
||
arptUpFace.append(arptUp[9 + iFix]);
|
||
|
||
// 下面
|
||
AcGePoint3dArray arptDownFace;
|
||
arptDownFace.append(arptDown[0]);
|
||
arptDownFace.append(arptDown[1]);
|
||
arptDownFace.append(arptDown[10 + iFix]);
|
||
arptDownFace.append(arptDown[11 + iFix]);
|
||
arptDownFace.append(arptDown[2]);
|
||
iIndex = 3;
|
||
for (i = 0; i < iLen3; i++)
|
||
{
|
||
arptDownFace.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
arptDownFace.append(arptDown[4 + iLen3 - 1]);
|
||
arptDownFace.append(arptDown[5 + iLen3 - 1]);
|
||
arptDownFace.append(arptDown[6 + iLen3 - 1]);
|
||
arptDownFace.append(arptDown[7 + iLen3 - 1]);
|
||
iIndex = 7 + iLen3;
|
||
for (i = 0; i < iLen8; i++)
|
||
{
|
||
arptDownFace.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
arptDownFace.append(arptDown[9 + iFix]);
|
||
|
||
|
||
// 洞面
|
||
AcGePoint3d ptArrHoleFace[8] = {arptUp[1], arptUp[10 + iFix], arptDown[10 + iFix], arptDown[1],
|
||
arptUp[2], arptUp[9 + iFix], arptDown[9 + iFix], arptDown[2]};
|
||
|
||
// 背面
|
||
AcGePoint3d ptArrBackSide[4] = {arptUp[0], arptDown[0], arptUp[11 + iFix], arptDown[11 + iFix]};
|
||
|
||
// 左侧面
|
||
AcGePoint3dArray arptBranchLeft;
|
||
arptBranchLeft.append(arptUp[2]);
|
||
arptBranchLeft.append(arptDown[2]);
|
||
iIndex = 3;
|
||
for (i = 0; i < iLen3; i++)
|
||
{
|
||
arptBranchLeft.append(arptUp[iIndex]);
|
||
arptBranchLeft.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
arptBranchLeft.append(arptUp[4 + iLen3 - 1]);
|
||
arptBranchLeft.append(arptDown[4 + iLen3 - 1]);
|
||
arptBranchLeft.append(arptUp[5 + iLen3 - 1]);
|
||
arptBranchLeft.append(arptDown[5 + iLen3 - 1]);
|
||
|
||
// 右侧面
|
||
AcGePoint3dArray arptBranchRight;
|
||
arptBranchRight.append(arptUp[6 + iLen3 - 1]);
|
||
arptBranchRight.append(arptDown[6 + iLen3 - 1]);
|
||
arptBranchRight.append(arptUp[7 + iLen3 - 1]);
|
||
arptBranchRight.append(arptDown[7 + iLen3 - 1]);
|
||
iIndex = 7 + iLen3;
|
||
for (i = 0; i < iLen8; i++)
|
||
{
|
||
arptBranchRight.append(arptUp[iIndex]);
|
||
arptBranchRight.append(arptDown[iIndex]);
|
||
iIndex++;
|
||
}
|
||
arptBranchRight.append(arptUp[9 + iFix]);
|
||
arptBranchRight.append(arptDown[9 + iFix]);
|
||
|
||
// 添加上下表面
|
||
#if ARX > 20
|
||
int* pFaceList = new int[12 + iLen3 + iLen8];
|
||
int* pHead = pFaceList;
|
||
#else
|
||
long* pFaceList = new long[12 + iLen3 + iLen8];
|
||
long* pHead = pFaceList;
|
||
#endif
|
||
|
||
*pFaceList = 4;
|
||
pFaceList++;
|
||
*pFaceList = 0;
|
||
pFaceList++;
|
||
*pFaceList = 1;
|
||
pFaceList++;
|
||
*pFaceList = 2;
|
||
pFaceList++;
|
||
*pFaceList = 3;
|
||
pFaceList++;
|
||
*pFaceList = iLen3 + iLen8 + 6;
|
||
iIndex = 4;
|
||
for (i = 0; i < iLen3 + iLen8 + 6; i++)
|
||
{
|
||
pFaceList++;
|
||
*pFaceList = iIndex;
|
||
iIndex++;
|
||
}
|
||
DrawShell(mode,10 + iLen3 + iLen8, arptUpFace.asArrayPtr(), 12 + iLen3 + iLen8, pHead);
|
||
DrawShell(mode,10 + iLen3 + iLen8, arptDownFace.asArrayPtr(), 12 + iLen3 + iLen8, pHead);
|
||
delete []pHead;
|
||
|
||
// 添加洞面
|
||
#if ARX > 20
|
||
int lHoleFace[10] = { 4, 0, 1, 2, 3, -4, 4, 5, 6, 7 };
|
||
#else
|
||
long lHoleFace[10] = { 4, 0, 1, 2, 3, -4, 4, 5, 6, 7 };
|
||
#endif
|
||
|
||
DrawShell(mode,8, ptArrHoleFace, 10, lHoleFace);
|
||
DrawMesh(mode,2, 2, ptArrBackSide);
|
||
DrawMesh(mode,3 + iLen3, 2, arptBranchLeft.asArrayPtr());
|
||
DrawMesh(mode,3 + iLen8, 2, arptBranchRight.asArrayPtr());
|
||
}
|
||
|
||
void ImpHvacTee::DrawOrthoCircle3d( AcGiDraw &mode ) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
}
|
||
|
||
void ImpHvacTee::DrawInsertCircle3d( AcGiDraw &mode ) const
|
||
{
|
||
//圆型普通三通
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInsertCirPts(arPts))
|
||
return;
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
AcGeVector3d vtStart, vtEnd, vtBran;
|
||
double dStartWidth = 0.0;
|
||
double dEndWidth = 0.0;
|
||
double dBranWidth = 0.0;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
|
||
double dMinDiffAng = PI/12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG,dMinDiffAng);
|
||
if (dMinDiffAng < 1e-6)
|
||
{
|
||
dMinDiffAng = PI / 12;
|
||
}
|
||
|
||
//按照90°弯头分成nSect1个圆截面,每个圆截面分成nSect个点
|
||
int nSect = int(PI * 2 / dMinDiffAng);
|
||
AcGeVector3d vtNor = normal();
|
||
|
||
// 直管
|
||
AcGePoint3dArray arptSides;
|
||
AcGePoint3d pt = ptStart + vtNor * dStartWidth * 0.5;
|
||
for (int i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtStart, ptStart));
|
||
}
|
||
pt = ptEnd + vtNor * dEndWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtStart, ptEnd));
|
||
}
|
||
DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr());
|
||
|
||
// 支管
|
||
arptSides.setLogicalLength(0);
|
||
pt = ptBran + vtNor * dBranWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtBran, ptBran));
|
||
}
|
||
|
||
AcGePoint3d ptBr2 = AcGePoint3d::kOrigin;
|
||
double dDis1 = arPts[6].distanceTo(arPts[9]);
|
||
double dDis2 = arPts[8].distanceTo(arPts[10]);
|
||
dDis1 = dDis1 > dDis2 ? dDis1 : dDis2;
|
||
|
||
ESection eSectType = eRect;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
|
||
if (eSectType == eCircle)
|
||
ptBr2 = arPts[7] - vtBran * (dDis1 + 0.5 * dBranWidth);
|
||
else
|
||
ptBr2 = arPts[7] - vtBran * dDis1;
|
||
|
||
pt = ptBr2 + vtNor * dBranWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtBran, ptBr2));
|
||
}
|
||
DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr());
|
||
}
|
||
|
||
void ImpHvacTee::DrawInclineCircle3d( AcGiDraw &mode ) const
|
||
{
|
||
//圆型 斜插三通
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInclineCirPts(arPts))
|
||
return;
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
AcGeVector3d vtStart, vtEnd, vtBran;
|
||
double dStartWidth = 0.0;
|
||
double dEndWidth = 0.0;
|
||
double dBranWidth = 0.0;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
|
||
double dMinDiffAng = PI/12;
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG,dMinDiffAng);
|
||
if (dMinDiffAng < 1e-6)
|
||
{
|
||
dMinDiffAng = PI / 12;
|
||
}
|
||
|
||
//按照90°弯头分成nSect1个圆截面,每个圆截面分成nSect个点
|
||
int nSect = int(PI * 2 / dMinDiffAng);
|
||
AcGeVector3d vtNor = normal();
|
||
|
||
AcGeVector3d vtMain = arPts[10] - arPts[13];
|
||
vtMain.normalize();
|
||
// 主管
|
||
AcGePoint3dArray arptSides;
|
||
AcGePoint3d pt = arPts[10] + vtNor * dStartWidth * 0.5;
|
||
for (int i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtMain, arPts[10]));
|
||
}
|
||
pt = arPts[13] + vtNor * dEndWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtMain, arPts[13]));
|
||
}
|
||
DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr());
|
||
|
||
// 直边段
|
||
/*arptSides.setLogicalLength(0);
|
||
pt = arPts[1] + vtNor * dStartWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtStart, arPts[1]));
|
||
}
|
||
pt = arPts[10] + vtNor * dStartWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtStart, arPts[10]));
|
||
}
|
||
DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr());
|
||
|
||
arptSides.setLogicalLength(0);
|
||
pt = arPts[4] + vtNor * dEndWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtEnd, arPts[4]));
|
||
}
|
||
pt = arPts[13] + vtNor * dEndWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtEnd, arPts[13]));
|
||
}
|
||
DrawMesh(mode,2, nSect + 1, arptSides.asArrayPtr());
|
||
*/
|
||
|
||
// 支管直边
|
||
/*arptSides.setLogicalLength(0);
|
||
pt = arPts[7] + vtNor * dBranWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtBran, arPts[7]));
|
||
}
|
||
pt = arPts[16] + vtNor * dBranWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtBran, arPts[16]));
|
||
}
|
||
DrawMesh(mode,2, nSect + 1, arptSides.asArrayPtr());
|
||
*/
|
||
|
||
// 支管
|
||
arptSides.setLogicalLength(0);
|
||
pt = ptBran + vtNor * dBranWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtBran, arPts[16]));
|
||
}
|
||
|
||
vtMain = arPts[16] - arPts[19];
|
||
vtMain.normalize();
|
||
pt = arPts[19] + vtNor * dBranWidth * 0.5;// arPts[19].distanceTo(arPts[11]) * 0.8;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtMain, arPts[19]));
|
||
}
|
||
|
||
pt = arPts[19];
|
||
AcDbLine ln(ptStart, ptEnd);
|
||
AcGePoint3d pt2 = pt;
|
||
ln.getClosestPointTo(pt, vtMain,pt2);
|
||
|
||
pt = pt2;
|
||
pt += vtNor * dStartWidth * 0.5;// arPts[19].distanceTo(arPts[11]) * 0.8;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtBran, pt2));
|
||
}
|
||
|
||
DrawMesh(mode, 3, nSect + 1, arptSides.asArrayPtr());
|
||
|
||
// 支管
|
||
/*vtMain = arPts[16] - arPts[19];
|
||
vtMain.normalize();
|
||
arptSides.setLogicalLength(0);
|
||
pt = arPts[16] + vtNor * dBranWidth * 0.5;
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtMain, arPts[16]));
|
||
}
|
||
|
||
pt = arPts[19] + vtNor * arPts[19].distanceTo(arPts[11]);
|
||
for (i = 0; i <= nSect; i++)
|
||
{
|
||
arptSides.append(pt.rotateBy(dMinDiffAng, vtMain, arPts[19]));
|
||
}
|
||
DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr());
|
||
*/
|
||
}
|
||
|
||
// Y形圆三通3D绘制,采用分别绘制两个(变径)弯头合并在一块,以减小难度
|
||
// 每个弯头用中心线作为每段圆的中心点
|
||
void ImpHvacTee::DrawYShapeCircle3d( AcGiDraw &mode ) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGePoint3dArray ptArr;
|
||
if (!GetSectMidKeyPt(ptArr) || ptArr.length() != 17)
|
||
return;
|
||
|
||
AcGePoint3d ptSta, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptSta);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
double dStaRadius(0.0), dEndRadius(0.0), dBranRadius(0.0);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStaRadius);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndRadius);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranRadius);
|
||
dStaRadius *= 0.5;
|
||
dEndRadius *= 0.5;
|
||
dBranRadius *= 0.5;
|
||
|
||
AcGeVector3d vtStart(StartVect()), vtBran(BranVect()), vtEnd(EndVect()), vtNormal(normal());
|
||
double dFlan(0.0);
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dFlan);
|
||
|
||
double dMinAngle(PI / 12), dCirMinAng(PI / 12); // 圆的分度角
|
||
//GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinAngle);
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG, dMinAngle);
|
||
if (dMinAngle < 1e-6)
|
||
{
|
||
dMinAngle = PI / 12;
|
||
}
|
||
int nCirPart = int(PI * 2 / dMinAngle) + 1;
|
||
dCirMinAng = PI * 2 / nCirPart;
|
||
|
||
int i(0), k(0);
|
||
|
||
// 起始端弯头//////////////////////////////////////////////////////////////////////////
|
||
AcGePoint3dArray ptStaToMesh;
|
||
AcGePoint3d ptEveCenter; // 每段圆对应圆心
|
||
int nStaRowNum(0); // 网格行数
|
||
|
||
// 法兰端直圆
|
||
AcGeVector3d vtStaPer = vtNormal;
|
||
ptEveCenter = ptSta;
|
||
AcGePoint3d ptNow = ptEveCenter + dStaRadius * vtNormal;
|
||
for (i = 0; i < nCirPart; i++)
|
||
{
|
||
ptStaToMesh.append(ptNow);
|
||
ptNow.rotateBy(dCirMinAng, vtStart, ptEveCenter);
|
||
}
|
||
ptStaToMesh.append(ptStaToMesh.at(0));
|
||
|
||
ptEveCenter = TAuxTools::Mid(ptArr[2], ptArr[16]);
|
||
ptNow = ptEveCenter + dStaRadius * vtNormal;
|
||
for (i = 0; i < nCirPart; i++)
|
||
{
|
||
ptStaToMesh.append(ptNow);
|
||
ptNow.rotateBy(dCirMinAng, vtStart, ptEveCenter);
|
||
}
|
||
ptStaToMesh.append(ptStaToMesh.at(nCirPart + 1));
|
||
nStaRowNum = 2;
|
||
|
||
// 起始端弧
|
||
AcGeVector3d vtBranPerl = vtBran;
|
||
vtBranPerl.rotateBy(PI * 0.5, vtNormal);
|
||
AcGePoint3d ptStaArcEnd = ptArr[4] + dBranRadius * vtBranPerl; // 起始端圆弧终点
|
||
AcGeLine3d lineStaPerl(ptArr[16], ptArr[2]);
|
||
AcGeLine3d lineBranPerl(ptStaArcEnd, ptStaArcEnd + 100 * vtBranPerl);
|
||
AcGePoint3d ptStaCenter; // 起始端弧圆心
|
||
if (lineStaPerl.intersectWith(lineBranPerl, ptStaCenter) != Adesk::kTrue)
|
||
return;
|
||
|
||
double dStaArcAngle = (fabs)((ptEveCenter - ptStaCenter).angleTo(ptStaArcEnd - ptStaCenter));
|
||
int nStaPart = int(dStaArcAngle / dMinAngle) + 1;
|
||
nStaPart *= 2;
|
||
|
||
double dStaMinAngle = dStaArcAngle / nStaPart;
|
||
// 起始端弧每段半径调整值(按起始端和支管段线性变化)
|
||
double dStaRadOff = (dBranRadius - dStaRadius) / nStaPart;
|
||
double dStaRadNow(dStaRadius); // 针对每段弧半径
|
||
AcGeVector3d vtStaEveRot; // 每段弧法向
|
||
|
||
for (i = 0; i < nStaPart; i++)
|
||
{
|
||
ptEveCenter.rotateBy(-dStaMinAngle, vtNormal, ptStaCenter);
|
||
dStaRadNow += dStaRadOff;
|
||
ptNow = ptEveCenter + dStaRadNow * vtNormal;
|
||
|
||
vtStaEveRot = ptEveCenter - ptStaCenter;
|
||
vtStaEveRot.rotateBy(PI * 0.5, vtNormal);
|
||
vtStaEveRot.normalize();
|
||
|
||
for (k = 0; k < nCirPart; k++)
|
||
{
|
||
ptStaToMesh.append(ptNow);
|
||
ptNow.rotateBy(dCirMinAng, vtStaEveRot, ptEveCenter);
|
||
}
|
||
ptStaToMesh.append(ptEveCenter + dStaRadNow * vtNormal);
|
||
|
||
nStaRowNum++;
|
||
}
|
||
|
||
// 起始端支管直管段
|
||
ptEveCenter = ptBran;
|
||
ptNow = ptEveCenter + dBranRadius * vtNormal;
|
||
for (i = 0; i < nCirPart + 1; i++)
|
||
{
|
||
ptStaToMesh.append(ptNow);
|
||
ptNow.rotateBy(-dCirMinAng, vtBran, ptEveCenter);
|
||
}
|
||
nStaRowNum++;
|
||
|
||
// 末端弯头
|
||
AcGePoint3dArray ptEndToMesh;
|
||
int nEndRowNum(0);
|
||
|
||
// 法兰端直圆
|
||
AcGeVector3d vtEndPer = vtNormal;
|
||
ptEveCenter = ptEnd;
|
||
ptNow = ptEveCenter + dEndRadius * vtNormal;
|
||
for (i = 0; i < nCirPart; i++)
|
||
{
|
||
ptEndToMesh.append(ptNow);
|
||
ptNow.rotateBy(-dCirMinAng, vtEnd, ptEveCenter);
|
||
}
|
||
ptEndToMesh.append(ptEndToMesh.at(0));
|
||
|
||
ptEveCenter = TAuxTools::Mid(ptArr[9], ptArr[12]);
|
||
ptNow = ptEveCenter + dEndRadius * vtNormal;
|
||
for (i = 0; i < nCirPart; i++)
|
||
{
|
||
ptEndToMesh.append(ptNow);
|
||
ptNow.rotateBy(-dCirMinAng, vtEnd, ptEveCenter);
|
||
}
|
||
ptEndToMesh.append(ptEndToMesh.at(nCirPart + 1));
|
||
nEndRowNum = 2;
|
||
|
||
// 末端端弧
|
||
AcGePoint3d ptEndArcEnd = ptArr[7] - dBranRadius * vtBranPerl; // 起始端圆弧终点
|
||
AcGeLine3d lineEndPerl(ptArr[12], ptArr[9]);
|
||
lineBranPerl.set(ptEndArcEnd, ptEndArcEnd + 100 * vtBranPerl);
|
||
AcGePoint3d ptEndCenter; // 末端端弧圆心
|
||
if (lineEndPerl.intersectWith(lineBranPerl, ptEndCenter) != Adesk::kTrue)
|
||
return;
|
||
|
||
double dEndArcAngle = (fabs)((ptEveCenter - ptEndCenter).angleTo(ptEndArcEnd - ptEndCenter));
|
||
int nEndPart = int(dEndArcAngle / dMinAngle) + 1;
|
||
|
||
double dEndMinAngle = dEndArcAngle / nEndPart;
|
||
// 末端弧每段半径调整值(按起始端和支管段线性变化)
|
||
double dEndRadOff = (dBranRadius - dEndRadius) / nEndPart;
|
||
double dEndRadNow(dEndRadius); // 针对每段弧半径
|
||
AcGeVector3d vtEndEveRot; // 每段弧法向
|
||
|
||
for (i = 0; i < nEndPart; i++)
|
||
{
|
||
ptEveCenter.rotateBy(dEndMinAngle, vtNormal, ptEndCenter);
|
||
dEndRadNow += dEndRadOff;
|
||
ptNow = ptEveCenter + dEndRadNow * vtNormal;
|
||
|
||
vtEndEveRot = ptEveCenter - ptEndCenter;
|
||
vtEndEveRot.rotateBy(PI * 0.5, vtNormal);
|
||
vtEndEveRot.normalize();
|
||
|
||
for (k = 0; k < nCirPart; k++)
|
||
{
|
||
ptEndToMesh.append(ptNow);
|
||
ptNow.rotateBy(dCirMinAng, vtEndEveRot, ptEveCenter);
|
||
}
|
||
ptEndToMesh.append(ptEveCenter + dEndRadNow * vtNormal);
|
||
|
||
nEndRowNum++;
|
||
}
|
||
|
||
// 末端支管直管段
|
||
ptEveCenter = ptBran;
|
||
ptNow = ptEveCenter + dBranRadius * vtNormal;
|
||
for (i = 0; i < nCirPart + 1; i++)
|
||
{
|
||
ptEndToMesh.append(ptNow);
|
||
ptNow.rotateBy(dCirMinAng, vtBran, ptEveCenter);
|
||
}
|
||
nEndRowNum++;
|
||
|
||
DrawMesh(mode,nStaRowNum, nCirPart + 1, ptStaToMesh.asArrayPtr());
|
||
DrawMesh(mode,nEndRowNum, nCirPart + 1, ptEndToMesh.asArrayPtr());
|
||
}
|
||
|
||
void ImpHvacTee::DrawVShapeCircle3d( AcGiDraw &mode ) const
|
||
{
|
||
//圆型 V型三通
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGeVector3d vtNormal(normal());
|
||
AcGeVector3d vtStart(StartVect()), vtEnd(EndVect()), vtBran(BranVect());
|
||
AcGeVector3d vtStaSide(vtStart), vtEndSide(vtEnd), vtBranSide(vtBran); // 每管向量垂直向量
|
||
vtStaSide.rotateBy(PI*0.5, vtNormal);
|
||
vtEndSide.rotateBy(PI*0.5, vtNormal);
|
||
vtBranSide.rotateBy(PI*0.5, vtNormal);
|
||
double dStartWidth(0.0), dEndWidth(0.0), dBranWidth(0.0),dPlusEdge(50.0);
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge);
|
||
vtBran.normalize();
|
||
|
||
AcGePoint3dArray arpts, arptsMeshS,arptsMeshE,arptsMeshB, arptsMeshBE;
|
||
GetVShapeCirclePts(arpts);
|
||
|
||
double dMinDiffAng = PI/12;
|
||
//GetGlobalContext()->GetAt(KEY_MINDIFFANG,dMinDiffAng);
|
||
m_pXDataMap->GetAt(KEY_MINDIFFANG,dMinDiffAng);
|
||
if (dMinDiffAng < 1e-6)
|
||
{
|
||
dMinDiffAng = PI / 12;
|
||
}
|
||
//开始面
|
||
int nSect = int(2 * PI / dMinDiffAng) + 1;
|
||
AcGePoint3d pt,ptCen,pt1,ptCen1,ptB,ptCenB;
|
||
pt = arpts[10] + vtNormal * dStartWidth * 0.5;
|
||
pt1 = arpts[11] + vtNormal * dEndWidth * 0.5;
|
||
ptB = arpts[12] + vtNormal * dBranWidth * 0.5;
|
||
|
||
arptsMeshS.append(pt);
|
||
arptsMeshE.append(pt1);
|
||
arptsMeshB.append(ptB);
|
||
for (int i = 0; i < nSect; i++)
|
||
{
|
||
//开始端面
|
||
pt.rotateBy(dMinDiffAng, vtStart, arpts[10]);
|
||
arptsMeshS.append(pt);
|
||
|
||
//结束端面
|
||
pt1.rotateBy(dMinDiffAng, vtEnd, arpts[11]);
|
||
arptsMeshE.append(pt1);
|
||
|
||
//支管端面
|
||
ptB.rotateBy(dMinDiffAng, -vtBran, arpts[12]);
|
||
arptsMeshB.append(ptB);
|
||
}
|
||
|
||
//开始面
|
||
ptCen = arpts[10] - vtStart * dPlusEdge;
|
||
ptCen1 = arpts[11] - vtEnd * dPlusEdge;
|
||
pt = ptCen + vtNormal * dStartWidth * 0.5;
|
||
pt1 = ptCen1 + vtNormal * dEndWidth * 0.5;
|
||
arptsMeshS.append(pt);
|
||
arptsMeshE.append(pt1);
|
||
for (i = 0; i < nSect; i++)
|
||
{
|
||
//开始端面
|
||
pt.rotateBy(dMinDiffAng, vtStart, ptCen);
|
||
arptsMeshS.append(pt);
|
||
|
||
//结束端面
|
||
pt1.rotateBy(dMinDiffAng, vtEnd, ptCen1);
|
||
arptsMeshE.append(pt1);
|
||
}
|
||
|
||
//终止面
|
||
pt = arpts[14] + vtNormal * arpts[14].distanceTo(arpts[2]);
|
||
arptsMeshS.append(pt);
|
||
|
||
pt1 = arpts[15] + vtNormal * arpts[15].distanceTo(arpts[5]);
|
||
arptsMeshE.append(pt1);
|
||
|
||
ptCenB = arpts[12] - vtBran * 50;
|
||
ptB = ptCenB + vtNormal * dBranWidth * 0.5;
|
||
arptsMeshB.append(ptB);
|
||
arptsMeshBE.append(ptB);
|
||
|
||
for (i = 0; i < nSect; i++)
|
||
{
|
||
//开始端面
|
||
pt.rotateBy(dMinDiffAng, vtStart, arpts[14]);
|
||
arptsMeshS.append(pt);
|
||
|
||
//结束端面
|
||
pt1.rotateBy(dMinDiffAng, vtEnd, arpts[15]);
|
||
arptsMeshE.append(pt1);
|
||
|
||
//支管端面
|
||
ptB.rotateBy(dMinDiffAng, -vtBran, ptCenB);
|
||
arptsMeshB.append(ptB);
|
||
arptsMeshBE.append(ptB);
|
||
}
|
||
|
||
arptsMeshS.append(arptsMeshBE);
|
||
arptsMeshE.append(arptsMeshBE);
|
||
|
||
DrawMesh(mode,4 , nSect + 1, arptsMeshS.asArrayPtr());
|
||
DrawMesh(mode,4 , nSect + 1, arptsMeshE.asArrayPtr());
|
||
DrawMesh(mode,2 , nSect + 1, arptsMeshB.asArrayPtr());
|
||
}
|
||
|
||
void ImpHvacTee::DrawTShapeCircle3d( AcGiDraw &mode ) const
|
||
{
|
||
|
||
}
|
||
|
||
void ImpHvacTee::DrawArcuateCircle3d( AcGiDraw &mode ) const
|
||
{
|
||
DrawInsertCircle3d(mode);
|
||
}
|
||
|
||
// 2DCurve
|
||
Acad::ErrorStatus ImpHvacTee::Draw2d( AcGiDraw &mode ) const
|
||
{
|
||
if (m_pXDataMap == NULL)
|
||
{
|
||
return Acad::eNotImplementedYet;
|
||
}
|
||
|
||
AecComplexCurve cplCurve;
|
||
MakeCurves(cplCurve);
|
||
|
||
AecComplexCurveDraw edage;
|
||
edage.SetEdage(cplCurve);
|
||
|
||
AcDbObjectId idReal = m_idDoubleLayer;
|
||
AcDbObjectId idDash = m_idDashLayer;
|
||
AcDbObjectId idCent = m_idCenterLayer;
|
||
|
||
edage.Draw2d(mode,idReal,idDash,idCent,NULL,FALSE,FALSE);
|
||
|
||
AecComplexCurve cplCen;
|
||
GetCurvesInSide(cplCen);
|
||
|
||
edage.SetEdage(cplCen);
|
||
edage.Draw2d(mode,idReal,idDash,idCent,NULL,FALSE,FALSE);
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeCurves( AecComplexCurve& cplCurve ) const
|
||
{
|
||
if (NULL == m_pXDataMap)
|
||
return FALSE;
|
||
|
||
return CusTomMakeCurves(cplCurve, 0);
|
||
}
|
||
|
||
BOOL ImpHvacTee::GetCurvesInSide( AecComplexCurve& cplCurve ) const
|
||
{
|
||
if (NULL == m_pXDataMap)
|
||
return FALSE;
|
||
|
||
return CusTomMakeCurves(cplCurve, 1);
|
||
}
|
||
|
||
BOOL ImpHvacTee::CusTomMakeCurves( AecComplexCurve& cplCurve, const int &nOutOrIn) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AecHvac::HvacTeeType eType = AecHvac::eOrthoBranch;
|
||
ESection eSectType = eRect;
|
||
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
|
||
if (eType == AecHvac::eOrthoBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
return MakeOrthoRect2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eCircle)
|
||
{
|
||
return MakeInsertCircle2DCurves(cplCurve, nOutOrIn);
|
||
}
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eInsertBranch)//承插
|
||
{
|
||
if (eSectType == eRect)
|
||
return MakeInsertRect2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eCircle)
|
||
{
|
||
//承插 -- 圆型
|
||
return MakeInsertBranchCircle2DCurves(cplCurve, nOutOrIn);
|
||
}
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eInsertIntubBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
return MakeInsertIntubRect2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eCircle)
|
||
return MakeInsertCircle2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eInclineBranch)//斜接
|
||
{
|
||
if (eSectType == eRect)
|
||
return MakeInclineRect2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eCircle)
|
||
{
|
||
//斜接 -- 圆型
|
||
m_pXDataMap->SetAt(HVAC_PlusEdge, 0.1);//
|
||
return MakeInclineBranchCircle2DCurves(cplCurve, nOutOrIn);
|
||
}
|
||
else if (eSectType == eOblate);
|
||
}
|
||
else if (eType == AecHvac::eYShapeBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
return MakeYShapeRect2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eCircle)
|
||
return MakeYShapeCircle2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eVShapeBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
return MakeVShapeRect2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eCircle)
|
||
return MakeVShapeCircle2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eTShapeBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
return MakeTShapeRect2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eCircle)
|
||
;
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eArcuateBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
return MakeArcuateRect2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eCircle)
|
||
return MakeInsertCircle2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
else if (eType == AecHvac::eArcuateIntubBranch)
|
||
{
|
||
if (eSectType == eRect)
|
||
return MakeArcuateIntubRect2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eCircle)
|
||
return MakeInsertCircle2DCurves(cplCurve, nOutOrIn);
|
||
else if (eSectType == eOblate)
|
||
;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
//承插 -- 圆型
|
||
BOOL ImpHvacTee::MakeInsertBranchCircle2DCurves(AecComplexCurve & cplCurve, const int &nOutOrIn) const
|
||
{
|
||
//开始端斜接直边长度 50
|
||
double dLDisFrSta = 50;//毫米
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtEnd, vtBran;
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
|
||
double dStartWidth = 0, dEndWidth = 0, dBranWidth = 0;
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
|
||
vtEnd.normalize(); vtBran.normalize();
|
||
AcGeVector3d vtBran45 = vtEnd + vtBran;
|
||
vtBran45.normalize();
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
//示意弧弦高
|
||
double dArch = 50;
|
||
|
||
AcGeVector3d vtNorm = vtEnd.crossProduct(vtBran);
|
||
if (vtNorm.isParallelTo(AcGeVector3d::kZAxis))//平放
|
||
{
|
||
AcGePoint3d ptB1 = ptStart;
|
||
ptB1 += vtBran * dStartWidth * 0.5;
|
||
ptB1 += vtEnd * dLDisFrSta;
|
||
|
||
AcGeVector3d vtL = vtEnd.orthoProject(vtBran45);
|
||
vtL.normalize();
|
||
|
||
AcGePoint3d ptB2Cen = ptB1 + vtL * dBranWidth * 0.5;
|
||
|
||
AcGeLine3d lnC(ptB2Cen,vtBran45);
|
||
AcGeLine3d lnM(ptStart, ptEnd);
|
||
|
||
AcGePoint3d ptInt;
|
||
if (lnM.intersectWith(lnC, ptInt))
|
||
{
|
||
double dM = ptStart.distanceTo(ptEnd);
|
||
AcGePoint3d ptBrnFr = lnM.closestPointTo(ptBran);
|
||
double dB = ptBrnFr.distanceTo(ptBran);
|
||
|
||
double dL = dB * sqrt(2.0);
|
||
AcGePoint3d ptBr2 = ptInt + dL * vtBran45;
|
||
|
||
//sta
|
||
tCurveEle.ptGe[0] = ptStart - vtBran * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptStart + vtBran * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//top
|
||
tCurveEle.ptGe[0] = ptStart - vtBran * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd - vtBran * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//end
|
||
tCurveEle.ptGe[0] = ptEnd - vtBran * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd + vtBran * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//dowmL
|
||
tCurveEle.ptGe[0] = ptStart + vtBran * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptB1;
|
||
tCurveEle.ptGe[2] = ptB1;
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//down arc
|
||
AcGePoint3d pt2 = ptBr2 + vtL * dBranWidth * 0.5;
|
||
AcGeLine3d rayL2(pt2, vtBran45);
|
||
|
||
AcGePoint3d ptSD = ptStart + vtBran * dStartWidth * 0.5;
|
||
AcGePoint3d ptED = ptEnd + vtBran * dEndWidth * 0.5;
|
||
AcGeLine3d lnD(ptSD, ptED);
|
||
|
||
AcGePoint3d pt3;
|
||
if (lnD.intersectWith(rayL2, pt3))
|
||
{
|
||
AcGePoint3d ptM;
|
||
Midpoint(ptB1, pt3,ptM);
|
||
ptM -= vtBran * dArch;
|
||
|
||
//拟合弧
|
||
tCurveEle.ptGe[0] = ptB1;
|
||
tCurveEle.ptGe[1] = ptM;
|
||
tCurveEle.ptGe[2] = pt3;
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//downR
|
||
tCurveEle.ptGe[0] = pt3;
|
||
tCurveEle.ptGe[1] = ptEnd + vtBran * 0.5 * dEndWidth;;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
}
|
||
|
||
//br
|
||
tCurveEle.ptGe[0] = ptB1;
|
||
tCurveEle.ptGe[1] = ptBr2 - vtL * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
tCurveEle.ptGe[0] = ptBr2 - vtL * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[1] = ptBr2 + vtL * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
tCurveEle.ptGe[0] = pt3;
|
||
tCurveEle.ptGe[1] = ptBr2 + vtL * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//下面弧段 45度
|
||
double dRadRatio = 1.0;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRadRatio);
|
||
|
||
double dR = dRadRatio * dBranWidth;
|
||
AcGePoint3d ptCen = ptBr2 - dR * vtL;
|
||
|
||
//内弧
|
||
AcGeVector3d vtM = vtL + vtEnd;
|
||
vtM.normalize();
|
||
|
||
tCurveEle.ptGe[0] = ptCen + vtL * (dR - 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[1] = ptCen + vtM * (dR - 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[2] = ptCen + vtEnd * (dR - 0.5 * dBranWidth);
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//外弧
|
||
tCurveEle.ptGe[0] = ptCen + vtL * (dR + 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[1] = ptCen + vtM * (dR + 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[2] = ptCen + vtEnd * (dR + 0.5 * dBranWidth);
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//封口
|
||
tCurveEle.ptGe[0] = ptCen + vtEnd * (dR - 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[1] = ptCen + vtEnd * (dR + 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//分段线
|
||
AcDbArc *pArc = KTCADUtilityEx::FormatArc(ptCen + vtL * dR, ptCen + vtM * dR, ptCen + vtEnd * dR);
|
||
if (pArc != NULL)
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
GetSamplePoints(pArc, 4, arPts);
|
||
|
||
AcGeVector3d vtSeg;
|
||
for (int ii = 1;ii < arPts.length() - 1;ii++)
|
||
{
|
||
vtSeg = arPts.at(ii) - ptCen;
|
||
vtSeg.normalize();
|
||
|
||
tCurveEle.ptGe[0] = arPts.at(ii) - vtSeg * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[1] = arPts.at(ii) + vtSeg * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
tCurveEle.nColorIndex = 4;
|
||
cplCurve.append(tCurveEle);
|
||
}
|
||
|
||
delete pArc;
|
||
}
|
||
|
||
|
||
//中心线
|
||
tCurveEle.ptGe[0] = ptStart;
|
||
tCurveEle.ptGe[1] = ptEnd;
|
||
tCurveEle.ptGe[2] = ptEnd;
|
||
tCurveEle.idSubLay = m_idCenterLayer;//... 图层取
|
||
cplCurve.append(tCurveEle);
|
||
|
||
tCurveEle.ptGe[0] = ptInt;
|
||
tCurveEle.ptGe[1] = ptBr2;
|
||
tCurveEle.ptGe[2] = ptBr2;
|
||
cplCurve.append(tCurveEle);
|
||
|
||
tCurveEle.ptGe[0] = ptCen + vtL * dR;
|
||
tCurveEle.ptGe[1] = ptCen + vtM * dR;
|
||
tCurveEle.ptGe[2] = ptCen + vtEnd * dR;
|
||
cplCurve.append(tCurveEle);
|
||
}
|
||
}
|
||
else//其他放置
|
||
{
|
||
//竖放情况 1
|
||
if ( vtBran.isParallelTo(AcGeVector3d::kZAxis) )
|
||
{
|
||
AcGeVector3d vtNorm = normal();
|
||
vtNorm.normalize();
|
||
|
||
//sta
|
||
tCurveEle.ptGe[0] = ptStart - vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptStart + vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//top
|
||
tCurveEle.ptGe[0] = ptStart - vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd - vtNorm * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//end
|
||
tCurveEle.ptGe[0] = ptEnd - vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd + vtNorm * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//down
|
||
tCurveEle.ptGe[0] = ptStart + vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd + vtNorm * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//中心线
|
||
tCurveEle.ptGe[0] = ptStart;
|
||
tCurveEle.ptGe[1] = ptEnd;
|
||
tCurveEle.ptGe[2] = ptEnd;
|
||
tCurveEle.idSubLay = m_idCenterLayer;//... 图层取
|
||
cplCurve.append(tCurveEle);
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
//斜接 -- 圆型
|
||
BOOL ImpHvacTee::MakeInclineBranchCircle2DCurves(AecComplexCurve &cplCurve, const int &nOutOrIn) const
|
||
{
|
||
//开始端斜接直边长度 50
|
||
double dLDisFrSta = 0;//毫米
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtEnd, vtBran;
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
|
||
double dStartWidth = 0, dEndWidth = 0, dBranWidth = 0;
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
|
||
vtEnd.normalize(); vtBran.normalize();
|
||
AcGeVector3d vtBran45 = vtEnd + vtBran;
|
||
vtBran45.normalize();
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
//示意弧弦高
|
||
double dArch = 50;
|
||
|
||
AcGeVector3d vtNorm = vtEnd.crossProduct(vtBran);
|
||
if (vtNorm.isParallelTo(AcGeVector3d::kZAxis))//平放
|
||
{
|
||
AcGePoint3d ptB1 = ptStart;
|
||
ptB1 += vtBran * dStartWidth * 0.5;
|
||
ptB1 += vtEnd * dLDisFrSta;
|
||
|
||
AcGeVector3d vtL = vtEnd.orthoProject(vtBran45);
|
||
vtL.normalize();
|
||
|
||
AcGePoint3d ptB2Cen = ptStart;
|
||
|
||
AcGeLine3d lnC(ptB2Cen, vtBran45);
|
||
AcGeLine3d lnM(ptStart, ptEnd);
|
||
|
||
AcGePoint3d ptInt;
|
||
//if (lnM.intersectWith(lnC, ptInt))
|
||
{
|
||
ptInt = ptStart;
|
||
double dM = ptStart.distanceTo(ptEnd);
|
||
AcGePoint3d ptBrnFr = lnM.closestPointTo(ptBran);
|
||
double dB = ptBrnFr.distanceTo(ptBran);
|
||
|
||
double dL = dB * sqrt(2.0);
|
||
AcGePoint3d ptBr2 = ptInt + dL * vtBran45;
|
||
|
||
//sta
|
||
tCurveEle.ptGe[0] = ptStart - vtBran * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptStart + vtBran * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//top
|
||
tCurveEle.ptGe[0] = ptStart - vtBran * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd - vtBran * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//end
|
||
tCurveEle.ptGe[0] = ptEnd - vtBran * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd + vtBran * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//dowmL==0
|
||
//tCurveEle.ptGe[0] = ptStart + vtBran * 0.5 * dStartWidth;
|
||
//tCurveEle.ptGe[1] = ptB1;
|
||
//tCurveEle.ptGe[2] = ptB1;
|
||
//cplCurve.append(tCurveEle);
|
||
|
||
double dInR = lnC.distanceTo(ptB1);
|
||
|
||
//down arc
|
||
AcGePoint3d pt2 = ptBr2 + vtL * dBranWidth * 0.5;
|
||
AcGePoint3d pt1 = ptB1 + vtL * dInR * 2.0;
|
||
|
||
AcGeLine3d rayL2(pt2, pt1);
|
||
|
||
AcGePoint3d ptSD = ptStart + vtBran * dStartWidth * 0.5;
|
||
AcGePoint3d ptED = ptEnd + vtBran * dEndWidth * 0.5;
|
||
AcGeLine3d lnD(ptSD, ptED);
|
||
|
||
AcGePoint3d pt3;
|
||
if (lnD.intersectWith(rayL2, pt3))
|
||
{
|
||
AcGePoint3d ptM;
|
||
Midpoint(ptB1, pt3, ptM);
|
||
ptM -= vtBran * dArch;
|
||
|
||
//拟合线
|
||
tCurveEle.ptGe[0] = ptStart;
|
||
tCurveEle.ptGe[1] = pt3;
|
||
tCurveEle.ptGe[2] = pt3;
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//downR
|
||
tCurveEle.ptGe[0] = pt3;
|
||
tCurveEle.ptGe[1] = ptEnd + vtBran * 0.5 * dEndWidth;;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
}
|
||
|
||
//br
|
||
tCurveEle.ptGe[0] = ptB1;
|
||
tCurveEle.ptGe[1] = ptBr2 - vtL * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
tCurveEle.ptGe[0] = ptBr2 - vtL * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[1] = ptBr2 + vtL * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
tCurveEle.ptGe[0] = pt3;
|
||
tCurveEle.ptGe[1] = ptBr2 + vtL * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//下面弧段 45度
|
||
double dRadRatio = 1.0;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRadRatio);
|
||
|
||
double dR = dRadRatio * dBranWidth;
|
||
AcGePoint3d ptCen = ptBr2 - dR * vtL;
|
||
|
||
//内弧
|
||
AcGeVector3d vtM = vtL + vtEnd;
|
||
vtM.normalize();
|
||
|
||
tCurveEle.ptGe[0] = ptCen + vtL * (dR - 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[1] = ptCen + vtM * (dR - 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[2] = ptCen + vtEnd * (dR - 0.5 * dBranWidth);
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//外弧
|
||
tCurveEle.ptGe[0] = ptCen + vtL * (dR + 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[1] = ptCen + vtM * (dR + 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[2] = ptCen + vtEnd * (dR + 0.5 * dBranWidth);
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//封口
|
||
tCurveEle.ptGe[0] = ptCen + vtEnd * (dR - 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[1] = ptCen + vtEnd * (dR + 0.5 * dBranWidth);
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//分段线
|
||
AcDbArc *pArc = KTCADUtilityEx::FormatArc(ptCen + vtL * dR, ptCen + vtM * dR, ptCen + vtEnd * dR);
|
||
if (pArc != NULL)
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
GetSamplePoints(pArc, 4, arPts);
|
||
|
||
AcGeVector3d vtSeg;
|
||
for (int ii = 1; ii < arPts.length() - 1; ii++)
|
||
{
|
||
vtSeg = arPts.at(ii) - ptCen;
|
||
vtSeg.normalize();
|
||
|
||
tCurveEle.ptGe[0] = arPts.at(ii) - vtSeg * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[1] = arPts.at(ii) + vtSeg * 0.5 * dBranWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
tCurveEle.nColorIndex = 4;
|
||
cplCurve.append(tCurveEle);
|
||
}
|
||
|
||
delete pArc;
|
||
}
|
||
|
||
//中心线
|
||
tCurveEle.ptGe[0] = ptStart;
|
||
tCurveEle.ptGe[1] = ptEnd;
|
||
tCurveEle.ptGe[2] = ptEnd;
|
||
tCurveEle.idSubLay = m_idCenterLayer;//... 图层取
|
||
cplCurve.append(tCurveEle);
|
||
|
||
tCurveEle.ptGe[0] = ptStart;
|
||
tCurveEle.ptGe[1] = ptBr2;
|
||
tCurveEle.ptGe[2] = ptBr2;
|
||
cplCurve.append(tCurveEle);
|
||
|
||
tCurveEle.ptGe[0] = ptCen + vtL * dR;
|
||
tCurveEle.ptGe[1] = ptCen + vtM * dR;
|
||
tCurveEle.ptGe[2] = ptCen + vtEnd * dR;
|
||
cplCurve.append(tCurveEle);
|
||
}
|
||
}
|
||
else//其他放置
|
||
{
|
||
//竖放情况 1
|
||
if (vtBran.isParallelTo(AcGeVector3d::kZAxis))
|
||
{
|
||
AcGeVector3d vtNorm = normal();
|
||
vtNorm.normalize();
|
||
|
||
//sta
|
||
tCurveEle.ptGe[0] = ptStart - vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptStart + vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//top
|
||
tCurveEle.ptGe[0] = ptStart - vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd - vtNorm * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//end
|
||
tCurveEle.ptGe[0] = ptEnd - vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd + vtNorm * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//down
|
||
tCurveEle.ptGe[0] = ptStart + vtNorm * 0.5 * dStartWidth;
|
||
tCurveEle.ptGe[1] = ptEnd + vtNorm * 0.5 * dEndWidth;
|
||
tCurveEle.ptGe[2] = tCurveEle.ptGe[1];
|
||
cplCurve.append(tCurveEle);
|
||
|
||
//中心线
|
||
tCurveEle.ptGe[0] = ptStart;
|
||
tCurveEle.ptGe[1] = ptEnd;
|
||
tCurveEle.ptGe[2] = ptEnd;
|
||
tCurveEle.idSubLay = m_idCenterLayer;//... 图层取
|
||
cplCurve.append(tCurveEle);
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeOrthoRect2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeOrthoRectHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeRectSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeRectFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsInclineAlignment())
|
||
return MakeOrthoRectHoriz2DCurves(cplCurve, nOutOrIn);
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInsertRect2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeInsertRectHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeRectSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeRectFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInsertIntubRect2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeInsertRectHoriz2DCurves(cplCurve, nOutOrIn, TRUE);
|
||
else if (IsSideVertAlignment())
|
||
return MakeRectSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeRectFaceVert2DCurves(cplCurve, nOutOrIn, TRUE);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInclineRect2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeInclineRectHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeRectSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeRectFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeYShapeRect2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeYShapeRectHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeRectSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeRectFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeVShapeRect2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeVShapeRectHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeRectSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeRectFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeTShapeRect2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeTShapeRectHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeRectSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeRectFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeArcuateRect2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeArcuateRectHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeRectSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeRectFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeArcuateIntubRect2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeArcuateRectHoriz2DCurves(cplCurve, nOutOrIn, TRUE);
|
||
else if (IsSideVertAlignment())
|
||
return MakeRectSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeRectFaceVert2DCurves(cplCurve, nOutOrIn, TRUE);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeOrthoCircle2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeOrthoCircleHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeOrthoCircleSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeOrthoCircleFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInsertCircle2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeInsertCircleHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeInsertCircleSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeInsertCircleFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsInclineAlignment())
|
||
return MakeOrthoCircleIncline2DCurves(cplCurve, nOutOrIn);
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInclineCircle2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeInclineCircleHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeInclineCircleSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsIncVertAlignment())
|
||
return MakeInclineCircleFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsInclineAlignment())
|
||
return MakeInclineCircleInc2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeYShapeCircle2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeYShapeCircleHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeYShapeCircleSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeYShapeCircleFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeVShapeCircle2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
if (IsHorzAlignment())
|
||
return MakeVShapeCircleHoriz2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsSideVertAlignment())
|
||
return MakeVShapeCircleSideVert2DCurves(cplCurve, nOutOrIn);
|
||
else if (IsFaceVertAlignment())
|
||
return MakeVShapeCircleFaceVert2DCurves(cplCurve, nOutOrIn);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
/*
|
||
常规三通二维画法,各点示意图
|
||
|
||
// 0━━━━━━━━━8━━━━━━━7
|
||
// ┃ ┃
|
||
// ┃ ┃
|
||
// ━━━━━━━━━━━━━━━━━
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 1━━━━━2 ┃ 5━━━━6
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 3━━━━━4
|
||
*/
|
||
|
||
BOOL ImpHvacTee::MakeOrthoRectHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
if (IsSingleLine())
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
|
||
return TRUE;
|
||
}
|
||
else
|
||
{
|
||
if (nOutOrIn == 1)
|
||
{
|
||
AcGePoint3dArray ptMidArr;
|
||
GetSectMidKeyPt(ptMidArr);
|
||
if (9 != ptMidArr.length())
|
||
{
|
||
return FALSE;
|
||
}
|
||
if (ptMidArr.length() > 5)
|
||
DrawValve(cplCurve, ptMidArr[5]);
|
||
|
||
if (IsBaseLine())
|
||
{
|
||
tCurveEle.dWidth = GetCentLineWidth();
|
||
tCurveEle.idSubLay = m_idCenterLayer;
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
}
|
||
return TRUE;
|
||
}
|
||
else if (nOutOrIn == 0)
|
||
{
|
||
AcGePoint3dArray ptMidArr;
|
||
GetSectMidKeyPt(ptMidArr);
|
||
if (9 != ptMidArr.length())
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
// 添加非端部的外部线条
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptMidArr[1], ptMidArr[2], ptMidArr[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptMidArr[2], ptMidArr[3], ptMidArr[3]);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptMidArr[4], ptMidArr[5], ptMidArr[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptMidArr[5], ptMidArr[6], ptMidArr[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptMidArr[7], ptMidArr[8], ptMidArr[8]);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptMidArr[8], ptMidArr[0], ptMidArr[0]);
|
||
|
||
// 添加端部线条
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptMidArr[0], ptMidArr[1], ptMidArr[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptMidArr[3], ptMidArr[4], ptMidArr[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptMidArr[6], ptMidArr[7], ptMidArr[7]);
|
||
}
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInsertRectHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn, BOOL bIntub ) const
|
||
{
|
||
// 获取起点终点和分支点
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
// 设置单位曲线的参数
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
// 单线模式
|
||
if (IsSingleLine())
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
|
||
return TRUE;
|
||
}
|
||
else
|
||
{
|
||
// 处理中截面上的点
|
||
AcGePoint3dArray arptMid;
|
||
GetSectMidKeyPt(arptMid);
|
||
if (10 != arptMid.length())
|
||
{
|
||
return FALSE;
|
||
}
|
||
AcGePlane plane = GetStdPrjPlan(ptStart);
|
||
for (int iNum = 2; iNum <= 6; iNum++)
|
||
{
|
||
arptMid[iNum] = arptMid[iNum].orthoProject(plane);
|
||
}
|
||
|
||
// 非单线模式的外部线条
|
||
if (0 == nOutOrIn)
|
||
{
|
||
// 添加非端线的外轮廓线
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[1], arptMid[2], arptMid[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[2], arptMid[3], arptMid[3]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[3], arptMid[4], arptMid[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[5], arptMid[6], arptMid[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[6], arptMid[7], arptMid[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[8], arptMid[9], arptMid[9]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[9], arptMid[0], arptMid[0]);
|
||
|
||
// 添加端线
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
if (!bIntub)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[0], arptMid[1], arptMid[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[7], arptMid[8], arptMid[8]);
|
||
}
|
||
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[4], arptMid[5], arptMid[5]);
|
||
}
|
||
else
|
||
{
|
||
// 非单线模式的内部线条
|
||
// 非中心线的内部线条
|
||
AcGePoint3d ptIntersect;
|
||
AcGeVector3d vtStart(StartVect());
|
||
double dDis = 200;
|
||
AcGePoint3d ptExtend1 = arptMid[1] + vtStart * dDis;
|
||
AcGeVector3d vtEnd(EndVect());
|
||
AcGePoint3d ptExtend6 = arptMid[6] + vtEnd * dDis;
|
||
if(Adesk::kTrue == GetIntersectPointByPts(arptMid[1], ptExtend1, arptMid[6], ptExtend6, ptIntersect))
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[2], ptIntersect, ptIntersect);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptIntersect, arptMid[6], arptMid[6]);
|
||
}
|
||
else
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[2], arptMid[6], arptMid[6]);
|
||
}
|
||
if (arptMid.length() > 6)
|
||
DrawValve(cplCurve, arptMid[6]);
|
||
|
||
// 中心线
|
||
if (IsBaseLine())
|
||
{
|
||
tCurveEle.dWidth = GetCentLineWidth();
|
||
tCurveEle.idSubLay = m_idCenterLayer;
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInclineRectHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
// 获取起点终点和分支点
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
// 设置单位曲线的参数
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
// 单线模式
|
||
if (IsSingleLine())
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
|
||
return TRUE;
|
||
}
|
||
else
|
||
{
|
||
// 非单线模式的外部线条
|
||
AcGePoint3dArray arptMid;
|
||
GetSectMidKeyPt(arptMid);
|
||
if (10 != arptMid.length())
|
||
{
|
||
return FALSE;
|
||
}
|
||
if (0 == nOutOrIn)
|
||
{
|
||
// 添加非端线的外轮廓线
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[1], arptMid[2], arptMid[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[2], arptMid[3], arptMid[3]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[3], arptMid[4], arptMid[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[5], arptMid[6], arptMid[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[6], arptMid[7], arptMid[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[8], arptMid[9], arptMid[9]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[9], arptMid[0], arptMid[0]);
|
||
|
||
// 添加端线
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[0], arptMid[1], arptMid[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[4], arptMid[5], arptMid[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[7], arptMid[8], arptMid[8]);
|
||
}
|
||
else
|
||
{
|
||
if (arptMid.length() > 6)
|
||
DrawValve(cplCurve, arptMid[6]);
|
||
|
||
// 中心线
|
||
if (IsBaseLine())
|
||
{
|
||
tCurveEle.dWidth = GetCentLineWidth();
|
||
tCurveEle.idSubLay = m_idCenterLayer;
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeYShapeRectHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
// 获取起点终点和分支点
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
// 设置单位曲线的参数
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
// 单线模式
|
||
if (IsSingleLine())
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
|
||
return TRUE;
|
||
}
|
||
else
|
||
{
|
||
// 非单线模式的外部线条
|
||
AcGePoint3dArray arptMid;
|
||
GetSectMidKeyPt(arptMid);
|
||
if (17 != arptMid.length())
|
||
{
|
||
return FALSE;
|
||
}
|
||
if (0 == nOutOrIn)
|
||
{
|
||
// 添加非端线的外部轮廓线
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[1], arptMid[2], arptMid[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[2], arptMid[3], arptMid[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[4], arptMid[5], arptMid[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[6], arptMid[7], arptMid[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[7], arptMid[8], arptMid[9]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[9], arptMid[10], arptMid[10]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[11], arptMid[12], arptMid[12]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[12], arptMid[13], arptMid[14]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[14], arptMid[15], arptMid[16]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[16], arptMid[0], arptMid[0]);
|
||
|
||
// 添加端线
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[0], arptMid[1], arptMid[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[5], arptMid[6], arptMid[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[10], arptMid[11], arptMid[11]);
|
||
}
|
||
else
|
||
{
|
||
// 得到中心线
|
||
if (IsBaseLine())
|
||
{
|
||
tCurveEle.dWidth = GetCentLineWidth();
|
||
tCurveEle.idSubLay = m_idCenterLayer;
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeVShapeRectHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
// 获取起点终点和分支点
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
// 设置单位曲线的参数
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
// 单线模式
|
||
if (IsSingleLine())
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptBran, ptBran);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptEnd, ptBran, ptBran);
|
||
|
||
return TRUE;
|
||
}
|
||
else
|
||
{
|
||
// 非单线模式的外部线条
|
||
AcGePoint3dArray arptMid;
|
||
GetSectMidKeyPt(arptMid);
|
||
if (13 != arptMid.length())
|
||
{
|
||
return FALSE;
|
||
}
|
||
if (0 == nOutOrIn)
|
||
{
|
||
// 添加非端线的外部轮廓线
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[0], arptMid[1], arptMid[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[1], arptMid[2], arptMid[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[2], arptMid[3], arptMid[3]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[4], arptMid[5], arptMid[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[5], arptMid[6], arptMid[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[6], arptMid[7], arptMid[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[8], arptMid[9], arptMid[9]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[9], arptMid[10], arptMid[10]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[10], arptMid[11], arptMid[11]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[11], arptMid[12], arptMid[12]);
|
||
|
||
// 添加端线
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[0], arptMid[12], arptMid[12]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[3], arptMid[4], arptMid[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[7], arptMid[8], arptMid[8]);
|
||
}
|
||
else
|
||
{
|
||
// 中心线
|
||
if (IsBaseLine())
|
||
{
|
||
tCurveEle.dWidth = GetCentLineWidth();
|
||
tCurveEle.idSubLay = m_idCenterLayer;
|
||
AcGePoint3d ptStartExt = TAuxTools::Mid(arptMid[1], arptMid[11]);
|
||
AcGePoint3d ptEndExt = TAuxTools::Mid(arptMid[9], arptMid[6]);
|
||
AcGePoint3d ptBranExt = TAuxTools::Mid(arptMid[2], arptMid[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptStartExt, ptStartExt);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptEnd, ptEndExt, ptEndExt);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptBran, ptBranExt, ptBranExt);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptBranExt, ptStartExt, ptStartExt);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptBranExt, ptEndExt, ptEndExt);
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeTShapeRectHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
// 获取起点终点和分支点
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
// 设置单位曲线的参数
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
// 单线模式
|
||
if (IsSingleLine())
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
|
||
return TRUE;
|
||
}
|
||
else
|
||
{
|
||
// 非单线模式的外部线条
|
||
AcGePoint3dArray arptMid;
|
||
GetSectMidKeyPt(arptMid);
|
||
if (14 != arptMid.length())
|
||
{
|
||
return FALSE;
|
||
}
|
||
if (0 == nOutOrIn)
|
||
{
|
||
// 添加非端线的外部轮廓线
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[1], arptMid[2], arptMid[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[2], arptMid[3], arptMid[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[4], arptMid[5], arptMid[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[6], arptMid[7], arptMid[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[7], arptMid[8], arptMid[9]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[9], arptMid[10], arptMid[10]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[11], arptMid[12], arptMid[12]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[12], arptMid[13], arptMid[13]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[13], arptMid[0], arptMid[0]);
|
||
|
||
// 添加端线
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[0], arptMid[1], arptMid[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[5], arptMid[6], arptMid[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[10], arptMid[11], arptMid[11]);
|
||
}
|
||
else
|
||
{
|
||
// 得到中心线
|
||
if (IsBaseLine())
|
||
{
|
||
tCurveEle.dWidth = GetCentLineWidth();
|
||
tCurveEle.idSubLay = m_idCenterLayer;
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeArcuateRectHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn, BOOL bIntub /*= FALSE*/ ) const
|
||
{
|
||
// 获取起点终点和分支点
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
// 设置单位曲线的参数
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
// 单线模式
|
||
if (IsSingleLine())
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
|
||
return TRUE;
|
||
}
|
||
else
|
||
{
|
||
// 非单线模式的外部线条
|
||
AcGePoint3dArray arptMid;
|
||
GetSectMidKeyPt(arptMid);
|
||
if (13 != arptMid.length())
|
||
{
|
||
return FALSE;
|
||
}
|
||
if (0 == nOutOrIn)
|
||
{
|
||
// 添加非端线的外部轮廓线
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[1], arptMid[2], arptMid[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[2], arptMid[3], arptMid[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[4], arptMid[5], arptMid[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[6], arptMid[7], arptMid[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[7], arptMid[8], arptMid[9]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[9], arptMid[10], arptMid[10]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[11], arptMid[12], arptMid[12]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[12], arptMid[0], arptMid[0]);
|
||
|
||
// 添加端线及管壁线
|
||
if (bIntub)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[2], arptMid[9], arptMid[9]);
|
||
}
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[5], arptMid[6], arptMid[6]);
|
||
|
||
if (!bIntub)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[0], arptMid[1], arptMid[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptMid[10], arptMid[11], arptMid[11]);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (arptMid.length() > 9)
|
||
DrawValve(cplCurve, arptMid[9]);
|
||
|
||
// 中心线
|
||
if (IsBaseLine())
|
||
{
|
||
tCurveEle.dWidth = GetCentLineWidth();
|
||
tCurveEle.idSubLay = m_idCenterLayer;
|
||
AcGePoint3d ptCross = GetCenterPt();
|
||
AutoAppendPt(cplCurve, tCurveEle, ptStart, ptCross, ptCross);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptEnd, ptEnd);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptCross, ptBran, ptBran);
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/* 常规三通侧垂直对应点图
|
||
|
||
// 0━━━━━━━━━8━━━━━━━7 ━━━━━━
|
||
// ┃ ┃ ┃ ┃
|
||
// ┃ ┃ ┃ ┃
|
||
// ━━━━━━━━━━━━━━━━━ ┃━━━━ ┃
|
||
// ┃ ┃ ┃ ┃ ┃
|
||
// ┃ ┃ ┃ ┃ ┃
|
||
// 1━━━━━2 ┃ 5━━━━6 ┃━━━━ ┃
|
||
// ┃ ┃ ┃ ┃ ┃
|
||
// ┃ ┃ ┃ ┃ ┃
|
||
// ┃ ┃ ┃ ┃ ┃
|
||
// ┃ ┃ ┃ ┃ ┃
|
||
// 3━━━━━4 ━━━━━━
|
||
*/
|
||
BOOL ImpHvacTee::MakeRectSideVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
// 绘制基准面,不在此面上的点都投影到此面上
|
||
AcGePlane planStd = GetStdPrjPlan(ptBran);
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
// 找出单线外部点索引
|
||
AcGePoint3dArray arptBase;
|
||
arptBase.append(ptStart.orthoProject(planStd));
|
||
arptBase.append(ptEnd.orthoProject(planStd));
|
||
arptBase.append(ptBran.orthoProject(planStd));
|
||
int nBaseEn1(0), nBaseEn2(0);
|
||
GetEndPointIndex(arptBase, nBaseEn1, nBaseEn2);
|
||
|
||
if (IsSingleLine())
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptBase[nBaseEn1], arptBase[nBaseEn2], arptBase[nBaseEn2]);
|
||
|
||
return TRUE;
|
||
}
|
||
else
|
||
{
|
||
AcGePoint3dArray arptDown, arptUp;
|
||
GetTwoSideKeyPt(arptUp, arptDown);
|
||
if (arptUp.length() < 2 || arptDown.length() < 2)
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
// 去掉弧线上的点
|
||
AecHvac::HvacTeeType eType;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
if (AecHvac::eYShapeBranch == eType)
|
||
{
|
||
arptUp.removeAt(15);
|
||
arptUp.removeAt(13);
|
||
arptUp.removeAt(8);
|
||
arptUp.removeAt(3);
|
||
arptDown.removeAt(15);
|
||
arptDown.removeAt(13);
|
||
arptDown.removeAt(8);
|
||
arptDown.removeAt(3);
|
||
}
|
||
else if (AecHvac::eTShapeBranch == eType || AecHvac::eArcuateBranch == eType || eType == AecHvac::eArcuateIntubBranch)
|
||
{
|
||
arptUp.removeAt(8);
|
||
arptUp.removeAt(3);
|
||
arptDown.removeAt(8);
|
||
arptDown.removeAt(3);
|
||
}
|
||
|
||
// 找出外部点索引
|
||
int nEnd1(0), nEnd2(0);
|
||
AcGePoint3dArray arptUpPrj, arptDownPrj;
|
||
int i(0);
|
||
for (i = 0; i < arptUp.length() && i < arptDown.length(); i++)
|
||
{
|
||
arptUpPrj.append(arptUp[i].orthoProject(planStd));
|
||
arptDownPrj.append(arptDown[i].orthoProject(planStd));
|
||
}
|
||
AcGePoint3dArray arptTranseform(arptUpPrj);
|
||
if (AecHvac::eInsertBranch == eType || eType == AecHvac::eInsertIntubBranch)
|
||
{
|
||
AcGeVector3d vtPrj = arptTranseform[1] - arptTranseform[0];
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
double dAng = (pDb->ucsxdir()).angleTo(vtPrj, vtZAxis);
|
||
vtPrj = (pDb->ucsydir()).rotateBy(dAng, vtZAxis);
|
||
AcGePlane planPrj(arptTranseform[1], vtPrj);
|
||
for (int j = 2; j <= 6; j++)
|
||
{
|
||
arptTranseform[j] = (arptTranseform[j]).orthoProject(planPrj);
|
||
}
|
||
}
|
||
GetEndPointIndex(arptTranseform, nEnd1, nEnd2);
|
||
|
||
if (nOutOrIn == 1)
|
||
{
|
||
// 添加非中心线的内部线条
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
if (AecHvac::eInsertBranch == eType || AecHvac::eInsertIntubBranch == eType)
|
||
{
|
||
// 计算投影内部线条构成
|
||
AcGePoint3d ptVertex = arptTranseform[nEnd1];
|
||
if (arptTranseform[nEnd2].distanceTo(arptTranseform[3])
|
||
< arptTranseform[nEnd1].distanceTo(arptTranseform[3]))
|
||
{
|
||
ptVertex = arptTranseform[nEnd2];
|
||
}
|
||
int iMark = 0;
|
||
if (ptVertex.distanceTo(arptTranseform[7])
|
||
< ptVertex.distanceTo(arptTranseform[1]))
|
||
{
|
||
iMark = 1;
|
||
}
|
||
else if (ptVertex.distanceTo(arptTranseform[7])
|
||
> ptVertex.distanceTo(arptTranseform[1]))
|
||
{
|
||
iMark = 2;
|
||
}
|
||
|
||
for (int i = 0; i < arptUpPrj.length() && i < arptDownPrj.length(); i++)
|
||
{
|
||
if (i == nEnd1 || i == nEnd2)
|
||
{
|
||
continue;
|
||
}
|
||
if (arptUpPrj[i].distanceTo(arptUpPrj[nEnd1]) < 1e-2
|
||
|| arptUpPrj[i].distanceTo(arptUpPrj[nEnd2]) < 1e-2)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
switch(iMark)
|
||
{
|
||
case 0:
|
||
if (1 ==i || 7 ==i)
|
||
{
|
||
continue;
|
||
}
|
||
break;
|
||
case 1:
|
||
if (7 ==i)
|
||
{
|
||
continue;
|
||
}
|
||
break;
|
||
case 2:
|
||
if (1 ==i)
|
||
{
|
||
continue;
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[i], arptDownPrj[i], arptDownPrj[i]);
|
||
}
|
||
if (0 != iMark)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptUpPrj[6], arptUpPrj[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[2], arptDownPrj[6], arptDownPrj[6]);
|
||
}
|
||
}
|
||
else if (AecHvac::eArcuateIntubBranch == eType)
|
||
{
|
||
// 计算投影内部线条构成
|
||
AcGePoint3d ptVertex = arptTranseform[nEnd1];
|
||
if (arptTranseform[nEnd2].distanceTo(arptTranseform[3])
|
||
< arptTranseform[nEnd1].distanceTo(arptTranseform[3]))
|
||
{
|
||
ptVertex = arptTranseform[nEnd2];
|
||
}
|
||
int iMark = 0;
|
||
if (ptVertex.distanceTo(arptTranseform[8])
|
||
< ptVertex.distanceTo(arptTranseform[1]))
|
||
{
|
||
iMark = 1;
|
||
}
|
||
else if (ptVertex.distanceTo(arptTranseform[8])
|
||
> ptVertex.distanceTo(arptTranseform[1]))
|
||
{
|
||
iMark = 2;
|
||
}
|
||
|
||
for (int i = 0; i < arptUpPrj.length() && i < arptDownPrj.length(); i++)
|
||
{
|
||
if (i == nEnd1 || i == nEnd2)
|
||
{
|
||
continue;
|
||
}
|
||
if (arptUpPrj[i].distanceTo(arptUpPrj[nEnd1]) < 1e-2
|
||
|| arptUpPrj[i].distanceTo(arptUpPrj[nEnd2]) < 1e-2)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
switch(iMark)
|
||
{
|
||
case 0:
|
||
if (1 ==i || 8 ==i)
|
||
{
|
||
continue;
|
||
}
|
||
break;
|
||
case 1:
|
||
if (8 ==i)
|
||
{
|
||
continue;
|
||
}
|
||
break;
|
||
case 2:
|
||
if (1 ==i)
|
||
{
|
||
continue;
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[i], arptDownPrj[i], arptDownPrj[i]);
|
||
}
|
||
if (0 != iMark)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptUpPrj[7], arptUpPrj[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[2], arptDownPrj[7], arptDownPrj[7]);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (int i = 0; i < arptUpPrj.length() && i < arptDownPrj.length(); i++)
|
||
{
|
||
if (i == nEnd1 || i == nEnd2)
|
||
{
|
||
continue;
|
||
}
|
||
if (arptUpPrj[i].distanceTo(arptUpPrj[nEnd1]) < 1e-2
|
||
|| arptUpPrj[i].distanceTo(arptUpPrj[nEnd2]) < 1e-2)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[i], arptDownPrj[i], arptDownPrj[i]);
|
||
}
|
||
}
|
||
|
||
// 中心线
|
||
if (IsBaseLine())
|
||
{
|
||
tCurveEle.dWidth = GetCentLineWidth();
|
||
tCurveEle.idSubLay = m_idCenterLayer;
|
||
AutoAppendPt(cplCurve, tCurveEle, arptBase[nBaseEn1], arptBase[nBaseEn2], arptBase[nBaseEn2]);
|
||
}
|
||
}
|
||
else if (nOutOrIn == 0)
|
||
{
|
||
if (eType == AecHvac::eInsertBranch || eType == AecHvac::eInsertIntubBranch)
|
||
{
|
||
// 计算投影内部线条构成
|
||
AcGePoint3d ptVertex = arptTranseform[nEnd1];
|
||
BOOL bJudge = TRUE;
|
||
if (arptTranseform[nEnd2].distanceTo(arptTranseform[3])
|
||
< arptTranseform[nEnd1].distanceTo(arptTranseform[3]))
|
||
{
|
||
ptVertex = arptTranseform[nEnd2];
|
||
bJudge = FALSE;
|
||
}
|
||
int iMark = 0;
|
||
if (ptVertex.distanceTo(arptTranseform[7])
|
||
< ptVertex.distanceTo(arptTranseform[1]))
|
||
{
|
||
iMark = 1;
|
||
}
|
||
else if (ptVertex.distanceTo(arptTranseform[7])
|
||
> ptVertex.distanceTo(arptTranseform[1]))
|
||
{
|
||
iMark = 2;
|
||
}
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
switch(iMark)
|
||
{
|
||
case 0:
|
||
if (nEnd1 == 0 || nEnd2 == 0)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[0], arptUpPrj[1], arptUpPrj[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[0], arptDownPrj[1], arptDownPrj[1]);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[8], arptUpPrj[1], arptUpPrj[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[8], arptDownPrj[1], arptDownPrj[1]);
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[1], arptUpPrj[2], arptUpPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptUpPrj[4], arptUpPrj[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[1], arptDownPrj[2], arptDownPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[2], arptDownPrj[4], arptDownPrj[4]);
|
||
break;
|
||
case 1:
|
||
if (nEnd1 == 0 || nEnd2 == 0)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[0], arptUpPrj[7], arptUpPrj[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[0], arptDownPrj[7], arptDownPrj[7]);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[8], arptUpPrj[7], arptUpPrj[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[8], arptDownPrj[7], arptDownPrj[7]);
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[7], arptUpPrj[6], arptUpPrj[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[6], arptUpPrj[4], arptUpPrj[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[7], arptDownPrj[6], arptDownPrj[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[6], arptDownPrj[4], arptDownPrj[4]);
|
||
break;
|
||
case 2:
|
||
if (nEnd1 == 0 || nEnd2 == 0)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[0], arptUpPrj[1], arptUpPrj[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[0], arptDownPrj[1], arptDownPrj[1]);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[8], arptUpPrj[1], arptUpPrj[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[8], arptDownPrj[1], arptDownPrj[1]);
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[1], arptUpPrj[2], arptUpPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptUpPrj[4], arptUpPrj[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[1], arptDownPrj[2], arptDownPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[2], arptDownPrj[4], arptDownPrj[4]);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
// 上下两边
|
||
if (bJudge)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[nEnd2], arptDownPrj[nEnd2], arptDownPrj[nEnd2]);
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[nEnd1], arptUpPrj[nEnd1], arptUpPrj[nEnd1]);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[nEnd1], arptUpPrj[nEnd1], arptUpPrj[nEnd1]);
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[nEnd2], arptDownPrj[nEnd2], arptDownPrj[nEnd2]);
|
||
}
|
||
}
|
||
else if (AecHvac::eArcuateIntubBranch == eType)
|
||
{
|
||
// 计算投影内部线条构成
|
||
AcGePoint3d ptVertex = arptTranseform[nEnd1];
|
||
BOOL bJudge = TRUE;
|
||
if (arptTranseform[nEnd2].distanceTo(arptTranseform[3])
|
||
< arptTranseform[nEnd1].distanceTo(arptTranseform[3]))
|
||
{
|
||
ptVertex = arptTranseform[nEnd2];
|
||
bJudge = FALSE;
|
||
}
|
||
int iMark = 0;
|
||
if (ptVertex.distanceTo(arptTranseform[8])
|
||
< ptVertex.distanceTo(arptTranseform[1]))
|
||
{
|
||
iMark = 1;
|
||
}
|
||
else if (ptVertex.distanceTo(arptTranseform[8])
|
||
> ptVertex.distanceTo(arptTranseform[1]))
|
||
{
|
||
iMark = 2;
|
||
}
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
switch(iMark)
|
||
{
|
||
case 0:
|
||
if (nEnd1 == 0 || nEnd2 == 0)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[0], arptUpPrj[1], arptUpPrj[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[0], arptDownPrj[1], arptDownPrj[1]);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[9], arptUpPrj[1], arptUpPrj[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[9], arptDownPrj[1], arptDownPrj[1]);
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[1], arptUpPrj[2], arptUpPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptUpPrj[4], arptUpPrj[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[1], arptDownPrj[2], arptDownPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[2], arptDownPrj[4], arptDownPrj[4]);
|
||
break;
|
||
case 1:
|
||
if (nEnd1 == 0 || nEnd2 == 0)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[0], arptUpPrj[8], arptUpPrj[8]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[0], arptDownPrj[8], arptDownPrj[8]);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[9], arptUpPrj[8], arptUpPrj[8]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[9], arptDownPrj[8], arptDownPrj[8]);
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[8], arptUpPrj[7], arptUpPrj[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[7], arptUpPrj[4], arptUpPrj[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[8], arptDownPrj[7], arptDownPrj[7]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[7], arptDownPrj[4], arptDownPrj[4]);
|
||
break;
|
||
case 2:
|
||
if (nEnd1 == 0 || nEnd2 == 0)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[0], arptUpPrj[1], arptUpPrj[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[0], arptDownPrj[1], arptDownPrj[1]);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[8], arptUpPrj[1], arptUpPrj[1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[8], arptDownPrj[1], arptDownPrj[1]);
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[1], arptUpPrj[2], arptUpPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptUpPrj[4], arptUpPrj[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[1], arptDownPrj[2], arptDownPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[2], arptDownPrj[4], arptDownPrj[4]);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
// 上下两边
|
||
if (bJudge)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[nEnd2], arptDownPrj[nEnd2], arptDownPrj[nEnd2]);
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[nEnd1], arptUpPrj[nEnd1], arptUpPrj[nEnd1]);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[nEnd1], arptUpPrj[nEnd1], arptUpPrj[nEnd1]);
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[nEnd2], arptDownPrj[nEnd2], arptDownPrj[nEnd2]);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[nEnd1], arptUpPrj[nEnd2], arptUpPrj[nEnd2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[nEnd2], arptDownPrj[nEnd1], arptDownPrj[nEnd1]);
|
||
|
||
AcGePoint3d ptEnd1;
|
||
Midpoint(arptUpPrj[nEnd1], arptDownPrj[nEnd1], ptEnd1);
|
||
AcGePoint3d ptEnd2;
|
||
Midpoint(arptUpPrj[nEnd2], arptDownPrj[nEnd2], ptEnd2);
|
||
if (ptEnd1.distanceTo(ptBran) < ptEnd2.distanceTo(ptBran))
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[nEnd2], arptDownPrj[nEnd2], arptDownPrj[nEnd2]);
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[nEnd1], arptUpPrj[nEnd1], arptUpPrj[nEnd1]);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[nEnd1], arptUpPrj[nEnd1], arptUpPrj[nEnd1]);
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[nEnd2], arptDownPrj[nEnd2], arptDownPrj[nEnd2]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/* 常规三通正垂直对应点图
|
||
|
||
// 0━━━━━━━━━8━━━━━━━7 A━━━━━━━━━━━━━━━B
|
||
// ┃ ┃ ┃ ┃ ┃ ┃
|
||
// ┃ ┃ ┃ ┃ ┃ ┃
|
||
// ━━━━━━━━━━━━━━━━━ ┃ · ┃ ┃ ┃
|
||
// ┃ ┃ ┃ ┃ ┃ ┃ ┃
|
||
// ┃ ┃ ┃ ┃ ┃ ┃ ┃
|
||
// 1━━━━━2 ┃ 5━━━━6 C━━━━━━━━━━━━━━━D
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 3━━━━━4
|
||
*/
|
||
BOOL ImpHvacTee::MakeRectFaceVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn, BOOL bIntub /*= FALSE*/ ) const
|
||
{
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
// 绘制基准面,不在此面上的点都投影到此面上
|
||
AcGePlane planStd = GetStdPrjPlan(ptStart);
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
tCurveEle.bHided = FALSE;
|
||
tCurveEle.dWidth = 0.0;
|
||
tCurveEle.gsMark = 0;
|
||
|
||
// 找出单线外部点索引
|
||
AcGePoint3dArray arptBase;
|
||
arptBase.append(ptStart.orthoProject(planStd));
|
||
arptBase.append(ptEnd.orthoProject(planStd));
|
||
arptBase.append(ptBran.orthoProject(planStd));
|
||
int nBaseEn1(0), nBaseEn2(0);
|
||
GetEndPointIndex(arptBase, nBaseEn1, nBaseEn2);
|
||
|
||
//单线模式
|
||
if (IsSingleLine())
|
||
{
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptBase[nBaseEn1], arptBase[nBaseEn2], arptBase[nBaseEn2]);
|
||
|
||
return TRUE;
|
||
}
|
||
else
|
||
{
|
||
AcGePoint3dArray arptDown, arptUp;
|
||
GetTwoSideKeyPt(arptUp, arptDown);
|
||
if (arptUp.length() < 2 || arptDown.length() < 2)
|
||
{
|
||
return FALSE;
|
||
}
|
||
AcGePoint3dArray arptUpPrj, arptDownPrj;
|
||
int i(0);
|
||
for (i = 0; i < arptUp.length() && i < arptDown.length(); i++)
|
||
{
|
||
arptUpPrj.append(arptUp[i].orthoProject(planStd));
|
||
arptDownPrj.append(arptDown[i].orthoProject(planStd));
|
||
}
|
||
|
||
if (1 == nOutOrIn)
|
||
{
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtUcsZ = pDb->ucsxdir().crossProduct(pDb->ucsydir());
|
||
if (BranVect().angleTo(vtUcsZ) < PI * 0.51)
|
||
{
|
||
// 添加非中心线的内部线条
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AecHvac::HvacTeeType eType;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
if (AecHvac::eInsertBranch == eType || eType == AecHvac::eInsertIntubBranch)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptDownPrj[2], arptDownPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[4], arptDownPrj[4], arptDownPrj[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[5], arptDownPrj[5], arptDownPrj[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptUpPrj[3], arptUpPrj[3]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[3], arptUpPrj[5], arptUpPrj[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[2], arptDownPrj[3], arptDownPrj[3]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[3], arptDownPrj[5], arptDownPrj[5]);
|
||
}
|
||
else if (AecHvac::eInclineBranch == eType)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptDownPrj[2], arptDownPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[4], arptDownPrj[4], arptDownPrj[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[5], arptDownPrj[5], arptDownPrj[5]);
|
||
}
|
||
else if (AecHvac::eOrthoBranch == eType)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[3], arptDownPrj[3], arptDownPrj[3]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[4], arptDownPrj[4], arptDownPrj[4]);
|
||
}
|
||
else if (AecHvac::eVShapeBranch == eType)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[3], arptDownPrj[3], arptDownPrj[3]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[4], arptDownPrj[4], arptDownPrj[4]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[9], arptDownPrj[9], arptDownPrj[9]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[10], arptDownPrj[10], arptDownPrj[10]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[11], arptDownPrj[11], arptDownPrj[11]);
|
||
}
|
||
else if (AecHvac::eYShapeBranch == eType || AecHvac::eTShapeBranch == eType)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptDownPrj[2], arptDownPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[5], arptDownPrj[5], arptDownPrj[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[6], arptDownPrj[6], arptDownPrj[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[9], arptDownPrj[9], arptDownPrj[9]);
|
||
}
|
||
else if (AecHvac::eArcuateBranch == eType)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptDownPrj[2], arptDownPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[5], arptDownPrj[5], arptDownPrj[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[6], arptDownPrj[6], arptDownPrj[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[9], arptDownPrj[9], arptDownPrj[9]);
|
||
}
|
||
else if (AecHvac::eArcuateIntubBranch == eType)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptDownPrj[2], arptDownPrj[2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[5], arptDownPrj[5], arptDownPrj[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[6], arptDownPrj[6], arptDownPrj[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[9], arptDownPrj[9], arptDownPrj[9]);
|
||
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[2], arptUpPrj[5], arptUpPrj[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[5], arptUpPrj[6], arptUpPrj[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[6], arptUpPrj[9], arptUpPrj[9]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[2], arptDownPrj[5], arptDownPrj[5]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[5], arptDownPrj[6], arptDownPrj[6]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[6], arptDownPrj[9], arptDownPrj[9]);
|
||
}
|
||
}
|
||
|
||
// 中心线
|
||
if (IsBaseLine())
|
||
{
|
||
tCurveEle.dWidth = GetCentLineWidth();
|
||
tCurveEle.idSubLay = m_idCenterLayer;
|
||
AutoAppendPt(cplCurve, tCurveEle, arptBase[nBaseEn1], arptBase[nBaseEn2], arptBase[nBaseEn2]);
|
||
}
|
||
}
|
||
else if (0 == nOutOrIn)
|
||
{
|
||
AcGePoint3dArray arptMiddlePlane;
|
||
GetSectMidKeyPt(arptMiddlePlane);
|
||
AcGePoint3dArray arptGetIdx;
|
||
for (int iGetIdx = 0; iGetIdx < arptMiddlePlane.length(); ++iGetIdx)
|
||
{
|
||
arptGetIdx.append(arptMiddlePlane[iGetIdx].orthoProject(planStd));
|
||
}
|
||
int iEnd1 = 0;
|
||
int iEnd2 = 0;
|
||
AcGeVector3d vtRangeDir = StartVect();
|
||
GetEndPointIndex(arptGetIdx, iEnd1, iEnd2, &vtRangeDir);
|
||
|
||
tCurveEle.dWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[iEnd1], arptUpPrj[iEnd2], arptUpPrj[iEnd2]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptDownPrj[iEnd1], arptDownPrj[iEnd2], arptDownPrj[iEnd2]);
|
||
|
||
if (!bIntub)
|
||
{
|
||
tCurveEle.dWidth = GetEndLineWidth();
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[iEnd1], arptDownPrj[iEnd1], arptDownPrj[iEnd1]);
|
||
AutoAppendPt(cplCurve, tCurveEle, arptUpPrj[iEnd2], arptDownPrj[iEnd2], arptDownPrj[iEnd2]);
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeOrthoCircleHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInsertCircleHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInsertCirPts(arPts))
|
||
return FALSE;
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
double dEndLineWidth = GetEndLineWidth();
|
||
double dWidth = GetEdgeLineWidth();
|
||
AcDbObjectId idEnd = AcDbObjectId::kNull;
|
||
m_pXDataMap->GetAt(HVAC_EndLayer, idEnd);
|
||
if (IsSingleLine() || (IsBaseLine() && nOutOrIn == 1))
|
||
{
|
||
if (!IsSingleLine())
|
||
{
|
||
AcDbObjectId idCenter;// = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
||
tCurveEle.idSubLay = idCenter;
|
||
|
||
dWidth = GetCentLineWidth();
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[1], arPts[12], arPts[12], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[7], arPts[12], arPts[12], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[4], arPts[12], arPts[12], dWidth);
|
||
}
|
||
else if (0 == nOutOrIn)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[0], arPts[5], arPts[5], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[3], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[6], arPts[6], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[8], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[2], arPts[2], dWidth);
|
||
// change by zh 圆形等径三通二维显示特殊处理
|
||
//AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[11], arPts[10], dWidth);
|
||
ESection eSect = eRect;
|
||
AecHvac::HvacTeeType eType = AecHvac::eOrthoBranch;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect);
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
double dStaWidth(0.0), dEndWidth(0.0), dBranWidth(0.0);
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStaWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
if (eSect == eCircle && eType == AecHvac::eOrthoBranch)
|
||
{
|
||
if (fabs(dStaWidth - dEndWidth) < 1.0E-3 &&
|
||
fabs(dEndWidth - dBranWidth) < 1.0E-3 &&
|
||
fabs(dBranWidth - dStaWidth) < 1.0E-3)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[12], arPts[12], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[12], arPts[12], dWidth);
|
||
}
|
||
else
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[11], arPts[10], dWidth);
|
||
}
|
||
else
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[11], arPts[10], dWidth);
|
||
//
|
||
tCurveEle.idSubLay = idEnd;
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[0], arPts[2], arPts[2], dEndLineWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[3], arPts[5], arPts[5], dEndLineWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[6], arPts[8], arPts[8], dEndLineWidth);
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
// 圆形截面三通,倾斜放置下,椭圆端线画法,供所有三通2D绘制函数使用
|
||
// 此函数只画各管端部的椭圆投影线
|
||
BOOL ImpHvacTee::GetAllIncCircleEndEdge2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn,
|
||
BOOL bDrawSta/* = TRUE*/, BOOL bDrawEnd/* = TRUE*/, BOOL bDrawBran/* = TRUE*/) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
// 使用三通数据
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
AcGeVector3d vtStart, vtEnd, vtBran, vtDir, vtZAxis(TAuxTools::GetUcsZvt());
|
||
double dStartWidth(200.0), dEndWidth(200.0), dBranWidth(200.0);
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
|
||
int i(0), iRes(-1);
|
||
AcGePoint3dArray arPtsEdge;
|
||
AcDbPolyline* pLine = new AcDbPolyline;
|
||
if (NULL == pLine)
|
||
return FALSE;
|
||
|
||
// 曲线元素
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
// 边线宽
|
||
double dEndLineWidth = GetEndLineWidth();
|
||
// 边线图层
|
||
AcDbObjectId idEnd = AcDbObjectId::kNull;
|
||
m_pXDataMap->GetAt(HVAC_EndLayer, idEnd);
|
||
tCurveEle.dWidth = dEndLineWidth;
|
||
tCurveEle.idSubLay = idEnd;
|
||
// 不是单线风管的情况下,才画内轮廓线
|
||
if (1 == nOutOrIn && !IsSingleLine())
|
||
{
|
||
// 只画高的一端的内轮廓线
|
||
if (ptStart.z > ptEnd.z)
|
||
{
|
||
// 起点端内轮廓线
|
||
if (bDrawSta)
|
||
{
|
||
iRes = TAuxTools::GetEllipsePtsFromCircle(arPtsEdge, ptStart, dStartWidth, -vtStart, vtZAxis, *pLine, -vtStart);
|
||
if (-1 != iRes)
|
||
{
|
||
for (i = 0; i < arPtsEdge.length()-1; i++)//Lixl modify 2011-11-23
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsEdge[i], arPtsEdge[i+1], arPtsEdge[i+1], dEndLineWidth);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// 终点端内轮廓线
|
||
if (bDrawEnd)
|
||
{
|
||
iRes = TAuxTools::GetEllipsePtsFromCircle(arPtsEdge, ptEnd, dEndWidth, vtEnd, vtZAxis, *pLine, -vtEnd);
|
||
if (-1 != iRes)
|
||
{
|
||
for (i = 0; i < arPtsEdge.length()-1; i++)//Lixl modify 2011-11-23
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsEdge[i], arPtsEdge[i+1], arPtsEdge[i+1], dEndLineWidth);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 支管端内轮廓线
|
||
if (bDrawBran)
|
||
{
|
||
pLine->reset(Adesk::kFalse, i);
|
||
arPtsEdge.setLogicalLength(0);
|
||
if (ptBran.z > ptStart.z)
|
||
{
|
||
iRes = TAuxTools::GetEllipsePtsFromCircle(arPtsEdge, ptBran, dBranWidth, vtBran, vtZAxis, *pLine, -vtBran);
|
||
if (-1 != iRes)
|
||
{
|
||
for (i = 0; i < arPtsEdge.length()-1; i++)//Lixl modify 2011-11-23
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsEdge[i], arPtsEdge[i+1], arPtsEdge[i+1], dEndLineWidth);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (0 == nOutOrIn)
|
||
{
|
||
// 起点端外轮廓线
|
||
if (bDrawSta)
|
||
{
|
||
iRes = TAuxTools::GetEllipsePtsFromCircle(arPtsEdge, ptStart, dStartWidth, vtStart, vtZAxis, *pLine, vtStart);
|
||
if (-1 != iRes)
|
||
{
|
||
for (i = 0; i < arPtsEdge.length()-1; i++)//Lixl modify 2011-11-23
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsEdge[i], arPtsEdge[i+1], arPtsEdge[i+1], dEndLineWidth);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 终点端外轮廓线
|
||
if (bDrawEnd)
|
||
{
|
||
pLine->reset(Adesk::kFalse, i);
|
||
arPtsEdge.setLogicalLength(0);
|
||
iRes = TAuxTools::GetEllipsePtsFromCircle(arPtsEdge, ptEnd, dEndWidth, vtEnd, vtZAxis, *pLine, vtEnd);
|
||
if (-1 != iRes)
|
||
{
|
||
for (i = 0; i < arPtsEdge.length()-1; i++)//Lixl modify 2011-11-23
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsEdge[i], arPtsEdge[i+1], arPtsEdge[i+1], dEndLineWidth);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 支管端外轮廓线
|
||
if (bDrawBran)
|
||
{
|
||
pLine->reset(Adesk::kFalse, i);
|
||
arPtsEdge.setLogicalLength(0);
|
||
iRes = TAuxTools::GetEllipsePtsFromCircle(arPtsEdge, ptBran, dBranWidth, vtBran, vtZAxis, *pLine, vtBran);
|
||
if (-1 != iRes)
|
||
{
|
||
for (i = 0; i < arPtsEdge.length()-1; i++)//Lixl modify 2011-11-23
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsEdge[i], arPtsEdge[i+1], arPtsEdge[i+1], dEndLineWidth);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (NULL != pLine)
|
||
delete pLine;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
// 普通样式倾斜三通2D绘制
|
||
BOOL ImpHvacTee::MakeOrthoCircleIncline2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInsertCirPtsOnHidePlan(arPts))
|
||
return FALSE;
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
double dEndLineWidth = GetEndLineWidth();
|
||
double dWidth = GetEdgeLineWidth();
|
||
AcDbObjectId idEnd = AcDbObjectId::kNull;
|
||
m_pXDataMap->GetAt(HVAC_EndLayer, idEnd);
|
||
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, nOutOrIn);
|
||
if (nOutOrIn == 1)
|
||
{
|
||
// 单线,就用端部图层, 双线的话,就修改为中心线图层
|
||
if (!IsSingleLine())
|
||
{
|
||
AcDbObjectId idCenter;// = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
||
tCurveEle.idSubLay = idCenter;
|
||
dWidth = GetCentLineWidth();
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[1], arPts[12], arPts[12], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[7], arPts[12], arPts[12], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[4], arPts[12], arPts[12], dWidth);
|
||
}
|
||
else if (0 == nOutOrIn)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[0], arPts[5], arPts[5], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[3], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[6], arPts[6], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[8], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[2], arPts[2], dWidth);
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInclineCircleHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInclineCirPts(arPts))
|
||
return FALSE;
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
double dEndLineWidth = GetEndLineWidth();
|
||
double dWidth = GetEdgeLineWidth();
|
||
AcDbObjectId idEnd = AcDbObjectId::kNull;
|
||
m_pXDataMap->GetAt(HVAC_EndLayer, idEnd);
|
||
if (IsSingleLine() || (IsBaseLine() && nOutOrIn == 1))
|
||
{
|
||
if (!IsSingleLine())
|
||
{
|
||
AcDbObjectId idCenter;// = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
||
tCurveEle.idSubLay = idCenter;
|
||
|
||
dWidth = GetCentLineWidth();
|
||
}
|
||
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[1], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[7], arPts[16], arPts[16], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[4], arPts[13], arPts[13], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[16], arPts[16], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[13], arPts[13], dWidth);
|
||
}
|
||
else if (0 == nOutOrIn)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[2], arPts[11], arPts[11], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[11], arPts[15], arPts[15], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[15], arPts[6], arPts[6], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[8], arPts[17], arPts[17], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[17], arPts[18], arPts[18], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[18], arPts[12], arPts[12], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[12], arPts[3], arPts[3], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[5], arPts[14], arPts[14], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[14], arPts[9], arPts[9], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[0], arPts[0], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[1], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[18], arPts[18], dWidth);
|
||
tCurveEle.idSubLay = idEnd;
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[0], arPts[2], arPts[2], dEndLineWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[3], arPts[5], arPts[5], dEndLineWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[6], arPts[8], arPts[8], dEndLineWidth);
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInclineCircleInc2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInclineCirPts2d(arPts))
|
||
return FALSE;
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
AcGeVector3d vtStart, vtEnd, vtBran, vtDir, vtZAxis(TAuxTools::GetUcsZvt()), vtNor(normal());
|
||
double dStartWidth(0.0), dEndWidth(0.0), dBranWidth(0.0), dPlusEdge(0.0);
|
||
AecHvac::HvacTeeType eTeeType = AecHvac::eOrthoBranch;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eTeeType);
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge);
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
|
||
// 投影面
|
||
AcGePlane plan(TAuxTools::Mid(ptStart, ptEnd), vtZAxis);
|
||
// 尾管端线曲线
|
||
AcGeCircArc3d arc1, arc2, arc3;
|
||
// 支管边线曲线
|
||
AcGeLineSeg3d seg1, seg2;
|
||
AcGePoint3d ptBranU, ptBranD, ptCenU, ptCenD, ptSU, ptSD, ptED, ptEU, ptInter;
|
||
ptSD = arPts[2].orthoProject(plan);
|
||
ptSU = arPts[0].orthoProject(plan);
|
||
ptED = arPts[3].orthoProject(plan);
|
||
ptEU = arPts[5].orthoProject(plan);
|
||
ptBranD = arPts[6].orthoProject(plan);
|
||
ptBranU = arPts[8].orthoProject(plan);
|
||
ptCenD = arPts[18].orthoProject(plan);
|
||
ptCenU = arPts[20].orthoProject(plan);
|
||
|
||
AcGePoint3dArray arPtEdge;
|
||
AcDbPolyline *pLine = new AcDbPolyline;
|
||
if (NULL == pLine)
|
||
return FALSE;
|
||
vtDir = ptEnd - ptStart;
|
||
int iRes(0), i(0);
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
double dEndLineWidth = GetEndLineWidth();
|
||
double dWidth = GetEdgeLineWidth();
|
||
AcDbObjectId idEnd = AcDbObjectId::kNull;
|
||
m_pXDataMap->GetAt(HVAC_EndLayer, idEnd);
|
||
|
||
if (nOutOrIn == 1)
|
||
{
|
||
if (!IsSingleLine())
|
||
{
|
||
AcDbObjectId idCenter;// = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
||
tCurveEle.idSubLay = idCenter;
|
||
|
||
dWidth = GetCentLineWidth();
|
||
}
|
||
|
||
// 画中心线
|
||
if (IsBaseLine())
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[1], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[7], arPts[16], arPts[16], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[4], arPts[13], arPts[13], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[16], arPts[16], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[13], arPts[13], dWidth);
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, nOutOrIn);
|
||
}
|
||
}
|
||
else if (0 == nOutOrIn)
|
||
{
|
||
// 普通倾斜斜接三通
|
||
if (!(vtNor.isPerpendicularTo(TAuxTools::GetUcsZvt())))
|
||
{
|
||
// 支管边线与主管端线投影后交叉,需按另一种方法画2D线
|
||
if (IsNeedMakeAllCurves(arPts))
|
||
{
|
||
std::vector<AcGeCurve3d*> segComs;
|
||
}
|
||
else
|
||
{
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, nOutOrIn);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[2], arPts[11], arPts[11], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[11], arPts[15], arPts[15], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[15], arPts[6], arPts[6], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[8], arPts[17], arPts[17], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[17], arPts[18], arPts[18], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[18], arPts[12], arPts[12], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[12], arPts[3], arPts[3], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[5], arPts[14], arPts[14], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[14], arPts[9], arPts[9], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[9], arPts[0], arPts[0], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[1], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[18], arPts[18], dWidth);
|
||
}
|
||
}
|
||
}
|
||
if (NULL != pLine)
|
||
delete pLine;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeYShapeCircleHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
return MakeYShapeRectHoriz2DCurves(cplCurve, nOutOrIn);
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeVShapeCircleHoriz2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3dArray arpts;
|
||
GetVShapeCirclePts(arpts);
|
||
|
||
AecEqui::AecCurveElement el;
|
||
memset(&el,0,sizeof(AecEqui::AecCurveElement));
|
||
//外轮廓
|
||
double dEdgeWidth = GetEdgeLineWidth();
|
||
double dCenWidth = GetCentLineWidth();
|
||
double dEndLineWidth = GetEndLineWidth();
|
||
AcDbObjectId idBaseLayer(NULL), idEndLayer(NULL);
|
||
|
||
int nSize = arpts.length() - 1;
|
||
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
|
||
|
||
//外轮廓
|
||
if (0 == nOutOrIn)
|
||
{
|
||
el.dWidth = dEdgeWidth;
|
||
el.ptGe[0] = arpts[1];
|
||
el.ptGe[1] = arpts[16];
|
||
el.ptGe[2] = arpts[16];
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = arpts[16];
|
||
el.ptGe[1] = arpts[2];
|
||
el.ptGe[2] = arpts[2];
|
||
cplCurve.append(el);
|
||
for (int i = 2; i < 5; i++)
|
||
{
|
||
if (i != 3)
|
||
{
|
||
el.ptGe[0] = arpts[i];
|
||
el.ptGe[1] = arpts[i + 1];
|
||
el.ptGe[2] = arpts[i + 1];
|
||
cplCurve.append(el);
|
||
}
|
||
}
|
||
el.ptGe[0] = arpts[5];
|
||
el.ptGe[1] = arpts[17];
|
||
el.ptGe[2] = arpts[17];
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = arpts[17];
|
||
el.ptGe[1] = arpts[6];
|
||
el.ptGe[2] = arpts[6];
|
||
cplCurve.append(el);
|
||
|
||
el.ptGe[0] = arpts[7];
|
||
el.ptGe[1] = arpts[8];
|
||
el.ptGe[2] = arpts[8];
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = arpts[8];
|
||
el.ptGe[1] = arpts[9];
|
||
el.ptGe[2] = arpts[9];
|
||
cplCurve.append(el);
|
||
|
||
el.idSubLay = idEndLayer;
|
||
el.dWidth = dEndLineWidth;
|
||
el.ptGe[0] = arpts[0];
|
||
el.ptGe[1] = arpts[1];
|
||
el.ptGe[2] = arpts[1];
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = arpts[3];
|
||
el.ptGe[1] = arpts[4];
|
||
el.ptGe[2] = arpts[4];
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = arpts[6];
|
||
el.ptGe[1] = arpts[7];
|
||
el.ptGe[2] = arpts[7];
|
||
cplCurve.append(el);
|
||
}
|
||
else if (1 == nOutOrIn)
|
||
{
|
||
BOOL bHasBaseLine = FALSE;
|
||
m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine);
|
||
if (bHasBaseLine || IsSingleLine())
|
||
{
|
||
el.gsMark = -1;
|
||
if (IsSingleLine())
|
||
el.dWidth = dEdgeWidth;
|
||
else
|
||
el.dWidth = dCenWidth;
|
||
el.ptGe[0] = arpts[13];
|
||
el.ptGe[1] = arpts[8];
|
||
el.ptGe[2] = arpts[8];
|
||
cplCurve.append(el);
|
||
|
||
el.ptGe[0] = arpts[12];
|
||
el.ptGe[1] = arpts[13];
|
||
el.ptGe[2] = arpts[13];
|
||
cplCurve.append(el);
|
||
|
||
el.ptGe[0] = arpts[13];
|
||
el.ptGe[1] = arpts[10];
|
||
el.ptGe[2] = arpts[10];
|
||
cplCurve.append(el);
|
||
|
||
el.ptGe[0] = arpts[13];
|
||
el.ptGe[1] = arpts[11];
|
||
el.ptGe[2] = arpts[11];
|
||
cplCurve.append(el);
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeOrthoCircleSideVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInsertCircleSideVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInsertCirPts(arPts))
|
||
return FALSE;
|
||
|
||
double dStartWidth = 0.0;
|
||
double dBranWidth = 0.0;
|
||
AcGeVector3d vtNor = normal();
|
||
AcGeVector3d vtBran = AcGeVector3d::kIdentity;
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
|
||
AcGePoint3dArray arPtsV;
|
||
AcGePoint3d ptTmp = AcGePoint3d::kOrigin;
|
||
ptTmp = arPts[0];
|
||
ptTmp.z = arPts[7].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[1];
|
||
ptTmp.z = arPts[7].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[2];
|
||
ptTmp.z = arPts[7].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[7];
|
||
arPtsV.append(ptTmp);
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
|
||
// 主管圆
|
||
double dEdgeWidth = GetEdgeLineWidth();
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[1] - vtNor * dStartWidth * 0.5, arPtsV[2], arPtsV[1] + vtNor * dStartWidth * 0.5, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[1] - vtNor * dStartWidth * 0.5, arPtsV[0], arPtsV[1] + vtNor * dStartWidth * 0.5, dEdgeWidth);
|
||
|
||
// 支管直段
|
||
if (dStartWidth - dBranWidth > 0.0001)
|
||
{
|
||
AcGePoint3d ptIntersect1,ptIntersect2;
|
||
//求出直线于圆弧的交点
|
||
AcGeCircArc3d circArc(arPtsV[0], arPtsV[1] - vtNor * dStartWidth * 0.5, arPtsV[2]);
|
||
//定义求交直线
|
||
AcGeLine3d *pLine = new AcGeLine3d(arPtsV[3] - vtNor * dBranWidth * 0.5, arPtsV[1] - vtNor * dBranWidth * 0.5);
|
||
int nNum=0;//交点数
|
||
circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2);
|
||
delete pLine;
|
||
if (2 == nNum)
|
||
{
|
||
AcGePoint3d ptGeTmp = arPtsV[3] - vtNor * dBranWidth * 0.5;
|
||
if (ptGeTmp.distanceTo(ptIntersect1) < ptGeTmp.distanceTo(ptIntersect2))
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] - vtNor * dBranWidth * 0.5, ptIntersect1, ptIntersect1, dEdgeWidth);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] - vtNor * dBranWidth * 0.5, ptIntersect2, ptIntersect2, dEdgeWidth);
|
||
}
|
||
}
|
||
|
||
AcGeCircArc3d circArc1(arPtsV[0], arPtsV[1] + vtNor * dStartWidth * 0.5, arPtsV[2]);
|
||
pLine = new AcGeLine3d(arPtsV[3] + vtNor * dBranWidth * 0.5, arPtsV[1] + vtNor * dBranWidth * 0.5);
|
||
nNum = 0;
|
||
circArc1.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2);
|
||
delete pLine;
|
||
if (2 == nNum)
|
||
{
|
||
AcGePoint3d ptGeTmp = arPtsV[3] + vtNor * dBranWidth * 0.5;
|
||
if (ptGeTmp.distanceTo(ptIntersect1) < ptGeTmp.distanceTo(ptIntersect2))
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] + vtNor * dBranWidth * 0.5, ptIntersect1, ptIntersect1, dEdgeWidth);
|
||
}
|
||
else
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] + vtNor * dBranWidth * 0.5, ptIntersect2, ptIntersect2, dEdgeWidth);
|
||
}
|
||
}
|
||
}
|
||
else if (fabs(dStartWidth - dBranWidth) < 0.0001)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] - vtNor * dBranWidth * 0.5,
|
||
arPtsV[1] - vtNor * dStartWidth * 0.5, arPtsV[1] - vtNor * dStartWidth * 0.5, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] + vtNor * dBranWidth * 0.5,
|
||
arPtsV[1] + vtNor * dStartWidth * 0.5, arPtsV[1] + vtNor * dStartWidth * 0.5, dEdgeWidth);
|
||
}
|
||
|
||
// 支管弧段
|
||
AcDbPolyline pPolyLine;
|
||
int iRes = TAuxTools::GetEllipseFromCircle(arPtsV[3], dBranWidth, vtBran, vtZAxis, pPolyLine, arPtsV[3] - arPtsV[1]);
|
||
|
||
if (iRes == 2 || iRes == 0)
|
||
{
|
||
AcGePoint3dArray arPtsEll;
|
||
TAuxTools::GetArcPoint(pPolyLine, arPtsEll);//Lixl add 2011-11-23
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] + vtNor * dBranWidth * 0.5,
|
||
arPtsEll[3], arPtsV[3] - vtNor * dBranWidth * 0.5, dEdgeWidth);
|
||
}
|
||
else if (iRes == 1)
|
||
{
|
||
tCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] + vtNor * dBranWidth * 0.5,
|
||
arPtsV[3] - vtNor * dBranWidth * 0.5, arPtsV[3] - vtNor * dBranWidth * 0.5, GetEndLineWidth());
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInclineCircleSideVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInclineCirPts(arPts))
|
||
return FALSE;
|
||
|
||
double dStartWidth = 0.0;
|
||
double dBranWidth = 0.0;
|
||
AcGeVector3d vtNor = normal();
|
||
AcGeVector3d vtBran = AcGeVector3d::kIdentity;
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
|
||
AcGePoint3dArray arPtsV;
|
||
AcGePoint3d ptTmp = AcGePoint3d::kOrigin;
|
||
ptTmp = arPts[0];
|
||
ptTmp.z = arPts[7].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[1];
|
||
ptTmp.z = arPts[7].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[2];
|
||
ptTmp.z = arPts[7].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[16];
|
||
ptTmp.z = arPts[7].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[7];
|
||
arPtsV.append(ptTmp);
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
|
||
AcGePoint3d pt1, pt2;
|
||
// 支管直段
|
||
double dEdgeWidth = GetEdgeLineWidth();
|
||
if (dStartWidth - dBranWidth > 0.0001)
|
||
{
|
||
AcGePoint3d ptIntersect1,ptIntersect2;
|
||
//求出直线于圆弧的交点
|
||
AcGeCircArc3d circArc(arPtsV[0], arPtsV[1] - vtNor * dStartWidth * 0.5, arPtsV[2]);
|
||
//定义求交直线
|
||
AcGeLine3d *pLine = new AcGeLine3d(arPtsV[3] - vtNor * dBranWidth * 0.5, arPtsV[1] - vtNor * dStartWidth * 0.5);
|
||
int nNum=0;//交点数
|
||
circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2);
|
||
delete pLine;
|
||
if (2 == nNum)
|
||
{
|
||
AcGePoint3d ptGeTmp = arPtsV[3] - vtNor * dBranWidth * 0.5;
|
||
if (ptGeTmp.distanceTo(ptIntersect1) < ptGeTmp.distanceTo(ptIntersect2))
|
||
{
|
||
pt1 = ptIntersect1;
|
||
}
|
||
else
|
||
{
|
||
pt1 = ptIntersect2;
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] - vtNor * dBranWidth * 0.5, pt1, pt1, dEdgeWidth);
|
||
}
|
||
|
||
AcGeCircArc3d circArc1(arPtsV[0], arPtsV[1] + vtNor * dStartWidth * 0.5, arPtsV[2]);
|
||
pLine = new AcGeLine3d(arPtsV[3] + vtNor * dBranWidth * 0.5, arPtsV[1] + vtNor * dStartWidth * 0.5);
|
||
nNum = 0;
|
||
circArc1.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2);
|
||
delete pLine;
|
||
if (2 == nNum)
|
||
{
|
||
AcGePoint3d ptGeTmp = arPtsV[3] + vtNor * dBranWidth * 0.5;
|
||
if (ptGeTmp.distanceTo(ptIntersect1) < ptGeTmp.distanceTo(ptIntersect2))
|
||
{
|
||
pt2 = ptIntersect1;
|
||
}
|
||
else
|
||
{
|
||
pt2 = ptIntersect2;
|
||
}
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] + vtNor * dBranWidth * 0.5, pt2, pt2, dEdgeWidth);
|
||
}
|
||
}
|
||
else if (fabs(dStartWidth - dBranWidth) < 0.0001)
|
||
{
|
||
pt1 = arPtsV[1] - vtNor * dStartWidth * 0.5;
|
||
pt2 = arPtsV[1] + vtNor * dStartWidth * 0.5;
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] - vtNor * dBranWidth * 0.5, pt1, pt1, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] + vtNor * dBranWidth * 0.5, pt2, pt2, dEdgeWidth);
|
||
}
|
||
|
||
// 主管弧段
|
||
AutoAppendPt(cplCurve, tCurveEle, pt1, arPtsV[0], pt2, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, pt1, arPtsV[2], pt2, dEdgeWidth);
|
||
|
||
// 支管弧段
|
||
AcDbPolyline pPolyLine;
|
||
int iRes = TAuxTools::GetEllipseFromCircle(arPtsV[3], dBranWidth, vtBran, vtZAxis, pPolyLine, /*arPtsV[4] - arPtsV[1]*/vtBran);
|
||
|
||
if (iRes == 2 || iRes == 0)
|
||
{
|
||
AcGePoint3dArray arPtsEll;
|
||
TAuxTools::GetArcPoint(pPolyLine, arPtsEll);
|
||
|
||
for(int i = 0; i < arPtsEll.length()-1; i++)
|
||
{
|
||
tCurveEle.ptGe[0] = arPtsEll[i];
|
||
tCurveEle.ptGe[1] = arPtsEll[i+1];
|
||
tCurveEle.ptGe[2] = arPtsEll[i+1];
|
||
cplCurve.append(tCurveEle);
|
||
}
|
||
}
|
||
else if (iRes == 1)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] + vtNor * dBranWidth * 0.5,
|
||
arPtsV[3] - vtNor * dBranWidth * 0.5, arPtsV[3] - vtNor * dBranWidth * 0.5, dEdgeWidth);
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeYShapeCircleSideVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGePlane planStd =GetStdPrjPlan(ptBran);
|
||
ptStart = ptStart.orthoProject(planStd);
|
||
ptEnd = ptEnd.orthoProject(planStd);
|
||
ptBran = ptBran.orthoProject(planStd);
|
||
|
||
AcGeVector3d vtBran(BranVect());
|
||
AcGeVector3d vtBranPerl = vtBran;
|
||
vtBranPerl.rotateBy(PI * 0.5, TAuxTools::GetUcsZvt());
|
||
|
||
// 求出半径
|
||
double dStartRadius(0.0), dEndRadius(0.0), dBranRadius(0.0);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartRadius);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndRadius);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranRadius);
|
||
dStartRadius *= 0.5;
|
||
dEndRadius *= 0.5;
|
||
dBranRadius *= 0.5;
|
||
|
||
AecEqui::AecCurveElement cCurveEle;
|
||
memset(&cCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
|
||
// 单线模式
|
||
double dEdgeWidth = GetEdgeLineWidth();
|
||
if (IsSingleLine())
|
||
{
|
||
// 离支管点较远点
|
||
double dStartDist = ptStart.distanceTo(ptBran);
|
||
double dEndDist = ptEnd.distanceTo(ptBran);
|
||
AcGePoint3d &ptFar = dStartDist > dEndDist ? ptStart:ptEnd;
|
||
|
||
AutoAppendPt(cplCurve, cCurveEle, ptFar, ptBran, ptBran, dEdgeWidth);
|
||
return TRUE;
|
||
}
|
||
|
||
// 法兰咬边
|
||
double dFlanPlus(0.0);
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dFlanPlus);
|
||
|
||
// 支管端左右点,及法兰左右点
|
||
AcGePoint3d ptBranLeft = ptBran - dBranRadius * vtBranPerl;
|
||
AcGePoint3d ptBranRight = ptBran + dBranRadius * vtBranPerl;
|
||
AcGePoint3d ptBranLeftFlan = ptBranLeft - dFlanPlus * vtBran;
|
||
AcGePoint3d ptBranRightFlan = ptBranRight - dFlanPlus * vtBran;
|
||
|
||
// 首尾较大管径对应值及点
|
||
double &dBigDia = dStartRadius > dEndRadius ? dStartRadius:dEndRadius;
|
||
AcGePoint3d &ptBig = dStartRadius > dEndRadius ? ptStart:ptEnd;
|
||
|
||
if (nOutOrIn == 0)
|
||
{
|
||
AcGePoint3d ptUpLeft = ptBig - dBigDia * vtBranPerl;
|
||
AcGePoint3d ptUpRight = ptBig + dBigDia * vtBranPerl;
|
||
AcGePoint3d ptOutArc = ptBig - dBigDia * vtBran;
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranRight, ptBranRightFlan, ptBranRightFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranRightFlan, ptUpRight, ptUpRight, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptUpRight, ptOutArc, ptUpLeft, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptUpLeft, ptBranLeftFlan, ptBranLeftFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranLeftFlan, ptBranLeft, ptBranLeft, dEdgeWidth);
|
||
|
||
cCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranLeft, ptBranRight, ptBranRight, GetEndLineWidth());
|
||
}
|
||
else if (nOutOrIn == 1)
|
||
{
|
||
// 首尾较小管径对应值及点
|
||
double &dSmallDia = dStartRadius < dEndRadius ? dStartRadius:dEndRadius;
|
||
AcGePoint3d &ptSmall = dStartRadius < dEndRadius ? ptStart:ptEnd;
|
||
|
||
// 小圆
|
||
AcGePoint3d ptUpLeft = ptSmall - dSmallDia * vtBranPerl;
|
||
AcGePoint3d ptUpRight = ptSmall + dSmallDia * vtBranPerl;
|
||
AcGePoint3d ptOutArc = ptSmall - dSmallDia * vtBran;
|
||
AcGePoint3d ptInArc = ptSmall + dSmallDia * vtBran;
|
||
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranRight, ptBranRightFlan, ptBranRightFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranRightFlan, ptUpRight, ptUpRight, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptUpRight, ptOutArc, ptUpLeft, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptUpLeft, ptBranLeftFlan, ptBranLeftFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranLeftFlan, ptBranLeft, ptBranLeft, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranLeftFlan, ptBranRightFlan, ptBranRightFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptUpLeft, ptInArc, ptUpRight, dEdgeWidth);
|
||
|
||
// 半个大圆
|
||
ptUpLeft = ptBig - dBigDia * vtBranPerl;
|
||
ptUpRight = ptBig + dBigDia * vtBranPerl;
|
||
ptInArc = ptBig + dBigDia * vtBran;
|
||
AutoAppendPt(cplCurve, cCurveEle, ptUpLeft, ptInArc, ptUpRight, dEdgeWidth);
|
||
|
||
// 中心线
|
||
if (IsBaseLine())
|
||
{
|
||
AcDbObjectId idCenter;// = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
||
cCurveEle.idSubLay = idCenter;
|
||
|
||
// 离支管点较远点
|
||
double dStartDist = ptStart.distanceTo(ptBran);
|
||
double dEndDist = ptEnd.distanceTo(ptBran);
|
||
AcGePoint3d &ptFar = dStartDist > dEndDist ? ptStart:ptEnd;
|
||
|
||
double dCentWidth = GetCentLineWidth();
|
||
AutoAppendPt(cplCurve, cCurveEle, ptFar, ptBran, ptBran, dCentWidth);
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeVShapeCircleSideVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
// 获得UCS坐标Z向量
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
AcGeVector3d vtNormal(normal());
|
||
AcGeVector3d vtNormalSide = vtNormal;
|
||
vtNormalSide.rotateBy(PI*0.5, vtZAxis);
|
||
double dStartWidth(0.0), dEndWidth(0.0), dBranWidth(0.0),dPlusEdge(50.0);
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge);
|
||
|
||
AcGePoint3dArray arpts;
|
||
GetVShapeCirclePts(arpts);
|
||
|
||
AcDbObjectId idBaseLayer(NULL), idSideLayer(NULL);
|
||
int nHasBaseLine = 1;
|
||
idBaseLayer;// = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
||
m_pXDataMap->GetAt(HVAC_HasBaseLine, nHasBaseLine);
|
||
AecEqui::AecCurveElement el;
|
||
memset(&el,0,sizeof(AecEqui::AecCurveElement));
|
||
int nRet = -1;
|
||
AcGePoint3d ptS,ptSU,ptSD,ptBase,ptBaseL,ptBaseR,ptBaseLU,ptBaseRU;
|
||
ptBase = arpts[12];
|
||
ptS = arpts[10];
|
||
ptS.z = ptBase.z;
|
||
ptBaseL = ptBase + vtNormal * dBranWidth * 0.5 ;
|
||
ptBaseR = ptBase - vtNormal * dBranWidth * 0.5 ;
|
||
ptBaseLU = ptBaseL - BranVect() * dPlusEdge ;
|
||
ptBaseRU = ptBaseR - BranVect() * dPlusEdge ;
|
||
if (nOutOrIn == 0)
|
||
{
|
||
el.ptGe[0] = ptBaseL;
|
||
el.ptGe[1] = ptBaseR;
|
||
el.ptGe[2] = ptBaseR;
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = ptBaseL;
|
||
el.ptGe[1] = ptBaseLU;
|
||
el.ptGe[2] = ptBaseLU;
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = ptBaseR;
|
||
el.ptGe[1] = ptBaseRU;
|
||
el.ptGe[2] = ptBaseRU;
|
||
cplCurve.append(el);
|
||
|
||
AcDbPolyline pPolyLine1,pPolyLine2;
|
||
AcGePoint3dArray ptsEll;
|
||
nRet = TAuxTools::GetEllipseFromCircle(ptS, dStartWidth, StartVect(), vtZAxis,
|
||
pPolyLine1,vtNormal);
|
||
if (nRet == 2)
|
||
{
|
||
ptsEll.setLogicalLength(0);
|
||
|
||
TAuxTools::GetArcPoint(pPolyLine1, ptsEll);
|
||
for(int i = 0; i < ptsEll.length()-1; i++)
|
||
{
|
||
el.ptGe[0] = ptsEll[i];
|
||
el.ptGe[1] = ptsEll[i+1];
|
||
el.ptGe[2] = ptsEll[i+1];
|
||
cplCurve.append(el);
|
||
}
|
||
}
|
||
nRet = TAuxTools::GetEllipseFromCircle(ptS, dStartWidth, StartVect(), vtZAxis,
|
||
pPolyLine2,-vtNormal);
|
||
if (nRet == 2)
|
||
{
|
||
ptsEll.setLogicalLength(0);
|
||
|
||
TAuxTools::GetArcPoint(pPolyLine2, ptsEll);
|
||
for(int i = 0; i < ptsEll.length()-1; i++)
|
||
{
|
||
el.ptGe[0] = ptsEll[i];
|
||
el.ptGe[1] = ptsEll[i+1];
|
||
el.ptGe[2] = ptsEll[i+1];
|
||
cplCurve.append(el);
|
||
}
|
||
ptSU = ptsEll.first();
|
||
ptSD = ptsEll.last();
|
||
|
||
el.ptGe[0] = ptSU;
|
||
el.ptGe[1] = ptBaseLU;
|
||
el.ptGe[2] = ptBaseLU;
|
||
cplCurve.append(el);
|
||
|
||
el.ptGe[0] = ptSD;
|
||
el.ptGe[1] = ptBaseRU;
|
||
el.ptGe[2] = ptBaseRU;
|
||
cplCurve.append(el);
|
||
}
|
||
else
|
||
{
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtNorm = normal();
|
||
vtNorm.normalize();
|
||
|
||
//sta
|
||
el.idSubLay = m_idDoubleLayer;
|
||
el.ptGe[0] = ptStart - vtNorm * 0.5 * dStartWidth;
|
||
el.ptGe[1] = ptStart + vtNorm * 0.5 * dStartWidth;
|
||
el.ptGe[2] = el.ptGe[1];
|
||
cplCurve.append(el);
|
||
|
||
//top
|
||
el.ptGe[0] = ptStart - vtNorm * 0.5 * dStartWidth;
|
||
el.ptGe[1] = ptEnd - vtNorm * 0.5 * dEndWidth;
|
||
el.ptGe[2] = el.ptGe[1];
|
||
cplCurve.append(el);
|
||
|
||
//end
|
||
el.ptGe[0] = ptEnd - vtNorm * 0.5 * dStartWidth;
|
||
el.ptGe[1] = ptEnd + vtNorm * 0.5 * dEndWidth;
|
||
el.ptGe[2] = el.ptGe[1];
|
||
cplCurve.append(el);
|
||
|
||
//down
|
||
el.ptGe[0] = ptStart + vtNorm * 0.5 * dStartWidth;
|
||
el.ptGe[1] = ptEnd + vtNorm * 0.5 * dEndWidth;
|
||
el.ptGe[2] = el.ptGe[1];
|
||
cplCurve.append(el);
|
||
|
||
//中心线
|
||
el.ptGe[0] = ptStart;
|
||
el.ptGe[1] = ptEnd;
|
||
el.ptGe[2] = ptEnd;
|
||
el.idSubLay = m_idCenterLayer;//... 图层取
|
||
cplCurve.append(el);
|
||
}
|
||
}
|
||
else if (nOutOrIn == 1)
|
||
{
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeOrthoCircleFaceVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInsertCircleFaceVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInsertCirPts(arPts))
|
||
return FALSE;
|
||
|
||
double dStartWidth = 0.0;
|
||
double dEndWidth = 0.0;
|
||
double dBranWidth = 0.0;
|
||
AcGeVector3d vtNor = normal();
|
||
AcGeVector3d vtBran = AcGeVector3d::kIdentity;
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
|
||
AcGePoint3dArray arPtsV;
|
||
AcGePoint3d ptTmp = AcGePoint3d::kOrigin;
|
||
ptTmp = arPts[2];
|
||
ptTmp.z = arPts[1].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[3];
|
||
ptTmp.z = arPts[1].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[7];
|
||
ptTmp.z = arPts[1].z;
|
||
arPtsV.append(ptTmp);
|
||
|
||
double dDis1 = arPts[6].distanceTo(arPts[9]);
|
||
double dDis2 = arPts[8].distanceTo(arPts[10]);
|
||
dDis1 = dDis1 > dDis2 ? dDis1 : dDis2;
|
||
ptTmp = arPts[7] - vtBran * dDis1;
|
||
ptTmp.z = arPts[1].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[6];
|
||
ptTmp.z = arPts[1].z;
|
||
arPtsV.append(ptTmp);
|
||
ptTmp = arPts[8];
|
||
ptTmp.z = arPts[1].z;
|
||
arPtsV.append(ptTmp);
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
|
||
// 主管
|
||
double dEdgeWidth = GetEdgeLineWidth();
|
||
double dEndLineWidth = GetEndLineWidth();
|
||
AcDbObjectId idEnd = AcDbObjectId::kNull;
|
||
m_pXDataMap->GetAt(HVAC_EndLayer, idEnd);
|
||
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[0] - vtNor * dStartWidth * 0.5,
|
||
arPtsV[1] - vtNor * dEndWidth * 0.5, arPtsV[1] - vtNor * dEndWidth * 0.5, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[0] + vtNor * dStartWidth * 0.5,
|
||
arPtsV[1] + vtNor * dEndWidth * 0.5, arPtsV[1] + vtNor * dEndWidth * 0.5, dEdgeWidth);
|
||
|
||
// 支管
|
||
if (BranVect().angleTo(vtZAxis) < PI * 0.51)
|
||
{
|
||
// 支管直段
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[2] - vtNor * dBranWidth * 0.5,
|
||
arPtsV[3] - vtNor * dBranWidth * 0.5, arPtsV[3] - vtNor * dBranWidth * 0.5, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[2] + vtNor * dBranWidth * 0.5,
|
||
arPtsV[3] + vtNor * dBranWidth * 0.5, arPtsV[3] + vtNor * dBranWidth * 0.5, dEdgeWidth);
|
||
|
||
// 支管椭圆弧
|
||
AcDbPolyline pPolyLine;
|
||
int iRes = TAuxTools::GetEllipseFromCircle(arPtsV[2], dBranWidth, vtBran, vtZAxis, pPolyLine, arPtsV[3] - arPtsV[2]);
|
||
|
||
if (iRes == 2)
|
||
{
|
||
AcGePoint3dArray arPtsEll;
|
||
|
||
TAuxTools::GetArcPoint(pPolyLine, arPtsEll);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[2] + vtNor * dBranWidth * 0.5,
|
||
arPtsEll[3], arPtsV[2] - vtNor * dBranWidth * 0.5, dEdgeWidth);
|
||
AcDbPolyline pPolyLine1;
|
||
iRes = TAuxTools::GetEllipseFromCircle(arPtsV[2], dBranWidth, vtBran, vtZAxis, pPolyLine1, arPtsV[2] - arPtsV[3]);
|
||
if (iRes == 2)
|
||
{
|
||
AcGePoint3dArray arPtsEll1;
|
||
|
||
TAuxTools::GetArcPoint(pPolyLine1, arPtsEll1);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[2] + vtNor * dBranWidth * 0.5,
|
||
arPtsEll1[3], arPtsV[2] - vtNor * dBranWidth * 0.5, dEdgeWidth);
|
||
}
|
||
AcDbPolyline pPolyLine2;
|
||
iRes = TAuxTools::GetEllipseFromCircle(arPtsV[3], dBranWidth, vtBran, vtZAxis, pPolyLine2, arPtsV[3] - arPtsV[2]);
|
||
if (iRes == 2)
|
||
{
|
||
AcGePoint3dArray arPtsEll2;
|
||
|
||
TAuxTools::GetArcPoint(pPolyLine2, arPtsEll2);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[3] + vtNor * dBranWidth * 0.5,
|
||
arPtsEll2[3], arPtsV[3] - vtNor * dBranWidth * 0.5, dEdgeWidth);
|
||
}
|
||
}
|
||
else if (iRes == 0)
|
||
{
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[2] + vtNor * dBranWidth * 0.5,
|
||
arPtsV[4], arPtsV[2] - vtNor * dBranWidth * 0.5, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[2] + vtNor * dBranWidth * 0.5,
|
||
arPtsV[5], arPtsV[2] - vtNor * dBranWidth * 0.5, dEdgeWidth);
|
||
}
|
||
}
|
||
|
||
tCurveEle.idSubLay = idEnd;
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[0] - vtNor * dStartWidth * 0.5,
|
||
arPtsV[0] + vtNor * dStartWidth * 0.5, arPtsV[0] + vtNor * dStartWidth * 0.5, dEndLineWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPtsV[1] - vtNor * dEndWidth * 0.5,
|
||
arPtsV[1] + vtNor * dEndWidth * 0.5, arPtsV[1] + vtNor * dEndWidth * 0.5, dEndLineWidth);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeInclineCircleFaceVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
// 以下是符合攀钢用户要求的表达方式,三通正面垂直放置绘制方法
|
||
AcGePoint3dArray arPts;
|
||
if (!GetInclineCirPts2d(arPts))
|
||
return FALSE;
|
||
|
||
// 3个端点
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
// 3个方向
|
||
AcGeVector3d vtStart, vtEnd, vtBran;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
// 端口宽度,咬口余量
|
||
double dStartWidth(0.0), dEndWidth(0.0), dBranWidth(0.0), dPlusEdge(0.0);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranWidth);
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge);
|
||
// 法向,Z轴
|
||
AcGeVector3d vtNor, vtZAxis;
|
||
vtNor = normal();
|
||
vtZAxis = TAuxTools::GetUcsZvt();
|
||
// 投影面
|
||
AcGePoint3d ptTmp;
|
||
Midpoint(ptStart, ptEnd, ptTmp);
|
||
AcGePlane plan(ptTmp, vtZAxis);
|
||
AcGePoint3d ptOrg = AcGePoint3d::kOrigin.orthoProject(plan);
|
||
plan.set(ptOrg, vtZAxis);
|
||
double dEl = ptOrg.asVector().length();
|
||
if (!ptOrg.asVector().isCodirectionalTo(vtZAxis))
|
||
dEl *= -1;
|
||
|
||
// 3个端口2D下边界点
|
||
AcGePoint3d ptSU, ptSD, ptED, ptEU, ptBranU, ptBranD;
|
||
ptSD = arPts[2].orthoProject(plan);
|
||
ptSU = arPts[0].orthoProject(plan);
|
||
ptED = arPts[3].orthoProject(plan);
|
||
ptEU = arPts[5].orthoProject(plan);
|
||
ptBranD = arPts[6].orthoProject(plan);
|
||
ptBranU = arPts[8].orthoProject(plan);
|
||
|
||
AecEqui::AecCurveElement tCurveEle;
|
||
memset(&tCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
// 实际边线宽
|
||
double dWidth = GetEdgeLineWidth();
|
||
|
||
// 内部线
|
||
if (nOutOrIn == 1)
|
||
{
|
||
if (IsSingleLine())
|
||
{
|
||
// 主管单线
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[1], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[13], arPts[13], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[13], arPts[4], arPts[4], dWidth);
|
||
// 支管单线
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[16], arPts[16], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[16], arPts[7], arPts[7], dWidth);
|
||
}
|
||
else
|
||
{
|
||
// 3个端口内部半个椭圆端线
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, 1);
|
||
|
||
// 是否绘制中心线
|
||
BOOL bBaseLine = FALSE;
|
||
m_pXDataMap->GetAt(HVAC_HasBaseLine, (int&)bBaseLine);
|
||
if (bBaseLine)
|
||
{
|
||
tCurveEle.gsMark = -1;
|
||
|
||
// 设置中心线图层和线宽
|
||
dWidth = GetCentLineWidth();
|
||
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[1], arPts[10], arPts[10], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[13], arPts[13], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[13], arPts[4], arPts[4], dWidth);
|
||
// 支管中心线
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[10], arPts[16], arPts[16], dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, arPts[16], arPts[7], arPts[7], dWidth);
|
||
}
|
||
}
|
||
}
|
||
else if (0 == nOutOrIn)
|
||
{
|
||
tCurveEle.gsMark = 0;
|
||
|
||
int iRes(0), i(0);
|
||
AcDbPolyline DbPLine;
|
||
|
||
// 计算用的支管边线
|
||
AcDbLine lineBranU(ptSU, ptBranU);
|
||
AcDbLine lineBranD(ptSD, ptBranD);
|
||
|
||
BOOL bInterU(FALSE), bInterD(FALSE); // 2D下,主管边线和直管边线是否相交
|
||
AcGePoint3d ptInterU, ptInterD; // 2D下,主管边界和支管边界可能的交点
|
||
AcGePoint3dArray arPtEdge;
|
||
Acad::ErrorStatus es = Acad::eOk;
|
||
|
||
// 支管口直径大于尾管口直径,则,支管边线于主管边线相交
|
||
if (dBranWidth > dEndWidth)
|
||
{
|
||
AcDbLine lineSU(ptSU, ptEU);
|
||
AcDbLine lineSD(ptSD, ptED);
|
||
|
||
if (ptBran.z > ptEnd.z)// 支管高,画支管边线,和支管另一端端线
|
||
{
|
||
// 支管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSU, ptBranU, ptBranU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSD, ptBranD, ptBranD, dWidth);
|
||
|
||
// 支管端线
|
||
ptTmp.set(ptBran.x, ptBran.y, dEl);
|
||
iRes = TAuxTools::GetEllipseFromCircle(ptTmp, dBranWidth, vtBran, vtZAxis, DbPLine, vtBran);
|
||
if (-1 != iRes)
|
||
{
|
||
DbPLine.setElevation(dEl);
|
||
arPtEdge.setLogicalLength(0);
|
||
|
||
// 支管端线和主管边线是否有交点
|
||
ptInterU = ptSU;
|
||
es = lineSU.intersectWith(&DbPLine, AcDb::kOnBothOperands, arPtEdge);
|
||
if (es == Acad::eOk && arPtEdge.length() == 1)
|
||
ptInterU = arPtEdge[0];
|
||
|
||
arPtEdge.setLogicalLength(0);
|
||
ptInterD = ptSD;
|
||
es = lineSD.intersectWith(&DbPLine, AcDb::kOnBothOperands, arPtEdge);
|
||
if (es == Acad::eOk && arPtEdge.length() == 1)
|
||
ptInterD = arPtEdge[0];
|
||
}
|
||
|
||
// 绘制主管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptInterU, ptEU, ptEU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptInterD, ptED, ptED, dWidth);
|
||
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, 0, TRUE, TRUE, TRUE);
|
||
}
|
||
else // 支管低,不画支管另一端端线,从交点开始画支管边线
|
||
{
|
||
// 绘制主管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSU, ptEU, ptEU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSD, ptED, ptED, dWidth);
|
||
|
||
// 绘制支管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSU, ptBranU, ptBranU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSD, ptBranD, ptBranD, dWidth);
|
||
|
||
// 3个端口端线
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, 0, TRUE, TRUE, TRUE);
|
||
}
|
||
}
|
||
else if (dBranWidth < dEndWidth)// 支管口直径小于尾管口直径,则支管边线于主管边线肯定不相交,支管边线和尾部端线可能相交
|
||
{
|
||
// 支管高,画整个支管边线
|
||
if (ptBran.z > ptEnd.z)
|
||
{
|
||
// 绘制主管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSU, ptEU, ptEU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSD, ptED, ptED, dWidth);
|
||
// 绘制支管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSU, ptBranU, ptBranU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSD, ptBranD, ptBranD, dWidth);
|
||
// 3个端口端线
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, 0, TRUE, TRUE, TRUE);
|
||
}
|
||
else// 支管低
|
||
{
|
||
// 绘制主管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSU, ptEU, ptEU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSD, ptED, ptED, dWidth);
|
||
|
||
// 支管边线可能与尾管端线相交,若相交,从相交部分画起,并画支管端线,否则,不画支管边线和端线
|
||
// 尾管端线的外轮廓线
|
||
ptTmp.set(ptEnd.x, ptEnd.y, dEl);
|
||
AcGeVector3d vtDir = ptEnd - ptStart;
|
||
vtDir.normalize();
|
||
iRes = TAuxTools::GetEllipseFromCircle(ptTmp, dEndWidth, vtDir, vtZAxis, DbPLine, vtDir);
|
||
if (-1 != iRes)
|
||
{
|
||
DbPLine.setElevation(dEl);
|
||
|
||
|
||
// 支管端线和尾管端线是否有交点
|
||
ptInterU = ptSU;
|
||
es = lineBranU.intersectWith(&DbPLine, AcDb::kOnBothOperands, arPtEdge);
|
||
if (es == Acad::eOk && arPtEdge.length() == 1)
|
||
{
|
||
// 有交点,从交点开始绘制支管边线
|
||
ptInterU = arPtEdge[0];
|
||
|
||
arPtEdge.setLogicalLength(0);
|
||
ptInterD = ptSD;
|
||
es = lineBranD.intersectWith(&DbPLine, AcDb::kOnBothOperands, arPtEdge);
|
||
if (es == Acad::eOk && arPtEdge.length() == 1)
|
||
{
|
||
ptInterD = arPtEdge[0];
|
||
|
||
// 绘制支管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptInterU, ptBranU, ptBranU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptInterD, ptBranD, ptBranD, dWidth);
|
||
// 绘制支管端线
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, 0, FALSE, FALSE, TRUE);
|
||
}
|
||
}
|
||
else// 与尾管端线无焦点,查看支管点的位置
|
||
{
|
||
// 支管点在主管起止点之外,并且支管端线的内轮廓线和尾管端线的外轮廓线无焦点的时候,可以绘制支管边线和端线
|
||
AcGePoint3d pt1, pt2, pt3;
|
||
Midpoint(ptSU, ptSD, pt1);
|
||
Midpoint(ptEU, ptED, pt2);
|
||
Midpoint(ptBranU, ptBranD, pt3);
|
||
iRes = TAuxTools::PositionOnLine(pt1, pt2, pt3);
|
||
if (0 != iRes)
|
||
{
|
||
AcDbPolyline DbBraLine;
|
||
ptTmp.set(ptBran.x, ptBran.y, dEl);
|
||
iRes = TAuxTools::GetEllipseFromCircle(ptTmp, dBranWidth, -vtBran, vtZAxis, DbBraLine, -vtBran);
|
||
if (-1 != iRes)
|
||
{
|
||
arPtEdge.setLogicalLength(0);
|
||
if (Acad::eOk == DbBraLine.intersectWith(&DbPLine, AcDb::kOnBothOperands, arPtEdge))
|
||
{
|
||
if (arPtEdge.length() == 0)
|
||
{
|
||
// 绘制支管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSU, ptBranU, ptBranU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSD, ptBranD, ptBranD, dWidth);
|
||
// 绘制支管端线
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, 0, FALSE, FALSE, TRUE);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, 0, TRUE, TRUE, FALSE);
|
||
}
|
||
}
|
||
// 尾管与支管管径相等,不画支管边线
|
||
else
|
||
{
|
||
// 绘制主管边线
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSU, ptEU, ptEU, dWidth);
|
||
AutoAppendPt(cplCurve, tCurveEle, ptSD, ptED, ptED, dWidth);
|
||
|
||
if (ptBran.z > ptEnd.z)// 支管高,画支管端线
|
||
{
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, 0, TRUE, TRUE, TRUE);
|
||
}
|
||
else // 支管低,被主管遮挡,不画支管端线
|
||
{
|
||
GetAllIncCircleEndEdge2DCurves(cplCurve, 0, TRUE, TRUE, FALSE);
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeYShapeCircleFaceVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGePlane planStd =GetStdPrjPlan(ptStart);
|
||
ptEnd = ptEnd.orthoProject(planStd);
|
||
ptBran = ptBran.orthoProject(planStd);
|
||
|
||
AcGeVector3d vtStart(StartVect());
|
||
AcGeVector3d vtStartPerl = vtStart;
|
||
vtStartPerl.rotateBy(PI * 0.5, TAuxTools::GetUcsZvt());
|
||
|
||
// 求出半径
|
||
double dStartRadius(0.0), dEndRadius(0.0), dBranRadius(0.0);
|
||
m_pXDataMap->GetAt(HTEE_StartDiameter, dStartRadius);
|
||
m_pXDataMap->GetAt(HTEE_EndDiameter, dEndRadius);
|
||
m_pXDataMap->GetAt(HTEE_BranchDiameter, dBranRadius);
|
||
dStartRadius *= 0.5;
|
||
dEndRadius *= 0.5;
|
||
dBranRadius *= 0.5;
|
||
|
||
AecEqui::AecCurveElement cCurveEle;
|
||
memset(&cCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
|
||
// 单线模式
|
||
double dEdgeWidth = GetEdgeLineWidth();
|
||
if (IsSingleLine())
|
||
{
|
||
AutoAppendPt(cplCurve, cCurveEle, ptStart, ptBran, ptBran, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBran, ptEnd, ptEnd, dEdgeWidth);
|
||
return TRUE;
|
||
}
|
||
|
||
// 中间支管点上下点
|
||
AcGePoint3d ptBranUp, ptBranDown;
|
||
ptBranUp = ptBran - dBranRadius * vtStartPerl;
|
||
ptBranDown = ptBran + dBranRadius * vtStartPerl;
|
||
|
||
// 法兰咬边
|
||
double dFlanPlus(0.0);
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dFlanPlus);
|
||
|
||
// 起始端上下点、起始法兰端上下点
|
||
AcGePoint3d ptStartUp = ptStart - dStartRadius * vtStartPerl;
|
||
AcGePoint3d ptStartDown = ptStart + dStartRadius * vtStartPerl;
|
||
AcGePoint3d ptStartUpFlan = ptStartUp - dFlanPlus * vtStart;
|
||
AcGePoint3d ptStartDownFlan = ptStartDown - dFlanPlus * vtStart;
|
||
|
||
AcGePoint3d ptEndUp = ptEnd - dEndRadius * vtStartPerl;
|
||
AcGePoint3d ptEndDown = ptEnd + dEndRadius * vtStartPerl;
|
||
AcGePoint3d ptEndUpFlan = ptEndUp + dFlanPlus * vtStart;
|
||
AcGePoint3d ptEndDownFlan = ptEndDown + dFlanPlus * vtStart;
|
||
|
||
if (nOutOrIn == 0)
|
||
{
|
||
AutoAppendPt(cplCurve, cCurveEle, ptStartDown, ptStartDownFlan, ptStartDownFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptStartDownFlan, ptBranDown, ptBranDown, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranDown, ptEndDownFlan, ptEndDownFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptEndDownFlan, ptEndDown, ptEndDown, dEdgeWidth);
|
||
|
||
AutoAppendPt(cplCurve, cCurveEle, ptEndUp, ptEndUpFlan, ptEndUpFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptEndUpFlan, ptBranUp, ptBranUp, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranUp, ptStartUpFlan, ptStartUpFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptStartUpFlan, ptStartUp, ptStartUp, dEdgeWidth);
|
||
|
||
double dEndWidth = GetEndLineWidth();
|
||
cCurveEle.idSubLay = m_pOwnerEnt->layerId();
|
||
AutoAppendPt(cplCurve, cCurveEle, ptStartUp, ptStartDown, ptStartDown, dEndWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptEndDown, ptEndUp, ptEndUp, dEndWidth);
|
||
}
|
||
else if (nOutOrIn == 1)
|
||
{
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtUcsZ = pDb->ucsxdir().crossProduct(pDb->ucsydir());
|
||
if (BranVect().angleTo(vtUcsZ) < PI * 0.51)
|
||
{
|
||
// 中间支管投影形成的圆
|
||
AcGePoint3d ptLeft = ptBran + dBranRadius * vtStart;
|
||
AcGePoint3d ptRight = ptBran - dBranRadius * vtStart;
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranDown, ptRight, ptBranUp, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBranUp, ptLeft, ptBranDown, dEdgeWidth);
|
||
}
|
||
|
||
// 法兰线
|
||
AutoAppendPt(cplCurve, cCurveEle, ptStartDownFlan, ptStartUpFlan, ptStartUpFlan, dEdgeWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptEndDownFlan, ptEndUpFlan, ptEndUpFlan, dEdgeWidth);
|
||
|
||
// 中心线
|
||
if (IsBaseLine())
|
||
{
|
||
AcDbObjectId idCenter;// = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
||
cCurveEle.idSubLay = idCenter;
|
||
|
||
double dCentWidth = GetCentLineWidth();
|
||
AutoAppendPt(cplCurve, cCurveEle, ptStart, ptBran, ptBran, dCentWidth);
|
||
AutoAppendPt(cplCurve, cCurveEle, ptBran, ptEnd, ptEnd, dCentWidth);
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::MakeVShapeCircleFaceVert2DCurves( AecComplexCurve& cplCurve, const int &nOutOrIn ) const
|
||
{
|
||
// 获得UCS坐标Z向量
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
AcGeVector3d vtNormal(normal());
|
||
AcGeVector3d vtNormalSide = vtNormal;
|
||
vtNormalSide.rotateBy(PI*0.5, vtZAxis);
|
||
double dStartWidth(0.0), dEndWidth(0.0), dBranWidth(0.0),dPlusEdge(50.0);
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge);
|
||
|
||
AcGePoint3dArray arpts;
|
||
GetVShapeCirclePts(arpts);
|
||
|
||
AcDbObjectId idBaseLayer(NULL), idSideLayer(NULL);
|
||
int nHasBaseLine = 1;
|
||
idBaseLayer;// = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
||
m_pXDataMap->GetAt(HVAC_HasBaseLine, nHasBaseLine);
|
||
AecEqui::AecCurveElement el;
|
||
memset(&el,0,sizeof(AecEqui::AecCurveElement));
|
||
int nRet = -1;
|
||
AcGePoint3d ptS,ptE,ptSU,ptSD,ptS1U,ptS1D,ptEU,ptED,ptE1U,ptE1D,ptBase;
|
||
ptBase = arpts[12];
|
||
ptS = arpts[10];
|
||
ptE = arpts[11];
|
||
ptS.z = ptBase.z;
|
||
ptE.z = ptBase.z;
|
||
|
||
AcGeVector3d vtStoE = ptS - ptE;
|
||
|
||
if (nOutOrIn == 0)
|
||
{
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtUcsZ = pDb->ucsxdir().crossProduct(pDb->ucsydir());
|
||
if (BranVect().angleTo(vtUcsZ) < PI * 0.51)
|
||
{
|
||
//中心圆
|
||
el.ptGe[0] = arpts[12] + vtNormal * dBranWidth * 0.5 ;
|
||
el.ptGe[1] = arpts[12] + vtNormalSide * dBranWidth * 0.5 ;
|
||
el.ptGe[2] = arpts[12] - vtNormal * dBranWidth * 0.5 ;
|
||
cplCurve.append(el);
|
||
|
||
el.ptGe[0] = arpts[12] + vtNormal * dBranWidth * 0.5 ;
|
||
el.ptGe[1] = arpts[12] - vtNormalSide * dBranWidth * 0.5 ;
|
||
el.ptGe[2] = arpts[12] - vtNormal * dBranWidth * 0.5 ;
|
||
cplCurve.append(el);
|
||
}
|
||
|
||
//两端的椭圆
|
||
AcDbPolyline pPolyLine1, pPolyLine2, pPolyLine3, pPolyLine4, pPLs,pPLe;
|
||
AcGePoint3dArray ptsEll;
|
||
nRet = TAuxTools::GetEllipseFromCircle(ptS, dStartWidth, StartVect(), vtZAxis,
|
||
pPolyLine1,vtStoE);
|
||
if (nRet == 2)
|
||
{
|
||
ptsEll.setLogicalLength(0);
|
||
|
||
TAuxTools::GetArcPoint(pPolyLine1, ptsEll);//Lixl add 2011-11-23
|
||
for(int i = 0; i < ptsEll.length()-1; i++)
|
||
{
|
||
el.ptGe[0] = ptsEll[i];
|
||
el.ptGe[1] = ptsEll[i+1];
|
||
el.ptGe[2] = ptsEll[i+1];
|
||
cplCurve.append(el);
|
||
}
|
||
}
|
||
nRet = TAuxTools::GetEllipseFromCircle(ptS, dStartWidth, StartVect(), vtZAxis,
|
||
pPolyLine2,-vtStoE);
|
||
if (nRet == 2)
|
||
{
|
||
ptsEll.setLogicalLength(0);
|
||
|
||
TAuxTools::GetArcPoint(pPolyLine2, ptsEll);//Lixl add 2011-11-23
|
||
for(int i = 0; i < ptsEll.length()-1; i++)
|
||
{
|
||
el.ptGe[0] = ptsEll[i];
|
||
el.ptGe[1] = ptsEll[i+1];
|
||
el.ptGe[2] = ptsEll[i+1];
|
||
cplCurve.append(el);
|
||
}
|
||
ptSU = ptsEll.last();
|
||
ptSD = ptsEll.first();
|
||
}
|
||
nRet = TAuxTools::GetEllipseFromCircle(ptE, dEndWidth, EndVect(), vtZAxis,
|
||
pPolyLine3, vtStoE);
|
||
if (nRet == 2)
|
||
{
|
||
ptsEll.setLogicalLength(0);
|
||
|
||
TAuxTools::GetArcPoint(pPolyLine2, ptsEll);//Lixl add 2011-11-23
|
||
for(int i = 0; i < ptsEll.length()-1; i++)
|
||
{
|
||
el.ptGe[0] = ptsEll[i];
|
||
el.ptGe[1] = ptsEll[i+1];
|
||
el.ptGe[2] = ptsEll[i+1];
|
||
cplCurve.append(el);
|
||
}
|
||
}
|
||
nRet = TAuxTools::GetEllipseFromCircle(ptE, dEndWidth, EndVect(), vtZAxis,
|
||
pPolyLine4, -vtStoE);
|
||
if (nRet == 2)
|
||
{
|
||
ptsEll.setLogicalLength(0);
|
||
|
||
TAuxTools::GetArcPoint(pPolyLine4, ptsEll);//Lixl add 2011-11-23
|
||
for(int i = 0; i < ptsEll.length()-1; i++)
|
||
{
|
||
el.ptGe[0] = ptsEll[i];
|
||
el.ptGe[1] = ptsEll[i+1];
|
||
el.ptGe[2] = ptsEll[i+1];
|
||
cplCurve.append(el);
|
||
}
|
||
ptEU = ptsEll.last();
|
||
ptED = ptsEll.first();
|
||
}
|
||
ptS1U = arpts[12] - vtNormal * dBranWidth * 0.5;
|
||
ptS1D = arpts[12] + vtNormal * dBranWidth * 0.5;
|
||
|
||
el.ptGe[0] = ptSU;
|
||
el.ptGe[1] = ptS1U;
|
||
el.ptGe[2] = ptS1U;
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = ptSD;
|
||
el.ptGe[1] = ptS1D;
|
||
el.ptGe[2] = ptS1D;
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = ptEU;
|
||
el.ptGe[1] = ptS1U;
|
||
el.ptGe[2] = ptS1U;
|
||
cplCurve.append(el);
|
||
el.ptGe[0] = ptED;
|
||
el.ptGe[1] = ptS1D;
|
||
el.ptGe[2] = ptS1D;
|
||
cplCurve.append(el);
|
||
}
|
||
else if (nOutOrIn == 1)
|
||
{
|
||
el.gsMark = -1;
|
||
el.idSubLay = idBaseLayer;
|
||
el.ptGe[0] = ptED;
|
||
el.ptGe[1] = ptS1D;
|
||
el.ptGe[2] = ptS1D;
|
||
cplCurve.append(el);
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
int ImpHvacTee::AutoAppendPt( AecComplexCurve &cplCurve, AecEqui::AecCurveElement &cplEle,
|
||
const AcGePoint3d &ptS, const AcGePoint3d &ptMid, const AcGePoint3d &ptE) const
|
||
{
|
||
cplEle.ptGe[0] = ptS;
|
||
cplEle.ptGe[1] = ptMid;
|
||
cplEle.ptGe[2] = ptE;
|
||
|
||
return cplCurve.append(cplEle);
|
||
}
|
||
|
||
int ImpHvacTee::AutoAppendPt(AecComplexCurve &cplCurve, AecEqui::AecCurveElement &cplEle,
|
||
const AcGePoint3d &ptS, const AcGePoint3d &ptMid, const AcGePoint3d &ptE,
|
||
double dWidth) const
|
||
{
|
||
cplEle.ptGe[0] = ptS;
|
||
cplEle.ptGe[1] = ptMid;
|
||
cplEle.ptGe[2] = ptE;
|
||
cplEle.dWidth = dWidth;
|
||
|
||
return cplCurve.append(cplEle);
|
||
}
|
||
|
||
/*
|
||
得到大部分矩形截面三通中截面9个关键点
|
||
不适合类型,返回FALSE, 稍有变化的情函数中况予以说明
|
||
|
||
//
|
||
// 0━━━━━━━━━8━━━━━━━7
|
||
// ┃ ┃
|
||
// ┃ ┃
|
||
// ━━━━━━━━━━━━━━━━━
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 1━━━━━2 ┃ 5━━━━6
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 3━━━━━4
|
||
//
|
||
*/
|
||
BOOL ImpHvacTee::GetSectMidKeyPt(AcGePoint3dArray &ptArr, BOOL bDefault) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
double dExten(100); // 做辅助线延长
|
||
ESection eSect = eRect;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect);
|
||
|
||
AecHvac::HvacTeeType eType = AecHvac::eOrthoBranch;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
// add by hh 2011-01-14 避免三通接口不在同一高度时2D图案绘制错误
|
||
if(!bDefault && !IsValidConst(NULL))
|
||
{
|
||
AcGePlane plane(ptStart, normal());
|
||
ptBran = ptBran.orthoProject(plane);
|
||
ptEnd = ptEnd.orthoProject(plane);
|
||
}
|
||
|
||
AcGeVector3d vtNormal(normal());
|
||
AcGeVector3d vtStart(StartVect()), vtEnd(EndVect()), vtBran(BranVect());
|
||
AcGeVector3d vtStaSide(vtStart), vtEndSide(vtEnd), vtBranSide(vtBran); // 每管向量垂直向量
|
||
vtStaSide.rotateBy(PI*0.5, vtNormal);
|
||
vtEndSide.rotateBy(PI*0.5, vtNormal);
|
||
vtBranSide.rotateBy(PI*0.5, vtNormal);
|
||
|
||
double dStartWidth(0.0), dEndWidth(0.0), dBranWidth(0.0);
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
|
||
double dHalfStaWidth = dStartWidth * 0.5;
|
||
double dHalfEndWidth = dEndWidth * 0.5;
|
||
double dHalfBranWidth = dBranWidth * 0.5;
|
||
|
||
AcGePoint3d ptFitCenter = GetCenterPt();
|
||
AcGeVector3d vtCenTOEnd = ptEnd - ptFitCenter;
|
||
vtCenTOEnd.normalize();
|
||
if (eType == AecHvac::eInsertBranch || eType == AecHvac::eInsertIntubBranch)
|
||
{
|
||
AcGePoint3d pt0, pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8, pt9;
|
||
pt0 = ptStart - dHalfStaWidth * vtStaSide;
|
||
pt1 = ptStart + dHalfStaWidth * vtStaSide;
|
||
pt4 = ptBran - dHalfBranWidth * vtBranSide;
|
||
pt5 = ptBran + dHalfBranWidth * vtBranSide;
|
||
pt7 = ptEnd - dHalfEndWidth * vtEndSide;
|
||
pt8 = ptEnd + dHalfEndWidth * vtEndSide;
|
||
|
||
AcGePoint3d ptExt1, ptExt2, ptInserct; // 用于做辅助线的延长点,交点
|
||
pt9 = pt0;
|
||
|
||
AcGePlane plan(pt4, vtNormal);
|
||
AcGePoint3d pt1Prj = pt1.orthoProject(plan);
|
||
double dFlange = 0.0;
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dFlange);
|
||
pt2 = pt1Prj - vtStart * dFlange;
|
||
pt3 = pt4 - vtBran * dFlange;
|
||
|
||
AcGePoint3d pt7Prj = pt7.orthoProject(plan);
|
||
ptExt1 = pt5 + vtBran * dExten;
|
||
ptExt2 = pt7Prj + vtEnd * dExten;
|
||
if (Adesk::kTrue == GetIntersectPointByPts(pt5, ptExt1, pt7Prj, ptExt2, ptInserct))
|
||
{
|
||
pt6 = ptInserct;
|
||
}
|
||
else
|
||
{
|
||
pt6 = pt7;
|
||
}
|
||
|
||
ptArr.append(pt0);
|
||
ptArr.append(pt1);
|
||
ptArr.append(pt2);
|
||
ptArr.append(pt3);
|
||
ptArr.append(pt4);
|
||
ptArr.append(pt5);
|
||
ptArr.append(pt6);
|
||
ptArr.append(pt7);
|
||
ptArr.append(pt8);
|
||
ptArr.append(pt9);
|
||
}
|
||
else if (AecHvac::eInclineBranch == eType)
|
||
{
|
||
AcGePoint3d pt0, pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8, pt9;
|
||
pt0 = ptStart - dHalfStaWidth * vtStaSide;
|
||
pt1 = ptStart + dHalfStaWidth * vtStaSide;
|
||
pt4 = ptBran - dHalfBranWidth * vtBranSide;
|
||
pt5 = ptBran + dHalfBranWidth * vtBranSide;
|
||
pt7 = ptEnd - dHalfEndWidth * vtEndSide;
|
||
pt8 = ptEnd + dHalfEndWidth * vtEndSide;
|
||
|
||
AcGePoint3d ptExt1, ptExt2, ptInserct; // 用于做辅助线的延长点,交点
|
||
pt9 = pt0;
|
||
|
||
double dFlange = 0.0;
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dFlange);
|
||
pt2 = pt1 - vtStart * dFlange;
|
||
pt3 = pt4 - vtBran * dFlange;
|
||
|
||
ptExt1 = pt5 + vtBran * dExten;
|
||
ptExt2 = pt7 + vtEnd * dExten;
|
||
if (Adesk::kTrue == GetIntersectPointByPts(pt5, ptExt1, pt7, ptExt2, ptInserct))
|
||
{
|
||
pt6 = ptInserct;
|
||
}
|
||
else
|
||
{
|
||
pt6 = pt7;
|
||
}
|
||
|
||
ptArr.append(pt0);
|
||
ptArr.append(pt1);
|
||
ptArr.append(pt2);
|
||
ptArr.append(pt3);
|
||
ptArr.append(pt4);
|
||
ptArr.append(pt5);
|
||
ptArr.append(pt6);
|
||
ptArr.append(pt7);
|
||
ptArr.append(pt8);
|
||
ptArr.append(pt9);
|
||
}
|
||
else if (AecHvac::eYShapeBranch == eType)
|
||
{
|
||
AcGePoint3d pt0, pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8;
|
||
AcGePoint3d pt9, pt10, pt11, pt12, pt13, pt14, pt15, pt16;
|
||
pt0 = ptStart - dHalfStaWidth * vtStaSide;
|
||
pt1 = ptStart + dHalfStaWidth * vtStaSide;
|
||
pt5 = ptBran - dHalfBranWidth * vtBranSide;
|
||
pt6 = ptBran + dHalfBranWidth * vtBranSide;
|
||
pt10 = ptEnd - dHalfEndWidth * vtEndSide;
|
||
pt11 = ptEnd + dHalfEndWidth * vtEndSide;
|
||
|
||
double dFlange = 0.0;
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dFlange);
|
||
pt2 = pt1 - vtStart * dFlange;
|
||
pt4 = pt5 - vtBran * dFlange;
|
||
pt7 = pt6 - vtBran * dFlange;
|
||
pt9 = pt10 - vtEnd * dFlange;
|
||
pt12 = pt11 - vtEnd * dFlange;
|
||
pt16 = pt0 - vtStart * dFlange;
|
||
|
||
//WULW
|
||
AcGePoint3d ptCor1,ptCor2;
|
||
GetIntersectWith(pt1, pt2, pt4, pt5, ptCor1);
|
||
GetIntersectWith(pt6, pt7, pt9, pt10, ptCor2);
|
||
double dminEbr = dHalfBranWidth;
|
||
if (dHalfBranWidth > dHalfEndWidth)
|
||
{
|
||
dminEbr = dHalfEndWidth;
|
||
}
|
||
double dminSbr = dHalfBranWidth;
|
||
if (dHalfBranWidth > dHalfStaWidth)
|
||
{
|
||
dminSbr = dHalfStaWidth;
|
||
}
|
||
double dAngleS(0.0),dAngleE(0.0);
|
||
double dRadRatio = 1.5;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRadRatio);
|
||
dAngleS = vtBran.angleTo(vtStart);
|
||
dAngleS *= 0.5;
|
||
dAngleE = vtBran.angleTo(vtEnd);
|
||
dAngleE *= 0.5;
|
||
double dLengthS = dRadRatio * dminSbr / tan(dAngleS) + dFlange;
|
||
double dLengthE = dRadRatio * dminEbr / tan(dAngleE) + dFlange;
|
||
//交点到圆心CORTOCEN
|
||
double dC2Cs = sqrt(dminSbr * dRadRatio * dminSbr * dRadRatio + (dLengthS - dFlange) * (dLengthS - dFlange));
|
||
double dC2Ce = sqrt(dminEbr * dRadRatio * dminEbr * dRadRatio + (dLengthE - dFlange) * (dLengthE - dFlange));
|
||
|
||
AcGeVector3d vtRs = vtStart + vtBran;
|
||
vtRs.normalize();
|
||
pt3 = ptCor1 + vtRs * (dC2Cs - dminSbr * dRadRatio);
|
||
AcGeVector3d vtRe = vtEnd + vtBran;
|
||
vtRe.normalize();
|
||
pt8 = ptCor2 + vtRe * (dC2Ce - dminEbr * dRadRatio);
|
||
|
||
pt4 = ptCor1 + vtBran * (dLengthS - dFlange);
|
||
pt7 = ptCor2 + vtBran * (dLengthE - dFlange);
|
||
|
||
pt13 = pt12;
|
||
pt14 = pt12 + vtStart * 0.1;
|
||
pt15 = pt16;
|
||
|
||
//大圆
|
||
AcGePoint3d ptCens = ptCor1 + vtRs * dC2Cs;
|
||
AcGePoint3d ptCene = ptCor2 + vtRe * dC2Ce;
|
||
AcGePoint3d ptInter1,ptInter2;
|
||
AcGeCircArc3d circleS(ptCens,vtNormal,(dminSbr * dRadRatio + dStartWidth));
|
||
AcGeCircArc3d circleE(ptCene,vtNormal,(dminEbr * dRadRatio + dEndWidth));
|
||
int nn(0);
|
||
if(circleS.intersectWith(circleE,nn,ptInter1,ptInter2))
|
||
{
|
||
if(pt0.distanceTo(ptInter1) > pt0.distanceTo(ptInter2))
|
||
{
|
||
ptInter1 = ptInter2;
|
||
}
|
||
AcGeVector3d vtRs1,vtRe1,vtRs2,vtRe2;
|
||
vtRs1 = pt16 - ptCens;
|
||
vtRs2 = ptInter1 - ptCens;
|
||
vtRe1 = pt12 - ptCene;
|
||
vtRe2 = ptInter1 - ptCene;
|
||
pt13 = ptCene + (vtRe1 + vtRe2).normalize() * (dminEbr * dRadRatio + dEndWidth);
|
||
pt15 = ptCens + (vtRs1 + vtRs2).normalize() * (dminSbr * dRadRatio + dStartWidth);
|
||
pt14 = ptInter1;
|
||
}
|
||
// add by dyc on 2014-01-21 解决Y型三通在比较大坐标值情况下以后后变成T型问题,求两圆交点
|
||
else if(TAuxTools::CircleInsertWith(circleS, circleE, ptInter1, ptInter2))
|
||
{
|
||
if(pt0.distanceTo(ptInter1) > pt0.distanceTo(ptInter2))
|
||
{
|
||
ptInter1 = ptInter2;
|
||
}
|
||
AcGeVector3d vtRs1,vtRe1,vtRs2,vtRe2;
|
||
vtRs1 = pt16 - ptCens;
|
||
vtRs2 = ptInter1 - ptCens;
|
||
vtRe1 = pt12 - ptCene;
|
||
vtRe2 = ptInter1 - ptCene;
|
||
pt13 = ptCene + (vtRe1 + vtRe2).normalize() * (dminEbr * dRadRatio + dEndWidth);
|
||
pt15 = ptCens + (vtRs1 + vtRs2).normalize() * (dminSbr * dRadRatio + dStartWidth);
|
||
pt14 = ptInter1;
|
||
}
|
||
|
||
// 添加点
|
||
ptArr.append(pt0);
|
||
ptArr.append(pt1);
|
||
ptArr.append(pt2);
|
||
ptArr.append(pt3);
|
||
ptArr.append(pt4);
|
||
ptArr.append(pt5);
|
||
ptArr.append(pt6);
|
||
ptArr.append(pt7);
|
||
ptArr.append(pt8);
|
||
ptArr.append(pt9);
|
||
ptArr.append(pt10);
|
||
ptArr.append(pt11);
|
||
ptArr.append(pt12);
|
||
ptArr.append(pt13);
|
||
ptArr.append(pt14);
|
||
ptArr.append(pt15);
|
||
ptArr.append(pt16);
|
||
}
|
||
else if (AecHvac::eVShapeBranch == eType)
|
||
{
|
||
AcGePoint3d pt0, pt1, pt2, pt3, pt4, pt5, pt6;
|
||
AcGePoint3d pt7, pt8, pt9, pt10, pt11, pt12;
|
||
pt0 = ptStart + dHalfStaWidth * vtStaSide;
|
||
pt12 = ptStart - dHalfStaWidth * vtStaSide;
|
||
pt3 = ptBran - dHalfBranWidth * vtBranSide;
|
||
pt4 = ptBran + dHalfBranWidth * vtBranSide;
|
||
pt7 = ptEnd - dHalfEndWidth * vtEndSide;
|
||
pt8 = ptEnd + dHalfEndWidth * vtEndSide;
|
||
|
||
double dFlange = 0.0;
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dFlange);
|
||
pt1 = pt0 - vtStart * dFlange;
|
||
pt11 = pt12 - vtStart * dFlange;
|
||
pt2 = pt3 - vtBran * dFlange;
|
||
pt5 = pt4 - vtBran * dFlange;
|
||
pt6 = pt7 - vtEnd * dFlange;
|
||
pt9 = pt8 - vtEnd * dFlange;
|
||
|
||
AcGeLine3d lineS(pt11, pt5);
|
||
AcGeLine3d lineE(pt9, pt2);
|
||
if(Adesk::kTrue != lineS.intersectWith(lineE, pt10))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
ptArr.append(pt0);
|
||
ptArr.append(pt1);
|
||
ptArr.append(pt2);
|
||
ptArr.append(pt3);
|
||
ptArr.append(pt4);
|
||
ptArr.append(pt5);
|
||
ptArr.append(pt6);
|
||
ptArr.append(pt7);
|
||
ptArr.append(pt8);
|
||
ptArr.append(pt9);
|
||
ptArr.append(pt10);
|
||
ptArr.append(pt11);
|
||
ptArr.append(pt12);
|
||
}
|
||
else if (AecHvac::eTShapeBranch == eType)
|
||
{
|
||
AcGePoint3d pt0, pt1, pt2, pt3, pt4, pt5, pt6;
|
||
AcGePoint3d pt7, pt8, pt9, pt10, pt11, pt12, pt13;
|
||
pt0 = ptStart - dHalfStaWidth * vtStaSide;
|
||
pt1 = ptStart + dHalfStaWidth * vtStaSide;
|
||
pt5 = ptBran - dHalfBranWidth * vtBranSide;
|
||
pt6 = ptBran + dHalfBranWidth * vtBranSide;
|
||
pt10 = ptEnd - dHalfEndWidth * vtEndSide;
|
||
pt11 = ptEnd + dHalfEndWidth * vtEndSide;
|
||
|
||
double dFlange = 0.0;
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dFlange);
|
||
pt2 = pt1 - vtStart * dFlange;
|
||
pt4 = pt5 - vtBran * dFlange;
|
||
pt7 = pt6 - vtBran * dFlange;
|
||
pt9 = pt10 - vtEnd * dFlange;
|
||
pt12 = pt11 - vtEnd * dFlange;
|
||
pt13 = pt0 - vtStart * dFlange;
|
||
|
||
// 计算pt3和pt8
|
||
double dRatio = 1.5;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRatio);
|
||
if (!GetPtOnLowArc(pt1, pt2, dStartWidth, pt5, pt4, dBranWidth, dRatio, pt3)
|
||
|| !GetPtOnLowArc(pt10, pt9, dEndWidth, pt6, pt7, dBranWidth, dRatio, pt8))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
ptArr.append(pt0);
|
||
ptArr.append(pt1);
|
||
ptArr.append(pt2);
|
||
ptArr.append(pt3);
|
||
ptArr.append(pt4);
|
||
ptArr.append(pt5);
|
||
ptArr.append(pt6);
|
||
ptArr.append(pt7);
|
||
ptArr.append(pt8);
|
||
ptArr.append(pt9);
|
||
ptArr.append(pt10);
|
||
ptArr.append(pt11);
|
||
ptArr.append(pt12);
|
||
ptArr.append(pt13);
|
||
}
|
||
else if (AecHvac::eArcuateBranch == eType || AecHvac::eArcuateIntubBranch == eType)
|
||
{
|
||
AcGePoint3d pt0, pt1, pt2, pt3, pt4, pt5, pt6;
|
||
AcGePoint3d pt7, pt8, pt9, pt10, pt11, pt12;
|
||
pt0 = ptStart - dHalfStaWidth * vtStaSide;
|
||
pt1 = ptStart + dHalfStaWidth * vtStaSide;
|
||
pt5 = ptBran - dHalfBranWidth * vtBranSide;
|
||
pt6 = ptBran + dHalfBranWidth * vtBranSide;
|
||
pt10 = ptEnd - dHalfEndWidth * vtEndSide;
|
||
pt11 = ptEnd + dHalfEndWidth * vtEndSide;
|
||
|
||
double dFlange = 0.0;
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dFlange);
|
||
pt4 = pt5 - vtBran * dFlange;
|
||
pt12 = pt0 - vtStart * dFlange;
|
||
|
||
double dRatio = 1.5;
|
||
m_pXDataMap->GetAt(HTEE_RadRatio, dRatio);
|
||
if (AecHvac::eArcuateBranch == eType)
|
||
{
|
||
// 计算pt2
|
||
pt2 = pt1 - vtStart * dFlange;
|
||
|
||
// 计算pt3
|
||
if (!GetPtOnLowArc(pt1, pt2, dStartWidth, pt5, pt4, dBranWidth, dRatio, pt3))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
// 计算pt7
|
||
pt7 = pt6 - vtBran * (pt5.distanceTo(pt4));
|
||
AcGeLine3d lineSE(ptStart, ptEnd);
|
||
if (lineSE.distanceTo(pt7) < dHalfStaWidth)
|
||
{
|
||
// 设置pt7,pt8,pt9
|
||
AcGeLine3d line6(pt6, vtBran);
|
||
AcGeLine3d line10(pt10, vtEnd);
|
||
if (Adesk::kTrue != line6.intersectWith(line10, pt7))
|
||
{
|
||
return FALSE;
|
||
}
|
||
pt8 = pt7;
|
||
pt9 = pt7;
|
||
}
|
||
else
|
||
{
|
||
// 计算pt9
|
||
AcGeCircArc3d arcSB(pt4, pt3, pt2);
|
||
AcGePoint3d ptCenter = arcSB.center();
|
||
AcGeCircArc3d cirSB(ptCenter, vtNormal, ptCenter.distanceTo(pt7));
|
||
double dToGetPt9 = AcGeLine3d(pt2, pt12).distanceTo(pt10);
|
||
dToGetPt9 = max(dToGetPt9, pt10.distanceTo(pt2));
|
||
dToGetPt9 *= 1.2;
|
||
pt9 = pt10 - vtEnd * dToGetPt9;
|
||
AcGeLineSeg3d seg10To9(pt10, pt9);
|
||
int iIntNum = 0;
|
||
AcGePoint3d ptVertual;
|
||
cirSB.intersectWith(seg10To9, iIntNum, pt9, ptVertual);
|
||
if (0 == iIntNum)
|
||
{
|
||
pt9 = pt10 - vtCenTOEnd * dToGetPt9;
|
||
// change by hh 2011-08-18 支持不等厚的圆角三通
|
||
// AcGeLineSeg3d seg10To9Fixed(pt10, pt9);
|
||
AcGePlane pl(ptCenter, vtNormal);
|
||
AcGePoint3d ptTmp1 = pt10.orthoProject(pl);
|
||
AcGePoint3d ptTmp2 = pt9.orthoProject(pl);
|
||
AcGeLineSeg3d seg10To9Fixed(ptTmp1, ptTmp2);
|
||
|
||
cirSB.intersectWith(seg10To9Fixed, iIntNum, pt9, ptVertual);
|
||
if (1 != iIntNum)
|
||
{
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
// 计算pt8
|
||
pt8 = TAuxTools::Mid(pt7, pt9);
|
||
AcGeVector3d vtDir8 = pt8 - ptCenter;
|
||
vtDir8.normalize();
|
||
vtDir8 *= cirSB.radius();
|
||
pt8 = ptCenter + vtDir8;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// 计算pt2
|
||
AcGePlane plane(pt5, vtNormal);
|
||
AcGePoint3d pt1Prj = pt1.orthoProject(plane);
|
||
pt2 = pt1Prj - vtStart * dFlange;
|
||
|
||
// 计算pt3
|
||
AcGePoint3d pt2Prj = pt2.orthoProject(plane);
|
||
if (!GetPtOnLowArc(pt1Prj, pt2Prj, dStartWidth, pt5, pt4, dBranWidth, dRatio, pt3))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
// 计算pt7
|
||
pt7 = pt6 - vtBran * (pt5.distanceTo(pt4));
|
||
AcGeLine3d lineSE(ptStart.orthoProject(plane), ptEnd.orthoProject(plane));
|
||
if (lineSE.distanceTo(pt7) < dHalfStaWidth)
|
||
{
|
||
// 设置pt7,pt8,pt9
|
||
AcGeLine3d line6(pt6, vtBran);
|
||
AcGeLine3d line10(pt10.orthoProject(plane), vtEnd);
|
||
if (Adesk::kTrue != line6.intersectWith(line10, pt7))
|
||
{
|
||
return FALSE;
|
||
}
|
||
pt8 = pt7;
|
||
pt9 = pt7;
|
||
}
|
||
else
|
||
{
|
||
// 计算pt9
|
||
AcGeCircArc3d arcSB(pt4, pt3, pt2Prj);
|
||
AcGePoint3d ptCenter = arcSB.center();
|
||
AcGeCircArc3d cirSB(ptCenter, vtNormal, ptCenter.distanceTo(pt7));
|
||
double dToGetPt9 = AcGeLine3d(pt2, pt12).distanceTo(pt10);
|
||
dToGetPt9 = max(dToGetPt9, pt10.distanceTo(pt2));
|
||
dToGetPt9 *= 1.2;
|
||
AcGePoint3d pt10Prj = pt10.orthoProject(plane);
|
||
pt9 = pt10Prj - vtEnd * dToGetPt9;
|
||
AcGeLineSeg3d seg10To9(pt10Prj, pt9);
|
||
int iIntNum = 0;
|
||
AcGePoint3d ptVertual;
|
||
cirSB.intersectWith(seg10To9, iIntNum, pt9, ptVertual);
|
||
if (0 == iIntNum)
|
||
{
|
||
pt9 = pt10Prj - vtCenTOEnd * dToGetPt9;
|
||
AcGeLineSeg3d seg10To9Fixed(pt10Prj, pt9);
|
||
cirSB.intersectWith(seg10To9Fixed, iIntNum, pt9, ptVertual);
|
||
if (1 != iIntNum)
|
||
{
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
// 计算pt8
|
||
pt8 = TAuxTools::Mid(pt7, pt9);
|
||
AcGeVector3d vtDir8 = pt8 - ptCenter;
|
||
vtDir8.normalize();
|
||
vtDir8 *= cirSB.radius();
|
||
pt8 = ptCenter + vtDir8;
|
||
}
|
||
}
|
||
|
||
ptArr.append(pt0);
|
||
ptArr.append(pt1);
|
||
ptArr.append(pt2);
|
||
ptArr.append(pt3);
|
||
ptArr.append(pt4);
|
||
ptArr.append(pt5);
|
||
ptArr.append(pt6);
|
||
ptArr.append(pt7);
|
||
ptArr.append(pt8);
|
||
ptArr.append(pt9);
|
||
ptArr.append(pt10);
|
||
ptArr.append(pt11);
|
||
ptArr.append(pt12);
|
||
}
|
||
else
|
||
{
|
||
AcGePoint3d pt0, pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8;
|
||
pt0 = ptStart - dHalfStaWidth * vtStaSide;
|
||
pt1 = ptStart + dHalfStaWidth * vtStaSide;
|
||
pt3 = ptBran - dHalfBranWidth * vtBranSide;
|
||
pt4 = ptBran + dHalfBranWidth * vtBranSide;
|
||
pt6 = ptEnd - dHalfEndWidth * vtEndSide;
|
||
pt7 = ptEnd + dHalfEndWidth * vtEndSide;
|
||
|
||
AcGePoint3d ptExt1, ptExt2, ptInserct; // 用于做辅助线的延长点,交点
|
||
pt8 = pt0;
|
||
|
||
ptExt1 = pt1 + dExten * vtStart;
|
||
ptExt2 = pt3 + dExten * vtBran;
|
||
if (GetIntersectPointByPts(pt1, ptExt1, pt3, ptExt2, ptInserct) == Adesk::kTrue)
|
||
pt2 = ptInserct;
|
||
else
|
||
pt2 = pt1;
|
||
|
||
ptExt1 = pt4 + dExten * vtBran;
|
||
ptExt2 = pt6 + dExten * vtEnd;
|
||
if (GetIntersectPointByPts(pt4, ptExt1, pt6, ptExt2, ptInserct) == Adesk::kTrue)
|
||
pt5 = ptInserct;
|
||
else
|
||
pt5 = pt4;
|
||
|
||
ptArr.append(pt0);
|
||
ptArr.append(pt1);
|
||
ptArr.append(pt2);
|
||
ptArr.append(pt3);
|
||
ptArr.append(pt4);
|
||
ptArr.append(pt5);
|
||
ptArr.append(pt6);
|
||
ptArr.append(pt7);
|
||
ptArr.append(pt8);
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
// 得到三通接口处上下两面的六个点
|
||
BOOL ImpHvacTee::GetInterfaceKeyPt(AcGePoint3dArray &ptUpArr, AcGePoint3dArray &ptDownArr) const
|
||
{
|
||
// 0━━━━━━━━━━━━━━━━5
|
||
// ┃ ┃
|
||
// ┃ ┃
|
||
// ━━━━━━━━━━━━━━━━━
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 1━━━━━┓ ┃ ┏━━━━4
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 2━━━━━3
|
||
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
ESection eSect = eRect;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect);
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtNormal(normal());
|
||
AcGeVector3d vtStart(StartVect()), vtEnd(EndVect()), vtBran(BranVect());
|
||
AcGeVector3d vtStaSide(vtStart), vtEndSide(vtEnd), vtBranSide(vtBran); // 每管向量垂直向量
|
||
vtStaSide.rotateBy(PI*0.5, vtNormal);
|
||
vtEndSide.rotateBy(PI*0.5, vtNormal);
|
||
vtBranSide.rotateBy(PI*0.5, vtNormal);
|
||
|
||
double dStartWidth(0.0), dEndWidth(0.0), dBranWidth(0.0);
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
double dHalfStaWidth = dStartWidth * 0.5;
|
||
double dHalfEndWidth = dEndWidth * 0.5;
|
||
double dHalfBranWidth = dBranWidth * 0.5;
|
||
|
||
double dStartThick(0.0), dEndThick(0.0), dBranThick(0.0);
|
||
if(eRect != eSect) // 圆形三通按方形处理
|
||
{
|
||
dStartThick = dStartWidth;
|
||
dEndThick = dEndWidth;
|
||
dBranThick = dBranWidth;
|
||
}
|
||
else
|
||
{
|
||
m_pXDataMap->GetAt(HTEE_Thick, dStartThick);
|
||
m_pXDataMap->GetAt(HTEE_EndThick, dEndThick);
|
||
m_pXDataMap->GetAt(HTEE_BranchThick, dBranThick);
|
||
if(1e-6 >= dEndThick)
|
||
dEndThick = dStartThick;
|
||
}
|
||
|
||
double dHalfStaThick = dStartThick * 0.5;
|
||
double dHalfEndThick = dEndThick * 0.5;
|
||
double dHalfBranThick = dBranThick * 0.5;
|
||
|
||
// pt0
|
||
AcGePoint3d ptUp, ptDown;
|
||
ptUp = ptStart - vtStaSide * dHalfStaWidth;
|
||
ptUp = ptUp + vtNormal * dHalfStaThick;
|
||
ptUpArr.append(ptUp);
|
||
ptDown = ptUp - vtNormal * dStartThick;
|
||
ptDownArr.append(ptDown);
|
||
|
||
// pt1
|
||
ptUp = ptStart + vtStaSide * dHalfStaWidth;
|
||
ptUp = ptUp + vtNormal * dHalfStaThick;
|
||
ptUpArr.append(ptUp);
|
||
ptDown = ptUp - vtNormal * dStartThick;
|
||
ptDownArr.append(ptDown);
|
||
|
||
// pt2
|
||
ptUp = ptBran - vtBranSide * dHalfBranWidth;
|
||
ptUp = ptUp + vtNormal * dHalfBranThick;
|
||
ptUpArr.append(ptUp);
|
||
ptDown = ptUp - vtNormal * dBranThick;
|
||
ptDownArr.append(ptDown);
|
||
|
||
// pt3
|
||
ptUp = ptBran + vtBranSide * dHalfBranWidth;
|
||
ptUp = ptUp + vtNormal * dHalfBranThick;
|
||
ptUpArr.append(ptUp);
|
||
ptDown = ptUp - vtNormal * dBranThick;
|
||
ptDownArr.append(ptDown);
|
||
|
||
// pt4
|
||
ptUp = ptEnd - vtEndSide * dHalfEndWidth;
|
||
ptUp = ptUp + vtNormal * dHalfEndThick;
|
||
ptUpArr.append(ptUp);
|
||
ptDown = ptUp - vtNormal * dEndThick;
|
||
ptDownArr.append(ptDown);
|
||
|
||
// pt5
|
||
ptUp = ptEnd + vtEndSide * dHalfEndWidth;
|
||
ptUp = ptUp + vtNormal * dHalfEndThick;
|
||
ptUpArr.append(ptUp);
|
||
ptDown = ptUp - vtNormal * dEndThick;
|
||
ptDownArr.append(ptDown);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
/*
|
||
得到大部分矩形截面三通18(上下各9个)关键点
|
||
不适合类型,返回FALSE, 稍有变化的情况予以说明
|
||
|
||
//
|
||
// 0━━━━━━━━━8━━━━━━━7
|
||
// ┃ ┃
|
||
// ┃ ┃
|
||
// ━━━━━━━━━━━━━━━━━
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 1━━━━━2 ┃ 5━━━━6
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// ┃ ┃ ┃
|
||
// 3━━━━━4
|
||
//
|
||
*/
|
||
|
||
BOOL ImpHvacTee::GetTwoSideKeyPt(AcGePoint3dArray &ptUpArr, AcGePoint3dArray &ptDownArr, BOOL bDefault) const
|
||
{
|
||
if(NULL == m_pXDataMap)
|
||
return FALSE;
|
||
|
||
ESection eSect = eRect;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect);
|
||
if (eSect != eRect)
|
||
return FALSE;
|
||
|
||
if(!GetSectMidKeyPt(ptUpArr, bDefault))
|
||
return FALSE;
|
||
|
||
double dThick = 0, dEndThick = 0, dBraThick = 0;
|
||
m_pXDataMap->GetAt(HTEE_Thick, dThick);
|
||
if(!m_pXDataMap->GetAt(HTEE_EndThick, dEndThick))
|
||
dEndThick = dThick;
|
||
if(!m_pXDataMap->GetAt(HTEE_BranchThick, dBraThick))
|
||
dBraThick = dThick;
|
||
|
||
AcGeVector3d vtOffsetS = dThick * normal() * 0.5;
|
||
AcGeVector3d vtOffsetE = dEndThick * normal() * 0.5;
|
||
AcGeVector3d vtOffsetB = dBraThick * normal() * 0.5;
|
||
|
||
AecHvac::HvacTeeType eType = AecHvac::eOrthoBranch;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
|
||
int i = 0;
|
||
if(AecHvac::eInsertBranch == eType || AecHvac::eInsertIntubBranch == eType || AecHvac::eInclineBranch == eType)
|
||
{
|
||
for(i = 0; i < ptUpArr.length(); i++)
|
||
{
|
||
if(1 >= i || 9 <= i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetS);
|
||
ptUpArr[i] += vtOffsetS;
|
||
}
|
||
else if(7 == i || 8 == i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetE);
|
||
ptUpArr[i] += vtOffsetE;
|
||
}
|
||
else
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetB);
|
||
ptUpArr[i] += vtOffsetB;
|
||
}
|
||
}
|
||
}
|
||
else if(AecHvac::eYShapeBranch == eType)
|
||
{
|
||
for(i = 0; i < ptUpArr.length(); i++)
|
||
{
|
||
if(3 >= i || 14 <= i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetS);
|
||
ptUpArr[i] += vtOffsetS;
|
||
}
|
||
else if(8 <= i && 13 >= i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetE);
|
||
ptUpArr[i] += vtOffsetE;
|
||
}
|
||
else
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetB);
|
||
ptUpArr[i] += vtOffsetB;
|
||
}
|
||
}
|
||
}
|
||
else if(AecHvac::eVShapeBranch == eType)
|
||
{
|
||
for(i = 0; i < ptUpArr.length(); i++)
|
||
{
|
||
if(2 >= i || 10 <= i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetS);
|
||
ptUpArr[i] += vtOffsetS;
|
||
}
|
||
else if(5 <= i && 9 >= i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetE);
|
||
ptUpArr[i] += vtOffsetE;
|
||
}
|
||
else
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetB);
|
||
ptUpArr[i] += vtOffsetB;
|
||
}
|
||
}
|
||
}
|
||
else if(AecHvac::eTShapeBranch == eType)
|
||
{
|
||
for(i = 0; i < ptUpArr.length(); i++)
|
||
{
|
||
if(3 >= i || 13 <= i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetS);
|
||
ptUpArr[i] += vtOffsetS;
|
||
}
|
||
else if(8 <= i && 12 >= i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetE);
|
||
ptUpArr[i] += vtOffsetE;
|
||
}
|
||
else
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetB);
|
||
ptUpArr[i] += vtOffsetB;
|
||
}
|
||
}
|
||
}
|
||
else if(AecHvac::eArcuateBranch == eType || AecHvac::eArcuateIntubBranch == eType)
|
||
{
|
||
for(i = 0; i < ptUpArr.length(); i++)
|
||
{
|
||
if(3 >= i || 12 <= i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetS);
|
||
ptUpArr[i] += vtOffsetS;
|
||
}
|
||
else if(10 == i || 11 == i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetE);
|
||
ptUpArr[i] += vtOffsetE;
|
||
}
|
||
else
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetB);
|
||
ptUpArr[i] += vtOffsetB;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for(i = 0; i < ptUpArr.length(); i++)
|
||
{
|
||
if(1 >= i || 8 <= i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetS);
|
||
ptUpArr[i] += vtOffsetS;
|
||
}
|
||
else if(6 == i || 7 == i)
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetE);
|
||
ptUpArr[i] += vtOffsetE;
|
||
}
|
||
else
|
||
{
|
||
ptDownArr.append(ptUpArr[i] - vtOffsetB);
|
||
ptUpArr[i] += vtOffsetB;
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
AcGePlane ImpHvacTee::GetStdPrjPlan( const AcGePoint3d &ptOnPlan ) const
|
||
{
|
||
AcDbDatabase* pDb = acdbCurDwg();
|
||
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
||
AcGePlane planStd(ptOnPlan, vtZAxis);
|
||
AcGePoint3d ptPrj = AcGePoint3d::kOrigin.orthoProject(planStd);
|
||
planStd.set(ptPrj, vtZAxis);
|
||
|
||
return planStd;
|
||
}
|
||
|
||
Adesk::Boolean ImpHvacTee::GetIntersectPointByPts( AcGePoint3d ptL1Sta, AcGePoint3d ptL1End,
|
||
AcGePoint3d ptL2Sta, AcGePoint3d ptL2End, AcGePoint3d &ptInersect ) const
|
||
{
|
||
AcGeLine3d line1(ptL1Sta, ptL1End);
|
||
AcGeLine3d line2(ptL2Sta, ptL2End);
|
||
return line1.intersectWith(line2, ptInersect);
|
||
}
|
||
|
||
AcGePoint3d ImpHvacTee::GetCenterPt() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran, ptCross;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtNormal = normal();
|
||
AcGePlane planStd(ptStart, vtNormal);
|
||
AcGePoint3d ptPrj = AcGePoint3d::kOrigin.orthoProject(planStd);
|
||
planStd.set(ptPrj, vtNormal);
|
||
|
||
ptEnd = ptEnd.orthoProject(planStd);
|
||
ptBran = ptBran.orthoProject(planStd);
|
||
|
||
AcGeVector3d vtStart(StartVect()), vtEnd(EndVect()), vtBran(BranVect());
|
||
AcGeLine3d lineMain(ptStart, ptStart + 100 * vtStart);
|
||
AcGeLine3d lineBran(ptBran, ptBran + 100 * vtBran);
|
||
if (!lineMain.intersectWith(lineBran, ptCross))
|
||
{
|
||
lineMain.set(ptEnd, ptEnd + 100 * vtEnd); // 看末管跟支管是否有交点
|
||
if (!lineMain.intersectWith(lineBran, ptCross))
|
||
{
|
||
ptCross = TAuxTools::Mid(ptStart, ptEnd); // 没有交点时按中点算
|
||
}
|
||
}
|
||
return ptCross;
|
||
}
|
||
|
||
BOOL ImpHvacTee::GetPtOnLowArc(const AcGePoint3d& ptOnPort1, AcGePoint3d& ptExtend1, const double dPortSize1,
|
||
const AcGePoint3d& ptOnPort2, AcGePoint3d& ptExtend2, const double dPortSize2,
|
||
const double dCR, AcGePoint3d& ptOnCurve) const
|
||
{
|
||
// 获取端口延长线交点
|
||
AcGeLine3d line1(ptOnPort1, ptExtend1);
|
||
AcGeLine3d line2(ptOnPort2, ptExtend2);
|
||
AcGePoint3d ptIntersect;
|
||
if (Adesk::kTrue != line1.intersectWith(line2, ptIntersect))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
// 计算弧线半径
|
||
double dRadius = (dCR - 0.5) * min(dPortSize1, dPortSize2);
|
||
|
||
// 计算弧线圆心
|
||
AcGeVector3d vt1 = ptOnPort1 - ptIntersect;
|
||
vt1.normalize();
|
||
AcGeVector3d vt2 = ptOnPort2 - ptIntersect;
|
||
vt2.normalize();
|
||
AcGeVector3d vtDir = vt1 + vt2;
|
||
vtDir.normalize();
|
||
double dAng = vtDir.angleTo(vt1);
|
||
double dLength = dRadius / sin(dAng);
|
||
AcGePoint3d ptCenter = ptIntersect + dLength * vtDir;
|
||
|
||
// 计算弧上点
|
||
ptOnCurve = ptCenter - dRadius * vtDir;
|
||
|
||
// 修正弧线端点
|
||
ptExtend1 = line1.closestPointTo(ptCenter);
|
||
ptExtend2 = line2.closestPointTo(ptCenter);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void ImpHvacTee::DepartArcByAngle(const AcGePoint3d& ptStart, const AcGePoint3d& ptOnCurve,
|
||
const AcGePoint3d& ptEnd, double dAng, AcGePoint3dArray& arptPtsOnCur,
|
||
const AcGeVector3d& vtNormal, int iPartNum) const
|
||
{
|
||
// 计算点的个数
|
||
AcGeCircArc3d arc(ptStart, ptOnCurve, ptEnd);
|
||
AcGePoint3d ptCenter = arc.center();
|
||
AcGeVector3d vtStart = arc.startPoint() - ptCenter;
|
||
AcGeVector3d vtEnd = arc.endPoint() - ptCenter;
|
||
double dTotAng = arc.endAng() - arc.startAng();
|
||
if (0 == iPartNum)
|
||
{
|
||
iPartNum = int(floor(dTotAng / dAng));
|
||
}
|
||
double dPartAng = dTotAng / iPartNum;
|
||
|
||
// 计算圆弧是否顺时针
|
||
BOOL bCLockwise = TRUE;
|
||
AcGeVector3d vtSToOC = ptOnCurve - ptStart;
|
||
AcGeVector3d vtSToE = ptEnd - ptStart;
|
||
double dCLockAng = vtSToOC.angleTo(vtSToE, vtNormal);
|
||
if (dCLockAng < PI)
|
||
{
|
||
bCLockwise = FALSE;
|
||
}
|
||
|
||
// 计算点
|
||
if (bCLockwise)
|
||
{
|
||
dPartAng *= -1;
|
||
}
|
||
AcGePoint3d ptTmp;
|
||
AcGeVector3d vtRotate = vtStart;
|
||
int iVertNum = iPartNum - 1;
|
||
for (int i = iVertNum; i > 0; i--)
|
||
{
|
||
vtRotate.rotateBy(dPartAng, vtNormal);
|
||
ptTmp = ptCenter + vtRotate;
|
||
arptPtsOnCur.append(ptTmp);
|
||
}
|
||
}
|
||
|
||
int ImpHvacTee::FixPtsData(AcGePoint3dArray& arpt, int iPos, double dAng,
|
||
const AcGeVector3d& vtNormal) const
|
||
{
|
||
AcGePoint3dArray arptInsert;
|
||
DepartArcByAngle(arpt[iPos - 1], arpt[iPos], arpt[iPos + 1], dAng, arptInsert, vtNormal);
|
||
arpt.removeAt(iPos);
|
||
int iIndex = iPos;
|
||
int iLen = arptInsert.length();
|
||
for (int i = 0; i < iLen; i++)
|
||
{
|
||
arpt.insertAt(iIndex, arptInsert[i]);
|
||
iIndex++;
|
||
}
|
||
return iLen;
|
||
}
|
||
|
||
void ImpHvacTee::DrawValve(AecComplexCurve& cplCurve, AcGePoint3d ptStart) const
|
||
{
|
||
if (m_pXDataMap == NULL)
|
||
return;
|
||
|
||
BOOL bDrawValue(FALSE);
|
||
m_pXDataMap->GetAt(HTEE_HasValve, bDrawValue);
|
||
if (!bDrawValue)
|
||
return;
|
||
|
||
// 阀门长度
|
||
double dLen(0.0);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dLen);
|
||
dLen *= 0.5 * 1.414;
|
||
|
||
// vt:求阀门方向
|
||
AcGeVector3d vtZTee = TAuxTools::GetUcsZvt();
|
||
AcGeVector3d vt;
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vt);
|
||
|
||
//根据支管和尾管的向量计算当前三通的本地系统的Z方向,确定三通方位
|
||
AcGeVector3d vtBranch;
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBranch);
|
||
vtZTee = vt.crossProduct(vtBranch);
|
||
vtZTee.normalize();
|
||
|
||
vt.rotateBy(-PI * 0.75, vtZTee);
|
||
AcGePoint3d ptEnd = ptStart + dLen * vt;
|
||
|
||
// 添加绘制
|
||
AecEqui::AecCurveElement cCurveEle;
|
||
memset(&cCurveEle, 0, sizeof(AecEqui::AecCurveElement));
|
||
cCurveEle.bHided = FALSE;
|
||
cCurveEle.dWidth = 0.0;
|
||
cCurveEle.gsMark = 0;
|
||
|
||
cCurveEle.ptGe[0] = ptStart;
|
||
cCurveEle.ptGe[1] = ptEnd;
|
||
cCurveEle.ptGe[2] = ptEnd;
|
||
cplCurve.append(cCurveEle);
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
// 0 (9) 7
|
||
// /\ /\
|
||
// 10 / \ / \ 11
|
||
// / \ / \
|
||
// / \ / \6
|
||
// 1 \ \ / /
|
||
// 16\ \ / / 17
|
||
// \ \ / /
|
||
// \ \ / /
|
||
// \ \/8 /
|
||
// \ 14 ┃ 15 /
|
||
// 2 ┃ ┃13 ┃5
|
||
// -━━━━━-
|
||
// 3 12 4
|
||
//
|
||
BOOL ImpHvacTee::GetVShapeCirclePts(AcGePoint3dArray &ptArr) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
double dExten(100); // 做辅助线延长
|
||
ESection eSect = eRect;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect);
|
||
if (eSect != eCircle)
|
||
return FALSE;
|
||
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
|
||
AcGeVector3d vtNormal(normal());
|
||
AcGeVector3d vtStart(StartVect()), vtEnd(EndVect()), vtBran(BranVect());
|
||
AcGeVector3d vtStaSide(vtStart), vtEndSide(vtEnd), vtBranSide(vtBran); // 每管向量垂直向量
|
||
vtStaSide.rotateBy(PI*0.5, vtNormal);
|
||
vtEndSide.rotateBy(PI*0.5, vtNormal);
|
||
vtBranSide.rotateBy(PI*0.5, vtNormal);
|
||
|
||
double dStartWidth(0.0), dEndWidth(0.0), dBranWidth(0.0),dPlusEdge = MayAsMUnit(50);
|
||
m_pXDataMap->GetAt(HTEE_StartWidth, dStartWidth);
|
||
m_pXDataMap->GetAt(HTEE_EndWidth, dEndWidth);
|
||
m_pXDataMap->GetAt(HTEE_BranchWidth, dBranWidth);
|
||
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge);
|
||
|
||
vtBran.normalize();
|
||
vtStart.normalize();
|
||
vtEnd.normalize();
|
||
vtStaSide.normalize();
|
||
vtEndSide.normalize();
|
||
vtBranSide.normalize();
|
||
|
||
double dHalfStaWidth = dStartWidth * 0.5;
|
||
double dHalfEndWidth = dEndWidth * 0.5;
|
||
double dHalfBranWidth = dBranWidth * 0.5;
|
||
AcGePoint3d pt,ptEdge,ptCen;
|
||
//0-1
|
||
pt = ptStart - dHalfStaWidth * vtStaSide;
|
||
ptArr.append(pt);
|
||
pt = ptStart + dHalfStaWidth * vtStaSide;
|
||
ptArr.append(pt);
|
||
|
||
//2-5有法兰咬边
|
||
ptEdge = ptBran - vtBran * dPlusEdge;
|
||
pt = ptEdge - dHalfBranWidth * vtBranSide;
|
||
ptArr.append(pt);
|
||
pt = ptBran - dHalfBranWidth * vtBranSide;
|
||
ptArr.append(pt);
|
||
pt = ptBran + vtBranSide * dHalfBranWidth;
|
||
ptArr.append(pt);
|
||
pt = ptEdge + dHalfBranWidth * vtBranSide;
|
||
ptArr.append(pt);
|
||
//6,7
|
||
pt = ptEnd - dHalfEndWidth * vtEndSide;
|
||
ptArr.append(pt);
|
||
pt = ptEnd + dHalfEndWidth * vtEndSide;
|
||
ptArr.append(pt);
|
||
|
||
AcGeVector3d vts,vte;
|
||
GetIntersectWith(ptArr[0],ptArr[7], vtStart, vtEnd,pt);
|
||
if (vtStart.isParallelTo(vtEnd))//平行取中
|
||
pt = TAuxTools::Mid(ptArr[0], ptArr[7]);
|
||
ptArr.append(pt);
|
||
//9
|
||
ptArr.append(ptArr[0]);
|
||
|
||
//三个中心点10,11,12,(法兰咬边13)
|
||
ptArr.append(ptStart);
|
||
ptArr.append(ptEnd);
|
||
ptArr.append(ptBran);
|
||
ptArr.append(ptEdge);
|
||
//下圆心14,15
|
||
vts = ptArr[0] - ptArr[8];
|
||
vte = ptArr[7] - ptArr[8];
|
||
GetIntersectWith(ptArr[2], ptArr[0], vtStaSide, vts, pt);
|
||
if (vtStart.isParallelTo(vts))//平行取中
|
||
pt = TAuxTools::Mid(ptArr[2], ptArr[0]);
|
||
|
||
ptCen = TAuxTools::Mid(ptArr[2], pt);
|
||
ptArr.append(ptCen);
|
||
GetIntersectWith(ptArr[5], ptArr[7], vtEndSide, vte, pt);
|
||
if (vtEndSide.isParallelTo(vte))//平行取中
|
||
pt = TAuxTools::Mid(ptArr[5], ptArr[7]);
|
||
|
||
ptCen = TAuxTools::Mid(ptArr[5], pt);
|
||
ptArr.append(ptCen);
|
||
//新曾开始和末点的法兰直边段16,17
|
||
pt = ptArr[1] - vtStart * dPlusEdge;
|
||
ptArr.append(pt);
|
||
pt = ptArr[6] - vtEnd * dPlusEdge;
|
||
ptArr.append(pt);
|
||
return TRUE;
|
||
}
|
||
|
||
void ImpHvacTee::GetArcPoint(AcDbPolyline &polyLine, AcGePoint3dArray &ptArcArr)
|
||
{
|
||
if (polyLine.numVerts() != 4)
|
||
return;
|
||
|
||
double dPara1(0.0), dPara2(0.0);
|
||
double dPar1, dPar2;
|
||
AcGePoint3d pt0, pt1, pt2, pt3, ptMid;
|
||
|
||
polyLine.getPointAt(0, pt0);
|
||
polyLine.getPointAt(1, pt1);
|
||
polyLine.getPointAt(2, pt2);
|
||
polyLine.getPointAt(3, pt3);
|
||
|
||
polyLine.getParamAtPoint(pt0, dPar1);
|
||
polyLine.getParamAtPoint(pt1, dPar2);
|
||
polyLine.getPointAtParam((dPar1 + dPar2) * 0.5, ptMid);
|
||
ptArcArr.append(pt0);
|
||
ptArcArr.append(ptMid);
|
||
ptArcArr.append(pt1);
|
||
|
||
polyLine.getParamAtPoint(pt1, dPar1);
|
||
polyLine.getParamAtPoint(pt2, dPar2);
|
||
polyLine.getPointAtParam((dPar1 + dPar2) * 0.5, ptMid);
|
||
ptArcArr.append(ptMid);
|
||
ptArcArr.append(pt2);
|
||
|
||
polyLine.getParamAtPoint(pt2, dPar1);
|
||
polyLine.getParamAtPoint(pt3, dPar2);
|
||
polyLine.getPointAtParam((dPar1 + dPar2) * 0.5, ptMid);
|
||
ptArcArr.append(ptMid);
|
||
ptArcArr.append(pt3);
|
||
}
|
||
|
||
double ImpHvacTee::GetEdgeLineWidth() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
double dWidth = 0.0;
|
||
m_pXDataMap->GetAt(HVAC_EdgeWidth, dWidth);
|
||
|
||
return dWidth;
|
||
}
|
||
|
||
double ImpHvacTee::GetCentLineWidth() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
double dWidth(0.0);
|
||
m_pXDataMap->GetAt(HVAC_CentWidth, dWidth);
|
||
|
||
return dWidth;
|
||
}
|
||
|
||
double ImpHvacTee::GetEndLineWidth() const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
double dWidth(0.0);
|
||
m_pXDataMap->GetAt(HVAC_EndWidth, dWidth);
|
||
|
||
return dWidth;
|
||
}
|
||
|
||
BOOL ImpHvacTee::IsValidConst(AecDbObjXDataMap* pXMap) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
AcGePoint3d ptCenter = GetCenterPt();
|
||
AcGePoint3d ptStart, ptEnd, ptBranch;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBranch);
|
||
|
||
AcGeVector3d vtNornal = normal();
|
||
AcGeVector3d vtStart, vtEnd, vtBranch;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBranch);
|
||
|
||
double dSThick = 0, dBThick = 0, dEThick = 0;
|
||
m_pXDataMap->GetAt(HTEE_Thick, dSThick);
|
||
m_pXDataMap->GetAt(HTEE_EndThick, dEThick);
|
||
m_pXDataMap->GetAt(HTEE_BranchThick, dBThick);
|
||
|
||
AecHvac::HvacTeeType eTeeType(AecHvac::eOrthoBranch);
|
||
ESection eSectType(eRect);
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eTeeType);
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
|
||
// 构造与三通接口方向一致的三条线
|
||
AcGeLine3d lineStart(ptStart - vtStart * 500, ptStart + vtStart * 500);
|
||
AcGeLine3d lineBranch(ptBranch - vtBranch * 500, ptBranch + vtBranch * 500);
|
||
AcGeLine3d lineEnd(ptEnd - vtEnd * 500, ptEnd + vtEnd * 500);
|
||
|
||
AcGeVector3d vtPrjNormal = vtStart.crossProduct(vtBranch);
|
||
AcGePlane planePrj(ptStart, vtPrjNormal);
|
||
|
||
AcGePoint3d ptIntersect1, ptIntersect2;
|
||
lineStart.projIntersectWith(lineBranch, vtPrjNormal, ptIntersect1, ptIntersect2);
|
||
AcGeTol tol;
|
||
tol.setEqualPoint(1);
|
||
tol.setEqualVector(1 / 10.0);
|
||
double dDist = ptIntersect1.distanceTo(ptIntersect2);
|
||
double dEleSub = 1.1e-3;
|
||
if(dDist < dEleSub)
|
||
{
|
||
if (!lineStart.intersectWith(lineBranch, ptIntersect1, tol))
|
||
return FALSE;
|
||
|
||
AcGeLineSeg3d segStart(ptStart, vtStart);
|
||
AcGeLineSeg3d segBranch(ptBranch, vtBranch);
|
||
|
||
AcGeTol tol2;
|
||
tol2.setEqualPoint(1e-3);
|
||
if ((segStart.isOn(ptIntersect1, tol2) || segBranch.isOn(ptIntersect1, tol2)))
|
||
return FALSE;
|
||
if (dDist > fabs(dSThick - dBThick) / 2.0 + dEleSub)
|
||
return FALSE;
|
||
|
||
double dDisStartToEnd = fabs(planePrj.signedDistanceTo(ptStart) - planePrj.signedDistanceTo(ptEnd));
|
||
double dDisBranchToEnd = fabs(planePrj.signedDistanceTo(ptBranch) - planePrj.signedDistanceTo(ptEnd));
|
||
|
||
if (dDisStartToEnd > fabs(dSThick - dEThick) / 2.0 + dEleSub)
|
||
return FALSE;
|
||
else if (dDisBranchToEnd > fabs(dBThick - dEThick) / 2.0 + dEleSub)
|
||
return FALSE;
|
||
}
|
||
else if ((AecHvac::eInsertBranch == eTeeType || AecHvac::eInsertIntubBranch == eTeeType
|
||
|| AecHvac::eArcuateIntubBranch == eTeeType) && eRect == eSectType)
|
||
{
|
||
if (dSThick < dBThick - dEleSub || dDist > fabs(dSThick - dBThick) / 2.0 + dEleSub)
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
double dDisStartToEnd = fabs(planePrj.signedDistanceTo(ptStart) - planePrj.signedDistanceTo(ptEnd));
|
||
double dDisBranchToEnd = fabs(planePrj.signedDistanceTo(ptBranch) - planePrj.signedDistanceTo(ptEnd));
|
||
|
||
if (dDisStartToEnd > fabs(dSThick - dEThick) / 2.0 + dEleSub)
|
||
return FALSE;
|
||
else if (dBThick > dEThick + dEleSub || dDisBranchToEnd > fabs(dBThick - dEThick) / 2.0 + dEleSub)
|
||
return FALSE;
|
||
}
|
||
else
|
||
{
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL ImpHvacTee::GetInterfaceSizeData(int nIndex, AecInterface& pipeInterface) const
|
||
{
|
||
ASSERT(NULL != m_pXDataMap);
|
||
|
||
// 获取对象类型
|
||
AecHvac::HvacTeeType eType = AecHvac::eOrthoBranch;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
|
||
// 获取截面类型
|
||
ESection eSectType = eRect;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
||
|
||
// 获取接口截面、宽度、厚度数据key值
|
||
LPCTSTR pszWidthKey, pszThickKey;
|
||
switch (nIndex)
|
||
{
|
||
case 0:
|
||
pszWidthKey = ((eCircle == eSectType) ? HTEE_StartDiameter : HTEE_StartWidth);
|
||
pszThickKey = HTEE_Thick;
|
||
break;
|
||
case 1:
|
||
pszWidthKey = ((eCircle == eSectType) ? HTEE_EndDiameter : HTEE_EndWidth);
|
||
|
||
{
|
||
double dEndThick(0.0);
|
||
if (m_pXDataMap->GetAt(HTEE_EndThick, dEndThick))
|
||
pszThickKey = HTEE_EndThick;
|
||
else
|
||
pszThickKey = HTEE_Thick;
|
||
}
|
||
|
||
break;
|
||
case 2:
|
||
pszWidthKey = ((eCircle == eSectType) ? HTEE_BranchDiameter : HTEE_BranchWidth);
|
||
pszThickKey = ((AecHvac::eInsertBranch == eType || AecHvac::eInsertIntubBranch == eType) ? HTEE_BranchThick : HTEE_Thick);
|
||
break;
|
||
default:
|
||
return FALSE;
|
||
}
|
||
|
||
// 获取尺寸
|
||
double dWidth = 0.0, dThick = 0.0;
|
||
m_pXDataMap->GetAt(pszWidthKey, dWidth);
|
||
m_pXDataMap->GetAt(pszThickKey, dThick);
|
||
|
||
// 设置接口数据
|
||
pipeInterface.nSectType = eSectType;
|
||
pipeInterface.dSize1 = dWidth;
|
||
pipeInterface.dSize2 = dThick;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
bool ImpHvacTee::GetInterface(AcArray<AecInterface>& arInfs) const
|
||
{
|
||
if (NULL == m_pXDataMap)
|
||
return FALSE;
|
||
|
||
// 获取各点位置
|
||
AcGePoint3d ptStart, ptEnd, ptBran;
|
||
m_pXDataMap->GetAt(HTEE_StartPoint, ptStart);
|
||
m_pXDataMap->GetAt(HTEE_BranchPoint, ptBran);
|
||
m_pXDataMap->GetAt(HTEE_EndPoint, ptEnd);
|
||
|
||
AecHvac::HvacTeeType eType = AecHvac::eOrthoBranch;
|
||
m_pXDataMap->GetAt(HTEE_Type, (int&)eType);
|
||
ESection eSectType = eRect;
|
||
m_pXDataMap->GetAt(HVAC_SectType, (int &)eSectType);
|
||
|
||
// 求各端方向
|
||
AcGeVector3d vtStart, vtEnd, vtBran;
|
||
m_pXDataMap->GetAt(HTEE_StartDir, vtStart);
|
||
m_pXDataMap->GetAt(HTEE_EndDir, vtEnd);
|
||
m_pXDataMap->GetAt(HTEE_BranchDir, vtBran);
|
||
|
||
if (eType == AecHvac::eInsertBranch)//承插
|
||
{
|
||
if (eSectType == eCircle)
|
||
{
|
||
//承插 -- 圆型
|
||
return GetInsertBranchCircle2DInfs(arInfs);
|
||
}
|
||
}
|
||
else if (eType == AecHvac::eInclineBranch)//斜接
|
||
{
|
||
if (eSectType == eCircle)
|
||
{
|
||
return GetInclineBranchCircle2DInfs(arInfs);
|
||
}
|
||
}
|
||
|
||
AecInterface inf;
|
||
inf.idOwner = m_pOwnerEnt->objectId();
|
||
for (int nIndex = 0;nIndex < 3;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;
|
||
}
|
||
case 2:
|
||
{
|
||
// 没有管件连接
|
||
inf.vtDir = vtBran;
|
||
inf.ptPos = ptBran;
|
||
GetInterfaceSizeData(nIndex, inf);
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
arInfs.append(inf);
|
||
}
|
||
return true;
|
||
}
|
||
|