2982 lines
82 KiB
C++
2982 lines
82 KiB
C++
#include "StdAfx.h"
|
|
#include "StdArx.h"
|
|
#include "THImpHvacEGroup.h"
|
|
#include "TAuxTools.h"
|
|
#include "TDbInterfaceMsgWrite.h"
|
|
using namespace TDb;
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
|
|
|
|
THImpHvacEGroup::THImpHvacEGroup()
|
|
{
|
|
// 初始化子箱体功能指针
|
|
m_pHvacEquipment = NULL;
|
|
m_pHvacEquipment = new TDbHvacEquipment;
|
|
}
|
|
|
|
THImpHvacEGroup::~THImpHvacEGroup()
|
|
{
|
|
// 销毁子箱体功能指针
|
|
if (NULL != m_pHvacEquipment)
|
|
delete m_pHvacEquipment;
|
|
}
|
|
|
|
|
|
BOOL THImpHvacEGroup::OPMInfo( LPCTSTR pszName, TDb::OPMInfo* pInfo )
|
|
{
|
|
ASSERT(NULL != pszName && NULL != pInfo && NULL != m_pXDataMap);
|
|
|
|
// 暖通基本参数设置
|
|
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::eAirHanding);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
if (0 == _tcsicmp(pszName, HAHG_BasePoint))
|
|
{
|
|
pInfo->bVisible = TRUE;
|
|
pInfo->bEditable = TRUE;
|
|
|
|
// 整体移动
|
|
if (NULL != pInfo->pXData && 0 != pInfo->pXData->nVt)
|
|
{
|
|
// 改变顶点变换行为
|
|
AcGePoint3d pt;
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, pt);
|
|
AcGeVector3d offset = asPnt3d(pInfo->pXData->dVal) - pt;
|
|
|
|
AcGeMatrix3d mat;
|
|
mat.setToTranslation(offset);
|
|
transformBy(mat);
|
|
pInfo->pXData->nVt = 0; // 设置处理完成标识
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// 多联机样式 为了注册列表名,保证其他管件能用到此参数
|
|
if (0 == _tcsicmp(pszName, HVRV_IType))
|
|
{
|
|
pInfo->bVisible = FALSE;
|
|
pInfo->bEditable = FALSE;
|
|
|
|
// 提供数据列表和对应关系
|
|
if (NULL != pInfo->parsValues && NULL != pInfo->parlValues)
|
|
{
|
|
pInfo->parlValues->Add(0);
|
|
pInfo->parsValues->Add(_T("室内机"));
|
|
pInfo->parlValues->Add(1);
|
|
pInfo->parsValues->Add(_T("室外机"));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void THImpHvacEGroup::MakeBoxCurve(TComplexCurve &cplCurve, AcGePoint3dArray &arPts) const
|
|
{
|
|
TDb::TCurveElement el;
|
|
memset(&el,0,sizeof(TDb::TCurveElement));
|
|
|
|
el.ptGe[0] = arPts[1];
|
|
el.ptGe[1] = arPts[2];
|
|
el.ptGe[2] = arPts[2];
|
|
cplCurve.append(el);
|
|
el.ptGe[0] = arPts[3];
|
|
el.ptGe[1] = arPts[4];
|
|
el.ptGe[2] = arPts[4];
|
|
cplCurve.append(el);
|
|
el.ptGe[0] = arPts[1];
|
|
el.ptGe[1] = arPts[4];
|
|
el.ptGe[2] = arPts[4];
|
|
cplCurve.append(el);
|
|
el.ptGe[0] = arPts[2];
|
|
el.ptGe[1] = arPts[3];
|
|
el.ptGe[2] = arPts[3];
|
|
cplCurve.append(el);
|
|
}
|
|
|
|
void THImpHvacEGroup::MakeDiagramCurve(XExplodeDraw &mode) const
|
|
{
|
|
// 获取子箱体个数
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
|
|
// 获取机组的关键参数,以便判断要绘制俯视图或是侧视图
|
|
BOOL bHasPlanform = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_Planform, bHasPlanform);
|
|
|
|
// 机组的基点及矢量
|
|
AcGeVector3d vtRot;
|
|
m_pXDataMap->GetAt(HAHG_RotDir, vtRot);
|
|
AcGePoint3d ptBase;
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
|
|
// 逐个箱体绘制
|
|
for (int i = 0; i < iNum; i++)
|
|
{
|
|
// 获取子箱体数据
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
// 如果为侧视图,需将数据虚拟到俯视平面
|
|
if (!bHasPlanform)
|
|
{
|
|
AcGePoint3d ptCen;
|
|
xSegMap.GetAt(HEQU_CenterPoint, ptCen);
|
|
ptCen.rotateBy(-PI * 0.5, vtRot, ptBase);
|
|
xSegMap.SetAt(HEQU_CenterPoint, ptCen);
|
|
}
|
|
|
|
// 获取外框关键点
|
|
AcGePoint3dArray arPts;
|
|
GetBoxPts(arPts, &xSegMap);
|
|
|
|
// 获取外框线段
|
|
TComplexCurve cplCurve;
|
|
MakeBoxCurve(cplCurve, arPts);
|
|
|
|
// 绘制外框
|
|
TDbExtentsEdge edage;
|
|
edage.SetEdage(cplCurve);
|
|
AcDbObjectId idReal = ((TDbInterfacesObj*)m_pOwnerEnt)->layerId();
|
|
AcDbObjectId idDash = ((TDbInterfacesObj*)m_pOwnerEnt)->DashLayer();
|
|
AcDbObjectId idCent = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
|
edage.ExplodeOrDraw2d(mode,idReal,idDash,idCent);
|
|
}
|
|
}
|
|
}
|
|
|
|
void THImpHvacEGroup::GetBoxPts(AcGePoint3dArray &arPts, TDbXDataMap *pMap, double dOffset, BOOL bNor) const
|
|
{
|
|
ASSERT(NULL != pMap);
|
|
|
|
// 获取子箱体的关键数据
|
|
AcGePoint3d ptStart, ptEnd, ptCenter;
|
|
AcGeVector3d vtMain, vtNor, vtMainv;
|
|
double dLength(50.0), dWidth(50.0), dThick(50.0);
|
|
BOOL bIsConverse = FALSE;
|
|
BOOL bHasPlanform = FALSE;
|
|
pMap->GetAt(HVAC_Normal, vtNor);
|
|
pMap->GetAt(HEQU_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HAHG_MainDir, vtMain);
|
|
pMap->GetAt(HEQU_Length, dLength);
|
|
pMap->GetAt(HEQU_Width, dWidth);
|
|
pMap->GetAt(HEQU_Thick, dThick);
|
|
pMap->GetAt(HEQU_IsConverse, bIsConverse);
|
|
m_pXDataMap->GetAt(HAHG_Planform, bHasPlanform);
|
|
|
|
// 俯视图与侧视图子箱体绘制时 使用的宽、厚不同
|
|
if (!bHasPlanform)
|
|
dWidth = dThick;
|
|
|
|
// 准备数据
|
|
vtMainv = vtMain;
|
|
vtMainv.rotateBy(PI * 0.5, vtNor);
|
|
vtMain.normalize();
|
|
vtMainv.normalize();
|
|
dLength *= 1000.0;
|
|
dWidth *= 1000.0;
|
|
|
|
// 计算外框关键点
|
|
// 0
|
|
arPts.append(ptCenter);
|
|
AcGePoint3d pt;
|
|
pt = ptCenter - vtMain * dLength * 0.5;
|
|
pt = pt + vtMainv * dWidth * 0.5;
|
|
// 1
|
|
arPts.append(pt);
|
|
// 2
|
|
arPts.append(arPts[1] + vtMain * dLength);
|
|
// 3
|
|
arPts.append(arPts[2] - vtMainv * dWidth);
|
|
// 4
|
|
arPts.append(arPts[1] - vtMainv * dWidth);
|
|
|
|
// 如果是底层箱体被遮挡,则调整外框的关键点
|
|
if (!bNor)
|
|
{
|
|
arPts[2] = arPts[2] + dOffset * vtMain;
|
|
arPts[3] = arPts[3] + dOffset * vtMain;
|
|
}
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::GetSubText(CString &sText, CStringArray &arText) const
|
|
{
|
|
// vc2005之前的版本,含有非汉字字符不予处理
|
|
INT_PTR iLen = sText.GetLength();
|
|
int iVer(2);
|
|
|
|
#if (ADS > 16)
|
|
iVer = 1;
|
|
#endif
|
|
|
|
if (iLen % iVer != 0)
|
|
return FALSE;
|
|
|
|
// 截取单个汉字
|
|
for (int i = 0; i < iLen; i += iVer)
|
|
{
|
|
CString str = sText.Mid(i, iVer);
|
|
arText.Add(str);
|
|
}
|
|
|
|
// 调整原文字格式
|
|
sText = _T("");
|
|
iLen = arText.GetSize();
|
|
for (i = 0; i < iLen; i++)
|
|
sText += arText.GetAt(i) + _T("\r\n");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
double THImpHvacEGroup::GetTotalThick() const
|
|
{
|
|
int iCount = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iCount);
|
|
double dMax(0.0);
|
|
for (int i = 0; i < iCount; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
double dThick(0.0);
|
|
xSegMap.GetAt(HEQU_Width, dThick);
|
|
if (dThick > dMax)
|
|
dMax = dThick;
|
|
}
|
|
}
|
|
|
|
return dMax;
|
|
}
|
|
|
|
double THImpHvacEGroup::GetTotalWidth() const
|
|
{
|
|
BOOL bIsHorizonal = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_IsHorizontal, bIsHorizonal);
|
|
int iSegNum(0);
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iSegNum);
|
|
double dWid(0.0);
|
|
if (bIsHorizonal)
|
|
{
|
|
for (int i = 0; i < iSegNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, iSegNum - 1, xSegMap))
|
|
{
|
|
double dSegLen(0.0);
|
|
xSegMap.GetAt(HEQU_Thick, dSegLen);
|
|
if (dSegLen > dWid)
|
|
dWid = dSegLen;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int iInflexion(0);
|
|
m_pXDataMap->GetAt(HAHG_Inflexion, iInflexion);
|
|
|
|
for (int j = iInflexion; j < iInflexion + 2; j ++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, j, xSegMap))
|
|
{
|
|
double dSegLen(0.0);
|
|
xSegMap.GetAt(HEQU_Thick, dSegLen);
|
|
dWid += dSegLen;
|
|
}
|
|
}
|
|
}
|
|
|
|
return dWid;
|
|
}
|
|
|
|
void THImpHvacEGroup::list() const
|
|
{
|
|
if (m_pXDataMap == NULL)
|
|
return;
|
|
|
|
BOOL bIsHorizonal = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_IsHorizontal, bIsHorizonal);
|
|
AcGePoint3d ptBase = AcGePoint3d::kOrigin;
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
BOOL bRight = TRUE;
|
|
m_pXDataMap->GetAt(HAHG_IsRight, bRight);
|
|
|
|
acutPrintf(_T("\t\t\t\t\t\t\t\t%s"), _T("空气机组"));
|
|
acutPrintf(_T("\n\t\t\t\t\t机组总长: %.0fmm"), GetTotalLen() * 1000.0);
|
|
acutPrintf(_T("\n\t\t\t\t\t宽度: %.0fmm"), GetTotalThick() * 1000.0);
|
|
acutPrintf(_T("\n\t\t\t\t\t高度: %.0fmm"), GetTotalWidth() * 1000.0);
|
|
acutPrintf(_T("\n\t\t\t\t\t底座标高: %.2fm"), ptBase.z / 1000.0);
|
|
acutPrintf(_T("\n\t\t\t\t\t组合方式: %s"), bIsHorizonal ? _T("卧式") : _T("立式"));
|
|
acutPrintf(_T("\n\t\t\t\t\t气流方向: %s"), bRight ? _T("由左向右") : _T("由右向左"));
|
|
}
|
|
|
|
TDbMText* THImpHvacEGroup::CreateMText(TDbXDataMap *pMap) const
|
|
{
|
|
// 子箱体的名称
|
|
CString sText(_T(""));
|
|
pMap->GetAt(HEQU_SEquipType, sText);
|
|
|
|
// 文字基点及方向
|
|
AcGePoint3d ptBase = AcGePoint3d::kOrigin;
|
|
pMap->GetAt(HEQU_CenterPoint, ptBase);
|
|
AcGeVector3d vtMain = AcGeVector3d::kIdentity;
|
|
m_pXDataMap->GetAt(HAHG_TextDir, vtMain);
|
|
|
|
|
|
// 拆分文字(用于竖向显示文字)
|
|
CStringArray arText;
|
|
if(!GetSubText(sText, arText))
|
|
return NULL;
|
|
|
|
// 没有要显示的文字 退出
|
|
INT_PTR iSize = arText.GetSize();
|
|
if (iSize == 0)
|
|
return NULL;
|
|
|
|
double dTextHeigh = 3.0;
|
|
// 调整文字基点
|
|
AcGeVector3d vtMainV = vtMain;
|
|
vtMainV.rotateBy(PI * 0.5, TAuxTools::GetUcsZvt());
|
|
vtMainV.normalize();
|
|
// ptBase = ptBase + vtMainV * (double)iSize * 150;
|
|
ptBase = ptBase + vtMainV * (double)iSize * dTextHeigh * 0.5 * DocGetPScale();
|
|
|
|
// 创建并设置文字实体
|
|
AcDbObjectId idStyle(AcDbObjectId::kNull);
|
|
m_pXDataMap->GetAt(HDIM_DimTextId, idStyle);
|
|
TDbMText *pMText = NULL;
|
|
pMText = new TDbMText;
|
|
pMText->setPropertiesFrom(m_pOwnerEnt);
|
|
pMText->SetText(sText);
|
|
pMText->SetLocation(ptBase);
|
|
pMText->SetRotation(AcGeVector3d::kXAxis.angleTo(vtMain, AcGeVector3d::kZAxis));//TAuxTools::GetUcsXvt().angleTo(vtMain, TAuxTools::GetUcsZvt())
|
|
pMText->setLayer(m_pOwnerEnt->layerId());
|
|
pMText->SetHeight(dTextHeigh);
|
|
|
|
pMText->SetStyleId(idStyle);
|
|
pMText->SetAlignment(XExplodeDraw::kCenter);
|
|
|
|
return pMText;
|
|
}
|
|
|
|
void THImpHvacEGroup::MakeDiagramText(XExplodeDraw &mode) const
|
|
{
|
|
// 子箱体个数
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
|
|
// 获取文字绘制的关键数据
|
|
BOOL bHasPlanform = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_Planform, bHasPlanform);
|
|
AcGeVector3d vtRot;
|
|
m_pXDataMap->GetAt(HAHG_RotDir, vtRot);
|
|
AcGePoint3d ptBase;
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
|
|
// 逐个绘制文字
|
|
for (int i = 0; i < iNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
// 如果为侧视图,需将数据变换后再绘制
|
|
if (!bHasPlanform)
|
|
{
|
|
AcGePoint3d ptCen;
|
|
xSegMap.GetAt(HEQU_CenterPoint, ptCen);
|
|
ptCen.rotateBy(-PI * 0.5, vtRot, ptBase);
|
|
xSegMap.SetAt(HEQU_CenterPoint, ptCen);
|
|
}
|
|
|
|
// 创建文字实体
|
|
TDbMText *pMText = NULL;
|
|
pMText = CreateMText(&xSegMap);
|
|
if (NULL != pMText)
|
|
{
|
|
if (mode.IsFullExplode())
|
|
pMText->ExplodeOrDraw2d(mode);
|
|
else
|
|
mode.DrawEntity(*pMText);
|
|
|
|
delete pMText;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void THImpHvacEGroup::DrawBox(XExplodeDraw &mode, TDbXDataMap *pMap, double dOffset /* = 0.0 */, BOOL bNor /* = TRUE */) const
|
|
{
|
|
// 首先绘制文字
|
|
TDbMText *pMText = NULL;
|
|
pMText = CreateMText(pMap);
|
|
if (NULL == pMText)
|
|
return;
|
|
|
|
//if (mode.IsFullExplode())
|
|
pMText->ExplodeOrDraw2d(mode);
|
|
//else
|
|
// mode.DrawEntity(*pMText);
|
|
delete pMText;
|
|
|
|
// 获取子箱体外框关键点
|
|
AcGePoint3dArray arPts;
|
|
GetBoxPts(arPts, pMap, dOffset, bNor);
|
|
|
|
// 获取子箱体外框线段数据
|
|
TComplexCurve cplCurve;
|
|
MakeBoxCurve(cplCurve, arPts);
|
|
|
|
// 绘制子箱体外框
|
|
TDbExtentsEdge edage;
|
|
edage.SetEdage(cplCurve);
|
|
AcDbObjectId idReal = ((TDbInterfacesObj*)m_pOwnerEnt)->layerId();
|
|
AcDbObjectId idDash = ((TDbInterfacesObj*)m_pOwnerEnt)->DashLayer();
|
|
AcDbObjectId idCent = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer();
|
|
edage.ExplodeOrDraw2d(mode,idReal,idDash,idCent);
|
|
|
|
}
|
|
|
|
void THImpHvacEGroup::MakePlanform2D(XExplodeDraw &mode) const
|
|
{
|
|
// 获取子箱体个数
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
if (iNum == 0)
|
|
return;
|
|
|
|
// 是否卧式
|
|
BOOL bIsHorizontal = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_IsHorizontal, bIsHorizontal);
|
|
|
|
// 卧式组合
|
|
if (bIsHorizontal)
|
|
{
|
|
MakeDiagramCurve(mode);
|
|
MakeDiagramText(mode);
|
|
}
|
|
else
|
|
{
|
|
// 拐点
|
|
int iIdx = -1;
|
|
m_pXDataMap->GetAt(HAHG_Inflexion, iIdx);
|
|
|
|
// 拐点为最后一个子箱体时
|
|
if (iIdx + 1 == iNum)
|
|
{
|
|
MakeDiagramCurve(mode);
|
|
MakeDiagramText(mode);
|
|
}
|
|
else if (iIdx + 1 < iNum)
|
|
{
|
|
// 记录顶层投影平面
|
|
AcGePoint3d ptBaseAbove = AcGePoint3d::kOrigin;
|
|
GetEquBasePoint(iNum - 1, ptBaseAbove);
|
|
AcGePlane planAbove(ptBaseAbove, TAuxTools::GetUcsZvt());
|
|
|
|
// 先绘制顶层箱体,并记录顶层总长度
|
|
double dLenAbove = 0.0;
|
|
for (int i = iIdx + 1; i < iNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
double dLen = 0.0;
|
|
xSegMap.GetAt(HEQU_Length, dLen);
|
|
dLenAbove += dLen * 1000.0;
|
|
|
|
DrawBox(mode, &xSegMap);
|
|
}
|
|
}
|
|
|
|
// 获得箱体总长
|
|
double dTotalLen = GetTotalLen() * 1000.0;
|
|
double dOverLen = dTotalLen - dLenAbove;
|
|
|
|
// 绘制底层未遮挡的箱体
|
|
if (dOverLen > 0.0)
|
|
{
|
|
for (int j = 0; j <= iIdx; j++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, j, xSegMap))
|
|
{
|
|
// 获得箱体长度,投影中心点到顶层平面
|
|
double dLen = 0.0;
|
|
xSegMap.GetAt(HEQU_Length, dLen);
|
|
AcGePoint3d ptTemp = AcGePoint3d::kOrigin;
|
|
xSegMap.GetAt(HEQU_CenterPoint, ptTemp);
|
|
ptTemp = ptTemp.orthoProject(planAbove);
|
|
xSegMap.SetAt(HEQU_CenterPoint, ptTemp);
|
|
|
|
dOverLen -= dLen * 1000.0;
|
|
if (dOverLen > 0.0)
|
|
DrawBox(mode, &xSegMap);
|
|
else
|
|
{
|
|
DrawBox(mode, &xSegMap, dOverLen, FALSE);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//在jig时画接口线
|
|
if(((TDbHvacEquipment*)m_pOwnerEnt)->IsDragging())
|
|
{
|
|
double dL(100.0);
|
|
AcGeVector3d vtInter,vtScale;
|
|
AcGePoint3d ptInter, ptend;
|
|
XLine xline;
|
|
|
|
TDbXDataMap xSegMap;
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_InterfaceNum, iNum);
|
|
for (int j = 0; j < iNum; j++)
|
|
{
|
|
if (m_pXDataMap->GetAt(HAHG_InterfaceData, j, xSegMap))
|
|
{
|
|
if (xSegMap.GetAt(HEQUIF_Point, ptInter))
|
|
{
|
|
xSegMap.GetAt(HEQUIF_Vector, vtInter);
|
|
vtInter.normalize();
|
|
ptend = ptInter + vtInter * dL;
|
|
xline.SetPoints(ptInter, ptend);
|
|
mode.SetColor(3);
|
|
mode.DrawLine(xline);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
double THImpHvacEGroup::GetTotalLen() const
|
|
{
|
|
// 获取计算所用的关键数据
|
|
double dTotalLen = 0.0;
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
if (iNum == 0)
|
|
return dTotalLen;
|
|
|
|
BOOL bIsHorizontal = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_IsHorizontal, bIsHorizontal);
|
|
int iIdx = -1;
|
|
m_pXDataMap->GetAt(HAHG_Inflexion, iIdx);
|
|
|
|
if (iIdx == -1)
|
|
bIsHorizontal = TRUE;
|
|
|
|
// 如果为立式,那么箱体总长计算到拐点为止
|
|
int iCount = -1;
|
|
if (bIsHorizontal)
|
|
iCount = iNum;
|
|
else
|
|
iCount = iIdx + 1;
|
|
|
|
// 计算总长
|
|
for (int i = 0; i < iCount; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
double dLen = 0.0;
|
|
xSegMap.GetAt(HEQU_Length, dLen);
|
|
dTotalLen += dLen;
|
|
}
|
|
}
|
|
|
|
return dTotalLen;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::GetEquBasePoint(int iIndex, AcGePoint3d &ptBase) const
|
|
{
|
|
BOOL bSuc = FALSE;
|
|
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, iIndex, xSegMap))
|
|
if (xSegMap.GetAt(HEQU_CenterPoint, ptBase))
|
|
bSuc = TRUE;
|
|
|
|
return bSuc;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacEGroup::ExplodeOrDraw2d(XExplodeDraw &mode) const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap && NULL != m_pHvacEquipment);
|
|
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
BOOL bHasPlanform = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_Planform, bHasPlanform);
|
|
|
|
// 绘制俯视图
|
|
if (bHasPlanform)
|
|
{
|
|
MakePlanform2D(mode);
|
|
}
|
|
else
|
|
{
|
|
// 绘制箱体部分
|
|
BOOL bDiagram = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_Diagram, bDiagram);
|
|
AcGeVector3d vtRot;
|
|
m_pXDataMap->GetAt(HAHG_RotDir, vtRot);
|
|
AcGePoint3d ptBase;
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
|
|
// 详图
|
|
if (!bDiagram)
|
|
{
|
|
for (int i = 0; i < iNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
double dLen(0.0);
|
|
xSegMap.GetAt(HEQU_Length, dLen);
|
|
xSegMap.SetAt(HEQU_Length, dLen * 2.0);
|
|
AcGePoint3d ptCen;
|
|
xSegMap.GetAt(HEQU_CenterPoint, ptCen);
|
|
ptCen.rotateBy(-PI * 0.5, vtRot, ptBase);
|
|
xSegMap.SetAt(HEQU_CenterPoint, ptCen);
|
|
|
|
BOOL bIsConverse = FALSE;
|
|
xSegMap.GetAt(HEQU_IsConverse, bIsConverse);
|
|
AcGeMatrix3d matMirror;
|
|
if (bIsConverse)
|
|
{
|
|
AcGeVector3d vtDir, vtNor;
|
|
xSegMap.GetAt(HEQU_MainDir, vtDir);
|
|
vtDir.normalize();
|
|
xSegMap.GetAt(HVAC_Normal, vtNor);
|
|
vtNor.normalize();
|
|
AcGePlane plane(ptCen, vtNor, vtNor.crossProduct(vtDir));
|
|
matMirror.setToMirroring(plane);
|
|
}
|
|
|
|
double dWid(0.0), dThick(0.0);
|
|
xSegMap.GetAt(HEQU_Width, dWid);
|
|
xSegMap.GetAt(HEQU_Thick, dThick);
|
|
xSegMap.SetAt(HEQU_Thick, dWid);
|
|
xSegMap.SetAt(HEQU_Width, dThick);
|
|
|
|
AcDbObjectId id2D = AcDbObjectId::kNull;
|
|
if (GetSeg2DId(i, id2D))
|
|
{
|
|
xSegMap.SetAt(HEQU_PartCenter, id2D);
|
|
m_pHvacEquipment->GetSpecialtyData()->CopyFrom(&xSegMap);
|
|
|
|
m_pHvacEquipment->ReCreateByXDataMap();
|
|
if (bIsConverse)
|
|
//change by zh 2013-5-23 解决空气机组Move出错问题
|
|
//Acad::ErrorStatus eSee = m_pHvacEquipment->transformBy(matMirror);
|
|
Acad::ErrorStatus eSee = m_pHvacEquipment->TransformBy(matMirror);
|
|
m_pHvacEquipment->ExplodeOrDraw2d(mode);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
else// 简图
|
|
{
|
|
MakeDiagramCurve(mode); //绘制边框
|
|
MakeDiagramText(mode); //绘制文字
|
|
}
|
|
}
|
|
|
|
BOOL bHasText = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_HasText, bHasText);
|
|
|
|
// 绘制模版文字,放在命令端单独绘制成为多行文字
|
|
if (bHasText)
|
|
{
|
|
MakeTemplateText(mode);
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::GetSeg2DId(int iIdx, AcDbObjectId &id) const
|
|
{
|
|
CString sKey;
|
|
sKey.Format(_T("%d"), iIdx);
|
|
if (m_pXDataMap->GetAt(sKey, id))
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void THImpHvacEGroup::MakeTemplateText(XExplodeDraw &mode) const
|
|
{
|
|
// 得到模板文字
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_TextNum, iNum);
|
|
if (iNum == 0)
|
|
return;
|
|
|
|
|
|
CString sText(_T(""));
|
|
for (int i = 0; i < iNum; i++)
|
|
{
|
|
CString sTmp(_T(""));
|
|
m_pXDataMap->GetAt(HAHG_Text, i, sTmp);
|
|
sText += sTmp;
|
|
}
|
|
|
|
if (!sText.IsEmpty())
|
|
{
|
|
// 模板文字的基点及矢量
|
|
AcGePoint3d ptBase;
|
|
m_pXDataMap->GetAt(HAHG_TextPoint, ptBase);
|
|
AcGeVector3d vtDir;
|
|
m_pXDataMap->GetAt(HAHG_TextDir, vtDir);
|
|
|
|
// 创建及设置模板文字实体
|
|
TDbMText *pMText = NULL;
|
|
pMText = new TDbMText;
|
|
pMText->SetText(sText);
|
|
pMText->SetLocation(ptBase);
|
|
pMText->SetRotation(AcGeVector3d::kXAxis.angleTo(vtDir, AcGeVector3d::kZAxis));
|
|
pMText->setLayer(m_pOwnerEnt->layerId());
|
|
pMText->SetHeight(3.0);
|
|
|
|
AcDbObjectId idStyle(AcDbObjectId::kNull);
|
|
m_pXDataMap->GetAt(HDIM_DimTextId, idStyle);
|
|
pMText->SetStyleId(idStyle);
|
|
// pMText->SetStyleId(GetTextStyleId(_T("_TCH_DIM")));
|
|
|
|
pMText->SetAlignment(XExplodeDraw::kLeft);
|
|
pMText->setPropertiesFrom(m_pOwnerEnt);
|
|
|
|
// 绘制文字
|
|
if (mode.IsFullExplode())
|
|
pMText->ExplodeOrDraw2d(mode);
|
|
else
|
|
mode.DrawEntity(*pMText);
|
|
delete pMText;
|
|
}
|
|
}
|
|
|
|
void THImpHvacEGroup::MakeSideViewDim(XExplodeDraw &mode) const
|
|
{
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
if (iNum <= 0)
|
|
return;
|
|
|
|
BOOL bIsHorizontal = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_IsHorizontal, bIsHorizontal);
|
|
int iIdx = -1;
|
|
m_pXDataMap->GetAt(HAHG_Inflexion, iIdx);
|
|
|
|
bIsHorizontal = TRUE;// test
|
|
|
|
AcDbVoidPtrArray arDimEnt;
|
|
AcGePoint3dArray arPts;
|
|
|
|
// 只有一个箱体时
|
|
if (iNum == 1)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, 0, xSegMap))
|
|
{
|
|
GetBoxPts(arPts, &xSegMap);
|
|
|
|
arDimEnt.append(CreateDimension(arPts[4], arPts[3], arPts[5]));
|
|
arDimEnt.append(CreateDimension(arPts[2], arPts[3], arPts[7]));
|
|
}
|
|
}
|
|
else // 多个箱体时
|
|
{
|
|
if (bIsHorizontal)// 卧式
|
|
{
|
|
AcGePoint3d ptS, ptE, ptE1;
|
|
for (int i = 0; i < iNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
arPts.setLogicalLength(0);
|
|
GetBoxPts(arPts, &xSegMap);
|
|
|
|
// 为子箱体下侧添加标注
|
|
arDimEnt.append(CreateDimension(arPts[3], arPts[4], arPts[5]));
|
|
|
|
// 记录第一个子箱体的标注关键点
|
|
if (i == 0)
|
|
{
|
|
ptS = arPts[4];
|
|
ptE1 = arPts[6];
|
|
}
|
|
|
|
// 记录最后一个子箱体的标注关键点,并为子箱体右侧添加标注
|
|
if (i == iNum - 1)
|
|
{
|
|
ptE = arPts[3];
|
|
arDimEnt.append(CreateDimension(arPts[2], arPts[3], arPts[7]));
|
|
}
|
|
}
|
|
}
|
|
|
|
// 为机组下侧添加总长标注
|
|
arDimEnt.append(CreateDimension(ptS, ptE, ptE1));
|
|
}
|
|
else // 立式
|
|
{
|
|
int iIdx = -1;
|
|
m_pXDataMap->GetAt(HAHG_Inflexion, iIdx);
|
|
|
|
// 立式中拐点在最后的
|
|
if (iIdx == iNum - 1)
|
|
{
|
|
AcGePoint3d ptS, ptE, ptE1;
|
|
for (int i = 0; i < iNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
arPts.setLogicalLength(0);
|
|
GetBoxPts(arPts, &xSegMap);
|
|
arDimEnt.append(CreateDimension(arPts[3], arPts[4], arPts[5]));
|
|
if (i == 0)
|
|
{
|
|
ptS = arPts[4];
|
|
ptE1 = arPts[6];
|
|
}
|
|
|
|
if (i == iNum - 1)
|
|
{
|
|
ptE = arPts[3];
|
|
arDimEnt.append(CreateDimension(arPts[2], arPts[3], arPts[7]));
|
|
}
|
|
}
|
|
}
|
|
arDimEnt.append(CreateDimension(ptS, ptE, ptE1));
|
|
}
|
|
else
|
|
{
|
|
if (iIdx == 0) // 立式特殊情况
|
|
{
|
|
AcGePoint3d ptS, ptE, ptE1;
|
|
TDbXDataMap xSegMap;
|
|
|
|
// 为第一个子箱体添加下侧与右侧的标注,并记录右侧的标注关键点
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, 0, xSegMap))
|
|
{
|
|
GetBoxPts(arPts, &xSegMap);
|
|
arDimEnt.append(CreateDimension(arPts[4], arPts[3], arPts[5]));
|
|
arDimEnt.append(CreateDimension(arPts[2], arPts[3], arPts[7]));
|
|
ptS = arPts[3];
|
|
ptE1 = arPts[8];
|
|
}
|
|
|
|
// 为第二个子箱体添加右侧标注,并为机组添加右侧总长
|
|
arPts.setLogicalLength(0);
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, 1, xSegMap))
|
|
{
|
|
GetBoxPts(arPts, &xSegMap);
|
|
arDimEnt.append(CreateDimension(arPts[2], arPts[3], arPts[7]));
|
|
ptE = arPts[2];
|
|
arDimEnt.append(CreateDimension(ptS, ptE, ptE1));
|
|
}
|
|
}
|
|
else // 正常情况
|
|
{
|
|
AcGePoint3d ptS, ptE, ptE1;
|
|
AcGePoint3d ptSV, ptEV, ptE1V;
|
|
|
|
for (int i = 0; i < iIdx + 2; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
arPts.setLogicalLength(0);
|
|
GetBoxPts(arPts, &xSegMap);
|
|
|
|
// 记录第一个子箱体的标注关键点
|
|
if (i == 0)
|
|
{
|
|
ptS = arPts[4];
|
|
ptE1 = arPts[6];
|
|
}
|
|
|
|
// 为拐点之前的子箱体添加下侧的标注
|
|
if (i < iIdx)
|
|
arDimEnt.append(CreateDimension(arPts[4], arPts[3], arPts[5]));
|
|
|
|
// 为拐点子箱体添加下侧及右侧标注,并记录标注关键点
|
|
if (i == iIdx)
|
|
{
|
|
arDimEnt.append(CreateDimension(arPts[4], arPts[3], arPts[5]));
|
|
arDimEnt.append(CreateDimension(arPts[2], arPts[3], arPts[7]));
|
|
ptE = arPts[3];
|
|
ptSV = arPts[3];
|
|
ptE1V = arPts[8];
|
|
}
|
|
|
|
// 为拐点之后第一个子箱体添加右侧标注, 并记录标注关键点
|
|
if (i == iIdx + 1)
|
|
{
|
|
arDimEnt.append(CreateDimension(arPts[2], arPts[3], arPts[7]));
|
|
ptEV = arPts[2];
|
|
}
|
|
}
|
|
}
|
|
|
|
// 为机组添加下侧及右侧的总长标注
|
|
arDimEnt.append(CreateDimension(ptS, ptE, ptE1));
|
|
arDimEnt.append(CreateDimension(ptSV, ptEV, ptE1V));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 逐个绘制标注
|
|
AcDbObjectId idOldLayer = mode.GetLayerId();
|
|
for (int j = 0; j < arDimEnt.length(); j++)
|
|
{
|
|
// 临时添加标注到模型空间
|
|
AcDbEntity *pEnt = NULL;
|
|
pEnt = (AcDbEntity*)arDimEnt.at(j);
|
|
AcDbObjectId idTmp = AddToModelSpace(pEnt, Adesk::kTrue);
|
|
|
|
// 打开标注实体
|
|
OPENOBJ_BEGIN(idTmp, AcDb::kForWrite, AcDbAlignedDimension, pTmpDim);
|
|
if (pTmpDim == NULL)
|
|
return;
|
|
|
|
// 置为删除状态
|
|
pTmpDim->erase();
|
|
|
|
// 炸开标注实体进行绘制(由于02平台下的XExplodeDraw::DrawEntity()绘制标注时有问题)
|
|
AcDbVoidPtrArray arTmp;
|
|
Acad::ErrorStatus es = pTmpDim->explode(arTmp);
|
|
|
|
// 逐个绘制炸开的元素
|
|
for(int i = 0; i < arTmp.length(); i++)
|
|
{
|
|
// 如果是AcDbMText类型的,继续将其炸开(理由同上)
|
|
AcDbEntity *pTmpEnt = (AcDbEntity*)arTmp.at(i);
|
|
CString str = pTmpEnt->isA()->name();
|
|
if (str == _T("AcDbMText"))
|
|
{
|
|
AcDbVoidPtrArray arMText;
|
|
pTmpEnt->explode(arMText);
|
|
for (int k = 0; k < arMText.length(); k++)
|
|
{
|
|
AcDbText *pttE = (AcDbText*)arMText.at(k);
|
|
mode.DrawEntity(*pttE);
|
|
delete pttE;
|
|
}
|
|
}
|
|
// 其他正常绘制
|
|
else
|
|
mode.DrawEntity(*pTmpEnt);
|
|
|
|
delete pTmpEnt;
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
mode.SetLayer(idOldLayer);
|
|
|
|
}
|
|
|
|
AcDbAlignedDimension* THImpHvacEGroup::CreateDimension(AcGePoint3d xLinePt1, AcGePoint3d xLinePt2, AcGePoint3d dimLinePt) const
|
|
{
|
|
// 创建标注实体
|
|
AcDbAlignedDimension *pDim = NULL;
|
|
pDim = new AcDbAlignedDimension(xLinePt1, xLinePt2, dimLinePt);
|
|
pDim->setDatabaseDefaults(acdbCurDwg());
|
|
pDim->setDimtxt(2.0);
|
|
|
|
return pDim;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacEGroup::ExplodeOrDraw3d(XExplodeDraw &mode) const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap && NULL != m_pHvacEquipment);
|
|
|
|
BOOL bIsPreviewing = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_IsPreviewing, bIsPreviewing);
|
|
if (bIsPreviewing)
|
|
{
|
|
ExplodeOrDraw2d(mode);
|
|
return Acad::eOk;
|
|
}
|
|
|
|
BOOL bIsPlanform = TRUE;
|
|
m_pXDataMap->GetAt(HAHG_Planform, bIsPlanform);
|
|
if (!bIsPlanform)
|
|
return Acad::eNotApplicable;
|
|
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
|
|
if (iNum == 0)
|
|
return Acad::eNotApplicable;
|
|
|
|
// 逐个绘制子箱体部分
|
|
AcGeVector3d vtMain;
|
|
m_pXDataMap->GetAt(HAHG_MainDir, vtMain);
|
|
for (int i = 0; i < iNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
// 绘制详图
|
|
double dLen(0.0);
|
|
xSegMap.GetAt(HEQU_Length, dLen);
|
|
xSegMap.SetAt(HEQU_Length, dLen * 2.0);
|
|
double dWid = 0.0;
|
|
xSegMap.GetAt(HEQU_Thick, dWid);
|
|
dWid *= 1000.0;
|
|
AcGeVector3d vtNor = TAuxTools::GetUcsZvt();
|
|
vtNor.normalize();
|
|
AcGePoint3d ptBase = AcGePoint3d::kOrigin;
|
|
xSegMap.GetAt(HEQU_CenterPoint, ptBase);
|
|
AcGePoint3d ptBaseNew = ptBase - vtNor * dWid * 0.5;
|
|
xSegMap.SetAt(HEQU_CenterPoint, ptBaseNew);
|
|
AcDbObjectId id2D = AcDbObjectId::kNull;
|
|
|
|
BOOL bIsConverse = FALSE;
|
|
xSegMap.GetAt(HEQU_IsConverse, bIsConverse);
|
|
AcGeMatrix3d matMirror;
|
|
if (bIsConverse)
|
|
{
|
|
AcGeVector3d vtDir;
|
|
xSegMap.GetAt(HEQU_MainDir, vtDir);
|
|
vtDir.normalize();
|
|
AcGePoint3d ptTmp = ptBaseNew + vtDir * 100.0;
|
|
|
|
AcGeLine3d lineMirror(ptBaseNew, ptTmp);
|
|
matMirror.setToMirroring(lineMirror);
|
|
}
|
|
|
|
if (GetSeg2DId(i, id2D))
|
|
{
|
|
xSegMap.SetAt(HEQU_PartCenter, id2D);
|
|
m_pHvacEquipment->GetSpecialtyData()->CopyFrom(&xSegMap);
|
|
m_pHvacEquipment->ReCreateByXDataMap();
|
|
if (bIsConverse)
|
|
m_pHvacEquipment->transformBy(matMirror);
|
|
m_pHvacEquipment->ExplodeOrDraw3d(mode);
|
|
}
|
|
|
|
xSegMap.GetAt(HEQU_Length, dLen);
|
|
xSegMap.SetAt(HEQU_Length, dLen * 0.5);
|
|
|
|
// 绘制3D边框
|
|
AcGePoint3dArray arPts;
|
|
xSegMap.SetAt(HEQU_CenterPoint, ptBase);
|
|
GetBoxPts(arPts, &xSegMap);
|
|
AcGePoint3dArray arPtSides;
|
|
arPtSides.append(arPts[3] + vtNor * dWid * 0.5);
|
|
arPtSides.append(arPts[4] + vtNor * dWid * 0.5);
|
|
arPtSides.append(arPts[4] - vtNor * dWid * 0.5);
|
|
arPtSides.append(arPts[3] - vtNor * dWid * 0.5);
|
|
arPtSides.append(arPts[3] + vtNor * dWid * 0.5);
|
|
arPtSides.append(arPts[2] + vtNor * dWid * 0.5);
|
|
arPtSides.append(arPts[1] + vtNor * dWid * 0.5);
|
|
arPtSides.append(arPts[1] - vtNor * dWid * 0.5);
|
|
arPtSides.append(arPts[2] - vtNor * dWid * 0.5);
|
|
arPtSides.append(arPts[2] + vtNor * dWid * 0.5);
|
|
mode.DrawMesh(2, 5, arPtSides.asArrayPtr());
|
|
}
|
|
}
|
|
// 标注原因:暂时决定不再显示底座 by lz
|
|
// AcGePoint3d ptBase = AcGePoint3d::kOrigin;
|
|
// m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
// if (ptBase.z > 0.000001)
|
|
// {
|
|
//
|
|
// AcGePoint3dArray arPtSides;
|
|
// arPtSides.append(ptBase);
|
|
// AcGeVector3d vtDir, vtNor, vtVDir;
|
|
// m_pXDataMap->GetAt(HAHG_MainDir, vtDir);
|
|
// m_pXDataMap->GetAt(HVAC_Normal, vtNor);
|
|
// vtVDir = vtDir.crossProduct(vtNor);
|
|
// vtDir.normalize();
|
|
// vtVDir.normalize();
|
|
// vtNor.normalize();
|
|
// double dLen = GetTotalLen();
|
|
// double dThick = GetTotalThick();
|
|
// BOOL bRight = FALSE;
|
|
// m_pXDataMap->GetAt(HAHG_IsRight, bRight);
|
|
// if (bRight)
|
|
// {
|
|
// arPtSides.append(ptBase - vtVDir * dThick * 1000);
|
|
// arPtSides.append(ptBase - vtVDir * dThick * 1000 + vtDir * dLen * 1000);
|
|
// arPtSides.append(ptBase + vtDir * dLen * 1000);
|
|
// arPtSides.append(ptBase);
|
|
// }
|
|
// else
|
|
// {
|
|
// arPtSides.append(ptBase + vtVDir * dThick * 1000);
|
|
// arPtSides.append(ptBase + vtVDir * dThick * 1000 - vtDir * dLen * 1000);
|
|
// arPtSides.append(ptBase - vtDir * dLen * 1000);
|
|
// arPtSides.append(ptBase);
|
|
// }
|
|
//
|
|
// arPtSides.append(arPtSides.at(0) - vtNor * ptBase.z);
|
|
// arPtSides.append(arPtSides.at(1) - vtNor * ptBase.z);
|
|
// arPtSides.append(arPtSides.at(2) - vtNor * ptBase.z);
|
|
// arPtSides.append(arPtSides.at(3) - vtNor * ptBase.z);
|
|
// arPtSides.append(arPtSides.at(4) - vtNor * ptBase.z);
|
|
// mode.DrawMesh(2, 5, arPtSides.asArrayPtr());
|
|
// }
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacEGroup::transformBy(const AcGeMatrix3d& xform)
|
|
{
|
|
ASSERT(NULL != m_pXDataMap && NULL != m_pHvacEquipment);
|
|
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
|
|
// 箱体部分
|
|
for (int i = 0; i < iNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
AcGePoint3d ptCenter;
|
|
AcGeVector3d vtMainDir;
|
|
xSegMap.GetAt(HEQU_CenterPoint, ptCenter);
|
|
xSegMap.GetAt(HEQU_MainDir, vtMainDir);
|
|
// add by zh 2013-5-24 镜像处理
|
|
/*AcGeVector3d vtNor, vtScale;
|
|
double dL(1.0),dW(1.0),dT(1.0);
|
|
xSegMap.GetAt(HEQU_Length, dL);
|
|
xSegMap.GetAt(HEQU_Width, dW);
|
|
xSegMap.GetAt(HEQU_Thick, dT);
|
|
xSegMap.GetAt(HEQU_Scale, vtScale);
|
|
xSegMap.GetAt(HVAC_Normal, vtNor);
|
|
|
|
AcGeVector3d vtPrep(vtNor.crossProduct(vtMainDir));
|
|
|
|
// 变换位置
|
|
ptCenter.transformBy(xform);
|
|
vtMainDir.transformBy(xform);
|
|
vtNor.transformBy(xform);
|
|
vtPrep.transformBy(xform);
|
|
// 同向是旋转,不变号,反向是镜像,变号。
|
|
int iSign = ((vtPrep.isCodirectionalTo(vtNor.crossProduct(vtMainDir))) ? 1 : -1);
|
|
vtScale.y *= iSign;
|
|
double dscale = xform.scale();
|
|
vtScale *= dscale;
|
|
// 更新点
|
|
xSegMap.SetAt(HVAC_Normal, vtNor);
|
|
xSegMap.SetAt(HEQU_Length, dL * dscale);
|
|
xSegMap.SetAt(HEQU_Width, dW * dscale);
|
|
xSegMap.SetAt(HEQU_Thick, dT * dscale);
|
|
xSegMap.SetAt(HEQU_Scale, vtScale);
|
|
*/
|
|
//m_pHvacEquipment->GetSpecialtyData()->CopyFrom(&xSegMap);
|
|
//m_pHvacEquipment->ReCreateByXDataMap();
|
|
//m_pHvacEquipment->transformBy(xform);
|
|
ptCenter.transformBy(xform);
|
|
vtMainDir.transformBy(xform);
|
|
xSegMap.SetAt(HEQU_CenterPoint, ptCenter);
|
|
xSegMap.SetAt(HEQU_MainDir, vtMainDir);
|
|
//xSegMap.CopyFrom(m_pHvacEquipment->GetSpecialtyData());
|
|
//xSegMap.RemoveAt(HEQU_TextPoint);
|
|
m_pXDataMap->SetAt(HAHG_SegmentData, i, xSegMap);
|
|
}
|
|
}
|
|
|
|
// 接口数据
|
|
AcGeVector3d vtDir = AcGeVector3d::kIdentity;
|
|
AcGePoint3d ptBase = AcGePoint3d::kOrigin;
|
|
int iIFCount = GetInterfaceCount();
|
|
for (int j = 0; j < iIFCount; j++)
|
|
{
|
|
TDbXDataMap xIFData;
|
|
if (m_pXDataMap->GetAt(HAHG_InterfaceData, j, xIFData))
|
|
{
|
|
xIFData.GetAt(HEQUIF_Point, ptBase);
|
|
ptBase.transformBy(xform);
|
|
BOOL bLook = xIFData.SetAt(HEQUIF_Point, ptBase);
|
|
|
|
xIFData.GetAt(HEQUIF_Vector, vtDir);
|
|
vtDir.transformBy(xform);
|
|
xIFData.SetAt(HEQUIF_Vector, vtDir);
|
|
|
|
m_pXDataMap->SetAt(HAHG_InterfaceData, j, xIFData);
|
|
}
|
|
}
|
|
|
|
// 基点
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
ptBase.transformBy(xform);
|
|
m_pXDataMap->SetAt(HAHG_BasePoint, ptBase);
|
|
|
|
// 文字基点
|
|
m_pXDataMap->GetAt(HAHG_TextPoint, ptBase);
|
|
ptBase.transformBy(xform);
|
|
m_pXDataMap->SetAt(HAHG_TextPoint, ptBase);
|
|
|
|
// 矢量方向
|
|
m_pXDataMap->GetAt(HAHG_MainDir, vtDir);
|
|
vtDir.transformBy(xform);
|
|
m_pXDataMap->SetAt(HAHG_MainDir, vtDir);
|
|
|
|
// 文字方向
|
|
m_pXDataMap->GetAt(HAHG_TextDir, vtDir);
|
|
vtDir.transformBy(xform);
|
|
m_pXDataMap->SetAt(HAHG_TextDir, vtDir);
|
|
|
|
// 侧视图求点用的旋转轴
|
|
m_pXDataMap->GetAt(HAHG_RotDir, vtDir);
|
|
vtDir.transformBy(xform);
|
|
m_pXDataMap->SetAt(HAHG_RotDir, vtDir);
|
|
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
TDb::Position THImpHvacEGroup::ExplainGripIndex(int nIndex) const
|
|
{
|
|
if (nIndex > 1)
|
|
return TDb::eCommand0;
|
|
|
|
return TDb::eMid;
|
|
|
|
// 模版文字单独布置为多行文字
|
|
// BOOL bHasText = FALSE;
|
|
// m_pXDataMap->GetAt(HAHG_HasText, bHasText);
|
|
// int iSt = 0;
|
|
// if (bHasText)
|
|
// iSt = 1;
|
|
//
|
|
// // 接口夹点
|
|
// if(nIndex > iSt)
|
|
// return TDb::eCommand0;
|
|
// else
|
|
// // 实体移动夹点
|
|
// if (nIndex == 0)
|
|
// return TDb::eMid;
|
|
// // 模板文字移动夹点
|
|
// else
|
|
// return TDb::eStart;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacEGroup::GetGripText(int i, CString &cs) const
|
|
{
|
|
// 文字不在实体中绘制了
|
|
// BOOL bHasText = FALSE;
|
|
// m_pXDataMap->GetAt(HAHG_HasText, bHasText);
|
|
//
|
|
// int iSt = 0;
|
|
// if (bHasText)
|
|
// iSt = 1;
|
|
|
|
int iSt = 1;
|
|
// 获取子箱体的接口夹点描述文字
|
|
if (i > iSt)
|
|
{
|
|
int iIndex = i - iSt - 1;
|
|
TDbXDataMap xIFData;
|
|
if (m_pXDataMap->GetAt(HAHG_InterfaceData, iIndex, xIFData))
|
|
xIFData.GetAt(HEQUIF_Name, cs);
|
|
}
|
|
else
|
|
{
|
|
// 机组及模板文字的夹点描述文字
|
|
// if (i == 0)
|
|
cs = _T("改变位置");
|
|
// if (i == 1)
|
|
// cs = _T("文字移动");
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacEGroup::moveGripPointsAt(const AcDbIntArray& indices,
|
|
const AcGeVector3d& offset)
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
|
|
int iLen = indices.length();
|
|
if (iLen > 0)
|
|
{
|
|
//取第一个选中的夹点
|
|
int iIdx = indices.first();
|
|
TDb::Position ePos = ExplainGripIndex(iIdx);
|
|
AcGeMatrix3d xform;
|
|
xform.setToTranslation(offset);
|
|
|
|
switch (ePos)
|
|
{
|
|
// 实体移动夹点
|
|
case TDb::eMid:
|
|
{
|
|
transformBy(xform);
|
|
AcGePoint3d ptBase = AcGePoint3d::kOrigin;
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid())
|
|
{
|
|
if (TAuxTools::IsEquipAutoMove(this, offset))
|
|
{
|
|
// 写入接口更改消息
|
|
TInterfaceModifyMsg iMsg;
|
|
iMsg.SetMsgPoint(ptBase);//new pos
|
|
iMsg.SetGripPosition(TDb::eMid);
|
|
iMsg.SetMoveGripOffset(offset);
|
|
iMsg.SetMsgValidate(TRUE);
|
|
iMsg.SetInterfaceOper(TDb::eMoveGripPoint);
|
|
iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
|
|
TDbInterfaceMsgWrite msgWrite;
|
|
msgWrite.WriteInterfaceMsg(iMsg);
|
|
}
|
|
|
|
//更新接口记录接口信息
|
|
UpdateInterfaceRec(m_pOwnerEnt->objectId(),xform);
|
|
}
|
|
|
|
break;
|
|
}
|
|
// 文字移动夹点
|
|
case TDb::eStart:
|
|
{
|
|
AcGePoint3d ptTextBase = AcGePoint3d::kOrigin;
|
|
m_pXDataMap->GetAt(HAHG_TextPoint, ptTextBase);
|
|
ptTextBase.transformBy(xform);
|
|
m_pXDataMap->SetAt(HAHG_TextPoint, ptTextBase);
|
|
|
|
break;
|
|
}
|
|
// 接口夹点
|
|
case TDb::eCommand0:
|
|
{
|
|
CString sCmd;
|
|
int iType = -1;
|
|
// BOOL bHasText = FALSE; // 目前文字放到了外面
|
|
// m_pXDataMap->GetAt(HAHG_HasText, bHasText);
|
|
//
|
|
// int iSt = 1;
|
|
// if (bHasText)
|
|
// iSt = 2;
|
|
|
|
int iSt = 2;
|
|
iType = GetCmdType(iIdx - iSt);
|
|
|
|
AcGePoint3d ptCom = AcGePoint3d::kOrigin;
|
|
if (!GetIFPoint(iIdx - iSt, ptCom))
|
|
return Acad::eNotApplicable;
|
|
|
|
switch (iType)
|
|
{
|
|
case 0:
|
|
GetGlobalContext()->GetAt(KEY_HVACCOLDGRIPCMD, sCmd);
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
GetGlobalContext()->GetAt(KEY_HVACGRIPCMD, sCmd);
|
|
break;
|
|
case 3:
|
|
GetGlobalContext()->GetAt(KEY_HVACHEATGRIPCMD, sCmd);
|
|
break;
|
|
case 4:
|
|
GetGlobalContext()->GetAt(KEY_HVACMEDIAGRIPCMD, sCmd);
|
|
break;
|
|
case 5:
|
|
GetGlobalContext()->GetAt(KEY_HVACFJSQGRIPCMD, sCmd);
|
|
break;
|
|
}
|
|
|
|
if (sCmd.IsEmpty())
|
|
return Acad::eNotApplicable;
|
|
|
|
TInterfaceModifyMsg iMsg;
|
|
iMsg.SetMsgPoint(ptCom);
|
|
iMsg.SetGripPosition(ePos);
|
|
iMsg.SetMoveGripOffset(offset);
|
|
iMsg.SetMsgValidate(TRUE);
|
|
iMsg.SetInterfaceOper(TDb::eNewCommand);
|
|
iMsg.SetPreviewObjToCreate(TDb::eAirHanding, 0);
|
|
|
|
AcDbSoftPointerId idOwner;
|
|
m_pXDataMap->GetAt(KEY_THISID, idOwner);
|
|
iMsg.SetMsgOperateOn(idOwner);
|
|
TDbInterfaceMsgWrite msgWrite;
|
|
msgWrite.WriteInterfaceMsg(iMsg);
|
|
|
|
acedPostCommand(_T("\33"));
|
|
acedPostCommand(sCmd + _T("\n"));
|
|
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
int THImpHvacEGroup::GetCmdType(int iIdx) const
|
|
{
|
|
// 得到对应的子箱体索引
|
|
int iCmd = -1;
|
|
|
|
// 得到子箱体中对应索引的接口命令类型
|
|
TDbXDataMap xIFData;
|
|
if (m_pXDataMap->GetAt(HAHG_InterfaceData, iIdx, xIFData))
|
|
xIFData.GetAt(HEQUIF_Type, iCmd);
|
|
|
|
return iCmd;
|
|
}
|
|
|
|
int THImpHvacEGroup::ConvertToEquIndex(int &iIdx) const
|
|
{
|
|
// 转换机组接口索引为:子箱体接口索引,子箱体索引
|
|
int iSegNum(0);
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iSegNum);
|
|
|
|
iIdx = iIdx + 1;
|
|
for (int i = 0; i < iSegNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
int iTmp = 0;
|
|
xSegMap.GetAt(HEQU_InterfaceNum, iTmp);
|
|
|
|
if (iIdx > iTmp)
|
|
iIdx -= iTmp;
|
|
else
|
|
{
|
|
iIdx -= 1;
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::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;
|
|
}
|
|
|
|
// 获取各点位置
|
|
int nIndex(-1);
|
|
if(GetIFIndexFormPt(nIndex,ptConnect))
|
|
{
|
|
CString sID;
|
|
sID.Format(_T("%s%d"), KEY_IDCNT_, nIndex);
|
|
|
|
// 基类指针
|
|
TDbInterfacesObj* pInterfaceObj = TDbInterfacesObj::cast(pEnt);
|
|
ASSERT(NULL != pInterfaceObj);
|
|
m_pXDataMap->SetAt(sID, idConnect);
|
|
pEnt->close();
|
|
return TRUE;
|
|
}
|
|
|
|
pEnt->close();
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::RemoveInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect)
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
AcDbObjectId id;
|
|
int nIndex(-1);
|
|
if(GetIFIndexFormPt(nIndex,ptConnect))
|
|
{
|
|
CString sID;
|
|
sID.Format(_T("%s%d"),KEY_IDCNT_, nIndex);
|
|
m_pXDataMap->SetAt(sID, AcDbObjectId::kNull);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::GetIFPoint(int iIdx, AcGePoint3d &pt) const
|
|
{
|
|
// 得到索引对应的接口的位置点
|
|
TDbXDataMap xIFData;
|
|
if (m_pXDataMap->GetAt(HAHG_InterfaceData, iIdx, xIFData))
|
|
{
|
|
xIFData.GetAt(HEQUIF_Point, pt);
|
|
return TRUE;
|
|
}
|
|
|
|
pt = AcGePoint3d::kOrigin;
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::GetInterface(int nIndex,TInterface& pipeInterface) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
TDbXDataMap xIFData;
|
|
if (m_pXDataMap->GetAt(HAHG_InterfaceData, nIndex, xIFData))
|
|
{
|
|
AcGePoint3d pt;
|
|
AcGeVector3d vt;
|
|
CString sName;
|
|
double dw,dt;
|
|
AcDbObjectId id;
|
|
// TDbXDataMap xIFData;
|
|
|
|
xIFData.GetAt(HEQUIF_Point, pt);
|
|
xIFData.GetAt(HEQUIF_Vector, vt);
|
|
xIFData.GetAt(HEQUIF_Name, sName);
|
|
xIFData.GetAt(HEQUIF_Width, dw);
|
|
xIFData.GetAt(HEQUIF_Height, dt);
|
|
|
|
CString sID;
|
|
sID.Format(_T("%s%d"), KEY_IDCNT_, nIndex);
|
|
if (m_pXDataMap->GetAt(sID, id) && MakesureInterfaceValidate(id, pt, vt, pipeInterface))
|
|
return TRUE;
|
|
|
|
pipeInterface.SetSize(dw,dt);
|
|
pipeInterface.SetOutDir(vt);
|
|
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
|
|
pipeInterface.SetPosition(pt);
|
|
pipeInterface.SetDescr(sName);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::GetIFIndexFormPt(int &nIndex, const AcGePoint3d &pt) const
|
|
{
|
|
int iIFNum = GetInterfaceCount();
|
|
for (int i = 0; i < iIFNum; i++)
|
|
{
|
|
TDbXDataMap xIFData;
|
|
if (m_pXDataMap->GetAt(HAHG_InterfaceData, i, xIFData))
|
|
{
|
|
AcGePoint3d ptPos;
|
|
xIFData.GetAt(HEQUIF_Point, ptPos);
|
|
if (pt.isEqualTo(ptPos, g_globalTol))
|
|
{
|
|
nIndex = i;
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::GetInterface(const AcGePoint3d& ptCon,TInterface& pipeInterface) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
int nIndex(-1);
|
|
if(GetIFIndexFormPt(nIndex,ptCon))
|
|
return GetInterface(nIndex,pipeInterface);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::GetInterFaceLocal(int nIndex, AcGeVector3d &vt) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
TDbXDataMap xdatamap;
|
|
if(m_pXDataMap->GetAt(HAHG_InterfaceData, nIndex, xdatamap))
|
|
return xdatamap.GetAt(HEQUIF_Vector, vt);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::HasInterface(const AcGePoint3d& ptCon,const AcGeVector3d& vtDir)
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
// 获取各点位置
|
|
int nIndex(-1);
|
|
AcGeVector3d vtIf;
|
|
if(GetIFIndexFormPt(nIndex,ptCon))
|
|
{
|
|
GetInterFaceLocal(nIndex,vtIf);
|
|
return (vtDir.isParallelTo(vtIf));
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
int THImpHvacEGroup::GetInterfaceCount() const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return 0;
|
|
|
|
int iIfNum(0);
|
|
m_pXDataMap->GetAt(HAHG_InterfaceNum, iIfNum);
|
|
// int iSegNum(0);
|
|
// m_pXDataMap->GetAt(HAHG_SegmentsNum, iSegNum);
|
|
//
|
|
// for (int i = 0; i < iSegNum; i++)
|
|
// {
|
|
// TDbXDataMap xSegMap;
|
|
// if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
// {
|
|
// int iTmp(0);
|
|
// xSegMap.GetAt(HEQU_InterfaceNum, iTmp);
|
|
// iIfNum += iTmp;
|
|
// }
|
|
// }
|
|
|
|
return iIfNum;
|
|
}
|
|
|
|
void THImpHvacEGroup::GetKindName(CString& sName)
|
|
{
|
|
sName = _T("ATS_DBHEQUIPMENT");
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacEGroup::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 ptCenter;
|
|
m_pXDataMap->GetAt(HEQU_CenterPoint, ptCenter);
|
|
AcGePoint3dArray arpts;
|
|
|
|
// 根据捕捉模式处理
|
|
switch(osnapMode)
|
|
{
|
|
case AcDb::kOsModeEnd:
|
|
GetConerOsnapPt(arpts);
|
|
snapPoints.append(arpts);
|
|
break;
|
|
case AcDb::kOsModeMid:
|
|
snapPoints.append(ptCenter);
|
|
break;
|
|
case AcDb::kOsModeCen:
|
|
break;
|
|
case AcDb::kOsModePerp:
|
|
break;
|
|
case AcDb::kOsModeNear:
|
|
break;
|
|
}
|
|
// add by hh 2011-07-12 支持任意位置捕捉
|
|
TImpSpecEquipment::getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint,
|
|
viewXform, snapPoints, geomIds);
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacEGroup::getGripPoints(AcGePoint3dArray& gripPoints,
|
|
AcDbIntArray& osnapModes,
|
|
AcDbIntArray& geomIds) const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap && NULL != m_pHvacEquipment);
|
|
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
BOOL bHasPlanform = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_Planform, bHasPlanform);
|
|
AcGeVector3d vtRot;
|
|
m_pXDataMap->GetAt(HAHG_RotDir, vtRot);
|
|
AcGePoint3d ptBase;
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
|
|
// 机组移动夹点
|
|
gripPoints.append(ptBase);
|
|
|
|
GetOtherCtrlGrip(gripPoints);
|
|
|
|
// BOOL bHasText = FALSE;
|
|
// m_pXDataMap->GetAt(HAHG_HasText, bHasText);
|
|
// if (bHasText)
|
|
// {
|
|
// AcGePoint3d ptTextBase;
|
|
// m_pXDataMap->GetAt(HAHG_TextPoint, ptTextBase);
|
|
//
|
|
// // 模板文字移动夹点
|
|
// gripPoints.append(ptTextBase);
|
|
// }
|
|
|
|
if (!bHasPlanform)
|
|
return Acad::eOk;
|
|
|
|
// 接口夹点
|
|
int iIFCount = GetInterfaceCount();
|
|
for (int i = 0; i < iIFCount; i++)
|
|
{
|
|
TDbXDataMap xIfData;
|
|
if (m_pXDataMap->GetAt(HAHG_InterfaceData, i, xIfData))
|
|
{
|
|
AcGePoint3d ptPos;
|
|
xIfData.GetAt(HEQUIF_Point, ptPos);
|
|
gripPoints.append(ptPos);
|
|
}
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacEGroup::getClassID(CLSID* pClsid) const
|
|
{
|
|
// #if (ADS < 16)
|
|
// // {C7DFDF6A-A5F2-4add-ADCC-7AC0675AB6E8}
|
|
// CLSID CLSID_PipeBaseEntity = {0xC7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE8 }};
|
|
// #endif
|
|
//
|
|
// #if (ADS == 16)
|
|
// // {C7DFDF6A-A5F2-4add-ADCC-7AC0675AB6E9}
|
|
// CLSID CLSID_PipeBaseEntity = {0xC7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE9 }};
|
|
// #endif
|
|
//
|
|
// #if (ADS == 17)
|
|
// // {C7DFDF6A-A5F2-4add-ADCC-7AC0675AB6EA}
|
|
// CLSID CLSID_PipeBaseEntity = {0xC7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xEA }};
|
|
// #endif
|
|
//
|
|
// #if (ADS == 18)
|
|
// CLSID CLSID_PipeBaseEntity = {0xD7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xEB }};
|
|
// #endif
|
|
//
|
|
// #if (ADS == 19)
|
|
// CLSID CLSID_PipeBaseEntity = {0xD7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xEB }};
|
|
// #endif
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
int THImpHvacEGroup::GetXBaseShell(TXShell& xShell)
|
|
{
|
|
int nRet = 0;
|
|
if (NULL == m_pXDataMap)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int iSegNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iSegNum);
|
|
if (iSegNum <= 0)
|
|
{
|
|
return 0;
|
|
}
|
|
int iInflexion = 0;
|
|
m_pXDataMap->GetAt(HAHG_Inflexion, iInflexion);
|
|
if (iInflexion > -1 && iSegNum - 1 > iInflexion)
|
|
{
|
|
// 构造下部碰撞体
|
|
AcGeVector3d vtNormal;
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
|
|
vtNormal.normalize();
|
|
AcGeVector3d vtMain;
|
|
m_pXDataMap->GetAt(HAHG_MainDir, vtMain);
|
|
vtMain.normalize();
|
|
AcGeVector3d vtSide = vtMain;
|
|
vtSide.rotateBy(PI / 2.0, vtNormal);
|
|
vtSide.normalize();
|
|
TDbXDataMap mapSeg;
|
|
double dTmpLen = 0.0, dTmpWid = 0.0, dTmpThi = 0.0;
|
|
double dLength = 0.0, dWidth = 0.0, dThick = 0.0;
|
|
for (int i = 0; i <= iInflexion; ++i)
|
|
{
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, i, mapSeg);
|
|
mapSeg.GetAt(HEQU_Length, dTmpLen);
|
|
dLength += dTmpLen;
|
|
mapSeg.GetAt(HEQU_Width, dTmpWid);
|
|
if (dTmpWid > dWidth)
|
|
{
|
|
dWidth = dTmpWid;
|
|
}
|
|
mapSeg.GetAt(HEQU_Thick, dTmpThi);
|
|
if (dTmpThi > dThick)
|
|
{
|
|
dThick = dTmpThi;
|
|
}
|
|
}
|
|
dLength *= 1000.0;
|
|
dWidth *= 1000.0;
|
|
dThick *= 1000.0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, 0, mapSeg);
|
|
AcGePoint3d ptStart;
|
|
mapSeg.GetAt(HEQU_CenterPoint, ptStart);
|
|
double dThick0 = 0.0;
|
|
mapSeg.GetAt(HEQU_Thick, dThick0);
|
|
dThick0 *= 1000.0;
|
|
ptStart += vtNormal * dThick / 2.0 -vtNormal * dThick0 / 2.0;
|
|
double dLength0 = 0.0;
|
|
mapSeg.GetAt(HEQU_Length, dLength0);
|
|
dLength0 *= 1000.0;
|
|
ptStart -= vtMain * dLength0 / 2.0;
|
|
AcGePoint3d ptEnd = ptStart + vtMain * dLength;
|
|
TAuxTools::BuildRectDuct(ptStart, ptEnd, vtNormal, dWidth, dThick, dWidth, dThick, xShell);
|
|
|
|
// 构造上部碰撞体
|
|
dLength = 0.0;
|
|
dWidth = 0.0;
|
|
dThick = 0.0;
|
|
for (int j = iInflexion + 1; j < iSegNum; ++j)
|
|
{
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, j, mapSeg);
|
|
mapSeg.GetAt(HEQU_Length, dTmpLen);
|
|
dLength += dTmpLen;
|
|
mapSeg.GetAt(HEQU_Width, dTmpWid);
|
|
if (dTmpWid > dWidth)
|
|
{
|
|
dWidth = dTmpWid;
|
|
}
|
|
mapSeg.GetAt(HEQU_Thick, dTmpThi);
|
|
if (dTmpThi > dThick)
|
|
{
|
|
dThick = dTmpThi;
|
|
}
|
|
}
|
|
dLength *= 1000.0;
|
|
dWidth *= 1000.0;
|
|
dThick *= 1000.0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, iInflexion + 1, mapSeg);
|
|
mapSeg.GetAt(HEQU_CenterPoint, ptStart);
|
|
mapSeg.GetAt(HEQU_Thick, dThick0);
|
|
dThick0 *= 1000.0;
|
|
ptStart += vtNormal * dThick / 2.0 -vtNormal * dThick0 / 2.0;
|
|
mapSeg.GetAt(HEQU_Length, dLength0);
|
|
dLength0 *= 1000.0;
|
|
ptStart += vtMain * dLength0 / 2.0;
|
|
ptEnd = ptStart - vtMain * dLength;
|
|
TAuxTools::BuildRectDuct(ptStart, ptEnd, vtNormal, dWidth, dThick, dWidth, dThick, xShell);
|
|
|
|
nRet = 1;
|
|
}
|
|
else
|
|
{
|
|
// 计算参数
|
|
AcGeVector3d vtNormal;
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
|
|
vtNormal.normalize();
|
|
AcGeVector3d vtMain;
|
|
m_pXDataMap->GetAt(HAHG_MainDir, vtMain);
|
|
vtMain.normalize();
|
|
AcGeVector3d vtSide = vtMain;
|
|
vtSide.rotateBy(PI / 2.0, vtNormal);
|
|
vtSide.normalize();
|
|
TDbXDataMap mapSeg;
|
|
double dTmpLen = 0.0, dTmpWid = 0.0, dTmpThi = 0.0;
|
|
double dLength = 0.0, dWidth = 0.0, dThick = 0.0;
|
|
for (int i = 0; i < iSegNum; ++i)
|
|
{
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, i, mapSeg);
|
|
mapSeg.GetAt(HEQU_Length, dTmpLen);
|
|
dLength += dTmpLen;
|
|
mapSeg.GetAt(HEQU_Width, dTmpWid);
|
|
if (dTmpWid > dWidth)
|
|
{
|
|
dWidth = dTmpWid;
|
|
}
|
|
mapSeg.GetAt(HEQU_Thick, dTmpThi);
|
|
if (dTmpThi > dThick)
|
|
{
|
|
dThick = dTmpThi;
|
|
}
|
|
}
|
|
dLength *= 1000.0;
|
|
dWidth *= 1000.0;
|
|
dThick *= 1000.0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, 0, mapSeg);
|
|
AcGePoint3d ptStart;
|
|
mapSeg.GetAt(HEQU_CenterPoint, ptStart);
|
|
double dThick0 = 0.0;
|
|
mapSeg.GetAt(HEQU_Thick, dThick0);
|
|
dThick0 *= 1000.0;
|
|
ptStart += vtNormal * dThick / 2.0 -vtNormal * dThick0 / 2.0;
|
|
double dLength0 = 0.0;
|
|
mapSeg.GetAt(HEQU_Length, dLength0);
|
|
dLength0 *= 1000.0;
|
|
ptStart -= vtMain * dLength0 / 2.0;
|
|
AcGePoint3d ptEnd = ptStart + vtMain * dLength;
|
|
|
|
// 构造碰撞实体
|
|
TAuxTools::BuildRectDuct(ptStart, ptEnd, vtNormal, dWidth, dThick, dWidth, dThick, xShell);
|
|
|
|
nRet = 1;
|
|
}
|
|
|
|
return nRet;
|
|
}
|
|
|
|
|
|
BOOL THImpHvacEGroup::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;
|
|
default:
|
|
return bMsgTranslate;
|
|
}
|
|
|
|
// 记录修改标识
|
|
if (m_pOwnerEnt != NULL)
|
|
m_pOwnerEnt->recordGraphicsModified();
|
|
|
|
return bMsgTranslate;
|
|
}
|
|
|
|
BOOL THImpHvacEGroup::OnMoveGripPointMsgNotify( const TInterfaceModifyMsg& iModiMsg,
|
|
TInterfaceModifyMsgs& iModiMsgs )
|
|
{
|
|
if (!TAuxTools::IsAutoWorkOffset())
|
|
return FALSE;
|
|
|
|
ASSERT(NULL != m_pXDataMap);
|
|
|
|
AcDbObjectId id = iModiMsg.GetMsgOperateOn();
|
|
AcDbObjectId idOwner = m_pOwnerEnt->objectId();
|
|
if (id != idOwner) // 消息发送目标正确
|
|
return FALSE;
|
|
|
|
AcGeVector3d vtOffset = iModiMsg.GetMoveGripOffset();
|
|
if (vtOffset.isZeroLength())
|
|
return FALSE;
|
|
|
|
BOOL bMsgTranslate = FALSE;
|
|
|
|
int nPos = iModiMsg.GetGripPosition();
|
|
if (nPos == eStart || nPos == eMid || nPos == eEnd || nPos == eBr1 || nPos == eBr2)
|
|
{
|
|
// 设备接口消息传递
|
|
TInterface tIf;
|
|
AcDbObjectId idT(AcDbObjectId::kNull);
|
|
AcGePoint3d ptIf;
|
|
AcGeVector3d vtIf;
|
|
int i(0);
|
|
for (i = 0; i < GetInterfaceCount(); i++)
|
|
{
|
|
tIf.Reset();
|
|
if (!GetInterface(i, tIf))
|
|
continue;
|
|
|
|
ptIf = tIf.GetPosition();
|
|
vtIf = tIf.GetOutDir();
|
|
if (FindConnect(ptIf, vtIf, idOwner, idT))
|
|
{
|
|
if (vtOffset.isParallelTo(vtIf) || vtOffset.isPerpendicularTo(vtIf))
|
|
{
|
|
TInterfaceModifyMsg msg;
|
|
msg.SetMsgPoint(ptIf);
|
|
msg.SetMoveGripOffset(vtOffset);
|
|
msg.SetMsgOperateOn(idT);
|
|
msg.SetGripPosition(eStart);
|
|
iModiMsgs.append(msg);
|
|
bMsgTranslate = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
AcGeMatrix3d xform;
|
|
xform.setTranslation(vtOffset);
|
|
|
|
int iNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iNum);
|
|
|
|
// 箱体部分
|
|
for (i = 0; i < iNum; i++)
|
|
{
|
|
TDbXDataMap xSegMap;
|
|
if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
{
|
|
AcGePoint3d ptCenter;
|
|
xSegMap.GetAt(HEQU_CenterPoint, ptCenter);
|
|
|
|
ptCenter.transformBy(xform);
|
|
xSegMap.SetAt(HEQU_CenterPoint, ptCenter);
|
|
m_pXDataMap->SetAt(HAHG_SegmentData, i, xSegMap);
|
|
}
|
|
}
|
|
|
|
// 接口数据
|
|
AcGePoint3d ptBase = AcGePoint3d::kOrigin;
|
|
int iIFCount = GetInterfaceCount();
|
|
for (i = 0; i < iIFCount; i++)
|
|
{
|
|
TDbXDataMap xIFData;
|
|
if (m_pXDataMap->GetAt(HAHG_InterfaceData, i, xIFData))
|
|
{
|
|
xIFData.GetAt(HEQUIF_Point, ptBase);
|
|
ptBase.transformBy(xform);
|
|
xIFData.SetAt(HEQUIF_Point, ptBase);
|
|
|
|
m_pXDataMap->SetAt(HAHG_InterfaceData, i, xIFData);
|
|
}
|
|
}
|
|
|
|
// 基点
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
ptBase.transformBy(xform);
|
|
m_pXDataMap->SetAt(HAHG_BasePoint, ptBase);
|
|
|
|
// 文字基点
|
|
m_pXDataMap->GetAt(HAHG_TextPoint, ptBase);
|
|
ptBase.transformBy(xform);
|
|
m_pXDataMap->SetAt(HAHG_TextPoint, ptBase);
|
|
|
|
|
|
// 更新模型空间的扩展字典的注册的接口数据
|
|
UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform);
|
|
}
|
|
|
|
return bMsgTranslate;
|
|
}
|
|
|
|
int THImpHvacEGroup::GetBodyBox( AcDbExtents& ext ) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// 获得参数
|
|
int iSegNum = 0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, iSegNum);
|
|
if (iSegNum <= 0)
|
|
{
|
|
return 0;
|
|
}
|
|
int iInflexion = 0;
|
|
m_pXDataMap->GetAt(HAHG_Inflexion, iInflexion);
|
|
if (iInflexion > -1 && iSegNum - 1 > iInflexion)
|
|
{
|
|
// 计算参数
|
|
AcGeVector3d vtNormal;
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
|
|
vtNormal.normalize();
|
|
AcGeVector3d vtMain;
|
|
m_pXDataMap->GetAt(HAHG_MainDir, vtMain);
|
|
vtMain.normalize();
|
|
AcGeVector3d vtSide = vtMain;
|
|
vtSide.rotateBy(PI / 2.0, vtNormal);
|
|
vtSide.normalize();
|
|
TDbXDataMap mapSeg;
|
|
double dTmpLen = 0.0, dTmpWid = 0.0, dTmpThi = 0.0;
|
|
double dLowLength = 0.0, dWidth = 0.0, dLowThick = 0.0;
|
|
for (int i = 0; i <= iInflexion; ++i)
|
|
{
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, i, mapSeg);
|
|
mapSeg.GetAt(HEQU_Length, dTmpLen);
|
|
dLowLength += dTmpLen;
|
|
mapSeg.GetAt(HEQU_Width, dTmpWid);
|
|
if (dTmpWid > dWidth)
|
|
{
|
|
dWidth = dTmpWid;
|
|
}
|
|
mapSeg.GetAt(HEQU_Thick, dTmpThi);
|
|
if (dTmpThi > dLowThick)
|
|
{
|
|
dLowThick = dTmpThi;
|
|
}
|
|
}
|
|
double dHiLength = 0.0, dHiThick = 0.0;
|
|
for (int j = iInflexion + 1; j < iSegNum; ++j)
|
|
{
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, j, mapSeg);
|
|
mapSeg.GetAt(HEQU_Length, dTmpLen);
|
|
dHiLength += dTmpLen;
|
|
mapSeg.GetAt(HEQU_Width, dTmpWid);
|
|
if (dTmpWid > dWidth)
|
|
{
|
|
dWidth = dTmpWid;
|
|
}
|
|
mapSeg.GetAt(HEQU_Thick, dTmpThi);
|
|
if (dTmpThi > dHiThick)
|
|
{
|
|
dHiThick = dTmpThi;
|
|
}
|
|
}
|
|
double dLength = max(dLowLength, dHiLength);
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, iInflexion, mapSeg);
|
|
double dInflexionThick = 0.0;
|
|
mapSeg.GetAt(HEQU_Thick, dInflexionThick);
|
|
double dThick = max(dLowThick, dHiThick + dInflexionThick);
|
|
dLength *= 1000.0;
|
|
dWidth *= 1000.0;
|
|
dThick *= 1000.0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, 0, mapSeg);
|
|
AcGePoint3d ptStart;
|
|
mapSeg.GetAt(HEQU_CenterPoint, ptStart);
|
|
double dThick0 = 0.0;
|
|
mapSeg.GetAt(HEQU_Thick, dThick0);
|
|
dThick0 *= 1000.0;
|
|
ptStart += vtNormal * dThick / 2.0 -vtNormal * dThick0 / 2.0;
|
|
double dLength0 = 0.0;
|
|
mapSeg.GetAt(HEQU_Length, dLength0);
|
|
dLength0 *= 1000.0;
|
|
ptStart -= vtMain * dLength0 / 2.0;
|
|
AcGePoint3d ptEnd = ptStart + vtMain * dLength;
|
|
double dHalfWidth = dWidth / 2.0;
|
|
double dHalfThick = dThick / 2.0;
|
|
|
|
// 计算端点
|
|
AcGePoint3dArray arpt;
|
|
arpt.append(ptStart + vtSide * dHalfWidth + vtNormal * dHalfThick);
|
|
arpt.append(ptStart + vtSide * dHalfWidth - vtNormal * dHalfThick);
|
|
arpt.append(ptStart - vtSide * dHalfWidth - vtNormal * dHalfThick);
|
|
arpt.append(ptStart - vtSide * dHalfWidth + vtNormal * dHalfThick);
|
|
arpt.append(ptEnd + vtSide * dHalfWidth + vtNormal * dHalfThick);
|
|
arpt.append(ptEnd + vtSide * dHalfWidth - vtNormal * dHalfThick);
|
|
arpt.append(ptEnd - vtSide * dHalfWidth - vtNormal * dHalfThick);
|
|
arpt.append(ptEnd - vtSide * dHalfWidth + vtNormal * dHalfThick);
|
|
|
|
// 构造最小包含体
|
|
TAuxTools::BuildMinRectangle(arpt, ext);
|
|
}
|
|
else
|
|
{
|
|
// 计算参数
|
|
AcGeVector3d vtNormal;
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
|
|
vtNormal.normalize();
|
|
AcGeVector3d vtMain;
|
|
m_pXDataMap->GetAt(HAHG_MainDir, vtMain);
|
|
vtMain.normalize();
|
|
AcGeVector3d vtSide = vtMain;
|
|
vtSide.rotateBy(PI / 2.0, vtNormal);
|
|
vtSide.normalize();
|
|
TDbXDataMap mapSeg;
|
|
double dTmpLen = 0.0, dTmpWid = 0.0, dTmpThi = 0.0;
|
|
double dLength = 0.0, dWidth = 0.0, dThick = 0.0;
|
|
for (int i = 0; i < iSegNum; ++i)
|
|
{
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, i, mapSeg);
|
|
mapSeg.GetAt(HEQU_Length, dTmpLen);
|
|
dLength += dTmpLen;
|
|
mapSeg.GetAt(HEQU_Width, dTmpWid);
|
|
if (dTmpWid > dWidth)
|
|
{
|
|
dWidth = dTmpWid;
|
|
}
|
|
mapSeg.GetAt(HEQU_Thick, dTmpThi);
|
|
if (dTmpThi > dThick)
|
|
{
|
|
dThick = dTmpThi;
|
|
}
|
|
}
|
|
dLength *= 1000.0;
|
|
dWidth *= 1000.0;
|
|
dThick *= 1000.0;
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, 0, mapSeg);
|
|
AcGePoint3d ptStart;
|
|
mapSeg.GetAt(HEQU_CenterPoint, ptStart);
|
|
double dThick0 = 0.0;
|
|
mapSeg.GetAt(HEQU_Thick, dThick0);
|
|
dThick0 *= 1000.0;
|
|
ptStart += vtNormal * dThick / 2.0 -vtNormal * dThick0 / 2.0;
|
|
double dLength0 = 0.0;
|
|
mapSeg.GetAt(HEQU_Length, dLength0);
|
|
dLength0 *= 1000.0;
|
|
ptStart -= vtMain * dLength0 / 2.0;
|
|
AcGePoint3d ptEnd = ptStart + vtMain * dLength;
|
|
double dHalfWidth = dWidth / 2.0;
|
|
double dHalfThick = dThick / 2.0;
|
|
|
|
// 计算端点
|
|
AcGePoint3dArray arpt;
|
|
arpt.append(ptStart + vtSide * dHalfWidth + vtNormal * dHalfThick);
|
|
arpt.append(ptStart + vtSide * dHalfWidth - vtNormal * dHalfThick);
|
|
arpt.append(ptStart - vtSide * dHalfWidth - vtNormal * dHalfThick);
|
|
arpt.append(ptStart - vtSide * dHalfWidth + vtNormal * dHalfThick);
|
|
arpt.append(ptEnd + vtSide * dHalfWidth + vtNormal * dHalfThick);
|
|
arpt.append(ptEnd + vtSide * dHalfWidth - vtNormal * dHalfThick);
|
|
arpt.append(ptEnd - vtSide * dHalfWidth - vtNormal * dHalfThick);
|
|
arpt.append(ptEnd - vtSide * dHalfWidth + vtNormal * dHalfThick);
|
|
|
|
// 构造最小包含体
|
|
TAuxTools::BuildMinRectangle(arpt, ext);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
// void THImpHvacEGroup::SetSubText( long i,CString sText )
|
|
// {
|
|
// int nNum = 0;
|
|
// m_pXDataMap->GetAt(HAHG_SegmentsNum, nNum);
|
|
// if (i < 0 || i > nNum)
|
|
// return;
|
|
//
|
|
// BOOL bHasText = FALSE;
|
|
// m_pXDataMap->GetAt(HAHG_HasText, bHasText);
|
|
// if (bHasText)
|
|
// {
|
|
// CString csTempText;
|
|
// m_pXDataMap->GetAt(HAHG_Text, csTempText);
|
|
// if (csTempText.IsEmpty())
|
|
// {
|
|
// bHasText = FALSE;
|
|
// }
|
|
// }
|
|
//
|
|
// BOOL bEditTemp(FALSE);
|
|
// if (i == nNum - 1 && bHasText) // 编辑模版文字
|
|
// {
|
|
// m_pXDataMap->SetAt(HAHG_Text, sText);
|
|
// }
|
|
// else
|
|
// {
|
|
// TDbXDataMap xSegMap;
|
|
// if (m_pXDataMap->GetAt(HAHG_SegmentData, i, xSegMap))
|
|
// {
|
|
// xSegMap.SetAt(HEQU_SEquipType, sText);
|
|
// m_pXDataMap->SetAt(HAHG_SegmentData, i, xSegMap)
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
void THImpHvacEGroup::GetOtherCtrlGrip(AcGePoint3dArray &arrPt ) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return;
|
|
|
|
AcGeVector3d vtMainDir;
|
|
BOOL bIsRightDir(FALSE);
|
|
m_pXDataMap->GetAt(HAHG_MainDir, vtMainDir);
|
|
m_pXDataMap->GetAt(HAHG_IsRight, bIsRightDir);
|
|
if (!bIsRightDir)
|
|
vtMainDir *= -1;
|
|
|
|
AcGePoint3d ptBase, ptRightDw;
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, ptBase);
|
|
double dLen = GetTotalLen() * 1000;
|
|
|
|
ptRightDw = ptBase + vtMainDir * dLen;
|
|
|
|
arrPt.append(ptRightDw);
|
|
}
|
|
|
|
// 导出XML
|
|
// CString THImpHvacEGroup::GetXml() const
|
|
// {
|
|
// if (NULL == m_pXDataMap || NULL == m_pOwnerEnt)
|
|
// return _T("");
|
|
//
|
|
// int nValue(0);
|
|
// double dValue(0.0);
|
|
// int nPtPreci = 6; // 位置精度
|
|
// int nWhPreci = 0; // 宽度、高度精度
|
|
// int nSegNum = 0; // 箱体段个数
|
|
//
|
|
// TXmlTree xmlTree;
|
|
// CString csText;
|
|
// CString csX, csY, csZ;
|
|
// AcGePoint3d pt;
|
|
// AcGeVector3d vt;
|
|
// AcDbObjectId id;
|
|
// POSITION posRoot = xmlTree.Insert(_T("ATS_DBHEQUIPMENT"), NULL, NULL);
|
|
// {
|
|
// xmlTree.SetAttribute(posRoot, _T("name"), _T("空气机组"));
|
|
// xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称"));
|
|
// }
|
|
//
|
|
// POSITION posItemEquipType = xmlTree.Insert(_T("EquipType"), posRoot, NULL);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemEquipType, _T("name"), _T("设备类型"));
|
|
// xmlTree.SetAttribute(posItemEquipType, _T("comment"), _T("设备类型"));
|
|
// csText = _T("空气机组");
|
|
// xmlTree.SetItemText(posItemEquipType, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemSegNum = xmlTree.Insert(_T("SegmentsNum"), posRoot, posItemEquipType);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemSegNum, _T("name"), _T("箱体段个数"));
|
|
// xmlTree.SetAttribute(posItemSegNum, _T("comment"), _T("箱体段个数"));
|
|
// m_pXDataMap->GetAt(HAHG_SegmentsNum, nValue);
|
|
// nSegNum = nValue; // 保存箱体段个数
|
|
// csText.Format(_T("%d"), nValue);
|
|
// xmlTree.SetItemText(posItemSegNum, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemInflex = xmlTree.Insert(_T("Inflexion"), posRoot, posItemSegNum);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemInflex, _T("name"), _T("拐点索引"));
|
|
// xmlTree.SetAttribute(posItemInflex, _T("comment"), _T("立式机组拐弯处的箱体段索引"));
|
|
// m_pXDataMap->GetAt(HAHG_Inflexion, nValue);
|
|
// csText.Format(_T("%d"), nValue);
|
|
// xmlTree.SetItemText(posItemInflex, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemPlanForm = xmlTree.Insert(_T("IsPlanForm"), posRoot, posItemInflex);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemPlanForm, _T("name"), _T("是否绘制俯视图"));
|
|
// xmlTree.SetAttribute(posItemPlanForm, _T("comment"), _T("俯视图有对应三维0:没有,1:有"));
|
|
// m_pXDataMap->GetAt(HAHG_Planform, nValue);
|
|
// csText.Format(_T("%d"), nValue);
|
|
// xmlTree.SetItemText(posItemPlanForm, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemBsPt = xmlTree.Insert(_T("BasePoint"), posRoot, posItemPlanForm);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemBsPt, _T("name"), _T("侧视图基点"));
|
|
// xmlTree.SetAttribute(posItemBsPt, _T("comment"), _T("侧视图基点"));
|
|
// m_pXDataMap->GetAt(HAHG_BasePoint, 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(posItemBsPt, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemHorz = xmlTree.Insert(_T("IsHorizontal"), posRoot, posItemBsPt);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemHorz, _T("name"), _T("是否卧式摆放"));
|
|
// xmlTree.SetAttribute(posItemHorz, _T("comment"), _T("组合方式0:否,1:是"));
|
|
// m_pXDataMap->GetAt(HAHG_IsHorizontal, nValue);
|
|
// csText.Format(_T("%d"), nValue);
|
|
// xmlTree.SetItemText(posItemHorz, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemPrvMode = xmlTree.Insert(_T("IsPreviewMode"), posRoot, posItemHorz);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemPrvMode, _T("name"), _T("是否预览模式"));
|
|
// xmlTree.SetAttribute(posItemPrvMode, _T("comment"), _T("预览模式按二维绘制图块0:否,1:是"));
|
|
// m_pXDataMap->GetAt(HAHG_IsPreviewing, nValue);
|
|
// csText.Format(_T("%d"), nValue);
|
|
// xmlTree.SetItemText(posItemPrvMode, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posItemPrvMode);
|
|
// {
|
|
// 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 posItemMainDir = xmlTree.Insert(_T("MainDir"), posRoot, posItemNorDir);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemMainDir, _T("name"), _T("主方向"));
|
|
// xmlTree.SetAttribute(posItemMainDir, _T("comment"), _T("设备默认的方向"));
|
|
// m_pXDataMap->GetAt(HAHG_MainDir, 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(posItemMainDir, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemRotDir = xmlTree.Insert(_T("RotDir"), posRoot, posItemPrvMode);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemRotDir, _T("name"), _T("旋转轴方向"));
|
|
// xmlTree.SetAttribute(posItemRotDir, _T("comment"), _T("旋转角度"));
|
|
// m_pXDataMap->GetAt(HAHG_RotDir, 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(posItemRotDir, csText);
|
|
// }
|
|
//
|
|
// POSITION posNext = posItemRotDir;
|
|
// for(int i = 0; i < nSegNum; i++)
|
|
// {
|
|
// TDbXDataMap mapSegment;
|
|
// m_pXDataMap->GetAt(HAHG_SegmentData, i, mapSegment);
|
|
//
|
|
// POSITION posSubItemSegName = xmlTree.Insert(_T("SegmentName"), posRoot, posNext);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemSegName, _T("name"), _T("箱体名称"));
|
|
// xmlTree.SetAttribute(posSubItemSegName, _T("comment"), _T("对应图库中的箱体段名称"));
|
|
// mapSegment.GetAt(HEQU_SEquipType, csText);
|
|
// xmlTree.SetItemText(posSubItemSegName, csText);
|
|
// }
|
|
//
|
|
// POSITION posSubItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posSubItemSegName);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemNorDir, _T("name"), _T("法向量"));
|
|
// mapSegment.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(posSubItemNorDir, csText);
|
|
// }
|
|
//
|
|
// POSITION posSubItemCentPt = xmlTree.Insert(_T("CenterPoint"), posRoot, posSubItemNorDir);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemCentPt, _T("name"), _T("中心点"));
|
|
// xmlTree.SetAttribute(posSubItemCentPt, _T("comment"), _T("布置点"));
|
|
// mapSegment.GetAt(HEQU_CenterPoint, 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(posSubItemCentPt, csText);
|
|
// }
|
|
//
|
|
// POSITION posSubItemMainDir = xmlTree.Insert(_T("MainDir"), posRoot, posSubItemCentPt);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemMainDir, _T("name"), _T("主矢量"));
|
|
// xmlTree.SetAttribute(posSubItemMainDir, _T("comment"), _T("布置角度"));
|
|
// mapSegment.GetAt(HEQU_MainDir, 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(posSubItemMainDir, csText);
|
|
// }
|
|
//
|
|
// CString sIDKey;
|
|
// sIDKey.Format(_T("%d"), i);
|
|
// POSITION posSubItemPart2D = xmlTree.Insert(_T("Part2D"), posRoot, posSubItemMainDir);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemPart2D, _T("name"), _T("2D块ID"));
|
|
// xmlTree.SetAttribute(posSubItemPart2D, _T("comment"), _T("平面图块"));
|
|
// m_pXDataMap->GetAt(sIDKey, id);
|
|
// csText.Format(_T("%d"), id.asOldId());
|
|
// xmlTree.SetItemText(posSubItemPart2D, csText);
|
|
// }
|
|
//
|
|
// POSITION posSubItemPart3D = xmlTree.Insert(_T("Part3D"), posRoot, posSubItemPart2D);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemPart3D, _T("name"), _T("3D块ID"));
|
|
// xmlTree.SetAttribute(posSubItemPart3D, _T("comment"), _T("三维图块"));
|
|
// //m_pXDataMap->GetAt(sIDKey, id);
|
|
// //csText.Format(_T("%d"), id.asOldId());
|
|
// xmlTree.SetItemText(posSubItemPart3D, csText);
|
|
// }
|
|
//
|
|
// POSITION posSubItemMirror = xmlTree.Insert(_T("IsMirror"), posRoot, posSubItemPart3D);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemMirror, _T("name"), _T("是否镜像"));
|
|
// xmlTree.SetAttribute(posSubItemMirror, _T("comment"), _T("用于辅助绘制0:否,1:是"));
|
|
// mapSegment.GetAt(HEQU_IsConverse, nValue);
|
|
// csText.Format(_T("%d"), nValue);
|
|
// xmlTree.SetItemText(posSubItemMirror, csText);
|
|
// }
|
|
//
|
|
// POSITION posSubItemLength = xmlTree.Insert(_T("Length"), posRoot, posSubItemMirror);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemLength, _T("name"), _T("长度"));
|
|
// xmlTree.SetAttribute(posSubItemLength, _T("comment"), _T("设备长度"));
|
|
// mapSegment.GetAt(HEQU_Length, dValue);
|
|
// TAuxTools::DoubleToString(dValue * 1000, nWhPreci, csText);
|
|
// xmlTree.SetItemText(posSubItemLength, csText);
|
|
// }
|
|
//
|
|
// POSITION posSubItemWidth = xmlTree.Insert(_T("Width"), posRoot, posSubItemLength);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemWidth, _T("name"), _T("宽度"));
|
|
// xmlTree.SetAttribute(posSubItemWidth, _T("comment"), _T("设备宽度"));
|
|
// mapSegment.GetAt(HEQU_Width, dValue);
|
|
// TAuxTools::DoubleToString(dValue * 1000, nWhPreci, csText);
|
|
// xmlTree.SetItemText(posSubItemWidth, csText);
|
|
// }
|
|
//
|
|
// POSITION posSubItemThick = xmlTree.Insert(_T("Thick"), posRoot, posSubItemWidth);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemThick, _T("name"), _T("厚度"));
|
|
// xmlTree.SetAttribute(posSubItemThick, _T("comment"), _T("设备高度"));
|
|
// mapSegment.GetAt(HEQU_Thick, dValue);
|
|
// TAuxTools::DoubleToString(dValue * 1000, nWhPreci, csText);
|
|
// xmlTree.SetItemText(posSubItemThick, csText);
|
|
// }
|
|
//
|
|
// POSITION posSubItemScale = xmlTree.Insert(_T("Scale"), posRoot, posSubItemThick);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemScale, _T("name"), _T("图块比例"));
|
|
// xmlTree.SetAttribute(posSubItemScale, _T("comment"), _T("图块比例"));
|
|
// mapSegment.GetAt(HEQU_Scale, 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(posSubItemScale, csText);
|
|
// }
|
|
// posNext = posSubItemScale;
|
|
// }
|
|
//
|
|
// CString csXml = xmlTree.GetXml();
|
|
//
|
|
// return csXml;
|
|
// }
|
|
|
|
CString THImpHvacEGroup::GetXml(const AcGeMatrix3d& mat) const
|
|
{
|
|
if (NULL == m_pXDataMap || NULL == m_pOwnerEnt)
|
|
return _T("");
|
|
|
|
int i(0);
|
|
int nValue(0);
|
|
double dValue(0.0);
|
|
int nPtPreci = 6; // 位置精度
|
|
int nWhPreci = 0; // 宽度、高度精度
|
|
int nSegNum = 0; // 箱体段个数
|
|
|
|
TXmlTree xmlTree;
|
|
CString csText;
|
|
CString csX, csY, csZ;
|
|
AcGePoint3d pt;
|
|
AcGeVector3d vt;
|
|
AcDbObjectId id;
|
|
|
|
// deleted by wc 13-12-30 运行下方代码会崩溃
|
|
//***************** begin ***************
|
|
// 获得设备转换矩阵Lixl add 2012-2-1
|
|
// 插入点
|
|
//XPoint ptLocation;
|
|
//m_pXDataMap->GetAt(HEQUIF_Point, pt);
|
|
//ptLocation = pt;
|
|
//// 主方向
|
|
//XVector3D vtDirection(0,0,1);
|
|
//m_pXDataMap->GetAt(HAHG_MainDir, vt);
|
|
//vtDirection = vt;
|
|
//// 图块比例
|
|
//m_pXDataMap->GetAt(HEQU_Scale, vt);
|
|
//AcGeScale3d scale3d(vt.x, vt.y, vt.z);
|
|
//XVector3D vtNormal(0,0,1);
|
|
////非水平面,计算法向
|
|
//if(fabs(vtDirection.z) > 1.0E-6)
|
|
//{
|
|
// vtNormal = XVector3D(1,0,0)*vtDirection;
|
|
// vtNormal.Normalize();
|
|
//}
|
|
////计算ECS下的转角
|
|
//XPoint ptLoc=Wcs2Ecs(ptLocation, vtNormal);
|
|
//double nRotEcs = ads_angle(XPoint(),vtDirection);
|
|
//m_pXDataMap->GetAt(HALT_Part3D, id);
|
|
//AcDbBlockReference block(ptLoc, id);
|
|
//block.setRotation(nRotEcs);
|
|
//block.setScaleFactors(scale3d);
|
|
//AcGeMatrix3d mat1 = block.blockTransform();
|
|
//mat1 *= mat;
|
|
//CString sMat;
|
|
//TAuxTools::Matrix3D2String(mat1, sMat);
|
|
//************* end *********************
|
|
|
|
POSITION posRoot = xmlTree.Insert(_T("ATS_DBHEQUIPMENT"), NULL, NULL);
|
|
{
|
|
xmlTree.SetAttribute(posRoot, _T("name"), _T("空气机组"));
|
|
xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称"));
|
|
}
|
|
|
|
POSITION posItemEquipType = xmlTree.Insert(_T("EquipType"), posRoot, NULL);
|
|
{
|
|
xmlTree.SetAttribute(posItemEquipType, _T("name"), _T("设备类型"));
|
|
xmlTree.SetAttribute(posItemEquipType, _T("comment"), _T("设备类型"));
|
|
csText = _T("空气机组");
|
|
xmlTree.SetItemText(posItemEquipType, csText);
|
|
}
|
|
|
|
POSITION posItemSegNum = xmlTree.Insert(_T("SegmentsNum"), posRoot, posItemEquipType);
|
|
{
|
|
xmlTree.SetAttribute(posItemSegNum, _T("name"), _T("箱体段个数"));
|
|
xmlTree.SetAttribute(posItemSegNum, _T("comment"), _T("箱体段个数"));
|
|
m_pXDataMap->GetAt(HAHG_SegmentsNum, nValue);
|
|
nSegNum = nValue; // 保存箱体段个数
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemSegNum, csText);
|
|
}
|
|
|
|
POSITION posItemInflex = xmlTree.Insert(_T("Inflexion"), posRoot, posItemSegNum);
|
|
{
|
|
xmlTree.SetAttribute(posItemInflex, _T("name"), _T("拐点索引"));
|
|
xmlTree.SetAttribute(posItemInflex, _T("comment"), _T("立式机组拐弯处的箱体段索引"));
|
|
m_pXDataMap->GetAt(HAHG_Inflexion, nValue);
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemInflex, csText);
|
|
}
|
|
|
|
POSITION posItemPlanForm = xmlTree.Insert(_T("IsPlanForm"), posRoot, posItemInflex);
|
|
{
|
|
xmlTree.SetAttribute(posItemPlanForm, _T("name"), _T("是否绘制俯视图"));
|
|
xmlTree.SetAttribute(posItemPlanForm, _T("comment"), _T("俯视图有对应三维0:没有,1:有"));
|
|
m_pXDataMap->GetAt(HAHG_Planform, nValue);
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemPlanForm, csText);
|
|
}
|
|
|
|
POSITION posItemBsPt = xmlTree.Insert(_T("BasePoint"), posRoot, posItemPlanForm);
|
|
{
|
|
xmlTree.SetAttribute(posItemBsPt, _T("name"), _T("侧视图基点"));
|
|
xmlTree.SetAttribute(posItemBsPt, _T("comment"), _T("侧视图基点"));
|
|
m_pXDataMap->GetAt(HAHG_BasePoint, 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(posItemBsPt, csText);
|
|
}
|
|
|
|
POSITION posItemHorz = xmlTree.Insert(_T("IsHorizontal"), posRoot, posItemBsPt);
|
|
{
|
|
xmlTree.SetAttribute(posItemHorz, _T("name"), _T("是否卧式摆放"));
|
|
xmlTree.SetAttribute(posItemHorz, _T("comment"), _T("组合方式0:否,1:是"));
|
|
m_pXDataMap->GetAt(HAHG_IsHorizontal, nValue);
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemHorz, csText);
|
|
}
|
|
|
|
POSITION posItemPrvMode = xmlTree.Insert(_T("IsPreviewMode"), posRoot, posItemHorz);
|
|
{
|
|
xmlTree.SetAttribute(posItemPrvMode, _T("name"), _T("是否预览模式"));
|
|
xmlTree.SetAttribute(posItemPrvMode, _T("comment"), _T("预览模式按二维绘制图块0:否,1:是"));
|
|
m_pXDataMap->GetAt(HAHG_IsPreviewing, nValue);
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemPrvMode, csText);
|
|
}
|
|
|
|
POSITION posItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posItemPrvMode);
|
|
{
|
|
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 posItemMainDir = xmlTree.Insert(_T("MainDir"), posRoot, posItemNorDir);
|
|
{
|
|
xmlTree.SetAttribute(posItemMainDir, _T("name"), _T("主方向"));
|
|
xmlTree.SetAttribute(posItemMainDir, _T("comment"), _T("设备默认的方向"));
|
|
m_pXDataMap->GetAt(HAHG_MainDir, 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(posItemMainDir, csText);
|
|
}
|
|
|
|
POSITION posItemRotDir = xmlTree.Insert(_T("RotDir"), posRoot, posItemPrvMode);
|
|
{
|
|
xmlTree.SetAttribute(posItemRotDir, _T("name"), _T("旋转轴方向"));
|
|
xmlTree.SetAttribute(posItemRotDir, _T("comment"), _T("旋转角度"));
|
|
m_pXDataMap->GetAt(HAHG_RotDir, 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(posItemRotDir, csText);
|
|
}
|
|
|
|
POSITION posNext = posItemRotDir;
|
|
for(i = 0; i < nSegNum; i++)
|
|
{
|
|
TDbXDataMap mapSegment;
|
|
m_pXDataMap->GetAt(HAHG_SegmentData, i, mapSegment);
|
|
|
|
// add by wc 13-12-27
|
|
// 将各箱体段设为posSubItemSegments的子节点
|
|
POSITION posSubItemSegments = xmlTree.Insert(_T("Segments"), posRoot, posNext);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemSegments, _T("name"), _T("箱体段"));
|
|
xmlTree.SetAttribute(posSubItemSegments, _T("comment"), _T("箱体段各参数"));
|
|
}
|
|
|
|
POSITION posSubItemSegName = xmlTree.Insert(_T("SegmentName"), posSubItemSegments, NULL);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemSegName, _T("name"), _T("箱体名称"));
|
|
xmlTree.SetAttribute(posSubItemSegName, _T("comment"), _T("对应图库中的箱体段名称"));
|
|
mapSegment.GetAt(HEQU_SEquipType, csText);
|
|
xmlTree.SetItemText(posSubItemSegName, csText);
|
|
}
|
|
|
|
POSITION posSubItemNorDir = xmlTree.Insert(_T("NormalDir"),posSubItemSegments, posSubItemSegName);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemNorDir, _T("name"), _T("法向量"));
|
|
mapSegment.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(posSubItemNorDir, csText);
|
|
}
|
|
|
|
POSITION posSubItemCentPt = xmlTree.Insert(_T("CenterPoint"), posSubItemSegments, posSubItemNorDir);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemCentPt, _T("name"), _T("中心点"));
|
|
xmlTree.SetAttribute(posSubItemCentPt, _T("comment"), _T("布置点"));
|
|
mapSegment.GetAt(HEQU_CenterPoint, 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(posSubItemCentPt, csText);
|
|
}
|
|
|
|
// mod by wc 13-12-30 将pt改为vt
|
|
POSITION posSubItemMainDir = xmlTree.Insert(_T("MainDir"), posSubItemSegments, posSubItemCentPt);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemMainDir, _T("name"), _T("主矢量"));
|
|
xmlTree.SetAttribute(posSubItemMainDir, _T("comment"), _T("布置角度"));
|
|
mapSegment.GetAt(HEQU_MainDir, 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(posSubItemMainDir, csText);
|
|
}
|
|
|
|
CString sIDKey;
|
|
sIDKey.Format(_T("%d"), i);
|
|
// begin mod by wc 13-12-27 将保存图块id改为保存图块名称。因为IsMirror另有参数,将IsMirror改为IsConverse
|
|
POSITION posSubItemBlk = xmlTree.Insert(_T("Block"), posSubItemSegments, posSubItemMainDir);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemBlk, _T("name"), _T("图块块名称"));
|
|
xmlTree.SetAttribute(posSubItemBlk, _T("comment"), _T("平面图块"));
|
|
if (!m_pXDataMap->GetAt(sIDKey, id))
|
|
csText.Empty();
|
|
else
|
|
csText = TAuxTools::GetBlkNameById(id);
|
|
xmlTree.SetItemText(posSubItemBlk, csText);
|
|
}
|
|
|
|
// deleted by wc 13-12-30 和上面的一样,显得多余
|
|
// POSITION posSubItemPart3D = xmlTree.Insert(_T("Part3D"), posSubItemSegments, posSubItemPart2D);
|
|
// {
|
|
// xmlTree.SetAttribute(posSubItemPart3D, _T("name"), _T("3D块名称"));
|
|
// xmlTree.SetAttribute(posSubItemPart3D, _T("comment"), _T("三维图块"));
|
|
// //m_pXDataMap->GetAt(sIDKey, id);
|
|
// //csText.Format(_T("%d"), id.asOldId());
|
|
// if (!m_pXDataMap->GetAt(sIDKey, id))
|
|
// csText.Empty();
|
|
// else
|
|
// csText = TAuxTools::GetBlkNameById(id);
|
|
// xmlTree.SetItemText(posSubItemPart3D, csText);
|
|
// }
|
|
|
|
POSITION posSubItemConverse = xmlTree.Insert(_T("IsConverse"), posSubItemSegments, posSubItemBlk);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemConverse, _T("name"), _T("是否镜像"));
|
|
xmlTree.SetAttribute(posSubItemConverse, _T("comment"), _T("用于辅助绘制0:否,1:是"));
|
|
mapSegment.GetAt(HEQU_IsConverse, nValue);
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posSubItemConverse, csText);
|
|
}
|
|
// end
|
|
|
|
POSITION posSubItemLength = xmlTree.Insert(_T("Length"), posSubItemSegments, posSubItemConverse);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemLength, _T("name"), _T("长度"));
|
|
xmlTree.SetAttribute(posSubItemLength, _T("comment"), _T("设备长度"));
|
|
mapSegment.GetAt(HEQU_Length, dValue);
|
|
TAuxTools::DoubleToString(dValue * 1000, nWhPreci, csText);
|
|
xmlTree.SetItemText(posSubItemLength, csText);
|
|
}
|
|
|
|
POSITION posSubItemWidth = xmlTree.Insert(_T("Width"), posSubItemSegments, posSubItemLength);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemWidth, _T("name"), _T("宽度"));
|
|
xmlTree.SetAttribute(posSubItemWidth, _T("comment"), _T("设备宽度"));
|
|
mapSegment.GetAt(HEQU_Width, dValue);
|
|
TAuxTools::DoubleToString(dValue * 1000, nWhPreci, csText);
|
|
xmlTree.SetItemText(posSubItemWidth, csText);
|
|
}
|
|
|
|
POSITION posSubItemThick = xmlTree.Insert(_T("Thick"), posSubItemSegments, posSubItemWidth);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemThick, _T("name"), _T("厚度"));
|
|
xmlTree.SetAttribute(posSubItemThick, _T("comment"), _T("设备高度"));
|
|
mapSegment.GetAt(HEQU_Thick, dValue);
|
|
TAuxTools::DoubleToString(dValue * 1000, nWhPreci, csText);
|
|
xmlTree.SetItemText(posSubItemThick, csText);
|
|
}
|
|
|
|
POSITION posSubItemScale = xmlTree.Insert(_T("Scale"), posSubItemSegments, posSubItemThick);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemScale, _T("name"), _T("图块比例"));
|
|
xmlTree.SetAttribute(posSubItemScale, _T("comment"), _T("图块比例"));
|
|
mapSegment.GetAt(HEQU_Scale, 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(posSubItemScale, csText);
|
|
}
|
|
// POSITION posItemMat= xmlTree.Insert(_T("Matrix3d"), posRoot, posSubItemScale);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemMat, _T("name"), _T("矩阵"));
|
|
// xmlTree.SetAttribute(posItemMat, _T("comment"), _T("图块转换矩阵"));
|
|
// xmlTree.SetItemText(posItemMat, sMat);
|
|
// }
|
|
// 将各箱体段设为posSubItemSegments的子节点
|
|
posNext = posSubItemSegments;
|
|
}
|
|
|
|
// *************** begin *******************
|
|
// add by wc 13-12-30
|
|
// 添加接口信息
|
|
int iInterface = 0;
|
|
m_pXDataMap->GetAt(HAHG_InterfaceNum, iInterface);
|
|
for (i = 0; i < iInterface; i++)
|
|
{
|
|
TDbXDataMap mapInterface;
|
|
POSITION posSubItemInterface = xmlTree.Insert(_T("Segments"), posRoot, posNext);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemInterface, _T("name"), _T("接口"));
|
|
xmlTree.SetAttribute(posSubItemInterface, _T("comment"), _T("接口各参数"));
|
|
}
|
|
|
|
POSITION posSubItemIFNumber = xmlTree.Insert(_T("IFNumber"), posSubItemInterface, NULL);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemIFNumber, _T("name"), _T("序号"));
|
|
xmlTree.SetAttribute(posSubItemIFNumber, _T("comment"), _T("接口序号"));
|
|
mapInterface.GetAt(HEQUIF_Number, nValue);
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posSubItemIFNumber, csText);
|
|
}
|
|
|
|
POSITION posSubItemIFName = xmlTree.Insert(_T("IFName"), posSubItemInterface, posSubItemIFNumber);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemIFName, _T("name"), _T("名称"));
|
|
xmlTree.SetAttribute(posSubItemIFName, _T("comment"), _T("接口名称"));
|
|
mapInterface.GetAt(HEQUIF_Name, csText);
|
|
xmlTree.SetItemText(posSubItemIFName, csText);
|
|
}
|
|
|
|
POSITION posSubItemIFType = xmlTree.Insert(_T("IFType"), posSubItemInterface, posSubItemIFName);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemIFType, _T("name"), _T("类型"));
|
|
xmlTree.SetAttribute(posSubItemIFType, _T("comment"), _T("接口类型"));
|
|
mapInterface.GetAt(HEQUIF_Type, nValue);
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posSubItemIFType, csText);
|
|
}
|
|
|
|
POSITION posSubItemIFPoint = xmlTree.Insert(_T("IFPoint"), posSubItemInterface, posSubItemIFName);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemIFPoint, _T("name"), _T("位置"));
|
|
xmlTree.SetAttribute(posSubItemIFPoint, _T("comment"), _T("接口位置"));
|
|
mapInterface.GetAt(HEQUIF_Vector, 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(posSubItemIFPoint, csText);
|
|
}
|
|
|
|
POSITION posSubItemIFVector = xmlTree.Insert(_T("Scale"), posSubItemInterface, posSubItemIFPoint);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemIFVector, _T("name"), _T("方向"));
|
|
xmlTree.SetAttribute(posSubItemIFVector, _T("comment"), _T("接口方向"));
|
|
mapInterface.GetAt(HEQUIF_Vector, 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(posSubItemIFVector, csText);
|
|
}
|
|
|
|
POSITION posSubItemIFWidth = xmlTree.Insert(_T("Width"), posSubItemInterface, posSubItemIFVector);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemIFWidth, _T("name"), _T("宽度"));
|
|
xmlTree.SetAttribute(posSubItemIFWidth, _T("comment"), _T("设备宽度"));
|
|
mapInterface.GetAt(HEQU_Width, dValue);
|
|
TAuxTools::DoubleToString(dValue * 1000, nWhPreci, csText);
|
|
xmlTree.SetItemText(posSubItemIFWidth, csText);
|
|
}
|
|
|
|
POSITION posSubItemThick = xmlTree.Insert(_T("Thick"), posSubItemInterface, posSubItemIFWidth);
|
|
{
|
|
xmlTree.SetAttribute(posSubItemThick, _T("name"), _T("厚度"));
|
|
xmlTree.SetAttribute(posSubItemThick, _T("comment"), _T("设备高度"));
|
|
mapInterface.GetAt(HEQU_Thick, dValue);
|
|
TAuxTools::DoubleToString(dValue * 1000, nWhPreci, csText);
|
|
xmlTree.SetItemText(posSubItemThick, csText);
|
|
}
|
|
}
|
|
|
|
|
|
// *************** end *********************
|
|
|
|
CString csXml = xmlTree.GetXml();
|
|
|
|
return csXml;
|
|
}
|
|
|
|
void THImpHvacEGroup::GetConerOsnapPt( AcGePoint3dArray &arrPt ) const
|
|
{
|
|
AcDbExtents ext;
|
|
GetBodyBox(ext);
|
|
|
|
AcGePoint3d ptLeftUp, ptLeftDw, ptRightUp, ptRightDw;
|
|
ptLeftDw = ext.minPoint();
|
|
ptRightUp = ext.maxPoint();
|
|
AcGeVector3d vtUcsY = TAuxTools::GetUcsYvt();
|
|
AcGeVector3d vtUcsZ = TAuxTools::GetUcsZvt();
|
|
AcGeVector3d vtSub = (ptRightUp - ptLeftDw).orthoProject(vtUcsZ);
|
|
AcGeVector3d vtXSub = vtSub.orthoProject(vtUcsY);
|
|
|
|
ptRightDw = ptLeftDw + vtXSub;
|
|
ptLeftUp = ptRightUp - vtXSub;
|
|
arrPt.append(ptLeftDw);
|
|
arrPt.append(ptRightDw);
|
|
|
|
BOOL bHasPlanform = FALSE;
|
|
m_pXDataMap->GetAt(HAHG_Planform, bHasPlanform);
|
|
if (bHasPlanform) // 立面图时,GetBodyBox()有待完善,上面两个点不准
|
|
{
|
|
arrPt.append(ptRightUp);
|
|
arrPt.append(ptLeftUp);
|
|
}
|
|
} |