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

2122 lines
58 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "StdArx.h"
#include "THImpHvacAirlets.h"
#include "TDbInterfaceRecord.h"
#include "TDbXDataMap.h"
#include "TDbInterfaceMsgWrite.h"
#include "math.h"
#include "dbxutil.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
using namespace TDb;
THImpHvacAirlets::THImpHvacAirlets()
{
}
THImpHvacAirlets::~THImpHvacAirlets()
{
}
BOOL THImpHvacAirlets::GetInterfaceSizeData(int nIndex, TInterface& pipeInterface) const
{
ASSERT(NULL != m_pXDataMap);
// 获取截面类型
TDb::HvacSectType eSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
// 获取尺寸
double dWidth = 0.0, dThick = 0.0;
m_pXDataMap->GetAt(HALT_Width, dWidth);
m_pXDataMap->GetAt(HALT_Length, dThick);
dWidth = fabs(dWidth);
// 设置接口数据
pipeInterface.SetType(eSectType);
pipeInterface.SetSize(dWidth, dThick);
return TRUE;
}
BOOL THImpHvacAirlets::GetInterface(int nIndex,TInterface& pipeInterface) const
{
if (NULL == m_pXDataMap)
return FALSE;
// 获取各点位置
AcGePoint3d ptIf = GetIfPoint();
AcGeVector3d vtNor;
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
AcDbObjectId id;
switch(nIndex)
{
case 0:
// 如果起始接口和第一个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptIf, vtNor, pipeInterface))
{
GetInterfaceSizeData(0, pipeInterface);
return TRUE;
}
// 没有管件连接
pipeInterface.SetOutDir(vtNor);
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
pipeInterface.SetPosition(ptIf);
GetInterfaceSizeData(0, pipeInterface);
return TRUE;
}
return FALSE;
}
BOOL THImpHvacAirlets::GetInterface(const AcGePoint3d& ptCon,TInterface& pipeInterface) const
{
if (NULL == m_pXDataMap)
return FALSE;
// 获取各点位置
AcGePoint3d ptIf = GetIfPoint();
AcGeVector3d vtNor;
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
// 计算测试点到始末点的距离
double dDist1 = ptCon.distanceTo(ptIf);
AcDbObjectId id;
// 位于起始点
if (dDist1 < 1.e-3)
{
// 如果起始接口和第一个管件连接
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptIf, vtNor, pipeInterface))
{
GetInterfaceSizeData(0, pipeInterface);
return TRUE;
}
// 没有管件连接
pipeInterface.SetOutDir(vtNor);
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
pipeInterface.SetPosition(ptIf);
GetInterfaceSizeData(0, pipeInterface);
return TRUE;
}
return FALSE;
}
BOOL THImpHvacAirlets::HasInterface(const AcGePoint3d& ptCon,const AcGeVector3d& vtDir)
{
if (NULL == m_pXDataMap)
return FALSE;
// 获取各点位置
AcGePoint3d ptStart = GetIfPoint();
AcGeVector3d vtNor;
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
// 计算测试点到始末点的距离
double dDist1 = ptCon.distanceTo(ptStart);
// 位于起始点
if (dDist1 < 1.e-3)
return (vtDir.isParallelTo(vtNor));
return FALSE;
}
int THImpHvacAirlets::GetInterfaceCount() const
{
return 1;
}
BOOL THImpHvacAirlets::SetInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect)
{
if (NULL == m_pXDataMap)
return FALSE;
// 打开对象
AcDbEntity* pEnt;
if (Acad::eOk != acdbOpenObject(pEnt, idConnect, AcDb::kForRead))
return FALSE;
// 检查对象类型,是否是暖通管件
if (!(pEnt->isKindOf(TDbHvacDuct::desc()) || pEnt->isKindOf(TDbHvacFitting::desc())
|| pEnt->isKindOf(TDbHvacEquipment::desc())))
{
pEnt->close();
return FALSE;
}
// 获取各点位置
AcGePoint3d ptStart = GetIfPoint();
AcGeVector3d vtNor;
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
// 计算测试点到始末点的距离
double dDist1 = ptConnect.distanceTo(ptStart);
// 基类指针
TDbInterfacesObj* pInterfaceObj = TDbInterfacesObj::cast(pEnt);
ASSERT(NULL != pInterfaceObj);
// 位于起始点
if (dDist1 < 1.e-3 && pInterfaceObj->HasInterface(ptStart, vtNor))
{
m_pXDataMap->SetAt(KEY_IDCNT1, idConnect);
pEnt->close();
return TRUE;
}
pEnt->close();
return FALSE;
}
BOOL THImpHvacAirlets::RemoveInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect)
{
if (NULL == m_pXDataMap)
return FALSE;
// 浅层次删除; 命名字典中的关系,需要外面移除关系,只移除内部关系
AcDbObjectId id;
m_pXDataMap->GetAt(KEY_IDCNT1, id);
if (id == idConnect)
{
m_pXDataMap->SetAt(KEY_IDCNT1, AcDbObjectId::kNull);
return TRUE;
}
return FALSE;
}
BOOL THImpHvacAirlets::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 THImpHvacAirlets::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)
{
AcGePoint3d ptCenter;
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
ptCenter += vtOffset;
m_pXDataMap->SetAt(HALT_CenterPoint, ptCenter);
// 更新模型空间的扩展字典的注册的接口数据
AcGeMatrix3d xform;
xform.setToTranslation(vtOffset);
UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform);
}
return bMsgTranslate;
}
BOOL THImpHvacAirlets::MakeCurves(TComplexCurve& cplCurve) const
{
return TRUE;
}
BOOL THImpHvacAirlets::GetCurvesInSide(TComplexCurve& compCurve) const
{
return FALSE;
}
AcDbPolyline* THImpHvacAirlets::MakePolyCurve() const
{
//
// 1
// 1 ┃━━━━━┃ 3 /-------\
// ┃ ┃ / \
// ┃ 0 ┃ 3 | 0 | 4
// ┃ ┃ \ /
// 2 ┃━━━━━┃ 4 \_______/
// 2
//
// 获取各点位置
AcGePoint3d pt1, pt2, pt3, pt4, ptCenter;
AcGePoint3d ptU1, ptU2, ptU3, ptU4;
AcGeVector3d vtMain, vtNor, vtMainv;
double dLength(50.0), dThick(50.0), dWidth(50.0);
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
int nIsSide(0);
TDb::HvacSectType eSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType);
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
m_pXDataMap->GetAt(HEQU_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HEQU_MainDir, vtMain);
m_pXDataMap->GetAt(HEQU_Length, dLength);
m_pXDataMap->GetAt(HEQU_Width, dWidth);
m_pXDataMap->GetAt(HALT_IsSide, nIsSide);
m_pXDataMap->GetAt(HALT_Thick, dThick);
if (dLength < 1)
dLength = 1.0;
if (dWidth < 1)
dWidth = 1.0;
if (dThick < 1)
dThick = 1.0;
AcDbPolyline* pPolyLine = NULL;
//方口
if (eSectType == TDb::eRectangular)
{
AcGePoint3dArray arpts;
//侧风口标高在中心线上
if (nIsSide == 1)
{
vtMainv = vtNor;
vtMainv.rotateBy(PI * 0.5, vtMain);
vtNor.normalize();
vtMainv.normalize();
pt1 = ptCenter + vtMainv * dWidth * 0.5;
pt2 = ptCenter - vtMainv * dWidth * 0.5;
pt3 = pt1 + vtNor * dThick;
pt4 = pt2 + vtNor * dThick;
ptU1 = pt1 + vtMain * dLength * 0.5;
ptU2 = pt2 + vtMain * dLength * 0.5;
ptU3 = pt3 + vtMain * dLength * 0.5;
ptU4 = pt4 + vtMain * dLength * 0.5;
pt1 = pt1 - vtMain * dLength * 0.5;
pt2 = pt2 - vtMain * dLength * 0.5;
pt3 = pt3 - vtMain * dLength * 0.5;
pt4 = pt4 - vtMain * dLength * 0.5;
if (vtMain.angleTo(pDb->ucsxdir()) < PI * 0.25 || vtMain.angleTo(-pDb->ucsxdir()) < PI * 0.25)
{
ptU2.z = pt2.z = ptU1.z = pt1.z = ptCenter.z;
arpts.append(ptU2);
arpts.append(pt2);
arpts.append(pt1);
arpts.append(ptU1);
}
else if (vtMain.angleTo(pDb->ucsydir()) < PI * 0.25 || vtMain.angleTo(-pDb->ucsydir()) < PI * 0.25)
{
ptU1.z = pt1.z = ptU3.z = pt3.z = ptCenter.z;
arpts.append(ptU1);
arpts.append(pt1);
arpts.append(pt3);
arpts.append(ptU3);
}
else
{
arpts.append(pt1);
arpts.append(pt2);
arpts.append(pt4);
arpts.append(pt3);
}
}
//散流器标高在底部
else
{
vtMainv = vtMain;
vtMainv.rotateBy(PI * 0.5, vtNor);
vtMain.normalize();
vtMainv.normalize();
pt1 = ptCenter + vtMainv * dWidth * 0.5;
pt2 = ptCenter - vtMainv * dWidth * 0.5;
pt1 = pt1 - vtMain * dLength *0.5;
pt3 = pt1 + vtMain * dLength;
pt2 = pt2 - vtMain * dLength *0.5;
pt4 = pt2 + vtMain * dLength;
ptU1 = pt1 + vtNor * dThick;
ptU2 = pt2 + vtNor * dThick;
ptU3 = pt3 + vtNor * dThick;
ptU4 = pt4 + vtNor * dThick;
if (vtNor.angleTo(pDb->ucsxdir()) < PI * 0.25 || vtNor.angleTo(-pDb->ucsxdir()) < PI * 0.25)
{
ptU2.z = pt2.z = ptU1.z = pt1.z = ptCenter.z;
arpts.append(ptU2);
arpts.append(pt2);
arpts.append(pt1);
arpts.append(ptU1);
}
else if (vtNor.angleTo(pDb->ucsydir()) < PI * 0.25 || vtNor.angleTo(-pDb->ucsydir()) < PI * 0.25)
{
ptU1.z = pt1.z = ptU3.z = pt3.z = ptCenter.z;
arpts.append(ptU1);
arpts.append(pt1);
arpts.append(pt3);
arpts.append(ptU3);
}
else
{
arpts.append(pt1);
arpts.append(pt2);
arpts.append(pt4);
arpts.append(pt3);
}
}
AcGePlane plan(arpts[0], arpts[1], arpts[2]);
AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan);
plan.set(ptOrth, vtZAxis);
double dEl = ptOrth.asVector().length();
if (!ptOrth.asVector().isCodirectionalTo(plan.normal()))
{
dEl *= -1.0;
}
pPolyLine = new AcDbPolyline;
pPolyLine->addVertexAt(0,arpts[0].convert2d(plan));
pPolyLine->addVertexAt(1,arpts[1].convert2d(plan));
pPolyLine->addVertexAt(2,arpts[2].convert2d(plan));
pPolyLine->addVertexAt(3,arpts[3].convert2d(plan));
pPolyLine->setClosed(Adesk::kTrue);
pPolyLine->setElevation(dEl);
pPolyLine->setNormal(plan.normal());
}
//圆口
else
{
//侧风口
if (nIsSide == 1)
{
pPolyLine = new AcDbPolyline;
if(vtMain.angleTo(pDb->ucsxdir()) < PI*0.25 || vtMain.angleTo(-pDb->ucsxdir()) < PI*0.25)
{
TAuxTools::GetEllipseFromCircle(ptCenter, dLength, vtNor, vtZAxis,*pPolyLine);
}
else if(vtMain.angleTo(pDb->ucsydir()) < PI*0.25 || vtMain.angleTo(-pDb->ucsydir()) < PI*0.25)
{
vtMainv = vtMain;
vtMainv.rotateBy(PI * 0.5, vtNor);
vtMain.normalize();
vtMainv.normalize();
pt1 = ptCenter + vtMain * dLength * 0.5;
pt2 = ptCenter - vtMain * dLength * 0.5;
pt3 = pt1 + vtNor * dThick;
pt4 = pt2 + vtNor * dThick;
AcGePlane plan(pt1, pt2, pt3);
AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan);
plan.set(ptOrth, vtZAxis);
double dEl = ptOrth.asVector().length();
if (!ptOrth.asVector().isCodirectionalTo(plan.normal()))
{
dEl *= -1.0;
}
pPolyLine->addVertexAt(0, pt1.convert2d(plan));
pPolyLine->addVertexAt(1, pt2.convert2d(plan));
pPolyLine->addVertexAt(2, pt4.convert2d(plan));
pPolyLine->addVertexAt(3, pt3.convert2d(plan));
pPolyLine->setClosed(Adesk::kTrue);
pPolyLine->setElevation(dEl);
pPolyLine->setNormal(plan.normal());
}
else
{
vtMainv = vtNor;
vtMainv.rotateBy(PI * 0.5, vtMain);
vtMain.normalize();
vtMainv.normalize();
pt1 = ptCenter + vtMainv * dLength * 0.5;
pt2 = ptCenter - vtMainv * dLength * 0.5;
pt3 = pt1 + vtNor * dThick;
pt4 = pt2 + vtNor * dThick;
AcGePlane plan(pt1, pt2, pt3);
AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan);
plan.set(ptOrth, vtZAxis);
double dEl = ptOrth.asVector().length();
if (!ptOrth.asVector().isCodirectionalTo(plan.normal()))
{
dEl *= -1.0;
}
pPolyLine->addVertexAt(0, pt1.convert2d(plan));
pPolyLine->addVertexAt(1, pt2.convert2d(plan));
pPolyLine->addVertexAt(2, pt4.convert2d(plan));
pPolyLine->addVertexAt(3, pt3.convert2d(plan));
pPolyLine->setClosed(Adesk::kTrue);
pPolyLine->setElevation(dEl);
pPolyLine->setNormal(plan.normal());
}
}
else
{
vtMainv = vtMain;
vtMainv.rotateBy(PI * 0.5, vtNor);
vtMain.normalize();
vtMainv.normalize();
pt1 = ptCenter + vtMainv * dLength * 0.5;
pt2 = ptCenter - vtMainv * dLength * 0.5;
pt3 = ptCenter - vtMain * dLength * 0.5;
pt4 = ptCenter + vtMain * dLength * 0.5;
pt1.z = pt2.z = pt3.z = pt4.z = ptCenter.z;
if (vtNor.angleTo(vtZAxis) < PI * 0.25 || vtNor.angleTo(-vtZAxis) < PI * 0.25)
{
AcGePlane plan(pt1, pt2, pt3);
AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan);
plan.set(ptOrth, vtZAxis);
double dEl = ptOrth.asVector().length();
if (ptOrth.asVector().angleTo(plan.normal()) > PI*0.5)
dEl *= -1.0;
pPolyLine = new AcDbPolyline;
pPolyLine->addVertexAt(0, pt1.convert2d(plan),1.0);
pPolyLine->addVertexAt(1, pt2.convert2d(plan),1.0);
pPolyLine->setClosed(Adesk::kTrue);
pPolyLine->setElevation(dEl);
pPolyLine->setNormal(plan.normal());
}
else if (vtNor.angleTo(pDb->ucsxdir()) < PI*0.25 || vtNor.angleTo(-pDb->ucsxdir()) < PI*0.25)
{
pt3 = pt1 + vtNor * dThick;
pt4 = pt2 + vtNor * dThick;
AcGePlane plan(pt1, pt2, pt3);
AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan);
plan.set(ptOrth, vtZAxis);
double dEl = ptOrth.asVector().length();
if (ptOrth.asVector().angleTo(plan.normal()) > PI*0.5)
dEl *= -1.0;
pPolyLine = new AcDbPolyline;
pPolyLine->addVertexAt(0, pt1.convert2d(plan));
pPolyLine->addVertexAt(1, pt2.convert2d(plan));
pPolyLine->addVertexAt(2, pt4.convert2d(plan));
pPolyLine->addVertexAt(3, pt3.convert2d(plan));
pPolyLine->setClosed(Adesk::kTrue);
pPolyLine->setElevation(dEl);
pPolyLine->setNormal(plan.normal());
}
else if (vtNor.angleTo(pDb->ucsydir()) < PI * 0.25 || vtNor.angleTo(-pDb->ucsydir()) < PI * 0.25)
{
pt1 = pt3 + vtNor * dThick;
pt2 = pt4 + vtNor * dThick;
AcGePlane plan(pt1, pt2, pt3);
AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan);
plan.set(ptOrth, vtZAxis);
double dEl = ptOrth.asVector().length();
if (ptOrth.asVector().angleTo(plan.normal()) > PI*0.5)
dEl *= -1.0;
pPolyLine = new AcDbPolyline;
pPolyLine->addVertexAt(0, pt1.convert2d(plan));
pPolyLine->addVertexAt(1, pt2.convert2d(plan));
pPolyLine->addVertexAt(2, pt4.convert2d(plan));
pPolyLine->addVertexAt(3, pt3.convert2d(plan));
pPolyLine->setClosed(Adesk::kTrue);
pPolyLine->setElevation(dEl);
pPolyLine->setNormal(plan.normal());
}
}
}
return pPolyLine;
}
BOOL THImpHvacAirlets::MakePolyCurveFaces(AcDbVoidPtrArray& arFaces)
{
return FALSE;
}
void THImpHvacAirlets::GetKindName(CString& sName)
{
sName = _T("TCH_HAIRLETS");
}
BOOL THImpHvacAirlets::GetGeomExtentsEdge(TComplexCurve& crLoop)
{
return FALSE;
}
TDb::Position THImpHvacAirlets::ExplainGripIndex(int nIndex) const
{
switch(nIndex)
{
case 0:
{
return TDb::eMid;
break;
}
case 1:
{
return TDb::eCommand0;
break;
}
default:
break;
}
return TDb::eMid;
}
Acad::ErrorStatus THImpHvacAirlets::GetGripText(int i, CString &cs) const
{
switch(i)
{
case 0:
{
cs = _T("移动");
break;
}
case 1:
{
cs = _T("风管接口"); //启动绘制命令,2010-06-02,wyd
break;
}
}
return Acad::eOk;
}
void THImpHvacAirlets::GetTips(CMapStringToString& mapLable2Tip) const
{
}
Acad::ErrorStatus THImpHvacAirlets::ExplodeOrDraw3d(XExplodeDraw &mode) const
{
ASSERT(NULL != m_pXDataMap);
AcGePoint3d ptCenter;
AcDbObjectId idCen,id3D;
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_PartCenter, idCen);
m_pXDataMap->GetAt(HALT_Part3D, id3D);
InserBlockCen(mode, ptCenter, id3D);
if (id3D == idCen)
{
Draw3dBox(mode);
}
return Acad::eOk;
}
AcGeVector3d THImpHvacAirlets::GetNormal() const
{
ASSERT(NULL != m_pXDataMap);
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZ = pDb->ucsxdir().crossProduct(pDb->ucsydir());
return vtZ.normalize();
}
AcGePoint3d THImpHvacAirlets::GetStartPt() const
{
ASSERT(NULL != m_pXDataMap);
// 获取各点位置
AcGePoint3d ptCenter;
AcGeVector3d vtMain;
double dLength(50.0);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_Length, dLength);
vtMain.normalize();
return ptCenter - vtMain * dLength * 0.5;
}
AcGePoint3d THImpHvacAirlets::GetEndPt() const
{
ASSERT(NULL != m_pXDataMap);
// 获取各点位置
AcGePoint3d ptCenter;
AcGeVector3d vtMain;
double dLength(50.0);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_Length, dLength);
vtMain.normalize();
return ptCenter + vtMain * dLength * 0.5;
}
AcGePoint3d THImpHvacAirlets::GetHandPt() const
{
ASSERT(NULL != m_pXDataMap);
// 获取各点位置
AcGePoint3d ptCenter;
AcGeVector3d vtMain;
double dWidth(50.0);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_Width, dWidth);
vtMain.rotateBy(PI * 0.5,GetNormal());
vtMain.normalize();
return ptCenter + vtMain * dWidth * 0.5;
}
Acad::ErrorStatus THImpHvacAirlets::ExplodeOrDraw2d(XExplodeDraw &mode) const
{
if (m_pXDataMap == NULL)
{
return Acad::eNotImplementedYet;
}
AcGePoint3d ptCenter;
AcDbObjectId idCen;
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_PartCenter, idCen);
InserBlockCen(mode, ptCenter, idCen);
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacAirlets::InserBlockCen(XExplodeDraw &mode, AcGePoint3d ptCenter, AcDbObjectId idBlock) const
{
ASSERT(NULL != m_pXDataMap);
AcGeVector3d vtMain, vtScale, vtNor;
double dLength(1.0);
double dWidth(1.0);
double dThick(1.0);
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
m_pXDataMap->GetAt(HALT_Length, dLength);
m_pXDataMap->GetAt(HALT_Width, dWidth);
m_pXDataMap->GetAt(HALT_Thick, dThick);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
m_pXDataMap->GetAt(HALT_Scale, vtScale);
double dAngle(0.0);
//侧风口
if (vtNor.isPerpendicularTo(GetNormal()))
{
double dscale = vtScale.x;
dLength *= dscale;
dWidth *= vtScale.y;
dThick *= vtScale.z;
dAngle = AcGeVector3d::kXAxis.angleTo(vtNor,GetNormal());
}
else
{
dLength *= vtScale.x;
dWidth *= vtScale.y;
dThick *= vtScale.z;
dAngle = AcGeVector3d::kXAxis.angleTo(vtMain,GetNormal());
}
AcGeScale3d scale(dLength, dWidth, 1);
// change by hh 2011-05-31 兼容8.2版以前的风口
// add by hh 2011-01-05 侧风口定义变更:
// 与X轴平行的边为高,与Y轴平行的边为长,与Z轴平行的边为宽
// if(vtNor.isPerpendicularTo(GetNormal()))
// scale.set(dThick, dLength, 1);
// add end
CString sVersion;
if(!m_pXDataMap->GetAt(HVAC_EntVersion, sVersion))
{
// 8.2版风口转换为8.5版
m_pXDataMap->SetAt(HVAC_EntVersion, THVAC_EQU_VERSION_CURRENT);
sVersion = THVAC_EQU_VERSION_CURRENT;
if(vtNor.isPerpendicularTo(GetNormal()))
{
double dThickRev = dLength / vtScale.z;
m_pXDataMap->SetAt(HALT_Thick, dThickRev);
dThick = dThickRev * vtScale.z;
}
}
// 侧风口与X轴平行的边为高,与Y轴平行的边为宽,与Z轴平行的边为长
if(vtNor.isPerpendicularTo(GetNormal()))
scale.set(dThick, dWidth, 1);
AcDbObject * pObj;
XPoint xpoint = ptCenter;
if (acdbOpenObject(pObj, idBlock, AcDb::kForRead)!=Acad::eOk) return Acad::eNotImplementedYet;
AcDbBlockTableRecord * pBlock = AcDbBlockTableRecord::cast(pObj);
if (pBlock == NULL)
{
pObj->close();
return Acad::eNotImplementedYet;
}
mode.DrawBlock(*pBlock, xpoint, scale, dAngle, TRUE);
pObj->close();
return Acad::eOk;
}
//////////////////////////////////////////////////////////
//
//
// 1 ┏━━━━━┓ 2
// ┃ ┃
// ┃ ┃
// ┃ 0 ┃
// ┃ ┃
// 4 ┗━━━━━┛3
//
//
BOOL THImpHvacAirlets::GetBoxPts(AcGePoint3dArray &arPts) const
{
// 获取各点位置
AcGePoint3d ptStart, ptEnd, ptCenter;
AcGeVector3d vtMain, vtNor, vtMainv;
double dLength(50.0), dThick(50.0), dWidth(50.0);
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
m_pXDataMap->GetAt(HALT_Length, dLength);
m_pXDataMap->GetAt(HALT_Width, dWidth);
m_pXDataMap->GetAt(HALT_Thick, dThick);
vtMainv = vtMain;
vtMainv.rotateBy(PI * 0.5, vtNor);
vtMain.normalize();
vtMainv.normalize();
//0
arPts.append(ptCenter);
AcGePoint3d pt;
pt = ptCenter - vtMain * dWidth * 0.5;
pt = pt + vtMainv * dThick * 0.5;
//1
arPts.append(pt);
//2
arPts.append(arPts[1] + vtMain * dWidth);
//3
arPts.append(arPts[2] - vtMainv * dThick);
//4
arPts.append(arPts[1] - vtMainv * dThick);
return TRUE;
}
void THImpHvacAirlets::list() const
{
if (m_pXDataMap != NULL)
{
AcGePoint3d ptCenter;
AcGeVector3d vtMain;
CString sType,sName;
double dLength(50.0), dThick(50.0), dWidth(50.0), dPlusEdge(50.0);
double dairload(0);
m_pXDataMap->GetAt(HALT_SEquipType, sType);
m_pXDataMap->GetAt(HALT_SEquipName, sName);
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
m_pXDataMap->GetAt(HALT_Length, dLength);
m_pXDataMap->GetAt(HALT_Width, dWidth);
m_pXDataMap->GetAt(HALT_Thick, dThick);
m_pXDataMap->GetAt(HVAC_AirLoad, dairload);
dWidth = fabs(dWidth);
acutPrintf(_T("\n\t\t\t\t\t\t\t\t%s"),sType);
acutPrintf(_T("\n\t\t\t\t\t型号: %s"),sName);
acutPrintf(_T("\n\t\t\t\t\t风口风量(m^3/h): %.0f"),dairload);
acutPrintf(_T("\n\t\t\t\t\t长度: %.0fmm"),dLength);
acutPrintf(_T("\n\t\t\t\t\t宽度: %.0fmm"),dWidth);
acutPrintf(_T("\n\t\t\t\t\t高度: %.0fmm"),dThick);
acutPrintf(_T("\n\t\t\t\t\t标高: %.0fm"),ptCenter.z * 0.001);
}
}
Acad::ErrorStatus THImpHvacAirlets::transformBy(const AcGeMatrix3d& xform)
{
if (NULL == m_pXDataMap)
return Acad::eNotApplicable;
// 取得位置点
AcGePoint3d ptCenter;
AcGeVector3d vtMain,vtAirWay,vtNor;
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
m_pXDataMap->GetAt(HALT_AirWay, vtAirWay);
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
AcGeVector3d vtPrep(vtNor.crossProduct(vtMain));
// 变换位置
ptCenter.transformBy(xform);
vtMain.transformBy(xform);
vtAirWay.transformBy(xform);
vtNor.transformBy(xform);
vtPrep.transformBy(xform);
// 同向是旋转,不变号,反向是镜像,变号。
int iSign = ((vtPrep.isCodirectionalTo(vtNor.crossProduct(vtMain))) ? 1 : -1);
// 对风口做镜像操作的时候,为保证风口的宽仍保持正值,修改图块比例Lixl add 2012-3-26
if (iSign == -1)
{
AcGeVector3d vtScale;
m_pXDataMap->GetAt(HALT_Scale, vtScale);
vtScale.y = -fabs(vtScale.y);
m_pXDataMap->SetAt(HALT_Scale, vtScale);
}
// 更新点
m_pXDataMap->SetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->SetAt(HALT_MainDir, vtMain);
m_pXDataMap->SetAt(HALT_AirWay, vtAirWay);
m_pXDataMap->SetAt(HVAC_Normal, vtNor);
double dscale = xform.scale();
double dLength(1.0);
double dWidth(1.0);
double dThick(1.0);
m_pXDataMap->GetAt(HALT_Length, dLength);
m_pXDataMap->GetAt(HALT_Width, dWidth);
// 更新
m_pXDataMap->SetAt(HALT_Length, dLength * dscale);
m_pXDataMap->SetAt(HALT_Width, dWidth * dscale/* * iSign*/);
// 传递消息及更新接口记录
if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid())
{
// 如果实体不是在当前模型空间中,不做写消息,更新接口处理
AcDbDatabase* pDb = m_pOwnerEnt->database();
if (pDb == NULL) pDb = acdbCurDwg();
AcDbObjectId idModel;
AcDbBlockTable* pTable = NULL;
pDb->getBlockTable(pTable, AcDb::kForRead);
if (pTable != NULL)
{
pTable->getAt(ACDB_MODEL_SPACE, idModel);
pTable->close();
}
// 如果实体不是在当前模型空间中,不做写消息,更新接口处理
if (idModel == m_pOwnerEnt->blockId())
{
// 写入接口更改消息
// TInterfaceModifyMsg iMsg;
// iMsg.SetInterfaceOper(TDb::eTransformBy);
// iMsg.SetMsgValidate(TRUE);
// iMsg.SetTransform(xform);
// iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
//
// TDbInterfaceMsgWrite msgWrite;
// msgWrite.WriteInterfaceMsg(iMsg);
//更新接口记录接口信息
UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform);
}
}
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacAirlets::getStretchPoints(AcGePoint3dArray& stretchPoints) const
{
if (NULL == m_pXDataMap)
return Acad::eNotApplicable;
// 取得位置点
AcGePoint3d ptCenter;
m_pXDataMap->GetAt(HEQU_CenterPoint, ptCenter);
stretchPoints.append(ptCenter);
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacAirlets::moveStretchPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
return moveGripPointsAt(indices,offset);
}
Acad::ErrorStatus THImpHvacAirlets::moveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
ASSERT(NULL != m_pXDataMap);
int nSize = indices.length();
if (nSize > 0)
{
// 取得位置点
AcGePoint3d ptCenter;
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
AcGeVector3d vtMain,vtMainv;
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
double dThick;
m_pXDataMap->GetAt(HALT_Thick, dThick);
// 选择多个夹点,以first为准
int nIndex = indices.first();
TDb::Position ePos = ExplainGripIndex(nIndex);
switch(ePos)
{
case TDb::eMid:
{
TDb::InterfaceOper eOper = TDb::eMoveGripPoint;
AcGeVector3d vtMove = offset;
ptCenter += vtMove;
m_pXDataMap->SetAt(HALT_CenterPoint, ptCenter);
// if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid())
// {
// // 写入接口更改消息
// TInterfaceModifyMsg iMsg;
// iMsg.SetMsgPoint(ptCenter);//new pos
// iMsg.SetGripPosition(TDb::eMid);
// iMsg.SetMoveGripOffset(vtMove);
// if (eOper == TDb::eTransformBy)
// iMsg.SetTransform(vtMove);
// iMsg.SetMsgValidate(TRUE);
// iMsg.SetInterfaceOper(eOper);
// iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
// TDbInterfaceMsgWrite msgWrite;
// msgWrite.WriteInterfaceMsg(iMsg);
//
// //更新接口记录接口信息
// AcGeMatrix3d xform;
// xform.setToTranslation(vtMove);
// UpdateInterfaceRec(m_pOwnerEnt->objectId(),xform);
// }
break;
}
case TDb::eCommand0:
{
// 获得夹点命令
CString sCmdStr;
GetGlobalContext()->GetAt(KEY_HVACGRIPCMD, sCmdStr);
if (sCmdStr.IsEmpty())
return Acad::eNotApplicable;
AcGePoint3d ptCom = ptCenter;
// 写入接口更改消息
TInterfaceModifyMsg iMsg;
iMsg.SetMsgPoint(ptCom);//new pos
iMsg.SetGripPosition(TDb::eCommand0);
iMsg.SetMoveGripOffset(offset);
iMsg.SetMsgValidate(TRUE);
iMsg.SetInterfaceOper(TDb::eNewCommand);
iMsg.SetPreviewObjToCreate(TDb::eAirlets, 0);
AcDbSoftPointerId idOwner;
m_pXDataMap->GetAt(KEY_THISID,idOwner);
iMsg.SetMsgOperateOn(idOwner);
TDbInterfaceMsgWrite msgWrite;
msgWrite.WriteInterfaceMsg(iMsg);
// 发送消息
acedPostCommand(_T("\33"));
acedPostCommand(sCmdStr + _T("\n"));
break;
}
default:
break;
}
}
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacAirlets::intersectWith(const AcDbEntity* pEnt,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const
{
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacAirlets::intersectWith(const AcDbEntity* pEnt,
AcDb::Intersect intType,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const
{
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacAirlets::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(HALT_CenterPoint, ptCenter);
// 根据捕捉模式处理
switch(osnapMode)
{
case AcDb::kOsModeEnd:
break;
case AcDb::kOsModeMid:
break;
case AcDb::kOsModeCen:
snapPoints.append(ptCenter);
break;
case AcDb::kOsModePerp:
break;
case AcDb::kOsModeNear:
break;
}
// add by hh 2011-07-12 支持任意位置捕捉
TImpSpecEquipment::getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint,
viewXform, snapPoints, geomIds);
// delete by hh 2011-07-12 捕捉算法改进
/*BOOL bIsSide = FALSE; // 是否侧风口
m_pXDataMap->GetAt(HALT_IsSide, bIsSide);
int nType = 0; // 风口截面类型
m_pXDataMap->GetAt(HVAC_SectType, nType);
AcDbPolyline* pPolyLine = MakePolyCurve();
if (NULL == pPolyLine)
return Acad::eOk;
snapPoints.append(ptCenter);
if(eRectangular == (HvacSectType)nType) // 方形
{
AcDbVoidPtrArray arrLine;
pPolyLine->explode(arrLine);
for(int i = 0; i < arrLine.length(); i++)
{
AcDbObject* pObj = (AcDbObject*)arrLine[i];
if(NULL == pObj)
continue;
AcDbCurve* pCurve = AcDbCurve::cast(pObj);
if(NULL != pCurve)
{
pCurve->getOsnapPoints(osnapMode, gsSelectionMark, pickPoint,
lastPoint, viewXform, snapPoints, geomIds);
delete pObj;
}
}
}
else // 圆形/椭圆形
{
pPolyLine->getOsnapPoints(osnapMode, gsSelectionMark, pickPoint,
lastPoint, viewXform, snapPoints, geomIds);
}
delete pPolyLine;*/
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacAirlets::getGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
if (NULL == m_pXDataMap)
return Acad::eNotApplicable;
// 取得位置点
AcGeVector3d vtMain,vtNor;
AcGePoint3d ptCenter;
double dLength;
double dThick;
double dWidth;
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
m_pXDataMap->GetAt(HALT_Length, dLength);
m_pXDataMap->GetAt(HALT_Width, dWidth);
m_pXDataMap->GetAt(HALT_Thick, dThick);
//移动夹点
gripPoints.append(ptCenter); //STA
AcDbObjectId id3d;
m_pXDataMap->GetAt(HALT_Part3D, id3d);
//增加命令夹点
AcGePoint3d ptGeCmd1; //按 10 个像素点
// double dCmd = PixelToWcs(10);
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
if (vtNor.isPerpendicularTo(vtZAxis))
{
vtMain = vtNor;
}
AcGeVector3d vtMainv = vtMain;
vtMainv.rotateBy(PI * 0.5, GetNormal());
vtMainv.normalize();
vtMain.normalize();
if (IsHorzAlignment())
{
//BEGIN=====================================================
AcGeVector3d vtScale;
m_pXDataMap->GetAt(HALT_Scale, vtScale);
if (vtScale.x < 0)
{
ptGeCmd1 = ptCenter + vtMain * dLength * -0.5;
}
else
{
ptGeCmd1 = ptCenter + vtMain * dLength * 0.5;
}
if (vtScale.y < 0)
{
ptGeCmd1 = ptGeCmd1 + vtMainv * dWidth * -0.5;
}
else
{
ptGeCmd1 = ptGeCmd1 + vtMainv * dWidth * 0.5;
}
//修改时间:2010-05-25
//修改人 :王亚东
//修改原因:修复BUG2591,支持翻转时夹点的旋转
//END======================================================
}
else
{
ptGeCmd1 = ptCenter + GetNormal() * dThick;
}
gripPoints.append(ptGeCmd1); //cmd
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacAirlets::getGeomExtents(AcDbExtents& extents) const
{
return Acad::eOk;
}
Acad::ErrorStatus THImpHvacAirlets::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;
}
Acad::ErrorStatus THImpHvacAirlets::explode(AcDbVoidPtrArray& entitySet) const
{
return Acad::eOk;
}
//////////////////////////////////////////////////////////
//
//
// 1 ┏━━━━━┓ 2
// ┃ ┃
// ┃ ┃
// ┃ 0 ┃
// ┃ ┃
// 4 ┗━━━━━┛3
//
//
BOOL THImpHvacAirlets::Draw3dBox(XExplodeDraw &mode) const
{
TDb::HvacSectType eSectType = TDb::eRectangular;
m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType);
AcGePoint3d ptCenter;
AcGePoint3dArray arPts;
AcGeVector3d vtMain, vtNor, vtMainv, vtz = GetNormal();
double dLength(50.0), dThick(50.0), dWidth(50.0);
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
m_pXDataMap->GetAt(HALT_Length, dLength);
m_pXDataMap->GetAt(HALT_Width, dWidth);
m_pXDataMap->GetAt(HALT_Thick, dThick);
vtMainv = vtMain;
vtMainv.rotateBy(PI * 0.5, vtz);
vtMain.normalize();
vtMainv.normalize();
AcGePoint3d pt;
//方截面
if (eSectType == TDb::eRectangular)
{
//侧风口
if (vtNor.isPerpendicularTo(vtz))
{
vtMainv = vtNor;
vtMainv.rotateBy(PI * 0.5, vtz);
vtMain.normalize();
vtMainv.normalize();
vtNor.normalize();
//0
arPts.append(ptCenter);
pt = ptCenter + vtMainv * dWidth * 0.5;
pt = pt - vtMain * dLength * 0.5;
//1
arPts.append(pt);
//2
arPts.append(arPts[1] + vtNor * dThick);
//3
arPts.append(arPts[2] - vtMainv * dWidth);
//4
arPts.append(arPts[1] - vtMainv * dWidth);
dThick = dLength;
// change by hh 2011-01-05 3D视图下 长和宽定义交换
/*pt = ptCenter + vtMainv * dLength * 0.5;
pt = pt - vtMain * dWidth * 0.5;
arPts.append(pt);
arPts.append(arPts[1] + vtNor * dThick);
arPts.append(arPts[2] - vtMainv * dLength);
arPts.append(arPts[1] - vtMainv * dLength);
dThick = dWidth;*/
}
else
{
//0
arPts.append(ptCenter);
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);
}
AcGePoint3dArray arptSides;
arptSides.append(arPts[1] + vtz * dThick );
arptSides.append(arPts[4] + vtz * dThick );
arptSides.append(arPts[4]);
arptSides.append(arPts[1]);
arptSides.append(arPts[1] + vtz * dThick );
arptSides.append(arPts[2] + vtz * dThick );
arptSides.append(arPts[3] + vtz * dThick );
arptSides.append(arPts[3]);
arptSides.append(arPts[2]);
arptSides.append(arPts[2] + vtz * dThick );
mode.DrawMesh(2, 5, arptSides.asArrayPtr());
arptSides.setLogicalLength(0);
arptSides.append(arPts[1] + vtz * dThick);
arptSides.append(arPts[1] );
arptSides.append(arPts[4] + vtz * dThick);
arptSides.append(arPts[4]);
mode.DrawMesh(2, 2, arptSides.asArrayPtr());
arptSides.setLogicalLength(0);
arptSides.append(arPts[2] + vtz * dThick);
arptSides.append(arPts[2]);
arptSides.append(arPts[3] + vtz * dThick);
arptSides.append(arPts[3]);
mode.DrawMesh(2, 2, arptSides.asArrayPtr());
}
//圆
else
{
double dMinDiffAng = PI/12;
GetGlobalContext()->GetAt(KEY_MINDIFFANG,dMinDiffAng);
int nSect = int(PI * 2 / dMinDiffAng) + 1;
AcGePoint3dArray arptSides,arptSidesD;
AcGePoint3d pt;
AcGePoint3d ptC;
//侧风口
if (vtNor.isPerpendicularTo(vtz))
{
// ptC = ptCenter;
// pt = ptCenter + vtMainv * dLength * 0.5;
// for (int i = 0; i < nSect; i++)
// {
// arptSides.append(pt);
// pt.rotateBy(dMinDiffAng, vtNor, ptC);
// }
ptC = ptCenter;
pt = ptC + vtMainv * dLength * 0.5;
for (int i = 0; i < nSect; i++)
{
arptSides.append(pt);
pt.rotateBy(dMinDiffAng, vtNor, ptC);
}
ptCenter += vtNor * dThick;
}
else
{
ptC = ptCenter;
pt = ptC + vtMainv * dLength * 0.5;
for (int i = 0; i < nSect; i++)
{
arptSides.append(pt);
pt.rotateBy(dMinDiffAng, vtNor, ptC);
}
ptCenter += vtNor * dThick;
// ptC = ptCenter + vtNor * dThick;
// pt = ptC + vtMainv * dLength * 0.5;
// for (i = 0; i < nSect; i++)
// {
// arptSides.append(pt);
// pt.rotateBy(dMinDiffAng, vtNor, ptC);
// }
}
// mode.DrawMesh(2, nSect, arptSides.asArrayPtr());
XPoly2D xploy2d;
XPoint xpt;
XVector3D xvt = ptCenter - ptC;
for (int i = 0; i < nSect; i++)
{
xpt = arptSides[i];
xploy2d.AppendNode(xpt);
}
mode.DrawBody(xploy2d,xvt);
// AcDbFace *pface = new AcDbFace;
// AcDbFace *pface1 = new AcDbFace;
// for (int i = 0; i < nSect - 1; i++)
// {
// pface->setVertexAt(0, ptCenter);
// pface->setVertexAt(1, arptSides[i]);
// pface->setVertexAt(2, arptSides[i + 1]);
// pface->setVertexAt(3, ptCenter);
// X3DFace x3dface(*pface);
// mode.DrawFace(x3dface);
//
// pface1->setVertexAt(0, ptC);
// pface1->setVertexAt(1, arptSides[nSect + i]);
// pface1->setVertexAt(2, arptSides[nSect + i + 1]);
// pface1->setVertexAt(3, ptC);
// X3DFace x3dface1(*pface1);
// mode.DrawFace(x3dface1);
// }
}
return TRUE;
}
BOOL THImpHvacAirlets::IsHorzAlignment() const
{
// 取得位置点
AcGeVector3d vtMain;
AcGePoint3d ptCenter;
m_pXDataMap->GetAt(HALT_CenterPoint, ptCenter);
m_pXDataMap->GetAt(HALT_MainDir, vtMain);
AcGeVector3d vtCross = GetNormal();
// 获得UCS坐标Z向量
AcDbDatabase* pDb = acdbCurDwg();
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
AcGeVector3d vtXAxis(pDb->ucsxdir());
AcGeVector3d vtYAxis(pDb->ucsydir());
if (vtCross.isParallelTo(vtZAxis))
{
BOOL BBB = TRUE;
}
if (vtCross.isParallelTo(vtXAxis))
{
BOOL BBB = TRUE;
}
if (vtCross.isParallelTo(vtYAxis))
{
BOOL BBB = TRUE;
}
return vtCross.isParallelTo(vtZAxis);
}
BOOL THImpHvacAirlets::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::eAirlets);
}
return TRUE;
}
if (0 == _tcsicmp(pszName, KEY_Name))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = FALSE;
return TRUE;
}
if (0 == _tcsicmp(pszName, KEY_Model))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
return TRUE;
}
if (0 == _tcsicmp(pszName, KEY_AirLoad))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
return TRUE;
}
if (0 == _tcsicmp(pszName, KEY_StartPoint))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
// 整体移动
if (NULL != pInfo->pXData && 0 != pInfo->pXData->nVt)
{
// 改变顶点变换行为
AcGePoint3d pt;
m_pXDataMap->GetAt(KEY_StartPoint, pt);
AcGeVector3d offset = asPnt3d(pInfo->pXData->dVal) - pt;
AcGeMatrix3d mat;
mat.setToTranslation(offset);
transformBy(mat);
pInfo->pXData->nVt = 0; // 设置处理完成标识
//TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo);
}
return TRUE;
}
if (0 == _tcsicmp(pszName, KEY_Length))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
return TRUE;
}
if (0 == _tcsicmp(pszName, KEY_Width))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
//BEGIN===================================================
if (NULL != pInfo->pXData)
{
if (0 == pInfo->pXData->nVt) //显示数据
{
if (m_pXDataMap->GetAt(HALT_Width, *pInfo->pXData)) //风口宽度值为负值时,只显示正值
{
pInfo->pXData->dVal[0] = fabs(pInfo->pXData->dVal[0]);
}
}
else //设置数据
{
double dAltWidth = 0.0;
if (m_pXDataMap->GetAt(HALT_Width, dAltWidth) && dAltWidth < 0.0) //原风口宽度值为负值时,设置为负值
{
dAltWidth = pInfo->pXData->dVal[0];
m_pXDataMap->SetAt(HALT_Width, -fabs(dAltWidth));
}
else //原风口宽度值为正值时,设置为正值
{
dAltWidth = pInfo->pXData->dVal[0];
m_pXDataMap->SetAt(HALT_Width, fabs(dAltWidth));
}
pInfo->pXData->nVt = 0; // 设置处理完成标识
}
}
//修改时间:2010-01-27
//修改人 :王亚东
//修改原因:修正风口镜像后宽度显示负值的错误
//END=====================================================
return TRUE;
}
if (0 == _tcsicmp(pszName, KEY_Thick))
{
pInfo->bVisible = TRUE;
pInfo->bEditable = TRUE;
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;
}
int THImpHvacAirlets::GetXBaseShell(TXShell& xShell)
{
int nRet = 0;
if (NULL == m_pXDataMap)
{
return 0;
}
HvacSectType eSectType;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
if (TDb::eRectangular == eSectType)
{
// 获得参数
double dWidth = 0.0;
m_pXDataMap->GetAt(HALT_Width, dWidth);
double dThick = 0.0;
m_pXDataMap->GetAt(HALT_Length, dThick);
double dLength = 0.0;
m_pXDataMap->GetAt(HALT_Thick, dLength);
AcGeVector3d vtNormal;
m_pXDataMap->GetAt(HALT_MainDir, vtNormal);
vtNormal.normalize();
AcGePoint3d ptStart;
m_pXDataMap->GetAt(HALT_CenterPoint, ptStart);
AcGeVector3d vtMain;
m_pXDataMap->GetAt(HVAC_Normal, vtMain);
vtMain.normalize();
AcGePoint3d ptEnd = ptStart + vtMain * dLength;
// 构造碰撞实体
TAuxTools::BuildRectDuct(ptStart, ptEnd, vtNormal, dWidth, dThick, dWidth, dThick, xShell);
nRet = 1;
}
else if (TDb::eCircular == eSectType)
{
// 获得参数
double dDiameter = 0.0;
m_pXDataMap->GetAt(HALT_Diameter, dDiameter);
double dLength = 0.0;
m_pXDataMap->GetAt(HALT_Thick, dLength);
AcGeVector3d vtNormal;
m_pXDataMap->GetAt(HALT_MainDir, vtNormal);
vtNormal.normalize();
AcGePoint3d ptStart;
m_pXDataMap->GetAt(HALT_CenterPoint, ptStart);
AcGeVector3d vtMain;
m_pXDataMap->GetAt(HVAC_Normal, vtMain);
vtMain.normalize();
AcGePoint3d ptEnd = ptStart + vtMain * dLength;
// 构造碰撞实体
TAuxTools::BuildCirDuct(ptStart, ptEnd, dDiameter, dDiameter, xShell);
nRet = 1;
}
else
{
// 不做处理
;
}
return nRet;
}
int THImpHvacAirlets::GetBodyBox( AcDbExtents& ext ) const
{
if (NULL == m_pXDataMap)
{
return 0;
}
// 获得参数
double dWidth = 0.0;
m_pXDataMap->GetAt(HALT_Width, dWidth);
double dHalfWidth = dWidth / 2.0;
double dLength = 0.0;
m_pXDataMap->GetAt(HALT_Thick ,dLength);
double dThick = 0.0;
m_pXDataMap->GetAt(HALT_Length, dThick);
double dHalfThick = dThick / 2.0;
HvacSectType eSectType;
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
if (TDb::eCircular == eSectType)
{
// 处理圆管数据
dHalfThick = dHalfWidth;
}
AcGeVector3d vtNormal;
m_pXDataMap->GetAt(HALT_MainDir, vtNormal);
vtNormal.normalize();
AcGePoint3d ptStart;
m_pXDataMap->GetAt(HALT_CenterPoint, ptStart);
AcGeVector3d vtMain;
m_pXDataMap->GetAt(HVAC_Normal, vtMain);
AcGePoint3d ptEnd = ptStart + vtMain * dLength;
AcGeVector3d vtSide = ptEnd - ptStart;
vtSide.rotateBy(PI / 2.0, vtNormal);
vtSide.normalize();
// 计算端点
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;
}
AcGePoint3d THImpHvacAirlets::GetIfPoint() const
{
AcGePoint3d ptIf;
m_pXDataMap->GetAt(HALT_CenterPoint, ptIf);
// 上下送风时,接口位置调整至上面,适应大多数情况,跟风管连接完好
BOOL bIsSide(TRUE);
m_pXDataMap->GetAt(HALT_IsSide, bIsSide);
if (!bIsSide)
{
AcGeVector3d vtNor;
double dHeigh(0.0);
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
m_pXDataMap->GetAt(HALT_Thick, dHeigh);
ptIf += vtNor.normalize() * dHeigh;
}
return ptIf;
}
// 导出XML
CString THImpHvacAirlets::GetXml(const AcGeMatrix3d& mat) const
{
if (NULL == m_pXDataMap || NULL == m_pOwnerEnt)
return _T("");
int nValue(0);
double dValue(0.0);
int nPtPreci = 6; // 位置精度
int nWhPreci = 0; // 宽度、高度精度
TXmlTree xmlTree;
CString csText;
CString csX, csY, csZ;
AcGePoint3d pt;
AcGeVector3d vt;
AcDbObjectId id;
// 获得设备转换矩阵Lixl add 2012-2-1
// 插入点
XPoint ptLocation;
m_pXDataMap->GetAt(HALT_CenterPoint, pt);
ptLocation = pt;
// 主方向
XVector3D vtDirection(0,0,1);
m_pXDataMap->GetAt(HALT_MainDir, vt);
vtDirection = vt;
// 图块比例
m_pXDataMap->GetAt(HALT_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();
}
XPoint ptLoc=Wcs2Ecs(ptLocation, vtNormal);
double nRotEcs = ads_angle(XPoint(),vtDirection); //计算ECS下的转角
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);
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("设备类型"));
m_pXDataMap->GetAt(HALT_SEquipType, csText);
xmlTree.SetItemText(posItemEquipType, csText);
}
POSITION posItemEquipName = xmlTree.Insert(_T("EquipName"), posRoot, posItemEquipType);
{
xmlTree.SetAttribute(posItemEquipName, _T("name"), _T("设备名称"));
xmlTree.SetAttribute(posItemEquipName, _T("comment"), _T("对应图库中的风口名称"));
m_pXDataMap->GetAt(HALT_SEquipName, csText);
xmlTree.SetItemText(posItemEquipName, csText);
}
POSITION posItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posItemEquipName);
{
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 posItemCentPt = xmlTree.Insert(_T("CenterPoint"), posRoot, posItemNorDir);
{
xmlTree.SetAttribute(posItemCentPt, _T("name"), _T("中心点"));
xmlTree.SetAttribute(posItemCentPt, _T("comment"), _T("布置点"));
m_pXDataMap->GetAt(HALT_CenterPoint, pt);
pt.transformBy(mat);
TAuxTools::DoubleToString(pt.x, nPtPreci, csX);
TAuxTools::DoubleToString(pt.y, nPtPreci, csY);
TAuxTools::DoubleToString(pt.z, nPtPreci, csZ);
csText.Format(_T("%s,%s,%s"), csX, csY, csZ);
xmlTree.SetItemText(posItemCentPt, csText);
}
POSITION posItemMainDir = xmlTree.Insert(_T("MainDir"), posRoot, posItemCentPt);
{
xmlTree.SetAttribute(posItemMainDir, _T("name"), _T("主矢量"));
xmlTree.SetAttribute(posItemMainDir, _T("comment"), _T("布置角度"));
m_pXDataMap->GetAt(HALT_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 posItemPart2D = xmlTree.Insert(_T("Part2D"), posRoot, posItemMainDir);
{
// mod by wc 13-12-16 //
// 将保存id改为保存名称
xmlTree.SetAttribute(posItemPart2D, _T("name"), _T("2D块名称"));
xmlTree.SetAttribute(posItemPart2D, _T("comment"), _T("平面图块"));
m_pXDataMap->GetAt(HALT_PartCenter, id);
// mod by wc 13-12-16 //
csText = TAuxTools::GetBlkNameById(id);
//csText.Format(_T("%d"), id.asOldId());
// end //
xmlTree.SetItemText(posItemPart2D, csText);
}
POSITION posItemPart3D = xmlTree.Insert(_T("Part3D"), posRoot, posItemPart2D);
{
// mod by wc 13-12-16 //
// 将保存id改为保存名称
id.setNull();
xmlTree.SetAttribute(posItemPart3D, _T("name"), _T("3D块名称"));
xmlTree.SetAttribute(posItemPart3D, _T("comment"), _T("三维图块"));
m_pXDataMap->GetAt(HALT_Part3D, id);
csText = TAuxTools::GetBlkNameById(id);
//csText.Format(_T("%d"), id.asOldId());
// end //
xmlTree.SetItemText(posItemPart3D, csText);
}
// add by wc 13-12-16 //
POSITION posItemPartSys = xmlTree.Insert(_T("PartSys"), posRoot, posItemPart3D);
{
xmlTree.SetAttribute(posItemPartSys, _T("name"), _T("系统块名称"));
xmlTree.SetAttribute(posItemPartSys, _T("comment"), _T("系统图块"));
m_pXDataMap->GetAt(HALT_PartSys, id);
csText = TAuxTools::GetBlkNameById(id);
xmlTree.SetItemText(posItemPartSys, csText);
}
// end //
// mod by wc //
// 原因:插入了一个节点,因此Insert函数第3个参数需要变成新插入节点的POSITION
POSITION posItemLength = xmlTree.Insert(_T("Length"), posRoot, posItemPartSys);
{
xmlTree.SetAttribute(posItemLength, _T("name"), _T("长度"));
xmlTree.SetAttribute(posItemLength, _T("comment"), _T("风口长度"));
m_pXDataMap->GetAt(HALT_Length, dValue);
TAuxTools::DoubleToString(dValue, nWhPreci, csText);
xmlTree.SetItemText(posItemLength, csText);
}
POSITION posItemWidth = xmlTree.Insert(_T("Width"), posRoot, posItemLength);
{
xmlTree.SetAttribute(posItemWidth, _T("name"), _T("宽度"));
xmlTree.SetAttribute(posItemWidth, _T("comment"), _T("风口宽度"));
m_pXDataMap->GetAt(HALT_Width, dValue);
TAuxTools::DoubleToString(dValue, nWhPreci, csText);
xmlTree.SetItemText(posItemWidth, csText);
}
POSITION posItemThick = xmlTree.Insert(_T("Thick"), posRoot, posItemWidth);
{
xmlTree.SetAttribute(posItemThick, _T("name"), _T("厚度"));
xmlTree.SetAttribute(posItemThick, _T("comment"), _T("风口高度"));
m_pXDataMap->GetAt(HALT_Thick, dValue);
TAuxTools::DoubleToString(dValue, nWhPreci, csText);
xmlTree.SetItemText(posItemThick, csText);
}
POSITION posItemScale = xmlTree.Insert(_T("Scale"), posRoot, posItemThick);
{
xmlTree.SetAttribute(posItemScale, _T("name"), _T("图块比例"));
xmlTree.SetAttribute(posItemScale, _T("comment"), _T("图块比例"));
m_pXDataMap->GetAt(HALT_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(posItemScale, csText);
}
POSITION posItemMat= xmlTree.Insert(_T("Matrix3d"), posRoot, posItemScale);
{
xmlTree.SetAttribute(posItemMat, _T("name"), _T("矩阵"));
xmlTree.SetAttribute(posItemMat, _T("comment"), _T("图块转换矩阵"));
xmlTree.SetItemText(posItemMat, sMat);
}
// add by wc 13-12-12
// begin
POSITION posItemAirWay = xmlTree.Insert(_T("AirWayDir"), posRoot, posItemMat);
{
xmlTree.SetAttribute(posItemAirWay, _T("name"), _T("接口方向"));
xmlTree.SetAttribute(posItemAirWay, _T("comment"), _T("风口接口方向向量"));
if (m_pXDataMap->GetAt(HALT_AirWay, 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);
}
else
{
csText.Format(_T("读取风口向量错误"));
}
xmlTree.SetItemText(posItemAirWay, csText);
}
POSITION posItemForm = xmlTree.Insert(_T("Form"), posRoot, posItemAirWay);
{
xmlTree.SetAttribute(posItemForm, _T("name"), _T("结构形式"));
xmlTree.SetAttribute(posItemForm, _T("comment"), _T("明暗装等"));
if (!m_pXDataMap->GetAt(HEQU_Form, csText))
{
csText.Empty();
}
xmlTree.SetItemText(posItemForm, csText);
}
POSITION posItemInterNum = xmlTree.Insert(_T("InterfaceNum"), posRoot, posItemForm);
{
xmlTree.SetAttribute(posItemInterNum, _T("name"), _T("接口数量"));
xmlTree.SetAttribute(posItemInterNum, _T("comment"), _T("接口数量"));
nValue = GetInterfaceCount();
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemInterNum, csText);
}
POSITION posItemSysName = xmlTree.Insert(_T("SysName"), posRoot, posItemInterNum);
{
xmlTree.SetAttribute(posItemSysName, _T("name"), _T("系统名称"));
xmlTree.SetAttribute(posItemSysName, _T("comment"), _T("回风、送风等"));
m_pXDataMap->GetAt(HVAC_System, csText);
xmlTree.SetItemText(posItemSysName, csText);
}
POSITION posItemIsConverse = xmlTree.Insert(_T("IsConverse"), posRoot, posItemSysName);
{
xmlTree.SetAttribute(posItemIsConverse, _T("name"), _T("是否反向"));
xmlTree.SetAttribute(posItemIsConverse, _T("comment"), _T("0/不是、1/是"));
if (!m_pXDataMap->GetAt(HEQU_IsConverse, nValue))
{
nValue = 0;
}
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemIsConverse, csText);
}
POSITION posItemHasText = xmlTree.Insert(_T("HasText"), posRoot, posItemIsConverse);
{
xmlTree.SetAttribute(posItemHasText, _T("name"), _T("是否有文字"));
xmlTree.SetAttribute(posItemHasText, _T("comment"), _T("0/不是、1/是"));
if (!m_pXDataMap->GetAt(HEQU_HasText, nValue))
{
nValue = 0;
}
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemHasText, csText);
}
POSITION posItemTextPoint = xmlTree.Insert(_T("TextPoint"), posRoot, posItemHasText);
{
xmlTree.SetAttribute(posItemTextPoint, _T("name"), _T("文字基点"));
xmlTree.SetAttribute(posItemTextPoint, _T("comment"), _T("文字基点"));
if (m_pXDataMap->GetAt(HEQU_TextPoint, 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);
}
else
{
csText.Format(_T("文字基点读取失败"));
}
xmlTree.SetItemText(posItemTextPoint, csText);
}
POSITION posItemTextShade = xmlTree.Insert(_T("TextShadeBg"), posRoot, posItemTextPoint);
{
xmlTree.SetAttribute(posItemTextShade, _T("name"), _T("遮蔽背景"));
xmlTree.SetAttribute(posItemTextShade, _T("comment"), _T("文字是否遮蔽背景0/不是、1/是"));
if (!m_pXDataMap->GetAt(HEQU_TextShadeBg, nValue))
{
nValue = 0;
}
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemTextShade, csText);
}
POSITION posItemTextLoc = xmlTree.Insert(_T("TextLoc"), posRoot, posItemTextShade);
{
xmlTree.SetAttribute(posItemTextLoc, _T("name"), _T("标注文字位置"));
xmlTree.SetAttribute(posItemTextLoc, _T("comment"), _T("标注文字的位置:enum HvacEquipDimLoc"));
if (!m_pXDataMap->GetAt(HEQU_TextLoc, nValue))
{
nValue = 0;
}
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemTextLoc, csText);
}
POSITION posItemKind = xmlTree.Insert(_T("Kind"), posRoot, posItemTextLoc);
{
xmlTree.SetAttribute(posItemKind, _T("name"), _T("设备种类"));
xmlTree.SetAttribute(posItemKind, _T("comment"), _T("1/采暖设备、2/空调设备"));
if (!m_pXDataMap->GetAt(HEQU_Kind, nValue))
{
nValue = 1;
}
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemKind, csText);
}
POSITION posItemReversalX = xmlTree.Insert(_T("ReversalX"), posRoot, posItemKind);
{
xmlTree.SetAttribute(posItemReversalX, _T("name"), _T("是否左右旋转"));
xmlTree.SetAttribute(posItemReversalX, _T("comment"), _T("0/不是、1/是"));
if (!m_pXDataMap->GetAt(HEQU_ReversalX, nValue))
{
nValue = 0;
}
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemReversalX, csText);
}
POSITION posItemReversalY = xmlTree.Insert(_T("ReversalY"), posRoot, posItemReversalX);
{
xmlTree.SetAttribute(posItemReversalY, _T("name"), _T("是否上下旋转"));
xmlTree.SetAttribute(posItemReversalY, _T("comment"), _T("0/不是、1/是"));
if (!m_pXDataMap->GetAt(HEQU_ReversalY, nValue))
{
nValue = 0;
}
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemReversalY, csText);
}
POSITION posItemAirLoad = xmlTree.Insert(_T("AirLoad"), posRoot, posItemReversalY);
{
xmlTree.SetAttribute(posItemAirLoad, _T("name"), _T("风口风量"));
xmlTree.SetAttribute(posItemAirLoad, _T("comment"), _T("风口风量"));
if (!m_pXDataMap->GetAt(HVAC_AirLoad, dValue))
{
dValue = 0.0;
}
csText.Format(_T("%f"), dValue);
xmlTree.SetItemText(posItemAirLoad, csText);
}
POSITION posItemIsSide = xmlTree.Insert(_T("IsSide"), posRoot, posItemAirLoad);
{
xmlTree.SetAttribute(posItemIsSide, _T("name"), _T("是否侧风口"));
xmlTree.SetAttribute(posItemIsSide, _T("comment"), _T("0/不是、1/是"));
if (!m_pXDataMap->GetAt(HALT_IsSide, nValue))
{
nValue = 0;
}
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemIsSide, csText);
}
POSITION posItemAreaRatio = xmlTree.Insert(_T("AreaRatio"), posRoot, posItemIsSide);
{
xmlTree.SetAttribute(posItemAreaRatio, _T("name"), _T("喉口面积系数"));
xmlTree.SetAttribute(posItemAreaRatio, _T("comment"), _T("喉口面积系数"));
if (!m_pXDataMap->GetAt(HALT_AreaRatio, dValue))
{
dValue = 0.0;
}
csText.Format(_T("%f"), dValue);
xmlTree.SetItemText(posItemAreaRatio, csText);
}
POSITION posItemSectType = xmlTree.Insert(_T("SectType"), posRoot, posItemAreaRatio);
{
xmlTree.SetAttribute(posItemSectType, _T("name"), _T("截面类型"));
xmlTree.SetAttribute(posItemSectType, _T("comment"), _T("0/矩形、1/圆形、2/扁圆"));
if (!m_pXDataMap->GetAt(HVAC_SectType, nValue))
{
nValue = 0;
}
csText.Format(_T("%d"), nValue);
xmlTree.SetItemText(posItemSectType, csText);
}
// end //
CString csXml = xmlTree.GetXml();
return csXml;
}
Acad::ErrorStatus THImpHvacAirlets::ExplodeOrDrawBlock2d( XExplodeDraw &mode ) const
{
return ExplodeOrDraw2d(mode);
}