Files
envi-code/SourceCode/Code2026/tg_shs/shs_TwtKernal/outdoor.cpp
T

1389 lines
37 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
/********************************************************************
2026-09-28 15:28:50 +08:00
created: 2004/03/01
created: 1:3:2004 9:59
filename: f:\tg_dev\telecdev\twtkernal\outdoor.cpp
file path: f:\tg_dev\telecdev\twtkernal
file base: outdoor
file ext: cpp
2026-10-04 00:04:20 +08:00
author: 沈睿
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
purpose: 室外
2026-09-28 15:28:50 +08:00
*********************************************************************/
#include "stdafx.h"
#include <DbWell.h>
#include <rxregsvc.h>
#include <DbVerticalSection.h>
#include <DbWellDim.h>
#include <DbPool.h>
#include <PipeWireMonitor.h>
#include <dbxutil.h>
#include "InsBlockDlg.h"
//#include "SprinklerDimPipeDnDlg.h"
#include "jig.h"
#include "SelectBlkDlg.h"
#include "SprinklerByLineDlg.h"
#include "GradientEleCalcDlg.h"
#include "DbPump.h"
//***************************************************************************************************
2026-10-04 00:04:20 +08:00
// 搜索室外井系统
2026-09-28 15:28:50 +08:00
//***************************************************************************************************
// sr modify 2004/10/25 2005/5/24
2026-10-04 00:04:20 +08:00
// 搜索室外系统,可以定终止井,entEnd输入空,自动搜索最后一个井
// 搜索原则:顺着流向方向找,如果有分叉就结束,有汇集不关,继续向前
2026-09-28 15:28:50 +08:00
BOOL AutoSearchOutdoorWell(Entity ent, AcDbObjectId idFront, SSearchPipeList *pListAll, PickSet &ssAll, BOOL bFeedSys)
{
AcDbObjectId id = NULL;
acdbGetObjectId(id, ent);
pListAll->m_ID = id;
AcDbObjectIdArray idArray;
int len(0);
{
PickSet ss(SS_FREE);
if(ent.Is(_T("ATS_PIPE"))){
pListAll->m_iType = 0;
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe);
if(pPipe){
2026-10-04 00:04:20 +08:00
//2008.4.30 增加以下代码, 在室外中, 标注管长不需要标注真实管长, 只需要标注平面管长
2026-09-28 15:28:50 +08:00
double dLen = pPipe->GetPlanLength();
pListAll->m_nLength = dLen;
pListAll->m_iDn = (int)pPipe->GetDnDiameter();
}
OPENOBJ_END();
pListAll->m_nI = GetPipeGradient(ent);
GetAllPipeAndNodeByPipe(id, idFront, ss);
}
2026-10-04 00:04:20 +08:00
else if(ent.Is(_T("ATS_POOL"))){ //2009-4-3 池改用单独对象实现
2026-09-28 15:28:50 +08:00
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPool, pEquip);
if(pEquip){
pListAll->m_nDang = pEquip->GetGroundEle();
}
OPENOBJ_END();
pListAll->m_iType = 4;
pListAll->m_csName = _T("HC");
GetAllPipeAndNodeByNode(id, idFront, ss);
}
else{
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbWell, pEquip);
if(pEquip){
2026-10-04 00:04:20 +08:00
pListAll->m_nDang = pEquip->GetWellEleUp(); //井地面标高
pListAll->m_csName = pEquip->GetWellName(); //井编号
2026-09-28 15:28:50 +08:00
pListAll->m_iType = 3;
AcDbObjectId idBlk = pEquip->GetBlock2d();
CString csBlkName = GetBlkNameById(idBlk);
2026-10-04 00:04:20 +08:00
if(_tcsicmp(_T("$TWTSYS$00000186"), csBlkName) == 0) //阀门井
2026-09-28 15:28:50 +08:00
pListAll->m_iNum = 1;
2026-10-04 00:04:20 +08:00
else if(_tcsicmp(_T("$TWTSYS$00000187"), csBlkName) == 0 || _tcsicmp(_T("$TWTSYS$00000336"), csBlkName) == 0) //检查井
2026-09-28 15:28:50 +08:00
pListAll->m_iNum = 2;
2026-10-04 00:04:20 +08:00
else if(_tcsicmp(_T("$TWTSYS$00000190"), csBlkName) == 0) //水封井
2026-09-28 15:28:50 +08:00
pListAll->m_iNum = 3;
2026-10-04 00:04:20 +08:00
else if(_tcsicmp(_T("$TWTSYS$00000191"), csBlkName) == 0) //跌水井
2026-09-28 15:28:50 +08:00
pListAll->m_iNum = 4;
if(pEquip->IsDropWell())
pListAll->m_iNum = 4;
2026-10-04 00:04:20 +08:00
pListAll->m_nStartPress = pEquip->GetWellEleDown(); //跌水井底标高
pListAll->m_nLost = pEquip->GetScale(); //井口直径
2026-09-28 15:28:50 +08:00
}
else if(pListAll->m_iType != 4){
pListAll->m_iType = -1;
if(!bFeedSys){
2026-10-04 00:04:20 +08:00
adsout << _T("\n2管线相交之处缺少井!");
2026-09-28 15:28:50 +08:00
}
}
OPENOBJ_END();
GetAllPipeAndNodeByNode(id, idFront, ss);
}
ss -= ent;
PickSet ssDel(SS_FREE);
XPoint ptFront;
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipeNode, pNode);
if(pNode){
ptFront = pNode->GetLocation();
ptFront.z = 0;
}
OPENOBJ_END();
for(long j=0;j<ss.Length();j++){
Entity entTmp = ss[j];
if(entTmp.In(&ssAll) > 0){
return FALSE;
}
if(entTmp.Is(_T("ATS_PIPE"))){
OPENOBJ_BEGIN(entTmp, AcDb::kForRead, TDbPipe, pPipe);
if(pPipe){
XPoint ptS = pPipe->StartPoint();
XPoint ptE = pPipe->EndPoint();
ptS.z = 0;
ptE.z = 0;
TPipeSys::FlowDirection dir = pPipe->GetFlowDir();
BOOL bDel = FALSE;
if(!ent.Is(_T("ATS_POOL")))
{
2026-10-04 00:04:20 +08:00
//从起点->终点 或 按【管线坡度】的方向
2026-09-28 15:28:50 +08:00
if(dir == TPipeSys::kUnknownDir){
bDel = TRUE;
}
else if(dir == TPipeSys::kFromStart){
double nDist = fabs(ads_distance(ptFront, ptS));
2026-10-04 00:04:20 +08:00
if(ptFront != ptS && nDist > 0.1) //xpoint != _distSnap=0.01 室外坐标过大的时候,精度太小
2026-09-28 15:28:50 +08:00
bDel = TRUE;
}
else if(dir == TPipeSys::kFromEnd){
double nDist = fabs(ads_distance(ptFront, ptE));
if(ptFront != ptE && nDist > 0.1)
bDel = TRUE;
}
}
double dn = pPipe->GetDnDiameter();
if(bDel)
ssDel += entTmp;
if(!bDel && dn < 0){
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("管线没有进行管径标注"));
2026-09-28 15:28:50 +08:00
return TRUE;
}
}
OPENOBJ_END();
}
}
ss -= ssDel;
len = ss.Length();
2026-10-04 00:04:20 +08:00
if(len != 1) //自动搜索,只能顺水流方向搜索,如果有分叉就结束
2026-09-28 15:28:50 +08:00
return TRUE;
ssAll += ss;
for(long i=0;i<ss.Length();i++){
Entity entTmp = ss[i];
AcDbObjectId idTmp = NULL;
acdbGetObjectId(idTmp, entTmp);
idArray.append(idTmp);
}
}
len = idArray.length();
for(long i=0;i<len;i++){
AcDbObjectId idTmp = idArray[i];
ads_name ent;
Entity entTmp;
acdbGetAdsName(ent, idTmp);
entTmp = ent;
SSearchPipeList *pList = new SSearchPipeList();
pList->m_ID = idTmp;
pList->m_pPrevious = pListAll;
pListAll->m_lstNode.Append(pList);
if(!AutoSearchOutdoorWell(entTmp, id, pList, ssAll, bFeedSys))
return FALSE;
if(pList->m_lstNode.Length() == 0 && pList->m_iType == -1){
pListAll->m_lstNode.Remove(0);
ssAll -= entTmp;
}
if(pList->m_lstNode.Length() == 0 && pList->m_iType == 0){
pListAll->m_lstNode.Remove(0);
ssAll -= entTmp;
}
}
return TRUE;
}
2026-10-04 00:04:20 +08:00
//将井编号写入链表
2026-09-28 15:28:50 +08:00
BOOL SetWellData(SSearchPipeList *pListAll, BOOL bFeedSys)
{
BOOL bRet = TRUE;
AcDbObjectId id = NULL;
id = pListAll->m_ID;
ads_name adsent;
acdbGetAdsName(adsent, id);
Entity ent = adsent;
if(ent.Is(_T("ATS_PIPE"))){
pListAll->m_iType = 0;
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe);
if(pPipe){
2026-10-04 00:04:20 +08:00
//2008.4.30 增加以下代码, 在室外中, 标注管长不需要标注真实管长, 只需要标注平面管长
2026-09-28 15:28:50 +08:00
double dLen = pPipe->GetPlanLength();
// XPoint ptS = pPipe->StartPoint();
// XPoint ptE = pPipe->EndPoint();
// ptS.z = 0;
// ptE.z = 0;
// dLen = ads_distance(ptS, ptE);
pListAll->m_nLength = dLen;
pListAll->m_iDn = (int)pPipe->GetDnDiameter();
}
OPENOBJ_END();
pListAll->m_nI = GetPipeGradient(ent);
}
// else if(IsPool(id)){
else if(ent.Is(_T("ATS_POOL"))){
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPool, pEquip);
if(pEquip){
pListAll->m_nDang = pEquip->GetGroundEle();
}
OPENOBJ_END();
pListAll->m_iType = 4;
pListAll->m_csName = _T("HC");
//GetAllPipeAndNodeByNode(id, idFront, ss);
}
else{
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbWell, pEquip);
if(pEquip){
2026-10-04 00:04:20 +08:00
pListAll->m_nDang = pEquip->GetWellEleUp(); //井地面标高
pListAll->m_csName = pEquip->GetWellName(); //井编号
2026-09-28 15:28:50 +08:00
pListAll->m_iType = 3;
AcDbObjectId idBlk = pEquip->GetBlock2d();
CString csBlkName = GetBlkNameById(idBlk);
2026-10-04 00:04:20 +08:00
if(_tcsicmp(_T("$TWTSYS$00000186"), csBlkName) == 0) //阀门井
2026-09-28 15:28:50 +08:00
pListAll->m_iNum = 1;
2026-10-04 00:04:20 +08:00
else if(_tcsicmp(_T("$TWTSYS$00000187"), csBlkName) == 0 || _tcsicmp(_T("$TWTSYS$00000336"), csBlkName) == 0) //检查井
2026-09-28 15:28:50 +08:00
pListAll->m_iNum = 2;
2026-10-04 00:04:20 +08:00
else if(_tcsicmp(_T("$TWTSYS$00000190"), csBlkName) == 0) //水封井
2026-09-28 15:28:50 +08:00
pListAll->m_iNum = 3;
2026-10-04 00:04:20 +08:00
else if(_tcsicmp(_T("$TWTSYS$00000191"), csBlkName) == 0) //跌水井
2026-09-28 15:28:50 +08:00
pListAll->m_iNum = 4;
if(pEquip->IsDropWell())
pListAll->m_iNum = 4;
2026-10-04 00:04:20 +08:00
pListAll->m_nStartPress =pEquip->GetWellEleDown(); //跌水井底标高
pListAll->m_nLost = pEquip->GetScale(); //井口直径
2026-09-28 15:28:50 +08:00
}
// else if(pListAll->m_iType == 4){
2026-10-04 00:04:20 +08:00
// pListAll->m_csName = _T("HC"); //井编号
2026-09-28 15:28:50 +08:00
// }
else if(pListAll->m_iType != 4){
pListAll->m_iType = -1;
2026-10-04 00:04:20 +08:00
if(!bFeedSys){ //如果是雨污系统,不允许管线相交之处缺少井// 2008-3-19
adsout << _T("\n2管线相交之处缺少井!");
2026-09-28 15:28:50 +08:00
return FALSE;
}
}
OPENOBJ_END();
}
long len = pListAll->m_lstNode.Length();
for(long i=0;i<len;i++){
SSearchPipeList *pList = pListAll->m_lstNode[i];
bRet = SetWellData(pList, bFeedSys);
}
return bRet;
}
2026-10-04 00:04:20 +08:00
//本节点往下走,能通向终止井吗?
2026-09-28 15:28:50 +08:00
BOOL IsNodeLink2EndWell(SSearchPipeList *pListAll, Entity entEnd)
{
BOOL bRet = FALSE;
AcDbObjectId id = NULL;
if(pListAll->m_iType == 3){
id = pListAll->m_ID;
ads_name adsent;
acdbGetAdsName(adsent, id);
Entity ent = adsent;
if(ent == entEnd)
return TRUE;
}
long len = pListAll->m_lstNode.Length();
for(long i=0;i<len;i++){
SSearchPipeList *pList = pListAll->m_lstNode[i];
bRet = IsNodeLink2EndWell(pList, entEnd);
if(bRet)
return TRUE;
}
return bRet;
}
2026-10-04 00:04:20 +08:00
//将整个系统pListAll的唯一通道提取出来放到pListNew中
//pListNew 是一个从 “起始井”到“终止井”的单向链表
2026-09-28 15:28:50 +08:00
BOOL SearchSysFromAll(SSearchPipeList *pListAll, SSearchPipeList *pListNew, Entity entEnd, PickSet &ssAll)
{
BOOL bRet = TRUE;
2026-10-04 00:04:20 +08:00
//复制内容
2026-09-28 15:28:50 +08:00
pListNew->m_iDn = pListAll->m_iDn;
pListNew->m_bNeedCale = pListAll->m_bNeedCale;
pListNew->m_iNum = pListAll->m_iNum;
pListNew->m_ID = pListAll->m_ID;
pListNew->m_iType = pListAll->m_iType;
pListNew->m_csName = pListAll->m_csName;
pListNew->m_nLength = pListAll->m_nLength;
pListNew->m_nPipeQ = pListAll->m_nPipeQ;
pListNew->m_nDang = pListAll->m_nDang;
pListNew->m_nStartPress = pListAll->m_nStartPress;
pListNew->m_nI = pListAll->m_nI;
pListNew->m_nV = pListAll->m_nV;
pListNew->m_nLost = pListAll->m_nLost;
long len = pListAll->m_lstNode.Length();
ssAll+=pListNew->m_ID;
2026-10-04 00:04:20 +08:00
//重新确定水流方向
2026-09-28 15:28:50 +08:00
if(pListAll->m_iType == 0){
XPoint ptFront;
if(pListAll->m_pPrevious != NULL){
OPENOBJ_BEGIN(pListAll->m_pPrevious->m_ID, AcDb::kForRead, TDbPipeNode, pNode);
if(pNode){
ptFront = pNode->GetLocation();
}
OPENOBJ_END();
}
OPENOBJ_BEGIN(pListNew->m_ID, AcDb::kForWrite, TDbPipe, pPipe);
if(pPipe){
XPoint p1 = ptFront;
p1.z = 0;
XPoint p2 = pPipe->StartPoint();
p2.z = 0;
if(p1 == p2)
pPipe->SetFlowDir(TPipeSys::kFromStart);
else
pPipe->SetFlowDir(TPipeSys::kFromEnd);
}
OPENOBJ_END();
}
for(long i=0;i<len;i++){
SSearchPipeList *pList = pListAll->m_lstNode[i];
if(!IsNodeLink2EndWell(pList, entEnd))
continue;
SSearchPipeList *pNodeNew = new SSearchPipeList();
pNodeNew->m_pPrevious = pListNew;
pListNew->m_lstNode.Append(pNodeNew);
bRet = SearchSysFromAll(pList, pNodeNew, entEnd, ssAll);
}
return bRet;
}
BOOL SearchOutdoorWell(Entity ent, Entity entEnd, SSearchPipeList *pListAll, PickSet &ssAll, BOOL bFeedSys)
{
2026-10-04 00:04:20 +08:00
if(!entEnd) //没有指定终止井
2026-09-28 15:28:50 +08:00
return AutoSearchOutdoorWell(ent, NULL, pListAll, ssAll, bFeedSys);
2026-10-04 00:04:20 +08:00
//有指定井,由于系统绘制方向可能不是有序的,首先搜索整个系统
2026-09-28 15:28:50 +08:00
SSearchPipeList *pListAll2 = new SSearchPipeList();
PickSet ss(SS_FREE);
ss += ent;
if(!SearchSprinkPipeSys(ent, NULL, pListAll2, ss)){
delete pListAll2;
return FALSE;
}
long len = ss.Length();
int pos = entEnd.In(&ss);
// ss.Redraw(3);
if(pos == 0){
ssAll+=ss;
delete pListAll2;
return FALSE;
}
// if(!SetWellData(pListAll2)){
// ssAll+=ss;
// delete pListAll2;
// return FALSE;
// }
BOOL ret = SearchSysFromAll(pListAll2, pListAll, entEnd, ssAll);
if(!SetWellData(pListAll, bFeedSys)){
ssAll+=ss;
delete pListAll2;
return FALSE;
}
delete pListAll2;
len = ssAll.Length();
return ret;
}
2026-10-04 00:04:20 +08:00
//把树结构的数据转化为DLIST链表结构
2026-09-28 15:28:50 +08:00
BOOL GetWellListData(SSearchPipeList *pListAll, DList<TWellData> &lstWellSys)
{
if(pListAll->m_iType == -1)
return FALSE;
TWellData *pList = new TWellData();
pList->m_iDn = pListAll->m_iDn;
if(pListAll->m_iType == 0)
{
OPENOBJ_BEGIN(pListAll->m_ID, AcDb::kForRead, TDbPipe, pPipe);
if(pPipe){
CString csMat = GetPipeMaterialByIdx(pPipe->GetMaterial());
double nDnOut = GetPipeOutDByDn(csMat, pList->m_iDn)*1000;
pList->m_iSpare = (int)nDnOut;
}
OPENOBJ_END();
}
if(pListAll->m_iType == 3 || pListAll->m_iType == 4){
pList->m_bIsWell = TRUE;
AcDbObjectId id = pListAll->m_ID;
ads_name ent;
acdbGetAdsName(ent, id);
CString csWellRadius = ReadXdata(ent, _T("TG-WELL-RADIUS"));
CString csGroundEle = ReadXdata(ent, _T("TG-WELL-GroundEle"));
BOOL bIsRectWell = FALSE;
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbEquipment, pEquip);
if(pEquip){
AcDbObjectId idRec = pEquip->GetBlock2d();
if(_tcsicmp(GetBlkNameById(idRec), _T("$TwtSys$00000336")) == 0)
bIsRectWell = TRUE;
}
OPENOBJ_END();
pList->m_nGroundEle = _tstof(csGroundEle);
2026-10-04 00:04:20 +08:00
pList->m_nWellRadius = _tstof(csWellRadius)/2.0; //转化为半径
2026-09-28 15:28:50 +08:00
if(fabs(pList->m_nWellRadius) < 0.1)
pList->m_nWellRadius = 350;
if(bIsRectWell)
pList->m_nWellRadius *= (-1);
}
else
pList->m_bIsWell = FALSE;
if(pListAll->m_iNum == 4)
pList->m_bIsDropWell = TRUE;
2026-10-04 00:04:20 +08:00
//如果接化粪池,管线长度要减去化粪池遮挡的部分
2026-09-28 15:28:50 +08:00
if(pListAll->m_iType == 0){
SSearchPipeList *pListPrevious = pListAll->m_pPrevious;
BOOL bFlag = FALSE;
if(pListPrevious != NULL && pListPrevious->m_iType == 4){
bFlag = TRUE;
}
else if(pListAll->m_lstNode.Length() == 1){
pListPrevious = pListAll->m_lstNode[0];
2026-10-04 00:04:20 +08:00
if(pListPrevious != NULL && pListPrevious->m_iType == 4) //4:化粪池
2026-09-28 15:28:50 +08:00
bFlag = TRUE;
}
if(bFlag){
AcDbObjectId id = pListPrevious->m_ID;
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPool, pEquip);
if(pEquip){
double nXScale = pEquip->GetSizeX();
if(!DocGetMeterUnitDraw())
nXScale = nXScale/2000;
else
nXScale = nXScale/2.0;
2026-10-04 00:04:20 +08:00
pListAll->m_nSpare = pListAll->m_nLength + nXScale;//管长=对象长-池长度/2
// pListAll->m_nLength = pListAll->m_nLength - nXScale/2000;//管长=对象长-池长度/2
2026-09-28 15:28:50 +08:00
}
OPENOBJ_END();
}
}
pList->m_csName = pListAll->m_csName;
pList->m_ID = pListAll->m_ID;
pList->m_nI = pListAll->m_nI;
2026-10-04 00:04:20 +08:00
pList->m_nUpEle = pListAll->m_nDang; //井地面标高
pList->m_nDownEle = pListAll->m_nStartPress; //跌水井底标高
2026-09-28 15:28:50 +08:00
pList->m_nLength = pListAll->m_nLength;
2026-10-04 00:04:20 +08:00
pList->m_dRealLength = pListAll->m_nSpare; //真实管长用m_nSpare存放
2026-09-28 15:28:50 +08:00
// if(!DocGetMeterUnitDraw())
// pList->m_nLength = pList->m_nLength/1000;
lstWellSys.Append(pList);
BOOL bRet = TRUE;
long len = pListAll->m_lstNode.Length();
for(long i=0;i<len;i++){
SSearchPipeList *pList = pListAll->m_lstNode[i];
bRet = GetWellListData(pList, lstWellSys);
}
return bRet;
}
//***************************************************************************************************
2026-10-04 00:04:20 +08:00
// 坡度定高
2026-09-28 15:28:50 +08:00
//***************************************************************************************************
2026-10-04 00:04:20 +08:00
//重新确定水流方向
2026-09-28 15:28:50 +08:00
void ResetPipeDir(SSearchPipeList *pListAll)
{
long len = pListAll->m_lstNode.Length();
if(pListAll->m_iType == 0){
XPoint ptFront;
if(pListAll->m_pPrevious != NULL){
2026-10-04 00:04:20 +08:00
// 考虑管连接化粪池 cet 2011.11.8 add
2026-09-28 15:28:50 +08:00
// OPENOBJ_BEGIN(pListAll->m_pPrevious->m_ID, AcDb::kForRead, TDbPipeNode, pNode);
// if(pNode){
// ptFront = pNode->GetLocation();
// }
// OPENOBJ_END();
OPENOBJ_BEGIN(pListAll->m_pPrevious->m_ID, AcDb::kForRead, TDbPool, pPool);
2026-10-04 00:04:20 +08:00
if(pPool != NULL) // 先查看是否为化粪池
2026-09-28 15:28:50 +08:00
{
int nNum = pPool->GetInterfaceNum();
TPipeInterface face;
for(int j = 0; j < nNum; j++)
{
pPool->GetInterface(j, face);
if (face.m_idPipe == pListAll->m_ID)
{
ptFront = face.m_ptLocation;
break;
}
}
}
OPENOBJ_END();
if (!ptFront)
{
OPENOBJ_BEGIN(pListAll->m_pPrevious->m_ID, AcDb::kForRead, TDbPipeNode, pNode);
if(pNode)
{
ptFront = pNode->GetLocation();
}
OPENOBJ_END();
}
}
OPENOBJ_BEGIN(pListAll->m_ID, AcDb::kForWrite, TDbPipe, pPipe);
if(pPipe && !!ptFront){
XPoint p1 = ptFront;
p1.z = 0;
XPoint p2 = pPipe->StartPoint();
p2.z = 0;
if(p1 == p2)
pPipe->SetFlowDir(TPipeSys::kFromEnd);
else
pPipe->SetFlowDir(TPipeSys::kFromStart);
}
OPENOBJ_END();
}
for(long i=0;i<len;i++){
SSearchPipeList *pList = pListAll->m_lstNode[i];
ResetPipeDir(pList);
}
}
2026-10-04 00:04:20 +08:00
// 修改管线上的附件和接口设备 cet 2010.9.27 add
2026-09-28 15:28:50 +08:00
void ModifyPipeEquimentAttachment(TDbPipe *pPipe)
{
if (pPipe != NULL)
{
XPoint ptTmp = pPipe->StartPoint();
XPoint ptTmp2 = pPipe->EndPoint();
AcDbObjectId nodeId1(NULL), nodeId2(NULL);
nodeId1 = pPipe->GetNode(0);
nodeId2 = pPipe->GetNode(1);
OPENOBJ_BEGIN(nodeId1, AcDb::kForRead, TDbEquipment, pEquip);
if(pEquip && !pEquip->isKindOf(TDbPump::desc()))
{
if(pEquip->upgradeOpen()==Acad::eOk)
{
XPoint ptTmp4 = pEquip->GetInsert();
if(ptTmp.Distance2d(ptTmp4) < 1e-3)
{
ptTmp4.z = ptTmp.z;
}
else
{
ptTmp4.z = ptTmp2.z;
}
pEquip->SetInsert(ptTmp4);
XPoint ptTmp3 = pEquip->GetLocation();
if(ptTmp.Distance2d(ptTmp3) < 1e-3)
{
ptTmp3.z = ptTmp.z;
}
else
{
ptTmp3.z = ptTmp2.z;
}
pEquip->SetLocation(ptTmp3);
pEquip->downgradeOpen();
}
}
OPENOBJ_END();
OPENOBJ_BEGIN(nodeId2, AcDb::kForRead, TDbEquipment, pEquip);
if(pEquip && !pEquip->isKindOf(TDbPump::desc()))
{
if(pEquip->upgradeOpen()==Acad::eOk) {
XPoint ptTmp4 = pEquip->GetInsert();
if(ptTmp.Distance2d(ptTmp4) < 1e-3)
{
ptTmp4.z = ptTmp.z;
}
else
{
ptTmp4.z = ptTmp2.z;
}
pEquip->SetInsert(ptTmp4);
XPoint ptTmp3 = pEquip->GetLocation();
if(ptTmp.Distance2d(ptTmp3) < 1e-3)
{
ptTmp3.z = ptTmp.z;
}
else
{
ptTmp3.z = ptTmp2.z;
}
pEquip->SetLocation(ptTmp3);
pEquip->downgradeOpen();
}
}
OPENOBJ_END();
DList<AcDbObjectId> lstAttachment;
pPipe->GetAttachments(lstAttachment);
int len = lstAttachment.Length();
for(int m=0;m<len;m++)
{
AcDbObjectId idTmp = *lstAttachment[m];
OPENOBJ_BEGIN(idTmp, AcDb::kForWrite, TDbPipeAttachment, pValve);
if(pValve){
XPoint ptLoc = pValve->GetLocation();
AcDbLine line(ptTmp, ptTmp2);
XPoint pt;
line.getClosestPointTo(ptLoc, AcGeVector3d::kZAxis, pt);
ptLoc = pt;
pValve->SetLocation(ptLoc);
2026-10-04 00:04:20 +08:00
// 设置方向
2026-09-28 15:28:50 +08:00
XCurveSegment seg(ptTmp, ptTmp2, 0);
XVector3D vectBase(seg.EndPoint().x - seg.StartPoint().x, seg.EndPoint().y - seg.StartPoint().y, seg.EndPoint().z - seg.StartPoint().z);
vectBase.Normalize();
if(vectBase.y < -0.000001
2026-10-04 00:04:20 +08:00
||(vectBase.y<0.000001&&vectBase.y>=-0.000001&&vectBase.x<0)) //管线逆向绘制
2026-09-28 15:28:50 +08:00
{
vectBase.x = -vectBase.x;
vectBase.y = -vectBase.y;
}
pValve->SetDirection(vectBase);
}
OPENOBJ_END();
}
}
}
2026-10-04 00:04:20 +08:00
// 修改管线上的附件和接口设备 cet 2010.9.27 add
2026-09-28 15:28:50 +08:00
void ModifyPipeEquimentAttachment(AcDbObjectId idPipe)
{
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, idPipe, AcDb::kForRead);
if (pPipe != NULL)
{
ModifyPipeEquimentAttachment(pPipe);
pPipe->close();
}
}
2026-10-04 00:04:20 +08:00
//计算标高
2026-09-28 15:28:50 +08:00
void CalcPipeEle(SSearchPipeList *pListAll)
{
double dMeter(1);
if(!DocGetMeterUnitDraw())
dMeter = 1000;
long len = pListAll->m_lstNode.Length();
double dCalcEle(0), dEle(0);
if(pListAll->m_iType == 0){
dCalcEle = pListAll->m_nSpare;
// if(pListAll->m_pPrevious != NULL || fabs(dCalcEle) > 0.01){
if(pListAll->m_pPrevious != NULL)
dEle = pListAll->m_pPrevious->m_nSpare;
else
dEle = dCalcEle;
OPENOBJ_BEGIN(pListAll->m_ID, AcDb::kForWrite, TDbPipe, pPipe);
if(pPipe){
double dLen = pPipe->GetPlanLength();
// if(!DocGetMeterUnitDraw())
// dLen = dLen/1000;
double dGradient = pPipe->GetPipeGradient();
dCalcEle = dEle + dLen * dGradient;
if(pPipe->GetFlowDir() == TPipeSys::kFromStart)
{
pPipe->StartPoint().z = dCalcEle*dMeter;
pPipe->EndPoint().z = dEle*dMeter;
}
else
{
pPipe->StartPoint().z = dEle*dMeter;
pPipe->EndPoint().z = dCalcEle*dMeter;
}
2026-10-04 00:04:20 +08:00
// cet 2010.9.27 add 修改与管线相关的附件和设备
2026-09-28 15:28:50 +08:00
ModifyPipeEquimentAttachment(pPipe);
}
OPENOBJ_END();
// }
}
for(long i=0;i<len;i++){
SSearchPipeList *pList = pListAll->m_lstNode[i];
if(pListAll->m_iType == 0)
pList->m_nSpare = dCalcEle;
CalcPipeEle(pList);
}
}
void CalcEleByGradient()
{
Entity entMainPipe;
RBList rbMask(RTDXF0, _T("ATS_PIPE,ATS_PIPECANAL"), NULL);
double dMeter(1);
if(!DocGetMeterUnitDraw())
dMeter = 1000;
2026-10-04 00:04:20 +08:00
if(SelectEntity(_T("\n请选择管线下游端点<退出>"), entMainPipe, rbMask) != RTNORM)
2026-09-28 15:28:50 +08:00
return;
SSearchPipeList *pListAll = new SSearchPipeList();
PickSet ssAll(SS_FREE);
ssAll += entMainPipe;
if(!SearchSprinkPipeSys(entMainPipe, NULL, pListAll, ssAll)){
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("系统有回路!"));
2026-09-28 15:28:50 +08:00
delete pListAll;
return;
}
ads_name entHead;
if(pListAll->m_lstNode.Length() == 2)
{
SSearchPipeList *p1 = pListAll->m_lstNode[0];
SSearchPipeList *p2 = pListAll->m_lstNode[1];
if((p1->m_lstNode.Length() == 1 && p2->m_lstNode.Length() == 1) ||
(p1->m_lstNode.Length() > 1 && p2->m_lstNode.Length() > 1))
{
2026-10-04 00:04:20 +08:00
adsout << _T("\n没有正确选择末端管线,无法计算!");
2026-09-28 15:28:50 +08:00
delete pListAll;
return;
}
if(p1->m_lstNode.Length() == 0)
acdbGetAdsName(entHead, p1->m_ID);
else if(p2->m_lstNode.Length() == 0)
acdbGetAdsName(entHead, p2->m_ID);
}
int len = ssAll.Length();
if(len == 3)
{
2026-10-04 00:04:20 +08:00
adsout << _T("单管修改标高请直接双击管线即可.本命令用于多管标高计算\n");
2026-09-28 15:28:50 +08:00
delete pListAll;
return;
}
XPoint ptS, ptE, ptLoc;
double dEle(0);
GetPipePoint(entMainPipe, ptS, ptE);
OPENOBJ_BEGIN(entHead, AcDb::kForRead, TDbPipeNode, pNode);
if(pNode){
XPoint ptS2 = ptS;
XPoint ptE2 = ptE;
ptS2.z = 0;
ptE2.z = 0;
ptLoc = pNode->GetLocation();
ptLoc.z = 0;
2026-10-04 00:04:20 +08:00
//先把主管线流向给纠正
2026-09-28 15:28:50 +08:00
OPENOBJ_BEGIN(entMainPipe, AcDb::kForWrite, TDbPipe, pPipe);
if(pPipe){
if(ptLoc == ptS2)
{
pPipe->SetFlowDir(TPipeSys::kFromEnd);
dEle = ptS.z / dMeter;
}
else if(ptLoc == ptE2)
{
pPipe->SetFlowDir(TPipeSys::kFromStart);
dEle = ptE.z / dMeter;
}
}
OPENOBJ_END();
}
OPENOBJ_END();
CString csPrompt;
2026-10-04 00:04:20 +08:00
csPrompt.Format(_T("\n输入此下游端点的标高<%.3f米>:"), dEle);
2026-09-28 15:28:50 +08:00
ads_getreal(csPrompt, &dEle);
pListAll->m_nSpare = dEle;
if(pListAll->m_pPrevious != NULL)
pListAll->m_pPrevious->m_nSpare = dEle;
2026-10-04 00:04:20 +08:00
//再把系统其他管线流向都纠正
2026-09-28 15:28:50 +08:00
ResetPipeDir(pListAll);
CalcPipeEle(pListAll);
delete pListAll;
}
//***************************************************************************************************
2026-10-04 00:04:20 +08:00
// 坡高计算
2026-09-28 15:28:50 +08:00
//***************************************************************************************************
2026-10-04 00:04:20 +08:00
// 检查上下游端点是否在同一管道系统 pListAll为下游端点获得的
// 管道系统 ent为上游端点
2026-09-28 15:28:50 +08:00
BOOL IsInSamePipeSys(SSearchPipeList *pListAll, Entity &ent)
{
if (pListAll == NULL)
{
return FALSE;
}
AcDbObjectId id;
acdbGetObjectId(id, ent);
if (pListAll->m_ID == id)
{
if (pListAll->m_lstNode.Length() > 1 || pListAll->m_lstNode.Length() == 0)
{
return FALSE;
}
else
{
if (pListAll->m_lstNode[0]->m_lstNode.Length() == 0)
{
return TRUE;
}
return FALSE;
}
}
for (int i = 0; i < pListAll->m_lstNode.Length(); i++)
{
if (IsInSamePipeSys(pListAll->m_lstNode[i], ent))
{
return TRUE;
}
}
return FALSE;
}
2026-10-04 00:04:20 +08:00
// 修改主管线流向
2026-09-28 15:28:50 +08:00
void ModifyMainPipeDir(Entity &entMainPipe, Entity &entHead)
{
XPoint ptS, ptE, ptLoc;
GetPipePoint(entMainPipe, ptS, ptE);
OPENOBJ_BEGIN(entHead, AcDb::kForRead, TDbPipeNode, pNode);
if(pNode)
{
XPoint ptS2 = ptS;
XPoint ptE2 = ptE;
ptS2.z = 0;
ptE2.z = 0;
ptLoc = pNode->GetLocation();
ptLoc.z = 0;
2026-10-04 00:04:20 +08:00
//先把主管线流向给纠正
2026-09-28 15:28:50 +08:00
OPENOBJ_BEGIN(entMainPipe, AcDb::kForWrite, TDbPipe, pPipe);
if(pPipe)
{
if(ptLoc == ptS2)
{
pPipe->SetFlowDir(TPipeSys::kFromEnd);
}
else if(ptLoc == ptE2)
{
pPipe->SetFlowDir(TPipeSys::kFromStart);
}
}
OPENOBJ_END();
}
OPENOBJ_END();
}
2026-10-04 00:04:20 +08:00
// 管线端点标高: bUp = true 上游端点标高,否则下游端点标高
2026-09-28 15:28:50 +08:00
double GetPipeEle(Entity &ent, BOOL bUp)
{
double dMeter = 1.0;
if (!DocGetMeterUnitDraw())
{
dMeter = 1000.0;
}
double dEle = 0.0;
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe);
if(pPipe != NULL)
{
TPipeSys::FlowDirection sys;
sys = pPipe->GetFlowDir();
if (sys == TPipeSys::kFromEnd)
{
if (bUp)
{
dEle = pPipe->EndPoint().z / dMeter;
}
else
{
dEle = pPipe->StartPoint().z / dMeter;
}
}
else
{
if (bUp)
{
dEle = pPipe->StartPoint().z / dMeter;
}
else
{
dEle = pPipe->EndPoint().z / dMeter;
}
}
}
OPENOBJ_END();
return dEle;
}
2026-10-04 00:04:20 +08:00
// 获得上游端点
2026-09-28 15:28:50 +08:00
SSearchPipeList* GetUpPipe(SSearchPipeList *pListAll, Entity &ent)
{
if (pListAll == NULL)
{
return NULL;
}
AcDbObjectId id;
acdbGetObjectId(id, ent);
if (pListAll->m_ID == id)
{
if (pListAll->m_lstNode.Length() == 1)
{
pListAll = pListAll->m_lstNode[0];
}
return pListAll;
}
SSearchPipeList* pLstRes = NULL;
for (int i = 0; i < pListAll->m_lstNode.Length(); i++)
{
SSearchPipeList* pLst = pListAll->m_lstNode[i];
pLstRes = GetUpPipe(pLst, ent);
if (pLstRes != NULL)
{
return pLstRes;
}
}
return pLstRes;
}
2026-10-04 00:04:20 +08:00
// 反算标高(从下游端点计算)
2026-09-28 15:28:50 +08:00
void CalcPipeEleByAntitone(SSearchPipeList *pListAll, double dGrad, BOOL bGrad)
{
double dMeter(1);
if(!DocGetMeterUnitDraw())
dMeter = 1000;
long nLen = pListAll->m_lstNode.Length();
double dCalcEle(0), dEle(0);
dCalcEle = pListAll->m_nSpare;
2026-10-04 00:04:20 +08:00
if(pListAll->m_iType == 0) // 管线
2026-09-28 15:28:50 +08:00
{
if(pListAll->m_pPrevious != NULL)
dEle = pListAll->m_pPrevious->m_nSpare;
else
dEle = dCalcEle;
OPENOBJ_BEGIN(pListAll->m_ID, AcDb::kForWrite, TDbPipe, pPipe);
if(pPipe != NULL)
{
double dLen = pPipe->GetPlanLength();
2026-10-04 00:04:20 +08:00
if (bGrad) // 按管线本身坡度计算
2026-09-28 15:28:50 +08:00
{
dGrad = pPipe->GetPipeGradient();
}
else
{
pPipe->SetPipeGradient(dGrad);
}
dCalcEle = dEle + dLen * dGrad;
if(pPipe->GetFlowDir() == TPipeSys::kFromStart)
{
pPipe->StartPoint().z = dCalcEle * dMeter;
pPipe->EndPoint().z = dEle * dMeter;
}
else
{
pPipe->StartPoint().z = dEle * dMeter;
pPipe->EndPoint().z = dCalcEle * dMeter;
}
ModifyPipeEquimentAttachment(pPipe);
}
OPENOBJ_END();
}
for(long i=0;i < nLen; i++)
{
SSearchPipeList *pList = pListAll->m_lstNode[i];
pList->m_nSpare = dCalcEle;
CalcPipeEleByAntitone(pList, dGrad, bGrad);
}
}
2026-10-04 00:04:20 +08:00
// 计算支路标高
2026-09-28 15:28:50 +08:00
void CalcSpurTrackEle(SSearchPipeList *pListAll)
{
for (int i = 0; i < pListAll->m_lstNode.Length(); i++)
{
SSearchPipeList *pLst = NULL;
pLst = pListAll->m_lstNode[i];
if (pLst->m_iSpare != 1)
{
CalcPipeEleByAntitone(pLst, 0.0, TRUE);
}
else
{
CalcSpurTrackEle(pLst);
}
}
}
2026-10-04 00:04:20 +08:00
// 正算标高(从上游端点计算)
2026-09-28 15:28:50 +08:00
void CalcPipeEleByPositive(SSearchPipeList *pListAll, double dGrad, BOOL bGrad)
{
double dMeter = 1.0;
if (!DocGetMeterUnitDraw())
{
dMeter = 1000.0;
}
2026-10-04 00:04:20 +08:00
SSearchPipeList *pLst = NULL; // 保存管网的下游节点
while(pListAll != NULL) // 计算主干标高
2026-09-28 15:28:50 +08:00
{
double dCalcEle = 0;
double dEle = 0.0;
dCalcEle = pListAll->m_nSpare;
dEle = dCalcEle;
2026-10-04 00:04:20 +08:00
if(pListAll->m_iType == 0) // 管线
2026-09-28 15:28:50 +08:00
{
OPENOBJ_BEGIN(pListAll->m_ID, AcDb::kForWrite, TDbPipe, pPipe);
if(pPipe != NULL)
{
double dLen = pPipe->GetPlanLength();
if (bGrad)
{
dGrad = pPipe->GetPipeGradient();
}
else
{
pPipe->SetPipeGradient(dGrad);
}
dCalcEle = dEle - dLen * dGrad;
if(pPipe->GetFlowDir() == TPipeSys::kFromStart)
{
pPipe->EndPoint().z = dCalcEle * dMeter;
pPipe->StartPoint().z = dEle * dMeter;
}
else
{
pPipe->EndPoint().z = dEle * dMeter;
pPipe->StartPoint().z = dCalcEle * dMeter;
}
ModifyPipeEquimentAttachment(pPipe);
}
OPENOBJ_END();
}
2026-10-04 00:04:20 +08:00
pListAll->m_iSpare = 1; // 为1表示已经处理
2026-09-28 15:28:50 +08:00
pLst = pListAll;
pListAll = pListAll->m_pPrevious;
if (pListAll != NULL)
{
pListAll->m_nSpare = dCalcEle;
}
}
2026-10-04 00:04:20 +08:00
// 处理支路
2026-09-28 15:28:50 +08:00
CalcSpurTrackEle(pLst);
}
2026-10-04 00:04:20 +08:00
// 上游端点到下游端点管线长度
2026-09-28 15:28:50 +08:00
double GetTotalLen(SSearchPipeList *pListAll)
{
double dLen = 0.0;
while(pListAll != NULL)
{
2026-10-04 00:04:20 +08:00
if(pListAll->m_iType == 0) // 管线
2026-09-28 15:28:50 +08:00
{
OPENOBJ_BEGIN(pListAll->m_ID, AcDb::kForRead, TDbPipe, pPipe);
if(pPipe != NULL)
{
dLen += pPipe->GetPlanLength();
}
OPENOBJ_END();
}
pListAll = pListAll->m_pPrevious;
}
return dLen;
}
2026-10-04 00:04:20 +08:00
// cet 2011.6.3 add 将与井相连的管道的管内底标高添加到井中,以便标注等使用
2026-09-28 15:28:50 +08:00
void AddPipeEleForWell(SSearchPipeList *pListAll)
{
if (pListAll == NULL)
{
return;
}
2026-10-04 00:04:20 +08:00
if (pListAll->m_iType == 3) // 井
2026-09-28 15:28:50 +08:00
{
TDbWell *pWell = NULL;
acdbOpenObject(pWell, pListAll->m_ID, AcDb::kForWrite);
if (pWell != NULL)
{
double dMeter = 1;
if (!DocGetMeterUnitDraw())
{
dMeter = 1000;
}
int nNum = pWell->GetInterfaceNum();
for(int j = 0; j < nNum; j++)
{
TPipeInterface face;
pWell->GetInterface(j, face);
XPoint ptLoc = pWell->GetLocation();
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, face.m_idPipe, AcDb::kForRead);
if (pPipe != NULL)
{
double dEle = 0.0;
2026-10-04 00:04:20 +08:00
if (ptLoc.Distance2d(pPipe->StartPoint()) < _DIST_SNAP) // 井插入点与管起点重合
2026-09-28 15:28:50 +08:00
{
dEle = pPipe->StartPoint().z / dMeter;
}
2026-10-04 00:04:20 +08:00
else // 井插入点与管终点重合
2026-09-28 15:28:50 +08:00
{
dEle = pPipe->EndPoint().z / dMeter;
}
CString sMat = GetPipeMaterialByIdx(pPipe->GetMaterial());
2026-10-04 00:04:20 +08:00
double dRadius = GetPipeDjByDn(sMat, static_cast<int>(pPipe->GetDnDiameter())) * 0.5; // 管内半径
2026-09-28 15:28:50 +08:00
dEle -= dRadius;
CString sEle;
sEle.Format(_T("%.3f"), dEle);
pWell->SetPipeEndEle(face.m_idPipe, sEle);
pPipe->close();
}
}
pWell->close();
}
}
for (int i = 0; i < pListAll->m_lstNode.Length(); i++)
{
AddPipeEleForWell(pListAll->m_lstNode[i]);
}
}
2026-10-04 00:04:20 +08:00
// 主函数
2026-09-28 15:28:50 +08:00
void CalcGradientEle()
{
Entity entUpPipe, entLowPipe;
XPoint ptPick;
RBList rbMask(RTDXF0, _T("ATS_PIPE,ATS_PIPECANAL"), NULL);
double dMeter(1);
if(!DocGetMeterUnitDraw())
dMeter = 1000;
TCHAR chRet = _T('\0');
int nRet = 0;
2026-10-04 00:04:20 +08:00
BOOL bUp = FALSE; // 选择的是否为管线上游端点
2026-09-28 15:28:50 +08:00
INITGET_BEG(0, _T("S"));
2026-10-04 00:04:20 +08:00
nRet = SelectEntity(_T("\n请选择管线下游端点[选择上游端点(S)]<退出>:"), entLowPipe, ptPick, rbMask, _T("S"),chRet);
2026-09-28 15:28:50 +08:00
INITGET_END();
#if (ADS == 19)
if (chRet == _T('\0'))
{
TCHAR szCh[20];
acedGetInput(szCh);
chRet = szCh[0];
}
#endif
if (nRet == RTKWORD)
{
if (chRet == _T('S'))
{
bUp = TRUE;
2026-10-04 00:04:20 +08:00
if(SelectEntity(_T("\n请选择上游端点位置<退出>"), entUpPipe, rbMask) != RTNORM)
2026-09-28 15:28:50 +08:00
{
return;
}
2026-10-04 00:04:20 +08:00
if(SelectEntity(_T("\n请选择下游端点位置<退出>"), entLowPipe, rbMask) != RTNORM)
2026-09-28 15:28:50 +08:00
{
return;
}
}
}
else if (nRet != RTNORM)
{
return;
}
SSearchPipeList *pListAll = new SSearchPipeList();
PickSet ssAll(SS_FREE);
ssAll += entLowPipe;
if(!SearchSprinkPipeSys(entLowPipe, NULL, pListAll, ssAll))
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("系统有回路!"));
2026-09-28 15:28:50 +08:00
delete pListAll;
return;
}
ads_name entHead;
if(pListAll->m_lstNode.Length() == 2)
{
SSearchPipeList *p1 = pListAll->m_lstNode[0];
SSearchPipeList *p2 = pListAll->m_lstNode[1];
if((p1->m_lstNode.Length() == 1 && p2->m_lstNode.Length() == 1) ||
(p1->m_lstNode.Length() > 1 && p2->m_lstNode.Length() > 1))
{
2026-10-04 00:04:20 +08:00
adsout << _T("\n没有正确选择末端管线,无法计算!");
2026-09-28 15:28:50 +08:00
delete pListAll;
return;
}
if(p1->m_lstNode.Length() == 0)
acdbGetAdsName(entHead, p1->m_ID);
else if(p2->m_lstNode.Length() == 0)
acdbGetAdsName(entHead, p2->m_ID);
}
int nLen = ssAll.Length();
if(nLen == 3)
{
2026-10-04 00:04:20 +08:00
adsout << _T("单管修改标高请直接双击管线即可.本命令用于多管标高计算\n");
2026-09-28 15:28:50 +08:00
delete pListAll;
return;
}
2026-10-04 00:04:20 +08:00
// 修改管线流向
2026-09-28 15:28:50 +08:00
Entity xx(entHead);
ModifyMainPipeDir(entLowPipe, xx);
ResetPipeDir(pListAll);
2026-10-04 00:04:20 +08:00
if (bUp) // 管线上游端点
2026-09-28 15:28:50 +08:00
{
if (!IsInSamePipeSys(pListAll, entUpPipe))
{
2026-10-04 00:04:20 +08:00
adsout << _T("\n上下游端点不在同一管道系统或上游端点不是末端管线!");
2026-09-28 15:28:50 +08:00
return;
}
CGradientEleCalcDlg dlg;
dlg.SetUpElevation(bUp);
dlg.SetUpEle(GetPipeEle(entUpPipe, TRUE));
dlg.SetLowEle(GetPipeEle(entLowPipe, FALSE));
if (dlg.DoModal() != IDOK)
{
return;
}
2026-10-04 00:04:20 +08:00
BOOL bLowEle = FALSE; //是否设置了下游端点标高
2026-09-28 15:28:50 +08:00
bLowEle = dlg.GetChkLowEle();
2026-10-04 00:04:20 +08:00
if (bLowEle) // 按上下游端点标高计算
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
double dUpEle = dlg.GetUpEle(); // 上游端点标高
double dLowEle = dlg.GetLowEle(); // 下游端点标高
2026-09-28 15:28:50 +08:00
SSearchPipeList *pLstUp = NULL;
2026-10-04 00:04:20 +08:00
pLstUp = GetUpPipe(pListAll, entUpPipe); // 上游端点
2026-09-28 15:28:50 +08:00
if (pLstUp != NULL)
{
2026-10-04 00:04:20 +08:00
double dLen = GetTotalLen(pLstUp); // 上游端点到下游端点管线长度
double dGrad = (dUpEle - dLowEle) / dLen; // 主干上管线的坡度
2026-09-28 15:28:50 +08:00
pLstUp->m_nSpare = dUpEle;
2026-10-04 00:04:20 +08:00
CalcPipeEleByPositive(pLstUp, dGrad, FALSE); // 正算标高
2026-09-28 15:28:50 +08:00
}
}
2026-10-04 00:04:20 +08:00
else // 按上游端点和坡度计算
2026-09-28 15:28:50 +08:00
{
double dGrad = dlg.GetGradient();
double dEle = dlg.GetUpEle();
BOOL bGrad = dlg.GetChkGradient();
SSearchPipeList *pLstUp = NULL;
pLstUp = GetUpPipe(pListAll, entUpPipe);
if (pLstUp != NULL)
{
pLstUp->m_nSpare = dEle;
2026-10-04 00:04:20 +08:00
CalcPipeEleByPositive(pLstUp, dGrad, bGrad); // 正算标高
2026-09-28 15:28:50 +08:00
}
}
}
2026-10-04 00:04:20 +08:00
else // 管线下游端点
2026-09-28 15:28:50 +08:00
{
CGradientEleCalcDlg dlg;
dlg.SetUpElevation(bUp);
dlg.SetPipeSys(pListAll);
dlg.SetLowEle(GetPipeEle(entLowPipe, FALSE));
if (dlg.DoModal() != IDOK)
{
return;
}
2026-10-04 00:04:20 +08:00
BOOL bUpEle = FALSE; // 是否设置了上游端点标高
2026-09-28 15:28:50 +08:00
bUpEle = dlg.GetChkUpEle();
2026-10-04 00:04:20 +08:00
if (bUpEle) // 按上下游端点标高计算
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
double dUpEle = dlg.GetUpEle(); // 上游端点标高
double dLowEle = dlg.GetLowEle(); // 下游端点标高
2026-09-28 15:28:50 +08:00
dlg.GetEnt(entUpPipe);
if (!IsInSamePipeSys(pListAll, entUpPipe))
{
2026-10-04 00:04:20 +08:00
adsout << _T("\n上下游端点不在同一管道系统或上游端点不是末端管线!");
2026-09-28 15:28:50 +08:00
return;
}
SSearchPipeList *pLstUp = NULL;
2026-10-04 00:04:20 +08:00
pLstUp = GetUpPipe(pListAll, entUpPipe); // 上游端点
2026-09-28 15:28:50 +08:00
if (pLstUp != NULL)
{
2026-10-04 00:04:20 +08:00
double dLen = GetTotalLen(pLstUp); // 上游端点到下游端点管线长度
double dGrad = (dUpEle - dLowEle) / dLen; // 主干上管线的坡度
2026-09-28 15:28:50 +08:00
pLstUp->m_nSpare = dUpEle;
2026-10-04 00:04:20 +08:00
CalcPipeEleByPositive(pLstUp, dGrad, FALSE); // 正算标高
2026-09-28 15:28:50 +08:00
}
}
2026-10-04 00:04:20 +08:00
else // 按下游端点和坡度计算
2026-09-28 15:28:50 +08:00
{
double dGrad = dlg.GetGradient();
double dEle = dlg.GetLowEle();
BOOL bGrad = dlg.GetChkGradient();
pListAll->m_nSpare = dEle;
2026-10-04 00:04:20 +08:00
CalcPipeEleByAntitone(pListAll,dGrad, bGrad); // 反算标高
2026-09-28 15:28:50 +08:00
}
}
2026-10-04 00:04:20 +08:00
// cet 2011.6.3 add 将与井相连的管道的管内底标高添加到井中,以便标注等使用
2026-09-28 15:28:50 +08:00
AddPipeEleForWell(pListAll);
}