364 lines
12 KiB
C++
364 lines
12 KiB
C++
// DbVentPipe.h: interface for the TDbDuct class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(AFX_DBVENTPIPE_H__2B3CEC0F_B759_411E_89CC_C4F8BA1D5358__INCLUDED_)
|
|
#define AFX_DBVENTPIPE_H__2B3CEC0F_B759_411E_89CC_C4F8BA1D5358__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include "PipePrototype.h"
|
|
#include "HDbEquipment.h"
|
|
|
|
|
|
|
|
/*============================================================================*
|
|
* Copyright(c), 1994-2007, Beijing Tangent Engineering Software Co.Ltd.
|
|
* 文 件 名: DbDuct.h
|
|
* 版 本: 1.0
|
|
* 作 者: sg
|
|
* 创建时间:
|
|
* 描 述: 风管自定义实体
|
|
* 归属项目: 暖通
|
|
* 历史记录: 1. 2008-1-14 sg modify,修改对齐方式变量到管线中
|
|
=============================================================================*/
|
|
class PS_EXP TDbDuct: public TDbPipePrototype
|
|
{
|
|
DECLARE_TENTBASE();
|
|
ACRX_DECLARE_MEMBERS(TDbDuct);
|
|
|
|
private:
|
|
static const Adesk::UInt8 g_nVersion;
|
|
|
|
public:
|
|
enum DuiQiType { // 对齐方式类型
|
|
kLeftUp = 0, // 左上
|
|
kMidUp = 1, // 中上
|
|
kRightUp = 2, // 右上
|
|
kLeftMid = 3, // 左中
|
|
kMidMid = 4, // 中中
|
|
kRightMid = 5, // 右中
|
|
kLeftLow = 6, // 左下
|
|
kMidLow = 7, // 中下
|
|
kRightLow = 8, // 右下
|
|
};
|
|
|
|
public:
|
|
TDbDuct();
|
|
|
|
public:
|
|
double m_dOldWidth, // 老的宽度和高度(Not Database Resident)
|
|
m_dOldHeight;
|
|
double m_dVer; // 版本号,不保存
|
|
|
|
protected:
|
|
///////////////以下变量用于绘制///////////////
|
|
// 系统绘制方式,1为单线,2为双线(绘中心线),3为双线(不绘中心线)
|
|
Adesk::UInt8 m_nSysDrawMod;
|
|
|
|
// 截面样式:0:矩形;1:圆形;2:软管(暂无);3:椭圆(暂无);4:扁圆(暂无)
|
|
Adesk::UInt8 m_nSection;
|
|
double m_dWidth; // 宽度,圆管直径,软管直接,椭圆管短轴半径,扁圆长度a
|
|
double m_dHeight; // 高度,圆管和软管为0,椭圆管长轴半径,扁圆长度b
|
|
|
|
double m_dDuctWeight; // 管线的显示宽度,非立管时
|
|
double m_dVDAngle; // 立管宽度方向与X轴正向的夹角
|
|
double m_dFlChuTou; // 法兰出头
|
|
double m_dFlThick; // 法兰厚度
|
|
|
|
AcDbHardPointerId m_idDoteLayer; // 中心线图层
|
|
|
|
///////////////以下变量用于处理机制///////////////
|
|
DList<AcDbSoftPointerId> m_lstEquipment; // 管段上附着的设备、掏洞连接件
|
|
|
|
TPipeSys::PtLoction m_eDQSide; // 对齐方向
|
|
DuiQiType m_eDQType; // 对齐方式
|
|
|
|
///////////////以下变量用于其他///////////////
|
|
Adesk::UInt16 m_nMaterial; // 材料类型
|
|
XString m_sLabel; // 风管标注内容
|
|
|
|
double m_dSpeedSubMid; // 写入数据库用于显示加速的参数
|
|
double m_dSpeedLength;
|
|
|
|
///////////////以下变量用于计算///////////////
|
|
double m_dCalWeight; // 风量
|
|
|
|
|
|
protected: // 备用数据,以后扩充用
|
|
Adesk::UInt8 m_nSpare;
|
|
double m_dSpare;
|
|
XString m_csSpare;
|
|
|
|
|
|
public: // Set、Get函数
|
|
///////////////以下变量用于绘制///////////////
|
|
Adesk::UInt8 GetSysDrawMod() const { // 系统绘制方式
|
|
return m_nSysDrawMod;
|
|
}
|
|
void SetSysDrawMod(const Adesk::UInt8 nMod) {
|
|
assertWriteEnabled();
|
|
m_nSysDrawMod = nMod;
|
|
}
|
|
|
|
Adesk::UInt8 GetSectionType() const { // 截面类型
|
|
return m_nSection;
|
|
}
|
|
void SetSectionType(const Adesk::Int8 nSection) {
|
|
assertWriteEnabled();
|
|
m_nSection = nSection;
|
|
}
|
|
|
|
double GetWidth() const { // 宽度
|
|
return m_dWidth;
|
|
}
|
|
void SetWidth(const double dWidth) {
|
|
assertWriteEnabled();
|
|
m_dWidth = dWidth;
|
|
}
|
|
double GetHeight() const { // 高度
|
|
return m_dHeight;
|
|
}
|
|
void SetHeight(const double dHeight) {
|
|
assertWriteEnabled();
|
|
m_dHeight = dHeight;
|
|
}
|
|
|
|
double GetFlChuTou() const { // 法兰出头
|
|
return m_dFlChuTou;
|
|
}
|
|
void SetFlChuTou(const double dDist) {
|
|
assertWriteEnabled();
|
|
m_dFlChuTou = dDist;
|
|
}
|
|
|
|
double GetFlThick() const { // 法兰厚度
|
|
return m_dFlThick;
|
|
}
|
|
void SetFlThick(const double dThick) {
|
|
assertWriteEnabled();
|
|
m_dFlThick = dThick;
|
|
}
|
|
|
|
double GetDuctWeight() const { // 管线的显示宽度
|
|
return m_dDuctWeight;
|
|
}
|
|
void SetDuctWeight(const double dWeight) {
|
|
assertWriteEnabled();
|
|
m_dDuctWeight = dWeight;
|
|
}
|
|
|
|
double GetVDAngle() const { // 立管宽度方向与X轴正向的夹角
|
|
return m_dVDAngle;
|
|
}
|
|
void SetVDAngle(const double dAngle) {
|
|
assertWriteEnabled();
|
|
m_dVDAngle = dAngle;
|
|
}
|
|
|
|
AcDbObjectId GetDoteLayer() const { // 中心线图层
|
|
return m_idDoteLayer;
|
|
}
|
|
void SetDoteLayer(const AcDbObjectId &id) {
|
|
assertWriteEnabled();
|
|
m_idDoteLayer = id;
|
|
}
|
|
|
|
/////////////////以下变量用于其他/////////////////
|
|
int GetMaterial() const { // 材料
|
|
return (int)m_nMaterial;
|
|
}
|
|
void SetMaterial(const int nMaterial) {
|
|
assertWriteEnabled();
|
|
m_nMaterial = (Adesk::UInt16)nMaterial;
|
|
}
|
|
|
|
const TCHAR* GetLabel() const { // 标注
|
|
return (const TCHAR*)m_sLabel;
|
|
}
|
|
void SetLabel(const TCHAR* sText) {
|
|
assertWriteEnabled();
|
|
m_sLabel = sText;
|
|
}
|
|
|
|
///////////////以下变量用于处理机制///////////////
|
|
DuiQiType GetDuiQi() const { // 对齐方式
|
|
return m_eDQType;
|
|
}
|
|
void SetDuiQi(const DuiQiType nType) {
|
|
assertWriteEnabled();
|
|
m_eDQType = nType;
|
|
}
|
|
|
|
TPipeSys::PtLoction GetDQSide() const { // 对齐方向
|
|
return m_eDQSide;
|
|
}
|
|
void SetDQSide(const TPipeSys::PtLoction nSide) {
|
|
assertWriteEnabled();
|
|
m_eDQSide = nSide;
|
|
}
|
|
|
|
///////////////以下变量用于计算///////////////
|
|
void SetCalWeight(const double dWeight) { // 风量
|
|
assertWriteEnabled();
|
|
m_dCalWeight = dWeight;
|
|
}
|
|
double GetCalWeight() const {
|
|
return m_dCalWeight;
|
|
}
|
|
|
|
///////////////以下变量用于备用///////////////
|
|
XString GetSpareStr() const { // 备用
|
|
return m_csSpare;
|
|
}
|
|
void SetSpareStr(const TCHAR* csText) {
|
|
assertWriteEnabled();
|
|
m_csSpare = csText;
|
|
}
|
|
double GetSpare() const {
|
|
return m_dSpare;
|
|
}
|
|
void SetSpare(const double dSpare) {
|
|
assertWriteEnabled();
|
|
m_dSpare = dSpare;
|
|
}
|
|
int GetSpareInt() const {
|
|
return m_nSpare;
|
|
}
|
|
void SetSpareInt(const int nSpare) {
|
|
assertWriteEnabled();
|
|
m_nSpare = nSpare;
|
|
}
|
|
|
|
|
|
public:
|
|
XPoint GetVertexPt(const TPipeSys::PtLoction nSide) const; // 获取指定端坐标
|
|
XPoint GetOtherPt(const TPipeSys::PtLoction nSide) const; // 获取另一端坐标
|
|
|
|
// 获取管线法向,注:根据需要,考虑修改,如果是掏洞则考虑用切线方向
|
|
XVector3D GetDirection(const XPoint &pt, TPipeSys::PtLoction &nSide) const;
|
|
|
|
BOOL IsCircleDuct() const { // 是否是圆风管,该函数可使用GetSectionType==1替换
|
|
return fabs(m_dHeight)<1.0E-6;
|
|
}
|
|
|
|
void SwitchVane(); // 交换风管的起止点和连接的接点ID
|
|
|
|
|
|
public: // 有关管段上附着的节点
|
|
void AddEquipment(const AcDbObjectId &id); // 增加节点,先检查是否已连接了该节点
|
|
void RemoveEquipment(const AcDbObjectId &id); // 移除节点
|
|
BOOL FindEquipment(const AcDbObjectId &id) const; // 查找节点
|
|
|
|
int GetEquipNum() const; // 获取连接的节点数量
|
|
void GetEquipments(DList<AcDbObjectId>& lstEquipment) const; // 获取节点ID
|
|
void GetEquipPts(XPointList &lstPts) const; // 获取节点位置
|
|
|
|
// 判断管线与节点是否能在指定接口处,产生附着关系
|
|
BOOL CanAttachEquipment(const THDbEquipment &equipment, const int &nIFaceNum) const;
|
|
// 重新验证同自身全部附着的节点之间的关系,并调整配属, 在系统结束后处理
|
|
void ValidateEquipmentShip();
|
|
|
|
|
|
public: // Override TDbEntity
|
|
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const; // 绘制
|
|
virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &dc) const;
|
|
|
|
virtual void CopyPropertiesFrom(AcDbEntity* pSrc, unsigned gMatchFlag);
|
|
virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const;
|
|
virtual void GetTips(DList<TObjInfoUnit> &lstInfo) const; // 取动态属性显示数据
|
|
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
|
|
|
|
virtual long GetSubTextNum() const { return 1; }
|
|
virtual int GetFirstVersion() const { return 7; }
|
|
|
|
public: // Override AcDbEntity
|
|
Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark,
|
|
const AcGePoint3d &ptPick, const AcGePoint3d &lastPoint,
|
|
const AcGeMatrix3d &viewXform, AcGePoint3dArray &snapPoints,
|
|
AcDbIntArray &geomIds) const;
|
|
|
|
virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints,
|
|
AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const;
|
|
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,
|
|
const AcGeVector3d& offset);
|
|
virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray &indices,
|
|
const AcGeVector3d &offset);
|
|
|
|
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
|
|
|
|
// 注:考虑读旧图,及另存旧版的问题
|
|
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);
|
|
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
|
|
virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler*);
|
|
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
|
|
|
|
virtual Acad::ErrorStatus subOpen(AcDb::OpenMode mode);
|
|
virtual Acad::ErrorStatus subClose();
|
|
virtual Acad::ErrorStatus subErase(Adesk::Boolean bErasing);
|
|
|
|
|
|
public: // Override TDbPipePrototype
|
|
// 派生类中加入其他的判断条件(如实体类型相同、截面形状相同等)
|
|
// 注:考虑对弧管的判断,特别是合并的时
|
|
virtual BOOL CanMergeWith(const TDbDuct &other, int* iPosThis = NULL,
|
|
int* iPosOther = NULL) const;
|
|
// 与另外一个管段的合并,派生类可以重制(先调用基类的合并),完成其他数据的合并
|
|
virtual BOOL MergeWith(TDbDuct &another);
|
|
|
|
virtual double GetBreakWidth() const;
|
|
|
|
virtual XExtent GetExtent() const;
|
|
virtual XExtent GetOldExtent() const;
|
|
virtual int GetExtend(XPoint &low, XPoint &up) const;
|
|
|
|
virtual void ApplyDnDiameterChangeToLabel(); // 提供截面尺寸的变化到标注
|
|
XString GetLabelText() const; // 获取标注内容
|
|
|
|
virtual void ResetDrawSpeed(); // 重新设置显示加速数据
|
|
|
|
// 增加节点到当前数据库,ids-该节点连接的管线或节点
|
|
AcDbObjectId AddNodeToDb(const XPoint &ptAt, const DList<AcDbObjectId> &ids,
|
|
const AcDbIntArray &types, const int &nMainDuct);
|
|
|
|
public: // Renew TDbPipePrototype
|
|
BOOL IsUpPipesOk() const; // 判断立管的上节点是否连接了非立管
|
|
|
|
// 以下函数主要考虑扣弯的绘制
|
|
void GetUpPipesPt(XPointList &pts) const; // 立管上节点连接的管线中,非立管的连接点
|
|
AcGeDoubleArray GetUpPipesWidth() const; // 非立管的管径
|
|
void GetUpPipesVec(DList<XVector3D> &vts) const; // 非立管的向量
|
|
|
|
|
|
public:
|
|
// 考虑遮挡的当前曲线,二维
|
|
void GetHideCurve(XCurveSegment &cvHide) const;
|
|
// 通过管件附件打断的曲线,二维
|
|
void GetBrokenCurves(const XCurveSegment &cv, DList<XCurveSegment> &lstCurve) const;
|
|
|
|
public:
|
|
double CalVelocity() const; // 计算风速
|
|
|
|
protected:
|
|
Acad::ErrorStatus DrawVerDuct2d(XExplodeDraw &dc) const; // 绘制立式风管
|
|
Acad::ErrorStatus DrawHorDuct2d(XExplodeDraw &dc) const; // 绘制水平风管
|
|
Acad::ErrorStatus DrawLabelText(XExplodeDraw &dc) const; // 绘制非立管管径标注
|
|
|
|
void ApplyChangeToNode(BOOL bSXTT = FALSE); // 更新节点,用于移动管线时
|
|
|
|
private:
|
|
BOOL DrawCube3d(XPoint pt1, XVector3D vt1, XPoint pt2, XVector3D &vt2,
|
|
DList<X3DFace> &faces, BOOL bShow1 = TRUE, BOOL bShow2 = TRUE) const;
|
|
BOOL DrawColumn3d(XPoint pt1, XVector3D vt1, XPoint pt2, XVector3D &vt2,
|
|
DList<X3DFace> &faces, BOOL bShow1 = TRUE, BOOL bShow2 = TRUE) const;
|
|
|
|
private:
|
|
void DisposeBreak(const XCurveSegment &cv, AcGePoint3dArray &arPoint,
|
|
const XPoint ptLoc, double dWidth, double dDistance, const AcGeVector3d &vtDir,
|
|
DList<XCurveSegment> &lstBreakCurve) const;
|
|
};
|
|
|
|
#endif // !defined(AFX_DBVENTPIPE_H__2B3CEC0F_B759_411E_89CC_C4F8BA1D5358__INCLUDED_)
|