2026-10-04 00:04:20 +08:00
#pragma once
2026-09-28 15:28:50 +08:00
#include "DbPipeLabel.h"
#include "DbPipe.h"
class 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 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 EntityFields & fd , const CString & sKey );
2026-10-04 00:04:20 +08:00
// 写入交叉点数据
2026-09-28 15:28:50 +08:00
void WriteCrossPoint ( EntityFields & fd , const CString & sKey );
2026-10-04 00:04:20 +08:00
// 删除交叉点数据
2026-09-28 15:28:50 +08:00
void DelCrossPoint ( EntityFields & fd , const CString & sKey );
private :
2026-10-04 00:04:20 +08:00
// 删除
2026-09-28 15:28:50 +08:00
bool DelTEntityField ( EntityFields & 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 CDbVerticalSection : public AecXDbEntityBaseEx , public CLabelStyle
{
public :
ACRX_DECLARE_MEMBERS ( CDbVerticalSection );
private :
static const Adesk :: UInt8 g_nVersion ;
public :
CDbVerticalSection ();
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 EntityFields & fd = GetFields ();
double nGridScale ( 0 );
fd . GFD ( _T ( "GRID_SCALE" ), nGridScale );
return nGridScale ;
}
void SetGridScale ( double nGridScale ) {
assertWriteEnabled ();
m_nGridScale = nGridScale ;
EntityFields & 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 Draw2d ( AcGiDraw & dc ) const ;
2026-10-04 00:04:20 +08:00
virtual void GetTips ( DList < ObjInfoUnit > & ) const ; //取动态属性显示数据
2026-09-28 15:28:50 +08:00
virtual int GetFirstVersion () const { return 7 ; }
virtual SubText * 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 ( AcGiDraw & dc ) const ; //绘制雨污断面 从左往右
Acad :: ErrorStatus DrawSectionFromRight ( AcGiDraw & dc ) const ; //绘制雨污断面 从右往左
2026-09-28 15:28:50 +08:00
Acad :: ErrorStatus DrawScale ( AcGiDraw & dc , XPoint & ptEnd ) const ;
Acad :: ErrorStatus DrawCivilSheet ( AcGiDraw & dc , XPoint ptEnd ) const ;
Acad :: ErrorStatus DrawCivilSheetFeed ( AcGiDraw & dc , XPoint ptEnd ) const ;
void DrawLine ( XPoint ptStart , XPoint ptEnd , AcGiDraw & dc ) const ;
void DrawGridLine ( XPoint ptStart , XPoint ptEnd , AcGiDraw & dc ) const ;
void DrawDoteLine ( XPoint ptStart , XPoint ptEnd , AcGiDraw & dc ) const ;
void DrawBreakPipe ( XPoint ptStart , XPoint ptEnd , AcGiDraw & dc ) const ;
void DrawPLine ( XPoint ptStart , XPoint ptEnd , AcGiDraw & dc , double nWeight ) const ;
void DrawText ( XPoint ptText , const TCHAR * szText , AcGiDraw :: TextAlignment Align , AcGiDraw & dc , double nRotation = 0 ) const ;
void DrawScaleArrow ( XPoint ptStart , XPoint ptEnd , const TCHAR * szText , AcGiDraw & dc ) const ;
void DrawEllipse ( XPoint ptCen , double nRadiusLong , double nRadiusShort , AcDbObjectId idLay , AcGiDraw & 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 , AcGiDraw & 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 , AcGiDraw & 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 ( CDbPipe * 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 ( AcGiDraw & dc , XPoly2D & ploy ) const ;
};