#pragma once #include "globalFunc.h" // 起点井埋深类型 cet 2012.6.21 add enum LayingDepthType { eUserSet = 0, // 命令执行前用户设置了井底标高(非0值) eLayingDepth = 1, // 埋深值取自对话框设置的输入起点埋深 eCalc = 2, // 计算过程中产生的埋深值 eUserModify = 3, // 通过修改特定井起点埋深获得 }; // 系统起点井埋深数据 cet 2012.6.21 add struct LayingDepthNode { LayingDepthType type; double dLayingDepth; }; // 计算时使用 typedef struct CalcNode { AcDbObjectId idS; // 起点井 AcDbObjectId idE; // 终点井 AcDbObjectId idP; // 管 double dPipeDn; // 管径 double dGradient; // 坡度 double dGradientDist;// 坡降 double dPipeLen; // 管平面长度 double dWellEleUpS; // 起点井地面标高 double dWellEleUpE; // 终点井地面标高 double dWellEleDownS;// 起点井底标高 double dPipeEleS; // 起点管内底标高 double dPipeEleE; // 终点管内底标高 double dDeepS; // 起点埋深 double dDeepE; // 终点埋深 CString strSWellName; // 起点井名称 CString strEWellName; // 终点井名称 BOOL bIsDropWell; // 起点井是否为跌水井 BOOL bSysStartWell; // 起点井是否为系统起点井 BOOL bPool; // 化粪池 }CALCNODE; struct FindFunc { FindFunc(const AcDbObjectId &id) { m_id = id; } BOOL operator() (CALCNODE &node) { if (node.idS == m_id) { return TRUE; } return FALSE; } private: AcDbObjectId m_id; }; class CElevationCalcDlg; class ElevationCalc { public: void SetLayingDepth(double dLayingDepth); void SetMinThick(double dMinThick); void SetPipeSys(SSearchPipeList *pList); void SetPipeEleDown(double dEle); void Sort(std::vector &vec); //按表格显示顺序排列管网信息 void UpDatePipeSys(); // 设置管道长度和管径 void CalcLenStartWellToEnd(SSearchPipeList *pList, double dCurLen); // 起点井到排出端的长度 std::vector& GetLstData(); void ModifyWellInfo(const AcDbObjectId &id, double dEleUp, double dEleDown, BOOL bDrop); void ModifyPipe(const AcDbObjectId &idPipe, double dDn, BOOL bDn); // 修改管段 bDn为真时修改管径 为假时修改坡度 void ModifyWellLayingDepth(const AcDbObjectId &id, double dLayingDepth); double GetWellLayDepth(const AcDbObjectId &id); std::vector& GetStartWell(); // 是否进行系统起点井的埋深选择操作 cet 2012.6.21 add void EnableSetLayDepth(bool bVal); // 设置系统起点井埋深数据 cet 2012.2.21 add void SetLayDepthData(std::map *pMapData); // 是否只有一个起点井 void SetOnlySWell(bool bOnly); public: virtual void InitCalcSys() = 0; // 初始化计算 virtual void LayingDepthCalc() = 0; // 傻算 virtual void AutoCalc(BOOL bModify = FALSE) = 0; // 自动计算 virtual void CheckSys(CWnd *pWnd = NULL) = 0; // 校核 virtual void UpdateDropWell(const std::map &data); // 更新跌水井信息 virtual void GetCheckInfoforPipe(std::vector &data); // 校核后不符合要求的管段 protected: void GetSWellByShow(std::vector &data); // 按表格显示顺序存储系统各起点井 double GetWellEleUp(const AcDbObjectId &id); // 井面标高 double GetWellEleDown(const AcDbObjectId &id); // 井底标高 double GetPipeEleUp(const std::vector &data, const AcDbObjectId &idSWell); // 管内顶标高 double GetPipeEleDown(const std::vector &data, const AcDbObjectId &idSWell); // 管内底标高 BOOL IsDropWell(AcDbObjectId &id); // 是否为跌水井 SSearchPipeList* GetFarthestSWell(SSearchPipeList* pList); // 获得系统中未处理的最远起点井 void GetStartWell(SSearchPipeList *pList, std::vector &data); // 获得pList上的起点井 double GetPipeThickById(const AcDbObjectId &id, double dDn); // 壁厚 double GetPipeDjById(const AcDbObjectId &id, double dDn); // 内径 double GetPoolDrop(const AcDbObjectId &id); // 化粪池进出管高差 double GetPoolGroundEle(const AcDbObjectId &id); // 化粪池地面标高 CString GetPoolName(const AcDbObjectId &id); int Compare(double dVal1, double dVal2); // 更新系统起点井的埋深 cet 2012.6.21 add void UpdateSWellLayDepth(); // 更新指定类型的系统起点井的埋深 cet 2012.6.21 add void UpdateSWellLayDepth(LayingDepthType type); private: void InitPipeInfo(); // 设置管段的壁厚内径 protected: SSearchPipeList *m_pAllList; std::vector m_vecLstData; // 表格中数据(也为计算单元) std::vector m_vecWell; // 系统中所有起点井 std::map m_mapLayingDepth; // 管网起点井对应埋设深度 double m_dLayingDepth; double m_dMinThick; CElevationCalcDlg *m_pWnd; std::map m_mapDropWell; // 跌水井信息 double m_dPipeEleDown; // 排出端管内底标高 std::vector m_vecCheckforPipe; // 校核后不符合要求的管段 std::map m_mapPipeDj; // 管径对应的的诰 std::map m_mapPipeThick; // 管径对应壁厚 bool m_bShowTip; // 计算时是否提示用户系统起点井的埋深选择操作 cet 2012.6.21 add bool m_bOnlySWell; // 是否只有一个起点井 cet 2012.6.26 add std::map *m_pMapSWellLayDepth; // 系统起点井埋深值及埋深类型 cet 2012.6.21 add };