Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipebase/THImpHvacReducer.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

5230 lines
146 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "StdArx.h"
#include "THImpHvacReducer.h"
#include "TDbInterfaceRecord.h"
#include "TDbXDataMap.h"
#include "TDbInterfaceMsgWrite.h"
#include "math.h"
#include "dbxutil.h"
#include "dbsymutl.h"
using namespace TDb;
THImpHvacReducer::THImpHvacReducer()
{
}
THImpHvacReducer::~THImpHvacReducer()
{
}
Acad::ErrorStatus THImpHvacReducer::getClassID(CLSID* pClsid) const
{
// #if (ADS < 16)
// // {C7DFDF6A-A5F2-4add-ADCC-7AC0675AB6E5}
// CLSID CLSID_PipeBaseEntity = {0xC7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE5 }};
// #endif
//
// #if (ADS == 16)
// // {C7DFDF6A-A5F2-4add-ADCC-7AC0675AB6E5}
// CLSID CLSID_PipeBaseEntity = {0xC7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE6 }};
// #endif
//
// #if (ADS == 17)
// // {C7DFDF6A-A5F2-4add-ADCC-7AC0675AB6E7}
// CLSID CLSID_PipeBaseEntity = {0xC7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE7 }};
// #endif
//
// #if (ADS == 18)
// CLSID CLSID_PipeBaseEntity = {0xD7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE8 }};
// #endif
//
// #if (ADS == 19)
// CLSID CLSID_PipeBaseEntity = {0xD7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE8 }};
// #endif
return Acad::eOk;
}
BOOL THImpHvacReducer::OPMInfo(LPCTSTR pszName, TDb::OPMInfo* pInfo)
{
ASSERT(NULL != pszName && NULL != pInfo);
// 暖通基本参数设置
if (0 == _tcsicmp(pszName, KEY_RUNTIME))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = FALSE;
// 提供数据列表和对应关系
if (NULL != pInfo->parsValues && NULL != pInfo->parlValues)
{
pInfo->parsValues->Add(_T("变径"));
pInfo->parlValues->Add(TDb::eReduce);
}
// 全局属性,需要特殊处理数据获取和设置
if (NULL != pInfo->pXData)
{
// 获取数据
if (0 == pInfo->pXData->nVt)
{
pInfo->pXData->nVt = TXINT;
pInfo->pXData->nVal = TDb::eReduce;
}
// 设置数据
else
{
pInfo->pXData->nVt = 0; // 设置处理完成标识
}
}
return TRUE;
}
if (0 == _tcsicmp(pszName, KEY_Type))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = FALSE;
// 提供数据列表和对应关系
if (NULL != pInfo->parsValues && NULL != pInfo->parlValues)
{
HvacSectType eStartSect(TDb::eRectangular);
HvacSectType eEndSect = eStartSect;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSect);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSect);
if (eStartSect == eEndSect)
{
pInfo->parsValues->Add(_T("变径"));
pInfo->parlValues->Add(0);
}
else
{
pInfo->parsValues->Add(_T("天圆地方"));
pInfo->parlValues->Add(0);
}
}
return TRUE;
}
if (0 == _tcsicmp(pszName, HVAC_HasBaseLine))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
// 提供数据列表和对应关系
if (NULL != pInfo->parsValues && NULL != pInfo->parlValues)
{
pInfo->parsValues->Add(_T("隐藏"));
pInfo->parlValues->Add(0);
pInfo->parsValues->Add(_T("显示"));
pInfo->parlValues->Add(1);
}
return TRUE;
}
if (0 == _tcsicmp(pszName, HVAC_IsSingleLine))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
// 提供数据列表和对应关系
if (NULL != pInfo->parsValues && NULL != pInfo->parlValues)
{
pInfo->parsValues->Add(_T("双线"));
pInfo->parlValues->Add(0);
pInfo->parsValues->Add(_T("单线"));
pInfo->parlValues->Add(1);
}
TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo);
return TRUE;
}
// 获得单线状态,当状态为单线时不显示
BOOL bSingleLine = FALSE;
m_pXDataMap->GetAt(HVAC_IsSingleLine, bSingleLine);
// 变径参数数据设置
// HRED_StartSectType和HVAC_SectType定义相同,为同一个值
// 为区分显示名称,借用未被使用的KEY_StartSectType值来表达
if (0 == _tcsicmp(pszName, KEY_StartSectType))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
// 提供数据列表和对应关系
if (NULL != pInfo->parsValues && NULL != pInfo->parlValues)
{
pInfo->parsValues->Add(_T("矩形"));
pInfo->parlValues->Add(TDb::eRectangular);
pInfo->parsValues->Add(_T("圆形"));
pInfo->parlValues->Add(TDb::eCircular);
}
// 替代属性,需要特殊处理数据获取和设置
if (NULL != pInfo->pXData)
{
// 获取数据
if (0 == pInfo->pXData->nVt)
{
m_pXDataMap->GetAt(HRED_StartSectType, *pInfo->pXData);
}
// 设置数据
else
{
m_pXDataMap->SetAt(HRED_StartSectType, *pInfo->pXData);
pInfo->pXData->nVt = 0; // 设置处理完成标识
}
}
return TRUE;
}
if (0 == _tcsicmp(pszName, HRED_EndSectType))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
// 提供数据列表和对应关系
if (NULL != pInfo->parsValues && NULL != pInfo->parlValues)
{
pInfo->parsValues->Add(_T("矩形"));
pInfo->parlValues->Add(TDb::eRectangular);
pInfo->parsValues->Add(_T("圆形"));
pInfo->parlValues->Add(TDb::eCircular);
}
return TRUE;
}
// 尺寸计算方式
if (0 == _tcsicmp(pszName, HRED_ComputeType))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = FALSE;
// 提供数据列表和对应关系
if (NULL != pInfo->parsValues && NULL != pInfo->parlValues)
{
pInfo->parsValues->Add(_T("自动计算"));
pInfo->parlValues->Add(TDb::eAuto);
pInfo->parsValues->Add(_T("角度"));
pInfo->parlValues->Add(TDb::eAngle);
pInfo->parsValues->Add(_T("长度"));
pInfo->parlValues->Add(TDb::eLength);
}
return TRUE;
}
// 具体设置角度或长度
HvacReduComType eComTyep = TDb::eAuto;
m_pXDataMap->GetAt(HRED_ComputeType, (int&)eComTyep);
if (0 == _tcsicmp(pszName, HRED_Angle) && eComTyep == TDb::eAngle
|| 0 == _tcsicmp(pszName, HRED_Length) && eComTyep == TDb::eLength)
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
if (NULL != pInfo->pXData)
{
// 获取数据
if (0 == pInfo->pXData->nVt)
{
if (0 == _tcsicmp(pszName, HRED_Angle) && eComTyep == TDb::eAngle)
{
m_pXDataMap->GetAt(HRED_Angle, *pInfo->pXData);
pInfo->pXData->dVal[0] *= 180/PI;
}
}
else // 设置数据
{
if (0 == _tcsicmp(pszName, HRED_Angle) && eComTyep == TDb::eAngle)
m_pXDataMap->SetAt(HRED_Angle, pInfo->pXData->dVal[0] * PI / 180);
else
m_pXDataMap->SetAt(HRED_Length, pInfo->pXData->dVal[0]);
// 先记录更新前信息
AcGePoint3dArray ptArrOrig;
AcDbObjectIdArray idArr;
TAuxTools::GetInterfacePoint(this, ptArrOrig);
TAuxTools::GetInterfaceId(this, idArr);
IsValid(NULL);
// 更新连接实体
if (NULL != m_pOwnerEnt)
{
AcGePoint3dArray ptArrNew;
TAuxTools::GetInterfacePoint(this, ptArrNew);
TAuxTools::DealWithConEnt(idArr, ptArrOrig, ptArrNew, m_pOwnerEnt->objectId());
m_pOwnerEnt->close();
acedPostCommand(_T("redraw\n"));
}
pInfo->pXData->nVt = 0;
}
}
return TRUE;
}
if (0 == _tcsicmp(pszName, HRED_StartWidth))
{
// 获得截面,当截面不为圆型时显示并可改
HvacSectType eSectType = eRectangular;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
pInfo->bVisible = (TDb::eCircular != eSectType);
pInfo->bEditable = pInfo->bVisible;
TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo);
return TRUE;
}
if (0 == _tcsicmp(pszName, HRED_StartThick))
{
// 获得截面,当截面不为圆型时显示并可改
HvacSectType eSectType = eRectangular;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
pInfo->bVisible = (TDb::eCircular != eSectType);
pInfo->bEditable = pInfo->bVisible;
return TRUE;
}
if (0 == _tcsicmp(pszName, HRED_EndWidth))
{
// 获得截面,当截面不为圆型时显示并可改
HvacSectType eSectType = eRectangular;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
pInfo->bVisible = (TDb::eCircular != eSectType);
pInfo->bEditable = pInfo->bVisible;
TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo);
return TRUE;
}
if (0 == _tcsicmp(pszName, HRED_EndThick))
{
// 获得截面,当截面不为圆型时显示并可改
HvacSectType eSectType = eRectangular;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
pInfo->bVisible = (TDb::eCircular != eSectType);
pInfo->bEditable = pInfo->bVisible;
return TRUE;
}
// HRED_StartDiameter和HRED_StartWidth定义相同,为同一个值
// 为区分显示名称,借用未被使用的KEY_StartDiameter值来表达
if (0 == _tcsicmp(pszName, KEY_StartDiameter))
{
// 获得截面,当截面为圆型时显示并可改
HvacSectType eSectType = eRectangular;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
pInfo->bVisible = (TDb::eCircular == eSectType);
pInfo->bEditable = pInfo->bVisible;
// 替代属性,需要特殊处理数据获取和设置
if (NULL != pInfo->pXData)
{
// 获取数据
if (0 == pInfo->pXData->nVt)
{
m_pXDataMap->GetAt(HRED_StartDiameter, *pInfo->pXData);
}
// 设置数据
else
{
TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, HRED_StartDiameter, pInfo);
}
}
return TRUE;
}
// HRED_EndDiameter和HRED_EndWidth定义相同,为同一个值
// 为区分显示名称,借用未被使用的KEY_EndDiameter值来表达
if (0 == _tcsicmp(pszName, KEY_EndDiameter))
{
// 获得截面,当截面为圆型时显示并可改
HvacSectType eSectType = eRectangular;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
pInfo->bVisible = (TDb::eCircular == eSectType);
pInfo->bEditable = pInfo->bVisible;
// 替代属性,需要特殊处理数据获取和设置
if (NULL != pInfo->pXData)
{
// 获取数据
if (0 == pInfo->pXData->nVt)
{
m_pXDataMap->GetAt(HRED_EndDiameter, *pInfo->pXData);
}
// 设置数据
else
{
TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, HRED_EndDiameter, pInfo);
}
}
return TRUE;
}
if (0 == _tcsicmp(pszName, HRED_StartPoint))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
// 整体移动
if (NULL != pInfo->pXData && 0 != pInfo->pXData->nVt)
{
// 改变顶点变换行为
AcGePoint3d ptStart;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
AcGeVector3d offset = asPnt3d(pInfo->pXData->dVal) - ptStart;
AcGeMatrix3d mat;
mat.setToTranslation(offset);
transformBy(mat);
// pInfo->pXData->nVt = 0; // 设置处理完成标识
TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo);
}
return TRUE;
}
if (0 == _tcsicmp(pszName, HRED_EndPoint))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
// 整体移动
if (NULL != pInfo->pXData && 0 != pInfo->pXData->nVt)
{
// 改变顶点变换行为
AcGePoint3d ptEnd;
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
AcGeVector3d offset = asPnt3d(pInfo->pXData->dVal) - ptEnd;
AcGeMatrix3d mat;
mat.setToTranslation(offset);
transformBy(mat);
// pInfo->pXData->nVt = 0; // 设置处理完成标识
TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo);
}
return TRUE;
}
return FALSE;
}
void THImpHvacReducer::GetTips(CMapStringToString& mapLable2Tip) const
{
}
void THImpHvacReducer::list() const
{
ASSERT(NULL != m_pXDataMap);
// 管件类型
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 暖通:变径"));
// 截面类型
HvacSectType eStartSectType = eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType);
switch (eStartSectType)
{
case TDb::eRectangular: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:矩形")); break;
case TDb::eCircular: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:圆形")); break;
case TDb::eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:扁圆形")); break;
}
HvacSectType eEndSectType = eRectangular;
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
switch (eEndSectType)
{
case TDb::eRectangular: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:矩形")); break;
case TDb::eCircular: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:圆形")); break;
case TDb::eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:扁圆形")); break;
}
// double dOffset = 0.0;
// m_pXDataMap->GetAt(HRED_Offset, dOffset);
// acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t偏心距离:%.2f"), dOffset);
// 圆型截面显示直径
if (TDb::eCircular == eStartSectType)
{
double dDiameter = 0.0;
m_pXDataMap->GetAt(HRED_StartDiameter, dDiameter);
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t始端直径:%.2f"), dDiameter);
}
// 非圆型截面显示宽度和厚度
else
{
double dWidth = 0.0, dThick = 0.0;
m_pXDataMap->GetAt(HRED_StartWidth, dWidth);
m_pXDataMap->GetAt(HRED_StartThick, dThick);
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t始端宽度:%.2f 始端厚度:%.2f"), dWidth, dThick);
}
// 圆型截面显示直径
if (TDb::eCircular == eEndSectType)
{
double dDiameter = 0.0;
m_pXDataMap->GetAt(HRED_EndDiameter, dDiameter);
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t末端直径:%.2f"), dDiameter);
}
// 非圆型截面显示宽度和厚度
else
{
double dWidth = 0.0, dThick = 0.0;
m_pXDataMap->GetAt(HRED_EndWidth, dWidth);
m_pXDataMap->GetAt(HRED_EndThick, dThick);
acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t末端宽度:%.2f 末端厚度:%.2f"), dWidth, dThick);
}
// 起点
AcGePoint3d pt;
m_pXDataMap->GetAt(HRED_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(HRED_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);
}
BOOL THImpHvacReducer::IsHorzAlignment() const
{
// 获得法向量
AcGeVector3d vtSect;
m_pXDataMap->GetAt(HRED_StartDir, vtSect);
// 获得UCS坐标Z向量
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
return vtSect.isPerpendicularTo(vtZAxis);
}
BOOL THImpHvacReducer::IsVertAlignment() const
{
// 获得法向量
AcGeVector3d vtSect;
m_pXDataMap->GetAt(HRED_StartDir, vtSect);
// 获得UCS坐标Z向量
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
return vtSect.isParallelTo(vtZAxis);
}
BOOL THImpHvacReducer::IsInclineAlignment() const
{
// 获得法向量
AcGeVector3d vtSect;
m_pXDataMap->GetAt(HRED_StartDir, vtSect);
// 获得UCS坐标Z向量
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
return !vtSect.isPerpendicularTo(vtZAxis) && !vtSect.isParallelTo(vtZAxis);
}
BOOL THImpHvacReducer::IsSingleLine() const
{
ASSERT(NULL != m_pXDataMap);
BOOL bSingleLine = FALSE;
m_pXDataMap->GetAt(HVAC_IsSingleLine, (int&)bSingleLine);
return bSingleLine;
}
AcGeVector3d THImpHvacReducer::GetSectNormal() const
{
ASSERT(NULL != m_pXDataMap);
AcGeVector3d vtSta;
m_pXDataMap->GetAt(HRED_StartDir, vtSta);
if (!vtSta.isParallelTo(TAuxTools::GetUcsZvt()))
{
// Lixl变径为倾斜方向时(不平行Z轴,不垂直Z轴)返回map里面的方向,不向XY平面投影
if (!vtSta.isPerpendicularTo(TAuxTools::GetUcsZvt()))
return vtSta;
else
vtSta = vtSta.orthoProject(TAuxTools::GetUcsZvt());
}
return vtSta;
// 获取变径各点位置
// double dOffsetH = 0.0;
// AcGePoint3d ptStart, ptEnd;
// AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
// m_pXDataMap->GetAt(HRED_Offset, dOffsetH);
// m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
// m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
//
// // 计算起始侧面法向量
// AcGePlane plan;
// plan.set(ptStart, vtNormal);
// ptEnd = ptEnd.orthoProject(plan);
// AcGeVector3d vtStart = ptStart - ptEnd;
// double dAngle = asin(dOffsetH / ptStart.distanceTo(ptEnd));
// vtStart.rotateBy(-dAngle, vtNormal);
// return vtStart.normalize();
}
void THImpHvacReducer::GetKindName(CString& sName)
{
sName = _T("TCH_HREDUCER");
}
int THImpHvacReducer::GetInterfaceCount() const
{
// 返回接口个数
return 2;
}
BOOL THImpHvacReducer::GetInterfaceSizeData(int nIndex, TInterface& pipeInterface) const
{
ASSERT(NULL != m_pXDataMap);
// 获取截面类型
TDb::HvacSectType eSectType = TDb::eRectangular;
// 获取接口截面、宽度、厚度数据key值
LPCTSTR pszWidthKey, pszThickKey;
switch (nIndex)
{
case 0:
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectType);
pszWidthKey = ((TDb::eCircular == eSectType) ? HRED_StartDiameter : HRED_StartWidth);
pszThickKey = HRED_StartThick;
break;
case 1:
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSectType);
pszWidthKey = ((TDb::eCircular == eSectType) ? HRED_EndDiameter : HRED_EndWidth);
pszThickKey = HRED_EndThick;
break;
default:
return FALSE;
}
// 获取尺寸
double dWidth = 0.0, dThick = 0.0;
m_pXDataMap->GetAt(pszWidthKey, dWidth);
m_pXDataMap->GetAt(pszThickKey, dThick);
// 设置接口数据
pipeInterface.SetType(eSectType);
pipeInterface.SetSize(dWidth, dThick);
return TRUE;
}
BOOL THImpHvacReducer::GetInterface(int nIndex, TInterface& pipeInterface) const
{
if (NULL == m_pXDataMap)
return FALSE;
// 获取变径各点位置
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 求两端方向
AcGeVector3d vtStart = GetSectNormal();
AcGeVector3d vtEnd = -vtStart;
AcDbObjectId id;
switch(nIndex)
{
case 0:
// 如果起始接口和第一个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface))
{
GetInterfaceSizeData(nIndex, pipeInterface);
return TRUE;
}
// 如果起始接口和第二个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface))
{
GetInterfaceSizeData(nIndex, pipeInterface);
return TRUE;
}
// 没有管件连接
pipeInterface.SetOutDir(vtStart);
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
pipeInterface.SetPosition(ptStart);
GetInterfaceSizeData(nIndex, pipeInterface);
return TRUE;
case 1:
// 如果末尾接口和第一个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface))
{
GetInterfaceSizeData(nIndex, pipeInterface);
return TRUE;
}
// 如果末尾接口和第二个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface))
{
GetInterfaceSizeData(nIndex, pipeInterface);
return TRUE;
}
// 没有管件连接
pipeInterface.SetOutDir(vtEnd);
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
pipeInterface.SetPosition(ptEnd);
GetInterfaceSizeData(nIndex, pipeInterface);
return TRUE;
}
return FALSE;
}
BOOL THImpHvacReducer::GetInterface(const AcGePoint3d& ptConnect,TInterface& pipeInterface) const
{
if (NULL == m_pXDataMap)
return FALSE;
// 获取变径各点位置
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 求两端方向
AcGeVector3d vtStart = GetSectNormal();
AcGeVector3d vtEnd = -vtStart;
// 计算测试点到始末点的距离
double dDist1 = ptConnect.distanceTo(ptStart);
double dDist2 = ptConnect.distanceTo(ptEnd);
AcDbObjectId id;
// 位于起始点
if (dDist1 < 1.e-3)
{
// 如果起始接口和第一个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface))
{
GetInterfaceSizeData(0, pipeInterface);
return TRUE;
}
// 如果起始接口和第二个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface))
{
GetInterfaceSizeData(0, pipeInterface);
return TRUE;
}
// 没有管件连接
pipeInterface.SetOutDir(vtStart);
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
pipeInterface.SetPosition(ptStart);
GetInterfaceSizeData(0, pipeInterface);
return TRUE;
}
// 位于末尾点
if (dDist2 < 1.e-3)
{
// 如果末尾接口和第一个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface))
{
GetInterfaceSizeData(1, pipeInterface);
return TRUE;
}
// 如果末尾接口和第二个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface))
{
GetInterfaceSizeData(1, pipeInterface);
return TRUE;
}
// 没有管件连接
pipeInterface.SetOutDir(vtEnd);
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
pipeInterface.SetPosition(ptEnd);
GetInterfaceSizeData(1, pipeInterface);
return TRUE;
}
return FALSE;
}
BOOL THImpHvacReducer::HasInterface(const AcGePoint3d& ptConnect,const AcGeVector3d& vtDir)
{
if (NULL == m_pXDataMap)
return FALSE;
// 获取变径各点位置
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 求两端方向
AcGeVector3d vtStart = GetSectNormal();
AcGeVector3d vtEnd = -vtStart;
// 计算测试点到始末点的距离
double dDist1 = ptConnect.distanceTo(ptStart);
double dDist2 = ptConnect.distanceTo(ptEnd);
// 位于起始点
if (dDist1 < 1.e-3)
return (vtDir.isParallelTo(vtStart));
// 位于末尾点
if (dDist2 < 1.e-3)
return (vtDir.isParallelTo(vtEnd));
return FALSE;
}
BOOL THImpHvacReducer::SetInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect)
{
if (NULL == m_pXDataMap)
return FALSE;
// 打开对象
AcDbEntity* pEnt;
if (Acad::eOk != acdbOpenObject(pEnt, idConnect, AcDb::kForRead))
return FALSE;
// 检查对象类型,是否是暖通管件
if (!(pEnt->isKindOf(TDbHvacDuct::desc()) || pEnt->isKindOf(TDbHvacFitting::desc())
|| pEnt->isKindOf(TDbHvacEquipment::desc())))
{
pEnt->close();
return FALSE;
}
// 获取变径各点位置
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 求两端方向
AcGeVector3d vtStart = GetSectNormal();
AcGeVector3d vtEnd = -vtStart;
// 计算测试点到始末点的距离
double dDist1 = ptConnect.distanceTo(ptStart);
double dDist2 = ptConnect.distanceTo(ptEnd);
// 基类指针
TDbInterfacesObj* pInterfaceObj = TDbInterfacesObj::cast(pEnt);
ASSERT(NULL != pInterfaceObj);
// 位于起始点
if (dDist1 < 1.e-3 && pInterfaceObj->HasInterface(ptStart, vtStart))
{
m_pXDataMap->SetAt(KEY_IDCNT1, idConnect);
pEnt->close();
return TRUE;
}
// 位于末尾点
if (dDist2 < 1.e-3 && pInterfaceObj->HasInterface(ptEnd, vtEnd))
{
m_pXDataMap->SetAt(KEY_IDCNT2, idConnect);
pEnt->close();
return TRUE;
}
pEnt->close();
return FALSE;
}
BOOL THImpHvacReducer::RemoveInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect)
{
if (NULL == m_pXDataMap)
return FALSE;
// 浅层次删除; 命名字典中的关系,需要外面移除关系,只移除内部关系
AcDbObjectId id;
m_pXDataMap->GetAt(KEY_IDCNT1, id);
if (id == idConnect)
{
m_pXDataMap->SetAt(KEY_IDCNT1, AcDbObjectId::kNull);
return TRUE;
}
m_pXDataMap->GetAt(KEY_IDCNT2, id);
if (id == idConnect)
{
m_pXDataMap->SetAt(KEY_IDCNT2, AcDbObjectId::kNull);
return TRUE;
}
return FALSE;
}
BOOL THImpHvacReducer::NotifyInterfaceToModify(const TInterfaceModifyMsg& iModiMsg,TInterfaceModifyMsgs& iModiMsgs)
{
if (NULL == m_pXDataMap)
return FALSE;
// 获得消息传递设置, 确定是否传递消息
CString sDispatch = _T("0");
GetGlobalContext(KEY_DISPATCHMSG, sDispatch);
BOOL bDispatch = (_ttoi(sDispatch) != 0);
BOOL bMsgTranslate = FALSE;
// 获得消息类型, 根据消息类型处理
TDb::InterfaceOper eOper = iModiMsg.GetInterfaceOper();
switch (eOper)
{
case TDb::eMoveGripPoint:
// 夹点移动消息处理
bMsgTranslate = OnMoveGripPointMsgNotify(iModiMsg, iModiMsgs);
break;
case TDb::eTransformBy:
// 对象移动消息处理
bMsgTranslate = OnTransformMsgNotify(iModiMsg, iModiMsgs);
break;
case TDb::eSize:
// 尺寸调整消息处理
bMsgTranslate = OnSizeMsgNotify(iModiMsg, iModiMsgs);
break;
default:
return bMsgTranslate;
}
// 记录修改标识
if (m_pOwnerEnt != NULL)
m_pOwnerEnt->recordGraphicsModified();
return bMsgTranslate;
}
Acad::ErrorStatus THImpHvacReducer::ExplodeOrDraw3d(XExplodeDraw& mode) const
{
if (NULL == m_pXDataMap)
return Acad::eOk;
// 变径类型
TDb::HvacSectType eStartSectType = TDb::eRectangular;
TDb::HvacSectType eEndSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
// 始端截面
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
// 末端截面
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
ExplodeRect2Rect3d(mode);
break;
case TDb::eCircular: // 园形
ExplodeRect2Cir3d(mode);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 园形
// 末端截面
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
ExplodeCir2Rect3d(mode);
break;
case TDb::eCircular: // 园形
ExplodeCir2Cir3d(mode);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eOblate: // 扁圆形
// 末端截面
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
break;
case TDb::eCircular: // 园形
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacReducer::ExplodeOrDraw2d(XExplodeDraw& mode) const
{
if (m_pXDataMap == NULL)
{
return Acad::eNotImplementedYet;
}
TComplexCurve cplCurve;
MakeCurves(cplCurve);
TDbExtentsEdge edage;
edage.SetEdage(cplCurve);
BOOL bWeight = FALSE;
AcDbObjectId idReal = ((TDbInterfacesObj*)m_pOwnerEnt)->layerId();
AcDbObjectId idDash = ((TDbInterfacesObj*)m_pOwnerEnt)->DashLayer();
AcDbObjectId idCent = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
edage.ExplodeOrDraw2d(mode,idReal,idDash,idCent,NULL,bWeight,FALSE);
return Acad::eOk;
}
AcDbPolyline* THImpHvacReducer::MakePolyCurve() const
{
if (NULL == m_pXDataMap)
return NULL;
// 变径类型
TDb::HvacSectType eStartSectType = TDb::eRectangular;
TDb::HvacSectType eEndSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType,(int&) eStartSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
if (IsHorzAlignment()) // 水平
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2RectPolyCurve();
break;
case TDb::eCircular: // 园形
return MakeRect2CirPolyCurve();
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 园形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2RectPolyCurve();
break;
case TDb::eCircular: // 园形
return MakeCir2CirPolyCurve();
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eOblate: // 扁圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
break;
case TDb::eCircular: // 园形
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
else if(IsVertAlignment()) // 立管
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2RectPolyCurveVer();
break;
case TDb::eCircular: // 园形
return MakeRect2CirPolyCurveVer();
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 园形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2RectPolyCurveVer();
break;
case TDb::eCircular: // 园形
return MakeCir2CirPolyCurveVer();
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eOblate: // 扁圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
break;
case TDb::eCircular: // 园形
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
else if (IsInclineAlignment())
{
switch (eStartSectType)
{
case TDb::eRectangular:
switch (eEndSectType)
{
case TDb::eRectangular: // 方对方
return MakeRect2RectPolyCurve();
break;
case TDb::eCircular: // 方对圆
return MakeRect2CirPolyCurve();
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular:
switch (eEndSectType)
{
case TDb::eRectangular: // 圆对方
return MakeCir2RectPolyCurve();
break;
case TDb::eCircular: // 圆对圆
return MakeIncCir2CirPolyCurve();
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
return NULL;
}
BOOL THImpHvacReducer::MakeCurves(TComplexCurve& cplCurve) const
{
if (NULL == m_pXDataMap)
return FALSE;
// 变径类型
TDb::HvacSectType eStartSectType = TDb::eRectangular;
TDb::HvacSectType eEndSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
int nType = 0;
if (IsHorzAlignment()) // 水平
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2Rect2DCurves(cplCurve,nType);
break;
case TDb::eCircular: // 圆形
return MakeRect2Cir2DCurves(cplCurve,nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2Rect2DCurves(cplCurve,nType);
break;
case TDb::eCircular: // 圆形
return MakeCir2Cir2DCurves(cplCurve,nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eOblate: // 扁圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
break;
case TDb::eCircular: // 园形
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
else if(IsVertAlignment()) // 立管
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2Rect2DCurvesVer(cplCurve,nType);
break;
case TDb::eCircular: // 圆形
return MakeRect2Cir2DCurvesVer(cplCurve,nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2Rect2DCurvesVer(cplCurve,nType);
break;
case TDb::eCircular: // 圆形
return MakeCir2Cir2DCurvesVer(cplCurve,nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eOblate: // 扁圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
break;
case TDb::eCircular: // 圆形
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
else if (IsInclineAlignment()) //倾斜变径二维Lixl
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2Rect2DCurves(cplCurve,nType);
break;
case TDb::eCircular: // 圆形
return MakeRect2Cir2DCurves(cplCurve,nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2Rect2DCurves(cplCurve,nType);
break;
case TDb::eCircular: // 圆形
return MakeIncCir2Cir2DCurves(cplCurve,nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
return FALSE;
}
BOOL THImpHvacReducer::GetCurvesInSide(TComplexCurve& compCurve) const
{
if (NULL == m_pXDataMap)
return FALSE;
// 变径类型
TDb::HvacSectType eStartSectType = TDb::eRectangular;
TDb::HvacSectType eEndSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
int nType = 1;
if (IsHorzAlignment()) // 水平
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2Rect2DCurves(compCurve, nType);
break;
case TDb::eCircular: // 园形
return MakeRect2Cir2DCurves(compCurve, nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 园形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2Rect2DCurves(compCurve, nType);
break;
case TDb::eCircular: // 园形
return MakeCir2Cir2DCurves(compCurve, nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eOblate: // 扁圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
break;
case TDb::eCircular: // 园形
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
else if(IsVertAlignment()) // 立管
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2Rect2DCurvesVer(compCurve, nType);
break;
case TDb::eCircular: // 园形
return MakeRect2Cir2DCurvesVer(compCurve, nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 园形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2Rect2DCurvesVer(compCurve, nType);
break;
case TDb::eCircular: // 园形
return MakeCir2Cir2DCurvesVer(compCurve, nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eOblate: // 扁圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
break;
case TDb::eCircular: // 园形
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
else if (IsInclineAlignment())
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2Rect2DCurves(compCurve,nType);
break;
case TDb::eCircular: // 圆形
return MakeRect2Cir2DCurves(compCurve,nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2Rect2DCurves(compCurve,nType);
break;
case TDb::eCircular: // 圆形
return MakeIncCir2Cir2DCurves(compCurve,nType);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
return FALSE;
}
BOOL THImpHvacReducer::MakePolyCurveFaces(AcDbVoidPtrArray& arFaces)
{
if (NULL == m_pXDataMap)
return FALSE;
// 变径类型
TDb::HvacSectType eStartSectType = TDb::eRectangular;
TDb::HvacSectType eEndSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType,(int&) eStartSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
if (IsHorzAlignment()) // 水平
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2RectPolyCurveFaces(arFaces);
break;
case TDb::eCircular: // 园形
return MakeRect2CirPolyCurveFaces(arFaces);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 园形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2RectPolyCurveFaces(arFaces);
break;
case TDb::eCircular: // 园形
return MakeCir2CirPolyCurveFaces(arFaces);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eOblate: // 扁圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
break;
case TDb::eCircular: // 园形
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}
}
else if(IsVertAlignment()) // 立管
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2RectPolyCurveFacesVer(arFaces);
break;
case TDb::eCircular: // 园形
return MakeRect2CirPolyCurveFacesVer(arFaces);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eCircular: // 园形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2RectPolyCurveFacesVer(arFaces);
break;
case TDb::eCircular: // 园形
return MakeCir2CirPolyCurveFacesVer(arFaces);
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
case TDb::eOblate: // 扁圆形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
break;
case TDb::eCircular: // 园形
break;
case TDb::eOblate: // 扁圆形
break;
}
break;
}//倾斜变径二维先按水平画Lixl
}
else if (IsInclineAlignment())
{
switch (eStartSectType)
{
case TDb::eRectangular: // 矩形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeRect2RectPolyCurveFaces(arFaces);
break;
case TDb::eCircular: // 园形
return MakeRect2CirPolyCurveFaces(arFaces);
break;
}
break;
case TDb::eCircular: // 园形
switch (eEndSectType)
{
case TDb::eRectangular: // 矩形
return MakeCir2RectPolyCurveFaces(arFaces);
break;
case TDb::eCircular: // 园形
return MakeIncCir2CirPolyCurveFaces(arFaces);
break;
}
break;
}
}
return FALSE;
}
Acad::ErrorStatus THImpHvacReducer::transformBy(const AcGeMatrix3d& xform)
{
if (NULL == m_pXDataMap)
return Acad::eNotApplicable;
// 取得位置点和法向
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal, vtSta;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
m_pXDataMap->GetAt(HRED_StartDir, vtSta);
// 变换位置
ptStart.transformBy(xform);
ptEnd.transformBy(xform);
vtNormal.transformBy(xform);
vtSta.transformBy(xform);
vtNormal.normalize();
vtSta.normalize();
// 更新点和法向
m_pXDataMap->SetAt(HRED_StartPoint, ptStart);
m_pXDataMap->SetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->SetAt(KEY_NORMAL, vtNormal);
m_pXDataMap->SetAt(HRED_StartDir, vtSta);
// 设置尺寸
double dScale = xform.scale();
double dStaWidth(0.0), dEndWidth(0.), dStaThick(0.0), dEndThick(0.0);
m_pXDataMap->GetAt(HRED_StartWidth, dStaWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStaThick);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
dStaWidth *= dScale;
dEndWidth *= dScale;
dStaThick *= dScale;
dEndThick *= dScale;
m_pXDataMap->SetAt(HRED_StartWidth, dStaWidth);
m_pXDataMap->SetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->SetAt(HRED_StartThick, dStaThick);
m_pXDataMap->SetAt(HRED_EndThick, dEndThick);
// 传递消息
if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid())
{
// 如果实体不是在当前模型空间中,不做写消息,更新接口处理
AcDbDatabase* pDb = m_pOwnerEnt->database();
if (pDb == NULL) pDb = acdbCurDwg();
AcDbObjectId idModel;
AcDbBlockTable* pTable = NULL;
pDb->getBlockTable(pTable, AcDb::kForRead);
if (pTable != NULL)
{
pTable->getAt(ACDB_MODEL_SPACE, idModel);
pTable->close();
}
if (idModel == m_pOwnerEnt->blockId())
{
// 写入接口更改消息
TInterfaceModifyMsg iMsg;
iMsg.SetInterfaceOper(TDb::eTransformBy);
iMsg.SetMsgValidate(TRUE);
iMsg.SetTransform(xform);
iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
TDbInterfaceMsgWrite msgWrite;
msgWrite.WriteInterfaceMsg(iMsg);
//更新接口记录接口信息
UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform);
}
}
return Acad::eOk;
}
TDb::Position THImpHvacReducer::ExplainGripIndex(int nIndex) const
{
TDb::Position ePos = TDb::eStart;
switch(nIndex)
{
case 0:
ePos = TDb::eStart;
break;
case 1:
ePos = TDb::eEnd;
break;
case 2:
ePos = TDb::eCommand0;
break;
case 3:
ePos = TDb::eCommand1;
break;
}
return ePos;
}
Acad::ErrorStatus THImpHvacReducer::getStretchPoints(AcGePoint3dArray& stretchPoints) const
{
if (NULL == m_pXDataMap)
return Acad::eNotApplicable;
// 取得位置点
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
stretchPoints.append(ptStart);
stretchPoints.append(ptEnd);
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacReducer::getGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
if (NULL == m_pXDataMap)
return Acad::eNotApplicable;
// 取得位置点
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
//夹点
gripPoints.append(ptStart); //STA
gripPoints.append(ptEnd); //END
AcGeVector3d vtStart = GetSectNormal();
vtStart.normalize();
//增加2个命令夹点
AcGePoint3d ptGeCmd1,ptGeCmd2; //按 10 个像素点
// double dCmd = PixelToWcs(10);
ptGeCmd1 = ptStart + g_dCmdOff * vtStart;
ptGeCmd2 = ptEnd - g_dCmdOff * vtStart;
gripPoints.append(ptGeCmd1); //cmd1
gripPoints.append(ptGeCmd2); //cmd2
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacReducer::getOsnapPoints(AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const
{
if (NULL == m_pXDataMap)
return Acad::eNotApplicable;
// 取得位置点
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 根据捕捉模式处理
switch(osnapMode)
{
case AcDb::kOsModeEnd:
snapPoints.append(ptStart);
snapPoints.append(ptEnd);
break;
case AcDb::kOsModeMid:
break;
case AcDb::kOsModeCen:
break;
case AcDb::kOsModePerp:
break;
case AcDb::kOsModeNear:
break;
}
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacReducer::moveStretchPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
if (indices.length() < 2)
return Acad::eNotImplementedYet;
AcGePoint3d ptStart, ptEnd, ptMsg;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
ptStart += offset;
ptEnd += offset;
m_pXDataMap->SetAt(HRED_StartPoint, ptStart);
m_pXDataMap->SetAt(HRED_EndPoint, ptEnd);
if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid())
{
//更新接口记录接口信息
UpdateInterfaceRec(m_pOwnerEnt->objectId(), offset);
return Acad::eOk;
}
return Acad::eNotImplementedYet;
}
Acad::ErrorStatus THImpHvacReducer::moveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
ASSERT(NULL != m_pXDataMap);
int nSize = indices.length();
if (nSize > 0)
{
// 取得位置点
AcGePoint3d ptStart, ptEnd, ptMsg;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
int nIndex = indices.first(); // 选择多个夹点,以first为准
TDb::Position ePos = ExplainGripIndex(nIndex);
TInterfaceModifyMsg iMsg;
TDbInterfaceMsgWrite msgWrite;
AcDbSoftPointerId idOwner;
m_pXDataMap->GetAt(KEY_THISID, idOwner);
switch(ePos)
{
case TDb::eStart:
case TDb::eEnd:
MoveGripRandom(ePos, offset);
break;
/* {
ptStart += offset;
ptEnd += offset;
m_pXDataMap->SetAt(HRED_StartPoint, ptStart);
m_pXDataMap->SetAt(HRED_EndPoint, ptEnd);
// 写入接口更改消息
iMsg.SetMsgPoint(ptStart);//new pos
iMsg.SetGripPosition(ePos);
iMsg.SetMoveGripOffset(offset);
iMsg.SetMsgValidate(TRUE);
iMsg.SetInterfaceOper(TDb::eMoveGripPoint);
iMsg.SetMsgOperateOn(idOwner);
msgWrite.WriteInterfaceMsg(iMsg);
//更新接口记录接口信息
AcGeMatrix3d xform;
xform.setToTranslation(offset);
UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform);
break;
}
case TDb::eEnd:
{
ptStart += offset;
ptEnd += offset;
m_pXDataMap->SetAt(HRED_StartPoint, ptStart);
m_pXDataMap->SetAt(HRED_EndPoint, ptEnd);
// 写入接口更改消息
iMsg.SetMsgPoint(ptEnd);//new pos
iMsg.SetGripPosition(ePos);
iMsg.SetMoveGripOffset(offset);
iMsg.SetMsgValidate(TRUE);
iMsg.SetInterfaceOper(TDb::eMoveGripPoint);
iMsg.SetMsgOperateOn(idOwner);
msgWrite.WriteInterfaceMsg(iMsg);
//更新接口记录接口信息
AcGeMatrix3d xform;
xform.setToTranslation(offset);
UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform);
break;
}
*/ case TDb::eCommand0:
{
// 写入接口更改消息
iMsg.SetMsgPoint(ptStart);
iMsg.SetGripPosition(ePos);
iMsg.SetMoveGripOffset(offset);
iMsg.SetMsgValidate(TRUE);
iMsg.SetInterfaceOper(TDb::eNewCommand);
iMsg.SetPreviewObjToCreate(TDb::ePipe, 0);
iMsg.SetMsgOperateOn(idOwner);
msgWrite.WriteInterfaceMsg(iMsg);
acedPostCommand(_T("\33"));
CString csCmd;
GetGlobalContext()->GetAt(KEY_HVACGRIPCMD, csCmd);
if (!csCmd.IsEmpty())
{
csCmd += _T("\n");
acedPostCommand(csCmd);
}
break;
}
case TDb::eCommand1:
{
// 写入接口更改消息
iMsg.SetMsgPoint(ptEnd);
iMsg.SetGripPosition(ePos);
iMsg.SetMoveGripOffset(offset);
iMsg.SetMsgValidate(TRUE);
iMsg.SetInterfaceOper(TDb::eNewCommand);
iMsg.SetPreviewObjToCreate(TDb::ePipe, 0);
iMsg.SetMsgOperateOn(idOwner);
msgWrite.WriteInterfaceMsg(iMsg);
acedPostCommand(_T("\33"));
CString csCmd;
GetGlobalContext()->GetAt(KEY_HVACGRIPCMD, csCmd);
if (!csCmd.IsEmpty())
{
csCmd += _T("\n");
acedPostCommand(csCmd);
}
break;
}
default:
break;
}
}
return Acad::eOk;
}
// 拖拽管件,支持转向等操作
Acad::ErrorStatus THImpHvacReducer::MoveGripRandom(TDb::Position ePos, const AcGeVector3d& offset )
{
AcGePoint3d ptDrag;
if (ePos == eStart)
m_pXDataMap->GetAt(HRED_StartPoint, ptDrag);
else if (ePos == eEnd)
m_pXDataMap->GetAt(HRED_EndPoint, ptDrag);
TInterfaceModifyMsg iMsg;
iMsg.SetMsgPoint(ptDrag);
iMsg.SetGripPosition(ePos);
iMsg.SetMoveGripOffset(offset);
iMsg.SetMsgValidate(TRUE);
iMsg.SetInterfaceOper(eNewCommand);
iMsg.SetPreviewObjToCreate(eReduce, 0);
// 写入接口更改消息
AcDbSoftPointerId idOwner;
m_pXDataMap->GetAt(KEY_THISID, idOwner);
iMsg.SetMsgOperateOn(idOwner);
TDbInterfaceMsgWrite msgWrite;
msgWrite.WriteInterfaceMsg(iMsg);
// 发送消息
acedPostCommand(_T("\33"));
acedPostCommand(_T("znyd\n"));
return Acad::eOk;
}
BOOL THImpHvacReducer::OnMoveGripPointMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs)
{
if (!TAuxTools::IsAutoWorkOffset())
return FALSE;
ASSERT(NULL != m_pXDataMap);
BOOL bMsgTranslate = FALSE;
AcDbObjectId id = iModiMsg.GetMsgOperateOn();
if (id != m_pOwnerEnt->objectId()) // 消息发送目标正确
return FALSE;
AcGeVector3d vtOffset = iModiMsg.GetMoveGripOffset();
if (vtOffset.isZeroLength())
return FALSE;
AcGePoint3d ptStart, ptCorner, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
AcGePoint3d ptGeSOld = ptStart;
AcGePoint3d ptGeEOld = ptEnd;
int nPos = iModiMsg.GetGripPosition();
if (nPos == eStart || nPos == eMid || nPos == eEnd || nPos == eBr1 || nPos == eBr2)
{
AcGeVector3d vtSta, vtEnd;
m_pXDataMap->GetAt(HRED_StartDir, vtSta);
vtEnd = -vtSta;
ptStart += vtOffset;
ptEnd += vtOffset;
m_pXDataMap->SetAt(HRED_StartPoint, ptStart);
m_pXDataMap->SetAt(HRED_EndPoint, ptEnd);
// 构造接口消息传递 开始端检查
AcDbObjectId idT;
if (FindConnect(ptGeSOld, vtSta, m_pOwnerEnt->objectId(), idT)) // sta 点的接口
{
TInterfaceModifyMsg msg;
msg.SetMsgPoint(ptGeSOld);
msg.SetMoveGripOffset(vtOffset);
msg.SetMsgOperateOn(idT);
msg.SetGripPosition(eStart);
iModiMsgs.append(msg);
bMsgTranslate = TRUE;
}
// 构造接口消息传递 末端检查
if (FindConnect(ptGeEOld, vtEnd, m_pOwnerEnt->objectId(), idT)) // end 点的接口
{
TInterfaceModifyMsg msg;
msg.SetMsgPoint(ptGeEOld);
msg.SetMoveGripOffset(vtOffset);
msg.SetMsgOperateOn(idT);
msg.SetGripPosition(eEnd);
iModiMsgs.append(msg);
bMsgTranslate = TRUE;
}
// 更新模型空间的扩展字典的注册的接口数据
AcGeMatrix3d xform;
xform.setToTranslation(vtOffset);
UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform);
}
return bMsgTranslate;}
BOOL THImpHvacReducer::OnTransformMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs)
{
if (!TAuxTools::IsAutoWorkOffset())
return FALSE;
ASSERT(NULL != m_pXDataMap);
BOOL bMsgTranslate = FALSE;
AcDbObjectId id = iModiMsg.GetMsgOperateOn();
if (id != m_pOwnerEnt->objectId()) // 消息发送目标正确
return FALSE;
AcGeMatrix3d mtTrans = iModiMsg.GetTransform();
AcGeVector3d vtSta, vtEnd;
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartDir, vtSta);
vtEnd = -vtSta;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
AcGePoint3d ptGeSOld = ptStart;
AcGePoint3d ptGeEOld = ptEnd;
ptStart.transformBy(mtTrans);
ptEnd.transformBy(mtTrans);
m_pXDataMap->SetAt(HRED_StartPoint, ptStart);
m_pXDataMap->SetAt(HRED_EndPoint, ptEnd);
// 构造接口消息传递 开始端检查
AcDbObjectId idT;
if (FindConnect(ptGeSOld, vtSta, m_pOwnerEnt->objectId(), idT)) // sta 点的接口
{
TInterfaceModifyMsg msg;
msg.SetMsgPoint(ptGeSOld);
msg.SetTransform(mtTrans);
msg.SetMsgOperateOn(idT);
iModiMsgs.append(msg);
bMsgTranslate = TRUE;
}
// 构造接口消息传递 末端检查
if (FindConnect(ptGeEOld, vtEnd, m_pOwnerEnt->objectId(), idT)) // end 点的接口
{
TInterfaceModifyMsg msg;
msg.SetMsgPoint(ptGeEOld);
msg.SetTransform(mtTrans);
msg.SetMsgOperateOn(idT);
iModiMsgs.append(msg);
bMsgTranslate = TRUE;
}
// 更新模型空间的扩展字典的注册的接口数据
UpdateInterfaceRec(m_pOwnerEnt->objectId(), mtTrans);
return bMsgTranslate;
}
BOOL THImpHvacReducer::OnSizeMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs)
{
ASSERT(NULL != m_pXDataMap);
BOOL bSizeChanged = FALSE;
AcDbObjectId id = iModiMsg.GetMsgOperateOn();
if (id != m_pOwnerEnt->objectId()) // 消息发送目标正确
return FALSE;
// 获取消息发送方截面类型,暂未实现
HvacSectType eChangedSect = (HvacSectType)-1;
// ...
AcGeVector3d vtOffset = iModiMsg.GetMoveGripOffset();
AcGePoint3d ptOrigStart, ptOrigEnd, ptMsg;
m_pXDataMap->GetAt(HRED_StartPoint, ptOrigStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptOrigEnd);
ptMsg = iModiMsg.GetMsgPoint();
// 先检查接口是否真实连接了实体
BOOL bStartCon(FALSE), bEndCon(FALSE);
AcDbObjectId idStart(AcDbObjectId::kNull), idEnd(AcDbObjectId::kNull);
m_pXDataMap->GetAt(KEY_IDCNT1, idStart);
m_pXDataMap->GetAt(KEY_IDCNT2, idEnd);
OPENOBJ_BEGIN(idStart, AcDb::kForRead, TDbInterfacesObj, pIfObj);
if (NULL != pIfObj)
{
AcGePoint3d ptFind = ptOrigStart;
if (ptMsg.distanceTo(ptOrigStart) < 1)
ptFind += vtOffset;
if (pIfObj->GetInterface(ptFind, TInterface()))
bStartCon = TRUE;
}
OPENOBJ_END();
OPENOBJ_BEGIN(idEnd, AcDb::kForRead, TDbInterfacesObj, pIfObj);
if (NULL != pIfObj)
{
AcGePoint3d ptFind = ptOrigEnd;
if (ptMsg.distanceTo(ptOrigEnd) < 1)
ptFind += vtOffset;
if (pIfObj->GetInterface(ptFind, TInterface()))
bEndCon = TRUE;
}
OPENOBJ_END();
HvacReduComType eComType = TDb::eAuto;
HvacSectType eSect = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_ComputeType, (int&)eComType);
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect);
// 设置各接口新尺寸
double dNewWidth, dNewHeigh(0.0);
AcGeVector3d vtNormal = normal();
if (eSect == TDb::eRectangular)
{
AcGeVector3d vtWidthDir, vtHeighDir;
iModiMsg.GetSizeDir(vtWidthDir, vtHeighDir);
// 判断是否是空间连接或导致宽高互换
if (vtHeighDir.isParallelTo(vtNormal))
iModiMsg.GetSize(dNewWidth, dNewHeigh);
else
iModiMsg.GetSize(dNewHeigh, dNewWidth);
}
else
{
iModiMsg.GetSize(dNewWidth, dNewHeigh);
dNewHeigh = dNewWidth;
}
// 看哪个接口方向修改了尺寸,修改相应接口尺寸
int nModifyFrom(0); // 修改方向, 0:首,1:尾
if (ptMsg.distanceTo(ptOrigStart) < 1)
{
if (eChangedSect == -1)
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eChangedSect);
else
m_pXDataMap->SetAt(HRED_StartSectType, eChangedSect);
AcGePoint3d ptNewStart = ptOrigStart + vtOffset;
m_pXDataMap->SetAt(HRED_StartPoint, ptNewStart);
if (eChangedSect == TDb::eRectangular)
{
m_pXDataMap->SetAt(HRED_StartWidth, dNewWidth);
m_pXDataMap->SetAt(HRED_StartThick, dNewHeigh);
}
else if (eChangedSect == TDb::eCircular)
{
m_pXDataMap->SetAt(HRED_StartDiameter, dNewWidth);
}
AcGeVector3d vtFitOff;
m_pXDataMap->GetAt(HRED_Offset, vtFitOff);
vtFitOff -= vtOffset;
m_pXDataMap->SetAt(HRED_Offset, vtFitOff);
bSizeChanged = TRUE;
nModifyFrom = 0;
}
else if (ptMsg.distanceTo(ptOrigEnd) < 1)
{
if (eChangedSect == -1)
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eChangedSect);
else
m_pXDataMap->SetAt(HRED_EndSectType, eChangedSect);
AcGePoint3d ptNewEnd = ptOrigEnd + vtOffset;
m_pXDataMap->SetAt(HRED_EndPoint, ptNewEnd);
if (eChangedSect == TDb::eRectangular)
{
m_pXDataMap->SetAt(HRED_EndWidth, dNewWidth);
m_pXDataMap->SetAt(HRED_EndThick, dNewHeigh);
}
else if (eChangedSect == TDb::eCircular)
{
m_pXDataMap->SetAt(HRED_EndDiameter, dNewWidth);
}
AcGeVector3d vtFitOff;
m_pXDataMap->GetAt(HRED_Offset, vtFitOff);
vtFitOff += vtOffset;
m_pXDataMap->SetAt(HRED_Offset, vtFitOff);
bSizeChanged = TRUE;
nModifyFrom = 1;
}
// 由于尺寸变化,调用内部校正函数,接口点必须沿各向量方向校正
IsValid(NULL);
AcGePoint3d ptNewStart, ptNewEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptNewStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptNewEnd);
// 根据最终位移向量,处理接口端连接实体位置
AcGeVector3d vtStartOff = ptNewStart - ptOrigStart;
AcGeVector3d vtEndOff = ptNewEnd - ptOrigEnd;
if (vtStartOff.length() > 1e-6)
UpdateInterfaceRec(id, ptOrigStart, ptNewStart);
if (vtEndOff.length() > 1e-6)
UpdateInterfaceRec(id, ptOrigEnd, ptNewEnd);
// 纠正由于风管边壁偏移导致的向量差
AcGeVector3d vtStart;
m_pXDataMap->GetAt(HRED_StartDir, vtStart);
AcGePoint3d ptFixedStart(ptOrigStart), ptFixedEnd(ptOrigEnd);
if (nModifyFrom == 0)
{
ptFixedStart += vtOffset;
double dAngle = vtStartOff.angleTo(vtStart);
double dLen = vtStartOff.length() * cos(dAngle);
vtStartOff.setToProduct(vtStart, dLen);
}
else if (nModifyFrom == 1)
{
ptFixedEnd += vtOffset;
double dAngle = vtEndOff.angleTo(-vtStart);
double dLen = vtEndOff.length() * cos(dAngle);
vtEndOff.setToProduct(-vtStart, dLen);
}
if (vtStartOff.length() > 1e-6 && bStartCon)
TAuxTools::DealWithConEnt(idStart, vtStartOff, id, ptFixedStart);
if (vtEndOff.length() > 1e-6 && bEndCon)
TAuxTools::DealWithConEnt(idEnd, vtEndOff, id, ptFixedEnd);
return bSizeChanged;
}
// 绘制三维图形(方对方)
void THImpHvacReducer::ExplodeRect2Rect3d(XExplodeDraw& mode) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = 200.0, dStartThick = 200.0, dEndWidth = 400.0,
dEndThick = 400.0, dPlusEdge(GetPlusEdge());
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
// 计算8顶点
AcGeVector3d vtSect = GetSectNormal();
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arPtS, arPtE;
arPtS.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0);
arPtS.append(arPtS.at(0) - dStartWidth * vt);
arPtS.append(arPtS.at(1) - dStartThick * vtNormal);
arPtS.append(arPtS.at(0) - dStartThick * vtNormal);
arPtS.append(arPtS.at(0));
arPtE.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0);
arPtE.append(arPtE.at(0) - dEndWidth * vt);
arPtE.append(arPtE.at(1) - dEndThick * vtNormal);
arPtE.append(arPtE.at(0) - dEndThick * vtNormal);
arPtE.append(arPtE.at(0));
// 考虑法兰余量添加5行4列点
AcGePoint3dArray arPoint;
for(int i = 0; i < 5; i++)
{
arPoint.append(arPtS.at(i));
arPoint.append(arPtS.at(i) - dPlusEdge * vtSect);
arPoint.append(arPtE.at(i) + dPlusEdge * vtSect);
arPoint.append(arPtE.at(i));
}
mode.DrawMesh(5, 4, arPoint.asArrayPtr());
}
// 构建外轮廓(方对方)
AcDbPolyline* THImpHvacReducer::MakeRect2RectPolyCurve() const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge();
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
TDb::HvacSectType eSectTypeStart = TDb::eRectangular, eSectTypeEnd = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectTypeStart);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSectTypeEnd);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
if (!vtNormal.isParallelTo(TAuxTools::GetUcsZvt()))
{
if (eSectTypeStart == TDb::eRectangular)
m_pXDataMap->GetAt(HRED_StartThick, dStartWidth);
if (eSectTypeEnd == TDb::eRectangular)
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
AcGeVector3d vtSect = GetSectNormal();
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt());
vt.normalize();
AcGePoint3d arPoint[4], arPointIn[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
arPointIn[0] = arPoint[0] - dPlusEdge * vtSect;
arPointIn[1] = arPoint[1] - dPlusEdge * vtSect;
arPointIn[2] = arPoint[2] + dPlusEdge * vtSect;
arPointIn[3] = arPoint[3] + dPlusEdge * vtSect;
// mcl changed, 2010.03.17. GetHidePlane()求的可能是个斜面,改为以首点为基准
// AcGePlane plan = GetHidePlane(arPoint[0], arPoint[1], arPoint[2], TAuxTools::GetUcsZvt(), dEle);
AcGePlane plan = GetStdPrjPlan(arPoint[0]);
double dEle = TAuxTools::GetPlaneEle(plan);
AcDbPolyline* pPolyLine = new AcDbPolyline;
pPolyLine->addVertexAt(0, arPoint[0].convert2d(plan));
pPolyLine->addVertexAt(1, arPoint[1].convert2d(plan));
pPolyLine->addVertexAt(2, arPointIn[1].convert2d(plan));
pPolyLine->addVertexAt(3, arPointIn[2].convert2d(plan));
pPolyLine->addVertexAt(4, arPoint[2].convert2d(plan));
pPolyLine->addVertexAt(5, arPoint[3].convert2d(plan));
pPolyLine->addVertexAt(6, arPointIn[3].convert2d(plan));
pPolyLine->addVertexAt(7, arPointIn[0].convert2d(plan));
pPolyLine->setNormal(TAuxTools::GetUcsZvt());
pPolyLine->setElevation(dEle);
pPolyLine->setClosed(Adesk::kTrue);
return pPolyLine;
}
// 构建二维图形(方对方)
BOOL THImpHvacReducer::MakeRect2Rect2DCurves(TComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge();
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
TDb::HvacSectType eSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectType);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
if ((eSectType == TDb::eRectangular) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚
{
m_pXDataMap->GetAt(HRED_StartThick, dStartWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
AcDbObjectId idEndLayer, idBaseLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
TDbFittingBase* pFit = TDbFittingBase::cast(m_pOwnerEnt);
if (NULL != pFit)
idBaseLayer = pFit->CenterLayer();
BOOL bHasBaseLine = FALSE;
m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine);
TDb::TCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
AcGeVector3d vtSect = GetSectNormal();
// 2D下绘制,截面方向向XY平面投影,后计算图形在XY平面上的关键点Lixl
vtSect = vtSect.orthoProject(TAuxTools::GetUcsZvt());
// 绘单线
if (IsSingleLine())
{
AcGeVector3d vtDir = ptStart - ptEnd;
AcGePoint3d ptS, ptM, ptE;
vtDir.normalize();
ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0;
if (ptStart.distanceTo(ptEnd) > 120.0)
{
ptS = ptM + vtDir * 60.0;
ptE = ptM - vtDir * 60.0;
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd;
curEle.ptGe[1] = ptE;
curEle.ptGe[2] = ptE;
cplCurve.append(curEle);
}
else
{
ptS = ptStart;
ptE = ptEnd;
}
vtDir.rotateBy(PI/2, TAuxTools::GetUcsZvt());
double dS = 20.0, dE = 50.0;
if (dStartWidth > dEndWidth)
{
dS = 50.0;
dE = 20.0;
}
curEle.ptGe[0] = ptS + (dS + 10.0) * vtDir;
curEle.ptGe[1] = ptS - (dS + 10.0) * vtDir;
curEle.ptGe[2] = ptS - (dS + 10.0) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE + (dE + 10.0) * vtDir;
curEle.ptGe[1] = ptE - (dE + 10.0) * vtDir;
curEle.ptGe[2] = ptE - (dE + 10.0) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptS + dS * vtDir;
curEle.ptGe[1] = ptE + dE * vtDir;
curEle.ptGe[2] = ptE + dE * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptS - dS * vtDir;
curEle.ptGe[1] = ptE - dE * vtDir;
curEle.ptGe[2] = ptE - dE * vtDir;
cplCurve.append(curEle);
return TRUE;
}
if (0 == nType)
{
AcGeVector3d vt = vtSect;
//vt.rotateBy(PI / 2.0, vtNormal);
vt.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt());
vt.normalize();
AcGePoint3d arPoint[4], arPointIn[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
arPointIn[0] = arPoint[0] - dPlusEdge * vtSect;
arPointIn[1] = arPoint[1] - dPlusEdge * vtSect;
arPointIn[2] = arPoint[2] + dPlusEdge * vtSect;
arPointIn[3] = arPoint[3] + dPlusEdge * vtSect;
curEle.dWidth = GetEdgeLineWidth();
curEle.ptGe[0] = arPoint[1];
curEle.ptGe[1] = arPointIn[1];
curEle.ptGe[2] = arPointIn[1];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPointIn[0];
curEle.ptGe[2] = arPointIn[0];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[1];
curEle.ptGe[1] = arPointIn[2];
curEle.ptGe[2] = arPointIn[2];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[0];
curEle.ptGe[1] = arPointIn[3];
curEle.ptGe[2] = arPointIn[3];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[2];
curEle.ptGe[1] = arPoint[2];
curEle.ptGe[2] = arPoint[2];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[3];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
curEle.idSubLay = idEndLayer; // 两端图层
curEle.dWidth = GetEndLineWidth();
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPoint[1];
curEle.ptGe[2] = arPoint[1];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[2];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
}
else if (1 == nType)
{
if (bHasBaseLine)
{
curEle.idSubLay = idBaseLayer; // 基线图层
curEle.dWidth = GetCentLineWidth();
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[2] = ptStart - dPlusEdge * vtSect;
cplCurve.append(curEle);
curEle.ptGe[0] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[1] = ptEnd + dPlusEdge * vtSect;
curEle.ptGe[2] = ptEnd + dPlusEdge * vtSect;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd + dPlusEdge * vtSect;
curEle.ptGe[1] = ptEnd;
curEle.ptGe[2] = ptEnd;
cplCurve.append(curEle);
}
}
return TRUE;
}
// 倾斜变径: 圆对圆
BOOL THImpHvacReducer::MakeIncCir2Cir2DCurves(TComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = 0.0;
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
TDb::HvacSectType eStaSectType = TDb::eRectangular;
TDb::HvacSectType eEndSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStaSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
if ((eStaSectType == TDb::eRectangular) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚
{
m_pXDataMap->GetAt(HRED_StartThick, dStartWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
AcDbObjectId idEndLayer, idBaseLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
// 中心线图层
BOOL bHasBaseLine = FALSE;
m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine);
TDbFittingBase* pFit = TDbFittingBase::cast(m_pOwnerEnt);
if (NULL != pFit)
idBaseLayer = pFit->CenterLayer();
TDb::TCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
AcGeVector3d vtSect = GetSectNormal();
int i(0), nRet(0);
AcDbPolyline* pLine = new AcDbPolyline;
if (NULL == pLine)
return FALSE;
AcGePoint3dArray arPtsCir;
AcGeVector3d vt = vtSect.crossProduct(vtNormal);
vt.normalize();
// 绘单线
if (IsSingleLine())
{
AcGeVector3d vtDir = ptStart - ptEnd;
vtDir.orthoProject(TAuxTools::GetUcsZvt());
vtDir.normalize();
AcGePoint3d ptS, ptM, ptE;
ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0;
if (ptStart.distanceTo(ptEnd) > 120.0)
{
ptS = ptM + vtDir * 60.0;
ptE = ptM - vtDir * 60.0;
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd;
curEle.ptGe[1] = ptE;
curEle.ptGe[2] = ptE;
cplCurve.append(curEle);
}
else
{
ptS = ptStart;
ptE = ptEnd;
}
vtDir.rotateBy(PI/2, TAuxTools::GetUcsZvt());
double dS = 20.0, dE = 50.0;
if (dStartWidth > dEndWidth)
{
dS = 50.0;
dE = 20.0;
}
curEle.ptGe[0] = ptS + (dS + 10.0) * vtDir;
curEle.ptGe[1] = ptS - (dS + 10.0) * vtDir;
curEle.ptGe[2] = ptS - (dS + 10.0) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE + (dE + 10.0) * vtDir;
curEle.ptGe[1] = ptE - (dE + 10.0) * vtDir;
curEle.ptGe[2] = ptE - (dE + 10.0) * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptS + dS * vtDir;
curEle.ptGe[1] = ptE + dE * vtDir;
curEle.ptGe[2] = ptE + dE * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptS - dS * vtDir;
curEle.ptGe[1] = ptE - dE * vtDir;
curEle.ptGe[2] = ptE - dE * vtDir;
cplCurve.append(curEle);
return TRUE;
}
if (0 == nType)
{
AcGePoint3d arPoint[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
curEle.idSubLay = idEndLayer; // 两端图层
curEle.dWidth = GetEndLineWidth();
// 末端半个椭圆
vt = -vtSect;//起点指向终点
if (eEndSectType == TDb::eCircular)
{
nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pLine, vt);
if (-1 != nRet)
{
// for (i = 0; i < arPtsCir.length(); i++)
// {
// if (i > 1 && i%2 == 0)
// {
// curEle.ptGe[0] = arPtsCir[i-2];
// curEle.ptGe[1] = arPtsCir[i-1];
// curEle.ptGe[2] = arPtsCir[i];
// cplCurve.append(curEle);
// }
// }
for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23
{
curEle.ptGe[0] = arPtsCir[i];
curEle.ptGe[1] = arPtsCir[i+1];
curEle.ptGe[2] = arPtsCir[i+1];
cplCurve.append(curEle);
}
arPoint[2] = arPtsCir.first();
arPoint[3] = arPtsCir.last();
}
}
else
{
}
arPtsCir.setLogicalLength(0);
pLine->reset(Adesk::kFalse, i);
if (eStaSectType == TDb::eCircular)
{
nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptStart, dStartWidth, -vt, TAuxTools::GetUcsZvt(), *pLine, -vt);
if (-1 != nRet)
{
// for (i = 0; i < arPtsCir.length(); i++)
// {
// if (i > 1 && i%2 == 0)
// {
// curEle.ptGe[0] = arPtsCir[i-2];
// curEle.ptGe[1] = arPtsCir[i-1];
// curEle.ptGe[2] = arPtsCir[i];
// cplCurve.append(curEle);
// }
// }
for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23
{
curEle.ptGe[0] = arPtsCir[i];
curEle.ptGe[1] = arPtsCir[i+1];
curEle.ptGe[2] = arPtsCir[i+1];
cplCurve.append(curEle);
}
arPoint[0] = arPtsCir.first();
arPoint[1] = arPtsCir.last();
}
}
else
{
}
vt = -vtSect.crossProduct(vtNormal);
AcGePoint3d ptJudge = ptStart + vt * 10000;
ptJudge.z = (ptStart.z + ptEnd.z) * 0.5;
arPoint[0].z = ptJudge.z;
arPoint[1].z = ptJudge.z;
arPoint[2].z = ptJudge.z;
arPoint[3].z = ptJudge.z;
AcGePoint3d ptTmp;
// 0,3点在上, 1,2点在下
if (arPoint[0].distanceTo(ptJudge) < arPoint[1].distanceTo(ptJudge))
{
ptTmp = arPoint[0];
arPoint[0] = arPoint[1];
arPoint[1] = ptTmp;
}
if (arPoint[3].distanceTo(ptJudge) < arPoint[2].distanceTo(ptJudge))
{
ptTmp = arPoint[3];
arPoint[3] = arPoint[2];
arPoint[2] = ptTmp;
}
// 变径边线
curEle.idSubLay = AcDbObjectId::kNull;
curEle.dWidth = GetEdgeLineWidth();
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[1];
curEle.ptGe[1] = arPoint[2];
curEle.ptGe[2] = arPoint[2];
cplCurve.append(curEle);
}
else if (1 == nType)
{
if (bHasBaseLine)
{
curEle.idSubLay = idBaseLayer; // 基线图层
curEle.dWidth = GetCentLineWidth();
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptEnd;
curEle.ptGe[2] = ptEnd;
cplCurve.append(curEle);
}
// 内部端线
curEle.idSubLay = idEndLayer;
curEle.dWidth = GetEndLineWidth();
vt = -vtSect;
// 起点高,画起点内半个椭圆
if (ptStart.z > ptEnd.z)
{
nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptStart, dStartWidth, vt, TAuxTools::GetUcsZvt(), *pLine, vt);
if (-1 != nRet)
{
// for (i = 0; i < arPtsCir.length(); i++)
// {
// if (i > 1 && i%2 == 0)
// {
// curEle.ptGe[0] = arPtsCir[i-2];
// curEle.ptGe[1] = arPtsCir[i-1];
// curEle.ptGe[2] = arPtsCir[i];
// cplCurve.append(curEle);
// }
// }
for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23
{
curEle.ptGe[0] = arPtsCir[i];
curEle.ptGe[1] = arPtsCir[i+1];
curEle.ptGe[2] = arPtsCir[i+1];
cplCurve.append(curEle);
}
}
}
else // 终点高,画终点内部半个椭圆
{
nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pLine, -vt);
if (-1 != nRet)
{
// for (i = 0; i < arPtsCir.length(); i++)
// {
// if (i > 1 && i%2 == 0)
// {
// curEle.ptGe[0] = arPtsCir[i-2];
// curEle.ptGe[1] = arPtsCir[i-1];
// curEle.ptGe[2] = arPtsCir[i];
// cplCurve.append(curEle);
// }
// }
for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23
{
curEle.ptGe[0] = arPtsCir[i];
curEle.ptGe[1] = arPtsCir[i+1];
curEle.ptGe[2] = arPtsCir[i+1];
cplCurve.append(curEle);
}
}
}
}
if (NULL != pLine)
delete pLine;
return TRUE;
}
// 构建倾斜变径 圆对圆轮廓线
AcDbPolyline* THImpHvacReducer::MakeIncCir2CirPolyCurve() const
{
ASSERT(NULL != m_pXDataMap);
AcDbPolyline* pPolyCurve = new AcDbPolyline;
if (NULL == pPolyCurve)
return pPolyCurve;
double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = 0.0;
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
TDb::HvacSectType eStaSectType = TDb::eRectangular;
TDb::HvacSectType eEndSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStaSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
if ((eStaSectType == TDb::eRectangular) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚
{
m_pXDataMap->GetAt(HRED_StartThick, dStartWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
AcGeVector3d vtSect = GetSectNormal();
int i(0), nRet(0);
AcDbPolyline* pCirLine = new AcDbPolyline;
if (NULL == pCirLine)
return pPolyCurve;
AcGePoint3dArray arPtsCir;
AcGeVector3d vt = vtSect.crossProduct(vtNormal);
vt.normalize();
AcGePoint3d arPoint[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
AcGePlane plan(TAuxTools::Mid(ptStart, ptEnd), TAuxTools::GetUcsZvt());
AcGePoint3d ptOrg = AcGePoint3d::kOrigin.orthoProject(plan);
double dEl = ptOrg.asVector().length();
if (!ptOrg.asVector().isCodirectionalTo(plan.normal()))
{
dEl *= -1.0;
}
plan.set(ptOrg, TAuxTools::GetUcsZvt());
// 边线
pPolyCurve->addVertexAt(0, arPoint[1].convert2d(plan));
pPolyCurve->addVertexAt(1, arPoint[2].convert2d(plan));
// 终点椭圆端线
vt = ptEnd - ptStart;
nRet = TAuxTools::GetEllipseFromCircle(ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pCirLine, vt);
if (-1 != nRet)
{
TAuxTools::MergerPline(pPolyCurve, pCirLine);
}
// 边线
pPolyCurve->addVertexAt(pPolyCurve->numVerts(), arPoint[3].convert2d(plan));
pPolyCurve->addVertexAt(pPolyCurve->numVerts(), arPoint[0].convert2d(plan));
// 起点椭圆边线
pCirLine->reset(Adesk::kFalse, i);
if (eStaSectType == TDb::eCircular)
{
nRet = TAuxTools::GetEllipseFromCircle(ptStart, dStartWidth, -vt, TAuxTools::GetUcsZvt(), *pCirLine, -vt);
if (-1 != nRet)
TAuxTools::MergerPline(pPolyCurve, pCirLine);
}
if (NULL != pCirLine)
delete pCirLine;
pPolyCurve->setElevation(dEl);
pPolyCurve->setNormal(plan.normal());
pPolyCurve->setClosed(Adesk::kTrue);
return pPolyCurve;
}
BOOL THImpHvacReducer::MakeIncCir2CirPolyCurveFaces(AcDbVoidPtrArray& arFaces)
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = 200.0, dEndWidth = 400.0;
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
TDb::HvacSectType eStaSectType = TDb::eRectangular;
TDb::HvacSectType eEndSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStaSectType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
if ((eStaSectType == TDb::eRectangular) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚
{
m_pXDataMap->GetAt(HRED_StartThick, dStartWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
AcGeVector3d vtSect = GetSectNormal();
int i(0), nRet(0);
AcDbPolyline* pCirLine = new AcDbPolyline;
if (NULL == pCirLine)
return FALSE;
AcGePoint3dArray arPtsCir;
AcGeVector3d vt = vtSect.crossProduct(vtNormal);
vt.normalize();
AcGePoint3d arPoint[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
AcGePlane plan(TAuxTools::Mid(ptStart, ptEnd), TAuxTools::GetUcsZvt());
AcGePoint3d ptOrg = AcGePoint3d::kOrigin.orthoProject(plan);
plan.set(ptOrg, TAuxTools::GetUcsZvt());
// 中心的矩形平面
AcDbFace* pCenFace = new AcDbFace;
pCenFace->setVertexAt(0, arPoint[0].orthoProject(plan));
pCenFace->setVertexAt(1, arPoint[1].orthoProject(plan));
pCenFace->setVertexAt(2, arPoint[2].orthoProject(plan));
pCenFace->setVertexAt(3, arPoint[3].orthoProject(plan));
arFaces.append(pCenFace);
// 终点端半个椭圆面和起点半个椭圆面
double dMinAngle(TAuxTools::GetMinDiffAngle() * 0.5);
int nPartNum = int(PI / dMinAngle) + 1;
dMinAngle = PI / nPartNum;
AcGePoint3dArray ptArrSta, ptArrEnd;
AcGePoint3d ptStaNow = arPoint[0];
AcGePoint3d ptEndNow = arPoint[3];
vt = ptEnd - ptStart;
vt.normalize();
for (i = 0; i < nPartNum + 1; i++)
{
ptArrSta.append(ptStaNow.orthoProject(plan));
ptArrEnd.append(ptEndNow.orthoProject(plan));
if (ptStart.z > ptEnd.z)
{
ptStaNow.rotateBy(-dMinAngle, -vt, ptStart);
ptEndNow.rotateBy(dMinAngle, -vt, ptEnd);
}
else
{
ptStaNow.rotateBy(-dMinAngle, vt, ptStart);
ptEndNow.rotateBy(dMinAngle, vt, ptEnd);
}
if (i > 0)
{
AcDbFace* pStaFace = new AcDbFace;
pStaFace->setVertexAt(0, ptStart.orthoProject(plan));
pStaFace->setVertexAt(1, ptArrSta[i]);
pStaFace->setVertexAt(2, ptArrSta[i-1]);
pStaFace->setVertexAt(3, ptStart.orthoProject(plan));
arFaces.append(pStaFace);
AcDbFace* pEndFace = new AcDbFace;
pEndFace->setVertexAt(0, ptEnd.orthoProject(plan));
pEndFace->setVertexAt(1, ptArrEnd[i]);
pEndFace->setVertexAt(2, ptArrEnd[i-1]);
pEndFace->setVertexAt(3, ptEnd.orthoProject(plan));
arFaces.append(pEndFace);
}
}
return arFaces.length() > 0;
}
// 构建外轮廓所围平面的3DFace组(方对方)
BOOL THImpHvacReducer::MakeRect2RectPolyCurveFaces(AcDbVoidPtrArray& arFaces)
{
ASSERT(NULL != m_pXDataMap);
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// mcl, add.各点都投影到以首点为基准的标准面上
AcGePlane planStd = GetStdPrjPlan(ptStart);
ptEnd = ptEnd.orthoProject(planStd);
AcGeVector3d vtSect = GetSectNormal();
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt());
vt.normalize();
AcDbFace* pFace = NULL;
if (IsSingleLine())
{
double dHideWidth = 0.0;
GetGlobalContext()->GetAt(KEY_HIDEWIDTH, dHideWidth);
AcGePoint3d arPoint[4];
arPoint[0] = ptStart - dHideWidth * vt / 2.0;
arPoint[1] = ptStart + dHideWidth * vt / 2.0;
arPoint[2] = ptEnd + dHideWidth * vt / 2.0;
arPoint[3] = ptEnd - dHideWidth * vt / 2.0;
pFace = new AcDbFace;
pFace->setVertexAt(0, arPoint[0]);
pFace->setVertexAt(1, arPoint[1]);
pFace->setVertexAt(2, arPoint[2]);
pFace->setVertexAt(3, arPoint[3]);
arFaces.append(pFace);
}
else
{
double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge();
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
TDb::HvacSectType eSectTypeStart = TDb::eRectangular, eSectTypeEnd = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectTypeStart);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSectTypeEnd);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
if (!vtNormal.isParallelTo(TAuxTools::GetUcsZvt()))
{
if (eSectTypeStart == TDb::eRectangular)
m_pXDataMap->GetAt(HRED_StartThick, dStartWidth);
if (eSectTypeEnd == TDb::eRectangular)
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
AcGePoint3d arPoint[4], arPointIn[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
arPointIn[0] = arPoint[0] - dPlusEdge * vtSect;
arPointIn[1] = arPoint[1] - dPlusEdge * vtSect;
arPointIn[2] = arPoint[2] + dPlusEdge * vtSect;
arPointIn[3] = arPoint[3] + dPlusEdge * vtSect;
if (dPlusEdge > 1.0e-6)
{
pFace = new AcDbFace;
pFace->setVertexAt(0, arPoint[0]);
pFace->setVertexAt(1, arPoint[1]);
pFace->setVertexAt(2, arPointIn[1]);
pFace->setVertexAt(3, arPointIn[0]);
arFaces.append(pFace);
}
pFace = new AcDbFace;
pFace->setVertexAt(0, arPointIn[0]);
pFace->setVertexAt(1, arPointIn[1]);
pFace->setVertexAt(2, arPointIn[2]);
pFace->setVertexAt(3, arPointIn[3]);
arFaces.append(pFace);
if (dPlusEdge > 1.0e-6)
{
pFace = new AcDbFace;
pFace->setVertexAt(0, arPointIn[3]);
pFace->setVertexAt(1, arPointIn[2]);
pFace->setVertexAt(2, arPoint[2]);
pFace->setVertexAt(3, arPoint[3]);
arFaces.append(pFace);
}
}
return TRUE;
}
// 绘制三维图形(方对圆)
void THImpHvacReducer::ExplodeRect2Cir3d(XExplodeDraw& mode, BOOL bStartIsRound) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = 200.0, dStartThick = 200.0, dEndWidth = 400.0,
dEndThick = 400.0, dPlusEdge = GetPlusEdge();
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
AcGeVector3d vtSect = GetSectNormal();
if (bStartIsRound)
{
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
}
else
{
m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartThick, dEndThick);
m_pXDataMap->GetAt(HRED_EndWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndThick, dStartThick);
m_pXDataMap->GetAt(HRED_StartPoint, ptEnd);
m_pXDataMap->GetAt(HRED_EndPoint, ptStart);
vtSect = -vtSect;
}
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
double dMinDiffAng = PI / 12.0; // 圆弧分割的角度
GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinDiffAng);
int nSect = int(PI / (2.0 * dMinDiffAng)) + 1; // 每PI/2圆弧分成的段数
dMinDiffAng = PI / (2.0 * nSect);
// 起始端圆分割点
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arCirPt;
AcGePoint3d ptCir;
ptCir = ptStart + vt * dStartWidth / 2.0;
arCirPt.append(ptCir);
for (int i = 1; i < 4 * nSect; i++)
{
ptCir.rotateBy(dMinDiffAng, vtSect, ptStart);
arCirPt.append(ptCir);
}
arCirPt.append(ptStart + vt * dStartWidth / 2.0); // 最后一个封闭,可消除计算误差
// 终止端矩形顶点
AcGePoint3dArray arRectPt;
arRectPt.append(ptEnd + dEndWidth * vt / 2.0 - dEndThick * vtNormal / 2.0);
arRectPt.append(arRectPt.at(0) + dEndThick * vtNormal);
arRectPt.append(arRectPt.at(1) - dEndWidth * vt);
arRectPt.append(arRectPt.at(0) - dEndWidth * vt);
arRectPt.append(arRectPt.at(0));
// 4*(nSect+1)+1行4列网格点
AcGePoint3dArray arPoint;
for (i = 0; i < 4; i++)
{
// 圆上点和矩形边
arPoint.append(arCirPt.at(i * nSect));
arPoint.append(arCirPt.at(i * nSect) - dPlusEdge * vtSect);
arPoint.append(arRectPt.at(i) + dPlusEdge * vtSect);
arPoint.append(arRectPt.at(i));
// 圆上边和矩形顶点
for (int j = 0; j < nSect; j++)
{
arPoint.append(arCirPt.at(i * nSect + j));
arPoint.append(arCirPt.at(i * nSect + j) - dPlusEdge * vtSect);
arPoint.append(arRectPt.at(i + 1) + dPlusEdge * vtSect);
arPoint.append(arRectPt.at(i + 1));
}
}
arPoint.append(arCirPt.at(0));
arPoint.append(arCirPt.at(0) - dPlusEdge * vtSect);
arPoint.append(arRectPt.at(0) + dPlusEdge * vtSect);
arPoint.append(arRectPt.at(0));
mode.DrawMesh(4 * (nSect + 1) + 1, 4, arPoint.asArrayPtr());
}
// 构建外轮廓(方对圆)
AcDbPolyline* THImpHvacReducer::MakeRect2CirPolyCurve() const
{
return MakeRect2RectPolyCurve();
}
// 构建二维图形(方对圆)
BOOL THImpHvacReducer::MakeRect2Cir2DCurves(TComplexCurve& cplCurve, int &nType, BOOL bStartIsRound) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge();
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
AcGeVector3d vtSect = GetSectNormal();
if (bStartIsRound)
{
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
if (vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 宽厚颠倒
{
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
}
// LixlModify支持倾斜管上的变径
else if (!vtNormal.isPerpendicularTo(TAuxTools::GetUcsZvt()))
{
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
}
else
{
m_pXDataMap->GetAt(HRED_EndThick, dEndWidth);
}
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
}
else
{
vtSect = -vtSect;
if (vtNormal.isParallelTo(TAuxTools::GetUcsZvt()))
{
m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth);
}
// LixlModify支持倾斜管上的变径
else if (!vtNormal.isPerpendicularTo(TAuxTools::GetUcsZvt()))
{
m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth);
}
else
{
m_pXDataMap->GetAt(HRED_StartThick, dEndWidth);
}
m_pXDataMap->GetAt(HRED_EndWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_StartPoint, ptEnd);
m_pXDataMap->GetAt(HRED_EndPoint, ptStart);
}
AcDbObjectId idEndLayer, idBaseLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
TDbFittingBase* pFit = TDbFittingBase::cast(m_pOwnerEnt);
if (NULL != pFit)
idBaseLayer = pFit->CenterLayer();
BOOL bHasBaseLine = FALSE;
m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine);
TDb::TCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
// 绘单线
if (IsSingleLine())
{
AcGeVector3d vtDir = ptStart - ptEnd;
AcGePoint3d ptS, ptM, ptE;
vtDir.normalize();
ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0;
if (ptStart.distanceTo(ptEnd) > 120.0)
{
ptS = ptM + vtDir * 60.0;
ptE = ptM - vtDir * 60.0;
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd;
curEle.ptGe[1] = ptE;
curEle.ptGe[2] = ptE;
cplCurve.append(curEle);
}
else
{
ptS = ptStart;
ptE = ptEnd;
}
vtDir.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt());
curEle.ptGe[0] = ptS + 10.0 * vtDir; // ptS是圆断面
curEle.ptGe[1] = ptS - 10.0 * vtDir;
curEle.ptGe[2] = ptS - 10.0 * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE + 60.0 * vtDir;
curEle.ptGe[1] = ptE - 60.0 * vtDir;
curEle.ptGe[2] = ptE - 60.0 * vtDir;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE + 50.0 * vtDir;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
curEle.ptGe[0] = ptE - 50.0 * vtDir;
curEle.ptGe[1] = ptS;
curEle.ptGe[2] = ptS;
cplCurve.append(curEle);
return TRUE;
}
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3d arPoint[4], arPointIn[4];
arPoint[0] = ptStart - dStartWidth * vt / 2.0;
arPoint[1] = ptStart + dStartWidth * vt / 2.0;
arPoint[2] = ptEnd + dEndWidth * vt / 2.0;
arPoint[3] = ptEnd - dEndWidth * vt / 2.0;
arPointIn[0] = arPoint[0] - dPlusEdge * vtSect;
arPointIn[1] = arPoint[1] - dPlusEdge * vtSect;
arPointIn[2] = arPoint[2] + dPlusEdge * vtSect;
arPointIn[3] = arPoint[3] + dPlusEdge * vtSect;
if (1 == nType) // 内部线
{
curEle.ptGe[0] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[1] = arPointIn[2];
curEle.ptGe[2] = arPointIn[2];
cplCurve.append(curEle);
curEle.ptGe[0] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[1] = arPointIn[3];
curEle.ptGe[2] = arPointIn[3];
cplCurve.append(curEle);
if (bHasBaseLine)
{
curEle.idSubLay = idBaseLayer; // 基线图层
curEle.dWidth = GetCentLineWidth();
curEle.ptGe[0] = ptStart;
curEle.ptGe[1] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[2] = ptStart - dPlusEdge * vtSect;
cplCurve.append(curEle);
curEle.ptGe[0] = ptStart - dPlusEdge * vtSect;
curEle.ptGe[1] = ptEnd + dPlusEdge * vtSect;
curEle.ptGe[2] = ptEnd + dPlusEdge * vtSect;
cplCurve.append(curEle);
curEle.ptGe[0] = ptEnd + dPlusEdge * vtSect;
curEle.ptGe[1] = ptEnd;
curEle.ptGe[2] = ptEnd;
cplCurve.append(curEle);
}
}
else if (0 == nType) // 外边线
{
curEle.dWidth = GetEdgeLineWidth();
curEle.ptGe[0] = arPoint[1];
curEle.ptGe[1] = arPointIn[1];
curEle.ptGe[2] = arPointIn[1];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPointIn[0];
curEle.ptGe[2] = arPointIn[0];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[1];
curEle.ptGe[1] = arPointIn[2];
curEle.ptGe[2] = arPointIn[2];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[0];
curEle.ptGe[1] = arPointIn[3];
curEle.ptGe[2] = arPointIn[3];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[2];
curEle.ptGe[1] = arPoint[2];
curEle.ptGe[2] = arPoint[2];
cplCurve.append(curEle);
curEle.ptGe[0] = arPointIn[3];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
curEle.idSubLay = idEndLayer; // 两端图层
curEle.dWidth = GetEndLineWidth();
curEle.ptGe[0] = arPoint[0];
curEle.ptGe[1] = arPoint[1];
curEle.ptGe[2] = arPoint[1];
cplCurve.append(curEle);
curEle.ptGe[0] = arPoint[2];
curEle.ptGe[1] = arPoint[3];
curEle.ptGe[2] = arPoint[3];
cplCurve.append(curEle);
}
return TRUE;
}
// 构建外轮廓所围平面的3DFace组(方对圆)
BOOL THImpHvacReducer::MakeRect2CirPolyCurveFaces(AcDbVoidPtrArray& arFaces)
{
return MakeRect2RectPolyCurveFaces(arFaces);
}
// 绘制三维图形(圆对方)
void THImpHvacReducer::ExplodeCir2Rect3d(XExplodeDraw& mode) const
{
ExplodeRect2Cir3d(mode, TRUE);
}
// 构建外轮廓(圆对方)
AcDbPolyline* THImpHvacReducer::MakeCir2RectPolyCurve() const
{
return MakeRect2RectPolyCurve();
}
// 构建二维图形(圆对方)
BOOL THImpHvacReducer::MakeCir2Rect2DCurves(TComplexCurve& cplCurve, int &nType) const
{
return MakeRect2Cir2DCurves(cplCurve, nType, TRUE);
}
// 构建外轮廓所围平面的3DFace组(圆对方)
BOOL THImpHvacReducer::MakeCir2RectPolyCurveFaces(AcDbVoidPtrArray& arFaces)
{
return MakeRect2RectPolyCurveFaces(arFaces);
}
// 绘制三维图形(圆对圆)
void THImpHvacReducer::ExplodeCir2Cir3d(XExplodeDraw& mode) const
{
ASSERT(NULL != m_pXDataMap);
double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge();
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
AcGeVector3d vtSect = GetSectNormal();
double dMinDiffAng = PI / 12.0; // 圆弧分割的角度
GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinDiffAng);
int nSect = int(2.0 * PI / dMinDiffAng) + 1;
dMinDiffAng = 2.0 * PI / nSect;
// 起始端圆分割点
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arCirPtStart;
AcGePoint3d ptCir;
ptCir = ptStart + vt * dStartWidth / 2.0;
arCirPtStart.append(ptCir);
for (int i = 1; i < nSect; i++)
{
ptCir.rotateBy(dMinDiffAng, vtSect, ptStart);
arCirPtStart.append(ptCir);
}
arCirPtStart.append(ptStart + vt * dStartWidth / 2.0); // 最后一个封闭,可消除计算误差
// 终止端端圆分割点
AcGePoint3dArray arCirPtEnd;
ptCir = ptEnd + vt * dEndWidth / 2.0;
arCirPtEnd.append(ptCir);
for (i = 1; i < nSect; i++)
{
ptCir.rotateBy(dMinDiffAng, vtSect, ptEnd);
arCirPtEnd.append(ptCir);
}
arCirPtEnd.append(ptEnd + vt * dEndWidth / 2.0);
// nSect+1行2列网格点
AcGePoint3dArray arPoint;
for (i = 0; i < nSect + 1; i++)
{
arPoint.append(arCirPtStart.at(i));
arPoint.append(arCirPtStart.at(i) - dPlusEdge * vtSect);
arPoint.append(arCirPtEnd.at(i) + dPlusEdge * vtSect);
arPoint.append(arCirPtEnd.at(i));
}
mode.DrawMesh(nSect + 1, 4, arPoint.asArrayPtr());
}
// 构建外轮廓(圆对圆)
AcDbPolyline* THImpHvacReducer::MakeCir2CirPolyCurve() const
{
return MakeRect2RectPolyCurve();
}
// 构建二维图形(圆对圆)
BOOL THImpHvacReducer::MakeCir2Cir2DCurves(TComplexCurve& cplCurve, int &nType) const
{
return MakeRect2Rect2DCurves(cplCurve, nType);
}
// 构建外轮廓所围平面的3DFace组(圆对圆)
BOOL THImpHvacReducer::MakeCir2CirPolyCurveFaces(AcDbVoidPtrArray& arFaces)
{
return MakeRect2RectPolyCurveFaces(arFaces);
}
// 获得外轮廓点
void THImpHvacReducer::GetOutVertex(AcGePoint3dArray& arPoint, TDb::HvacSectType eStart, TDb::HvacSectType eEnd) const
{
double dStartWidth = 200.0, dStartThick = 200.0, dEndWidth = 400.0, dEndThick = 400.0;
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
if (eStart == TDb::eRectangular)
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
else
dStartThick = dStartWidth; // 圆形取厚度为宽
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
if (eStart == TDb::eRectangular)
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
else
dEndThick = dEndWidth;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
// 计算8顶点(圆形近似为方形计算)
AcGeVector3d vtSect = AcGeVector3d::kZAxis;
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arStartPt;
arStartPt.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0);
arStartPt.append(arStartPt.at(0) - dStartWidth * vt);
arStartPt.append(arStartPt.at(1) - dStartThick * vtNormal);
arStartPt.append(arStartPt.at(0) - dStartThick * vtNormal);
AcGePoint3dArray arEndPt;
arEndPt.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0);
arEndPt.append(arEndPt.at(0) - dEndWidth * vt);
arEndPt.append(arEndPt.at(1) - dEndThick * vtNormal);
arEndPt.append(arEndPt.at(0) - dEndThick * vtNormal);
// 边旋转到与x,y轴平行
double dAngle = vtNormal.angleTo(AcGeVector3d::kXAxis);
for (int i = 0; i < 4; i++)
{
arStartPt.at(i).rotateBy(dAngle, vtSect, ptStart);
arEndPt.at(i).rotateBy(dAngle, vtSect, ptStart);
}
// 寻找外轮廓点
if (arStartPt.at(0).x < arEndPt.at(0).x)
{
arPoint.append(arEndPt.at(0));
arPoint.append(arEndPt.at(1));
if (arStartPt.at(1).y < arEndPt.at(1).y)
{
arPoint.append(arEndPt.at(2));
if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏
{
arPoint.append(arStartPt.at(2));
arPoint.append(arStartPt.at(3));
if (arStartPt.at(3).y < arEndPt.at(3).y) // 左,下偏出
{
arPoint.append(arStartPt.at(0));
}
else // 左偏出
{
arPoint.append(arEndPt.at(3));
}
}
else
{
arPoint.append(arEndPt.at(3));
if (arStartPt.at(3).y < arEndPt.at(3).y) // 下偏出
{
arPoint.append(arStartPt.at(3));
arPoint.append(arStartPt.at(0));
}
else // 全在里面
{
}
}
}
else // 上偏
{
arPoint.append(arStartPt.at(1));
arPoint.append(arStartPt.at(2));
if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏
{
arPoint.append(arStartPt.at(3));
if (arStartPt.at(3).y < arEndPt.at(3).y) // 上,左,下偏出
{
arPoint.append(arStartPt.at(0));
}
else // 上,左偏出
{
arPoint.append(arEndPt.at(3));
}
}
else
{
arPoint.append(arEndPt.at(2));
arPoint.append(arEndPt.at(3));
if (arStartPt.at(3).y < arEndPt.at(3).y) // 上,下偏出
{
arPoint.append(arStartPt.at(3));
arPoint.append(arStartPt.at(0));
}
else // 上偏出
{
}
}
}
}
else // 右偏
{
arPoint.append(arStartPt.at(0));
arPoint.append(arStartPt.at(1));
if (arStartPt.at(1).y < arEndPt.at(1).y)
{
arPoint.append(arEndPt.at(1));
arPoint.append(arEndPt.at(2));
if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏
{
arPoint.append(arStartPt.at(2));
arPoint.append(arStartPt.at(3));
if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,左,下偏出
{
}
else // 右,左偏出
{
arPoint.append(arEndPt.at(3));
arPoint.append(arEndPt.at(0));
}
}
else
{
arPoint.append(arEndPt.at(3));
if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,下偏出
{
arPoint.append(arStartPt.at(3));
}
else // 右偏出
{
arPoint.append(arEndPt.at(0));
}
}
}
else // 上偏
{
arPoint.append(arStartPt.at(2));
if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏
{
arPoint.append(arStartPt.at(3));
if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,上,左,下偏出
{
}
else // 右,上,左偏出
{
arPoint.append(arEndPt.at(3));
arPoint.append(arEndPt.at(0));
}
}
else
{
arPoint.append(arEndPt.at(2));
arPoint.append(arEndPt.at(3));
if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,上,下偏出
{
arPoint.append(arStartPt.at(3));
}
else // 右,上偏出
{
arPoint.append(arEndPt.at(0));
}
}
}
}
// 恢复点的原位置
for (i = 0; i < arPoint.length(); i++)
{
arPoint.at(i).rotateBy(-dAngle, vtSect, ptStart);
}
}
/*
2______________________1
| |
| 0 |
| |
3______________________4|
*/
// bGetStartVertex 真:取起点截面周围顶点,假:取终点截面周围顶点
// 矩形截面,执行此函数后6个点,圆形界面26个点,顺序,中心点,逆时针24个点,逆时针起点终点重复一个点
void THImpHvacReducer::GetOutVertex2(AcGePoint3dArray& arPoint, bool bGetStartVertex) const
{
ASSERT(NULL != m_pXDataMap);
// 竖直放置时的外轮廓
if (IsVertAlignment())
{
AcGeVector3d vtSect, vtNor;
m_pXDataMap->GetAt(HRED_StartDir, vtSect);
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
AcGePoint3d ptCenter, ptTmp;
double dWidth(0.0), dThick(0.0);
TDb::HvacSectType eSect(TDb::eRectangular);
if (bGetStartVertex)
{
m_pXDataMap->GetAt(HRED_StartPoint, ptCenter);
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSect);
m_pXDataMap->GetAt(HRED_StartWidth, dWidth);
m_pXDataMap->GetAt(HRED_StartThick, dThick);
}
else
{
m_pXDataMap->GetAt(HRED_EndPoint, ptCenter);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSect);
m_pXDataMap->GetAt(HRED_EndWidth, dWidth);
m_pXDataMap->GetAt(HRED_EndThick, dThick);
}
AcGeVector3d vtDir = vtNor.crossProduct(vtSect);
AcGeVector3d vtDirV = vtDir.normalize();
vtDirV.rotateBy(PI*0.5, vtSect);
// 0
arPoint.append(ptCenter);
if (TDb::eRectangular == eSect)
{
ptTmp = ptCenter + vtDir * dWidth * 0.5;
ptTmp = ptTmp + vtDirV * dThick * 0.5;
arPoint.append(ptTmp);//1
ptTmp = arPoint[1] - vtDir * dWidth;
arPoint.append(ptTmp);//2
ptTmp = arPoint[2] - vtDirV * dThick;
arPoint.append(ptTmp);//3
ptTmp = arPoint[1] - vtDirV * dThick;
arPoint.append(ptTmp);//4
// 为闭合,增加1点为重复点
arPoint.append(arPoint[1]);
}
else if (TDb::eCircular == eSect)
{
// 把圆按照最小分度角,分成几部分,取圆上点
double dMixAngle = TAuxTools::GetMinDiffAngle();
int nPart = 24;
dMixAngle = PI*2.0 / nPart;
ptTmp = ptCenter + vtDir * dWidth * 0.5;
arPoint.append(ptTmp);
for (int i = 0; i < nPart; i++)
{
ptTmp.rotateBy(dMixAngle, vtSect, ptCenter);
arPoint.append(ptTmp);
}
}
}
}
// 垂直构建外轮廓
AcDbPolyline* THImpHvacReducer::MakePolyCurveVer() const
{
// TDb::HvacSectType eStartType = TDb::eRectangular;
// TDb::HvacSectType eEndType = TDb::eRectangular;
// m_pXDataMap->GetAt(HRED_StartSectType,(int&)eStartType);
// m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndType);
// AcGePoint3dArray arPoint;
// GetOutVertex(arPoint, eStartType, eEndType);
//
// double dStartWidth = 200.0, dStartThick = 200.0;
// AcGePoint3d ptStart;
// AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
// m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
// if (eStartType == TDb::eRectangular)
// m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
// else
// dStartThick = dStartWidth; // 圆形取厚度为宽
// m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
// m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
// AcGeVector3d vtSect = GetSectNormal();
// AcGeVector3d vt = vtSect;
// vt.rotateBy(PI / 2.0, vtNormal);
// vt.normalize();
// AcGePoint3dArray arStartPt;
// arStartPt.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0);
// arStartPt.append(arStartPt.at(0) - dStartWidth * vt);
// arStartPt.append(arStartPt.at(1) - dStartThick * vtNormal);
// arStartPt.append(arStartPt.at(0) - dStartThick * vtNormal);
//
// AcGePlane plan = GetStdPrjPlan(arStartPt.at(0));
// double dEle = TAuxTools::GetPlaneEle(plan);
//
// AcDbPolyline* pPolyLine = new AcDbPolyline;
// for (int i = 0; i < arPoint.length(); i++)
// {
// pPolyLine->addVertexAt(i, arPoint.at(i).convert2d(plan));
// }
// pPolyLine->setNormal(TAuxTools::GetUcsZvt());
// pPolyLine->setElevation(dEle);
// pPolyLine->setClosed(Adesk::kTrue);
// 换个方法Lixl modify 2012-5-21
TDb::HvacSectType eStartSect, eEndSect, eSect;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSect);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSect);
double dStaWidth, dStaThick, dEndWidth, dEndThick;
m_pXDataMap->GetAt(HRED_StartWidth, dStaWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStaThick);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
double dStartArea, dEndArea;
if (TDb::eRectangular == eStartSect)
dStartArea = dStaWidth * dStaThick;
else
dStartArea = dStaWidth * dStaWidth;
if (TDb::eRectangular == eEndSect)
dEndArea = dEndWidth * dEndThick;
else
dEndArea = dEndWidth * dEndWidth;
bool bStart(true);
eSect = eStartSect;
if (UP_ZERO(dEndArea - dStartArea))
{
bStart = false;
eSect = eEndSect;
}
AcGePoint3dArray arPoint;
GetOutVertex2(arPoint, bStart);
if (arPoint.length() < 6)
return NULL;
AcGePlane plan = GetStdPrjPlan(arPoint[0]);
double dEle = TAuxTools::GetPlaneEle(plan);
AcDbPolyline* pPolyLine = new AcDbPolyline;
if (eSect == TDb::eRectangular) // 方形截面
{
pPolyLine->addVertexAt(0, arPoint[1].convert2d(plan));
pPolyLine->addVertexAt(1, arPoint[2].convert2d(plan));
pPolyLine->addVertexAt(2, arPoint[3].convert2d(plan));
pPolyLine->addVertexAt(3, arPoint[4].convert2d(plan));
}
else
{
// 圆截面时,arPoint第一个元素是中心点,最后一个元素与逆时针起点重复,舍去
int nVer(0);
for (int i = 1; i < arPoint.length()-1; i++)
{
pPolyLine->addVertexAt(nVer++, arPoint[i].convert2d(plan));
}
}
pPolyLine->setNormal(TAuxTools::GetUcsZvt());
pPolyLine->setElevation(dEle);
pPolyLine->setClosed(Adesk::kTrue);
return pPolyLine;
}
void THImpHvacReducer::MakePolyCurveFacesVer(AcDbVoidPtrArray& arFaces)
{
// TDb::HvacSectType eStartType = TDb::eRectangular;
// TDb::HvacSectType eEndType = TDb::eRectangular;
// m_pXDataMap->GetAt(HRED_StartSectType,(int&)eStartType);
// m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndType);
// AcGePoint3dArray arPoint;
// GetOutVertex(arPoint, eStartType, eEndType);
//
// AcDbFace* pFace = NULL;
// for (int i = 1; i < arPoint.length() - 1; i++)
// {
// pFace = new AcDbFace;
// pFace->setVertexAt(0, arPoint.at(0));
// pFace->setVertexAt(1, arPoint.at(i));
// pFace->setVertexAt(2, arPoint.at(i + 1));
// arFaces.append(pFace);
// }
// Lixl modify 2012-5-21
TDb::HvacSectType eStartType = TDb::eRectangular;
TDb::HvacSectType eEndType = TDb::eRectangular;
m_pXDataMap->GetAt(HRED_StartSectType,(int&)eStartType);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndType);
AcGePoint3dArray arSra, arEnd;
GetOutVertex2(arSra, true);
GetOutVertex2(arEnd, false);
if (arSra.length() < 0 || arEnd.length() < 0)
return ;
AcDbFace* pFace = NULL;
if (TDb::eRectangular == eStartType)
{
pFace = new AcDbFace;
pFace->setVertexAt(0, arSra.at(1));
pFace->setVertexAt(1, arSra.at(2));
pFace->setVertexAt(2, arSra.at(3));
pFace->setVertexAt(3, arSra.at(4));
arFaces.append(pFace);
}
else
{
for (int i = 0; i <= arSra.length()-2; i++)
{
pFace = new AcDbFace;
pFace->setVertexAt(0, arSra[0]);
pFace->setVertexAt(1, arSra[i]);
pFace->setVertexAt(2, arSra[i + 1]);
pFace->setVertexAt(3, arSra[0]);
arFaces.append(pFace);
}
}
if (TDb::eRectangular == eEndType)
{
pFace = new AcDbFace;
pFace->setVertexAt(0, arEnd.at(1));
pFace->setVertexAt(1, arEnd.at(2));
pFace->setVertexAt(2, arEnd.at(3));
pFace->setVertexAt(3, arEnd.at(4));
arFaces.append(pFace);
}
else
{
for (int i = 0; i <= arEnd.length() - 2; i++)
{
pFace = new AcDbFace;
pFace->setVertexAt(0, arEnd[0]);
pFace->setVertexAt(1, arEnd[i]);
pFace->setVertexAt(2, arEnd[i + 1]);
pFace->setVertexAt(3, arEnd[0]);
arFaces.append(pFace);
}
}
}
// 垂直构建外轮廓(方对方)
AcDbPolyline* THImpHvacReducer::MakeRect2RectPolyCurveVer() const
{
return MakePolyCurveVer();
}
// 垂直构建二维图形(方对方)
BOOL THImpHvacReducer::MakeRect2Rect2DCurvesVer(TComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
// double dStartWidth = 200.0, dStartThick = 200.0, dEndWidth = 400.0, dEndThick = 400.0;
// AcGePoint3d ptStart, ptEnd;
// AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
// m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
// m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
// m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
// m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
// m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
// m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
// AcDbObjectId idEndLayer;
// m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
//
// // 计算顶点
// AcGeVector3d vt = AcGeVector3d::kZAxis;
// vt.rotateBy(PI / 2.0, vtNormal);
// vt.normalize();
// AcGePoint3dArray arStartPt;
// arStartPt.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0);
// arStartPt.append(arStartPt.at(0) - dStartWidth * vt);
// arStartPt.append(arStartPt.at(1) - dStartThick * vtNormal);
// arStartPt.append(arStartPt.at(0) - dStartThick * vtNormal);
// AcGePoint3dArray arEndPt;
// arEndPt.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0);
// arEndPt.append(arEndPt.at(0) - dEndWidth * vt);
// arEndPt.append(arEndPt.at(1) - dEndThick * vtNormal);
// arEndPt.append(arEndPt.at(0) - dEndThick * vtNormal);
//
// TDb::TCurveElement curEle;
// curEle.bHided = FALSE;
// curEle.dWidth = 0.0;
// curEle.gsMark = 0;
// if (0 == nType)
// {
// curEle.dWidth = GetEdgeLineWidth();
// for (int i = 0; i < 4; i++)
// {
// curEle.ptGe[0] = arStartPt.at(i);
// curEle.ptGe[1] = arEndPt.at(i);
// curEle.ptGe[2] = arEndPt.at(i);
// cplCurve.append(curEle);
// }
//
// curEle.idSubLay = idEndLayer; // 两端图层
// curEle.dWidth = GetEndLineWidth();
// for (i = 0; i < 3; i++)
// {
// curEle.ptGe[0] = arStartPt.at(i);
// curEle.ptGe[1] = arStartPt.at(i + 1);
// curEle.ptGe[2] = arStartPt.at(i + 1);
// cplCurve.append(curEle);
// curEle.ptGe[0] = arEndPt.at(i);
// curEle.ptGe[1] = arEndPt.at(i + 1);
// curEle.ptGe[2] = arEndPt.at(i + 1);
// cplCurve.append(curEle);
// }
// curEle.ptGe[0] = arStartPt.at(0);
// curEle.ptGe[1] = arStartPt.at(3);
// curEle.ptGe[2] = arStartPt.at(3);
// cplCurve.append(curEle);
// curEle.ptGe[0] = arEndPt.at(0);
// curEle.ptGe[1] = arEndPt.at(3);
// curEle.ptGe[2] = arEndPt.at(3);
// cplCurve.append(curEle);
// }
// Lixl modify 2012-5-21
AcGePoint3dArray arSta, arEnd;
GetOutVertex2(arSta, true);
GetOutVertex2(arEnd, false);
if (arSta.length() != arEnd.length()
|| arSta.length() != 6)
return FALSE;
double dEndWidht = GetEndLineWidth();
double dEdgeWidth = GetEdgeLineWidth();
AcDbObjectId idEndLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
TDb::TCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
{
curEle.idSubLay = idEndLayer;
curEle.dWidth = dEndWidht;
// 起点截面边线
int i = 0;
for (i = 1; i < arSta.length()-1; i++)
{
curEle.ptGe[0] = arSta[i];
curEle.ptGe[1] = arSta[i+1];
curEle.ptGe[2] = arSta[i+1];
cplCurve.append(curEle);
}
// 终点截面边线
for (i = 1; i < arSta.length()-1; i++)
{
curEle.ptGe[0] = arEnd[i];
curEle.ptGe[1] = arEnd[i+1];
curEle.ptGe[2] = arEnd[i+1];
cplCurve.append(curEle);
}
// 绘制两个截面顶点之间的连线
curEle.idSubLay.setNull();
curEle.dWidth = dEdgeWidth;
for (i = 1; i <= 4; i++)
{
curEle.ptGe[0] = arSta[i];
curEle.ptGe[1] = arEnd[i];
curEle.ptGe[2] = arEnd[i];
cplCurve.append(curEle);
}
}
return TRUE;
}
// 垂直构建外轮廓所围平面的3DFace组(方对方)
BOOL THImpHvacReducer::MakeRect2RectPolyCurveFacesVer(AcDbVoidPtrArray& arFaces)
{
ASSERT(NULL != m_pXDataMap);
MakePolyCurveFacesVer(arFaces);
return TRUE;
}
// 垂直构建外轮廓(方对圆)
AcDbPolyline* THImpHvacReducer::MakeRect2CirPolyCurveVer() const
{
return MakePolyCurveVer();
}
// 垂直构建二维图形(方对圆)
BOOL THImpHvacReducer::MakeRect2Cir2DCurvesVer(TComplexCurve& cplCurve, int &nType, BOOL bStartIsRound) const
{
ASSERT(NULL != m_pXDataMap);
double dStartDia = 200.0, dEndWidth = 400.0, dEndThick = 400.0;
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
if (bStartIsRound)
{
m_pXDataMap->GetAt(HRED_StartDiameter, dStartDia);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
}
else
{
m_pXDataMap->GetAt(HRED_EndDiameter, dStartDia);
m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartThick, dEndThick);
m_pXDataMap->GetAt(HRED_EndPoint, ptStart);
m_pXDataMap->GetAt(HRED_StartPoint, ptEnd);
}
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
AcDbObjectId idEndLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
// 计算顶点
AcGeVector3d vtSect = GetSectNormal();
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arStartPt;
AcGePoint3d ptCir = ptStart + dStartDia * vt / 2.0;
arStartPt.append(ptCir);
for (int i = 1; i < 8; i++)
{
ptCir.rotateBy(PI / 4.0, vtSect, ptStart);
arStartPt.append(ptCir);
}
arStartPt.append(ptStart + dStartDia * vt / 2.0);
AcGePoint3dArray arEndPt;
arEndPt.append(ptEnd + dEndWidth * vt / 2.0 - dEndThick * vtNormal / 2.0);
arEndPt.append(arEndPt.at(0) + dEndThick * vtNormal);
arEndPt.append(arEndPt.at(1) - dEndWidth * vt);
arEndPt.append(arEndPt.at(0) - dEndWidth * vt);
arEndPt.append(arEndPt.at(0));
TDb::TCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
// if (0 == nType)
{
curEle.dWidth = GetEdgeLineWidth();
for (i = 0; i < 4; i++)
{
curEle.ptGe[0] = arStartPt.at(2 * i);
curEle.ptGe[1] = arEndPt.at(i);
curEle.ptGe[2] = arEndPt.at(i);
cplCurve.append(curEle);
curEle.ptGe[0] = arStartPt.at(2 * i);
curEle.ptGe[1] = arEndPt.at(i + 1);
curEle.ptGe[2] = arEndPt.at(i + 1);
cplCurve.append(curEle);
}
curEle.idSubLay = idEndLayer; // 两端图层
curEle.dWidth = GetEndLineWidth();
for (i = 0; i < 4; i++)
{
curEle.ptGe[0] = arStartPt.at(2 * i);
curEle.ptGe[1] = arStartPt.at(2 * i + 1);
curEle.ptGe[2] = arStartPt.at(2 * i + 2);
cplCurve.append(curEle);
curEle.ptGe[0] = arEndPt.at(i);
curEle.ptGe[1] = arEndPt.at(i + 1);
curEle.ptGe[2] = arEndPt.at(i + 1);
cplCurve.append(curEle);
}
}
return TRUE;
}
// 垂直构建外轮廓所围平面的3DFace组(方对圆)
BOOL THImpHvacReducer::MakeRect2CirPolyCurveFacesVer(AcDbVoidPtrArray& arFaces)
{
ASSERT(NULL != m_pXDataMap);
MakePolyCurveFacesVer(arFaces);
return TRUE;
}
// 垂直构建外轮廓(圆对方)
AcDbPolyline* THImpHvacReducer::MakeCir2RectPolyCurveVer() const
{
return MakePolyCurveVer();
}
// 垂直构建二维图形(圆对方)
BOOL THImpHvacReducer::MakeCir2Rect2DCurvesVer(TComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
MakeRect2Cir2DCurvesVer(cplCurve, nType, TRUE);
return TRUE;
}
// 垂直构建外轮廓所围平面的3DFace组(圆对方)
BOOL THImpHvacReducer::MakeCir2RectPolyCurveFacesVer(AcDbVoidPtrArray& arFaces)
{
ASSERT(NULL != m_pXDataMap);
MakePolyCurveFacesVer(arFaces);
return TRUE;
}
// 垂直构建外轮廓(圆对圆)
AcDbPolyline* THImpHvacReducer::MakeCir2CirPolyCurveVer() const
{
return MakePolyCurveVer();
}
// 垂直构建二维图形(圆对圆)
BOOL THImpHvacReducer::MakeCir2Cir2DCurvesVer(TComplexCurve& cplCurve, int &nType) const
{
ASSERT(NULL != m_pXDataMap);
double dStartDia = 200.0, dEndDia = 400.0;
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(HRED_StartDiameter, dStartDia);
m_pXDataMap->GetAt(HRED_EndDiameter, dEndDia);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
AcDbObjectId idEndLayer;
m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer);
// 计算顶点
AcGeVector3d vtSect = GetSectNormal();
AcGeVector3d vt = vtSect;
vt.rotateBy(PI / 2.0, vtNormal);
vt.normalize();
AcGePoint3dArray arStartPt;
AcGePoint3d ptCir = ptStart + dStartDia * vt / 2.0;
arStartPt.append(ptCir);
for (int i = 1; i < 8; i++)
{
ptCir.rotateBy(PI / 4.0, vtSect, ptStart);
arStartPt.append(ptCir);
}
arStartPt.append(ptStart + dStartDia * vt / 2.0);
AcGePoint3dArray arEndPt;
ptCir = ptEnd + dEndDia * vt / 2.0;
arEndPt.append(ptCir);
for (i = 1; i < 8; i++)
{
ptCir.rotateBy(PI / 4.0, vtSect, ptEnd);
arEndPt.append(ptCir);
}
arEndPt.append(ptEnd + dEndDia * vt / 2.0);
TDb::TCurveElement curEle;
curEle.bHided = FALSE;
curEle.dWidth = 0.0;
curEle.gsMark = 0;
if (0 == nType)
{
curEle.idSubLay = idEndLayer; // 两端图层
curEle.dWidth = GetEndLineWidth();
for (i = 0; i < 4; i++)
{
curEle.ptGe[0] = arStartPt.at(2 * i);
curEle.ptGe[1] = arStartPt.at(2 * i + 1);
curEle.ptGe[2] = arStartPt.at(2 * i + 2);
cplCurve.append(curEle);
curEle.ptGe[0] = arEndPt.at(2 * i);
curEle.ptGe[1] = arEndPt.at(2 * i + 1);
curEle.ptGe[2] = arEndPt.at(2 * i + 2);
cplCurve.append(curEle);
}
}
return TRUE;
}
// 垂直构建外轮廓所围平面的3DFace组(圆对圆)
BOOL THImpHvacReducer::MakeCir2CirPolyCurveFacesVer(AcDbVoidPtrArray& arFaces)
{
ASSERT(NULL != m_pXDataMap);
MakePolyCurveFacesVer(arFaces);
return TRUE;
}
// mcl commented, 2010.03.17. GetHidePlane()求的可能是个斜面,改为以首点为基准
// AcGePlane THImpHvacReducer::GetHidePlane(AcGePoint3d pt1, AcGePoint3d pt2, AcGePoint3d pt3,
// const AcGeVector3d vtNormal, double &dEle) const
// {
// AcGePlane plan(pt1, pt2, pt3);
// AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan);
// plan.set(ptOrth, vtNormal);
//
// dEle = ptOrth.asVector().length();
// if (!ptOrth.asVector().isCodirectionalTo(vtNormal))
// dEle *= -1.0;
//
// return plan;
// }
AcGePlane THImpHvacReducer::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;
}
// 注意:pXMap == NULL表示不想得到返回值,只是判断数据是否合理
// 先取出m_pXDataMap中数据进行判断是否合理,返回判断结果
// 如果pXMap不为NULL,则将有效参数填入pXMap
BOOL THImpHvacReducer::IsValid(TDbXDataMap* pXMap)
{
ASSERT(NULL != m_pXDataMap);
AcGePoint3d ptEnd;
HvacReduComType eType = TDb::eAuto;
m_pXDataMap->GetAt(HRED_ComputeType, (int&)eType);
if (TDb::eAngle == eType)
ptEnd = GetEndPtByangle();
else if (TDb::eLength == eType)
ptEnd = GetEndPtByLen();
else
ptEnd = GetEndPtAuto();
AcGePoint3d ptOrigEnd;
m_pXDataMap->GetAt(HRED_EndPoint, ptOrigEnd);
m_pXDataMap->SetAt(HRED_EndPoint, ptEnd);
if (NULL != m_pOwnerEnt)
UpdateInterfaceRec(m_pOwnerEnt->objectId(), ptOrigEnd, ptEnd);
if (NULL != pXMap)
pXMap->SetAt(HRED_EndPoint, ptEnd);
return TRUE;
}
double THImpHvacReducer::GetEdgeLineWidth() const
{
BOOL bShow(FALSE);
GetGlobalContext( HVAC_SHOWWIDTH, bShow);
// add by hh 2011-01-05 从图纸中读取加粗标识 避免全局参数对不同的图纸间的影响
TAuxTools::GetTHvacDataFromDwg(HVAC_SHOWWIDTH, bShow);
if (!bShow)
return 0.0;
ASSERT(NULL != m_pXDataMap);
double dWidth(0.0);
m_pXDataMap->GetAt(HVAC_EdgeWidth, dWidth);
return dWidth;
}
double THImpHvacReducer::GetCentLineWidth() const
{
BOOL bShow(FALSE);
GetGlobalContext( HVAC_SHOWWIDTH, bShow);
// add by hh 2011-01-05 从图纸中读取加粗标识 避免全局参数对不同的图纸间的影响
TAuxTools::GetTHvacDataFromDwg(HVAC_SHOWWIDTH, bShow);
if (!bShow)
return 0.0;
ASSERT(NULL != m_pXDataMap);
double dWidth(0.0);
m_pXDataMap->GetAt(HVAC_CentWidth, dWidth);
return dWidth;
}
double THImpHvacReducer::GetEndLineWidth() const
{
BOOL bShow(FALSE);
GetGlobalContext( HVAC_SHOWWIDTH, bShow);
// add by hh 2011-01-05 从图纸中读取加粗标识 避免全局参数对不同的图纸间的影响
TAuxTools::GetTHvacDataFromDwg(HVAC_SHOWWIDTH, bShow);
if (!bShow)
return 0.0;
ASSERT(NULL != m_pXDataMap);
double dWidth(0.0);
m_pXDataMap->GetAt(HVAC_EndWidth, dWidth);
return dWidth;
}
double THImpHvacReducer::GetPlusEdge() const
{
return 0.0;
}
int THImpHvacReducer::GetXBaseShell(TXShell& xShell)
{
int nRet = 0;
if (NULL == m_pXDataMap)
{
return 0;
}
HvacSectType eSSectType;
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSSectType);
HvacSectType eESectType;
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eESectType);
if (TDb::eRectangular == eSSectType && TDb::eRectangular == eESectType)
{
// 获得参数
double dSWidth = 0.0;
m_pXDataMap->GetAt(HRED_StartWidth, dSWidth);
double dEWidth = 0.0;
m_pXDataMap->GetAt(HRED_EndWidth, dEWidth);
double dSThick = 0.0;
m_pXDataMap->GetAt(HRED_StartThick, dSThick);
double dEThick = 0.0;
m_pXDataMap->GetAt(HRED_EndThick, dEThick);
AcGeVector3d vtNormal;
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
vtNormal.normalize();
AcGeVector3d vtSide;
m_pXDataMap->GetAt(HRED_StartDir, vtSide);
vtSide.rotateBy(PI / 2.0, vtNormal);
vtSide.normalize();
AcGePoint3d ptStart;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
AcGePoint3d ptEnd;
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 构造碰撞实体
TAuxTools::BuildRectDuct(ptStart, ptEnd, vtNormal, dSWidth, dSThick, dEWidth, dEThick, xShell, &vtSide, &vtSide);
nRet = 1;
}
else if (TDb::eCircular == eSSectType && TDb::eCircular == eESectType)
{
// 获得参数
double dSDiameter = 0.0;
m_pXDataMap->GetAt(HRED_StartDiameter, dSDiameter);
double dEDiameter = 0.0;
m_pXDataMap->GetAt(HRED_EndDiameter, dEDiameter);
AcGeVector3d vtNormal;
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
AcGeVector3d vtSide;
m_pXDataMap->GetAt(HRED_StartDir, vtSide);
vtSide.rotateBy(PI / 2.0, vtNormal);
vtSide.normalize();
AcGePoint3d ptStart;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
AcGePoint3d ptEnd;
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 构造碰撞实体
TAuxTools::BuildCirDuct(ptStart, ptEnd, dSDiameter, dEDiameter, xShell, &vtSide, &vtSide);
nRet = 1;
}
else if ((TDb::eCircular == eSSectType && TDb::eRectangular == eESectType))
{
// 获得参数
double dSDiameter = 0.0;
m_pXDataMap->GetAt(HRED_StartDiameter, dSDiameter);
double dEWidth = 0.0;
m_pXDataMap->GetAt(HRED_EndWidth, dEWidth);
double dEThick = 0.0;
m_pXDataMap->GetAt(HRED_EndThick, dEThick);
AcGeVector3d vtNormal;
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
AcGeVector3d vtStart;
m_pXDataMap->GetAt(HRED_StartDir, vtStart);
AcGeVector3d vtSide = vtStart;
vtSide.rotateBy(PI / 2.0, vtNormal);
vtSide.normalize();
AcGePoint3d ptStart;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
AcGePoint3d ptEnd;
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 构造碰撞实体
TAuxTools::BuildCir2RectDuct(ptStart, ptEnd, vtNormal, dSDiameter, dEWidth, dEThick, xShell, &vtSide, &vtStart);
nRet = 1;
}
else if (TDb::eRectangular == eSSectType && TDb::eCircular == eESectType)
{
// 获得参数
double dEDiameter = 0.0;
m_pXDataMap->GetAt(HRED_EndDiameter, dEDiameter);
double dSWidth = 0.0;
m_pXDataMap->GetAt(HRED_StartWidth, dSWidth);
double dSThick = 0.0;
m_pXDataMap->GetAt(HRED_StartThick, dSThick);
AcGeVector3d vtNormal;
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
AcGeVector3d vtStart;
m_pXDataMap->GetAt(HRED_StartDir, vtStart);
AcGeVector3d vtEnd = -vtStart;
AcGeVector3d vtSide = vtEnd;
vtSide.rotateBy(PI / 2.0, vtNormal);
vtSide.normalize();
AcGePoint3d ptStart;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
AcGePoint3d ptEnd;
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 构造碰撞实体
TAuxTools::BuildCir2RectDuct(ptEnd, ptStart, vtNormal, dEDiameter, dSWidth, dSThick, xShell, &vtSide, &vtEnd);
nRet = 1;
}
else
{
// 不做处理
}
return nRet;
}
int THImpHvacReducer::GetBodyBox(AcDbExtents& ext)
{
if (NULL == m_pXDataMap)
{
return 0;
}
// 获得参数
double dSWidth = 0.0;
m_pXDataMap->GetAt(HRED_StartWidth, dSWidth);
double dHalfSWidth = dSWidth / 2.0;
double dSThick = 0.0;
m_pXDataMap->GetAt(HRED_StartThick, dSThick);
double dHalfSThick = dSThick / 2.0;
HvacSectType eSSectType;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSSectType);
if (TDb::eCircular == eSSectType)
{
// 处理圆管数据
dHalfSThick = dHalfSWidth;
}
double dEWidth = 0.0;
m_pXDataMap->GetAt(HRED_EndWidth, dEWidth);
double dHalfEWidth = dEWidth / 2.0;
double dEThick = 0.0;
m_pXDataMap->GetAt(HRED_EndThick, dEThick);
double dHalfEThick = dEThick / 2.0;
HvacSectType eESectType;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eESectType);
if (TDb::eCircular == eESectType)
{
// 处理圆管数据
dHalfEThick = dHalfEWidth;
}
AcGeVector3d vtNormal;
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
vtNormal.normalize();
AcGeVector3d vtSide;
m_pXDataMap->GetAt(HRED_StartDir, vtSide);
vtSide.rotateBy(PI / 2.0, vtNormal);
vtSide.normalize();
AcGePoint3d ptStart;
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
AcGePoint3d ptEnd;
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
// 计算端点
AcGePoint3dArray arpt;
arpt.append(ptStart + vtSide * dHalfSWidth + vtNormal * dHalfSThick);
arpt.append(ptStart + vtSide * dHalfSWidth - vtNormal * dHalfSThick);
arpt.append(ptStart - vtSide * dHalfSWidth - vtNormal * dHalfSThick);
arpt.append(ptStart - vtSide * dHalfSWidth + vtNormal * dHalfSThick);
arpt.append(ptEnd + vtSide * dHalfEWidth + vtNormal * dHalfEThick);
arpt.append(ptEnd + vtSide * dHalfEWidth - vtNormal * dHalfEThick);
arpt.append(ptEnd - vtSide * dHalfEWidth - vtNormal * dHalfEThick);
arpt.append(ptEnd - vtSide * dHalfEWidth + vtNormal * dHalfEThick);
// 构造最小包含体
TAuxTools::BuildMinRectangle(arpt, ext);
return 1;
}
AcGePoint3d THImpHvacReducer::GetEndPtAuto()
{
ASSERT(NULL != m_pXDataMap);
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtEnd, vtOffset;
double dPlus(0.0);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_StartDir, vtEnd);
m_pXDataMap->GetAt(HRED_Offset, vtOffset);
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlus);
vtEnd *= -1;
double dSizeSub = GetMaxSizeSub();
double dHoriLen = dSizeSub * 1.5 + 100;
if (dHoriLen < 200.0)
dHoriLen = 200.0;
ptEnd = ptStart + (dHoriLen + dPlus * 2) * vtEnd;
ptEnd += vtOffset;
return ptEnd;
}
// 不支持既不同心又没有一边对其情况心情况
AcGePoint3d THImpHvacReducer::GetEndPtByangle()
{
ASSERT(NULL != m_pXDataMap);
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtEnd, vtOffset;
double dSizeSub(0.0), dPlus(0.0), dAngle(0.0);
m_pXDataMap->GetAt(HRED_Angle, dAngle);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_StartDir, vtEnd);
m_pXDataMap->GetAt(HRED_Offset, vtOffset);
m_pXDataMap->GetAt(HVAC_PlusEdge, dPlus);
dSizeSub = GetMaxSizeSub();
vtEnd *= -1;
double dHoriLen(0.0);
if (vtOffset.length() < 1e-3) // 同心
dHoriLen = dSizeSub * 0.5 / tan(dAngle*0.5);
else
dHoriLen = dSizeSub / tan(dAngle);
double dAllDist = dHoriLen + dPlus * 2;
if (dAllDist < 200) // 避免天圆地方是看不出来
dAllDist = 200;
ptEnd = ptStart + dAllDist * vtEnd;
ptEnd += vtOffset;
return ptEnd;
}
AcGePoint3d THImpHvacReducer::GetEndPtByLen()
{
ASSERT(NULL != m_pXDataMap);
double dLen(0.0);
AcGePoint3d ptStart, ptEnd;
AcGeVector3d vtEnd, vtOffset;
m_pXDataMap->GetAt(HRED_Length, dLen);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(HRED_StartDir, vtEnd);
vtEnd *= -1;
if (dLen < 200)
dLen = 200;
vtOffset = ptEnd - ptStart;
vtOffset = vtOffset.orthoProject(vtEnd);
ptEnd = ptStart + dLen * vtEnd;
ptEnd += vtOffset;
return ptEnd;
}
double THImpHvacReducer::GetMaxSizeSub()
{
HvacSectType eStartSect = TDb::eRectangular;
HvacSectType eEndSect = TDb::eRectangular;
double dStartWidth(0.0), dEndWidth(0.0), dStartThick(0.0), dEndThick(0.0),
dMaxSizeSub(0.0);
m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSect);
m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSect);
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
if (eStartSect == eEndSect)
{
double dWidthSub = fabs(dStartWidth - dEndWidth);
if (eStartSect == TDb::eRectangular)
{
double dThickSub = fabs(dStartThick - dEndThick);
dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub;
}
else
{
dMaxSizeSub = dWidthSub;
}
}
else
{
if (eStartSect == TDb::eRectangular)
{
double dWidthSub = fabs(dStartWidth - dEndWidth);
double dThickSub = fabs(dStartThick - dEndWidth);
dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub;
}
else
{
double dWidthSub = fabs(dStartWidth - dEndWidth);
double dThickSub = fabs(dStartWidth - dEndThick);
dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub;
}
}
return dMaxSizeSub;
}
// 导出XML
// CString THImpHvacReducer::GetXml() const
// {
// if (NULL == m_pXDataMap || NULL == m_pOwnerEnt)
// return _T("");
//
// int nValue(0);
// double dValue(0.0);
// int nSizePreci = 3; // 尺寸精度
// int nPtPreci = 6; // 位置精度
// int nWhPreci = 0; // 宽度、高度精度
//
// TXmlTree xmlTree;
// CString csText;
// CString csX, csY, csZ;
// AcGePoint3d pt;
// AcGeVector3d vt;
// POSITION posRoot = xmlTree.Insert(_T("ATS_DBHFITTING"), NULL, NULL);
// {
// xmlTree.SetAttribute(posRoot, _T("name"), _T("变径"));
// xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称,包含天圆地方"));
// }
//
// POSITION posItemSectStr = xmlTree.Insert(_T("SectionType_start"), posRoot, NULL);
// {
// xmlTree.SetAttribute(posItemSectStr, _T("name"), _T("起始端截面类型"));
// xmlTree.SetAttribute(posItemSectStr, _T("comment"), _T("0:矩形,1:圆形"));
// m_pXDataMap->GetAt(HRED_StartSectType, nValue);
// csText.Format(_T("%d"), nValue);
// xmlTree.SetItemText(posItemSectStr, csText);
// }
//
// POSITION posItemSectEnd = xmlTree.Insert(_T("SectionType_end"), posRoot, posItemSectStr);
// {
// xmlTree.SetAttribute(posItemSectEnd, _T("name"), _T("终止端截面类型"));
// xmlTree.SetAttribute(posItemSectEnd, _T("comment"), _T("0:矩形,1:圆形"));
// m_pXDataMap->GetAt(HRED_EndSectType, nValue);
// csText.Format(_T("%d"), nValue);
// xmlTree.SetItemText(posItemSectEnd, csText);
// }
//
// POSITION posItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posItemSectEnd);
// {
// xmlTree.SetAttribute(posItemNorDir, _T("name"), _T("法向量"));
// m_pXDataMap->GetAt(HVAC_Normal, vt);
// TAuxTools::DoubleToString(vt.x, nPtPreci, csX);
// TAuxTools::DoubleToString(vt.y, nPtPreci, csY);
// TAuxTools::DoubleToString(vt.z, nPtPreci, csZ);
// csText.Format(_T("%s,%s,%s"), csX, csY, csZ);
// xmlTree.SetItemText(posItemNorDir, csText);
// }
//
// POSITION posItemStartPt = xmlTree.Insert(_T("Start_point"), posRoot, posItemNorDir);
// {
// xmlTree.SetAttribute(posItemStartPt, _T("name"), _T("起点位置"));
// m_pXDataMap->GetAt(HRED_StartPoint, pt);
// TAuxTools::DoubleToString(pt.x, nPtPreci, csX);
// TAuxTools::DoubleToString(pt.y, nPtPreci, csY);
// TAuxTools::DoubleToString(pt.z, nPtPreci, csZ);
// csText.Format(_T("%s,%s,%s"), csX, csY, csZ);
// xmlTree.SetItemText(posItemStartPt, csText);
// }
//
// POSITION posItemStartDir = xmlTree.Insert(_T("Start_direction"), posRoot, posItemStartPt);
// {
// xmlTree.SetAttribute(posItemStartDir, _T("name"), _T("起点方向"));
// m_pXDataMap->GetAt(HRED_StartDir, vt);
// TAuxTools::DoubleToString(vt.x, nPtPreci, csX);
// TAuxTools::DoubleToString(vt.y, nPtPreci, csY);
// TAuxTools::DoubleToString(vt.z, nPtPreci, csZ);
// csText.Format(_T("%s,%s,%s"), csX, csY, csZ);
// xmlTree.SetItemText(posItemStartDir, csText);
// }
//
// POSITION posItemEndPt = xmlTree.Insert(_T("End_point"), posRoot, posItemStartDir);
// {
// xmlTree.SetAttribute(posItemEndPt, _T("name"), _T("终点位置"));
// m_pXDataMap->GetAt(HRED_EndPoint, pt);
// TAuxTools::DoubleToString(pt.x, nPtPreci, csX);
// TAuxTools::DoubleToString(pt.y, nPtPreci, csY);
// TAuxTools::DoubleToString(pt.z, nPtPreci, csZ);
// csText.Format(_T("%s,%s,%s"), csX, csY, csZ);
// xmlTree.SetItemText(posItemEndPt, csText);
// }
//
// POSITION posItemWidthStr = xmlTree.Insert(_T("Width_Start"), posRoot, posItemEndPt);
// {
// xmlTree.SetAttribute(posItemWidthStr, _T("name"), _T("起始端宽度"));
// m_pXDataMap->GetAt(HRED_StartWidth, dValue);
// TAuxTools::DoubleToString(dValue, nWhPreci, csText);
// xmlTree.SetItemText(posItemWidthStr, csText);
// }
//
// POSITION posItemWidthEnd = xmlTree.Insert(_T("Width_End"), posRoot, posItemWidthStr);
// {
// xmlTree.SetAttribute(posItemWidthEnd, _T("name"), _T("终止端宽度"));
// m_pXDataMap->GetAt(HRED_EndWidth, dValue);
// TAuxTools::DoubleToString(dValue, nWhPreci, csText);
// xmlTree.SetItemText(posItemWidthEnd, csText);
// }
//
// POSITION posItemHghStr = xmlTree.Insert(_T("Height_Start"), posRoot, posItemWidthEnd);
// {
// xmlTree.SetAttribute(posItemHghStr, _T("name"), _T("起始端高度"));
// m_pXDataMap->GetAt(HRED_StartThick, dValue);
// TAuxTools::DoubleToString(dValue, nWhPreci, csText);
// xmlTree.SetItemText(posItemHghStr, csText);
// }
//
// POSITION posItemHghEnd = xmlTree.Insert(_T("Height_End"), posRoot, posItemHghStr);
// {
// xmlTree.SetAttribute(posItemHghEnd, _T("name"), _T("终止端高度"));
// m_pXDataMap->GetAt(HRED_EndThick, dValue);
// TAuxTools::DoubleToString(dValue, nWhPreci, csText);
// xmlTree.SetItemText(posItemHghEnd, csText);
// }
//
// POSITION posPlusEdge = xmlTree.Insert(_T("PlusEdge"), posRoot, posItemHghEnd);
// {
// xmlTree.SetAttribute(posPlusEdge, _T("name"),_T("咬口法兰翻边余量"));
// m_pXDataMap->GetAt(HVAC_PlusEdge, dValue);
// TAuxTools::DoubleToString(dValue, 1, csText);
// xmlTree.SetItemText(posPlusEdge, csText);
// }
//
// POSITION posObjId = xmlTree.Insert(_T("Object_ID"), posRoot, posPlusEdge);
// {
// xmlTree.SetAttribute(posObjId, _T("name"),_T("ID"));
// xmlTree.SetAttribute(posObjId, _T("comment"),_T("变径ID"));
//
// csText.Format(_T("%ld"), 0x7FFFFFFF & m_pOwnerEnt->objectId().asOldId());
// xmlTree.SetItemText(posObjId, csText);
// }
//
// CString csXml = xmlTree.GetXml();
//
// return csXml;
// }
CString THImpHvacReducer::GetXml(const AcGeMatrix3d& mat) const
{
if (NULL == m_pXDataMap || NULL == m_pOwnerEnt)
return _T("");
int nValue(0);
double dValue(0.0);
int nSizePreci = 3; // 尺寸精度
int nPtPreci = 6; // 位置精度
int nWhPreci = 0; // 宽度、高度精度
TXmlTree xmlTree;
CString csText;
CString csX, csY, csZ;
AcGePoint3d pt;
AcGeVector3d vt;
POSITION posRoot = xmlTree.Insert(_T("ATS_DBHFITTING"), NULL, NULL);
{
xmlTree.SetAttribute(posRoot, _T("name"), _T("变径"));
xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称,包含天圆地方"));
}
POSITION posItemSectStr = xmlTree.Insert(_T("SectionType_start"), posRoot, NULL);
{
xmlTree.SetAttribute(posItemSectStr, _T("name"), _T("起始端截面类型"));
xmlTree.SetAttribute(posItemSectStr, _T("comment"), _T("0:矩形,1:圆形"));
m_pXDataMap->GetAt(HRED_StartSectType, nValue);
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemSectStr, csText);
}
POSITION posItemSectEnd = xmlTree.Insert(_T("SectionType_end"), posRoot, posItemSectStr);
{
xmlTree.SetAttribute(posItemSectEnd, _T("name"), _T("终止端截面类型"));
xmlTree.SetAttribute(posItemSectEnd, _T("comment"), _T("0:矩形,1:圆形"));
m_pXDataMap->GetAt(HRED_EndSectType, nValue);
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemSectEnd, csText);
}
POSITION posItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posItemSectEnd);
{
xmlTree.SetAttribute(posItemNorDir, _T("name"), _T("法向量"));
m_pXDataMap->GetAt(HVAC_Normal, vt);
TAuxTools::DoubleToString(vt.x, nPtPreci, csX);
TAuxTools::DoubleToString(vt.y, nPtPreci, csY);
TAuxTools::DoubleToString(vt.z, nPtPreci, csZ);
csText.Format(_T("%s,%s,%s"), csX, csY, csZ);
xmlTree.SetItemText(posItemNorDir, csText);
}
POSITION posItemStartPt = xmlTree.Insert(_T("Start_point"), posRoot, posItemNorDir);
{
xmlTree.SetAttribute(posItemStartPt, _T("name"), _T("起点位置"));
m_pXDataMap->GetAt(HRED_StartPoint, pt);
pt.transformBy(mat);
TAuxTools::DoubleToString(pt.x, nPtPreci, csX);
TAuxTools::DoubleToString(pt.y, nPtPreci, csY);
TAuxTools::DoubleToString(pt.z, nPtPreci, csZ);
csText.Format(_T("%s,%s,%s"), csX, csY, csZ);
xmlTree.SetItemText(posItemStartPt, csText);
}
POSITION posItemStartDir = xmlTree.Insert(_T("Start_direction"), posRoot, posItemStartPt);
{
xmlTree.SetAttribute(posItemStartDir, _T("name"), _T("起点方向"));
m_pXDataMap->GetAt(HRED_StartDir, vt);
TAuxTools::DoubleToString(vt.x, nPtPreci, csX);
TAuxTools::DoubleToString(vt.y, nPtPreci, csY);
TAuxTools::DoubleToString(vt.z, nPtPreci, csZ);
csText.Format(_T("%s,%s,%s"), csX, csY, csZ);
xmlTree.SetItemText(posItemStartDir, csText);
}
POSITION posItemEndPt = xmlTree.Insert(_T("End_point"), posRoot, posItemStartDir);
{
xmlTree.SetAttribute(posItemEndPt, _T("name"), _T("终点位置"));
m_pXDataMap->GetAt(HRED_EndPoint, pt);
pt.transformBy(mat);
TAuxTools::DoubleToString(pt.x, nPtPreci, csX);
TAuxTools::DoubleToString(pt.y, nPtPreci, csY);
TAuxTools::DoubleToString(pt.z, nPtPreci, csZ);
csText.Format(_T("%s,%s,%s"), csX, csY, csZ);
xmlTree.SetItemText(posItemEndPt, csText);
}
POSITION posItemWidthStr = xmlTree.Insert(_T("Width_Start"), posRoot, posItemEndPt);
{
xmlTree.SetAttribute(posItemWidthStr, _T("name"), _T("起始端宽度"));
m_pXDataMap->GetAt(HRED_StartWidth, dValue);
TAuxTools::DoubleToString(dValue, nWhPreci, csText);
xmlTree.SetItemText(posItemWidthStr, csText);
}
POSITION posItemWidthEnd = xmlTree.Insert(_T("Width_End"), posRoot, posItemWidthStr);
{
xmlTree.SetAttribute(posItemWidthEnd, _T("name"), _T("终止端宽度"));
m_pXDataMap->GetAt(HRED_EndWidth, dValue);
TAuxTools::DoubleToString(dValue, nWhPreci, csText);
xmlTree.SetItemText(posItemWidthEnd, csText);
}
POSITION posItemHghStr = xmlTree.Insert(_T("Height_Start"), posRoot, posItemWidthEnd);
{
xmlTree.SetAttribute(posItemHghStr, _T("name"), _T("起始端高度"));
m_pXDataMap->GetAt(HRED_StartThick, dValue);
TAuxTools::DoubleToString(dValue, nWhPreci, csText);
xmlTree.SetItemText(posItemHghStr, csText);
}
POSITION posItemHghEnd = xmlTree.Insert(_T("Height_End"), posRoot, posItemHghStr);
{
xmlTree.SetAttribute(posItemHghEnd, _T("name"), _T("终止端高度"));
m_pXDataMap->GetAt(HRED_EndThick, dValue);
TAuxTools::DoubleToString(dValue, nWhPreci, csText);
xmlTree.SetItemText(posItemHghEnd, csText);
}
POSITION posPlusEdge = xmlTree.Insert(_T("PlusEdge"), posRoot, posItemHghEnd);
{
xmlTree.SetAttribute(posPlusEdge, _T("name"),_T("咬口法兰翻边余量"));
m_pXDataMap->GetAt(HVAC_PlusEdge, dValue);
TAuxTools::DoubleToString(dValue, 1, csText);
xmlTree.SetItemText(posPlusEdge, csText);
}
POSITION posObjId = xmlTree.Insert(_T("Object_ID"), posRoot, posPlusEdge);
{
xmlTree.SetAttribute(posObjId, _T("name"),_T("ID"));
xmlTree.SetAttribute(posObjId, _T("comment"),_T("变径ID"));
csText.Format(_T("%ld"), 0x7FFFFFFF & m_pOwnerEnt->objectId().asOldId());
xmlTree.SetItemText(posObjId, csText);
}
// begin
// add by wc 13-12-13
POSITION posSysName = xmlTree.Insert(_T("System"), posRoot, posObjId);
{
xmlTree.SetAttribute(posSysName, _T("name"), _T("管线类型"));
xmlTree.SetAttribute(posSysName, _T("comment"), _T("回风/送风/通风..."));
m_pXDataMap->GetAt(HVAC_System, csText);
xmlTree.SetItemText(posSysName, csText);
}
POSITION posSingleLine = xmlTree.Insert(_T("IsSingleLine"), posRoot, posSysName);
{
xmlTree.SetAttribute(posSingleLine, _T("name"), _T("单线"));
xmlTree.SetAttribute(posSingleLine, _T("comment"), _T("是否是单线: 1/是, 0/不是"));
csText.Format(_T("%d"), (int)IsSingleLine());
xmlTree.SetItemText(posSingleLine, csText);
}
POSITION posHasLiningLine = xmlTree.Insert(_T("HasLiningLine"), posRoot, posSingleLine);
{
xmlTree.SetAttribute(posHasLiningLine, _T("name"), _T("内衬线"));
xmlTree.SetAttribute(posHasLiningLine, _T("comment"), _T("是否有内衬线:0/不是, 1/是"));
if (!m_pXDataMap->GetAt(HVAC_HasLining, nValue))
nValue = 0;
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posHasLiningLine, csText);
}
POSITION posLiningLineType = xmlTree.Insert(_T("LiningLineType"), posRoot, posHasLiningLine);
{
AcDbObjectId idType;
AcDbObject *pObjType = NULL;
ACHAR *pChar = NULL;
xmlTree.SetAttribute(posLiningLineType, _T("name"), _T("内衬线型"));
xmlTree.SetAttribute(posLiningLineType, _T("comment"), _T("内衬线型的名称"));
m_pXDataMap->GetAt(HVAC_LiningLine, idType);
if (Acad::eOk != acdbOpenObject(pObjType, idType, AcDb::kForRead))
{
}
if (NULL != pObjType)
{
AcDbLinetypeTableRecord *pRec = AcDbLinetypeTableRecord::cast(pObjType);
pRec->getName(pChar);
pRec->close();
pObjType->close();
csText.Format(_T("%s"), pChar);
delete pChar;
}
else
csText.Empty();
}
POSITION posIsEdgeWidth = xmlTree.Insert(_T("IsEdgeWidth"), posRoot, posLiningLineType);
{
xmlTree.SetAttribute(posIsEdgeWidth, _T("name"), _T("边线是否加粗"));
xmlTree.SetAttribute(posIsEdgeWidth, _T("comment"), _T("0/不加粗, 1/加粗"));
if (!m_pXDataMap->GetAt(HVAC_EdgeWeight, nValue))
nValue = 0;
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posIsEdgeWidth, csText);
}
POSITION posIsCentWidth = xmlTree.Insert(_T("IsCentWidth"), posRoot, posIsEdgeWidth);
{
xmlTree.SetAttribute(posIsCentWidth, _T("name"), _T("中线是否加粗"));
xmlTree.SetAttribute(posIsCentWidth, _T("comment"), _T("0/不加粗, 1/加粗"));
if (!m_pXDataMap->GetAt(HVAC_CentWeight, nValue))
nValue = 0;
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posIsCentWidth, csText);
}
POSITION posIsEndWidth = xmlTree.Insert(_T("IsEndWidth"), posRoot, posIsCentWidth);
{
xmlTree.SetAttribute(posIsEndWidth, _T("name"), _T("端线是否加粗"));
xmlTree.SetAttribute(posIsEndWidth, _T("comment"), _T("0/不加粗, 1/加粗"));
if (!m_pXDataMap->GetAt(HVAC_EndWeight, nValue))
nValue = 0;
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posIsEndWidth, csText);
}
POSITION posEdgeWidth = xmlTree.Insert(_T("EdgeWidth"), posRoot, posIsEndWidth);
{
xmlTree.SetAttribute(posEdgeWidth, _T("name"), _T("边线加粗量"));
xmlTree.SetAttribute(posEdgeWidth, _T("comment"), _T("边线加粗的数值"));
m_pXDataMap->GetAt(HVAC_EdgeWidth, dValue);
csText.Format(_T("%f"), dValue);
xmlTree.SetItemText(posEdgeWidth, csText);
}
POSITION posCentWidth = xmlTree.Insert(_T("CentWidth"), posRoot, posEdgeWidth);
{
xmlTree.SetAttribute(posCentWidth, _T("name"), _T("中线加粗量"));
xmlTree.SetAttribute(posCentWidth, _T("comment"), _T("中线加粗的数值"));
m_pXDataMap->GetAt(HVAC_CentWidth, dValue);
csText.Format(_T("%f"), dValue);
xmlTree.SetItemText(posCentWidth, csText);
}
POSITION posEndWidth = xmlTree.Insert(_T("EndWidth"), posRoot, posCentWidth);
{
xmlTree.SetAttribute(posEndWidth, _T("name"), _T("端线加粗量"));
xmlTree.SetAttribute(posEndWidth, _T("comment"), _T("端线加粗的数值"));
m_pXDataMap->GetAt(HVAC_EndWidth, dValue);
csText.Format(_T("%f"), dValue);
xmlTree.SetItemText(posEndWidth, csText);
}
// end
CString csXml = xmlTree.GetXml();
return csXml;
}
// 点对应图见工程目录下 关键点示意图.dwg
bool THImpHvacReducer::GetSection( const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir,
std::vector<TObjSectionRecord> &sectionRecord, AcDbVoidPtrArray& arFillPtrs ) const
{
if (NULL == m_pXDataMap)
return false;
AcDbObjectId idObj = m_pOwnerEnt->objectId();
AcDbObjectId idLayer = m_pOwnerEnt->layerId();
TGGeSectionPlane section_pln(face, vtPlaneSecDir);
AcGePoint3d ptStart, ptEnd;
double dStartWidth(0.0), dStartThick(0.0), dEndWidth(0.0), dEndThick(0.0);
AcGeVector3d vtNormal = AcGeVector3d::kZAxis;
m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth);
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth);
m_pXDataMap->GetAt(HRED_EndThick, dEndThick);
m_pXDataMap->GetAt(HRED_StartPoint, ptStart);
m_pXDataMap->GetAt(HRED_EndPoint, ptEnd);
m_pXDataMap->GetAt(KEY_NORMAL, vtNormal);
// 计算开始4点
AcGeVector3d vtSect = GetSectNormal();
AcGeVector3d vtPerl = vtSect;
vtPerl.rotateBy(PI / 2.0, vtNormal);
vtPerl.normalize();
AcGePoint3dArray arPtS, arPtE;
arPtS.append(ptStart + dStartWidth * vtPerl*0.5 + dStartThick * vtNormal*0.5 );
arPtS.append(arPtS.at(0) - dStartWidth * vtPerl);
arPtS.append(arPtS.last() - dStartThick * vtNormal);
arPtS.append(arPtS.at(0) - dStartThick * vtNormal);
arPtE.append(ptEnd + dEndWidth * vtPerl*0.5 + dEndThick * vtNormal*0.5 );
arPtE.append(arPtE.at(0) - dEndWidth * vtPerl);
arPtE.append(arPtE.last() - dEndThick * vtNormal);
arPtE.append(arPtE.at(0) - dEndThick * vtNormal);
TGGePoly2D poly2d, poly2dOut;
// 上面
poly2d.AppendNode(arPtS[0]);
poly2d.AppendNode(arPtS[1]);
poly2d.AppendNode(arPtE[1]);
poly2d.AppendNode(arPtE[0]);
poly2d.AppendNode(*poly2d.Head());
double dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2d, poly2dOut);
if(!!poly2dOut) // add by hh 2011-03-11 增加投影后的Poly2D有效型判断
sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut));
// 下面
poly2d.Reset();
poly2d.AppendNode(arPtS[3]);
poly2d.AppendNode(arPtS[2]);
poly2d.AppendNode(arPtE[2]);
poly2d.AppendNode(arPtE[3]);
poly2d.AppendNode(*poly2d.Head());
poly2dOut.Reset();
dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2d, poly2dOut);
if(!!poly2dOut) // add by hh 2011-03-11 增加投影后的Poly2D有效型判断
sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut));
// 前面
poly2d.Reset();
poly2d.AppendNode(arPtS[1]);
poly2d.AppendNode(arPtS[2]);
poly2d.AppendNode(arPtE[2]);
poly2d.AppendNode(arPtE[1]);
poly2d.AppendNode(*poly2d.Head());
poly2dOut.Reset();
dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2d, poly2dOut);
if(!!poly2dOut) // add by hh 2011-03-11 增加投影后的Poly2D有效型判断
sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut));
// 后面
poly2d.Reset();
poly2d.AppendNode(arPtS[0]);
poly2d.AppendNode(arPtS[3]);
poly2d.AppendNode(arPtE[3]);
poly2d.AppendNode(arPtE[0]);
poly2d.AppendNode(*poly2d.Head());
poly2dOut.Reset();
dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2d, poly2dOut);
if(!!poly2dOut) // add by hh 2011-03-11 增加投影后的Poly2D有效型判断
sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut));
// 有圆形时,要绘制圆圈....
// ....待细化
return true;
}
Acad::ErrorStatus THImpHvacReducer::GetExtents( TADSGePoint3d &ptLow, TADSGePoint3d &ptUp ) const
{
if (NULL == m_pXDataMap)
return Acad::eNotImplementedYet;
AcGePoint3d ptStart, ptEnd;
m_pXDataMap->GetAt(HFLN_StartPoint, ptStart);
m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd);
AcGeVector3d vtUcsZ = TAuxTools::GetUcsZvt();
AcGeVector3d vtNormal = normal();
if (vtNormal.isParallelTo(vtUcsZ)) // 立管上的变径
{
if (ptStart.z < ptEnd.z)
{
ptLow = ptStart;
ptUp = ptEnd;
}
else
{
ptLow = ptEnd;
ptUp = ptStart;
}
}
else/* if (vtNormal.isPerpendicularTo(vtUcsZ))*/ // 水平管上的,暂不考虑斜管
{
double dStartThick(0.0), dEndthick(0.0);
HvacSectType eSect = TDb::eRectangular;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect);
if (TDb::eRectangular == eSect)
{
m_pXDataMap->GetAt(HRED_StartThick, dStartThick);
m_pXDataMap->GetAt(HRED_EndThick, dEndthick);
}
else
{
m_pXDataMap->GetAt(HRED_StartDiameter, dStartThick);
m_pXDataMap->GetAt(HRED_EndDiameter, dEndthick);
}
dStartThick *= 0.5;
dEndthick *= 0.5;
AcGePoint3d ptStaUp = ptStart + vtNormal * dStartThick;
AcGePoint3d ptStaDw = ptStart - vtNormal * dStartThick;
AcGePoint3d ptEndUp = ptEnd + vtNormal * dEndthick;
AcGePoint3d ptEndDw = ptEnd - vtNormal * dEndthick;
if (ptStaUp.z > ptEndUp.z)
ptUp = ptStaUp;
else
ptUp = ptEndUp;
if (ptStaDw.z < ptEndDw.z)
ptLow = ptStaDw;
else
ptLow = ptEndDw;
}
return Acad::eOk;
}
// add by hh 2014-08-06 支持管件与水管遮挡
Acad::ErrorStatus THImpHvacReducer::GetClipBoundary(TGGePoly2D& poly)const
{
AcDbPolyline* pLine = MakePolyCurve();
if(NULL == pLine)
return Acad::eNotImplementedYet;
double dBrWidth = 0;
if(!TAuxTools::GetTHvacDataFromDwg(HVAC_PIPEHIDEWIDTH, dBrWidth))
GetGlobalContext()->GetAt(HVAC_PIPEHIDEWIDTH, dBrWidth);
if(EQUAL_ZERO(dBrWidth))
{
PolyConvert(*pLine, poly);
}
else
{
AcDbVoidPtrArray arPLines;
pLine->getOffsetCurves(dBrWidth, arPLines);
if(0 == arPLines.length())
{
PolyConvert(*pLine, poly);
}
else
{
PolyConvert(*((AcDbPolyline*)arPLines[0]), poly);
for(int i = 0; i < arPLines.length(); i++)
{
if(NULL != arPLines[i])
delete (AcDbEntity*)arPLines[i];
}
}
}
delete pLine;
return Acad::eOk;
}
bool THImpHvacReducer::IsMeClip() const
{
return true;
}
bool THImpHvacReducer::IsClipMe(const TEntityBase* pEnt)const//ok是否被裁剪
{
if(NULL == pEnt)
return false;
//add by dyw 20150409 当图纸复杂时,遮挡的更改影响水管的绘制速度,暂时屏蔽掉
return false;
//add end
CString sClassName = pEnt->GetMe()->isA()->name();
if(0 == sClassName.Compare(_T("TDbPipe"))) // 水管
{
TInterfaceModifyMsg iMsg;
iMsg.SetInterfaceOper(TDb::eUpdateCover);
iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
// 写入接口更改消息
TDbInterfaceMsgWrite msgWrite;
msgWrite.WriteInterfaceMsg(iMsg);
return true;
}
return false;
}