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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|