#pragma once #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); 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 //8.0 新增数据 double m_dRealLength; double m_iSpare; //保留 // cet 2016.5.11 modify 精度不够改为浮型点 CString m_csSpare; //保留 //版本 // 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); 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 m_lstID; //管线实体ID // double m_dRealLength; // Adesk::UInt16 m_iSpare; //保留 // CString m_csSpare; //保留 public: Acad::ErrorStatus dwgInFields(AcDbDwgFiler*); Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const; }; // 管道信息 struct PIPEDATA { double dDn; // 标准管径 double dOutDn; // 外径 double dInnerDn; // 内径 double dPipeThick; // 厚度 }; // 交叉点 class CrossPoint { private: // 交叉节点 struct CrossNode { AcDbObjectId m_id; // 交叉管 XPoint m_pt; // 交叉点 double m_dDist2Well1; // 到起点井距离 double m_dDist2Well2; // 到终点井距离 bool operator < (const CrossNode &node) { return m_dDist2Well1 < node.m_dDist2Well1 + 0.0001; } }; public: CrossPoint(); CrossPoint(const AcDbObjectId &id); // 干管id AcDbObjectId PipeId() const; // 是否有交叉点 bool IsCross() const; // 添加交叉点 void AddCrossPoint(const AcDbObjectId &id, const XPoint &ptInt, double dDist2Well1, double dDist2Well2); // 所有交叉管 void GetAllCrossPipes(DList &lstPipe) const; // 交叉管信息 bool GetCrossInfo(const AcDbObjectId &id, XPoint &ptIns, double &dDist2Well1, double &dDist2Well2) const; // 交叉点排序 void Sort(); // 是否已有交叉点 bool IsExistCrossNode(const AcDbObjectId &id, const XPoint &pt) const; // 读取交叉点数据 void ReadCrossPoint(const EntityFields &fd, const CString &sKey); // 写入交叉点数据 void WriteCrossPoint(EntityFields &fd, const CString &sKey); // 删除交叉点数据 void DelCrossPoint(EntityFields &fd, const CString &sKey); private: // 删除 bool DelTEntityField(EntityFields &fd, const CString &sKey); private: AcDbObjectId m_id; // 纵断面图主干上的管道 std::vector m_vecNode; // 交叉点 }; class CDbVerticalSection : public AecXDbEntityBaseEx, public CLabelStyle { public: ACRX_DECLARE_MEMBERS(CDbVerticalSection); private: static const Adesk::UInt8 g_nVersion; public: CDbVerticalSection(); protected: 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 m_lstWell; //管网系统 DList m_lstFeedWell; //给水管网系统 XString m_sSheetHead;//纵断表头 以空格分行 XString m_sSheetRow; //纵断表头行高 8.0数据 double m_nMaxDeep; double m_nMinDeep; AcDbHardPointerId m_idTextLayer; AcDbHardPointerId m_idGridLayer; AcDbHardPointerId m_idSectLayer; AcDbHardPointerId m_idDoteLayer; private: // cet 2016.7.5 add 临时变量,用于记录当前管井显示区域,管道信息 XPoint m_ptTop; // 显示区域顶面一点 XPoint m_ptBottom; // 显示区域底面一点 std::map m_mapPipeData; // 管道信息 // cet 2017.9.6 add 临时变量,用于记录纵断面图四个点位置用于设置夹点,方便用户拖动对齐纵断面图 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; } //8.0 新增接口,返回表行高 // 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); // 是否显示交叉管 cet 2011.11.29 add(T20V2.0之前版本使用) bool IsShowCrossPipe(TPipeSys::SysType sys) const; // 设置交叉管显示 cet 2011.11.29 add(T20V2.0之前版本使用) void SetShowCrossPipe(TPipeSys::SysType sys, bool bShow); // cet 2015.9.18 判断该管道系统的交叉管是否显示(T20V2.0及后续版本使用) bool IsShowCrossPipe(const CString &sSysName) const; // cet 2015.9.18 设置交叉管显示(T20V2.0及后续版本使用) void SetShowCrossPipe(const CString &sSysName, bool bShow); // ZXL 2013.12.05 ADD bool IsDimDist() const; void SetDimDist(bool bDim); // cet 2016.9.8 add 仅显示支路交点(非主干管道一端连接主干,另一端连接着井或化粪池的为支路) bool IsOnlyShowBranch() const; void SetOnlyShowBranch(bool bShow); // cet 2016.8.8 add 显示支路等高交点(此支路泛指除主干外的所有连接管道路径) bool IsShowEqualEleBranch() const; void SetShowEqualEleBranch(bool bShow); // cet 2017.8.24 add 是否显示穿过管道端点但没有与井或池连接的交叉管道 bool IsShowPipeEndNotLinkedPipe() const; void SetShowPipeEndNotLinkedPipe(bool bShow); // cet 2016.9.22 add 更新管道外径内径 void UpdatePipeOuterDnInnerDn(const AcDbObjectId &id, double dOuterDn, double dInnerDn); void GetWellDatas(DList& lstWell) const; void SetWellDatas(DList& 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); // 绘制过程中实时获取遮挡管线影响效率,现做出改进 // 更新遮挡管线 cet 2017.11.22 add void UpdateHidePipes(); public: // 2018.2.8 add 填充类型 CString GetFillingPattern() const; void SetFillingPattern(const CString &sPattern); // cet 2018.2.8 add 填充比例 double GetFillingRatio() const; void SetFillingRatio(double dRatio); // cet 2018.2.8 add 填充颜色 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; virtual void GetTips(DList &) const; //取动态属性显示数据 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: Acad::ErrorStatus DrawSection(AcGiDraw &dc) const; //绘制雨污断面 从左往右 Acad::ErrorStatus DrawSectionFromRight(AcGiDraw &dc) const;//绘制雨污断面 从右往左 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 &lstAllPipe) const; BOOL GetFeedWellListData(DList &lstWellSys, DList &lstFeedWellSys); BOOL AppendIdArray(AcDbObjectIdArray &idArray, AcDbObjectId id) const; 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 标注碰撞标高 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 int GetPipeIndex(TPipeSys::SysType sys) const; // cet 2011.12.5 add 根据管道类型获得管道索引辅助IsShowCrossPipe,SetShowCrossPipe // cet 2013.3.1 add 获得池子名 CString GetPoolName(const AcDbObjectId &id) const; // cet 2015.9.18 add 判断管道是否显示交叉点 bool IsShowCrossPipe(const AcDbObjectId &idPipe) const; private: // 外径 double OuterDn(const AcDbSoftPointerId &idPipe) const; // 内径 double InnerDn(const AcDbSoftPointerId &idPipe) const; // 初始化管道信息 void InitPipeData() const; void InitPipeData(const AcDbSoftPointerId &idPipe, PIPEDATA &node) const; // cet 2016.9.8 add 是否为支路(非主干管道一端连接主干,另一端连接着井或化粪池的为支路) bool IsBrach(CDbPipe *pPipe, const AcDbObjectId &idMainLinked) const; // cet 2016.9.22 add 获得管道外径内径值 void GetPipeOuterDnInnerDn(const AcDbObjectId &id, double &dOuterDn, double &dInnerDn) const; // cet 2017.11.22 add 被遮挡管道 void ClearHidePipes(); // cet 2017.11.22 add 获取遮挡交点点信息 void GetCrossPointInfo(std::vector &vecCrossPoint) const; // cet 2018.2.8 add 绘制填充 void DrawHatch(AcGiDraw &dc, XPoly2D &ploy) const; };