// 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 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& 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 &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 &ids, const AcDbIntArray &types, const int &nMainDuct); public: // Renew TDbPipePrototype BOOL IsUpPipesOk() const; // 判断立管的上节点是否连接了非立管 // 以下函数主要考虑扣弯的绘制 void GetUpPipesPt(XPointList &pts) const; // 立管上节点连接的管线中,非立管的连接点 AcGeDoubleArray GetUpPipesWidth() const; // 非立管的管径 void GetUpPipesVec(DList &vts) const; // 非立管的向量 public: // 考虑遮挡的当前曲线,二维 void GetHideCurve(XCurveSegment &cvHide) const; // 通过管件附件打断的曲线,二维 void GetBrokenCurves(const XCurveSegment &cv, DList &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 &faces, BOOL bShow1 = TRUE, BOOL bShow2 = TRUE) const; BOOL DrawColumn3d(XPoint pt1, XVector3D vt1, XPoint pt2, XVector3D &vt2, DList &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 &lstBreakCurve) const; }; #endif // !defined(AFX_DBVENTPIPE_H__2B3CEC0F_B759_411E_89CC_C4F8BA1D5358__INCLUDED_)