Files
envi-code/SourceCode/Code2026/tg_shs/inc/pipewire/DbVerticalSection.h
T

441 lines
17 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
// DbVerticalSection.h: interface for the TDbVerticalSection class.
2026-09-28 15:28:50 +08:00
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DBVERTICALSECTION_H__5D3223E6_42BA_43D2_93C9_7C0BA92FCE27__INCLUDED_)
#define AFX_DBVERTICALSECTION_H__5D3223E6_42BA_43D2_93C9_7C0BA92FCE27__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/*============================================================================*
* Copyright(c), 1994-2007, Beijing Tangent Engineering Software Co.Ltd.
2026-10-04 00:04:20 +08:00
* 作 者: 沈睿
* 创建时间: 大约在冬季
* 描 述: 纵断面图
* 归属项目: 给排水
* 历史记录: 2008-6-26 补头文件注释
2026-09-28 15:28:50 +08:00
=============================================================================*/
#include "DbPipeLabel.h"
#include "DbPipe.h"
class PS_EXP TWellData
{
public:
TWellData()
{
m_csName = _T("");
m_csSpare = _T("");
m_iDn = 0;
m_iSpare = 0;
m_bIsWell = TRUE;
m_bIsDropWell = FALSE;
m_nWellRadius = 400;
m_nSpare=0;
m_nGroundEle =0;
m_ID = NULL;
m_nFrondDownEle = 0;
m_nLength = 0;
m_nI = 0;
m_nUpEle = 0;
m_nDownEle = 0;
m_nDeep = 0;
m_nLength = 0;
m_dRealLength=0;
};
TWellData(const TWellData &src);
TWellData & operator = (const TWellData &src);
2026-10-04 00:04:20 +08:00
CString m_csName; //井编号
Adesk::UInt16 m_iDn; //管径
double m_nLength; //管长
double m_nGroundEle; //地面标高
double m_nUpEle; //井面标高
double m_nDownEle; //井底标高
double m_nFrondDownEle;//前管井底标高
double m_nDeep; //埋深
double m_nI; //坡度
double m_nWellRadius; //井半径
double m_nSpare; //保留 //沉砂井 2006-10-24 真实管长 2009-3-26
BOOL m_bIsWell; //是井还是管线
BOOL m_bIsDropWell; //是否是跌水井
AcDbSoftPointerId m_ID; //实体ID
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
//8.0 新增数据
2026-09-28 15:28:50 +08:00
double m_dRealLength;
2026-10-04 00:04:20 +08:00
double m_iSpare; //保留 // cet 2016.5.11 modify 精度不够改为浮型点
CString m_csSpare; //保留
//版本
2026-09-28 15:28:50 +08:00
// static int s_iVer;
public:
Acad::ErrorStatus dwgInFields (AcDbDwgFiler* pFiler, int iVer);
Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler, int iVer) const;
};
class PS_EXP TFeedWellData
{
public:
TFeedWellData(){ m_csName = _T(""); m_bIsWell = TRUE; m_nWellRadius = 400;m_nSpare=0;m_nGroundEle =0;m_ID = NULL; m_bIsDropWell = FALSE; m_nFrondDownEle = 0; m_iDn = 0; m_nLength = 0; m_nI = 0; m_nUpEle = 0; m_nDownEle = 0, m_nDeep = 0;m_nLength = 0; };
TFeedWellData(const TFeedWellData &src);
TFeedWellData & operator = (const TFeedWellData &src);
2026-10-04 00:04:20 +08:00
CString m_csName; //井编号
Adesk::UInt16 m_iDn; //管径
double m_nLength; //管长
double m_nGroundEle; //地面标高
double m_nUpEle; //井面标高
double m_nDownEle; //井底标高
double m_nFrondDownEle;//前管井底标高
double m_nDeep; //埋深
double m_nI; //坡度
double m_nWellRadius; //井半径
double m_nSpare; //保留
BOOL m_bIsWell; //是井还是管线
BOOL m_bIsDropWell; //是否是跌水井
AcDbSoftPointerId m_ID; //井实体ID
DList<AcDbSoftPointerId> m_lstID; //管线实体ID
2026-09-28 15:28:50 +08:00
// double m_dRealLength;
2026-10-04 00:04:20 +08:00
// Adesk::UInt16 m_iSpare; //保留
// CString m_csSpare; //保留
2026-09-28 15:28:50 +08:00
public:
Acad::ErrorStatus dwgInFields (AcDbDwgFiler*);
Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
};
2026-10-04 00:04:20 +08:00
// 管道信息
2026-09-28 15:28:50 +08:00
struct PIPEDATA
{
2026-10-04 00:04:20 +08:00
double dDn; // 标准管径
double dOutDn; // 外径
double dInnerDn; // 内径
double dPipeThick; // 厚度
2026-09-28 15:28:50 +08:00
};
2026-10-04 00:04:20 +08:00
// 交叉点
2026-09-28 15:28:50 +08:00
class CrossPoint
{
private:
2026-10-04 00:04:20 +08:00
// 交叉节点
2026-09-28 15:28:50 +08:00
struct CrossNode
{
2026-10-04 00:04:20 +08:00
AcDbObjectId m_id; // 交叉管
XPoint m_pt; // 交叉点
double m_dDist2Well1; // 到起点井距离
double m_dDist2Well2; // 到终点井距离
2026-09-28 15:28:50 +08:00
bool operator < (const CrossNode &node)
{
return m_dDist2Well1 < node.m_dDist2Well1 + 0.0001;
}
};
public:
CrossPoint();
CrossPoint(const AcDbObjectId &id);
2026-10-04 00:04:20 +08:00
// 干管id
2026-09-28 15:28:50 +08:00
AcDbObjectId PipeId() const;
2026-10-04 00:04:20 +08:00
// 是否有交叉点
2026-09-28 15:28:50 +08:00
bool IsCross() const;
2026-10-04 00:04:20 +08:00
// 添加交叉点
2026-09-28 15:28:50 +08:00
void AddCrossPoint(const AcDbObjectId &id, const XPoint &ptInt, double dDist2Well1, double dDist2Well2);
2026-10-04 00:04:20 +08:00
// 所有交叉管
2026-09-28 15:28:50 +08:00
void GetAllCrossPipes(DList<AcDbObjectId> &lstPipe) const;
2026-10-04 00:04:20 +08:00
// 交叉管信息
2026-09-28 15:28:50 +08:00
bool GetCrossInfo(const AcDbObjectId &id, XPoint &ptIns, double &dDist2Well1, double &dDist2Well2) const;
2026-10-04 00:04:20 +08:00
// 交叉点排序
2026-09-28 15:28:50 +08:00
void Sort();
2026-10-04 00:04:20 +08:00
// 是否已有交叉点
2026-09-28 15:28:50 +08:00
bool IsExistCrossNode(const AcDbObjectId &id, const XPoint &pt) const;
2026-10-04 00:04:20 +08:00
// 读取交叉点数据
2026-09-28 15:28:50 +08:00
void ReadCrossPoint(const TEntityFields &fd, const CString &sKey);
2026-10-04 00:04:20 +08:00
// 写入交叉点数据
2026-09-28 15:28:50 +08:00
void WriteCrossPoint(TEntityFields &fd, const CString &sKey);
2026-10-04 00:04:20 +08:00
// 删除交叉点数据
2026-09-28 15:28:50 +08:00
void DelCrossPoint(TEntityFields &fd, const CString &sKey);
private:
2026-10-04 00:04:20 +08:00
// 删除
2026-09-28 15:28:50 +08:00
bool DelTEntityField(TEntityFields &fd, const CString &sKey);
private:
2026-10-04 00:04:20 +08:00
AcDbObjectId m_id; // 纵断面图主干上的管道
std::vector<CrossNode> m_vecNode; // 交叉点
2026-09-28 15:28:50 +08:00
};
class PS_EXP TDbVerticalSection : public TDbEntity, public TLabelStyle
{
DECLARE_TENTBASE();
ACRX_DECLARE_MEMBERS(TDbVerticalSection);
private:
static const Adesk::UInt8 g_nVersion;
public:
TDbVerticalSection();
protected:
2026-10-04 00:04:20 +08:00
Adesk::UInt16 m_iScaleX; //X方向比例
Adesk::UInt16 m_iScaleY; //Y方向比例
Adesk::UInt16 m_iCalcMode; //计算模式 0:管顶平接 1:管底平接 2:水面平接 3:给水系统
XPoint m_ptIns; //插入点
XPointList m_lstPt; //地面井
double m_nStartDeep;//起点埋深
double m_nSpare; //保留
double m_nGridScale;//比例标尺
DList<TWellData> m_lstWell; //管网系统
DList<TFeedWellData> m_lstFeedWell; //给水管网系统
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
XString m_sSheetHead;//纵断表头 以空格分行
XString m_sSheetRow; //纵断表头行高 8.0数据
2026-09-28 15:28:50 +08:00
double m_nMaxDeep;
double m_nMinDeep;
AcDbHardPointerId m_idTextLayer;
AcDbHardPointerId m_idGridLayer;
AcDbHardPointerId m_idSectLayer;
AcDbHardPointerId m_idDoteLayer;
2026-10-04 00:04:20 +08:00
private: // cet 2016.7.5 add 临时变量,用于记录当前管井显示区域,管道信息
XPoint m_ptTop; // 显示区域顶面一点
XPoint m_ptBottom; // 显示区域底面一点
std::map<AcDbHandle, PIPEDATA> m_mapPipeData; // 管道信息
// cet 2017.9.6 add 临时变量,用于记录纵断面图四个点位置用于设置夹点,方便用户拖动对齐纵断面图
2026-09-28 15:28:50 +08:00
XPoint m_ptTopLeft;
XPoint m_ptTolRight;
XPoint m_ptBottomLeft;
XPoint m_ptBottomRight;
public:
const TCHAR* GetSheetHead() const {
return (const TCHAR*)m_sSheetHead;
}
void SetSheetHead(const TCHAR* szSheetHead) {
assertWriteEnabled();
m_sSheetHead = szSheetHead;
}
2026-10-04 00:04:20 +08:00
//8.0 新增接口,返回表行高
2026-09-28 15:28:50 +08:00
// const TCHAR* GetSheetRowHeight() const;
// void SetSheetRowHeight(const TCHAR* szSheetRowHeight);
const TCHAR* GetSheetRow() const {
return (const TCHAR*)m_sSheetRow;
}
void SetSheetRow(const TCHAR* szSheetRow) {
assertWriteEnabled();
m_sSheetRow = szSheetRow;
}
double GetStartDeep() const {
return m_nStartDeep;
}
double GetMaxDeep() const {
return m_nMaxDeep;
}
double GetMinDeep() const {
return m_nMinDeep;
}
void SetStartDeep(double nStartDeep) {
assertWriteEnabled();
m_nStartDeep = nStartDeep;
}
double GetSpare() const {
return m_nSpare;
}
void SetSpare(double nSpare) {
assertWriteEnabled();
m_nSpare = nSpare;
}
double GetGridScale() const {
const TEntityFields &fd = GetFields();
double nGridScale(0);
fd.GFD(_T("GRID_SCALE"), nGridScale);
return nGridScale;
}
void SetGridScale(double nGridScale) {
assertWriteEnabled();
m_nGridScale = nGridScale;
TEntityFields &fd = Fields();
fd.SFD(_T("GRID_SCALE"), m_nGridScale);
}
int GetScaleX() const {
return m_iScaleX;
}
void SetScaleX(int iScaleX) {
assertWriteEnabled();
m_iScaleX = iScaleX;
}
int GetScaleY() const {
return m_iScaleY;
}
void SetScaleY(int iScaleY) {
assertWriteEnabled();
m_iScaleY = iScaleY;
}
int GetCalcMode() const {
return m_iCalcMode;
}
void SetCalcMode(int iCalcMode) {
assertWriteEnabled();
m_iCalcMode = iCalcMode;
}
void SetInsert(XPoint pt) {
assertWriteEnabled();
m_ptIns=pt;
}
const XPoint & GetInsert() const {
return m_ptIns;
}
void SetTextLayer(const AcDbObjectId& id) {
assertWriteEnabled();
m_idTextLayer=id;
}
AcDbObjectId GetTextLayer() const {
return m_idTextLayer;
}
void SetGridLayer(const AcDbObjectId& id) {
assertWriteEnabled();
m_idGridLayer=id;
}
AcDbObjectId GetGridLayer() const {
return m_idGridLayer;
}
void SetSectLayer(const AcDbObjectId& id) {
assertWriteEnabled();
m_idSectLayer=id;
}
AcDbObjectId GetSectLayer() const {
return m_idSectLayer;
}
void SetDoteLayer(const AcDbObjectId& id) {
assertWriteEnabled();
m_idDoteLayer=id;
}
AcDbObjectId GetDoteLayer() const {
return m_idDoteLayer;
}
// cet 2011.6.3 add
bool IsDimEle() const;
// cet 2011.6.3 add
void SetDimEle(bool bDim);
2026-10-04 00:04:20 +08:00
// 是否显示交叉管 cet 2011.11.29 add(T20V2.0之前版本使用)
2026-09-28 15:28:50 +08:00
bool IsShowCrossPipe(TPipeSys::SysType sys) const;
2026-10-04 00:04:20 +08:00
// 设置交叉管显示 cet 2011.11.29 add(T20V2.0之前版本使用)
2026-09-28 15:28:50 +08:00
void SetShowCrossPipe(TPipeSys::SysType sys, bool bShow);
2026-10-04 00:04:20 +08:00
// cet 2015.9.18 判断该管道系统的交叉管是否显示(T20V2.0及后续版本使用)
2026-09-28 15:28:50 +08:00
bool IsShowCrossPipe(const CString &sSysName) const;
2026-10-04 00:04:20 +08:00
// cet 2015.9.18 设置交叉管显示(T20V2.0及后续版本使用)
2026-09-28 15:28:50 +08:00
void SetShowCrossPipe(const CString &sSysName, bool bShow);
// ZXL 2013.12.05 ADD
bool IsDimDist() const;
void SetDimDist(bool bDim);
2026-10-04 00:04:20 +08:00
// cet 2016.9.8 add 仅显示支路交点(非主干管道一端连接主干,另一端连接着井或化粪池的为支路)
2026-09-28 15:28:50 +08:00
bool IsOnlyShowBranch() const;
void SetOnlyShowBranch(bool bShow);
2026-10-04 00:04:20 +08:00
// cet 2016.8.8 add 显示支路等高交点(此支路泛指除主干外的所有连接管道路径)
2026-09-28 15:28:50 +08:00
bool IsShowEqualEleBranch() const;
void SetShowEqualEleBranch(bool bShow);
2026-10-04 00:04:20 +08:00
// cet 2017.8.24 add 是否显示穿过管道端点但没有与井或池连接的交叉管道
2026-09-28 15:28:50 +08:00
bool IsShowPipeEndNotLinkedPipe() const;
void SetShowPipeEndNotLinkedPipe(bool bShow);
2026-10-04 00:04:20 +08:00
// cet 2016.9.22 add 更新管道外径内径
2026-09-28 15:28:50 +08:00
void UpdatePipeOuterDnInnerDn(const AcDbObjectId &id, double dOuterDn, double dInnerDn);
void GetWellDatas(DList<TWellData>& lstWell) const;
void SetWellDatas(DList<TWellData>& lstWell);
void Calc();
void CalcFeed();
int HitTestOnVS(XPoint pt, double &nColWidth, double &nHeight, XPoint &ptRet);
int HitTestOnVS2(XPoint pt, double &nColWidth, double &nHeight, XPoint &ptRet);
2026-10-04 00:04:20 +08:00
// 绘制过程中实时获取遮挡管线影响效率,现做出改进
// 更新遮挡管线 cet 2017.11.22 add
2026-09-28 15:28:50 +08:00
void UpdateHidePipes();
public:
2026-10-04 00:04:20 +08:00
// 2018.2.8 add 填充类型
2026-09-28 15:28:50 +08:00
CString GetFillingPattern() const;
void SetFillingPattern(const CString &sPattern);
2026-10-04 00:04:20 +08:00
// cet 2018.2.8 add 填充比例
2026-09-28 15:28:50 +08:00
double GetFillingRatio() const;
void SetFillingRatio(double dRatio);
2026-10-04 00:04:20 +08:00
// cet 2018.2.8 add 填充颜色
2026-09-28 15:28:50 +08:00
Adesk::UInt16 GetFillingColor() const;
void SetFillingColor(Adesk::UInt16 nColor);
public: // Override TDbEntity
virtual void CopyPropertiesFrom(AcDbEntity *pSrc, unsigned gMatchFlag);
virtual Acad::ErrorStatus GetGripText(int idx, CString &cs) const;
virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const;
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
2026-10-04 00:04:20 +08:00
virtual void GetTips(DList<TObjInfoUnit> &) const; //取动态属性显示数据
2026-09-28 15:28:50 +08:00
virtual int GetFirstVersion()const{return 7;}
virtual TSubText* HitTestText(XPoint pt)const {return NULL;};
public: // Override AcDbEntity
virtual 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 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 subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
AcGePoint3dArray& points,
int thisGsMarker = 0,
int otherGsMarker = 0) const;
virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,
int thisGsMarker = 0,
int otherGsMarker = 0) const;
private:
2026-10-04 00:04:20 +08:00
Acad::ErrorStatus DrawSection(XExplodeDraw &dc) const; //绘制雨污断面 从左往右
Acad::ErrorStatus DrawSectionFromRight(XExplodeDraw &dc) const;//绘制雨污断面 从右往左
2026-09-28 15:28:50 +08:00
Acad::ErrorStatus DrawScale(XExplodeDraw &dc, XPoint &ptEnd) const;
Acad::ErrorStatus DrawCivilSheet(XExplodeDraw &dc, XPoint ptEnd) const;
Acad::ErrorStatus DrawCivilSheetFeed(XExplodeDraw &dc, XPoint ptEnd) const;
void DrawLine(XPoint ptStart, XPoint ptEnd, XExplodeDraw &dc) const;
void DrawGridLine(XPoint ptStart, XPoint ptEnd, XExplodeDraw &dc) const;
void DrawDoteLine(XPoint ptStart, XPoint ptEnd, XExplodeDraw &dc) const;
void DrawBreakPipe(XPoint ptStart, XPoint ptEnd, XExplodeDraw &dc) const;
void DrawPLine(XPoint ptStart, XPoint ptEnd, XExplodeDraw &dc, double nWeight) const;
void DrawText(XPoint ptText, const TCHAR*szText, XExplodeDraw::TextAlignment Align, XExplodeDraw &dc, double nRotation = 0) const;
void DrawScaleArrow(XPoint ptStart, XPoint ptEnd, const TCHAR*szText, XExplodeDraw &dc) const;
void DrawEllipse(XPoint ptCen, double nRadiusLong, double nRadiusShort, AcDbObjectId idLay, XExplodeDraw &dc, bool *pRet = NULL) const;
double GetAllPipeLen() const;
void GetAllPipes(DList<AcDbObjectId> &lstAllPipe) const;
BOOL GetFeedWellListData(DList<TWellData> &lstWellSys, DList<TFeedWellData> &lstFeedWellSys);
BOOL AppendIdArray(AcDbObjectIdArray &idArray, AcDbObjectId id) const;
2026-10-04 00:04:20 +08:00
void GetLine(XLine &line) const; // cet 2011.6.2 add 获取sheet顶边所在的一条直线
void DimEle(const XPoint &ptCen, double nRadiusLong, double nRadiusShort, double dEle, CString &sText, bool bOnlyDimEle, XExplodeDraw &dc) const; // cet 2011.6.2 add 标注碰撞标高
2026-09-28 15:28:50 +08:00
void DimDist(const CString &sDim, const XPoint &ptStart, const XPoint &ptEnd, XExplodeDraw &dc, int &nDist, const double dDeep, const double dLong, bool bFromRight = false) const; // zxl 2013.12.05 add
2026-10-04 00:04:20 +08:00
int GetPipeIndex(TPipeSys::SysType sys) const; // cet 2011.12.5 add 根据管道类型获得管道索引辅助IsShowCrossPipe,SetShowCrossPipe
// cet 2013.3.1 add 获得池子名
2026-09-28 15:28:50 +08:00
CString GetPoolName( const AcDbObjectId &id ) const;
2026-10-04 00:04:20 +08:00
// cet 2015.9.18 add 判断管道是否显示交叉点
2026-09-28 15:28:50 +08:00
bool IsShowCrossPipe(const AcDbObjectId &idPipe) const;
private:
2026-10-04 00:04:20 +08:00
// 外径
2026-09-28 15:28:50 +08:00
double OuterDn(const AcDbSoftPointerId &idPipe) const;
2026-10-04 00:04:20 +08:00
// 内径
2026-09-28 15:28:50 +08:00
double InnerDn(const AcDbSoftPointerId &idPipe) const;
2026-10-04 00:04:20 +08:00
// 初始化管道信息
2026-09-28 15:28:50 +08:00
void InitPipeData() const;
void InitPipeData(const AcDbSoftPointerId &idPipe, PIPEDATA &node) const;
2026-10-04 00:04:20 +08:00
// cet 2016.9.8 add 是否为支路(非主干管道一端连接主干,另一端连接着井或化粪池的为支路)
2026-09-28 15:28:50 +08:00
bool IsBrach(TDbPipe *pPipe, const AcDbObjectId &idMainLinked) const;
2026-10-04 00:04:20 +08:00
// cet 2016.9.22 add 获得管道外径内径值
2026-09-28 15:28:50 +08:00
void GetPipeOuterDnInnerDn(const AcDbObjectId &id, double &dOuterDn, double &dInnerDn) const;
2026-10-04 00:04:20 +08:00
// cet 2017.11.22 add 被遮挡管道
2026-09-28 15:28:50 +08:00
void ClearHidePipes();
2026-10-04 00:04:20 +08:00
// cet 2017.11.22 add 获取遮挡交点点信息
2026-09-28 15:28:50 +08:00
void GetCrossPointInfo(std::vector<CrossPoint> &vecCrossPoint) const;
2026-10-04 00:04:20 +08:00
// cet 2018.2.8 add 绘制填充
2026-09-28 15:28:50 +08:00
void DrawHatch(XExplodeDraw &dc, XPoly2D &ploy) const;
};
#endif // !defined(AFX_DBVERTICALSECTION_H__5D3223E6_42BA_43D2_93C9_7C0BA92FCE27__INCLUDED_)