4311 lines
117 KiB
C++
4311 lines
117 KiB
C++
#include "stdafx.h"
|
|
#include "StdArx.h"
|
|
#include "THImpHvacValve.h"
|
|
|
|
#include "TDbInterfaceRecord.h"
|
|
#include "TDbXDataMap.h"
|
|
#include "TDbInterfaceMsgWrite.h"
|
|
#include "math.h"
|
|
#include "dbxutil.h"
|
|
#include "dbText.h"
|
|
#include "dbhatch.h"
|
|
#include "TDbEquWorldDraw.h"
|
|
|
|
|
|
using namespace TDb;
|
|
|
|
static const Adesk::UInt16 kColorByLayer = 256;
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
#define HVAC_VALVEBLOCKCEN_UP _T("Cent_UP") // 阀芯块名(上) add by hh 2011-08-08 多叶阀使用
|
|
#define HVAC_VALVEBLOCKCEN_DN _T("Cent_DN") // 阀芯块名(下) add by hh 2011-08-08 多叶阀使用
|
|
#define HVAC_VALVEBLOCKCEN _T("Cent") // 阀芯块名
|
|
#define HVAC_VALVEBLOCKHAN _T("Hand") // 阀手柄块名
|
|
#define HVAC_VALVEBLOCKMIS _T("Body") // 其它非等比
|
|
#define FIXED_SILENCER_EXTEND 150 // 固定消声器出头量 150mm
|
|
|
|
THImpHvacValve::THImpHvacValve()
|
|
{
|
|
}
|
|
|
|
THImpHvacValve::~THImpHvacValve()
|
|
{
|
|
}
|
|
|
|
BOOL THImpHvacValve::GetInterfaceSizeData(int nIndex, TInterface& pipeInterface) const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
|
|
// 获取截面类型
|
|
TDb::HvacSectType eSectType = TDb::eRectangular;
|
|
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
|
|
|
// 获取接口截面、宽度、厚度数据key值
|
|
LPCTSTR pszWidthKey, pszThickKey;
|
|
switch (nIndex)
|
|
{
|
|
case 0:
|
|
pszWidthKey = ((TDb::eCircular == eSectType) ? HVLV_Diameter : HVLV_Width);
|
|
pszThickKey = HVLV_Thick;
|
|
break;
|
|
case 1:
|
|
pszWidthKey = ((TDb::eCircular == eSectType) ? HVLV_Diameter : HVLV_Width);
|
|
pszThickKey = HVLV_Thick;
|
|
break;
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
// 获取尺寸
|
|
double dWidth = 0.0, dThick = 0.0;
|
|
m_pXDataMap->GetAt(pszWidthKey, dWidth);
|
|
m_pXDataMap->GetAt(pszThickKey, dThick);
|
|
dWidth *= 1000;
|
|
|
|
// 设置接口数据
|
|
pipeInterface.SetType(eSectType);
|
|
pipeInterface.SetSize(dWidth, dThick);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL THImpHvacValve::GetInterface(int nIndex,TInterface& pipeInterface) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
// 获取各点位置
|
|
AcGePoint3d ptStart, ptCorner, ptEnd;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCorner);
|
|
ptStart = GetStartPt();
|
|
ptEnd = GetEndPt();
|
|
|
|
// 求两端方向
|
|
AcGeVector3d vtStart, vtEnd;
|
|
vtStart = ptStart - ptCorner;
|
|
vtEnd = ptEnd - ptCorner;
|
|
|
|
AcDbObjectId id;
|
|
switch(nIndex)
|
|
{
|
|
case 0:
|
|
// 如果起始接口和第一个管件连接
|
|
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface))
|
|
{
|
|
GetInterfaceSizeData(0,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
// 如果起始接口和第二个管件连接
|
|
if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface))
|
|
{
|
|
GetInterfaceSizeData(0,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
// 没有管件连接
|
|
pipeInterface.SetOutDir(vtStart);
|
|
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
|
|
pipeInterface.SetPosition(ptStart);
|
|
GetInterfaceSizeData(0,pipeInterface);
|
|
return TRUE;
|
|
case 1:
|
|
// 如果末尾接口和第一个管件连接
|
|
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface))
|
|
{
|
|
GetInterfaceSizeData(1,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
// 如果末尾接口和第二个管件连接
|
|
if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface))
|
|
{
|
|
GetInterfaceSizeData(1,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
// 没有管件连接
|
|
pipeInterface.SetOutDir(vtEnd);
|
|
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
|
|
pipeInterface.SetPosition(ptEnd);
|
|
GetInterfaceSizeData(1,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacValve::GetInterface(const AcGePoint3d& ptCon,TInterface& pipeInterface) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
// 获取各点位置
|
|
AcGePoint3d ptStart, ptCorner, ptEnd;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCorner);
|
|
ptStart = GetStartPt();
|
|
ptEnd = GetEndPt();
|
|
|
|
// 求两端方向
|
|
AcGeVector3d vtStart, vtEnd;
|
|
vtStart = ptStart - ptCorner;
|
|
vtEnd = ptEnd - ptCorner;
|
|
|
|
// 计算测试点到始末点的距离
|
|
double dDist1 = ptCon.distanceTo(ptStart);
|
|
double dDist2 = ptCon.distanceTo(ptEnd);
|
|
AcDbObjectId id;
|
|
|
|
// 位于起始点
|
|
if (dDist1 < 1.6e-1) //将接口判断连接精度由1.e-3改为2.e-1
|
|
{
|
|
// 如果起始接口和第一个管件连接
|
|
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface))
|
|
{
|
|
GetInterfaceSizeData(0,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
// 如果起始接口和第二个管件连接
|
|
if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface))
|
|
{
|
|
GetInterfaceSizeData(0,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
// 没有管件连接
|
|
pipeInterface.SetOutDir(vtStart);
|
|
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
|
|
pipeInterface.SetPosition(ptStart);
|
|
GetInterfaceSizeData(0,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
|
|
// 位于末尾点
|
|
if (dDist2 < 1.6e-1) //将接口判断连接精度由1.e-3改为2.e-1
|
|
{
|
|
// 如果末尾接口和第一个管件连接
|
|
if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface))
|
|
{
|
|
GetInterfaceSizeData(1,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
// 如果末尾接口和第二个管件连接
|
|
if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface))
|
|
{
|
|
GetInterfaceSizeData(1,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
// 没有管件连接
|
|
pipeInterface.SetOutDir(vtEnd);
|
|
pipeInterface.SetOwnerId(m_pOwnerEnt->objectId());
|
|
pipeInterface.SetPosition(ptEnd);
|
|
GetInterfaceSizeData(1,pipeInterface);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacValve::HasInterface(const AcGePoint3d& ptCon,const AcGeVector3d& vtDir)
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
// 获取各点位置
|
|
AcGePoint3d ptStart, ptCorner, ptEnd;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCorner);
|
|
ptStart = GetStartPt();
|
|
ptEnd = GetEndPt();
|
|
|
|
// 求两端方向
|
|
AcGeVector3d vtStart, vtEnd;
|
|
vtStart = ptStart - ptCorner;
|
|
vtEnd = ptEnd - ptCorner;
|
|
|
|
// 计算测试点到始末点的距离
|
|
double dDist1 = ptCon.distanceTo(ptStart);
|
|
double dDist2 = ptCon.distanceTo(ptEnd);
|
|
|
|
// 位于起始点
|
|
if (dDist1 < 1.e-3)
|
|
return (vtDir.isParallelTo(vtStart));
|
|
|
|
// 位于末尾点
|
|
if (dDist2 < 1.e-3)
|
|
return (vtDir.isParallelTo(vtEnd));
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
int THImpHvacValve::GetInterfaceCount() const
|
|
{
|
|
return 2;
|
|
}
|
|
|
|
BOOL THImpHvacValve::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, ptCorner, ptEnd;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCorner);
|
|
ptStart = GetStartPt();
|
|
ptEnd = GetEndPt();
|
|
|
|
// 求两端方向
|
|
AcGeVector3d vtStart, vtEnd;
|
|
vtStart = ptStart - ptCorner;
|
|
vtEnd = ptEnd - ptCorner;
|
|
|
|
// 计算测试点到始末点的距离
|
|
double dDist1 = ptConnect.distanceTo(ptStart);
|
|
double dDist2 = ptConnect.distanceTo(ptEnd);
|
|
|
|
// 基类指针
|
|
TDbInterfacesObj* pInterfaceObj = TDbInterfacesObj::cast(pEnt);
|
|
ASSERT(NULL != pInterfaceObj);
|
|
|
|
// 位于起始点
|
|
if (dDist1 < 1.e-3 && pInterfaceObj->HasInterface(ptStart, vtStart))
|
|
{
|
|
m_pXDataMap->SetAt(KEY_IDCNT1, idConnect);
|
|
pEnt->close();
|
|
return TRUE;
|
|
}
|
|
|
|
// 位于末尾点
|
|
if (dDist2 < 1.e-3 && pInterfaceObj->HasInterface(ptEnd, vtEnd))
|
|
{
|
|
m_pXDataMap->SetAt(KEY_IDCNT2, idConnect);
|
|
pEnt->close();
|
|
return TRUE;
|
|
}
|
|
|
|
pEnt->close();
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacValve::RemoveInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect)
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
// 浅层次删除; 命名字典中的关系,需要外面移除关系,只移除内部关系
|
|
AcDbObjectId id;
|
|
m_pXDataMap->GetAt(KEY_IDCNT1, id);
|
|
if (id == idConnect)
|
|
{
|
|
m_pXDataMap->SetAt(KEY_IDCNT1, AcDbObjectId::kNull);
|
|
return TRUE;
|
|
}
|
|
|
|
m_pXDataMap->GetAt(KEY_IDCNT2, id);
|
|
if (id == idConnect)
|
|
{
|
|
m_pXDataMap->SetAt(KEY_IDCNT2, AcDbObjectId::kNull);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL THImpHvacValve::NotifyInterfaceToModify(const TInterfaceModifyMsg& iModiMsg,TInterfaceModifyMsgs& iModiMsgs)
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
|
|
// 获得消息传递设置, 确定是否传递消息
|
|
CString sDispatch = _T("0");
|
|
GetGlobalContext(KEY_DISPATCHMSG, sDispatch);
|
|
BOOL bDispatch = (_ttoi(sDispatch) != 0);
|
|
|
|
BOOL bMsgTranslate = FALSE;
|
|
// 获得消息类型, 根据消息类型处理
|
|
TDb::InterfaceOper eOper = iModiMsg.GetInterfaceOper();
|
|
switch (eOper)
|
|
{
|
|
case TDb::eMoveGripPoint:
|
|
// 夹点移动消息处理
|
|
bMsgTranslate = OnMoveGripPointMsgNotify(iModiMsg, iModiMsgs);
|
|
break;
|
|
case TDb::eTransformBy:
|
|
// 对象移动消息处理
|
|
bMsgTranslate = OnTransformMsgNotify(iModiMsg, iModiMsgs);
|
|
break;
|
|
case TDb::eSize:
|
|
// 尺寸调整消息处理
|
|
bMsgTranslate = OnSizeMsgNotify(iModiMsg, iModiMsgs);
|
|
break;
|
|
default:
|
|
return bMsgTranslate;
|
|
}
|
|
|
|
// 记录修改标识
|
|
if (m_pOwnerEnt != NULL)
|
|
m_pOwnerEnt->recordGraphicsModified();
|
|
|
|
return bMsgTranslate;
|
|
}
|
|
|
|
BOOL THImpHvacValve::OnMoveGripPointMsgNotify( const TInterfaceModifyMsg& iModiMsg,
|
|
TInterfaceModifyMsgs& iModiMsgs )
|
|
{
|
|
if (!TAuxTools::IsAutoWorkOffset())
|
|
return FALSE;
|
|
|
|
ASSERT(NULL != m_pXDataMap);
|
|
|
|
AcDbObjectId id = iModiMsg.GetMsgOperateOn();
|
|
if (id != m_pOwnerEnt->objectId()) // 消息发送目标正确
|
|
return FALSE;
|
|
|
|
AcGeVector3d vtOffset = iModiMsg.GetMoveGripOffset();
|
|
if (vtOffset.isZeroLength())
|
|
return FALSE;
|
|
|
|
BOOL bMsgTranslate = FALSE;
|
|
AcGePoint3d ptCenter;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
AcGePoint3d ptGeStart = GetStartPt();
|
|
AcGePoint3d ptGeEnd = GetEndPt();
|
|
|
|
|
|
int nPos = iModiMsg.GetGripPosition();
|
|
if (nPos == eStart || nPos == eMid || nPos == eEnd || nPos == eBr1 || nPos == eBr2)
|
|
{
|
|
AcGeVector3d vtSta, vtEnd;
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtEnd);
|
|
vtSta = -vtEnd;
|
|
|
|
ptCenter += vtOffset;
|
|
AcGePoint3d ptDim, ptLable;
|
|
m_pXDataMap->GetAt(HVLV_DimPoint, ptDim);
|
|
m_pXDataMap->GetAt(HVLV_LabelPoint, ptLable);
|
|
|
|
AcGeMatrix3d mtTrans;
|
|
mtTrans.setTranslation(vtOffset);
|
|
ptDim.transformBy(mtTrans);
|
|
ptLable.transformBy(mtTrans);
|
|
|
|
m_pXDataMap->SetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->SetAt(HVLV_DimPoint, ptDim);
|
|
m_pXDataMap->SetAt(HVLV_LabelPoint, ptLable);
|
|
|
|
// 构造接口消息传递 开始端检查
|
|
AcDbObjectId idT;
|
|
if (FindConnect(ptGeStart, vtSta, m_pOwnerEnt->objectId(), idT)) // sta 点的接口
|
|
{
|
|
TInterfaceModifyMsg msg;
|
|
msg.SetMsgPoint(ptGeStart);
|
|
msg.SetMoveGripOffset(vtOffset);
|
|
msg.SetMsgOperateOn(idT);
|
|
msg.SetGripPosition(eStart);
|
|
iModiMsgs.append(msg);
|
|
bMsgTranslate = TRUE;
|
|
}
|
|
|
|
// 构造接口消息传递 末端检查
|
|
if (FindConnect(ptGeEnd, vtEnd, m_pOwnerEnt->objectId(), idT)) // end 点的接口
|
|
{
|
|
TInterfaceModifyMsg msg;
|
|
msg.SetMsgPoint(ptGeEnd);
|
|
msg.SetMoveGripOffset(vtOffset);
|
|
msg.SetMsgOperateOn(idT);
|
|
msg.SetGripPosition(eEnd);
|
|
iModiMsgs.append(msg);
|
|
bMsgTranslate = TRUE;
|
|
}
|
|
|
|
// 更新模型空间的扩展字典的注册的接口数据
|
|
AcGeMatrix3d xform;
|
|
xform.setToTranslation(vtOffset);
|
|
UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform);
|
|
}
|
|
|
|
return bMsgTranslate;
|
|
}
|
|
|
|
BOOL THImpHvacValve::OnTransformMsgNotify( const TInterfaceModifyMsg& iModiMsg,
|
|
TInterfaceModifyMsgs& iModiMsgs )
|
|
{
|
|
if (!TAuxTools::IsAutoWorkOffset())
|
|
return FALSE;
|
|
|
|
ASSERT(NULL != m_pXDataMap);
|
|
|
|
BOOL bMsgTranslate = FALSE;
|
|
|
|
AcDbObjectId id = iModiMsg.GetMsgOperateOn();
|
|
if (id != m_pOwnerEnt->objectId()) // 消息发送目标正确
|
|
return FALSE;
|
|
|
|
AcGeMatrix3d mtTrans = iModiMsg.GetTransform();
|
|
AcGeVector3d vtSta, vtEnd;
|
|
AcGePoint3d ptStart, ptEnd, ptCenter, ptLable, ptDim;
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtEnd);
|
|
vtSta = -vtEnd;
|
|
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_DimPoint, ptDim);
|
|
m_pXDataMap->GetAt(HVLV_LabelPoint, ptLable);
|
|
ptStart = GetStartPt();
|
|
ptEnd = GetEndPt();
|
|
|
|
ptCenter.transformBy(mtTrans);
|
|
ptDim.transformBy(mtTrans);
|
|
ptLable.transformBy(mtTrans);
|
|
m_pXDataMap->SetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->SetAt(HVLV_DimPoint, ptDim);
|
|
m_pXDataMap->SetAt(HVLV_LabelPoint, ptLable);
|
|
|
|
// 构造接口消息传递 开始端检查
|
|
AcDbObjectId idT;
|
|
if (FindConnect(ptStart, vtSta, m_pOwnerEnt->objectId(), idT)) // sta 点的接口
|
|
{
|
|
TInterfaceModifyMsg msg;
|
|
msg.SetMsgPoint(ptStart);
|
|
msg.SetTransform(mtTrans);
|
|
msg.SetMsgOperateOn(idT);
|
|
iModiMsgs.append(msg);
|
|
bMsgTranslate = TRUE;
|
|
}
|
|
|
|
// 构造接口消息传递 末端检查
|
|
if (FindConnect(ptEnd, vtEnd, m_pOwnerEnt->objectId(), idT)) // end 点的接口
|
|
{
|
|
TInterfaceModifyMsg msg;
|
|
msg.SetMsgPoint(ptEnd);
|
|
msg.SetTransform(mtTrans);
|
|
msg.SetMsgOperateOn(idT);
|
|
iModiMsgs.append(msg);
|
|
bMsgTranslate = TRUE;
|
|
}
|
|
|
|
// 更新模型空间的扩展字典的注册的接口数据
|
|
UpdateInterfaceRec(m_pOwnerEnt->objectId(), mtTrans);
|
|
|
|
return bMsgTranslate;
|
|
}
|
|
|
|
BOOL THImpHvacValve::OnSizeMsgNotify( const TInterfaceModifyMsg& iModiMsg,
|
|
TInterfaceModifyMsgs& iModiMsgs )
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
|
|
// 尺寸
|
|
double dLength(0.0), dNewWidth(0.0), dNewThick(0.0);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
iModiMsg.GetSize(dNewWidth, dNewThick);
|
|
dLength *= 500;
|
|
|
|
// change by hh 2011-01-28 消声器固定出头150mm 消声器接口边与风管还无法做到保持吻合,暂不用(mcl,2011.3.16)
|
|
dNewWidth /= 1000;
|
|
// CString szName;
|
|
// m_pXDataMap->GetAt(HVLV_SEquipName, szName);
|
|
// if(-1 != szName.Find(_T("消声器")))
|
|
// {
|
|
// // 计算新的图块宽度比例
|
|
// double dBlkWidth = GetBlkOldWidth();
|
|
// dNewWidth = (dNewWidth + 2 * FIXED_SILENCER_EXTEND) / dBlkWidth;
|
|
// }
|
|
// else
|
|
// {
|
|
// dNewWidth /= 1000;
|
|
// }
|
|
|
|
// 原始点及主向量
|
|
AcGePoint3d ptOrigCenter, ptOrigStart, ptOrigEnd, ptOrigLable;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptOrigCenter);
|
|
m_pXDataMap->GetAt(HVLV_LabelPoint, ptOrigLable);
|
|
AcGeVector3d vtMain(AcGeVector3d::kXAxis);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
vtMain.normalize();
|
|
ptOrigStart = ptOrigCenter - vtMain * dLength * 0.5;
|
|
ptOrigEnd = ptOrigStart + vtMain * dLength;
|
|
|
|
// 求新点
|
|
AcGeVector3d vtOff = iModiMsg.GetMoveGripOffset();
|
|
AcGePoint3d ptNewStart = ptOrigStart + vtOff;
|
|
AcGePoint3d ptNewEnd = ptOrigEnd + vtOff;
|
|
AcGePoint3d ptNewCenter = ptOrigCenter + vtOff;
|
|
AcGePoint3d ptNewLable = ptOrigLable + vtOff;
|
|
m_pXDataMap->SetAt(HVLV_Width, dNewWidth);
|
|
m_pXDataMap->SetAt(HVLV_Thick, dNewThick);
|
|
m_pXDataMap->SetAt(HVLV_CenterPoint, ptNewCenter);
|
|
m_pXDataMap->SetAt(HVLV_LabelPoint, ptNewLable);
|
|
|
|
// 消息传递
|
|
AcDbObjectId idFind;
|
|
if (FindConnect(ptOrigStart, vtMain, m_pOwnerEnt->objectId(), idFind)) // sta 点的接口
|
|
{
|
|
TInterfaceModifyMsg iMsg = iModiMsg;
|
|
iMsg.SetMsgOperateOn(idFind);
|
|
iMsg.SetMsgPoint(ptOrigStart);
|
|
iModiMsgs.append(iMsg);
|
|
}
|
|
|
|
if (FindConnect(ptOrigEnd, vtMain, m_pOwnerEnt->objectId(), idFind)) // End 点的接口
|
|
{
|
|
TInterfaceModifyMsg iMsg = iModiMsg;
|
|
iMsg.SetMsgOperateOn(idFind);
|
|
iMsg.SetMsgPoint(ptOrigEnd);
|
|
iModiMsgs.append(iMsg);
|
|
}
|
|
|
|
((TDbInterfacesObj*)m_pOwnerEnt)->UpdateInterfaceRec(ptOrigStart, ptNewStart);
|
|
((TDbInterfacesObj*)m_pOwnerEnt)->UpdateInterfaceRec(ptOrigEnd, ptNewEnd);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL THImpHvacValve::MakeCurves(TComplexCurve& cplCurve) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return FALSE;
|
|
int nIsBreakPipe(0);
|
|
int nHasEndLine(1);
|
|
int nIsDuctCap(0);
|
|
m_pXDataMap->GetAt(HVLV_IsBreakPipe, nIsBreakPipe);
|
|
m_pXDataMap->GetAt(HVLV_HasEndLine, nHasEndLine);
|
|
//是否是管帽
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsDuctCap);
|
|
if (nIsDuctCap == 2)
|
|
return FALSE;
|
|
AcGePoint3dArray arPts;
|
|
GetBoxPts(arPts);
|
|
double dEdgeWidth = GetEdgeLineWidth();
|
|
AcDbObjectId idEdgeLayer(NULL);
|
|
m_pXDataMap->GetAt(HVLV_DuctLayer, idEdgeLayer);
|
|
TDb::TCurveElement el;
|
|
memset(&el,0,sizeof(TDb::TCurveElement));
|
|
|
|
//风管上下边线
|
|
if (nIsBreakPipe == 1)
|
|
{
|
|
el.idSubLay = idEdgeLayer;
|
|
el.dWidth = dEdgeWidth;
|
|
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);
|
|
}
|
|
//风阀端线如果插在风管上与风管端线相同
|
|
if (nHasEndLine == 1)
|
|
{
|
|
AcDbObjectId idSideLayer(AcDbObjectId::kNull);
|
|
m_pXDataMap->GetAt(HVAC_EndLayer, idSideLayer);
|
|
if (idSideLayer != AcDbObjectId::kNull)
|
|
{
|
|
double dEndLineWidth = GetEndLineWidth();
|
|
el.idSubLay = idSideLayer;
|
|
el.dWidth = dEndLineWidth;
|
|
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);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL THImpHvacValve::GetCurvesInSide(TComplexCurve& compCurve) const
|
|
{
|
|
// 取得普通方式绘制的所有实体
|
|
AcDbVoidPtrArray arFirst, arSecond;
|
|
XExplodeStream dc(arFirst);
|
|
|
|
AcDbObjectId id3D;
|
|
AcGePoint3d ptCenter;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(/*HVLV_Part3D*/HVLV_PartCenter, id3D);
|
|
AcDbObjectIdArray arobjs;
|
|
ExplodeBlock(dc, id3D, ptCenter, arobjs);
|
|
|
|
// 取得轮廓线条
|
|
TComplexCurve curExclude;
|
|
MakeCurves(curExclude);
|
|
|
|
// 创建一个临时的WorldDraw 以接受图元信息
|
|
TDbEquWorldDraw wDraw;
|
|
wDraw.SetComplexCurvePtr(&compCurve);
|
|
wDraw.SetExcluding(curExclude);
|
|
// 图块数据转换为图元信息
|
|
AcDbEntity *pEnt = NULL;
|
|
AcDbEntity *pEnt2 = NULL, *pEnt3 = NULL;
|
|
AcDbBlockReference* pRef = NULL;
|
|
int iLen, iLen1;
|
|
for (int i = 0; i < arFirst.length(); ++i)
|
|
{
|
|
pEnt = (AcDbEntity*)arFirst[i];
|
|
if (NULL == pEnt)
|
|
continue;
|
|
if(pEnt->isKindOf(AcDbBlockReference::desc()))
|
|
{
|
|
pRef = (AcDbBlockReference*)pEnt;
|
|
pRef->explode(arSecond);
|
|
iLen = arSecond.length();
|
|
for(int j = 0; j < iLen; j++)
|
|
{
|
|
pEnt2 = (AcDbEntity*)arSecond[j];
|
|
if(NULL == pEnt2)
|
|
continue;
|
|
#if ADS > 19
|
|
AcDbVoidPtrArray arThird;
|
|
if (pEnt2->isKindOf(AcDbHatch::desc()))
|
|
{
|
|
AcDbHatch *pHatch = (AcDbHatch*)pEnt2;
|
|
pHatch->explode(arThird);
|
|
iLen1 = arThird.length();
|
|
for(int k = 0; k < iLen1; ++k)
|
|
{
|
|
pEnt3 = (AcDbEntity*)arThird[k];
|
|
pEnt3->worldDraw(&wDraw);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wDraw.VirtualWordDraw(pEnt2);
|
|
}
|
|
#else
|
|
wDraw.VirtualWordDraw(pEnt2);
|
|
#endif
|
|
// 排除点
|
|
/*if (pEnt2->isKindOf(AcDbPoint::desc()))
|
|
continue;
|
|
if(!pEnt2->isKindOf(AcDbText::desc()))
|
|
pEnt2->worldDraw(&wDraw);*/
|
|
delete pEnt2;
|
|
}
|
|
arSecond.setLogicalLength(0);
|
|
}
|
|
else
|
|
{
|
|
wDraw.VirtualWordDraw(pEnt);
|
|
// pEnt->worldDraw(&wDraw);
|
|
}
|
|
delete pEnt;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
AcDbPolyline* THImpHvacValve::MakePolyCurve() const
|
|
{
|
|
//
|
|
//
|
|
// 1 ┃━━━━━┃ 3
|
|
// ┃ ┃
|
|
// ┃ 0 ┃
|
|
// ┃ ┃
|
|
// 2 ┃━━━━━┃ 4
|
|
//
|
|
//
|
|
// 获取各点位置
|
|
AcDbPolyline* pPolyLine = NULL;
|
|
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()));
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_Thick, dThick);
|
|
|
|
//是否是管帽
|
|
int nIsDuctCap(0);
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsDuctCap);
|
|
if (nIsDuctCap == 2)
|
|
return NULL;
|
|
|
|
dLength *= 500;
|
|
dWidth *= 1000;
|
|
|
|
if (dLength < 1)
|
|
dLength = 1.0;
|
|
if (dWidth < 1)
|
|
dWidth = 1.0;
|
|
if (dThick < 1)
|
|
dThick = 1.0;
|
|
|
|
HvacSectType eSect = eRectangular;
|
|
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect);
|
|
if (eSect == eCircular)
|
|
dThick = dWidth;
|
|
|
|
vtMainv = vtMain;
|
|
vtMainv.rotateBy(PI * 0.5, vtNor);
|
|
vtMain.normalize();
|
|
vtMainv.normalize();
|
|
|
|
pt1 = ptCenter + vtMainv * dWidth * 0.5;
|
|
pt1 = pt1 - vtMain * dLength *0.5;
|
|
pt1 = pt1 - vtNor * dThick *0.5;
|
|
pt2 = ptCenter - vtMainv * dWidth * 0.5;
|
|
pt2 = pt2 - vtMain * dLength *0.5;
|
|
pt2 = pt2 - vtNor * dThick *0.5;
|
|
|
|
pt3 = pt1 + vtMain * dLength;
|
|
pt4 = pt2 + vtMain * dLength;
|
|
ptU1 = pt1 + vtNor * dThick;
|
|
ptU2 = pt2 + vtNor * dThick;
|
|
ptU3 = pt3 + vtNor * dThick;
|
|
ptU4 = pt4 + vtNor * dThick;
|
|
AcGePoint3dArray arpts;
|
|
BOOL bCircle(FALSE);
|
|
|
|
// mcl changed by below 2010.07.28.纠正对于,俯视跟前后视图的错误判断
|
|
// if (vtNor.angleTo(vtZAxis) < PI*0.25 || vtNor.angleTo(-vtZAxis) < PI*0.25)
|
|
// {
|
|
// arpts.append(pt1);
|
|
// arpts.append(pt2);
|
|
// arpts.append(pt4);
|
|
// arpts.append(pt3);
|
|
// }
|
|
// else 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);
|
|
//
|
|
// if (eSect == eCircular)
|
|
// bCircle = TRUE;
|
|
// }
|
|
// 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);
|
|
// }
|
|
|
|
if (vtMain.angleTo(vtZAxis) < PI*0.25 || vtMain.angleTo(vtZAxis) > PI*0.75) // 竖向,有可能圆形
|
|
{
|
|
ptU2.z = pt2.z = ptU1.z = pt1.z = ptCenter.z;
|
|
arpts.append(ptU2);
|
|
arpts.append(pt2);
|
|
arpts.append(pt1);
|
|
arpts.append(ptU1);
|
|
|
|
if (eSect == eCircular)
|
|
bCircle = TRUE;
|
|
}
|
|
else
|
|
{
|
|
if (vtNor.angleTo(vtZAxis) < PI*0.25 || vtNor.angleTo(-vtZAxis) < PI*0.25) // 常规俯视图
|
|
{
|
|
// add by zh 2013-6-6 常规俯视图标高修改一致 解决无法兰风管移动阀门不联动
|
|
pt1.z = pt2.z = pt4.z = pt3.z = ptCenter.z;
|
|
//
|
|
arpts.append(pt1);
|
|
arpts.append(pt2);
|
|
arpts.append(pt4);
|
|
arpts.append(pt3);
|
|
}
|
|
else // 前后侧视图
|
|
{
|
|
ptU1.z = pt1.z = ptU3.z = pt3.z = ptCenter.z;
|
|
arpts.append(ptU1);
|
|
arpts.append(pt1);
|
|
arpts.append(pt3);
|
|
arpts.append(ptU3);
|
|
}
|
|
}
|
|
|
|
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().angleTo(plan.normal()) > PI*0.5)
|
|
dEl *= -1.0;
|
|
|
|
pPolyLine = new AcDbPolyline;
|
|
if (bCircle)
|
|
{
|
|
AcGePoint3d ptC1(TAuxTools::Mid(arpts[0], arpts[1]));
|
|
AcGePoint3d ptC2(TAuxTools::Mid(arpts[2], arpts[3]));
|
|
pPolyLine->addVertexAt(0, ptC1.convert2d(plan), 1);
|
|
pPolyLine->addVertexAt(1, ptC2.convert2d(plan), 1);
|
|
}
|
|
else
|
|
{
|
|
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());
|
|
|
|
return pPolyLine;
|
|
}
|
|
|
|
BOOL THImpHvacValve::MakePolyCurveFaces(AcDbVoidPtrArray& arFaces)
|
|
{
|
|
//
|
|
//
|
|
// 1 ┃━━━━━┃ 3
|
|
// ┃ ┃
|
|
// ┃ 0 ┃
|
|
// ┃ ┃
|
|
// 2 ┃━━━━━┃ 4
|
|
//
|
|
//
|
|
// 获取各点位置
|
|
AcGePoint3d pt1, pt2, pt3, pt4, ptCenter;
|
|
AcGeVector3d vtMain, vtNor, vtMainv;
|
|
AcDbDatabase* pDb = acdbCurDwg();
|
|
AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir()));
|
|
double dLength(50.0), dThick(50.0), dWidth(50.0), dPlusEdge(50.0);
|
|
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);
|
|
dLength *= 500;
|
|
dWidth *= 1000;
|
|
|
|
//是否是管帽
|
|
int nIsDuctCap(0);
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsDuctCap);
|
|
if (nIsDuctCap == 2)
|
|
return FALSE;
|
|
|
|
vtMainv = vtMain;
|
|
vtMainv.rotateBy(PI * 0.5, vtZAxis);
|
|
vtMain.normalize();
|
|
vtMainv.normalize();
|
|
|
|
if (IsParallelToX())
|
|
{
|
|
dLength = dThick;
|
|
}
|
|
else if (IsParallelToY())
|
|
{
|
|
dWidth = dThick;
|
|
}
|
|
|
|
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;
|
|
AcDbFace * pFace = new AcDbFace;
|
|
pFace->setVertexAt(0,pt1);
|
|
pFace->setVertexAt(1,pt2);
|
|
pFace->setVertexAt(2,pt4);
|
|
pFace->setVertexAt(3,pt3);
|
|
arFaces.append(pFace);
|
|
|
|
return arFaces.length() > 0;
|
|
}
|
|
|
|
void THImpHvacValve::GetKindName(CString& sName)
|
|
{
|
|
sName = _T("TCH_HVALVE");
|
|
}
|
|
|
|
BOOL THImpHvacValve::GetGeomExtentsEdge(TComplexCurve& crLoop)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
TDb::Position THImpHvacValve::ExplainGripIndex(int nIndex) const
|
|
{
|
|
switch(nIndex)
|
|
{
|
|
case 0:
|
|
{
|
|
return TDb::eStart;
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
return TDb::eEnd;
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
return TDb::eMid;
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
return TDb::eCommand0;
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
return TDb::eCommand1;
|
|
break;
|
|
}
|
|
case 5:
|
|
{
|
|
return TDb::eAdjust0;
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
CString sLabel, sDim;
|
|
m_pXDataMap->GetAt(HVLV_LabelText, sLabel);
|
|
m_pXDataMap->GetAt(HVLV_DimText, sDim);
|
|
if (sLabel.IsEmpty())
|
|
{
|
|
if(sDim.IsEmpty())
|
|
return TDb::eDim0;
|
|
else
|
|
return TDb::eDim2;
|
|
}
|
|
return TDb::eDim1;
|
|
break;
|
|
}
|
|
case 7:
|
|
{
|
|
CString sLabel, sDim;
|
|
m_pXDataMap->GetAt(HVLV_LabelText, sLabel);
|
|
m_pXDataMap->GetAt(HVLV_DimText, sDim);
|
|
if(sDim.IsEmpty())
|
|
{
|
|
return TDb::eDim0;
|
|
}
|
|
else if(!sLabel.IsEmpty())
|
|
{
|
|
return TDb::eDim2;
|
|
}
|
|
return TDb::eDim0;
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
// add by hh 2013-8-29 使用Dim0作为阀门代号点
|
|
return TDb::eDim0;
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return TDb::eMid;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::GetGripText(int i, CString &cs) const
|
|
{
|
|
switch(i)
|
|
{
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
{
|
|
cs = _T("移动");
|
|
break;
|
|
}
|
|
case 3:
|
|
case 4:
|
|
{
|
|
//TDb::eCommand0;
|
|
cs = _T("启动绘制命令");
|
|
break;
|
|
}
|
|
case 5:
|
|
{
|
|
cs = _T("改变方向");
|
|
break;
|
|
}
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
{
|
|
cs = _T("移动文字");
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
void THImpHvacValve::GetTips(CMapStringToString& mapLable2Tip) const
|
|
{
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::ExplodeOrDraw3d(XExplodeDraw &mode) const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
|
|
AcDbObjectId idCen,id3D;
|
|
AcGePoint3d ptCenter;
|
|
int nIsDuctCap(0);
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_PartCenter, idCen);
|
|
m_pXDataMap->GetAt(HVLV_Part3D, id3D);
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsDuctCap);
|
|
AcDbObjectIdArray arobjs;
|
|
ExplodeBlock(mode,id3D,ptCenter,arobjs,1);
|
|
if (id3D == idCen && nIsDuctCap == 0)
|
|
{
|
|
TDb::HvacSectType eSectType = TDb::eRectangular;
|
|
m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType);
|
|
double dThick(0.0);
|
|
m_pXDataMap->GetAt(HVLV_Thick, dThick);
|
|
AcGeVector3d vtNor = GetNormal();
|
|
//方截面
|
|
if (eSectType == TDb::eRectangular)
|
|
{
|
|
AcGePoint3dArray arPts,arptSides;
|
|
GetBoxPts(arPts);
|
|
arptSides.setLogicalLength(0);
|
|
arptSides.append(arPts[1] + vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[1] - vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[4] + vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[4] - vtNor * dThick * 0.5);
|
|
mode.DrawMesh(2, 2, arptSides.asArrayPtr());
|
|
arptSides.setLogicalLength(0);
|
|
arptSides.append(arPts[2] + vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[2] - vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[3] + vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[3] - vtNor * dThick * 0.5);
|
|
mode.DrawMesh(2, 2, arptSides.asArrayPtr());
|
|
|
|
arptSides.setLogicalLength(0);
|
|
arptSides.append(arPts[1] + vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[1] - vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[2] + vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[2] - vtNor * dThick * 0.5);
|
|
mode.DrawMesh(2, 2, arptSides.asArrayPtr());
|
|
arptSides.setLogicalLength(0);
|
|
arptSides.append(arPts[4] + vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[4] - vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[3] + vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[3] - vtNor * dThick * 0.5);
|
|
mode.DrawMesh(2, 2, arptSides.asArrayPtr());
|
|
arptSides.setLogicalLength(0);
|
|
arptSides.append(arPts[1] - vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[2] - vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[4] - vtNor * dThick * 0.5);
|
|
arptSides.append(arPts[3] - vtNor * dThick * 0.5);
|
|
mode.DrawMesh(2, 2, arptSides.asArrayPtr());
|
|
ptCenter = ptCenter + vtNor * (dThick * 0.5 + 10);
|
|
}
|
|
//圆
|
|
else
|
|
{
|
|
double dMinDiffAng = PI/12;
|
|
GetGlobalContext()->GetAt(KEY_MINDIFFANG,dMinDiffAng);
|
|
int nSect = int(PI * 2 / dMinDiffAng) + 1;
|
|
AcGePoint3dArray arptSides,arptSidesD;
|
|
AcGePoint3d pt;
|
|
double dDiameter(50.0);
|
|
double dLength(50.0);
|
|
AcGeVector3d vtMain;
|
|
m_pXDataMap->GetAt(HVLV_Diameter, dDiameter);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
|
|
//BEGIN=================================================
|
|
if (dLength < 2.e-4)
|
|
{
|
|
dLength = 2.e-4;
|
|
}
|
|
//END===================================================
|
|
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
dLength *= 500;
|
|
dDiameter *= 1000;
|
|
vtMain.normalize();
|
|
AcGePoint3d ptC;
|
|
ptC = ptCenter + vtMain * dLength * 0.5;
|
|
pt = ptC + vtNor * dDiameter * 0.5;
|
|
for (int i = 0; i < nSect; i++)
|
|
{
|
|
arptSides.append(pt);
|
|
pt.rotateBy(dMinDiffAng, vtMain, ptC);
|
|
}
|
|
ptC = ptCenter - vtMain * dLength * 0.5;
|
|
pt = ptC + vtNor * dDiameter * 0.5;
|
|
for (i = 0; i < nSect; i++)
|
|
{
|
|
arptSides.append(pt);
|
|
pt.rotateBy(dMinDiffAng, vtMain, ptC);
|
|
}
|
|
|
|
mode.DrawMesh(2, nSect, arptSides.asArrayPtr());
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
AcGeVector3d THImpHvacValve::GetNormal() const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
AcGeVector3d vtNor;
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
|
|
return vtNor.normalize();
|
|
}
|
|
|
|
AcGePoint3d THImpHvacValve::GetStartPt() const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
// 获取各点位置
|
|
AcGePoint3d ptCenter;
|
|
AcGeVector3d vtMain;
|
|
double dLength(50.0),dOLength(500.0);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
|
|
//BEGIN=========================================
|
|
if (dLength < 2.e-4)
|
|
{
|
|
dLength = 2.e-4;
|
|
}
|
|
//END===========================================
|
|
|
|
vtMain.normalize();
|
|
|
|
dOLength = GetBlkOldLength();
|
|
dLength *= dOLength;
|
|
return ptCenter - vtMain * dLength * 0.5;
|
|
}
|
|
|
|
AcGePoint3d THImpHvacValve::GetEndPt() const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
// 获取各点位置
|
|
AcGePoint3d ptCenter;
|
|
AcGeVector3d vtMain;
|
|
double dLength(50.0),dOLength(500.0);
|
|
AcDbObjectId id = AcDbObjectId::kNull;
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
|
|
//BEGIN=========================================
|
|
if (dLength < 2.e-4)
|
|
{
|
|
dLength = 2.e-4;
|
|
}
|
|
//END===========================================
|
|
|
|
vtMain.normalize();
|
|
|
|
dOLength = GetBlkOldLength();
|
|
|
|
dLength *= dOLength;
|
|
return ptCenter + vtMain * dLength * 0.5;
|
|
}
|
|
|
|
AcGePoint3d THImpHvacValve::GetHandPt() const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
// 获取各点位置
|
|
AcGePoint3d ptCenter;
|
|
AcGeVector3d vtMain;
|
|
double dWidth(50.0);
|
|
double dLength(50.0);
|
|
int nType(1);
|
|
int bMirror(0);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, bMirror);
|
|
if (nType == 1)
|
|
{
|
|
AcGePoint3d pt;
|
|
vtMain.normalize();
|
|
if (bMirror == 0)
|
|
{
|
|
pt = ptCenter + vtMain * dLength * 0.5;
|
|
}
|
|
else
|
|
{
|
|
pt = ptCenter - vtMain * dLength * 0.5;
|
|
}
|
|
vtMain.rotateBy(PI * 0.5,GetNormal());
|
|
vtMain.normalize();
|
|
pt = pt + vtMain * dWidth * 0.35;
|
|
return pt;
|
|
}
|
|
vtMain.rotateBy(PI * 0.5,GetNormal());
|
|
vtMain.normalize();
|
|
return ptCenter + vtMain * dWidth * 0.5;
|
|
}
|
|
|
|
AcGePoint3d THImpHvacValve::GetLabelPt() const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
// 获取各点位置
|
|
AcGePoint3d ptCenter;
|
|
double dLength;
|
|
AcGeVector3d vtMain;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
ptCenter += vtMain * (dLength * 0.5 + 150);
|
|
return ptCenter;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::ExplodeOrDraw2d(XExplodeDraw &mode) const
|
|
{
|
|
if (m_pXDataMap == NULL)
|
|
{
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
AcGePoint3d ptCenter;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
AcDbObjectId idCen;
|
|
m_pXDataMap->GetAt(HVLV_PartCenter, idCen);
|
|
int iSectType = -1;
|
|
m_pXDataMap->GetAt(HVAC_SectType, iSectType);
|
|
if (iSectType == TDb::eCircular)
|
|
{
|
|
double dTmp = 0.0;
|
|
m_pXDataMap->GetAt(HVLV_Width, dTmp);
|
|
m_pXDataMap->SetAt(HVLV_Thick, dTmp);
|
|
m_pXDataMap->SetAt(HVLV_Diameter, dTmp);
|
|
}
|
|
DrawText(mode);
|
|
TArchPerDocData *pDocData = GetCurDocData();
|
|
if (NULL != pDocData)
|
|
{
|
|
XString &sCmd = pDocData->m_sCurCommand;
|
|
//if (mode.IsFullExplode() || 0 == _tcsicmp(sCmd, _T("explode")))
|
|
if (XExplodeStream::m_bExportTch4 || 0 == _tcsicmp(sCmd, _T("explode")))
|
|
{// add by cq 2017-08-07 导出T3和炸开时 尽量少绘制实体 不走GetCurvesInSide绘制
|
|
AcDbObjectIdArray arobjs;
|
|
ExplodeBlock(mode,idCen,ptCenter,arobjs);
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
//kyf add判断是否是消声器
|
|
BOOL THImpHvacValve::IsSilencer(AcDbObjectId idBlock) const
|
|
{
|
|
AcDbObject* pBlockEnt = NULL;
|
|
if(Acad::eOk != acdbOpenObject(pBlockEnt, idBlock, AcDb::kForRead))
|
|
return FALSE;
|
|
AcDbBlockTableRecord * pBlockTableRecord = AcDbBlockTableRecord::cast(pBlockEnt);
|
|
if(NULL == pBlockTableRecord)
|
|
{
|
|
pBlockEnt->close();
|
|
return FALSE;
|
|
}
|
|
pBlockEnt->close();
|
|
LPTSTR pszName = NULL;
|
|
pBlockTableRecord->getName(pszName);
|
|
if(NULL == pszName)
|
|
return FALSE;
|
|
|
|
CString sName = pszName;
|
|
int nIndex = sName.ReverseFind(_T('$'));
|
|
sName = sName.Mid(nIndex + 1);
|
|
|
|
return (0 == sName.CompareNoCase(_T("00000599"))
|
|
|| 0 == sName.CompareNoCase(_T("00000600"))
|
|
|| 0 == sName.CompareNoCase(_T("00000606")));
|
|
}
|
|
// kyf add
|
|
// 处理消声器超出风管边线的尺寸
|
|
Acad::ErrorStatus THImpHvacValve::ExplodeBlockSilen(XExplodeDraw &mode, AcDbObjectId idBlock,
|
|
AcGePoint3d ptBase, AcDbObjectIdArray& arObjs, int nType) const
|
|
{
|
|
if (nType == 0)
|
|
{
|
|
AcDbObject *pBlockEnt;
|
|
if (Acad::eOk != acdbOpenObject(pBlockEnt, idBlock, AcDb::kForRead))
|
|
return Acad::eNotImplementedYet;
|
|
AcDbBlockTableRecord * pBlockTableRecord = AcDbBlockTableRecord::cast(pBlockEnt);
|
|
if (pBlockTableRecord == NULL)
|
|
{
|
|
pBlockEnt->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
|
|
AcDbBlockTableRecordIterator* pIT;
|
|
if (Acad::eOk != pBlockTableRecord->newIterator( pIT ))
|
|
{
|
|
pBlockTableRecord->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
pBlockTableRecord->close();
|
|
AcDbEntity* pEnt = NULL;
|
|
AcDbObjectId idValve;
|
|
AcGePoint3d ptHand, ptCen, ptBlockbase;
|
|
AcDbBlockTableRecord *pBlockCen = NULL; // cent
|
|
AcDbBlockTableRecord *pBlockMis = NULL; // body
|
|
double dLineLen = 500.0;
|
|
BOOL bValve(FALSE);
|
|
//找到块中的阀芯
|
|
for ( ; !pIT->done(); pIT->step())
|
|
{
|
|
if (Acad::eOk == pIT->getEntity(pEnt, AcDb::kForRead))
|
|
{
|
|
AcDbBlockReference* pblcRfr = NULL;
|
|
pblcRfr = AcDbBlockReference::cast(pEnt);
|
|
if (pblcRfr != NULL)
|
|
{
|
|
idValve = pblcRfr->blockTableRecord();
|
|
if (acdbOpenObject(pBlockTableRecord, idValve, AcDb::kForRead) == Acad::eOk)
|
|
{
|
|
LPCTSTR pBlockName = NULL;
|
|
pBlockTableRecord->getName(pBlockName);
|
|
CString sBlockName = pBlockName;
|
|
|
|
// 图块名类似于 00000606Cent_UP / 00000606Cent
|
|
if(-1 != sBlockName.Find(_T('_')))
|
|
sBlockName = sBlockName.Right(7);
|
|
else
|
|
sBlockName = sBlockName.Right(4);
|
|
|
|
// cent
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKCEN))
|
|
{
|
|
pBlockCen = pBlockTableRecord;
|
|
ptCen = pblcRfr->position();
|
|
bValve = TRUE;
|
|
AcDbExtents ext;
|
|
ext.addBlockExt(pBlockCen);
|
|
dLineLen = ext.maxPoint().y - ext.minPoint().y;
|
|
}
|
|
// body
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKMIS))
|
|
{
|
|
pBlockMis = pBlockTableRecord;
|
|
ptBlockbase = pblcRfr->position();
|
|
bValve = TRUE;
|
|
}
|
|
pBlockTableRecord->close();
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
delete pIT;
|
|
//阀芯不存在则返回
|
|
if(NULL == pBlockCen)
|
|
{
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
if (bValve)
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dLength(50.0);
|
|
double dWidth(50.0);
|
|
AcGeVector3d vtMain;
|
|
AcGeVector3d vtMainv;
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
if (dLength < 2.e-4)
|
|
dLength = 2.e-4;
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
int bMirror(0);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, bMirror);
|
|
double dAngle = AcGeVector3d::kXAxis.angleTo(vtMain,GetNormal());
|
|
if (!(GetNormal().isParallelTo(AcGeVector3d::kZAxis)) && !(GetNormal().isPerpendicularTo(AcGeVector3d::kZAxis)))
|
|
dAngle = AcGeVector3d::kXAxis.angleTo(vtMain.orthoProject(AcGeVector3d::kZAxis), AcGeVector3d::kZAxis);
|
|
vtMainv = vtMain;
|
|
vtMainv.rotateBy(PI * 0.5, GetNormal());
|
|
vtMainv.normalize();
|
|
double dSize = 100.0;
|
|
m_pXDataMap->GetAt(HVLV_SilAddLen, dSize);
|
|
// 计算阀门实际高度
|
|
double dRealHeight = 1000 * dWidth;
|
|
//等比缩放按照最小的比例来缩放
|
|
double dScale = dLength;
|
|
if (dLength > dWidth)
|
|
dScale = dWidth;
|
|
double dScaler = dRealHeight + dSize * 2;
|
|
dScaler /= dLineLen;
|
|
//AcGeScale3d scale(dLength, dScaler , 1);
|
|
AcGeScale3d scale(dLength, dScaler , -1);// modify by cq 2016-06-29 多页阀门绘制与预览相反
|
|
AcGeScale3d scale1(dLength, dWidth, 1);
|
|
AcGeMatrix3d mat;
|
|
AcGePoint3d ptC,ptH;
|
|
ptC = ptBase;
|
|
// change by zh 2013-5-13
|
|
//if (1 == bMirror)
|
|
// scale[0] *= -1;
|
|
int nReverseX(0), nReverseY(0);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseX, nReverseX);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseY, nReverseY);
|
|
if ((1 == bMirror) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
scale[0] *= -1;
|
|
//
|
|
//阀芯
|
|
if (pBlockCen != NULL)
|
|
mode.DrawBlock(*pBlockCen, ptC, scale, dAngle, TRUE);
|
|
//其它非等比缩放的
|
|
if (pBlockMis != NULL)
|
|
{
|
|
//if (1 == bMirror) // change by zh 2013-5-13
|
|
if ((1 == bMirror) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
{
|
|
scale1.set(-dLength, dWidth, 1);
|
|
}
|
|
DelLabelText(pBlockMis);
|
|
mode.DrawBlock(*pBlockMis, ptBase, scale1, dAngle, TRUE);
|
|
}
|
|
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
Acad::ErrorStatus THImpHvacValve::ExplodeBlock(XExplodeDraw &mode, AcDbObjectId idBlock, AcGePoint3d ptBase, AcDbObjectIdArray& arObjs, int nType) const
|
|
{
|
|
// add by hh 2011-08-08 处理多叶阀等动态增减叶片数量的阀门
|
|
if(IsMultibladeValve(idBlock))
|
|
{
|
|
Acad::ErrorStatus es = ExplodeBlockEx(mode, idBlock, ptBase, arObjs, nType);
|
|
if(Acad::eOk == es) // 绘制成功时,直接返回,否则仍调用普通阀门的绘制
|
|
return es;
|
|
}
|
|
// add end
|
|
|
|
// add by kyf 绘制消声器
|
|
if (IsSilencer(idBlock))
|
|
{
|
|
Acad::ErrorStatus es = ExplodeBlockSilen(mode, idBlock, ptBase, arObjs, nType);
|
|
if (Acad::eOk == es)// 绘制成功时,直接返回
|
|
return es;
|
|
}
|
|
// add end
|
|
|
|
if (nType == 0)
|
|
{
|
|
AcDbObject *pBlockEnt;
|
|
if (acdbOpenObject(pBlockEnt, idBlock, AcDb::kForRead) != Acad::eOk)
|
|
return Acad::eNotImplementedYet;
|
|
AcDbBlockTableRecord * pBlockTableRecord = AcDbBlockTableRecord::cast(pBlockEnt);
|
|
if (pBlockTableRecord == NULL)
|
|
{
|
|
pBlockEnt->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
pBlockEnt->close();
|
|
AcDbBlockTableRecordIterator* pIT;
|
|
if (Acad::eOk != pBlockTableRecord->newIterator( pIT ))
|
|
{
|
|
pBlockTableRecord->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
pBlockTableRecord->close();
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
AcDbObjectId idValve;
|
|
AcGePoint3d ptHand, ptCen, ptBlockbase;
|
|
AcDbBlockTableRecord *pBlockCen = NULL;
|
|
AcDbBlockTableRecord *pBlockHan = NULL;
|
|
AcDbBlockTableRecord *pBlockMis = NULL;
|
|
BOOL bValve(FALSE);
|
|
//找到块中的阀芯等引用
|
|
for ( ; !pIT->done(); pIT->step())
|
|
{
|
|
if (Acad::eOk == pIT->getEntity(pEnt, AcDb::kForRead))
|
|
{
|
|
AcDbBlockReference* pblcRfr = NULL;
|
|
pblcRfr = AcDbBlockReference::cast(pEnt);
|
|
if (pblcRfr != NULL)
|
|
{
|
|
idValve = pblcRfr->blockTableRecord();
|
|
if (acdbOpenObject(pBlockTableRecord, idValve, AcDb::kForRead) == Acad::eOk)
|
|
{
|
|
LPCTSTR pBlockName = NULL;
|
|
pBlockTableRecord->getName(pBlockName);
|
|
CString sBlockName;
|
|
sBlockName = pBlockName;
|
|
sBlockName = sBlockName.Right(4);
|
|
//阀芯
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKCEN))
|
|
{
|
|
pBlockCen = pBlockTableRecord;
|
|
ptCen = pblcRfr->position();
|
|
bValve = TRUE;
|
|
}
|
|
//手柄
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKHAN))
|
|
{
|
|
pBlockHan = pBlockTableRecord;
|
|
ptHand = pblcRfr->position();
|
|
bValve = TRUE;
|
|
}
|
|
//其它非等比
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKMIS))
|
|
{
|
|
pBlockMis = pBlockTableRecord;
|
|
ptBlockbase = pblcRfr->position();
|
|
bValve = TRUE;
|
|
}
|
|
pBlockTableRecord->close();
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
delete pIT;
|
|
if (bValve)
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dLength(50.0);
|
|
double dWidth(50.0);
|
|
AcGeVector3d vtMain;
|
|
AcGeVector3d vtMainv;
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
|
|
//BEGIN=================================================
|
|
if (dLength < 2.e-4)
|
|
{
|
|
dLength = 2.e-4;
|
|
}
|
|
//END===================================================
|
|
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
int bMirror(0);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, bMirror);
|
|
|
|
double dAngle = AcGeVector3d::kXAxis.angleTo(vtMain,GetNormal());
|
|
// LixlAdd倾斜布置阀门,主向量须向XY平面投影,计算出来的图块旋转角度才会准确
|
|
if (!(GetNormal().isParallelTo(AcGeVector3d::kZAxis)) && !(GetNormal().isPerpendicularTo(AcGeVector3d::kZAxis)))
|
|
dAngle = AcGeVector3d::kXAxis.angleTo(vtMain.orthoProject(AcGeVector3d::kZAxis), AcGeVector3d::kZAxis);
|
|
|
|
vtMainv = vtMain;
|
|
vtMainv.rotateBy(PI * 0.5, GetNormal());
|
|
vtMainv.normalize();
|
|
// dLength *= 2.0;
|
|
double dScale = dLength;
|
|
double dOff = dLength - dWidth;
|
|
//等比缩放按照最小的比例来缩放
|
|
if (dLength > dWidth)
|
|
{
|
|
dScale = dWidth;
|
|
}
|
|
|
|
AcGeScale3d scale(dScale, dScale, 1);
|
|
AcGeScale3d scale1(dLength, dWidth, 1);
|
|
AcGeMatrix3d mat;
|
|
AcGePoint3d ptC,ptH;
|
|
ptC = ptBase;
|
|
// change by zh 2013-5-13
|
|
//if (1 == bMirror)
|
|
//{
|
|
// scale.set(-dScale, dScale, 1);
|
|
//}
|
|
int nReverseX(0), nReverseY(0);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseX, nReverseX);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseY, nReverseY);
|
|
if ((1 == bMirror) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
scale.set(-dScale, dScale, 1);
|
|
//
|
|
//阀芯
|
|
if (pBlockCen != NULL)
|
|
mode.DrawBlock(*pBlockCen, ptC, scale, dAngle, TRUE);
|
|
//其它非等比缩放的
|
|
if (pBlockMis != NULL)
|
|
{
|
|
//if (1 == bMirror) // change by zh 2013-5-13
|
|
if ((1 == bMirror) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
{
|
|
scale1.set(-dLength, dWidth, 1);
|
|
}
|
|
DelLabelText(pBlockMis);
|
|
mode.DrawBlock(*pBlockMis, ptBase, scale1, dAngle, TRUE);
|
|
}
|
|
//手柄
|
|
if (pBlockHan != NULL)
|
|
{
|
|
AcGeVector3d vt;
|
|
if (dLength > dWidth)
|
|
{
|
|
dOff = fabs(dOff) * 0.25 * 500;//由于Length乘2,所以这里应该除2
|
|
if(fabs(ptHand.x) < 1.e-3)
|
|
dOff = 0;
|
|
else if (ptHand.x < -1.e-3)
|
|
dOff *= -1;
|
|
vt.set(dOff,0,0);
|
|
}
|
|
else
|
|
{
|
|
dOff = fabs(dOff) * 0.5 * 1000;//正常
|
|
if(fabs(ptHand.y) < 1.e-3)
|
|
dOff = 0;
|
|
else if (ptHand.y < -1.e-3)
|
|
dOff *= -1;
|
|
vt.set(0,dOff,0);
|
|
}
|
|
|
|
ptHand.set(ptHand.x - ptBlockbase.x, ptHand.y - ptBlockbase.y,0);
|
|
ptHand *= dScale;
|
|
|
|
ptHand += vt;
|
|
ptHand += ptBase.asVector();
|
|
|
|
mat.setToRotation(dAngle, GetNormal(), ptBase);
|
|
ptHand.transformBy(mat);
|
|
|
|
if (bMirror == 1)
|
|
{
|
|
AcGeLine3d line(ptBase,ptBase + vtMainv * 10);
|
|
mat.setToMirroring(line);
|
|
ptHand.transformBy(mat);
|
|
}
|
|
mode.DrawBlock(*pBlockHan, ptHand, scale, dAngle, TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AcDbObject * pObj;
|
|
XPoint xpoint = ptBase;
|
|
if (acdbOpenObject(pObj, idBlock, AcDb::kForRead) != Acad::eOk)
|
|
return Acad::eNotImplementedYet;
|
|
AcDbBlockTableRecord * pBlock = AcDbBlockTableRecord::cast(pObj);
|
|
if (pBlock == NULL)
|
|
{
|
|
pObj->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
AcGeScale3d scale(1, 1, 1);
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dLength(50.0);
|
|
double dWidth(50.0);
|
|
double dThick(1.0);
|
|
AcGeVector3d vtMain;
|
|
int nMir(0),nIsDuctCap(0);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_Thick, dThick);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, nMir);
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsDuctCap);
|
|
scale.set(dLength, dWidth, 1);
|
|
// change by zh 2013-5-13
|
|
//if (nMir == 1)
|
|
//{
|
|
// scale.set(-dLength, dWidth, 1);
|
|
//}
|
|
int nReverseX(0), nReverseY(0);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseX, nReverseX);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseY, nReverseY);
|
|
if ((1 == nMir) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
scale.set(-dLength, dWidth, 1);
|
|
//
|
|
double dAngle = AcGeVector3d::kXAxis.angleTo(vtMain,GetNormal());
|
|
// LixlAdd倾斜布置阀门,主向量须向XY平面投影,计算出来的图块旋转角度才会准确
|
|
if (!(GetNormal().isParallelTo(AcGeVector3d::kZAxis)) && !(GetNormal().isPerpendicularTo(AcGeVector3d::kZAxis)))
|
|
dAngle = AcGeVector3d::kXAxis.angleTo(vtMain.orthoProject(AcGeVector3d::kZAxis), AcGeVector3d::kZAxis);
|
|
|
|
if (nIsDuctCap == 2)
|
|
{
|
|
AcDbBlockReference blkRef;
|
|
blkRef.setBlockTableRecord(idBlock);
|
|
XPoint ptIns, ptCen;
|
|
double dSizeX(0), dSizeY(0), dSizeZ(0), dRot(0);
|
|
GetBlockRefSizeInfo(&blkRef, ptIns, &dRot, ptCen, &dSizeX, &dSizeY, &dSizeZ);
|
|
if (dThick < 1)
|
|
dThick = 1;
|
|
if (dSizeZ < 1)
|
|
{
|
|
dSizeZ = dThick;
|
|
}
|
|
scale.set(dLength / 500, dLength / 500, dThick / dSizeZ);
|
|
}
|
|
mode.DrawBlock(*pBlock, xpoint, scale, dAngle, TRUE);
|
|
pObj->close();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AcDbObject * pObj;
|
|
XPoint xpoint = ptBase;
|
|
if (acdbOpenObject(pObj, idBlock, AcDb::kForRead) != Acad::eOk)
|
|
return Acad::eNotImplementedYet;
|
|
AcDbBlockTableRecord * pBlock = AcDbBlockTableRecord::cast(pObj);
|
|
if (pBlock == NULL)
|
|
{
|
|
pObj->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
AcGeScale3d scale(1, 1, 1);
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dLength(50.0);
|
|
double dWidth(50.0);
|
|
double dThick(1.0);
|
|
AcGeVector3d vtMain;
|
|
int nMir(0),nIsDuctCap(0);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
|
|
//BEGIN=================================================
|
|
if (dLength < 2.e-4)
|
|
{
|
|
dLength = 2.e-4;
|
|
}
|
|
//END===================================================
|
|
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_Thick, dThick);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, nMir);
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsDuctCap);
|
|
scale.set(dLength, dWidth, 1);
|
|
// change by zh 2013-5-13
|
|
//if (nMir == 1)
|
|
//{
|
|
// scale.set(-dLength, dWidth, 1);
|
|
//}
|
|
int nReverseX(0), nReverseY(0);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseX, nReverseX);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseY, nReverseY);
|
|
if ((1 == nMir) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
scale.set(-dLength, dWidth, 1);
|
|
//
|
|
double dAngle = AcGeVector3d::kXAxis.angleTo(vtMain,GetNormal());
|
|
// 倾斜布置阀门,主向量须向XY平面投影,计算出来的图块旋转角度才会准确
|
|
if (!(GetNormal().isParallelTo(AcGeVector3d::kZAxis)) && !(GetNormal().isPerpendicularTo(AcGeVector3d::kZAxis)))
|
|
dAngle = AcGeVector3d::kXAxis.angleTo(vtMain.orthoProject(AcGeVector3d::kZAxis),GetNormal());
|
|
|
|
if (nIsDuctCap == 2)
|
|
{
|
|
AcDbBlockReference blkRef;
|
|
blkRef.setBlockTableRecord(idBlock);
|
|
XPoint ptIns, ptCen;
|
|
double dSizeX(0), dSizeY(0), dSizeZ(0), dRot(0);
|
|
GetBlockRefSizeInfo(&blkRef, ptIns, &dRot, ptCen, &dSizeX, &dSizeY, &dSizeZ);
|
|
if (dThick < 1)
|
|
dThick = 1;
|
|
if (dSizeZ < 1)
|
|
{
|
|
dSizeZ = dThick;
|
|
}
|
|
scale.set(dLength / 500, dLength / 500, dThick / dSizeZ);
|
|
}
|
|
mode.DrawBlock(*pBlock, xpoint, scale, dAngle, TRUE);
|
|
pObj->close();
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
// 判断是否多叶阀
|
|
BOOL THImpHvacValve::IsMultibladeValve(AcDbObjectId idBlock) const
|
|
{
|
|
AcDbObject* pBlockEnt = NULL;
|
|
if(Acad::eOk != acdbOpenObject(pBlockEnt, idBlock, AcDb::kForRead))
|
|
return FALSE;
|
|
|
|
AcDbBlockTableRecord * pBlockTableRecord = AcDbBlockTableRecord::cast(pBlockEnt);
|
|
if(NULL == pBlockTableRecord)
|
|
{
|
|
pBlockEnt->close();
|
|
return FALSE;
|
|
}
|
|
pBlockEnt->close();
|
|
|
|
LPTSTR pszName = NULL;
|
|
pBlockTableRecord->getName(pszName);
|
|
if(NULL == pszName)
|
|
return FALSE;
|
|
|
|
CString sName = pszName;
|
|
int nIndex = sName.ReverseFind(_T('$'));
|
|
sName = sName.Mid(nIndex + 1);
|
|
|
|
return (0 == sName.CompareNoCase(_T("00000556"))
|
|
|| 0 == sName.CompareNoCase(_T("00000557"))
|
|
|| 0 == sName.CompareNoCase(_T("00000558"))
|
|
|| 0 == sName.CompareNoCase(_T("00000561"))
|
|
|| 0 == sName.CompareNoCase(_T("00000562"))
|
|
|| 0 == sName.CompareNoCase(_T("00000563")));
|
|
}
|
|
|
|
// 处理多叶阀等动态增减叶片数量的阀门
|
|
Acad::ErrorStatus THImpHvacValve::ExplodeBlockEx(XExplodeDraw &mode, AcDbObjectId idBlock,
|
|
AcGePoint3d ptBase, AcDbObjectIdArray& arObjs, int nType) const
|
|
{
|
|
if (nType == 0)
|
|
{
|
|
AcDbObject *pBlockEnt;
|
|
if (acdbOpenObject(pBlockEnt, idBlock, AcDb::kForRead) != Acad::eOk)
|
|
return Acad::eNotImplementedYet;
|
|
AcDbBlockTableRecord * pBlockTableRecord = AcDbBlockTableRecord::cast(pBlockEnt);
|
|
if (pBlockTableRecord == NULL)
|
|
{
|
|
pBlockEnt->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
pBlockEnt->close();
|
|
|
|
AcDbBlockTableRecordIterator* pIT;
|
|
if (Acad::eOk != pBlockTableRecord->newIterator( pIT ))
|
|
{
|
|
pBlockTableRecord->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
pBlockTableRecord->close();
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
AcDbObjectId idValve;
|
|
AcGePoint3d ptHand, ptCen, ptCenUp, ptCenDn, ptBlockbase;
|
|
AcDbBlockTableRecord *pBlockCen = NULL; // 阀芯
|
|
AcDbBlockTableRecord *pBlockCenUp = NULL; // 阀芯(上)
|
|
AcDbBlockTableRecord *pBlockCenDn = NULL; // 阀芯(下)
|
|
AcDbBlockTableRecord *pBlockHan = NULL; // 手柄
|
|
AcDbBlockTableRecord *pBlockMis = NULL; // 其他
|
|
double dLineLen = 500;
|
|
BOOL bValve(FALSE);
|
|
//找到块中的阀芯等引用
|
|
for ( ; !pIT->done(); pIT->step())
|
|
{
|
|
if (Acad::eOk == pIT->getEntity(pEnt, AcDb::kForRead))
|
|
{
|
|
AcDbBlockReference* pblcRfr = NULL;
|
|
pblcRfr = AcDbBlockReference::cast(pEnt);
|
|
if (pblcRfr != NULL)
|
|
{
|
|
idValve = pblcRfr->blockTableRecord();
|
|
if (acdbOpenObject(pBlockTableRecord, idValve, AcDb::kForRead) == Acad::eOk)
|
|
{
|
|
LPCTSTR pBlockName = NULL;
|
|
pBlockTableRecord->getName(pBlockName);
|
|
CString sBlockName = pBlockName;
|
|
if(-1 != sBlockName.Find(_T('_')))
|
|
sBlockName = sBlockName.Right(7);
|
|
else
|
|
sBlockName = sBlockName.Right(4);
|
|
// 阀芯
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKCEN))
|
|
{
|
|
pBlockCen = pBlockTableRecord;
|
|
ptCen = pblcRfr->position();
|
|
bValve = TRUE;
|
|
AcDbExtents ext;
|
|
ext.addBlockExt(pBlockCen);
|
|
dLineLen = ext.maxPoint().y - ext.minPoint().y;
|
|
}
|
|
// 阀芯(上)
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKCEN_UP))
|
|
{
|
|
pBlockCenUp = pBlockTableRecord;
|
|
ptCenUp = pblcRfr->position();
|
|
bValve = TRUE;
|
|
}
|
|
// 阀芯(下)
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKCEN_DN))
|
|
{
|
|
pBlockCenDn = pBlockTableRecord;
|
|
ptCenDn = pblcRfr->position();
|
|
bValve = TRUE;
|
|
}
|
|
// 手柄
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKHAN))
|
|
{
|
|
pBlockHan = pBlockTableRecord;
|
|
ptHand = pblcRfr->position();
|
|
bValve = TRUE;
|
|
}
|
|
// 其它非等比
|
|
if (!sBlockName.CompareNoCase(HVAC_VALVEBLOCKMIS))
|
|
{
|
|
pBlockMis = pBlockTableRecord;
|
|
ptBlockbase = pblcRfr->position();
|
|
bValve = TRUE;
|
|
}
|
|
pBlockTableRecord->close();
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
delete pIT;
|
|
|
|
// 上下阀芯同时存在时,才进行绘制
|
|
if(NULL == pBlockCenDn || NULL == pBlockCenUp)
|
|
{
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
|
|
if (bValve)
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dLength(50.0);
|
|
double dWidth(50.0);
|
|
AcGeVector3d vtMain;
|
|
AcGeVector3d vtMainv;
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
|
|
if (dLength < 2.e-4)
|
|
dLength = 2.e-4;
|
|
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
int bMirror(0);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, bMirror);
|
|
double dAngle = AcGeVector3d::kXAxis.angleTo(vtMain,GetNormal());
|
|
// LixlAdd倾斜布置阀门,主向量须向XY平面投影,计算出来的图块旋转角度才会准确
|
|
if (!(GetNormal().isParallelTo(AcGeVector3d::kZAxis))
|
|
&& !(GetNormal().isPerpendicularTo(AcGeVector3d::kZAxis)))
|
|
{
|
|
dAngle = AcGeVector3d::kXAxis.angleTo(
|
|
vtMain.orthoProject(AcGeVector3d::kZAxis), AcGeVector3d::kZAxis);
|
|
}
|
|
vtMainv = vtMain;
|
|
vtMainv.rotateBy(PI * 0.5, GetNormal());
|
|
vtMainv.normalize();
|
|
double dScale = dLength;
|
|
double dOff = dLength - dWidth;
|
|
//等比缩放按照最小的比例来缩放
|
|
if (dLength > dWidth)
|
|
dScale = dWidth;
|
|
|
|
//AcGeScale3d scale(-dScale, dScale, 1);
|
|
AcGeScale3d scale(-dScale, dScale, 1); // cq 2016-06-14 绘制与实际相反
|
|
AcGeScale3d scale1(dLength, dWidth, 1);
|
|
AcGeMatrix3d mat;
|
|
AcGePoint3d ptC,ptH;
|
|
ptC = ptBase;
|
|
// change by zh 2013-5-13
|
|
//if (1 == bMirror)
|
|
// scale.set(-dScale, dScale, 1);
|
|
int nReverseX(0), nReverseY(0);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseX, nReverseX);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseY, nReverseY);
|
|
// modify begin
|
|
// if ((1 == bMirror) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
// scale.set(-dScale, dScale, 1);
|
|
if (1 == bMirror)
|
|
scale[0] *= (-1);
|
|
if (1 == nReverseX)
|
|
scale[0] *= (-1);
|
|
// modify end by cq 2016-06-14 绘制与实际相反
|
|
//阀芯
|
|
double dCenLen = ptCenUp.distanceTo(ptCenDn);
|
|
double dCenLenHalf = dCenLen / 2.0;
|
|
if(1 > dWidth)
|
|
dCenLenHalf *= dWidth;
|
|
ptCenUp = ptC + vtMainv * dCenLenHalf;
|
|
ptCenDn = ptC - vtMainv * dCenLenHalf;
|
|
|
|
// 计算阀门实际高度
|
|
double dRealHeight = 1000 * dWidth;
|
|
|
|
// 计算能够绘制的阀芯数量
|
|
// change by hh 2012-07-23 高度增加0.5 避免因误差造成数量变化
|
|
// int nNum = (int)(dRealHeight / dCenLen);
|
|
int nNum = (int)((dRealHeight + 0.5) / dCenLen);
|
|
// if(0 >= nNum)
|
|
// nNum = 1; // 最少绘制一个
|
|
//
|
|
// // 计算阀芯的插入点
|
|
// AcGePoint3d ptFirst = ptC + vtMainv * (dCenLen * nNum / 2 - dCenLen / 2);
|
|
// AcGePoint3d ptIns = ptFirst;
|
|
// for(int k = 0; k < nNum; k++)
|
|
// {
|
|
// ptIns = ptFirst - vtMainv * (dCenLen * k);
|
|
// if(k % 2)
|
|
// mode.DrawBlock(*pBlockCenUp, ptIns, scale, dAngle, TRUE);
|
|
// else
|
|
// mode.DrawBlock(*pBlockCenDn, ptIns, scale, dAngle, TRUE);
|
|
// }
|
|
// 计算阀芯的插入点
|
|
AcGePoint3d ptFirst = ptC + vtMainv * (dCenLen * nNum / 2 - dCenLen / 2);
|
|
AcGePoint3d ptIns = ptFirst;
|
|
|
|
if(1 >= nNum)
|
|
{
|
|
// 最少绘制2个
|
|
mode.DrawBlock(*pBlockCenUp, ptCenUp, scale, dAngle, TRUE);
|
|
mode.DrawBlock(*pBlockCenDn, ptCenDn, scale, dAngle, TRUE);
|
|
ptFirst = ptCenUp;
|
|
ptIns = ptCenDn;
|
|
}
|
|
else
|
|
{
|
|
for(int k = 0; k < nNum; k++)
|
|
{
|
|
ptIns = ptFirst - vtMainv * (dCenLen * k);
|
|
if(k % 2)
|
|
mode.DrawBlock(*pBlockCenUp, ptIns, scale, dAngle, TRUE);
|
|
else
|
|
mode.DrawBlock(*pBlockCenDn, ptIns, scale, dAngle, TRUE);
|
|
}
|
|
}
|
|
|
|
// 绘制中心直线
|
|
if(NULL != pBlockCen)
|
|
{
|
|
AcGeScale3d scTemp = scale;
|
|
scTemp[Y]= ptFirst.distanceTo(ptIns) / dLineLen;
|
|
mode.DrawBlock(*pBlockCen, ptC, scTemp, dAngle, TRUE);
|
|
}
|
|
|
|
//其它非等比缩放的
|
|
if (pBlockMis != NULL)
|
|
{
|
|
//if (1 == bMirror) // change by zh 2013-5-13
|
|
if ((1 == bMirror) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
{
|
|
scale1.set(-dLength, dWidth, 1);
|
|
}
|
|
DelLabelText(pBlockMis);
|
|
mode.DrawBlock(*pBlockMis, ptBase, scale1, dAngle, TRUE);
|
|
}
|
|
//手柄
|
|
if (pBlockHan != NULL)
|
|
{
|
|
AcGeVector3d vt;
|
|
if (dLength > dWidth)
|
|
{
|
|
dOff = fabs(dOff) * 0.25 * 500;//由于Length乘2,所以这里应该除2
|
|
if(fabs(ptHand.x) < 1.e-3)
|
|
dOff = 0;
|
|
else if (ptHand.x < -1.e-3)
|
|
dOff *= -1;
|
|
vt.set(dOff,0,0);
|
|
}
|
|
else
|
|
{
|
|
dOff = fabs(dOff) * 0.5 * 1000;//正常
|
|
if(fabs(ptHand.y) < 1.e-3)
|
|
dOff = 0;
|
|
else if (ptHand.y < -1.e-3)
|
|
dOff *= -1;
|
|
vt.set(0,dOff,0);
|
|
}
|
|
|
|
ptHand.set(ptHand.x - ptBlockbase.x, ptHand.y - ptBlockbase.y,0);
|
|
ptHand *= dScale;
|
|
|
|
ptHand += vt;
|
|
ptHand += ptBase.asVector();
|
|
|
|
mat.setToRotation(dAngle, GetNormal(), ptBase);
|
|
ptHand.transformBy(mat);
|
|
|
|
if (bMirror == 1)
|
|
{
|
|
AcGeLine3d line(ptBase,ptBase + vtMainv * 10);
|
|
mat.setToMirroring(line);
|
|
ptHand.transformBy(mat);
|
|
}
|
|
mode.DrawBlock(*pBlockHan, ptHand, scale, dAngle, TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AcDbObject * pObj;
|
|
XPoint xpoint = ptBase;
|
|
if (acdbOpenObject(pObj, idBlock, AcDb::kForRead) != Acad::eOk)
|
|
return Acad::eNotImplementedYet;
|
|
AcDbBlockTableRecord * pBlock = AcDbBlockTableRecord::cast(pObj);
|
|
if (pBlock == NULL)
|
|
{
|
|
pObj->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
AcGeScale3d scale(1, 1, 1);
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dLength(50.0);
|
|
double dWidth(50.0);
|
|
double dThick(1.0);
|
|
AcGeVector3d vtMain;
|
|
int nMir(0),nIsDuctCap(0);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_Thick, dThick);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, nMir);
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsDuctCap);
|
|
scale.set(dLength, dWidth, 1);
|
|
|
|
// change by zh 2013-5-13
|
|
//if (nMir == 1)
|
|
//{
|
|
// scale.set(-dLength, dWidth, 1);
|
|
//}
|
|
int nReverseX(0), nReverseY(0);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseX, nReverseX);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseY, nReverseY);
|
|
if ((1 == nMir) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
scale.set(-dLength, dWidth, 1);
|
|
//
|
|
double dAngle = AcGeVector3d::kXAxis.angleTo(vtMain,GetNormal());
|
|
// LixlAdd倾斜布置阀门,主向量须向XY平面投影,计算出来的图块旋转角度才会准确
|
|
if (!(GetNormal().isParallelTo(AcGeVector3d::kZAxis)) && !(GetNormal().isPerpendicularTo(AcGeVector3d::kZAxis)))
|
|
dAngle = AcGeVector3d::kXAxis.angleTo(vtMain.orthoProject(AcGeVector3d::kZAxis), AcGeVector3d::kZAxis);
|
|
|
|
if (nIsDuctCap == 2)
|
|
{
|
|
AcDbBlockReference blkRef;
|
|
blkRef.setBlockTableRecord(idBlock);
|
|
XPoint ptIns, ptCen;
|
|
double dSizeX(0), dSizeY(0), dSizeZ(0), dRot(0);
|
|
GetBlockRefSizeInfo(&blkRef, ptIns, &dRot, ptCen, &dSizeX, &dSizeY, &dSizeZ);
|
|
if (dThick < 1)
|
|
dThick = 1;
|
|
if (dSizeZ < 1)
|
|
{
|
|
dSizeZ = dThick;
|
|
}
|
|
scale.set(dLength / 500, dLength / 500, dThick / dSizeZ);
|
|
}
|
|
mode.DrawBlock(*pBlock, xpoint, scale, dAngle, TRUE);
|
|
pObj->close();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AcDbObject * pObj;
|
|
XPoint xpoint = ptBase;
|
|
if (acdbOpenObject(pObj, idBlock, AcDb::kForRead) != Acad::eOk)
|
|
return Acad::eNotImplementedYet;
|
|
AcDbBlockTableRecord * pBlock = AcDbBlockTableRecord::cast(pObj);
|
|
if (pBlock == NULL)
|
|
{
|
|
pObj->close();
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
AcGeScale3d scale(1, 1, 1);
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dLength(50.0);
|
|
double dWidth(50.0);
|
|
double dThick(1.0);
|
|
AcGeVector3d vtMain;
|
|
int nMir(0),nIsDuctCap(0);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
|
|
if (dLength < 2.e-4)
|
|
{
|
|
dLength = 2.e-4;
|
|
}
|
|
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_Thick, dThick);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, nMir);
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsDuctCap);
|
|
scale.set(dLength, dWidth, 1);
|
|
// change by zh 2013-5-13
|
|
//if (nMir == 1)
|
|
//{
|
|
// scale.set(-dLength, dWidth, 1);
|
|
//}
|
|
int nReverseX(0), nReverseY(0);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseX, nReverseX);
|
|
m_pXDataMap->GetAt(HVLV_IsReverseY, nReverseY);
|
|
if ((1 == nMir) ^ (1 == nReverseX) ^ (nReverseY == 1))
|
|
scale.set(-dLength, dWidth, 1);
|
|
//
|
|
|
|
double dAngle = AcGeVector3d::kXAxis.angleTo(vtMain,GetNormal());
|
|
// LixlAdd倾斜布置阀门,主向量须向XY平面投影,计算出来的图块旋转角度才会准确
|
|
if (!(GetNormal().isParallelTo(AcGeVector3d::kZAxis)) && !(GetNormal().isPerpendicularTo(AcGeVector3d::kZAxis)))
|
|
dAngle = AcGeVector3d::kXAxis.angleTo(vtMain.orthoProject(AcGeVector3d::kZAxis), AcGeVector3d::kZAxis);
|
|
|
|
if (nIsDuctCap == 2)
|
|
{
|
|
AcDbBlockReference blkRef;
|
|
blkRef.setBlockTableRecord(idBlock);
|
|
XPoint ptIns, ptCen;
|
|
double dSizeX(0), dSizeY(0), dSizeZ(0), dRot(0);
|
|
GetBlockRefSizeInfo(&blkRef, ptIns, &dRot, ptCen, &dSizeX, &dSizeY, &dSizeZ);
|
|
if (dThick < 1)
|
|
dThick = 1;
|
|
if (dSizeZ < 1)
|
|
{
|
|
dSizeZ = dThick;
|
|
}
|
|
scale.set(dLength / 500, dLength / 500, dThick / dSizeZ);
|
|
}
|
|
mode.DrawBlock(*pBlock, xpoint, scale, dAngle, TRUE);
|
|
pObj->close();
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
void THImpHvacValve::DrawText(XExplodeDraw &mode) const
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dLength(50.0);
|
|
double dWidth(50.0),dTextHeight(100.0),dangle(0.0);
|
|
AcGeVector3d vtMain;
|
|
int nMir(0);
|
|
CString sLabel,sDim,sCode;
|
|
AcGePoint3d ptCenter;
|
|
AcDbObjectId idDimLayer,idDimStyle;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, nMir);
|
|
m_pXDataMap->GetAt(HVLV_LabelText, sLabel);
|
|
m_pXDataMap->GetAt(HVLV_DimText, sDim);
|
|
m_pXDataMap->GetAt(HVLV_CodeText, sCode);
|
|
m_pXDataMap->GetAt(HDIM_DimLayer, idDimLayer);
|
|
m_pXDataMap->GetAt(HDIM_DimTextId, idDimStyle);
|
|
m_pXDataMap->GetAt(HDIM_DimTextHeigh, dTextHeight);
|
|
m_pXDataMap->GetAt(HDIM_DimTextAngle, dangle);
|
|
|
|
int nColorIndexOld = mode.GetColor();
|
|
mode.SetColor(kColorByLayer);
|
|
if (!sLabel.IsEmpty())
|
|
{
|
|
TDbText* pText = new TDbText;
|
|
AcGePoint3d ptLabel;
|
|
m_pXDataMap->GetAt(HVLV_LabelPoint, ptLabel);
|
|
pText->SetText(sLabel);
|
|
pText->setLayer(idDimLayer);
|
|
// pText->setColorIndex(255);
|
|
pText->SetStyleId(idDimStyle);
|
|
pText->SetHeight(dTextHeight);
|
|
pText->SetLocation(ptLabel);
|
|
pText->SetRotation(dangle);
|
|
pText->SetAlignment(XExplodeDraw::kMiddleCenter);
|
|
pText->setPropertiesFrom(m_pOwnerEnt);
|
|
pText->ExplodeOrDraw2d(mode);
|
|
delete pText;
|
|
|
|
// mode.SetAlignment(XExplodeDraw::kMiddleCenter);
|
|
// mode.SetLocation(ptLabel);
|
|
// mode.SetHeight(dTextHeight);
|
|
// mode.SetStyle(idDimStyle);
|
|
// mode.SetLayer(idDimLayer);
|
|
// mode.SetRotation(dangle);
|
|
// mode.DrawText(sLabel);
|
|
}
|
|
if (!sDim.IsEmpty())
|
|
{
|
|
TDbText* pTextDim = new TDbText;
|
|
AcGePoint3d ptDim;
|
|
m_pXDataMap->GetAt(HVLV_DimPoint, ptDim);
|
|
pTextDim->SetText(sDim);
|
|
pTextDim->setLayer(idDimLayer);
|
|
// pTextDim->setColorIndex(255);
|
|
pTextDim->SetStyleId(idDimStyle);
|
|
pTextDim->SetHeight(dTextHeight);
|
|
pTextDim->SetLocation(ptDim);
|
|
pTextDim->SetRotation(dangle);
|
|
pTextDim->SetAlignment(XExplodeDraw::kMiddleCenter);
|
|
pTextDim->setPropertiesFrom(m_pOwnerEnt);
|
|
pTextDim->ExplodeOrDraw2d(mode);
|
|
delete pTextDim;
|
|
|
|
// AcGePoint3d ptDim;
|
|
// m_pXDataMap->GetAt(HVLV_DimPoint, ptDim);
|
|
// mode.SetAlignment(XExplodeDraw::kMiddleCenter);
|
|
// mode.SetLocation(ptDim);
|
|
// mode.SetHeight(dTextHeight);
|
|
// mode.SetStyle(idDimStyle);
|
|
// mode.SetLayer(idDimLayer);
|
|
// mode.SetRotation(dangle);
|
|
// mode.DrawText(sDim);
|
|
}
|
|
// add by hh 2013-08-29 阀门代号
|
|
if(!sCode.IsEmpty())
|
|
{
|
|
TDbText* pTextDim = new TDbText;
|
|
AcGePoint3d ptCode;
|
|
m_pXDataMap->GetAt(HVLV_CodePoint, ptCode);
|
|
pTextDim->SetText(sCode);
|
|
pTextDim->setLayer(idDimLayer);
|
|
pTextDim->SetStyleId(idDimStyle);
|
|
pTextDim->SetHeight(dTextHeight);
|
|
pTextDim->SetLocation(ptCode);
|
|
pTextDim->SetRotation(dangle);
|
|
pTextDim->SetAlignment(XExplodeDraw::kMiddleCenter);
|
|
pTextDim->setPropertiesFrom(m_pOwnerEnt);
|
|
pTextDim->ExplodeOrDraw2d(mode);
|
|
delete pTextDim;
|
|
}
|
|
mode.SetColor(nColorIndexOld);
|
|
}
|
|
|
|
void THImpHvacValve::DelLabelText(AcDbBlockTableRecord *pBlockMis) const
|
|
{
|
|
AcDbBlockTableRecordIterator* pIT;
|
|
CString sLabel;
|
|
AcDbEntity *pEnt;
|
|
// m_pXDataMap->GetAt(HVLV_LabelText, sLabel);
|
|
// //看是否有标签
|
|
// if (!sLabel.IsEmpty())
|
|
// {
|
|
if (Acad::eOk != pBlockMis->newIterator(pIT))
|
|
{
|
|
return;
|
|
}
|
|
//找到块中的文本等引用
|
|
for ( ; !pIT->done(); pIT->step())
|
|
{
|
|
if (Acad::eOk == pIT->getEntity(pEnt, AcDb::kForRead))
|
|
{
|
|
AcDbText *pText;
|
|
pText = AcDbText::cast(pEnt);
|
|
if (pText != NULL)
|
|
{
|
|
if(Acad::eOk == pEnt->upgradeOpen())
|
|
{
|
|
pEnt->setVisibility(AcDb::kInvisible);
|
|
pEnt->downgradeOpen();
|
|
// pEnt->close();
|
|
}
|
|
// delete pIT;
|
|
// return;
|
|
pEnt->close();
|
|
break;
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
delete pIT;
|
|
//}
|
|
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::Draw2dBox(XExplodeDraw &mode) const
|
|
{
|
|
AcGeVector3d vtNor;
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
|
|
AcGePoint3dArray arPts;
|
|
GetBoxPts(arPts);
|
|
double dEl;
|
|
AcGePlane plane = TAuxTools::GetHidePlane(arPts[1],arPts[2],arPts[3],vtNor,dEl);
|
|
AcDbPolyline polyLine;
|
|
polyLine.addVertexAt(0,arPts[1].convert2d(plane));
|
|
polyLine.addVertexAt(1,arPts[2].convert2d(plane));
|
|
polyLine.addVertexAt(2,arPts[3].convert2d(plane));
|
|
polyLine.addVertexAt(3,arPts[4].convert2d(plane));
|
|
mode.Polyline(polyLine);
|
|
return Acad::eOk;
|
|
}
|
|
// 5 6
|
|
// ┃ ┃
|
|
// 1 ┃━━━━━┃ 2
|
|
// ┃ ┃
|
|
// ┃ 0 ┃
|
|
// ┃ ┃
|
|
// 4 ┃━━━━━┃ 3
|
|
// ┃ ┃
|
|
// 8 7
|
|
//
|
|
BOOL THImpHvacValve::GetBoxPts(AcGePoint3dArray &arPts) const
|
|
{
|
|
// 获取各点位置
|
|
AcGePoint3d ptStart, ptEnd, ptCenter;
|
|
AcGeVector3d vtMain, vtNor, vtMainv;
|
|
double dLength(50.0), dThick(50.0), dWidth(50.0), dPlusEdge(50.0), dOLength(500.0);
|
|
AcDbObjectId id = AcDbObjectId::kNull;
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_Thick, dThick);
|
|
|
|
dOLength = GetBlkOldLength();
|
|
|
|
dLength *= dOLength;
|
|
dWidth *= 1000;
|
|
vtMainv = vtMain;
|
|
vtMainv.rotateBy(PI * 0.5, vtNor);
|
|
vtMain.normalize();
|
|
vtMainv.normalize();
|
|
dPlusEdge = dWidth * 0.1;
|
|
//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);
|
|
return TRUE;
|
|
}
|
|
|
|
void THImpHvacValve::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);
|
|
int nSectType(0);
|
|
m_pXDataMap->GetAt(HVLV_SEquipType, sType);
|
|
m_pXDataMap->GetAt(HVLV_SEquipName, sName);
|
|
m_pXDataMap->GetAt(KEY_SectType, (int&)nSectType);
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_Length, dLength);
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
m_pXDataMap->GetAt(HVLV_Thick, dThick);
|
|
acutPrintf(_T("\n\t\t\t\t\t\t\t\t%s"),sType);
|
|
acutPrintf(_T("\n\t\t\t\t\t型号: %s"),sName);
|
|
if (nSectType == 0)
|
|
{
|
|
acutPrintf(_T("\n\t\t\t\t\t长度: %.0fmm"),dLength * 500);
|
|
acutPrintf(_T("\n\t\t\t\t\t宽度: %.0fmm"),dWidth * 1000);
|
|
acutPrintf(_T("\n\t\t\t\t\t高度: %.0fmm"),dThick);
|
|
acutPrintf(_T("\n\t\t\t\t\t标高: %.0fm"),ptCenter.z * 0.001);
|
|
}
|
|
else
|
|
{
|
|
acutPrintf(_T("\n\t\t\t\t\t长度: %.0fmm"),dLength * 500);
|
|
acutPrintf(_T("\n\t\t\t\t\t直径: %.0fmm"),dWidth * 1000);
|
|
acutPrintf(_T("\n\t\t\t\t\t标高: %.0fm"),ptCenter.z * 0.001);
|
|
}
|
|
}
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::transformBy(const AcGeMatrix3d& xform)
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return Acad::eNotApplicable;
|
|
|
|
AcGeVector3d vtOff = xform.translation();
|
|
BOOL bMoveInDuct = IsMovedWithInDuct(vtOff);
|
|
|
|
// 取得位置点
|
|
AcGePoint3d ptCenter,ptLabel,ptDim,ptCode;
|
|
AcGeVector3d vtMain,vtRotate,vtNor;
|
|
double dL(1.0),dW(1.0),dT(1.0),dRotate(0.0);
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_Length, dL);
|
|
m_pXDataMap->GetAt(HVLV_Width, dW);
|
|
m_pXDataMap->GetAt(HVLV_Thick, dT);
|
|
m_pXDataMap->GetAt(HVLV_LabelPoint, ptLabel);
|
|
m_pXDataMap->GetAt(HVLV_DimPoint, ptDim);
|
|
m_pXDataMap->GetAt(HVLV_CodePoint, ptCode);
|
|
m_pXDataMap->GetAt(HDIM_DimTextAngle, dRotate);
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNor);
|
|
vtRotate = vtMain;
|
|
AcGeVector3d vtPrep(vtNor.crossProduct(vtMain));
|
|
AcGePoint3d ptOrigCenter = ptCenter;
|
|
|
|
// 变换位置
|
|
ptCenter.transformBy(xform);
|
|
vtMain.transformBy(xform);
|
|
vtNor.transformBy(xform);
|
|
|
|
ptLabel.transformBy(xform);
|
|
ptDim.transformBy(xform);
|
|
ptCode.transformBy(xform);
|
|
double dscale = xform.scale();
|
|
|
|
vtPrep.transformBy(xform);
|
|
// 同向是旋转,不变号,反向是镜像,变号。
|
|
int iSign = ((vtPrep.isCodirectionalTo(vtNor.crossProduct(vtMain))) ? 1 : -1);
|
|
if (iSign < 0)
|
|
{
|
|
//m_pXDataMap->SetAt(HVLV_IsMirror, 1);
|
|
// add by zh 2013-5-13 保证镜像正确
|
|
int bMirror(0);
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, bMirror);
|
|
if(bMirror == 0)
|
|
m_pXDataMap->SetAt(HVLV_IsMirror, 1);
|
|
else if(bMirror == 1)
|
|
m_pXDataMap->SetAt(HVLV_IsMirror, 0);
|
|
}
|
|
else
|
|
{
|
|
dRotate += vtMain.angleTo(vtRotate,-AcGeVector3d::kZAxis);
|
|
}
|
|
vtMain *= iSign;
|
|
|
|
|
|
// 更新点
|
|
m_pXDataMap->SetAt(HVAC_Normal, vtNor);
|
|
m_pXDataMap->SetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->SetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->SetAt(HVLV_Length, dL * dscale);
|
|
m_pXDataMap->SetAt(HVLV_Width, dW * dscale);
|
|
m_pXDataMap->SetAt(HVLV_Thick, dT * dscale);
|
|
m_pXDataMap->SetAt(HVLV_LabelPoint, ptLabel);
|
|
m_pXDataMap->SetAt(HVLV_DimPoint, ptDim);
|
|
m_pXDataMap->SetAt(HVLV_CodePoint, ptCode);
|
|
m_pXDataMap->SetAt(HDIM_DimTextAngle, dRotate);
|
|
|
|
// 传递消息
|
|
|
|
BOOL bClone(FALSE);
|
|
m_pXDataMap->GetAt(KEY_DEEPCLONEFLAG, bClone);
|
|
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())
|
|
{
|
|
BOOL bAutoCon(FALSE);
|
|
GetGlobalContext(HVAC_AUTOCONNECT, bAutoCon);
|
|
if (bAutoCon)
|
|
{
|
|
TInterfaceModifyMsg iMsg;
|
|
TDbInterfaceMsgWrite msgWrite;
|
|
// if (bMoveInDuct)
|
|
// {
|
|
// 写入接口更改消息
|
|
iMsg.SetMsgValidate(TRUE);
|
|
iMsg.SetTransform(xform);
|
|
iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
|
|
msgWrite.WriteInterfaceMsg(iMsg);
|
|
// }
|
|
|
|
if (!bMoveInDuct && TAuxTools::IsAutoWorkConnect())
|
|
{
|
|
// 写入自动融合或断开新管 更改消息
|
|
iMsg.SetMsgValidate(TRUE);
|
|
iMsg.SetMsgPoint(ptOrigCenter);
|
|
iMsg.SetTransform(xform);
|
|
iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
|
|
iMsg.SetInterfaceOper(TDb::eAutoWorkOn);
|
|
msgWrite.WriteInterfaceMsg(iMsg);
|
|
}
|
|
}
|
|
|
|
//更新接口记录接口信息
|
|
UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform);
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::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 THImpHvacValve::moveStretchPointsAt(const AcDbIntArray& indices,
|
|
const AcGeVector3d& offset)
|
|
{
|
|
if (indices.length() < 1)
|
|
return Acad::eNotImplementedYet;
|
|
|
|
AcGePoint3d ptCenter, ptLabel, ptDim;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_LabelPoint, ptLabel);
|
|
m_pXDataMap->GetAt(HVLV_DimPoint, ptDim);
|
|
ptCenter += offset;
|
|
ptLabel += offset;
|
|
ptDim += offset;
|
|
m_pXDataMap->SetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->SetAt(HVLV_LabelPoint, ptLabel);
|
|
m_pXDataMap->SetAt(HVLV_DimPoint, ptDim);
|
|
|
|
if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid())
|
|
{
|
|
UpdateInterfaceRec(m_pOwnerEnt->objectId(), offset);
|
|
return Acad::eOk;
|
|
}
|
|
|
|
return Acad::eNotImplementedYet;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::moveGripPointsAt(const AcDbIntArray& indices,
|
|
const AcGeVector3d& offset)
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
int nSize = indices.length();
|
|
if (nSize > 0)
|
|
{
|
|
// 取得位置点
|
|
AcGePoint3d ptCenter;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
AcGeVector3d vtMain;
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
AcGePoint3d ptLabel;
|
|
m_pXDataMap->GetAt(HVLV_LabelPoint, ptLabel);
|
|
AcGePoint3d ptDim;
|
|
m_pXDataMap->GetAt(HVLV_DimPoint, ptDim);
|
|
AcGePoint3d ptCode;
|
|
m_pXDataMap->GetAt(HVLV_CodePoint, ptCode);
|
|
// 选择多个夹点,以first为准
|
|
int nIndex = indices.first();
|
|
TDb::Position ePos = ExplainGripIndex(nIndex);
|
|
switch(ePos)
|
|
{
|
|
case TDb::eStart:
|
|
case TDb::eEnd:
|
|
case TDb::eMid:
|
|
{
|
|
BOOL bMovedInDuct = IsMovedWithInDuct(offset); // 移动是否在风管范围内
|
|
AcGeVector3d vtMove = offset;
|
|
ptCenter += vtMove;
|
|
m_pXDataMap->SetAt(HVLV_CenterPoint, ptCenter);
|
|
|
|
ptLabel += vtMove;
|
|
m_pXDataMap->SetAt(HVLV_LabelPoint, ptLabel);
|
|
ptDim += vtMove;
|
|
m_pXDataMap->SetAt(HVLV_DimPoint, ptDim);
|
|
ptCode += vtMove;
|
|
m_pXDataMap->SetAt(HVLV_CodePoint, ptCode);
|
|
|
|
if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid())
|
|
{
|
|
BOOL bAutoCon(FALSE);
|
|
GetGlobalContext(HVAC_AUTOCONNECT, bAutoCon);
|
|
if (bAutoCon)
|
|
{
|
|
TInterfaceModifyMsg iMsg;
|
|
TDbInterfaceMsgWrite msgWrite;
|
|
if (bMovedInDuct)
|
|
{
|
|
// 写入接口更改消息
|
|
iMsg.SetMsgPoint(ptCenter);//new pos
|
|
iMsg.SetGripPosition(ePos);
|
|
iMsg.SetMoveGripOffset(vtMove);
|
|
iMsg.SetMsgValidate(TRUE);
|
|
iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
|
|
msgWrite.WriteInterfaceMsg(iMsg);
|
|
}
|
|
else if (TAuxTools::IsAutoWorkConnect())
|
|
{
|
|
// 写入自动融合或断开新管 更改消息
|
|
iMsg.SetMsgValidate(TRUE);
|
|
iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
|
|
iMsg.SetTransform(offset);
|
|
AcGeMatrix3d mat;
|
|
mat.setTranslation(offset);
|
|
iMsg.SetTransform(mat);
|
|
iMsg.SetInterfaceOper(TDb::eAutoWorkOn);
|
|
msgWrite.WriteInterfaceMsg(iMsg);
|
|
}
|
|
}
|
|
|
|
//更新接口记录接口信息
|
|
UpdateInterfaceRec(m_pOwnerEnt->objectId(), vtMove);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case TDb::eCommand0:
|
|
case TDb::eCommand1:
|
|
{
|
|
// 获得夹点命令
|
|
CString sCmdStr;
|
|
GetGlobalContext()->GetAt(KEY_HVACGRIPCMD, sCmdStr);
|
|
if (sCmdStr.IsEmpty())
|
|
return Acad::eNotApplicable;
|
|
AcGePoint3d ptCom;
|
|
if (ePos == TDb::eCommand0)
|
|
{
|
|
ptCom = GetStartPt();
|
|
}
|
|
else
|
|
{
|
|
ptCom = GetEndPt();
|
|
}
|
|
// 写入接口更改消息
|
|
TInterfaceModifyMsg iMsg;
|
|
iMsg.SetMsgPoint(ptCom);//new pos
|
|
iMsg.SetGripPosition(ePos);
|
|
iMsg.SetMoveGripOffset(offset);
|
|
iMsg.SetMsgValidate(TRUE);
|
|
iMsg.SetInterfaceOper(TDb::eNewCommand);
|
|
iMsg.SetPreviewObjToCreate(TDb::eValve, 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;
|
|
}
|
|
case TDb::eAdjust0:
|
|
{
|
|
AcDbIntArray OsnapMode;
|
|
AcDbIntArray GeomId;
|
|
AcGePoint3dArray arPts;
|
|
getGripPoints(arPts, OsnapMode, GeomId);
|
|
AcGePoint3d ptAdust = arPts[5];
|
|
ptAdust += offset;
|
|
|
|
//判断方向点移动到哪个象限
|
|
int nPos = 0;
|
|
nPos = TAuxTools::Getquadrant(ptCenter, ptAdust, vtMain);
|
|
switch(nPos)
|
|
{
|
|
case 1:
|
|
m_pXDataMap->SetAt(HVLV_IsMirror, 0);
|
|
break;
|
|
case 2:
|
|
m_pXDataMap->SetAt(HVLV_IsMirror, 1);
|
|
break;
|
|
case 3:
|
|
{
|
|
vtMain *= -1;
|
|
m_pXDataMap->SetAt(HVLV_MainDir,vtMain);
|
|
m_pXDataMap->SetAt(HVLV_IsMirror, 0);
|
|
}
|
|
break;
|
|
case 4:
|
|
{
|
|
vtMain *= -1;
|
|
m_pXDataMap->SetAt(HVLV_MainDir,vtMain);
|
|
m_pXDataMap->SetAt(HVLV_IsMirror, 1);
|
|
}
|
|
break;
|
|
}
|
|
// add by hh 2011-04-07 调整接口 避免阀门换向后接口关系丢失
|
|
if(3 == nPos || 4 == nPos)
|
|
{
|
|
AcDbObjectId id1, id2;
|
|
m_pXDataMap->GetAt(KEY_IDCNT1, id1);
|
|
m_pXDataMap->GetAt(KEY_IDCNT2, id2);
|
|
m_pXDataMap->SetAt(KEY_IDCNT1, id2);
|
|
m_pXDataMap->SetAt(KEY_IDCNT2, id1);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case TDb::eDim0:
|
|
{
|
|
TDb::InterfaceOper eOper = TDb::eMoveGripPoint;
|
|
ptCode += offset;
|
|
m_pXDataMap->SetAt(HVLV_CodePoint, ptCode);
|
|
break;
|
|
}
|
|
case TDb::eDim1:
|
|
{
|
|
TDb::InterfaceOper eOper = TDb::eMoveGripPoint;
|
|
ptLabel += offset;
|
|
m_pXDataMap->SetAt(HVLV_LabelPoint, ptLabel);
|
|
break;
|
|
}
|
|
case TDb::eDim2:
|
|
{
|
|
TDb::InterfaceOper eOper = TDb::eMoveGripPoint;
|
|
ptDim += offset;
|
|
m_pXDataMap->SetAt(HVLV_DimPoint, ptDim);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::intersectWith(const AcDbEntity* pEnt,
|
|
AcDb::Intersect intType,
|
|
const AcGePlane& projPlane,
|
|
AcGePoint3dArray& points,
|
|
INT_PTR thisGsMarker,
|
|
INT_PTR otherGsMarker) const
|
|
{
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::intersectWith(const AcDbEntity* pEnt,
|
|
AcDb::Intersect intType,
|
|
AcGePoint3dArray& points,
|
|
INT_PTR thisGsMarker,
|
|
INT_PTR otherGsMarker) const
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::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(HVLV_CenterPoint, ptCenter);
|
|
|
|
// 根据捕捉模式处理
|
|
switch(osnapMode)
|
|
{
|
|
case AcDb::kOsModeEnd:
|
|
snapPoints.append(GetStartPt());
|
|
snapPoints.append(GetEndPt());
|
|
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);
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::getGripPoints(AcGePoint3dArray& gripPoints,
|
|
AcDbIntArray& osnapModes,
|
|
AcDbIntArray& geomIds) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
return Acad::eNotApplicable;
|
|
double dPlusEdge = 50.0, dOLength(500.0);
|
|
// 取得位置点
|
|
AcGeVector3d vtMain;
|
|
AcGePoint3d ptCenter;
|
|
double dL(1.0);
|
|
double dW(1.0);
|
|
int nIsDuctCap(0);
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
m_pXDataMap->GetAt(HVLV_MainDir, vtMain);
|
|
m_pXDataMap->GetAt(HVLV_Length, dL);
|
|
m_pXDataMap->GetAt(HVLV_Width, dW);
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsDuctCap);
|
|
if (nIsDuctCap == 2)
|
|
{
|
|
gripPoints.append(ptCenter); //MID
|
|
return Acad::eOk;
|
|
}
|
|
|
|
dOLength = GetBlkOldLength();
|
|
dL *= dOLength;
|
|
dW *= 1000;
|
|
//3个移动夹点
|
|
gripPoints.append(GetStartPt()); //STA
|
|
gripPoints.append(GetEndPt()); //END
|
|
gripPoints.append(ptCenter); //MID
|
|
|
|
AcGePoint3d ptGeCmd1,ptGeCmd2;
|
|
AcGeVector3d vtMainv = vtMain;
|
|
vtMainv.rotateBy(PI * 0.5, GetNormal());
|
|
vtMain.normalize();
|
|
vtMainv.normalize();
|
|
|
|
//增加2个命令夹点
|
|
gripPoints.append(GetStartPt() - vtMain * g_dCmdOff); //STA
|
|
gripPoints.append(GetEndPt() + vtMain * g_dCmdOff); //END
|
|
|
|
//添加方向夹点
|
|
int bMirror = 0;
|
|
int bRotate = 0;
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, bMirror);
|
|
ptGeCmd1 = ptCenter + vtMain * dL * 0.5;
|
|
ptGeCmd1 = ptGeCmd1 + vtMainv * dW * 0.5;
|
|
if (bMirror == 1)
|
|
{
|
|
ptGeCmd1 = ptCenter - vtMain * dL * 0.5;
|
|
ptGeCmd1 = ptGeCmd1 + vtMainv * dW * 0.5;
|
|
//ptGeCmd1.rotateBy(PI * 0.5, GetNormal(), ptCenter);
|
|
}
|
|
gripPoints.append(ptGeCmd1);
|
|
//label点
|
|
AcGePoint3d ptLabel;
|
|
CString sLabel;
|
|
m_pXDataMap->GetAt(HVLV_LabelText, sLabel);
|
|
if (!sLabel.IsEmpty())
|
|
{
|
|
m_pXDataMap->GetAt(HVLV_LabelPoint, ptLabel);
|
|
gripPoints.append(ptLabel);
|
|
}
|
|
//标注点
|
|
AcGePoint3d ptDim;
|
|
CString sDim;
|
|
m_pXDataMap->GetAt(HVLV_DimText, sDim);
|
|
if (!sDim.IsEmpty())
|
|
{
|
|
m_pXDataMap->GetAt(HVLV_DimPoint, ptDim);
|
|
gripPoints.append(ptDim);
|
|
}
|
|
//代号点
|
|
AcGePoint3d ptCode;
|
|
CString sCode;
|
|
m_pXDataMap->GetAt(HVLV_CodeText, sCode);
|
|
if (!sCode.IsEmpty())
|
|
{
|
|
m_pXDataMap->GetAt(HVLV_CodePoint, ptCode);
|
|
gripPoints.append(ptCode);
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::getGeomExtents(AcDbExtents& extents) const
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus THImpHvacValve::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 THImpHvacValve::explode(AcDbVoidPtrArray& entitySet) const
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
double THImpHvacValve::GetEdgeLineWidth() const
|
|
{
|
|
BOOL bShow(FALSE);
|
|
GetGlobalContext(HVAC_SHOWWIDTH, bShow);
|
|
// add by hh 2011-01-05 从图纸中读取加粗标识 避免全局参数对不同的图纸间的影响
|
|
TAuxTools::GetTHvacDataFromDwg(HVAC_SHOWWIDTH, bShow);
|
|
|
|
if (!bShow)
|
|
return 0.0;
|
|
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dWidth(0.0);
|
|
m_pXDataMap->GetAt(HVAC_EdgeWidth, dWidth);
|
|
|
|
return dWidth;
|
|
}
|
|
|
|
BOOL THImpHvacValve::OPMInfo(LPCTSTR pszName, TDb::OPMInfo* pInfo)
|
|
{
|
|
ASSERT(NULL != pszName && NULL != pInfo && NULL != m_pXDataMap);
|
|
int nIsCap(0);
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nIsCap);
|
|
// 暖通基本参数设置
|
|
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::eValve);
|
|
}
|
|
|
|
// 全局属性,需要特殊处理数据获取和设置
|
|
if (NULL != pInfo->pXData)
|
|
{
|
|
// 获取数据
|
|
if (0 == pInfo->pXData->nVt)
|
|
{
|
|
pInfo->pXData->nVt = TXINT;
|
|
pInfo->pXData->nVal = TDb::eValve;
|
|
}
|
|
// 设置数据
|
|
else
|
|
{
|
|
pInfo->pXData->nVt = 0; // 设置处理完成标识
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
if (0 == _tcsicmp(pszName, KEY_Name))
|
|
{
|
|
pInfo->bVisible = TRUE;
|
|
pInfo->bEditable = TRUE;
|
|
return TRUE;
|
|
}
|
|
|
|
if (0 == _tcsicmp(pszName, KEY_Model))
|
|
{
|
|
pInfo->bVisible = TRUE;
|
|
pInfo->bEditable = TRUE;
|
|
return TRUE;
|
|
}
|
|
|
|
if (0 == _tcsicmp(pszName, KEY_StartPoint))
|
|
{
|
|
pInfo->bVisible = TRUE;
|
|
pInfo->bEditable = FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
if (0 == _tcsicmp(pszName, KEY_Length))
|
|
{
|
|
pInfo->bVisible = TRUE;
|
|
pInfo->bEditable = FALSE;
|
|
// 替代属性,需要特殊处理数据获取和设置
|
|
if (NULL != pInfo->pXData)
|
|
{
|
|
// 获取数据
|
|
if (0 == pInfo->pXData->nVt)
|
|
{
|
|
m_pXDataMap->GetAt(KEY_Length, *pInfo->pXData);
|
|
if(!nIsCap)
|
|
pInfo->pXData->dVal[0] *= 500.0;
|
|
}
|
|
// 设置数据
|
|
else
|
|
{
|
|
//pInfo->pXData->nVt = 0;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (0 == _tcsicmp(pszName, KEY_Width))
|
|
{
|
|
HvacSectType eSectType = eRectangular;
|
|
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
|
if (TDb::eCircular == eSectType)
|
|
{
|
|
pInfo->bVisible = FALSE;
|
|
pInfo->bEditable = FALSE;
|
|
}
|
|
else
|
|
{
|
|
pInfo->bVisible = TRUE;
|
|
pInfo->bEditable = FALSE;
|
|
// 替代属性,需要特殊处理数据获取和设置
|
|
if (NULL != pInfo->pXData)
|
|
{
|
|
// 获取数据
|
|
if (0 == pInfo->pXData->nVt)
|
|
{
|
|
m_pXDataMap->GetAt(KEY_Width, *pInfo->pXData);
|
|
if(!nIsCap)
|
|
pInfo->pXData->dVal[0] *= 1000.0;
|
|
}
|
|
// 设置数据
|
|
else
|
|
{
|
|
//pInfo->pXData->nVt = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// if (0 == _tcsicmp(pszName, KEY_Diameter))
|
|
// {
|
|
// int iSectType = -1;
|
|
// m_pXDataMap->GetAt(HVAC_SectType, iSectType);
|
|
// if (iSectType == 1)
|
|
// {
|
|
// pInfo->bVisible = TRUE;
|
|
// pInfo->bEditable = FALSE;
|
|
//
|
|
// if (NULL != pInfo->pXData)
|
|
// {
|
|
// // 获取数据
|
|
// if (0 == pInfo->pXData->nVt)
|
|
// {
|
|
// m_pXDataMap->GetAt(KEY_Diameter, *pInfo->pXData);
|
|
// if(!nIsCap)
|
|
// pInfo->pXData->dVal[0] *= 1000.0;
|
|
// }
|
|
// // 设置数据
|
|
// else
|
|
// {
|
|
// //pInfo->pXData->nVt = 0;
|
|
// }
|
|
// }
|
|
//
|
|
// }
|
|
// return TRUE;
|
|
// }
|
|
|
|
if (0 == _tcsicmp(pszName, KEY_Thick))
|
|
{
|
|
int iSectType = -1;
|
|
m_pXDataMap->GetAt(HVAC_SectType, iSectType);
|
|
if (iSectType != 1)
|
|
{
|
|
pInfo->bVisible = TRUE;
|
|
pInfo->bEditable = FALSE;
|
|
|
|
//BEGIN==============================================
|
|
if (NULL != pInfo->pXData)
|
|
{
|
|
// 获取数据
|
|
if (0 == pInfo->pXData->nVt)
|
|
{
|
|
m_pXDataMap->GetAt(KEY_Thick, *pInfo->pXData);
|
|
//if(!nIsCap)
|
|
// pInfo->pXData->dVal[0] *= 1000.0;
|
|
}
|
|
}
|
|
//修改时间:2010-05-18
|
|
//修改人 :王亚东
|
|
//修改原因:显示厚度值
|
|
//END===============================================
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//BEGIN===============================================================
|
|
if (0 == _tcsicmp(pszName, KEY_Diameter))
|
|
{
|
|
// 获得截面,当截面为圆型时显示并可改
|
|
HvacSectType eSectType = eRectangular;
|
|
m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType);
|
|
pInfo->bVisible = (TDb::eCircular == eSectType);
|
|
pInfo->bEditable = FALSE;
|
|
|
|
// 替代属性,需要特殊处理数据获取和设置
|
|
if (NULL != pInfo->pXData)
|
|
{
|
|
// 获取数据
|
|
if (0 == pInfo->pXData->nVt)
|
|
{
|
|
m_pXDataMap->GetAt(KEY_Width, *pInfo->pXData);
|
|
if(!nIsCap)
|
|
pInfo->pXData->dVal[0] *= 1000.0;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
//修改时间:2010-05-18
|
|
//修改人 :王亚东
|
|
//修改原因:显示直径值
|
|
//END=================================================================
|
|
|
|
if(!nIsCap)
|
|
{
|
|
// mcl commented.2010.04326.技术支持提出去掉,改参数已不用
|
|
// if (0 == _tcsicmp(pszName, KEY_DimText))
|
|
// {
|
|
// pInfo->bVisible = TRUE;
|
|
// pInfo->bEditable = TRUE;
|
|
// return TRUE;
|
|
// }
|
|
|
|
if (0 == _tcsicmp(pszName, KEY_LabelText))
|
|
{
|
|
pInfo->bVisible = TRUE;
|
|
pInfo->bEditable = TRUE;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//修改标注
|
|
void THImpHvacValve::SetSubText(long i,CString sText)
|
|
{
|
|
// change by hh 2014-1-7
|
|
// 当文字出现中英文混排时,底层绘制会出现多个文字实体
|
|
// 导致文字索引混乱,为避免出现文字修改出错的情况,先取出原
|
|
// 文字进行判断。此方法无法解决多个文字内容相同的情况,
|
|
// 要完全解决此问题,必须修改更底层的处理机制。
|
|
TSubText* pSubTxt = ((TDbInterfacesObj*)m_pOwnerEnt)->GetSubText(i);
|
|
if(NULL != pSubTxt)
|
|
{
|
|
CString sOldTxt = pSubTxt->GetText();
|
|
CString sLabel, sDim, sCode;
|
|
m_pXDataMap->GetAt(HVLV_LabelText, sLabel);
|
|
m_pXDataMap->GetAt(HVLV_DimText, sDim);
|
|
m_pXDataMap->GetAt(HVLV_CodeText, sCode);
|
|
|
|
if(sOldTxt == sLabel)
|
|
m_pXDataMap->SetAt(HVLV_LabelText, sText);
|
|
else if(sOldTxt == sDim)
|
|
m_pXDataMap->SetAt(HVLV_DimText, sText);
|
|
else if(sOldTxt == sCode)
|
|
m_pXDataMap->SetAt(HVLV_CodeText, sText);
|
|
else
|
|
{
|
|
if(-1 != sLabel.Find(sOldTxt))
|
|
m_pXDataMap->SetAt(HVLV_LabelText, sText);
|
|
else if(-1 != sDim.Find(sOldTxt))
|
|
m_pXDataMap->SetAt(HVLV_DimText, sText);
|
|
else if(-1 != sCode.Find(sOldTxt))
|
|
m_pXDataMap->SetAt(HVLV_CodeText, sText);
|
|
}
|
|
|
|
m_pOwnerEnt->recordGraphicsModified();
|
|
}
|
|
|
|
/*if (i == 0)
|
|
{
|
|
CString sLabel;
|
|
m_pXDataMap->GetAt(HVLV_LabelText, sLabel);
|
|
if (sLabel.IsEmpty())
|
|
{
|
|
m_pXDataMap->SetAt(HVLV_DimText, sText);
|
|
}
|
|
else
|
|
{
|
|
m_pXDataMap->SetAt(HVLV_LabelText, sText);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pXDataMap->SetAt(HVLV_DimText, sText);
|
|
}
|
|
m_pOwnerEnt->recordGraphicsModified();*/
|
|
}
|
|
|
|
//得到风阀图块的长度,为V7版本的消声器使用。
|
|
double THImpHvacValve::GetBlkOldLength() const
|
|
{
|
|
double dOLength(500.0);
|
|
AcDbObjectId id = AcDbObjectId::kNull;
|
|
m_pXDataMap->GetAt(HVLV_PartCenter, id);
|
|
|
|
AcDbExtents ext;
|
|
OPENOBJ_BEGIN(id,AcDb::kForRead,AcDbBlockTableRecord,pBTR);
|
|
if (pBTR != NULL)
|
|
{
|
|
ext.addBlockExt(pBTR);
|
|
dOLength = ext.maxPoint().x - ext.minPoint().x;
|
|
//过滤带label的风阀
|
|
if (dOLength < 2000.0)
|
|
{
|
|
dOLength = 500.0;
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
return dOLength;
|
|
}
|
|
|
|
// 得到风阀图块的宽度 add by hh 2011-01-28
|
|
double THImpHvacValve::GetBlkOldWidth() const
|
|
{
|
|
if(NULL == m_pXDataMap)
|
|
return 1000;
|
|
|
|
double dWidth = 1000;
|
|
AcDbObjectId id = AcDbObjectId::kNull;
|
|
m_pXDataMap->GetAt(HVLV_PartCenter, id);
|
|
AcDbExtents ext;
|
|
OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbBlockTableRecord, pBTR);
|
|
if (pBTR != NULL)
|
|
{
|
|
ext.addBlockExt(pBTR);
|
|
dWidth = ext.maxPoint().y - ext.minPoint().y;
|
|
}
|
|
OPENOBJ_END();
|
|
return dWidth;
|
|
}
|
|
|
|
double THImpHvacValve::GetEndLineWidth() const
|
|
{
|
|
BOOL bShow(FALSE);
|
|
GetGlobalContext(HVAC_SHOWWIDTH, bShow);
|
|
// add by hh 2011-01-05 从图纸中读取加粗标识 避免全局参数对不同的图纸间的影响
|
|
TAuxTools::GetTHvacDataFromDwg(HVAC_SHOWWIDTH, bShow);
|
|
|
|
if (!bShow)
|
|
return 0.0;
|
|
|
|
ASSERT(NULL != m_pXDataMap);
|
|
double dWidth(0.0);
|
|
m_pXDataMap->GetAt(HVAC_EndWidth, dWidth);
|
|
|
|
return dWidth;
|
|
}
|
|
|
|
void THImpHvacValve::OnSubErase( Adesk::Boolean erasing )
|
|
{
|
|
if (erasing == Adesk::kTrue && 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 (TAuxTools::IsAutoWorkConnect() && idModel == m_pOwnerEnt->blockId())
|
|
{
|
|
// 写入接口更改消息
|
|
TInterfaceModifyMsg iMsg;
|
|
iMsg.SetMsgValidate(TRUE);
|
|
iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
|
|
iMsg.SetInterfaceOper(TDb::eAutoWorkOn);
|
|
|
|
TDbInterfaceMsgWrite msgWrite;
|
|
msgWrite.WriteInterfaceMsg(iMsg);
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL THImpHvacValve::IsMovedWithInDuct( const AcGeVector3d &vtOffset )
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
|
|
AcDbObjectId idStaCon(AcDbObjectId::kNull), idEndCon(AcDbObjectId::kNull);
|
|
if (!GetConnectDuct(idStaCon, idEndCon))
|
|
return FALSE;
|
|
|
|
// 先找出最远的两个点
|
|
BOOL bStaDuct(FALSE);
|
|
AcGePoint3d ptMin(AcGePoint3d::kOrigin), ptMax(AcGePoint3d::kOrigin);
|
|
OPENOBJ_BEGIN(idStaCon, AcDb::kForRead, TDbInterfacesObj, pObj);
|
|
if (NULL != pObj)
|
|
{
|
|
ObjectKind eKind(eCabletry);
|
|
TDbXDataMap* pObjMap = pObj->GetSpecialtyDataReadOnly();
|
|
if (NULL != pObjMap)
|
|
pObjMap->GetAt(KEY_RUNTIME, (int&)eKind);
|
|
|
|
if (eKind == ePipe)
|
|
{
|
|
TDbHvacDuct* pDuct = TDbHvacDuct::cast(pObj);
|
|
if (NULL != pDuct)
|
|
{
|
|
ptMin = pDuct->StartPoint();
|
|
ptMax = pDuct->EndPoint();
|
|
bStaDuct = TRUE;
|
|
}
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
OPENOBJ_BEGIN(idEndCon, AcDb::kForRead, TDbInterfacesObj, pObj);
|
|
if (NULL != pObj)
|
|
{
|
|
ObjectKind eKind(eCabletry);
|
|
TDbXDataMap* pObjMap = pObj->GetSpecialtyDataReadOnly();
|
|
if (NULL != pObjMap)
|
|
pObjMap->GetAt(KEY_RUNTIME, (int&)eKind);
|
|
|
|
if (eKind == ePipe)
|
|
{
|
|
TDbHvacDuct* pDuct = TDbHvacDuct::cast(pObj);
|
|
if (NULL != pDuct)
|
|
{
|
|
if (bStaDuct)
|
|
{
|
|
AcGePoint3d ptStart = pDuct->StartPoint();
|
|
AcGePoint3d ptEnd = pDuct->EndPoint();
|
|
double dDistSta = ptStart.distanceTo(ptMax);
|
|
double dDistEnd = ptEnd.distanceTo(ptMax);
|
|
AcGePoint3d ptNewMax = dDistEnd > dDistSta ? ptEnd:ptStart;
|
|
|
|
dDistSta = ptMin.distanceTo(ptStart);
|
|
dDistEnd = ptMax.distanceTo(ptStart);
|
|
AcGePoint3d ptNewMin = dDistEnd > dDistSta ? ptMax:ptMin;
|
|
|
|
ptMin = ptNewMin;
|
|
ptMax = ptNewMax;
|
|
}
|
|
else
|
|
{
|
|
ptMin = pDuct->StartPoint();
|
|
ptMax = pDuct->EndPoint();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
if (ptMin.isEqualTo(ptMax, g_globalTol)) // 异常
|
|
return FALSE;
|
|
|
|
AcGePoint3d ptCenter;
|
|
m_pXDataMap->GetAt(HVLV_CenterPoint, ptCenter);
|
|
AcGePoint3d ptNewCenter = ptCenter + vtOffset;
|
|
AcDbLine lineHelp(ptMin, ptMax);
|
|
double dTemp(0.0);
|
|
if (lineHelp.getParamAtPoint(ptNewCenter, dTemp) == Acad::eOk)
|
|
{
|
|
// add by zh 2013-8-20 有一段未连接,返回FALSE
|
|
if (idStaCon == AcDbObjectId::kNull || idEndCon == AcDbObjectId::kNull)
|
|
return FALSE;
|
|
//
|
|
// 距离管两端,不能小于半个阀门加法兰的宽度,否则算移出
|
|
double dDistMin = ptNewCenter.distanceTo(ptMin);
|
|
double dDistMax = ptNewCenter.distanceTo(ptMax);
|
|
double dValveLen(0.0), dScale(1.0);
|
|
m_pXDataMap->GetAt(HVLV_Length, dValveLen);
|
|
dValveLen *= 500 * 0.5;
|
|
dValveLen += 50.0; // 加上法兰宽度
|
|
if (dDistMin > dValveLen && dDistMax > dValveLen)
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
BOOL THImpHvacValve::GetConnectDuct( AcDbObjectId &idSta, AcDbObjectId &idEnd )
|
|
{
|
|
BOOL bFindOne(FALSE);
|
|
TInterface tIfSta, tIfEnd;
|
|
GetInterface(0, tIfSta);
|
|
GetInterface(1, tIfEnd);
|
|
AcDbObjectId idStaCon = tIfSta.GetConnectObject();
|
|
AcDbObjectId idEndCon = tIfEnd.GetConnectObject();
|
|
|
|
// 首端
|
|
OPENOBJ_BEGIN(idStaCon, AcDb::kForRead, TDbInterfacesObj, pObj);
|
|
if (NULL != pObj)
|
|
{
|
|
ObjectKind eKind(eCabletry);
|
|
TDbXDataMap* pObjMap = pObj->GetSpecialtyDataReadOnly();
|
|
if (NULL != pObjMap)
|
|
pObjMap->GetAt(KEY_RUNTIME, (int&)eKind);
|
|
|
|
if (eKind == ePipe)
|
|
{
|
|
idSta = idStaCon;
|
|
bFindOne = TRUE;
|
|
}
|
|
else if (eKind == eFlange) // 从法兰找另一端风管
|
|
{
|
|
TInterface tIfSta, tIfEnd;
|
|
pObj->GetInterface(0, tIfSta);
|
|
pObj->GetInterface(1, tIfEnd);
|
|
AcDbObjectId idStaCon = tIfSta.GetConnectObject();
|
|
AcDbObjectId idEndCon = tIfEnd.GetConnectObject();
|
|
AcDbObjectId idFind = idStaCon;
|
|
if (idStaCon == m_pOwnerEnt->objectId())
|
|
idFind = idEndCon;
|
|
|
|
TDbInterfacesObj* pNextObj = NULL;
|
|
OPENOBJ_BEGIN(idFind, AcDb::kForRead, TDbInterfacesObj, pNextObj);
|
|
if (NULL != pNextObj)
|
|
{
|
|
ObjectKind eKind(ePipe);
|
|
TDbXDataMap* pNextMap = pNextObj->GetSpecialtyDataReadOnly();
|
|
if (NULL != pNextMap)
|
|
{
|
|
pNextMap->GetAt(KEY_RUNTIME, (int&)eKind);
|
|
if (eKind == ePipe)
|
|
{
|
|
idSta = idFind;
|
|
bFindOne = TRUE;
|
|
}
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
// 末端
|
|
OPENOBJ_BEGIN(idEndCon, AcDb::kForRead, TDbInterfacesObj, pObj);
|
|
if (NULL != pObj)
|
|
{
|
|
ObjectKind eKind(eCabletry);
|
|
TDbXDataMap* pObjMap = pObj->GetSpecialtyDataReadOnly();
|
|
if (NULL != pObjMap)
|
|
pObjMap->GetAt(KEY_RUNTIME, (int&)eKind);
|
|
|
|
if (eKind == ePipe)
|
|
{
|
|
idEnd = idEndCon;
|
|
bFindOne = TRUE;
|
|
}
|
|
else if (eKind == eFlange)
|
|
{
|
|
TInterface tIfSta, tIfEnd;
|
|
pObj->GetInterface(0, tIfSta);
|
|
pObj->GetInterface(1, tIfEnd);
|
|
AcDbObjectId idStaCon = tIfSta.GetConnectObject();
|
|
AcDbObjectId idEndCon = tIfEnd.GetConnectObject();
|
|
AcDbObjectId idFind = idStaCon;
|
|
if (idStaCon == m_pOwnerEnt->objectId())
|
|
idFind = idEndCon;
|
|
|
|
TDbInterfacesObj* pNextObj = NULL;
|
|
OPENOBJ_BEGIN(idFind, AcDb::kForRead, TDbInterfacesObj, pNextObj);
|
|
if (NULL != pNextObj)
|
|
{
|
|
ObjectKind eKind(ePipe);
|
|
TDbXDataMap* pNextMap = pNextObj->GetSpecialtyDataReadOnly();
|
|
if (NULL != pNextMap)
|
|
{
|
|
pNextMap->GetAt(KEY_RUNTIME, (int&)eKind);
|
|
if (eKind == ePipe)
|
|
{
|
|
idEnd = idFind;
|
|
bFindOne = TRUE;
|
|
}
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
return bFindOne;
|
|
}
|
|
|
|
LRESULT THImpHvacValve::UserCall( long i,LPVOID pData )
|
|
{
|
|
ASSERT(NULL != m_pXDataMap);
|
|
|
|
m_pXDataMap->SetAt(KEY_IDCNT1, NULL);
|
|
m_pXDataMap->SetAt(KEY_IDCNT2, NULL);
|
|
|
|
return 1l;
|
|
}
|
|
|
|
int THImpHvacValve::GetXBaseShell(TXShell& xShell)
|
|
{
|
|
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(HVLV_Width, dWidth);
|
|
dWidth *= 1000.0;
|
|
double dThick = 0.0;
|
|
m_pXDataMap->GetAt(HVLV_Thick, dThick);
|
|
AcGeVector3d vtNormal;
|
|
m_pXDataMap->GetAt(HVAC_Normal, vtNormal);
|
|
vtNormal.normalize();
|
|
AcGePoint3d ptStart = GetStartPt();
|
|
AcGePoint3d ptEnd = GetEndPt();
|
|
|
|
// 构造碰撞实体
|
|
TAuxTools::BuildRectDuct(ptStart, ptEnd, vtNormal, dWidth, dThick, dWidth, dThick, xShell);
|
|
}
|
|
else if (TDb::eCircular == eSectType)
|
|
{
|
|
// 获得参数
|
|
double dDiameter = 0.0;
|
|
m_pXDataMap->GetAt(HVLV_Diameter, dDiameter);
|
|
dDiameter *= 1000.0;
|
|
AcGePoint3d ptStart = GetStartPt();
|
|
AcGePoint3d ptEnd = GetEndPt();
|
|
|
|
// 构造碰撞实体
|
|
TAuxTools::BuildCirDuct(ptStart, ptEnd, dDiameter, dDiameter, xShell);
|
|
}
|
|
else
|
|
{
|
|
// 不做处理
|
|
;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int THImpHvacValve::GetBodyBox( AcDbExtents& ext ) const
|
|
{
|
|
if (NULL == m_pXDataMap)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// 获得参数
|
|
double dWidth = 0.0;
|
|
m_pXDataMap->GetAt(HVLV_Width, dWidth);
|
|
dWidth *= 1000.0;
|
|
double dHalfWidth = dWidth / 2.0;
|
|
double dThick = 0.0;
|
|
m_pXDataMap->GetAt(HVLV_Thick, 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(HVAC_Normal, vtNormal);
|
|
vtNormal.normalize();
|
|
AcGePoint3d ptStart = GetStartPt();
|
|
AcGePoint3d ptEnd = GetEndPt();
|
|
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;
|
|
}
|
|
|
|
// 导出XML
|
|
// CString THImpHvacValve::GetXml() 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;
|
|
// 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(HVLV_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(HVLV_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(HVLV_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(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(HVLV_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);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemPart2D, _T("name"), _T("2D块ID"));
|
|
// xmlTree.SetAttribute(posItemPart2D, _T("comment"), _T("平面图块"));
|
|
// m_pXDataMap->GetAt(HVLV_PartCenter, id);
|
|
// csText.Format(_T("%d"), id.asOldId());
|
|
// xmlTree.SetItemText(posItemPart2D, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemPart3D = xmlTree.Insert(_T("Part3D"), posRoot, posItemPart2D);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemPart3D, _T("name"), _T("3D块ID"));
|
|
// xmlTree.SetAttribute(posItemPart3D, _T("comment"), _T("三维图块"));
|
|
// m_pXDataMap->GetAt(HVLV_Part3D, id);
|
|
// csText.Format(_T("%d"), id.asOldId());
|
|
// xmlTree.SetItemText(posItemPart3D, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemLength = xmlTree.Insert(_T("Length"), posRoot, posItemPart3D);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemLength, _T("name"), _T("长度"));
|
|
// xmlTree.SetAttribute(posItemLength, _T("comment"), _T("阀门长度"));
|
|
// m_pXDataMap->GetAt(HVLV_Length, dValue);
|
|
// // change by hh 2011-01-10 阀门长度(比例)*图块长度
|
|
// // TAuxTools::DoubleToString(dValue, nWhPreci, csText);
|
|
// TAuxTools::DoubleToString(dValue * GetBlkOldLength(), 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(HVLV_Width, dValue);
|
|
// // change by hh 2011-01-10 阀门宽度(比例)*图块宽度
|
|
// // TAuxTools::DoubleToString(dValue, nWhPreci, csText);
|
|
// TAuxTools::DoubleToString(dValue * GetBlkOldWidth(), 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(HVLV_Thick, dValue);
|
|
// TAuxTools::DoubleToString(dValue, nWhPreci, csText);
|
|
// xmlTree.SetItemText(posItemThick, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemMirror = xmlTree.Insert(_T("IsMirror"), posRoot, posItemThick);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemMirror, _T("name"), _T("是否镜像"));
|
|
// xmlTree.SetAttribute(posItemMirror, _T("comment"), _T("用于辅助绘制0:否,1:是"));
|
|
// m_pXDataMap->GetAt(HVLV_IsMirror, nValue);
|
|
// csText.Format(_T("%d"), nValue);
|
|
// xmlTree.SetItemText(posItemMirror, csText);
|
|
// }
|
|
//
|
|
// POSITION posItemDuctCap = xmlTree.Insert(_T("IsDuctCap"), posRoot, posItemMirror);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemDuctCap, _T("name"), _T("是否是风帽"));
|
|
// xmlTree.SetAttribute(posItemDuctCap, _T("comment"), _T("用于判断是否是风帽0:不是,1:是"));
|
|
// m_pXDataMap->GetAt(HVLV_IsDuctCap, nValue);
|
|
// csText.Format(_T("%d"), nValue);
|
|
// xmlTree.SetItemText(posItemDuctCap, csText);
|
|
// }
|
|
//
|
|
// CString csXml = xmlTree.GetXml();
|
|
//
|
|
// return csXml;
|
|
// }
|
|
|
|
CString THImpHvacValve::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;
|
|
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(HVLV_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(HVLV_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(HVLV_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(HVLV_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);
|
|
}
|
|
|
|
// begin ////
|
|
// mod by wc 13-12-24
|
|
// 原因:id值可能会变,需要保存图块名称
|
|
|
|
POSITION posItemPart2D = xmlTree.Insert(_T("Part2D"), posRoot, posItemMainDir);
|
|
{
|
|
xmlTree.SetAttribute(posItemPart2D, _T("name"), _T("2D块名称"));
|
|
xmlTree.SetAttribute(posItemPart2D, _T("comment"), _T("平面图块"));
|
|
m_pXDataMap->GetAt(HVLV_PartCenter, id);
|
|
csText = TAuxTools::GetBlkNameById(id);
|
|
//csText.Format(_T("%d"), id.asOldId());
|
|
xmlTree.SetItemText(posItemPart2D, csText);
|
|
}
|
|
|
|
POSITION posItemPart3D = xmlTree.Insert(_T("Part3D"), posRoot, posItemPart2D);
|
|
{
|
|
xmlTree.SetAttribute(posItemPart3D, _T("name"), _T("3D块名称"));
|
|
xmlTree.SetAttribute(posItemPart3D, _T("comment"), _T("三维图块"));
|
|
m_pXDataMap->GetAt(HVLV_Part3D, id);
|
|
csText = TAuxTools::GetBlkNameById(id);
|
|
//csText.Format(_T("%d"), id.asOldId());
|
|
xmlTree.SetItemText(posItemPart3D, csText);
|
|
}
|
|
// end //
|
|
|
|
// add by wc 13-12-24 系统图块//
|
|
POSITION posItemPartSys = xmlTree.Insert(_T("PartSys"), posRoot, posItemPart3D);
|
|
{
|
|
xmlTree.SetAttribute(posItemPartSys, _T("name"), _T("系统块名称"));
|
|
xmlTree.SetAttribute(posItemPartSys, _T("comment"), _T("三维图块"));
|
|
m_pXDataMap->GetAt(HVLV_PartSys, id);
|
|
csText = TAuxTools::GetBlkNameById(id);
|
|
xmlTree.SetItemText(posItemPartSys, csText);
|
|
}
|
|
|
|
POSITION posItemLength = xmlTree.Insert(_T("Length"), posRoot, posItemPartSys);
|
|
{
|
|
xmlTree.SetAttribute(posItemLength, _T("name"), _T("长度"));
|
|
xmlTree.SetAttribute(posItemLength, _T("comment"), _T("阀门长度"));
|
|
m_pXDataMap->GetAt(HVLV_Length, dValue);
|
|
// change by hh 2011-01-10 阀门长度(比例)*图块长度
|
|
// TAuxTools::DoubleToString(dValue, nWhPreci, csText);
|
|
TAuxTools::DoubleToString(dValue * GetBlkOldLength(), 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(HVLV_Width, dValue);
|
|
// change by hh 2011-01-10 阀门宽度(比例)*图块宽度
|
|
// TAuxTools::DoubleToString(dValue, nWhPreci, csText);
|
|
TAuxTools::DoubleToString(dValue * GetBlkOldWidth(), 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("阀门高度"));
|
|
// mod by wc 13-12-24
|
|
if (!m_pXDataMap->GetAt(HVLV_Thick, dValue))
|
|
{
|
|
dValue = 0.0;
|
|
}
|
|
TAuxTools::DoubleToString(dValue, nWhPreci, csText);
|
|
xmlTree.SetItemText(posItemThick, csText);
|
|
}
|
|
|
|
POSITION posItemMirror = xmlTree.Insert(_T("IsMirror"), posRoot, posItemThick);
|
|
{
|
|
xmlTree.SetAttribute(posItemMirror, _T("name"), _T("是否镜像"));
|
|
xmlTree.SetAttribute(posItemMirror, _T("comment"), _T("用于辅助绘制0:否,1:是"));
|
|
m_pXDataMap->GetAt(HVLV_IsMirror, nValue);
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemMirror, csText);
|
|
}
|
|
|
|
POSITION posItemDuctCap = xmlTree.Insert(_T("IsDuctCap"), posRoot, posItemMirror);
|
|
{
|
|
xmlTree.SetAttribute(posItemDuctCap, _T("name"), _T("是否是风帽"));
|
|
xmlTree.SetAttribute(posItemDuctCap, _T("comment"), _T("用于判断是否是风帽0:不是,2:是"));
|
|
m_pXDataMap->GetAt(HVLV_IsDuctCap, nValue);
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemDuctCap, csText);
|
|
}
|
|
//add by wc 13-12-12
|
|
|
|
POSITION posItemIsBreakPipe = xmlTree.Insert(_T("IsBreakPipe"), posRoot, posItemDuctCap);
|
|
{
|
|
xmlTree.SetAttribute(posItemIsBreakPipe, _T("name"), _T("是否带边线"));
|
|
xmlTree.SetAttribute(posItemIsBreakPipe, _T("comment"), _T("用于判断是否添加两条边线0:否,1:是"));
|
|
if (!m_pXDataMap->GetAt(HVLV_IsBreakPipe, nValue))
|
|
nValue = 0;
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemIsBreakPipe, csText);
|
|
}
|
|
|
|
POSITION posItemHasEndLine = xmlTree.Insert(_T("HasEndLine"), posRoot, posItemIsBreakPipe);
|
|
{
|
|
xmlTree.SetAttribute(posItemHasEndLine, _T("name"), _T("是否带端线"));
|
|
xmlTree.SetAttribute(posItemHasEndLine, _T("comment"), _T("用于设置两个End端的线与风管一致0:否,1:是"));
|
|
if (!m_pXDataMap->GetAt(HVLV_HasEndLine, nValue))
|
|
nValue = 0;
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemHasEndLine, csText);
|
|
}
|
|
//
|
|
// POSITION posItemDuctLayer = xmlTree.Insert(_T("DuctLayer"), posRoot, posItemHasEndLine);
|
|
// {
|
|
// xmlTree.SetAttribute(posItemDuctLayer, _T("name"), _T("风管的图层"));
|
|
// xmlTree.SetAttribute(posItemDuctLayer, _T("comment"), _T("风管图层的名字"));
|
|
// if (!m_pXDataMap->GetAt(HVLV_DuctLayer, id))
|
|
// csText.Empty();
|
|
// else
|
|
// {
|
|
// ACHAR* pChar = NULL;
|
|
// AcDbObject *pObj = NULL;
|
|
// if (Acad::eOk == acdbOpenObject(pObj, id, AcDb::kForRead))
|
|
// {
|
|
// AcDbLayerTableRecord *pRec = AcDbLayerTableRecord::cast(pObj);
|
|
// if (pRec != NULL)
|
|
// {
|
|
// pRec->getName(pChar);
|
|
// csText.Format(_T("%s"), pChar);
|
|
// pRec->close();
|
|
// }
|
|
// pObj->close();
|
|
// }
|
|
// }
|
|
// xmlTree.SetItemText(posItemDuctLayer, csText);
|
|
// }
|
|
|
|
POSITION posItemLablePoint = xmlTree.Insert(_T("LablePoint"), posRoot, posItemHasEndLine);
|
|
{
|
|
xmlTree.SetAttribute(posItemLablePoint, _T("name"), _T("标签点"));
|
|
xmlTree.SetAttribute(posItemLablePoint, _T("comment"), _T("标签点"));
|
|
if (!m_pXDataMap->GetAt(HVLV_LabelPoint, pt))
|
|
csText.Empty();
|
|
else
|
|
{
|
|
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(posItemLablePoint, csText);
|
|
}
|
|
|
|
POSITION posItemLableText = xmlTree.Insert(_T("LableText"), posRoot, posItemLablePoint);
|
|
{
|
|
xmlTree.SetAttribute(posItemLableText, _T("name"), _T("标签文字"));
|
|
xmlTree.SetAttribute(posItemLableText, _T("comment"), _T("标签文字"));
|
|
if (!m_pXDataMap->GetAt(HVLV_LabelText, csText))
|
|
csText.Empty();
|
|
xmlTree.SetItemText(posItemLableText, csText);
|
|
}
|
|
|
|
POSITION posItemDimPoint = xmlTree.Insert(_T("DimPoint"), posRoot, posItemLableText);
|
|
{
|
|
xmlTree.SetAttribute(posItemDimPoint, _T("name"), _T("标注点"));
|
|
xmlTree.SetAttribute(posItemDimPoint, _T("comment"), _T("标注点"));
|
|
if (!m_pXDataMap->GetAt(HVLV_DimPoint, pt))
|
|
csText.Empty();
|
|
else
|
|
{
|
|
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(posItemDimPoint, csText);
|
|
}
|
|
|
|
POSITION posItemDimText = xmlTree.Insert(_T("DimText"), posRoot, posItemDimPoint);
|
|
{
|
|
xmlTree.SetAttribute(posItemDimText, _T("name"), _T("标注文字"));
|
|
xmlTree.SetAttribute(posItemDimText, _T("comment"), _T("标注文字"));
|
|
if (!m_pXDataMap->GetAt(HVLV_DimText, csText))
|
|
csText.Empty();
|
|
xmlTree.SetItemText(posItemDimText, csText);
|
|
}
|
|
|
|
POSITION posItemSilAddLen = xmlTree.Insert(_T("SilAddLen"), posRoot, posItemDimText);
|
|
{
|
|
xmlTree.SetAttribute(posItemSilAddLen, _T("name"), _T("消声器出头长度"));
|
|
xmlTree.SetAttribute(posItemSilAddLen, _T("comment"), _T("消声器出头长度"));
|
|
m_pXDataMap->GetAt(HVLV_SilAddLen, dValue);
|
|
TAuxTools::DoubleToString(dValue, nWhPreci, csText);
|
|
xmlTree.SetItemText(posItemSilAddLen, csText);
|
|
}
|
|
|
|
POSITION posItemReversalX = xmlTree.Insert(_T("ReversalX"), posRoot, posItemSilAddLen);
|
|
{
|
|
xmlTree.SetAttribute(posItemReversalX, _T("name"), _T("是否左右旋转"));
|
|
xmlTree.SetAttribute(posItemReversalX, _T("comment"), _T("0/不是、1/是"));
|
|
if (!m_pXDataMap->GetAt(HVLV_IsReverseX, 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(HVLV_IsReverseY, nValue))
|
|
{
|
|
nValue = 0;
|
|
}
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posItemReversalY, csText);
|
|
}
|
|
|
|
POSITION posSysName = xmlTree.Insert(_T("System"), posRoot, posItemReversalY);
|
|
{
|
|
xmlTree.SetAttribute(posSysName, _T("name"), _T("管线类型"));
|
|
xmlTree.SetAttribute(posSysName, _T("comment"), _T("回风/送风/通风..."));
|
|
m_pXDataMap->GetAt(HVAC_System, csText);
|
|
xmlTree.SetItemText(posSysName, csText);
|
|
}
|
|
|
|
|
|
POSITION posItemSectType = xmlTree.Insert(_T("SectType"), posRoot, posSysName);
|
|
{
|
|
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);
|
|
}
|
|
|
|
POSITION posItemCodeText = xmlTree.Insert(_T("CodeText"), posRoot, posItemSectType);
|
|
{
|
|
xmlTree.SetAttribute(posItemCodeText, _T("name"), _T("阀门代号"));
|
|
xmlTree.SetAttribute(posItemCodeText, _T("comment"), _T("阀门代号"));
|
|
if (!m_pXDataMap->GetAt(HVLV_CodeText, csText))
|
|
csText.Empty();
|
|
xmlTree.SetItemText(posItemCodeText, csText);
|
|
}
|
|
|
|
POSITION posItemCodePoint = xmlTree.Insert(_T("CodePoint"), posRoot, posItemCodeText);
|
|
{
|
|
xmlTree.SetAttribute(posItemCodePoint, _T("name"), _T("代号点"));
|
|
xmlTree.SetAttribute(posItemCodePoint, _T("comment"), _T("代号点"));
|
|
if (!m_pXDataMap->GetAt(HVLV_CodePoint, pt))
|
|
csText.Empty();
|
|
else
|
|
{
|
|
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(posItemCodePoint, csText);
|
|
}
|
|
|
|
POSITION posItemMaterial = xmlTree.Insert(_T("Material"),posRoot, posItemCodePoint);
|
|
{
|
|
xmlTree.SetAttribute(posItemMaterial, _T("name"), _T("风管材料"));
|
|
xmlTree.SetAttribute(posItemMaterial, _T("comment"), _T("风管使用的材料"));
|
|
m_pXDataMap->GetAt(HVAC_Material, csText);
|
|
xmlTree.SetItemText(posItemMaterial, csText);
|
|
}
|
|
|
|
POSITION posIsEdgeWidth = xmlTree.Insert(_T("IsEdgeWidth"), posRoot, posItemMaterial);
|
|
{
|
|
xmlTree.SetAttribute(posIsEdgeWidth, _T("name"), _T("边线是否加粗"));
|
|
xmlTree.SetAttribute(posIsEdgeWidth, _T("comment"), _T("0/不加粗, 1/加粗"));
|
|
if (!m_pXDataMap->GetAt(HVAC_EdgeWeight, nValue))
|
|
nValue = 0;
|
|
csText.Format(_T("%d"), nValue);
|
|
xmlTree.SetItemText(posIsEdgeWidth, csText);
|
|
}
|
|
|
|
POSITION posEdgeWidth = xmlTree.Insert(_T("EdgeWidth"), posRoot, posIsEdgeWidth);
|
|
{
|
|
xmlTree.SetAttribute(posEdgeWidth, _T("name"), _T("边线加粗量"));
|
|
xmlTree.SetAttribute(posEdgeWidth, _T("comment"), _T("边线加粗的数值"));
|
|
m_pXDataMap->GetAt(HVAC_EdgeWidth, dValue);
|
|
csText.Format(_T("%f"), dValue);
|
|
xmlTree.SetItemText(posEdgeWidth, csText);
|
|
}
|
|
|
|
POSITION posEndWidth = xmlTree.Insert(_T("EndWidth"), posRoot, posEdgeWidth);
|
|
{
|
|
xmlTree.SetAttribute(posEndWidth, _T("name"), _T("端线加粗量"));
|
|
xmlTree.SetAttribute(posEndWidth, _T("comment"), _T("端线加粗的数值"));
|
|
m_pXDataMap->GetAt(HVAC_EndWidth, dValue);
|
|
csText.Format(_T("%f"), dValue);
|
|
xmlTree.SetItemText(posEndWidth, csText);
|
|
}
|
|
|
|
CString csXml = xmlTree.GetXml();
|
|
|
|
return csXml;
|
|
}
|
|
|
|
// add by hh 2014-08-06 支持设备与水管遮挡
|
|
Acad::ErrorStatus THImpHvacValve::GetClipBoundary(TGGePoly2D& poly)const
|
|
{
|
|
AcDbPolyline* pLine = MakePolyCurve();
|
|
if(NULL == pLine)
|
|
return Acad::eNotImplementedYet;
|
|
|
|
double dBrWidth = 0;
|
|
if(!TAuxTools::GetTHvacDataFromDwg(HVAC_PIPEHIDEWIDTH, dBrWidth))
|
|
GetGlobalContext()->GetAt(HVAC_PIPEHIDEWIDTH, dBrWidth);
|
|
if(EQUAL_ZERO(dBrWidth))
|
|
{
|
|
PolyConvert(*pLine, poly);
|
|
}
|
|
else
|
|
{
|
|
AcDbVoidPtrArray arPLines;
|
|
pLine->getOffsetCurves(dBrWidth, arPLines);
|
|
if(0 == arPLines.length())
|
|
{
|
|
PolyConvert(*pLine, poly);
|
|
}
|
|
else
|
|
{
|
|
PolyConvert(*((AcDbPolyline*)arPLines[0]), poly);
|
|
for(int i = 0; i < arPLines.length(); i++)
|
|
{
|
|
if(NULL != arPLines[i])
|
|
delete (AcDbEntity*)arPLines[i];
|
|
}
|
|
}
|
|
}
|
|
delete pLine;
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
bool THImpHvacValve::IsMeClip() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool THImpHvacValve::IsClipMe(const TEntityBase* pEnt)const//ok是否被裁剪
|
|
{
|
|
if(NULL == pEnt)
|
|
return false;
|
|
|
|
//add by dyw 20150409 当图纸复杂时,遮挡的更改影响水管的绘制速度,暂时屏蔽掉
|
|
return false;
|
|
//add end
|
|
|
|
CString sClassName = pEnt->GetMe()->isA()->name();
|
|
if(0 == sClassName.Compare(_T("TDbPipe"))) // 水管
|
|
{
|
|
TInterfaceModifyMsg iMsg;
|
|
iMsg.SetInterfaceOper(TDb::eUpdateCover);
|
|
iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId());
|
|
|
|
// 写入接口更改消息
|
|
TDbInterfaceMsgWrite msgWrite;
|
|
msgWrite.WriteInterfaceMsg(iMsg);
|
|
|
|
return true;
|
|
}
|
|
return false;
|
|
} |