Files
envi-code/SourceCode/Code2026/tg_shs/inc/pipewire/DbDuct.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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_)