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

426 lines
12 KiB
C++

#include "StdAfx.h"
#include "AcDbObjectPtr.h"
#include "PositiveElevationCalc.h"
#include "ElevationCalcDlg.h"
#include "ElevationCalcCheckDlg.h"
#include "DbPipe.h"
#include "DbWell.h"
#include <stack>
namespace
{
CString GetWellName(AcDbObjectId id)
{
CString csWellName;
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
csWellName = pEquip->GetWellName();
}
OPENOBJ_END();
return csWellName;
}
}
PositiveElevationCalc::PositiveElevationCalc()
{
m_dLayingDepth = 1.1;
m_dMinThick = 0.7;
}
void PositiveElevationCalc::InitCalcSys()
{
UpDatePipeSys();
SSearchPipeList *pList = NULL;
pList = GetFarthestSWell(m_pAllList); //获得最远起点井
if (pList != NULL)
{
std::stack<SSearchPipeList*> data;
data.push(pList);
while(!data.empty())
{
SSearchPipeList *pSWell = NULL;
pSWell = data.top();
data.pop();
if ((pSWell->m_iType == 3 || pSWell->m_iType == 4)&& pSWell->m_pPrevious != NULL && pSWell->m_iSpare != 2) //管段起点井
{
int nNum = pSWell->m_lstNode.Length();
if (nNum == 1 || nNum == 0 || (nNum > 1 && pSWell->m_iSpare == 1))
{
SSearchPipeList *pPipe = pSWell->m_pPrevious;
if (pPipe->m_iType == 0 && pPipe->m_pPrevious != NULL) //管段
{
SSearchPipeList *pEWell = pPipe->m_pPrevious;
if (pEWell->m_iType == 3 || pEWell->m_iType == 4) // 管段终点井或化粪池
{
pSWell->m_iSpare = 2; //表示井处理(注意只需标注管段起点井)
CALCNODE node;
node.idS = pSWell->m_ID;
node.idE = pEWell->m_ID;
node.idP = pPipe->m_ID;
node.dPipeDn = pPipe->m_iDn;
node.bSysStartWell = FALSE;
node.bPool = FALSE;
node.bIsDropWell = FALSE; // cet 2011.11.17 add
ads_name name;
acdbGetAdsName(name, pPipe->m_ID);
node.dGradient = GlobalFunc::GetPipeGradient(name);
node.dPipeLen = pPipe->m_nLength;
if (pSWell->m_iType == 3) // 井
{
node.dWellEleUpS = GetWellEleUp(pSWell->m_ID);
node.strSWellName = GetWellName(pSWell->m_ID);
node.dWellEleDownS = GetWellEleDown(pSWell->m_ID);
node.bIsDropWell = IsDropWell(pSWell->m_ID);
if (nNum == 0) //系统起点井
{
pSWell->m_bNeedCale = TRUE; //已处理
node.bSysStartWell = TRUE;
}
}
else if (pSWell->m_iType == 4) // 化粪池
{
node.bPool = TRUE;
node.dWellEleUpS = GetPoolGroundEle(node.idS);
node.strSWellName = GetPoolName(node.idS) + _T("出");
}
if (pEWell->m_iType == 3) // 井
{
node.dWellEleUpE = GetWellEleUp(pEWell->m_ID);
node.strEWellName = GetWellName(pEWell->m_ID);
}
else if (pEWell->m_iType == 4) // 化粪池
{
node.dWellEleUpE = GetPoolGroundEle(node.idE);
node.strEWellName = GetPoolName(node.idE) + _T("进");
}
node.dGradientDist = node.dGradient * node.dPipeLen;
node.dPipeEleS = 0.0;
node.dPipeEleE = 0.0;
node.dDeepS = 0.0;
node.dDeepE = 0.0;
m_vecLstData.push_back(node);
data.push(pEWell);
}
}
}
else if (nNum > 1) //存在分支
{
data.push(pSWell);
SSearchPipeList *pTemp = GetFarthestSWell(pSWell);
if (pTemp != NULL)
{
data.push(pTemp);
}
else
{
pSWell->m_iSpare = 1; //井上所有分支已处理
}
}
}
else if (pSWell->m_lstNode.Length() > 1) // 排出端存在支路
{
SSearchPipeList *pTemp = GetFarthestSWell(pSWell);
if (pTemp != NULL)
{
data.push(pTemp);
}
}
}
}
}
void PositiveElevationCalc::AutoCalc(BOOL bModify)
{
acedSetStatusBarProgressMeter(_T("自动计算中..."), 0, m_vecLstData.size());
for (size_t i = 0; i < m_vecLstData.size(); i++)
{
acedSetStatusBarProgressMeterPos(i);
CALCNODE &node = m_vecLstData[i];
if (node.bSysStartWell) //系统起点井
{
double dLayingDepth = GetWellLayDepth(node.idS); // 埋设深度
node.dPipeEleS = node.dWellEleUpS - dLayingDepth;
}
else if (node.bIsDropWell) //跌水井
{
node.dPipeEleS = node.dWellEleDownS;
}
else if (node.bPool) // 化粪池
{
node.dPipeEleS = GetPipeEleDown(m_vecLstData, node.idS) - GetPoolDrop(node.idS);
}
else
{
double dPipeEleUp = GetPipeEleUp(m_vecLstData, node.idS);
node.dPipeEleS = dPipeEleUp - GetPipeDjById(node.idP, node.dPipeDn) * 0.001;
}
// 检查起点井覆土厚度
double dThick = node.dWellEleUpS - (node.dPipeEleS + GetPipeDjById(node.idP, node.dPipeDn) * 0.001 + GetPipeThickById(node.idP, node.dPipeDn));
if (dThick + 0.001 < m_dMinThick) // 小于最小覆土厚度时调整为最小覆土厚度
{
if (!node.bIsDropWell && !node.bPool)
{
node.dPipeEleS = node.dWellEleUpS - m_dMinThick - GetPipeDjById(node.idP, node.dPipeDn) * 0.001 - GetPipeThickById(node.idP, node.dPipeDn);
if (!node.bSysStartWell && !node.bPool)
{
node.bIsDropWell = TRUE;
node.dWellEleDownS = node.dPipeEleS;
}
}
else if (node.bIsDropWell && bModify) // 跌水井
{
// 变为普通井
node.bIsDropWell = FALSE;
double dPipeEleUp = GetPipeEleUp(m_vecLstData, node.idS);
node.dPipeEleS = dPipeEleUp - GetPipeDjById(node.idP, node.dPipeDn) * 0.001;
dThick = node.dWellEleUpS - (node.dPipeEleS + GetPipeDjById(node.idP, node.dPipeDn) * 0.001 + GetPipeThickById(node.idP, node.dPipeDn));
if (dThick + 0.001 < m_dMinThick)
{
node.dPipeEleS = node.dWellEleUpS - m_dMinThick - GetPipeDjById(node.idP, node.dPipeDn) * 0.001 - GetPipeThickById(node.idP, node.dPipeDn);
node.bIsDropWell = TRUE;
}
}
}
node.dPipeEleE = node.dPipeEleS - node.dGradientDist;
// 检查终点井覆土厚度
dThick = node.dWellEleUpE - (node.dPipeEleE + GetPipeDjById(node.idP, node.dPipeDn) * 0.001 + GetPipeThickById(node.idP, node.dPipeDn));
if (dThick + 0.001 < m_dMinThick) // 小于最小覆土深度时调整为最小覆土深度
{
node.dPipeEleE = node.dWellEleUpE - m_dMinThick - GetPipeDjById(node.idP, node.dPipeDn) * 0.001- GetPipeThickById(node.idP, node.dPipeDn);
node.dPipeEleS = node.dPipeEleE + node.dGradientDist;
if (!node.bSysStartWell && !node.bPool)
{
node.bIsDropWell = TRUE; //起点井设置为跌水井
node.dWellEleDownS = node.dPipeEleS;
}
}
node.dDeepS = node.dWellEleUpS - node.dPipeEleS;
node.dDeepE = node.dWellEleUpE - node.dPipeEleE;
// 修改起点井埋深深度
if (node.bSysStartWell)
{
m_mapLayingDepth.erase(node.idS);
m_mapLayingDepth.insert(std::make_pair(node.idS, node.dDeepS));
}
}
acedRestoreStatusBar();
}
void PositiveElevationCalc::LayingDepthCalc()
{
UpdateSWellLayDepth(); // cet 2012.6.21 add 更新起点井埋深
acedSetStatusBarProgressMeter(_T("计算中..."), 0, m_vecLstData.size());
for (size_t i = 0; i < m_vecLstData.size(); i++)
{
acedSetStatusBarProgressMeterPos(i);
CALCNODE &node = m_vecLstData[i];
if (node.bSysStartWell) //系统起点井
{
double dLayingDepth = GetWellLayDepth(node.idS); // 埋设深度
node.dPipeEleS = node.dWellEleUpS - dLayingDepth;
}
else if (node.bIsDropWell) //跌水井
{
node.dPipeEleS = node.dWellEleDownS;
}
else if (node.bPool) // 化粪池
{
node.dPipeEleS = GetPipeEleDown(m_vecLstData, node.idS) - GetPoolDrop(node.idS);
}
else
{
node.bIsDropWell = isDropWell(m_vecLstData, node.idS); // cet 2011.6.8 add 判断井是否产生跌水
double dPipeEleUp = GetPipeEleUp(m_vecLstData, node.idS);
node.dPipeEleS = dPipeEleUp - GetPipeDjById(node.idP, node.dPipeDn) * 0.001;
}
node.dGradientDist = node.dGradient * node.dPipeLen;
node.dPipeEleE = node.dPipeEleS - node.dGradientDist;
node.dDeepS = node.dWellEleUpS - node.dPipeEleS;
node.dDeepE = node.dWellEleUpE - node.dPipeEleE;
}
acedRestoreStatusBar();
}
void PositiveElevationCalc::CheckSys(CWnd *pWnd)
{
CheckSys(FALSE);
}
void PositiveElevationCalc::CheckSys(BOOL bModifyDropWell)
{
// 校核数据
acedSetStatusBarProgressMeter(_T("校核中..."), 0, m_vecLstData.size());
CString strError1, strError2, strError3;
for (size_t i = 0; i < m_vecLstData.size(); i++)
{
acedSetStatusBarProgressMeterPos(i);
const CALCNODE &node = m_vecLstData[i];
//起点井覆土厚度
double dThick1 = node.dWellEleUpS - (node.dPipeEleS + GetPipeDjById(node.idP, node.dPipeDn) * 0.001 + GetPipeThickById(node.idP, node.dPipeDn));
//终点井覆土厚度
double dThick2 = node.dWellEleUpE - (node.dPipeEleE + GetPipeDjById(node.idP, node.dPipeDn) * 0.001 + GetPipeThickById(node.idP, node.dPipeDn));
BOOL bCheck = FALSE;
if (Compare(dThick1, m_dMinThick) == -1)
{
if (node.bIsDropWell) // 跌水井
{
strError2 += node.strSWellName + _T("、");
}
else if (node.bSysStartWell) // 管网起点井
{
strError1 += node.strSWellName + _T("、");
}
else
{
bCheck = TRUE;
strError3 += node.strSWellName + _T("-") + node.strEWellName + _T("、");
}
}
if (Compare(dThick2, m_dMinThick) == -1 && !bCheck)
{
strError3 += node.strSWellName + _T("-") + node.strEWellName + _T("、");
}
}
acedRestoreStatusBar();
// 显示错误
CString strTemp = _T("、");
if (!strError1.IsEmpty())
{
strError1 = strError1.Left(strError1.GetLength() - strTemp.GetLength());
strError1 += _T("起点井不符合最小覆土深度要求!\n");
strError1 += _T("-------------------------------\n");
}
if (!strError2.IsEmpty())
{
strError2 = strError2.Left(strError2.GetLength() - strTemp.GetLength());
strError2 += _T("跌水井井底标高不符合最小覆土深度要求!\n");
strError2 += _T("--------------------------------\n");
}
if (!strError3.IsEmpty())
{
strError3 = strError3.Left(strError3.GetLength() - strTemp.GetLength());
strError3 += _T("管段不符合最小覆土深度要求!\n");
strError3 += _T("--------------------------------\n");
}
if (strError1.IsEmpty() && !strError2.IsEmpty() && strError3.IsEmpty() && bModifyDropWell) //只有跌水错误
{
if(AfxMessageBox(_T("是否将不符合最小覆土深度的跌水井改为普通井!"), MB_YESNO) == IDYES)
{
AutoCalc(TRUE);
}
else // 反复提醒
{
CheckSys(FALSE);
}
}
else if ((!strError1.IsEmpty() || !strError2.IsEmpty() || !strError3.IsEmpty()) && !bModifyDropWell)
{
CTemporaryResourceOverride vTemp;
CElevationCalcCheckDlg dlg;
dlg.SetErrorType(strError1 + strError2 + strError3);
if (dlg.DoModal() == IDOK) //自动计算
{
AutoCalc();
CheckSys(TRUE); // 需检查是否有跌水井错误
}
}
}
bool PositiveElevationCalc::isDropWell(std::vector<CALCNODE> &data, const AcDbObjectId &idSWell)
{
double dRet = 0.0;
bool bFirst = true;
bool bDorpWell = false;
std::vector<CALCNODE>::iterator it; // cet 2011.7.5 modfiy 改为非const迭代器,方便修改
for (it = data.begin(); it != data.end(); it++)
{
if ((*it).idE == idSWell)
{
if (bFirst)
{
bFirst = false;
dRet = (*it).dPipeEleE;
}
else if (fabs(dRet - (*it).dPipeEleE) > 0.0001) // 误差值
{
bDorpWell = true;
break;
}
}
}
// cet 2011.7.5 add 通过此函数判断出的跌水井可能导致计算错误,添加以下代码纠正错误
if (bDorpWell)
{
// 找出管内底标高最小值
bFirst = true;
double dPipeDn = 0.0;
AcDbObjectId idPipe;
for (it = data.begin(); it != data.end(); it++)
{
if ((*it).idE == idSWell)
{
if (bFirst)
{
bFirst = false;
dRet = (*it).dPipeEleE;
idPipe = (*it).idP;
dPipeDn = (*it).dPipeDn;
}
else if (dRet > (*it).dPipeEleE)
{
dRet = (*it).dPipeEleE;
idPipe = (*it).idP;
dPipeDn = (*it).dPipeDn;
}
}
}
if (!!idPipe)
{
// 管内顶标高
dRet += GetPipeDjById(idPipe, dPipeDn) * 0.001;
for (it = data.begin(); it != data.end(); it++)
{
if ((*it).idS == idSWell)
{
break;
}
}
// 根据管内顶平接,计算出it中管的起点管内底标高,并将值设置给起点井底标高
if (it != data.end())
{
(*it).dWellEleDownS = dRet - GetPipeDjById((*it).idP, (*it).dPipeDn) * 0.001;
}
}
}
return bDorpWell;
}