Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipebase/THImpHvacEGroup.cpp
T
2026-09-28 15:28:50 +08:00

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);
}
}