Files
envi-code/SourceCode/Code2026/Dimension/WellCalcSettingDlg.cpp
T

2844 lines
81 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#include "stdafx.h"
#include "AcDbObjectPtr.h"
#include "GeCurveInline.h"
#include "RBGroups.h"
#include "DbWell.h"
#include "xtext.h"
#include "dbgridsheet.h"
#include "DbPool.h"
#include "DbVerticalSection.h"
#include "DbVerticalSectionFeed.h"
#include <vector>
#include <algorithm>
#include "DbStake.h"
#include <stack>
#include "DbPipe.h"
#include "SHAcDbBlockTableRecPtr.h"
#include "WellCalcSettingDlg.h"
#include "WellCalcModifyEleDlg.h"
#include "layerdef.h"
extern AcDbObjectId InitLayer(const TCHAR *szLayer, BOOL bApplyChange = TRUE);
extern void InsertWellCalcSheet(DList<TWellData> &lstWellSys);
extern void SetPipeLabelType(CDbPipe *pPipe);
namespace
{
AcDbObjectId InitDoteLayer(const TCHAR* szLay)
{
AcDbObjectId idLay = GlobalFunc::GetLayerIdFromString(szLay);
if (!!idLay)
return idLay;
AcDbObjectId id = InitLayer(szLay);
GlobalFunc::AddLineType(_T("CENTER2"));
AcDbLinetypeTable *pLinetypeTbl;
AcDbObjectId ltId;
Acad::ErrorStatus es = acdbCurDwg()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);
if (es != Acad::eOk) {
return NULL;
}
if ((pLinetypeTbl->getAt(_T("CENTER2"), ltId)) != Acad::eOk) {
pLinetypeTbl->close();
return NULL;
}
pLinetypeTbl->close();
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbLayerTableRecord, pRec);
if (pRec) {
pRec->setLinetypeObjectId(ltId);
}
OPENOBJ_END();
return id;
}
AcDbObjectId GetHitSheet(XPoint ptHit)
{
AcDbObjectId id;
PickSet ss(SS_FREE);
RBList mask(RTDXF0, _T("AEC_ZT_SHEET"), NULL);
if (GlobalFunc::GetEntByDxf(ss, _T("AEC_ZT_SHEET")) == Acad::eOk) {
long lCount = ss.Length();
for (long i = 0L; i < lCount; i++) {
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbSheet, pSheet);
if (pSheet && pSheet->IsValid()) {
XPoly2D poly;
pSheet->GetBorder(poly);
if ((ptHit & poly) == PR_INSIDE) {
acdbGetObjectId(id, ent.name);
break;
}
}
OPENOBJ_END();
}
}
return id;
}
}
//***************************************************************************************************
// 纵断面图
//***************************************************************************************************
// cet 2013.3.1 add 获得池子名
CString GetPoolName(const AcDbObjectId &id)
{
CString sName;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPool, pPool);
if (pPool != NULL)
{
sName = pPool->GetLabel();
}
OPENOBJ_END();
return sName;
}
void InsertOtherWellSheet(AcDbObjectId idSheet, DList<TWellData> &lstWellSys)
{
OPENOBJ_BEGIN(idSheet, AcDb::kForWrite, CDbSheet, pSheet);
if (pSheet) {
int nRowAll, nColAll;
CString csText;
nRowAll = pSheet->GetRowNum();
nColAll = pSheet->GetColumnNum();
pSheet->AddRowAt(nRowAll);
GridCell &cell59 = *(*pSheet)(nRowAll - 1, 0);
CString csIdx = cell59.GetText();
int idx2 = _ttoi(csIdx);
int idx = nRowAll + 1;
for (int i = 0; i < lstWellSys.Length() - 1; i++) {
if (i % 2 == 0) {
nRowAll = pSheet->GetRowNum();
pSheet->AddRowAt(nRowAll);
}
else if ((i + 1) % 2 == 0) {
GridCell &cell50 = *(*pSheet)(idx, 0);
cell50.SetText(XString(_T("%d"), ++idx2));
idx++;
}
if (lstWellSys[i]->m_bIsWell) { //井
double nEle = lstWellSys[i]->m_nUpEle;
double nDeep = lstWellSys[i]->m_nDeep;
double nDownEle = lstWellSys[i]->m_nDownEle;
CString csWellUpEle, csDeep, csDownEle, csWellUpEle2, csDeep2, csDownEle2;
csDeep.Format(_T("%.2f"), nDeep);
csDownEle.Format(_T("%.2f"), nDownEle);
csWellUpEle.Format(_T("%.3f"), nEle);
nEle = lstWellSys[i + 2]->m_nUpEle;
nDeep = lstWellSys[i + 2]->m_nDeep;
nDownEle = lstWellSys[i + 2]->m_nDownEle;
csDeep2.Format(_T("%.2f"), nDeep);
csDownEle2.Format(_T("%.2f"), nDownEle);
csWellUpEle2.Format(_T("%.3f"), nEle);
GridCell &cell31 = *(*pSheet)(idx, 1);
cell31.SetText(lstWellSys[i]->m_csName);
GridCell &cell32 = *(*pSheet)(idx, 7);
cell32.SetText(csWellUpEle);
GridCell &cell33 = *(*pSheet)(idx, 11);
cell33.SetText(csDeep);
GridCell &cell34 = *(*pSheet)(idx, 9);
cell34.SetText(csDownEle);
GridCell &cell51 = *(*pSheet)(idx, 2);
cell51.SetText(lstWellSys[i + 2]->m_csName);
GridCell &cell52 = *(*pSheet)(idx, 8);
cell52.SetText(csWellUpEle2);
GridCell &cell53 = *(*pSheet)(idx, 12);
cell53.SetText(csDeep2);
GridCell &cell54 = *(*pSheet)(idx, 10);
cell54.SetText(csDownEle2);
if (lstWellSys[i + 2]->m_bIsDropWell) {
GridCell &cell55 = *(*pSheet)(idx, 13);
cell55.SetText(_T("跌水"));
}
}
else { //管
int iDn = lstWellSys[i]->m_iDn;
CString csDn, csPipeLen, csI, csI2;
csDn.Format(_T("%d"), iDn);
csI2.Format(_T("%.3f"), lstWellSys[i]->m_nI * lstWellSys[i]->m_nLength);
int iTmpI = (int)(lstWellSys[i]->m_nI * 1000);
if (lstWellSys[i]->m_nI * 1000 > iTmpI)
csI.Format(_T("%.4f"), lstWellSys[i]->m_nI);
else
csI.Format(_T("%.3f"), lstWellSys[i]->m_nI);
csPipeLen.Format(_T("%.2f"), lstWellSys[i]->m_nLength);
GridCell &cell61 = *(*pSheet)(idx - 1, 3);
cell61.SetText(csDn);
GridCell &cell62 = *(*pSheet)(idx - 1, 4);
cell62.SetText(csPipeLen);
GridCell &cell63 = *(*pSheet)(idx - 1, 5);
cell63.SetText(csI);
GridCell &cell64 = *(*pSheet)(idx - 1, 6);
cell64.SetText(csI2);
}
}
}
OPENOBJ_END();
}
//绘制高程表
void InsertWellCalcSheet(DList<TWellData> &lstWellSys)
{
XPoint pt;
int ret = XGetPoint(NULL, _T("点取高程表位置\n"), pt);
if (ret != RTNORM) {
return;
}
AcDbObjectId idSheet = NULL;
idSheet = GetHitSheet(pt);
BOOL bContinue = FALSE;
if (idSheet != NULL) {
OPENOBJ_BEGIN(idSheet, AcDb::kForRead, CDbSheet, pSheet);
if (pSheet) {
int nRowAll, nColAll;
CString csText;
nRowAll = pSheet->GetRowNum();
nColAll = pSheet->GetColumnNum();
SheetTitle &title = pSheet->GetTitle();
csText = title.GetText();
if (csText == _T("高程表") && nColAll == 14)
bContinue = TRUE;
}
OPENOBJ_END();
}
if (bContinue) {
InsertOtherWellSheet(idSheet, lstWellSys);
return;
}
AcDbObjectId idTextStyle = GlobalFunc::InitTwtTextStyle(g_Option::instance().g_csSheetStyle);
CDbSheet *pSheet = new CDbSheet;
pSheet->SetRotation(GlobalFunc::Ucs2Wcs(0.0));//add by sr
GridStyle gridStyle;
gridStyle.SetOverrideAll(TRUE);
gridStyle.SetTextHeight(g_Option::instance().g_nSheetHeight);
gridStyle.SetTextStyleId(idTextStyle);
SheetTitle &title = pSheet->GetTitle();
title.GetGridStyle().SetTextHeight(7.0);//设置标题文字高度 zxl 2011.11.29 add
title.SetHeight(7.0);
title.SetText(_T("高程表"));
DividerStyle &style = title.GetDividerStyle();
style.SetDividerFlag(DividerStyle::kNone);
gridStyle.SetHorMode(AcDb::kTextCenter);
gridStyle.SetVerMode(AcDb::kTextVertMid);
gridStyle.SetLineSpaceFactor(0.2);
gridStyle.SetTextWrap(FALSE);
pSheet->SetGridStyle(gridStyle);
pSheet->SetRowHeight(g_Option::instance().g_nSheetHeight + 2);
int rows = lstWellSys.Length() / 2 + 2;
if (!lstWellSys[lstWellSys.Length() - 1]->m_bIsWell)
rows--;
pSheet->InitSheet(rows, 14, g_Option::instance().g_nSheetHeight + 2, 50);
//zxl 0.11.11.25 add 设置外框线宽为中宽
DividerStyle &styleBorder = pSheet->GetBorderStyle();
styleBorder.SetLineWidth(0.2);
SheetRow *pRow = pSheet->GetRow(1);
if (pRow != NULL)
{
DividerStyle &styleRow = pRow->GetDividerStyle();
styleRow.SetLineWidth(0.2);
styleRow.SetDividerFlag(DividerStyle::kLocal);
}
SheetColumn column;
column.SetWidth(12);
pSheet->SetColumnAt(0, column);
GridCell &cell = *(*pSheet)(0, 0);
cell.SetText(_T("序号"));
column.SetWidth(15);
pSheet->SetColumnAt(1, column);
GridCell &cell2 = *(*pSheet)(0, 1);
cell2.SetText(_T("管段井号"));
column.SetWidth(15);
pSheet->SetColumnAt(2, column);
GridCell &cell3 = *(*pSheet)(0, 2);
cell3.SetText(_T("管段井号"));
pSheet->MergeCells(0, 1, 0, 2);
column.SetWidth(15);
pSheet->SetColumnAt(3, column);
GridCell &cell4 = *(*pSheet)(0, 3);
cell4.SetText(_T("管径(mm)"));
column.SetWidth(15);
pSheet->SetColumnAt(4, column);
GridCell &cell5 = *(*pSheet)(0, 4);
cell5.SetText(_T("管长(m)"));
column.SetWidth(15);
pSheet->SetColumnAt(5, column);
GridCell &cell6 = *(*pSheet)(0, 5);
cell6.SetText(_T("坡度"));
column.SetWidth(15);
pSheet->SetColumnAt(6, column);
GridCell &cell7 = *(*pSheet)(0, 6);
cell7.SetText(_T("管底坡降"));
column.SetWidth(15);
pSheet->SetColumnAt(7, column);
GridCell &cell8 = *(*pSheet)(0, 7);
cell8.SetText(_T("设计地面标高(m)"));
column.SetWidth(15);
pSheet->SetColumnAt(8, column);
GridCell &cell9 = *(*pSheet)(0, 8);
cell9.SetText(_T("设计地面标高(m)"));
pSheet->MergeCells(0, 7, 0, 8);
column.SetWidth(15);
pSheet->SetColumnAt(9, column);
GridCell &cell10 = *(*pSheet)(0, 9);
cell10.SetText(_T("管内底标高(m)"));
column.SetWidth(15);
pSheet->SetColumnAt(10, column);
GridCell &cell11 = *(*pSheet)(0, 10);
cell11.SetText(_T("管内底标高(m)"));
pSheet->MergeCells(0, 9, 0, 10);
column.SetWidth(15);
pSheet->SetColumnAt(11, column);
GridCell &cell12 = *(*pSheet)(0, 11);
cell12.SetText(_T("埋深(m)"));
column.SetWidth(15);
pSheet->SetColumnAt(12, column);
GridCell &cell13 = *(*pSheet)(0, 12);
cell13.SetText(_T("埋深(m)"));
pSheet->MergeCells(0, 11, 0, 12);
column.SetWidth(30);
pSheet->SetColumnAt(13, column);
GridCell &cell14 = *(*pSheet)(0, 13);
cell14.SetText(_T("备注"));
pSheet->MergeCells(0, 0, 1, 0);
GridCell &cell15 = *(*pSheet)(1, 1);
cell15.SetText(_T("起始"));
GridCell &cell16 = *(*pSheet)(1, 2);
cell16.SetText(_T("终止"));
pSheet->MergeCells(0, 3, 1, 3);
pSheet->MergeCells(0, 4, 1, 4);
pSheet->MergeCells(0, 5, 1, 5);
pSheet->MergeCells(0, 6, 1, 6);
pSheet->MergeCells(0, 13, 1, 13);
GridCell &cell17 = *(*pSheet)(1, 7);
cell17.SetText(_T("起始"));
GridCell &cell18 = *(*pSheet)(1, 8);
cell18.SetText(_T("终止"));
GridCell &cell19 = *(*pSheet)(1, 9);
cell19.SetText(_T("起始"));
GridCell &cell20 = *(*pSheet)(1, 10);
cell20.SetText(_T("终止"));
GridCell &cell21 = *(*pSheet)(1, 11);
cell21.SetText(_T("起始"));
GridCell &cell22 = *(*pSheet)(1, 12);
cell22.SetText(_T("终止"));
int idx = 2;
for (int i = 0; i < lstWellSys.Length() - 1; i++) {
if ((i + 1) % 2 == 0) {
GridCell &cell50 = *(*pSheet)(idx, 0);
cell50.SetText(XString(_T("%d"), idx - 2));
idx++;
}
if (lstWellSys[i]->m_bIsWell) { //井
if (i == lstWellSys.Length() - 2)
break;
CString csName1 = lstWellSys[i]->m_csName;
CString csName2 = lstWellSys[i + 2]->m_csName;
// cet 2013.3.1 modify 读取池的实际名称
// if(csName2 == _T("HC"))
// csName2 = _T("HC进");
// if(csName1 == _T("HC"))
// csName1 = _T("HC出");
if (csName2 == _T("HC"))
csName2 = GetPoolName(lstWellSys[i + 2]->m_ID) + _T("进");
if (csName1 == _T("HC"))
csName1 = GetPoolName(lstWellSys[i]->m_ID) + _T("出");
double nEle = lstWellSys[i]->m_nUpEle;
double nDeep = lstWellSys[i]->m_nDeep;
double nDownEle = lstWellSys[i]->m_nDownEle;
CString csWellUpEle, csDeep, csDownEle, csWellUpEle2, csDeep2, csDownEle2;
// csDeep.Format(_T("%.3f"), nDeep);
csDeep = GlobalFunc::GetDimWellDeep(nDeep);
//csDownEle.Format(_T("%.3f"), nDownEle);
csDownEle = GlobalFunc::GetDimWellDeep(nDownEle);
csWellUpEle = GlobalFunc::GetDimWellDeep(nEle);
// csWellUpEle.Format(_T("%.3f"), nEle);
nEle = lstWellSys[i + 2]->m_nUpEle;
nDeep = lstWellSys[i + 2]->m_nDeep;
nDownEle = lstWellSys[i + 2]->m_nFrondDownEle;
// csDeep2.Format(_T("%.3f"), nEle-nDownEle);
// csDownEle2.Format(_T("%.3f"), nDownEle);
// csWellUpEle2.Format(_T("%.3f"), nEle);
csDeep2 = GlobalFunc::GetDimWellDeep(nEle - nDownEle);
csDownEle2 = GlobalFunc::GetDimWellDeep(nDownEle);
csWellUpEle2 = GlobalFunc::GetDimWellDeep(nEle);
GridCell &cell31 = *(*pSheet)(idx, 1);
cell31.SetText(csName1);
GridCell &cell32 = *(*pSheet)(idx, 7);
cell32.SetText(csWellUpEle);
GridCell &cell33 = *(*pSheet)(idx, 11);
cell33.SetText(csDeep);
GridCell &cell34 = *(*pSheet)(idx, 9);
cell34.SetText(csDownEle);
GridCell &cell51 = *(*pSheet)(idx, 2);
cell51.SetText(csName2);
GridCell &cell52 = *(*pSheet)(idx, 8);
cell52.SetText(csWellUpEle2);
GridCell &cell53 = *(*pSheet)(idx, 12);
cell53.SetText(csDeep2);
GridCell &cell54 = *(*pSheet)(idx, 10);
cell54.SetText(csDownEle2);
if (lstWellSys[i + 2]->m_bIsDropWell) {
GridCell &cell55 = *(*pSheet)(idx, 13);
// 跌水0.000时,不显示跌水值 zxl 2011.11.16 add
double dDropHeight = nDeep - (nEle - nDownEle);
if (fabs(dDropHeight - 0.0) < 0.001)
{
continue;
}
cell55.SetText(XString(_T("跌水%.3f"), nDeep - (nEle - nDownEle)));
}
}
else { //管
CString csDnType;
OPENOBJ_BEGIN(lstWellSys[i]->m_ID, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe) {
CString csMat = GlobalFunc::GetPipeMaterialByIdx(pPipe->GetMaterial());
csDnType = GlobalFunc::GetDnByMat(csMat); // 2009-9-16 增加DN
}
OPENOBJ_END();
int iDn = lstWellSys[i]->m_iDn;
CString csDn, csPipeLen, csI, csI2;
csDn.Format(_T("%s%d"), csDnType, iDn);
csI2.Format(_T("%.3f"), lstWellSys[i]->m_nI * lstWellSys[i]->m_nLength);
int iTmpI = (int)(lstWellSys[i]->m_nI * 1000);
double nTmpI = iTmpI + 0.01;
if (lstWellSys[i]->m_nI * 1000 > nTmpI)
csI.Format(_T("%.4f"), lstWellSys[i]->m_nI);
else
csI.Format(_T("%.3f"), lstWellSys[i]->m_nI);
//csPipeLen.Format(_T("%.2f"), lstWellSys[i]->m_nLength);
csPipeLen = GlobalFunc::GetDimPipeLen(lstWellSys[i]->m_nLength);
GridCell &cell61 = *(*pSheet)(idx - 1, 3);
cell61.SetText(csDn);
GridCell &cell62 = *(*pSheet)(idx - 1, 4);
cell62.SetText(csPipeLen);
GridCell &cell63 = *(*pSheet)(idx - 1, 5);
cell63.SetText(csI);
GridCell &cell64 = *(*pSheet)(idx - 1, 6);
cell64.SetText(csI2);
}
}
pSheet->SetLocation(GlobalFunc::Ucs2Wcs(pt));
//pSheet->AddToCSpace(TRUE);
GlobalFunc::AddToCurrentSpace(pSheet, TRUE);
}
//绘制纵断面图
//void DrawVerticalSection(DList<TWellData> &lstWellSys, int iScaleX, int iScaleY, double nGridScale, int iMode, double nDeepStart) cet 2011.6.3 modify 添加控制是否显示碰撞标高
//void DrawVerticalSection(DList<TWellData> &lstWellSys, int iScaleX, int iScaleY, double nGridScale, int iMode, double nDeepStart, bool bDimEle) // cet 2011.12.5 modify 添加控制交叉管是否显示
//void DrawVerticalSection(DList<TWellData> &lstWellSys, int iScaleX, int iScaleY, double nGridScale, int iMode, double nDeepStart, bool bDimEle, const std::map<TPipeSys::SysType,bool> &data)// zxl 2013.12.10 modify
void DrawVerticalSection(DList<TWellData> &lstWellSys, int iScaleX, int iScaleY, double nGridScale, int iMode, double nDeepStart, bool bDimEle, bool bDimDist, const std::map<TPipeSys::SysType, bool> &data)
{
InitLayer(_T("0"));
GlobalFunc::PushVarStr clayer(_T("CLAYER"), _T("0"));
XPoint ptIns, ptStart, ptEnd;
xg_getvar(_T("VIEWCTR"), ptIns);
ptIns = GlobalFunc::Ucs2Wcs(ptIns);
PickSet ssDraw(SS_FREE);
ssDraw.IncludeBegin();
CDbVerticalSection *pSect = new CDbVerticalSection;
pSect->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
pSect->SetInsert(ptIns);
pSect->SetGridScale(nGridScale);
pSect->SetScaleX(iScaleX);
pSect->SetScaleY(iScaleY);
pSect->SetDimEle(bDimEle);
pSect->SetDimDist(bDimDist);
// cet 2011.12.5 add 控制交叉管显示
std::map<TPipeSys::SysType, bool>::const_iterator it;
for (it = data.begin(); it != data.end(); it++)
{
pSect->SetShowCrossPipe(it->first, it->second);
}
pSect->SetCalcMode(iMode);
pSect->SetTextHeight(g_Option::instance().g_nTwtDimHeight);
pSect->SetTextStyleId(GlobalFunc::InitTwtTextStyle(g_Option::instance().g_csTwtDimStyle));
pSect->SetDoteLayer(InitDoteLayer(LAY_TWT_DOTE));
pSect->SetWellDatas(lstWellSys);
pSect->setColor(AcCmColor()); //随层
pSect->SetStartDeep(nDeepStart);
pSect->SetTextLayer(InitLayer(LAY_TEXT));
pSect->SetGridLayer(GlobalFunc::InitGridLayer(LAY_TWT_GRID));
pSect->SetSectLayer(InitLayer(LAY_TWT_SECTION));
if (iMode == 3) //给水系统
pSect->SetSheetHead(g_Option::instance().g_csVerticalSectionHeadFeed);
else
pSect->SetSheetHead(g_Option::instance().g_csVerticalSectionHead);
pSect->Calc();
double nHighEle = pSect->GetMaxDeep();
double nLowEle = pSect->GetMinDeep();
AcDbObjectId id = GlobalFunc::AddToCurrentSpace(pSect, Adesk::kTrue);
ssDraw.IncludeEnd();
ssDraw.Redraw(2);
ptIns = GlobalFunc::Wcs2Ucs(ptIns);
actrTransactionManager->flushGraphics(); //acad 刷新
XPoint xp;
if (GlobalFunc::DragMovePickSet(ssDraw, _T("\n请点取纵断面图位置<退出>: "), ptIns, xp) != RTNORM)
ssDraw.Erase();
}
//绘制给水纵断面图
void DrawVerticalSectionFeed(DList<TFeedWellData> &lstWellSys, int iScaleX, int iScaleY, double nGridScale, double nDeepStart, bool bDimEle, bool bDimDist, const std::map<TPipeSys::SysType, bool> &data)
{
InitLayer(_T("0"));
GlobalFunc::PushVarStr clayer(_T("CLAYER"), _T("0"));
XPoint ptIns, ptStart, ptEnd;
xg_getvar(_T("VIEWCTR"), ptIns);
ptIns = GlobalFunc::Ucs2Wcs(ptIns);
PickSet ssDraw(SS_FREE);
ssDraw.IncludeBegin();
CDbVerticalSectionFeed *pSect = new CDbVerticalSectionFeed;
pSect->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
pSect->SetInsert(ptIns);
pSect->SetGridScale(nGridScale);
pSect->SetScaleX(iScaleX);
pSect->SetScaleY(iScaleY);
// zxl 2013.12.5 add 控制交叉管显示
pSect->SetDimEle(bDimEle);
pSect->SetDimDist(bDimDist);
std::map<TPipeSys::SysType, bool>::const_iterator it;
for (it = data.begin(); it != data.end(); it++)
{
pSect->SetShowCrossPipe(it->first, it->second);
}
pSect->SetCalcMode(0);
pSect->SetTextHeight(g_Option::instance().g_nTwtDimHeight);
pSect->SetTextStyleId(GlobalFunc::InitTwtTextStyle(g_Option::instance().g_csTwtDimStyle));
pSect->SetDoteLayer(InitDoteLayer(LAY_TWT_DOTE));
pSect->SetWellDatas(lstWellSys);
pSect->setColor(AcCmColor()); //随层
pSect->SetStartDeep(nDeepStart);
pSect->SetTextLayer(InitLayer(LAY_TEXT));
pSect->SetGridLayer(GlobalFunc::InitGridLayer(LAY_TWT_GRID));
pSect->SetSectLayer(InitLayer(LAY_TWT_SECTION));
pSect->SetSheetHead(g_Option::instance().g_csVerticalSectionHeadFeed);
pSect->Calc();
double nHighEle = pSect->GetMaxDeep();
double nLowEle = pSect->GetMinDeep();
AcDbObjectId id = GlobalFunc::AddToCurrentSpace(pSect, Adesk::kTrue);
ssDraw.IncludeEnd();
ssDraw.Redraw(2);
ptIns = GlobalFunc::Wcs2Ucs(ptIns);
actrTransactionManager->flushGraphics(); //acad 刷新
XPoint xp;
if (GlobalFunc::DragMovePickSet(ssDraw, _T("\n请点取纵断面图位置<退出>: "), ptIns, xp) != RTNORM)
ssDraw.Erase();
}
// cet 2012.7.24 add 管网是否已经计算过
bool IsCalced(SSearchPipeList *pList, bool bFromImport = true)
{
std::stack<SSearchPipeList*> stackItem;
stackItem.push(pList);
SSearchPipeList *pLstTemp = NULL;
double dGradient = 0.0; // 坡度
XPoint ptS, ptE, ptFront;
while (!stackItem.empty())
{
pLstTemp = stackItem.top();
stackItem.pop();
if (pLstTemp->m_iType == 0)
{
OPENOBJ_BEGIN(pLstTemp->m_ID, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe != NULL)
{
dGradient = pPipe->GetPipeGradient();
ptS = pPipe->StartPoint();
ptE = pPipe->EndPoint();
TPipeSys::FlowDirection flowDir = pPipe->GetFlowDir();
// 流向
if (pLstTemp->m_pPrevious != NULL)
{
OPENOBJ_BEGIN(pLstTemp->m_pPrevious->m_ID, AcDb::kForRead, CDbPipeNode, pNode);
if (pNode != NULL)
{
ptFront = pNode->GetLocation();
CDbPool *pPool = CDbPool::cast(pNode);
if (pPool != NULL)
{
int nNum = pPool->GetInterfaceNum();
for (int i = 0; i < nNum; i++)
{
const CPipeInterface &face = pPool->GetInterface(i);
if (face.m_idPipe == pLstTemp->m_ID)
{
ptFront = face.m_ptLocation;
break;
}
}
}
}
OPENOBJ_END();
if (ptFront.Distance2d(ptS) < 0.001)
{
if (bFromImport && (flowDir == TPipeSys::kFromEnd)
|| !bFromImport && (flowDir == TPipeSys::kFromStart))
{
return false;
}
}
else if (ptFront.Distance2d(ptE) < 0.001)
{
if (bFromImport && (flowDir == TPipeSys::kFromStart)
|| !bFromImport && (flowDir == TPipeSys::kFromEnd))
{
return false;
}
}
}
// 管道坡度为零或起始点标高相等视为未计算过
if (fabs(dGradient) < 1e-6 || fabs(ptS.z - ptE.z) < 0.0001)
{
return false;
}
}
OPENOBJ_END();
}
for (int i = 0; i < pLstTemp->m_lstNode.Length(); i++)
{
stackItem.push(pLstTemp->m_lstNode[i]);
}
}
return true;
}
// 内径改为工程直径,和图面赋值保持一致 zxl 2013.10.12 modify
// cet 2012.7.26 add 管内底标高
double GetPipeDownEle(const AcDbObjectId &idPipe, const AcDbObjectId &idWell)
{
// 获得与管道相连的点
XPoint ptWell;
AcDbEntity *pEnt = NULL;
acdbOpenObject(pEnt, idWell, AcDb::kForRead);
if (pEnt != NULL)
{
AecXDbWell *pWell = AecXDbWell::cast(pEnt);
CDbPool *pPool = CDbPool::cast(pEnt);
if (pWell != NULL)
{
ptWell = pWell->GetLocation();
}
else if (pPool != NULL)
{
int nNum = pPool->GetInterfaceNum();
for (int i = 0; i < nNum; i++)
{
const CPipeInterface &face = pPool->GetInterface(i);
if (face.m_idPipe == idPipe)
{
ptWell = face.m_ptLocation;
break;
}
}
}
pEnt->close();
}
double dEle = 0.0;
OPENOBJ_BEGIN(idPipe, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe != NULL)
{
// 内径改为工程直径,和图面赋值保持一致 zxl 2013.10.12 modify
//CString sMaterial = GlobalFunc::GetPipeMaterialByIdx(pPipe->GetMaterial());
//double dDn = pPipe->GetDnDiameter();
//double dRadius = GetPipeDjByDn(sMaterial, static_cast<int>(dDn)) * 0.5;
double dUnit = 1.0;
if (!GlobalFunc::DocGetMeterUnitDraw())
{
dUnit = 0.001;
}
double dDn = pPipe->GetDnDiameter();
double dRadius = dDn * 0.001 * 0.5;
XPoint ptS = pPipe->StartPoint();
XPoint ptE = pPipe->EndPoint();
if (ptS.Distance2d(ptWell) < 0.001)
{
dEle = ptS.z * dUnit - dRadius;
}
else if (ptE.Distance2d(ptWell) < 0.001)
{
dEle = ptE.z * dUnit - dRadius;
}
}
OPENOBJ_END();
return dEle;
}
//把树结构的数据转化为DLIST链表结构
BOOL GetWellListData2(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, CDbPipe, pPipe);
if (pPipe) {
CString csMat = GlobalFunc::GetPipeMaterialByIdx(pPipe->GetMaterial());
double nDnOut = GlobalFunc::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 = GlobalFunc::ReadXdata(ent, _T("TG-WELL-RADIUS"));
CString csGroundEle = GlobalFunc::ReadXdata(ent, _T("TG-WELL-GroundEle"));
BOOL bIsRectWell = FALSE;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
AcDbObjectId idRec = pEquip->GetBlock2d();
if (_tcsicmp(GlobalFunc::GetBlkNameById(idRec), _T("$TwtSys$00000336")) == 0)
bIsRectWell = TRUE;
}
OPENOBJ_END();
pList->m_nGroundEle = _tstof(csGroundEle);
pList->m_nWellRadius = _tstof(csWellRadius) / 2.0; //转化为半径
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;
//如果接化粪池,管线长度要减去化粪池遮挡的部分
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];
if (pListPrevious != NULL && pListPrevious->m_iType == 4) //4:化粪池
bFlag = TRUE;
}
if (bFlag) {
AcDbObjectId id = pListPrevious->m_ID;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPool, pEquip);
if (pEquip) {
double nXScale = pEquip->GetSizeX();
if (!GlobalFunc::DocGetMeterUnitDraw())
nXScale = nXScale / 2000;
else
nXScale = nXScale / 2.0;
pListAll->m_nSpare = pListAll->m_nLength + nXScale;//管长=对象长-池长度/2
// pListAll->m_nLength = pListAll->m_nLength - nXScale/2000;//管长=对象长-池长度/2
}
OPENOBJ_END();
}
}
pList->m_csName = pListAll->m_csName;
pList->m_ID = pListAll->m_ID;
pList->m_nI = pListAll->m_nI;
pList->m_nUpEle = pListAll->m_nDang; //井地面标高
// cet 2012.7.26 add 化粪池地面标高
if (pListAll->m_iType == 4)
{
CDbPool *pPool = NULL;
acdbOpenObject(pPool, pListAll->m_ID, AcDb::kForRead);
if (pPool != NULL)
{
pList->m_nUpEle = pPool->GetGroundEle();
pPool->close();
}
}
pList->m_nDownEle = pListAll->m_nStartPress; //跌水井底标高
pList->m_nLength = pListAll->m_nLength;
pList->m_dRealLength = pListAll->m_nSpare; //真实管长用m_nSpare存放
// if(!GlobalFunc::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 = GetWellListData2(pList, lstWellSys);
}
return bRet;
}
// cet 2012.7.24 add 读取已计算管网信息
void GetCalcedWellListData(SSearchPipeList *pListAll, DList<TWellData> &lstWellSys, int nMode)
{
if (!GetWellListData2(pListAll, lstWellSys))
{
return;
}
double dDeepStart = 0.0;
double dPipeLen(0), dI(0), dFrontPipeEle(0);
double dEleStart = 0.0;
XPoint ptWell;
for (int i = 0; i < lstWellSys.Length(); i++)
{
if (lstWellSys[i]->m_bIsWell) // 井
{
AcDbObjectId id = lstWellSys[i]->m_ID;
if (dPipeLen > 0)
{
if (i != lstWellSys.Length() - 1)
{
lstWellSys[i]->m_nDownEle = GetPipeDownEle(lstWellSys[i + 1]->m_ID, id);
}
if (i != 0)
{
lstWellSys[i]->m_nFrondDownEle = GetPipeDownEle(lstWellSys[i - 1]->m_ID, id);
}
double dWellEle = lstWellSys[i]->m_nUpEle;
double dWellDownEle = lstWellSys[i]->m_nDownEle;
double dWellDeep = dWellEle - dWellDownEle; // 埋深 地面-井底
if (lstWellSys[i]->m_bIsDropWell)
{
dDeepStart = lstWellSys[i]->m_nDownEle;
}
else
{
double dRadiusFront(0), dRadiusBack(0);
if (i != 0)
{
dRadiusFront = lstWellSys[i - 1]->m_iDn;
}
if (i != lstWellSys.Length() - 1)
{
dRadiusBack = lstWellSys[i + 1]->m_iDn;
}
// 得到外径
double dDifference(0);
if (dRadiusFront > 0 && dRadiusBack > 0) // 井前后管径差
{
dDifference = (dRadiusBack - dRadiusFront) / 1000;
}
if (nMode == 0) // 管顶平接
dDeepStart = dDeepStart - dI * dPipeLen - dDifference;
else if (nMode == 1) // 管底平接
dDeepStart = dDeepStart - dI * dPipeLen;
else if (nMode == 2 || nMode == 3) // 水面平接
dDeepStart = dDeepStart - dI * dPipeLen - dDifference / 2;
if (lstWellSys[i]->m_csName == _T("HC"))
{
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPool, pEquip);
if (pEquip)
{
if (pEquip->GetSpare() > 0.01)
dDeepStart -= pEquip->GetSpare();
else
dDeepStart -= 0.1; // 化粪池
}
OPENOBJ_END();
}
}
dWellDeep = dWellEle - dDeepStart;
lstWellSys[i]->m_nDeep = dWellDeep;
}
if (i == 0)
{
lstWellSys[i]->m_nDownEle = GetPipeDownEle(lstWellSys[i + 1]->m_ID, id);
lstWellSys[i]->m_nDeep = lstWellSys[i]->m_nUpEle - lstWellSys[i]->m_nDownEle;
dDeepStart = lstWellSys[i]->m_nDownEle;
}
}
else if (!lstWellSys[i]->m_bIsWell) // 管
{
dPipeLen = lstWellSys[i]->m_nLength;
dI = lstWellSys[i]->m_nI;
}
}
}
//重新确定水流方向, 链表第一个点为水入口 cet 2012.7.26 add
void ResetPipeDirFromImport(SSearchPipeList *pListAll)
{
if (pListAll == NULL)
{
return;
}
long len = pListAll->m_lstNode.Length();
if (pListAll->m_iType == 0)
{
XPoint ptFront;
if (pListAll->m_pPrevious != NULL)
{
OPENOBJ_BEGIN(pListAll->m_pPrevious->m_ID, AcDb::kForRead, CDbPipeNode, pNode);
if (pNode != NULL)
{
ptFront = pNode->GetLocation();
CDbPool *pPool = CDbPool::cast(pNode);
if (pPool != NULL)
{
int nNum = pPool->GetInterfaceNum();
for (int i = 0; i < nNum; i++)
{
const CPipeInterface &face = pPool->GetInterface(i);
if (face.m_idPipe == pListAll->m_ID)
{
ptFront = face.m_ptLocation;
break;
}
}
}
}
OPENOBJ_END();
}
OPENOBJ_BEGIN(pListAll->m_ID, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe && !!ptFront)
{
XPoint p1 = ptFront;
p1.z = 0;
XPoint p2 = pPipe->StartPoint();
p2.z = 0;
if (pPipe->IsVertical())
{
if (pPipe->StartPoint().z > pPipe->EndPoint().z)
{
pPipe->SetFlowDir(TPipeSys::kFromEnd);
}
else
{
pPipe->SetFlowDir(TPipeSys::kFromStart);
}
}
else 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];
ResetPipeDirFromImport(pList);
}
}
//纵断面图主函数
void VerticalSection()
{
Entity entStartWell, entEndWell;
RBList rbMask(RTDXF0, _T("AEC_ZT_WELL"), NULL);
RBList rbMaskDim(RTDXF0, _T("AEC_ZT_WELLDIM"), NULL);
if (GlobalFunc::SelectEntity(_T("\n请选择起点井:<退出>"), entStartWell, rbMask) != RTNORM)
return;
TCHAR szLay[256];
entStartWell.GetData(8, szLay);
if (_tcsicmp(szLay, LAY_WELL_FEED) == 0)
{
//VerticalSectionFeed(entStartWell);
return;
}
GlobalFunc::SelectEntity(_T("\n请选择终止井:<自动搜索>"), entEndWell, rbMask);
SSearchPipeList *pListAll = new SSearchPipeList();
PickSet ssAll(SS_FREE);
ssAll += entStartWell;
//if (!SearchOutdoorWell(entStartWell, entEndWell, pListAll, ssAll, FALSE)) {
// g_Option::instance().adsout << _T("起点井和终止井没有正确相连\n");
// ssAll.Redraw(3);
// delete pListAll;
// return;
//}
if (ssAll.Length() < 3) {
AfxMessageBox(_T("系统数据不全, 请检查管线是否标注管径, 管线流动方向是否不一致!"));
delete pListAll;
return;
}
actrTransactionManager->flushGraphics(); //acad 刷新
ssAll.Redraw(3);
/* cet 2012.7.24 modify 根据管网是否已经计算过加以区分
long len = ssAll.Length();
TCHAR szTmp[256];
int rett = ads_getstring(NULL, _T("\n需要计算的管网系统已高亮显示:<计算>"), szTmp);
if(rett == RTCAN){
ssAll.Redraw(4);
delete pListAll;
return;
}
double nDeepStart(0.8);
CTemporaryResourceOverride vTemp;
CWellCalcSettingDlg dlg(0);
if(_tcsicmp(szLay, LAY_WELL_FEED) == 0)
dlg.m_iMode = 3;
GetWellListData(pListAll, dlg.m_lstWellSys);
*/
CTemporaryResourceOverride vTemp;
CWellCalcSettingDlg dlg(0);
dlg.SetListAll(pListAll);
if (_tcsicmp(szLay, LAY_WELL_FEED) == 0)
dlg.m_iMode = 3;
if (IsCalced(pListAll)) // 计算过
{
TCHAR szTmp[256];
int nRet = 0;
INITGET_BEG(0, _T("A"));
nRet = ads_getkword(_T("\n需要计算的管网系统已高亮显示[读取已经算信息(A)]<重新计算>:"), szTmp);
INITGET_END();
if (nRet == RTNONE)
{
GetWellListData2(pListAll, dlg.m_lstWellSys);
}
else if (nRet == RTNORM)
{
GetCalcedWellListData(pListAll, dlg.m_lstWellSys, dlg.m_iMode);
// 计算过的管网可直接进行图面赋值,高程表,纵断面
dlg.m_bCalc = TRUE;
}
else if (nRet == RTCAN)
{
ssAll.Redraw(4);
delete pListAll;
return;
}
}
else // 未计算
{
TCHAR szTmp[256];
int nRet = ads_getstring(NULL, _T("\n需要计算的管网系统已高亮显示:<计算>"), szTmp);
if (nRet == RTCAN)
{
ssAll.Redraw(4);
delete pListAll;
return;
}
GetWellListData2(pListAll, dlg.m_lstWellSys);
}
dlg.m_ssAll += ssAll;
XPoint ptLow3, ptUp3;
ssAll.GetExtend(ptLow3, ptUp3);
GlobalFunc::AssureInCurrentView_New(ptLow3, ptUp3);
if (dlg.DoModal() != IDOK) {
delete pListAll; //删除链头
ssAll.Redraw(4);
return;
}
delete pListAll; //删除链头
ssAll.Redraw(4);
return;
}
//***************************************************************************************************
// 编辑纵断
//***************************************************************************************************
//extern int EditVerticalSectionFeed(AcDbObjectId id);
int EditVerticalSection(AcDbObjectId id)
{
if (!id)
return RTERROR;
CTemporaryResourceOverride vTemp;
CWellCalcSettingDlg dlg(1);
// cet 2011.12.5 add
std::map<TPipeSys::SysType, bool> data;
data[TPipeSys::kFeedWater] = false;
data[TPipeSys::kDirtWater] = false;
data[TPipeSys::kUselessWater] = false;
data[TPipeSys::kRainWater] = false;
data[TPipeSys::kUsedWater] = false;
data[TPipeSys::kFireFighting] = false;
data[TPipeSys::kOther] = false;
// cet 2012.1.30 add 设置当前对话框为编辑纵断面图状态
dlg.EditVerticalSection(TRUE);
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbVerticalSection, pVS);
if (pVS) {
dlg.m_csSheetHead = pVS->GetSheetHead();
pVS->GetWellDatas(dlg.m_lstWellSys);
// dlg.m_dDeep = pVS->GetStartDeep();
dlg.m_csDeep.Format(_T("%.3f"), pVS->GetStartDeep());
dlg.m_iX = pVS->GetScaleX();
dlg.m_iY = pVS->GetScaleY();
int iMode = pVS->GetCalcMode();
if (iMode >= 100) {
iMode -= 100;
dlg.m_bFromRight = TRUE;
}
dlg.m_iMode = iMode;
dlg.m_bDimEle = pVS->IsDimEle(); // cet 2011.6.3 add
dlg.m_bDimDist = pVS->IsDimDist();// zxl 2013.12.10 add
if (fabs(pVS->GetGridScale() - 0.5) < 0.01)
dlg.m_iGridScale = 0;
else if (fabs(pVS->GetGridScale() - 1) < 0.01)
dlg.m_iGridScale = 1;
else if (fabs(pVS->GetGridScale() - 2) < 0.01)
dlg.m_iGridScale = 2;
else if (fabs(pVS->GetGridScale()) < 0.01)
dlg.m_iGridScale = 3;
// cet 2011.12.5 add
std::map<TPipeSys::SysType, bool>::iterator it;
for (it = data.begin(); it != data.end(); it++)
{
(*it).second = pVS->IsShowCrossPipe(it->first);
}
}
OPENOBJ_END();
OPENOBJ_BEGIN(dlg.m_lstWellSys[0]->m_ID, AcDb::kForRead, AecXDbWell, pWell);
if (!pWell) {
g_Option::instance().adsout << _T("\n平面图信息已经丢失!请确认平面图和纵断面图在一张DWG中。");
return RTERROR;
}
OPENOBJ_END();
dlg.SetShowPipeData(data); // cet 2011.12.5 add
if (dlg.DoModal() == IDOK) {
dlg.GetShowPipeData(data); // cet 2011.12.5 add
OPENOBJ_BEGIN(id, AcDb::kForWrite, CDbVerticalSection, pVS);
if (pVS) {
if (dlg.m_iGridScale == 0)
pVS->SetGridScale(0.5);
else if (dlg.m_iGridScale == 1)
pVS->SetGridScale(1);
else if (dlg.m_iGridScale == 2)
pVS->SetGridScale(2);
else if (dlg.m_iGridScale == 3)
pVS->SetGridScale(0);
pVS->SetWellDatas(dlg.m_lstWellSys);
pVS->SetStartDeep(_tstof(dlg.m_csDeep));
int iMode = dlg.m_iMode;
if (dlg.m_bFromRight && iMode != 3)
iMode += 100;
pVS->SetCalcMode(iMode);
pVS->SetScaleX(dlg.m_iX);
pVS->SetScaleY(dlg.m_iY);
pVS->SetDimEle(dlg.m_bDimEle ? true : false); // cet 2011.6.3 add
pVS->SetDimDist(dlg.m_bDimDist ? true : false);// zxl 2013.12.10 add
pVS->Calc();
// cet 2011.12.5 add
std::map<TPipeSys::SysType, bool>::iterator it;
for (it = data.begin(); it != data.end(); it++)
{
pVS->SetShowCrossPipe(it->first, it->second);
}
}
OPENOBJ_END();
}
return 1;
}
//***************************************************************************************************
// 纵断标高
//***************************************************************************************************
//从纵断面图读取井的跌落高度 zxl 2011.11.17 add
void SetWellDropHeight(DList<TWellData> &lstWellSys)
{
double dLen = 0.0;
double dDI = 0.0;
double dDim1 = 0.0;
double dDim2 = 0.0;
for (int i = 1; i < lstWellSys.Length(); i++)
{
dLen = lstWellSys[i]->m_nLength;
dDI = lstWellSys[i]->m_nI;
dDim1 = lstWellSys[i]->m_nFrondDownEle;
dDim2 = lstWellSys[i]->m_nDownEle;
if (fabs(dDim1 + dDI * dLen - dDim2) > 0.001)
{
CString sTemp;
sTemp.Format(_T("%0.3f"), fabs(dDim1 + dDI * dLen - dDim2));
lstWellSys[i]->m_csSpare = sTemp;
}
}
}
void ModifyVericalSectionEle()
{
Entity ent;
RBList rbMask(RTDXF0, _T("AEC_ZT_VERTICALSECTION,AEC_ZT_VERTICALSECTION_FEED"), NULL);
if (GlobalFunc::SelectEntity(_T("\n请选择纵断面图<退出>:"), ent, rbMask) != RTNORM)
return;
if (ent.Is(_T("AEC_ZT_VERTICALSECTION")))
{
CTemporaryResourceOverride vTemp;
CWellCalcModifyEleDlg dlg(0);
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbVerticalSection, pVS);
if (pVS) {
pVS->GetWellDatas(dlg.m_lstWellSys);
SetWellDropHeight(dlg.m_lstWellSys);//从纵断面图读取井的跌落高度 zxl 2011.11.17 add
}
OPENOBJ_END();
if (dlg.DoModal() == IDOK) {
OPENOBJ_BEGIN(ent, AcDb::kForWrite, CDbVerticalSection, pVS);
if (pVS) {
pVS->SetWellDatas(dlg.m_lstWellSys);
pVS->Calc();
}
OPENOBJ_END();
}
}
else
{
CTemporaryResourceOverride vTemp;
CWellCalcModifyEleDlg dlg(1);
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbVerticalSectionFeed, pVS);
if (pVS) {
pVS->GetWellDatas(dlg.m_lstFeedWellSys);
}
OPENOBJ_END();
if (dlg.DoModal() == IDOK) {
OPENOBJ_BEGIN(ent, AcDb::kForWrite, CDbVerticalSectionFeed, pVS);
if (pVS) {
pVS->SetWellDatas(dlg.m_lstFeedWellSys);
pVS->Calc();
}
OPENOBJ_END();
}
}
}
TGridWellDeep::TGridWellDeep()
{
AppendCol(_T("起点"), 35);
AppendCol(_T("终点"), 35);
AppendCol(_T("管长m"), 50);
AppendCol(_T("管径mm"), 50);
AppendCol(_T("坡度‰"), 55);
AppendCol(_T("管底坡降m"), 50);
AppendCol(_T("起点"), 45);
AppendCol(_T("终点"), 45);
AppendCol(_T("起点"), 45);
AppendCol(_T("终点"), 45);
AppendCol(_T("起点"), 45);
AppendCol(_T("终点"), 45);
SetColPosFix();
SetColFixLength();
SetColFixWidth(); //不响应调整列宽度操作
SetNoPaste();
FitLastCol();
GetCol(3).SetComboEdit();
GetCol(4).SetComboEdit();
COLORREF color = RGB(255, 0, 0);
GetCol(4).SetTextColor(color);
GetCol(3).SetTextColor(color);
COLORREF color2 = RGB(0, 0, 255);;
GetCol(5).SetTextColor(color2);
GetCol(8).SetTextColor(color2);
GetCol(9).SetTextColor(color2);
GetCol(10).SetTextColor(color2);
GetCol(11).SetTextColor(color2);
}
void TGridWellDeep::OnCellComboString(WDGridCell&cell, CComboBox&combo)
{
if (cell.GetColIndex() == 3) {
combo.AddString(_T("200"));
combo.AddString(_T("250"));
combo.AddString(_T("300"));
combo.AddString(_T("350"));
combo.AddString(_T("400"));
combo.AddString(_T("450"));
combo.AddString(_T("500"));
combo.AddString(_T("600"));
}
else if (cell.GetColIndex() == 4) {
combo.AddString(_T("1"));
combo.AddString(_T("2"));
combo.AddString(_T("3"));
combo.AddString(_T("4"));
combo.AddString(_T("5"));
combo.AddString(_T("6"));
}
}
/////////////////////////////////////////////////////////////////////////////
// CWellCalcSettingDlg dialog
//double CWellCalcSettingDlg::m_nDeep = 0.8;
const UINT nMenuId = 100; // cet 2011.12.5 add
const UINT nMenuTypeId = 1000; // zxl 2012.03.29 add
int CWellCalcSettingDlg::m_iLengthType = 0;
CWellCalcSettingDlg::CWellCalcSettingDlg(int mode, CWnd* pParent /*=NULL*/)
: CDialog(CWellCalcSettingDlg::IDD, pParent), m_ssAll(SS_FREE)
{
//{{AFX_DATA_INIT(CWellCalcSettingDlg)
m_iMode = 0;
m_csX = _T("100");
m_csY = _T("50");
m_iGridScale = 0;
m_bFromRight = FALSE;
m_iInput = 0;
m_csDeep = _T("0.8");
m_csEndEle = _T("");
m_bDimEle = FALSE;
m_bDimDist = FALSE;
//}}AFX_DATA_INIT
// m_dDeep = 0.8;
// m_dEndEle = 0;
m_bNeedDraw = FALSE;
/* cet 2012.1.30 modify 读取比例数据
m_iX = (int)DocGetPScale();
if(GlobalFunc::DocGetMeterUnitDraw())
m_iX =m_iX*1000;
m_iY = 50;
*/
ReadWriteScaleFromRegedit(TRUE);
m_bEdit = FALSE;
m_bCalc = FALSE;
// m_nMaxDeep = 0;
// m_nMinDeep = 0;
m_iOpenMode = mode;
m_csSheetHead = _T("");
m_pMenu = NULL;
// zxl 2012.03.28 add
m_pMenuLength = NULL;
m_pListAll = NULL;
InitMapData(); // cet 2011.12.5 add
}
void CWellCalcSettingDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWellCalcSettingDlg)
DDX_Control(pDX, IDC_COMBO_Y, m_comboY);
DDX_Control(pDX, IDC_COMBO_X, m_comboX);
DDX_CBIndex(pDX, IDC_COMBO_MODE, m_iMode);
DDX_CBString(pDX, IDC_COMBO_X, m_csX);
DDX_CBString(pDX, IDC_COMBO_Y, m_csY);
DDX_CBIndex(pDX, IDC_COMBO_GRID, m_iGridScale);
DDX_Check(pDX, IDC_CHECK_FROM_RIGHT, m_bFromRight);
DDX_Radio(pDX, IDC_RADIO_INPUT1, m_iInput);
DDX_Text(pDX, IDC_EDIT_DEEP, m_csDeep);
DDX_Text(pDX, IDC_EDIT_ENDELE, m_csEndEle);
DDX_Check(pDX, IDC_CHECK_DIMELE, m_bDimEle);
DDX_Check(pDX, IDC_CHECK_DIMDIST, m_bDimDist);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWellCalcSettingDlg, CDialog)
//{{AFX_MSG_MAP(CWellCalcSettingDlg)
ON_BN_CLICKED(IDC_BUTTON_CALC, OnButtonCalc)
ON_BN_CLICKED(IDC_BUTTON_SHEET, OnButtonSheet)
ON_BN_CLICKED(IDC_BUTTON_TODWG, OnButtonTodwg)
ON_BN_CLICKED(IDC_BUTTON_MODIFYELE, OnButtonModifyele)
ON_BN_CLICKED(IDC_BUTTON_HIDE, OnButtonHide)
ON_BN_CLICKED(IDC_RADIO_INPUT1, OnRadioInput1)
ON_BN_CLICKED(IDC_RADIO_INPUT2, OnRadioInput2)
ON_BN_CLICKED(IDC_BUTTON_SHOW, OnButtonShow)
ON_BN_CLICKED(IDC_BTN_MENU, OnBtnLengthType)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWellCalcSettingDlg message handlers
//绘制纵断面图
void CWellCalcSettingDlg::OnOK()
{
UpdateData(TRUE);
m_iX = _ttoi(m_csX);
m_iY = _ttoi(m_csY);
// cet 2012.1.30 add 非编辑纵断面图时,保存比例数据
if (!m_bEdit)
{
ReadWriteScaleFromRegedit(FALSE);
}
ResetWellStake();
if (m_iOpenMode == 1) {
CDialog::OnOK();
return;
}
if (m_lstWellSys.Length() < 3 || !m_bCalc)
return;
if (m_iX < 1 || m_iY < 1)
{
MessageBox(_T("绘图比例应大于0!"), _T("比例错误")); // cet 2011.6.13 add
return;
}
GlobalFunc::HideDialog(this, TRUE);
double nGridScale(0);
if (m_iGridScale == 0)
nGridScale = 0.5;
else if (m_iGridScale == 1)
nGridScale = 1;
else if (m_iGridScale == 2)
nGridScale = 2;
else if (m_iGridScale == 3)
nGridScale = 0;
int iMode = m_iMode;
if (m_bFromRight && m_iMode != 3)
iMode += 100;
// DrawVerticalSection(m_lstWellSys, m_iX, m_iY, nGridScale, iMode, _tstof(m_csDeep)); cet 2011.6.3 modify
// cet 2011.12.5 modify
// DrawVerticalSection(m_lstWellSys, m_iX, m_iY, nGridScale, iMode, _tstof(m_csDeep), m_bDimEle ? true : false);
std::map<TPipeSys::SysType, bool> data;
GetShowPipeData(data);
DrawVerticalSection(m_lstWellSys, m_iX, m_iY, nGridScale, iMode, _tstof(m_csDeep), m_bDimEle ? true : false, m_bDimDist ? true : false, data);
TCHAR szTmp[256];
//TPipePerDocData *pData = GetCurPipeDocData();
//pData->ApplyUpdates();
ads_getstring(NULL, _T("\n按任意键返回对话框:<返回>"), szTmp);
GlobalFunc::HideDialog(this, FALSE);
return;
}
//std::vector 的回调函数
static bool GreaterByParm(TPtOnStake item1, TPtOnStake item2)
{
if (item1.m_dParm - item2.m_dParm < AcGeContext::gTol.equalPoint())//倒序
{
return false;
}
return true;
}
//对桩进行排序
BOOL SortStakePoints(AcArray<TPtOnStake> &arStake, AcDbCurve * pCurve)
{
std::vector<TPtOnStake> PtOnStakeVector;
TPtOnStake ptOnCrItem;
int len = arStake.length();
for (int i = 0; i < len; i++)
{
ptOnCrItem = arStake.at(i);
ptOnCrItem.m_pCurve = pCurve;
pCurve->getClosestPointTo(ptOnCrItem.m_ptGeOn, ptOnCrItem.m_ptGeOn);
pCurve->getParamAtPoint(ptOnCrItem.m_ptGeOn, ptOnCrItem.m_dParm);
PtOnStakeVector.push_back(ptOnCrItem);
}
//排序
std::vector<TPtOnStake>::iterator itHead = PtOnStakeVector.begin();
std::vector<TPtOnStake>::iterator itTail = PtOnStakeVector.end();
std::sort(itHead, itTail, GreaterByParm);
itHead = PtOnStakeVector.begin();
itTail = PtOnStakeVector.end();
arStake.setLogicalLength(0);
std::vector<TPtOnStake>::iterator it;
for (it = itHead; it != itTail; it++)
{
arStake.append(*it);
}
return TRUE;
}
void CWellCalcSettingDlg::GetCurveFPick(Entity ent, PickSet &ss, RBList &rbMask)
{
if (ent.Is(_T("LINE"))) {
XLine line(ent);
GlobalFunc::AssureInCurrentView_New(line.StartPoint(), line.EndPoint());
line.TransUCS(RBGroups(0), RBGroups(1)); // 把 UCS 转为 WCS
RBList rbPoint = ads_buildlist(RT3DPOINT, &line.StartPoint(), RT3DPOINT, &line.EndPoint(), NULL);
ss.Get(_T("F"), rbPoint, NULL, rbMask);
}
else if (ent.Is(_T("ARC"))) {
XArc arc(ent);
XCurveSegment seg;
seg = arc;
XPoly2D xPline;
seg.AsPoly2D(xPline);
XPoint pt1, pt2;
pt1 = *xPline[0];
xPline.Length();
pt2 = *xPline[xPline.Length() - 1];
GlobalFunc::AssureInCurrentView_New(pt1, pt2);
xPline.TransUCS(RBGroups(0), RBGroups(1)); // 把 UCS 转为 WCS
RBList rbPoint = xPline.Polygon();
ss.Get(_T("F"), rbPoint, NULL, rbMask);
}
else {
XPoly2D xPline(ent);
XPoint pt1, pt2;
pt1 = *xPline[0];
xPline.Length();
pt2 = *xPline[xPline.Length() - 1];
GlobalFunc::AssureInCurrentView_New(pt1, pt2);
xPline.TransUCS(RBGroups(0), RBGroups(1)); // 把 UCS 转为 WCS
RBList rbPoint = xPline.Polygon();
ss.Get(_T("F"), rbPoint, NULL, rbMask);
}
}
//已知桩号数字,返回标注内容, 如:820 返回K0+825
CString GetStakeName(double dTextValue, CString sStakePrefix)
{
double dTextN = dTextValue / 1000;
CString sText, sTextN;
sTextN.Format(_T("%.2f"), dTextN);
//文字是1000的多少倍
int nTextN = _ttoi(sTextN);
//除以1000后的余数
double dTextResidue = fabs(dTextValue - 1000 * nTextN);
sTextN.Format(_T("%.0f"), dTextResidue);
int nLen = sTextN.GetLength();
sTextN.Format(_T("%.2f"), dTextResidue);
//判断有没有小数
double dEndResidue = _tstof(sTextN.Right(2));
dEndResidue /= 100;
if (dEndResidue < 0.01)
{
if (nLen == 1)
sText.Format(_T("%s%d+00%.0f"), sStakePrefix, nTextN, dTextResidue);
else if (nLen == 2)
sText.Format(_T("%s%d+0%.0f"), sStakePrefix, nTextN, dTextResidue);
else
sText.Format(_T("%s%d+%.0f"), sStakePrefix, nTextN, dTextResidue);
}
else
{
if (nLen == 1)
sText.Format(_T("%s%d+00%.2f"), sStakePrefix, nTextN, dTextResidue);
else if (nLen == 2)
sText.Format(_T("%s%d+0%.2f"), sStakePrefix, nTextN, dTextResidue);
else
sText.Format(_T("%s%d+%.2f"), sStakePrefix, nTextN, dTextResidue);
}
return sText;
}
//更新井的桩号
void CWellCalcSettingDlg::ResetWellStake()
{
RBList rbMask(RTDXF0, _T("AEC_ZT_STAKE"), NULL);
RBList rbMask2(RTDXF0, _T("LINE,ARC,LWPOLYLINE"), NULL);
PickSet ss(SS_FREE);
ss.Get(_T("X"), NULL, NULL, rbMask);
long dd = ss.Length();
if (ss.Length() < 2) //本图根本就没有桩号
return;
if (m_iOpenMode == 1) {
if (m_csSheetHead.Find(_T("桩号")) < 0)
return;
}
else
{
if (g_Option::instance().g_csVerticalSectionHead.Find(_T("桩号")) < 0)
return;
}
//1. 得到桩号所经过的路径曲线
CString csStakeHead = _T("K");
Entity entCurve;
for (int i = 0; i < m_lstWellSys.Length(); i++) {
if (m_lstWellSys[i]->m_bIsWell) { //井
AcDbObjectId id = m_lstWellSys[i]->m_ID;
XPoint ptWell, ptStake;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
ptWell = pEquip->GetLocation();
ptWell.z = 0;
}
OPENOBJ_END();
//得到该井最近的1桩号
double dDist = -1;
Entity entStake;
for (long j = 0; j < ss.Length(); j++)
{
Entity ent = ss[j];
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbStake, pEquip);
if (pEquip) {
pEquip->GetStakeBeforeChar(csStakeHead);
XPoint pt = pEquip->GetLocation();
pt.z = 0;
double dDistTmp = ads_distance(pt, ptWell);
if (dDist < 0 || dDist > dDistTmp)
{
dDist = dDistTmp;
ptStake = pt;
entStake = ent;
}
}
OPENOBJ_END();
}
PickSet ssCurve(SS_FREE);
GlobalFunc::AssureInCurrentView_New(ptStake, ptStake);
GlobalFunc::GetPointPickSet(ptStake, ssCurve, rbMask2);
long len3 = ssCurve.Length();
if (ssCurve.Length() == 1)
{
entCurve = ssCurve[0L];
break;
}
else if (ssCurve.Length() == 2)
{
TCHAR szLay1[256];
TCHAR szLay2[256];
Entity ent1 = ssCurve[0L];
Entity ent2 = ssCurve[1L];
ent1.GetData(8, szLay1);
ent2.GetData(8, szLay2);
if (_tcsicmp(szLay1, _T("TWT_STAKE")) == 0)
entCurve = ent2;
if (_tcsicmp(szLay2, _T("TWT_STAKE")) == 0)
entCurve = ent1;
}
}
}
if (!entCurve)
return;
//2. 得到通过该曲线所有的桩号,并把他们放到桩号容器中arStake
AcArray<TPtOnStake> arStake2;
PickSet ssStake(SS_FREE);
GetCurveFPick(entCurve, ssStake, rbMask);
int len = ssStake.Length();
for (long m = 0; m < len; m++)
{
Entity ent = ssStake[m];
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbStake, pEquip);
if (pEquip) {
XPoint pt = pEquip->GetLocation();
pt.z = 0;
AcDbObjectId id = pEquip->objectId();
TPtOnStake ptOnStake;
ptOnStake.m_ptGeOn = pt;
ptOnStake.m_dVal = pEquip->GetStakeValue();
arStake2.append(ptOnStake);
}
OPENOBJ_END();
// CString csVal = GlobalFunc::ReadXdata(ent, _T("STAKEVALUE"));
//
// OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbEquipment, pEquip);
// if(pEquip){
// XPoint pt = pEquip->GetLocation();
// pt.z = 0;
// AcDbObjectId id = pEquip->objectId();
// TPtOnStake ptOnStake;
// ptOnStake.m_ptGeOn = pt;
// ptOnStake.m_dVal = _tstof(csVal);
// arStake2.append(ptOnStake);
// }
// OPENOBJ_END();
}
//3. 对容器中的桩号,按曲线进行排序(倒序)
OPENOBJ_BEGIN(entCurve, AcDb::kForRead, AcDbCurve, pCurve);
if (pCurve)
{
SortStakePoints(arStake2, pCurve);
//4. 求每个井的桩号(先投影到曲线上,然后根据前后2桩号,差值求桩号)
for (i = 0; i < m_lstWellSys.Length(); i++) {
if (m_lstWellSys[i]->m_bIsWell) { //井
AcDbObjectId id = m_lstWellSys[i]->m_ID;
XPoint ptWell, ptStake;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
ptWell = pEquip->GetLocation();
ptWell.z = 0;
}
OPENOBJ_END();
pCurve->getClosestPointTo(ptWell, ptWell, Adesk::kTrue);
double dParmWell(0);
pCurve->getParamAtPoint(ptWell, dParmWell);
int iIdx1(-1), iIdx2(-1);
for (int n = 0; n < arStake2.length(); n++)
{
if ((dParmWell - arStake2.at(n).m_dParm) > -0.001)
{
iIdx1 = n;
break;
}
}
iIdx2 = iIdx1 - 1;
if (iIdx1 > -1 && iIdx2 > -1 && iIdx1 < arStake2.length())
{
double dVal1 = arStake2.at(iIdx1).m_dVal;
double dVal2 = arStake2.at(iIdx2).m_dVal;
double dValRet = GlobalFunc::GetValBetween2(dVal1, dVal2, arStake2.at(iIdx1).m_dParm, arStake2.at(iIdx2).m_dParm, dParmWell);
CString csText = GetStakeName(dValRet, csStakeHead);
// 求出来的桩号写入井的扩展数据,自定义绘制的时候会自动取
ads_name entWell;
acdbGetAdsName(entWell, id);
GlobalFunc::WriteXdata(entWell, _T("TWT-STAKEVALUE"), csText);
}
}
}
}
OPENOBJ_END();
//delete pCurve;
}
// zxl 2012.03.29 add
void CWellCalcSettingDlg::RetsetLength(DList<TWellData> &lst)
{
if (m_iLengthType == 0)
{
return;
}
double dLen = 0.0;
int iIndex = 0;
for (int i = 0; i < lst.Length(); i++)
{
dLen = lst[i]->m_nLength;
iIndex = dLen;
if (m_iLengthType == 1)
{
double d = dLen - iIndex;
if (d - 0.5 > 0.0)
{
dLen = iIndex + 1;
}
else if (d - 0.5 < 0.0 && d - 0.0 > 0.0)
{
dLen = iIndex + 0.5;
}
lst[i]->m_nLength = dLen;
}
else if (m_iLengthType == 2)
{
if (fabs(dLen - iIndex) > 0.001)
{
dLen = iIndex + 1;
lst[i]->m_nLength = dLen;
}
}
}
}
//绘制高程表
void CWellCalcSettingDlg::OnButtonSheet()
{
UpdateData(TRUE);
if (m_iOpenMode == 0 && (m_lstWellSys.Length() < 3 || !m_bCalc))
return;
GlobalFunc::HideDialog(this, TRUE);
// zxl 2012.03.29 add
DList<TWellData> lstWellSysCopy;
lstWellSysCopy.copyFrom(m_lstWellSys);
RetsetLength(lstWellSysCopy);
InsertWellCalcSheet(lstWellSysCopy);
actrTransactionManager->flushGraphics(); //acad 刷新
TCHAR szTmp[256];
ads_getstring(NULL, _T("\n按任意键返回对话框:<返回>"), szTmp);
GlobalFunc::HideDialog(this, FALSE);
return;
}
void CWellCalcSettingDlg::ResetWellDownEle()
{
for (int i = 0; i < m_lstWellSys.Length(); i++) {
m_lstWellSys[i]->m_nDownEle = m_lstWellOld[i]->m_nDownEle;
m_lstWellSys[i]->m_bIsDropWell = m_lstWellOld[i]->m_bIsDropWell;
}
}
//反算起点
void CWellCalcSettingDlg::CalcFromEnd()
{
//先检查是否有跌水井
for (int i = 0; i < m_lstWellSys.Length(); i++) {
if (m_lstWellSys[i]->m_bIsWell) {
if (m_lstWellSys[i]->m_bIsDropWell) {
MessageBox(_T("有跌水井,不支持反向计算。"));
return;
}
}
}
int len = m_lstWellSys.Length();
if (len < 3)
return;
double nPipeLen(0), nI(0), nFrontPipeEle(0);
double dEndEle = _tstof(m_csEndEle);
m_lstWellSys[len - 1]->m_nDownEle = dEndEle;
m_lstWellSys[len - 1]->m_nFrondDownEle = dEndEle;
m_lstWellSys[len - 1]->m_nDeep = m_lstWellSys[len - 1]->m_nUpEle - dEndEle;
nFrontPipeEle = dEndEle;
//m_nPipeQ 为井埋深(米), m_nV 为井底标高(米), nI为管坡度, m_nDang地面标高, m_nStartPress跌水井底标高
for (i = len - 1; i > -1; i--) {
if (m_lstWellSys[i]->m_bIsWell) { //井
AcDbObjectId id = m_lstWellSys[i]->m_ID;
if (nPipeLen > 0) {
double dRadiusFront(0), dRadiusBack(0);
if (i != 0)
dRadiusFront = m_lstWellSys[i - 1]->m_iDn;
dRadiusBack = m_lstWellSys[i + 1]->m_iDn;
double dDifference(0);
if (dRadiusFront > 0 && dRadiusBack > 0)//井前后管径差
dDifference = (dRadiusBack - dRadiusFront) / 1000;
double dWellDownEle = nFrontPipeEle + nI * nPipeLen;
if (m_iMode == 0) //管顶平接
nFrontPipeEle = dWellDownEle + dDifference;
else if (m_iMode == 1) //管底平接
nFrontPipeEle = dWellDownEle;
else if (m_iMode == 2 || m_iMode == 3) //水面平接
nFrontPipeEle = dWellDownEle + dDifference / 2;
double dWellDeep = m_lstWellSys[i]->m_nUpEle - m_lstWellSys[i]->m_nDownEle;
m_lstWellSys[i]->m_nDownEle = dWellDownEle;
m_lstWellSys[i]->m_nDeep = dWellDeep;
m_lstWellSys[i]->m_nFrondDownEle = nFrontPipeEle;
}
}
else if (!m_lstWellSys[i]->m_bIsWell) { //管
nPipeLen = m_lstWellSys[i]->m_nLength;
nI = m_lstWellSys[i]->m_nI;
CString csPipeName = m_lstWellSys[i - 1]->m_csName + m_lstWellSys[i + 1]->m_csName;
OPENOBJ_BEGIN(m_lstWellSys[i]->m_ID, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe) {
pPipe->SetSysLabel(csPipeName);
}
OPENOBJ_END();
}
}
}
//计算
void CWellCalcSettingDlg::OnButtonCalc()
{
UpdateData(TRUE);
for (m_grid.MoveToFirst(); !m_grid.IsOut(); m_grid.MoveToNext()) {
WDGridRow *pRow = m_grid.CurRow();
CString csName1 = (LPCTSTR)(*pRow)[0].GetText();
CString csName2 = (LPCTSTR)(*pRow)[1].GetText();
CString csName;
CString csDn = (LPCTSTR)(*pRow)[3].GetText();
CString csI = (LPCTSTR)(*pRow)[4].GetText();
csName = csName1 + csName2;
if (csName == _T(""))
break;
for (int i = 0; i < m_lstWellSys.Length(); i++) {
if (!m_lstWellSys[i]->m_bIsWell) {
OPENOBJ_BEGIN(m_lstWellSys[i]->m_ID, AcDb::kForRead, CDbPipe, pPipe);
if (pPipe) {
CString csPipeName = pPipe->GetSysLabel();
if (csPipeName == csName) {
m_lstWellSys[i]->m_iDn = _ttoi(csDn);
m_lstWellSys[i]->m_nI = _tstof(csI) / 1000;
CString csMat = GlobalFunc::GetPipeMaterialByIdx(pPipe->GetMaterial());
double nDnOut = GlobalFunc::GetPipeOutDByDn(csMat, _ttoi(csDn)) * 1000;
m_lstWellSys[i]->m_iSpare = (int)nDnOut;
break;
}
}
OPENOBJ_END();
}
}
}
m_bCalc = TRUE;
//反算起点
if (m_iInput == 1) {
CalcFromEnd();
CheckDropWell();
UpdateGrid();
double dDeepS = m_lstWellSys[0]->m_nUpEle - m_lstWellSys[0]->m_nDownEle;
m_csDeep.Format(_T("%.3f"), dDeepS);
UpdateData(FALSE);
return;
}
double nDeepStart = _tstof(m_csDeep);
m_lstWellSys[0]->m_nDeep = nDeepStart; //m_nPipeQ 为井埋深
double nPipeLen(0), nI(0), nFrontPipeEle(0);
double nEleStart = m_lstWellSys[0]->m_nUpEle;
nDeepStart = nEleStart - nDeepStart; //井底标高 = 起点井地面标高-最小埋深
m_lstWellSys[0]->m_nDownEle = nDeepStart;
if (m_iOpenMode == 0) {
XPoint ptLow3, ptUp3;
m_ssAll.GetExtend(ptLow3, ptUp3);
GlobalFunc::AssureInCurrentView_New(ptLow3, ptUp3);
}
//m_nPipeQ 为井埋深(米), m_nV 为井底标高(米), nI为管坡度, m_nDang地面标高, m_nStartPress跌水井底标高
for (int i = 0; i < m_lstWellSys.Length(); i++) {
if (m_lstWellSys[i]->m_bIsWell) { //井
AcDbObjectId id = m_lstWellSys[i]->m_ID;
if (nPipeLen > 0) {
double nWellEle = m_lstWellSys[i]->m_nUpEle;
double nWellDownEle = m_lstWellSys[i]->m_nDownEle;
double nLastEnd = nDeepStart - nI * nPipeLen;
// double nFrontPipeDeep = nWellEle - nLastEnd; //埋深 地面-前管
double nWellDeep = nWellEle - nWellDownEle; //埋深 地面-井底
nFrontPipeEle = nLastEnd;
if (m_lstWellSys[i]->m_bIsDropWell) {
nDeepStart = m_lstWellSys[i]->m_nDownEle;
m_lstWellSys[i]->m_nFrondDownEle = nFrontPipeEle;
}
else {
double nRadiusFront(0), nRadiusBack(0);
nRadiusFront = m_lstWellSys[i - 1]->m_iDn;
if (i != m_lstWellSys.Length() - 1)
{
nRadiusBack = m_lstWellSys[i + 1]->m_iDn;
}
//得到外径
double nDifference(0);
if (nRadiusFront > 0 && nRadiusBack > 0) {//井前后管径差
nDifference = (nRadiusBack - nRadiusFront) / 1000;
}
m_lstWellSys[i]->m_nFrondDownEle = nDeepStart - nI * nPipeLen;
if (m_iMode == 0) //管顶平接
nDeepStart = nDeepStart - nI * nPipeLen - nDifference;
else if (m_iMode == 1) //管底平接
nDeepStart = nDeepStart - nI * nPipeLen;
else if (m_iMode == 2 || m_iMode == 3) //水面平接
nDeepStart = nDeepStart - nI * nPipeLen - nDifference / 2;
if (m_lstWellSys[i]->m_csName == _T("HC"))
{
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPool, pEquip);
if (pEquip) {
if (pEquip->GetSpare() > 0.01)
nDeepStart -= pEquip->GetSpare();
else
nDeepStart -= 0.1;//化粪池
}
OPENOBJ_END();
}
}
m_lstWellSys[i]->m_nDownEle = nDeepStart;
nWellDeep = nWellEle - nDeepStart;
m_lstWellSys[i]->m_nDeep = nWellDeep;
}
}
else if (!m_lstWellSys[i]->m_bIsWell) { //管
if (i == m_lstWellSys.Length() - 1)
continue;
nPipeLen = m_lstWellSys[i]->m_nLength;
// if(m_lstWellSys[i]->m_dRealLength > 0.1)
// nPipeLen = m_lstWellSys[i]->m_dRealLength;
nI = m_lstWellSys[i]->m_nI;
CString csPipeName = m_lstWellSys[i - 1]->m_csName + m_lstWellSys[i + 1]->m_csName;
if (m_lstWellSys[i + 1]->m_csName == _T("HC"))
csPipeName += _T("进");
else if (m_lstWellSys[i - 1]->m_csName == _T("HC"))
csPipeName = m_lstWellSys[i - 1]->m_csName + _T("出") + m_lstWellSys[i + 1]->m_csName;
OPENOBJ_BEGIN(m_lstWellSys[i]->m_ID, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe) {
pPipe->SetSysLabel(csPipeName);
}
OPENOBJ_END();
}
}
CheckDropWell();
UpdateGrid();
}
//检查每个井是否有支路汇进来,如果有,而且支路的管底标高低于本次计算该井的底标高,建议用户干涉让他成为跌水井
void CWellCalcSettingDlg::CheckDropWell()
{
m_map.RemoveAll();
double nPipeLen(0);
CString csPromptAll = _T("标高检查:\n");
for (int i = 0; i < m_lstWellSys.Length(); i++) {
if (m_lstWellSys[i]->m_bIsWell) { //井
AcDbObjectId id = m_lstWellSys[i]->m_ID;
if (nPipeLen > 0) {
double nWellEle = m_lstWellSys[i]->m_nUpEle;
double nWellDownEle = m_lstWellSys[i]->m_nDownEle;
if (m_lstWellSys[i]->m_bIsDropWell)
continue;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbEquipment, pEquip);
if (pEquip) {
int num = pEquip->GetInterfaceNum();
if (num > 2) {
for (int j = 0; j < num; j++) {
CPipeInterface face;
pEquip->GetInterface(j, face);
if (i > 0 && face.m_idPipe == m_lstWellSys[i - 1]->m_ID)
continue;
if (i < m_lstWellSys.Length() - 1 && face.m_idPipe == m_lstWellSys[i + 1]->m_ID)
continue;
CString csPipeDownEle = pEquip->GetISysLabel(j);
if (csPipeDownEle == _T(""))
continue;
double nPipeDownEle = _tstof(csPipeDownEle);
if (nWellDownEle - nPipeDownEle > 0.001) {
CString csPrompt = m_lstWellSys[i]->m_csName;
csPrompt.Format(_T("%s 井支路管线计算的管底标高(%.2f)小于%.2f,建议改为跌水井"), csPrompt, nPipeDownEle, nWellDownEle);
csPromptAll = csPromptAll + _T("\n\n") + csPrompt;
m_map.SetAt(m_lstWellSys[i]->m_csName, csPipeDownEle);
}
}
}
}
OPENOBJ_END();
}
}
else if (!m_lstWellSys[i]->m_bIsWell) { //管
if (i == m_lstWellSys.Length() - 1)
continue;
nPipeLen = m_lstWellSys[i]->m_nLength;
}
}
if (csPromptAll != _T("标高检查:\n"))
MessageBox(csPromptAll);
}
BOOL CWellCalcSettingDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_iOpenMode == 1) {//编辑对话框
CWnd *pWnd2 = GetDlgItem(IDOK);
// CWnd *pWnd3 = GetDlgItem(IDC_BUTTON_SHEET);
pWnd2->SetWindowText(_T("更新"));
// pWnd3->ShowWindow(SW_HIDE);
}
for (int i = 0; i < m_lstWellSys.Length(); i++) {
TWellData *pList = new TWellData();
pList->m_iDn = m_lstWellSys[i]->m_iDn;
pList->m_bIsWell = m_lstWellSys[i]->m_bIsWell;
pList->m_bIsDropWell = m_lstWellSys[i]->m_bIsDropWell;;
pList->m_csName = m_lstWellSys[i]->m_csName;
pList->m_ID = m_lstWellSys[i]->m_ID;
pList->m_nI = m_lstWellSys[i]->m_nI;
pList->m_nUpEle = m_lstWellSys[i]->m_nUpEle;
pList->m_nDownEle = m_lstWellSys[i]->m_nDownEle;
pList->m_nLength = m_lstWellSys[i]->m_nLength;
pList->m_dRealLength = m_lstWellSys[i]->m_dRealLength;
m_lstWellOld.Append(pList);
}
// m_comboX.SetWindowText(XString(_T("%d"), m_iX));
// m_comboY.SetWindowText(XString(_T("%d"), m_iY));
m_grid.Clear();
m_grid.Create(this, IDC_LIST_PIPE);
m_grid.FitLastCol();
m_grid.SetNoAppendButton(TRUE);
m_grid.SetNoDefaultMenu(true);
UpdateGrid();
m_grid.GetCol(0).SetReadOnly();
m_grid.GetCol(1).SetReadOnly();
m_grid.GetCol(2).SetReadOnly();
m_grid.GetCol(5).SetReadOnly();
m_grid.GetCol(6).SetReadOnly();
m_grid.GetCol(7).SetReadOnly();
m_grid.GetCol(8).SetReadOnly();
m_grid.GetCol(9).SetReadOnly();
m_grid.GetCol(10).SetReadOnly();
m_grid.GetCol(11).SetReadOnly();
double dDeep = m_lstWellSys[0]->m_nUpEle - m_lstWellSys[0]->m_nDownEle;
// m_nDeep = dDeep;
if (dDeep < 0.01 || fabs(m_lstWellSys[0]->m_nDownEle) < 0.001)
dDeep = 0.8;
if (m_lstWellSys[0]->m_bIsDropWell) { //如果第一个井是跌水井, 则计算起点埋深
CWnd *pWnd = GetDlgItem(IDC_EDIT_DEEP);
pWnd->EnableWindow(FALSE);
}
for (i = 0; i < m_lstWellSys.Length(); i++) {
if (!m_lstWellSys[i]->m_bIsWell) { //管
if (i == m_lstWellSys.Length() - 1)
continue;
CString csPipeName = m_lstWellSys[i - 1]->m_csName + m_lstWellSys[i + 1]->m_csName;
OPENOBJ_BEGIN(m_lstWellSys[i]->m_ID, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe) {
pPipe->SetSysLabel(csPipeName);
}
OPENOBJ_END();
}
}
CWnd *pWnd2 = GetDlgItem(IDC_EDIT_ENDELE);
pWnd2->EnableWindow(FALSE);
// m_dEndEle = m_lstWellSys[m_lstWellSys.Length()-1]->m_nDownEle;
m_csDeep.Format(_T("%.3f"), dDeep);
m_csEndEle.Format(_T("%.3f"), m_lstWellSys[m_lstWellSys.Length() - 1]->m_nDownEle);
m_csX.Format(_T("%d"), m_iX);
m_csY.Format(_T("%d"), m_iY);
// zxl 2012.03.28 add
CWnd *pWndLength = GetDlgItem(IDC_BTN_MENU);
CString sText;
pWndLength->GetWindowText(sText);
if (sText.Find(_T("↓")) == -1)
{
sText += _T("↓");
pWndLength->SetWindowText(sText);
}
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CWellCalcSettingDlg::OnRadioInput1()
{
CWnd *pWnd1 = GetDlgItem(IDC_EDIT_DEEP);
CWnd *pWnd2 = GetDlgItem(IDC_EDIT_ENDELE);
pWnd1->EnableWindow(TRUE);
pWnd2->EnableWindow(FALSE);
}
void CWellCalcSettingDlg::OnRadioInput2()
{
CWnd *pWnd1 = GetDlgItem(IDC_EDIT_DEEP);
CWnd *pWnd2 = GetDlgItem(IDC_EDIT_ENDELE);
pWnd2->EnableWindow(TRUE);
pWnd1->EnableWindow(FALSE);
}
void CWellCalcSettingDlg::UpdateGrid()
{
long iCurRow = m_grid.GetCurRowIndex();
m_grid.Clear();
int idx = 0;
for (int i = 0; i < m_lstWellSys.Length() - 1; i++) {
if (m_lstWellSys[i]->m_bIsWell) { //井
if (i == m_lstWellSys.Length() - 2)
break;
CString csName1 = m_lstWellSys[i]->m_csName;
CString csName2 = m_lstWellSys[i + 2]->m_csName;
if (csName1 == _T("") || csName2 == _T("")) {
MessageBox(_T("请检查井是否都编号。"));
break;
}
// if(csName2 == _T("HC"))
// csName2 = _T("HC进");
// if(csName1 == _T("HC"))
// csName1 = _T("HC出");
if (csName2 == _T("HC"))
csName2 = GetPoolName(m_lstWellSys[i + 2]->m_ID) + _T("进");
if (csName1 == _T("HC"))
csName1 = GetPoolName(m_lstWellSys[i]->m_ID) + _T("出");
CString csArea, csAllArea, csFactor, csQ, csTime;
m_grid.AppendRow();
m_grid.GetCell(idx, 0).SetText(csName1);
m_grid.GetCell(idx, 1).SetText(csName2);
double nEle = m_lstWellSys[i]->m_nUpEle;
double nDeep = m_lstWellSys[i]->m_nDeep;
double nDownEle = m_lstWellSys[i]->m_nDownEle;
CString csWellUpEle, csDeep, csDownEle, csWellUpEle2, csDeep2, csDownEle2;
csDeep.Format(_T("%.3f"), nDeep);
csDownEle.Format(_T("%.3f"), nDownEle);
csWellUpEle.Format(_T("%.3f"), nEle);
nEle = m_lstWellSys[i + 2]->m_nUpEle;
nDeep = m_lstWellSys[i + 2]->m_nDeep;
nDownEle = m_lstWellSys[i + 2]->m_nFrondDownEle;
csDeep2.Format(_T("%.3f"), nEle - nDownEle);
csDownEle2.Format(_T("%.3f"), nDownEle);
csWellUpEle2.Format(_T("%.3f"), nEle);
m_grid.GetCell(idx, 6).SetText(csWellUpEle);
m_grid.GetCell(idx, 7).SetText(csWellUpEle2);
m_grid.GetCell(idx, 8).SetText(csDownEle);
m_grid.GetCell(idx, 9).SetText(csDownEle2);
m_grid.GetCell(idx, 10).SetText(csDeep);
m_grid.GetCell(idx, 11).SetText(csDeep2);
}
else { //管
if (i == m_lstWellSys.Length() - 1)
continue;
double nPipeLen = m_lstWellSys[i]->m_nLength;
// if(m_lstWellSys[i]->m_dRealLength > 0.1)
// nPipeLen = m_lstWellSys[i]->m_dRealLength;
int iDn = m_lstWellSys[i]->m_iDn;
CString csDn, csPipeLen, csI, csI2;
csDn.Format(_T("%d"), iDn);
csI.Format(_T("%.3f"), m_lstWellSys[i]->m_nI * 1000);
csI2.Format(_T("%.3f"), m_lstWellSys[i]->m_nI * m_lstWellSys[i]->m_nLength);
// csPipeLen.Format(_T("%.2f"), m_lstWellSys[i]->m_nLength);
csPipeLen.Format(_T("%.2f"), nPipeLen);
m_grid.GetCell(idx, 2).SetText(csPipeLen);
m_grid.GetCell(idx, 3).SetText(csDn);
m_grid.GetCell(idx, 4).SetText(csI);
m_grid.GetCell(idx, 5).SetText(csI2);
idx++;
}
}
m_grid.SelectRow(iCurRow, TRUE);
}
void CWellCalcSettingDlg::OnButtonHide()
{
long idx = m_grid.GetCurRowIndex();
CString csName1;
if (idx > -1) {
WDGridRow *pRow = &m_grid.GetRow(idx);
if (pRow)
csName1 = (*pRow)[0].GetText();
}
if (csName1 != _T("")) {
RBList rbMask(RTDXF0, _T("AEC_ZT_WELL"), NULL);
PickSet ss(SS_FREE);
ss.Get(_T("X"), NULL, NULL, rbMask);
long len = ss.Length();
for (long i = 0; i < len; i++) {
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbWell, pEquip);
if (pEquip) {
CString csName = pEquip->GetWellName();
if (_tcsicmp(csName, csName1) == 0) {
XPoint ptCen;
double nX(1), nY(1);
ent.GetExtend(ptCen, &nX, &nY);
GlobalFunc::ArxZoomTo(ptCen, 10 * pEquip->GetPScale(), 10 * pEquip->GetPScale());
double nDist = pEquip->GetPScale();
XPoint p1, p2, p3, p4;
ads_polar(ptCen, 0, nDist, p1);
ads_polar(p1, PI / 2, nDist, p1);
ads_polar(ptCen, PI, nDist, p2);
ads_polar(p2, PI / 2, -nDist, p2);
ads_grdraw(p1, p2, 2, 0);
ads_polar(ptCen, PI / 2, nDist, p3);
ads_polar(p3, PI, nDist, p3);
ads_polar(ptCen, PI / 2, -nDist, p4);
ads_polar(p4, 0, nDist, p4);
ads_grdraw(p3, p4, 2, 0);
}
}
OPENOBJ_END();
}
}
GlobalFunc::HideDialog(this, TRUE);
TCHAR szTmp[256];
ads_getstring(NULL, _T("\n按任意键返回对话框:<返回>"), szTmp);
GlobalFunc::HideDialog(this, FALSE);
}
extern void ShowPipe(const AcDbObjectId &idPipe);
extern bool HandlePipeDimType(CDbPipe *pPipe, int &nSelType);
void CWellCalcSettingDlg::OnButtonTodwg()
{
UpdateData(TRUE);
if (m_lstWellSys.Length() < 3 || (!m_bCalc && m_iOpenMode == 0))
return;
GlobalFunc::HideDialog(this, TRUE);
// 更改流向 cet 2012.7.26 add
ResetPipeDirFromImport(m_pListAll);
RBList rbMaskDim(RTDXF0, _T("AEC_ZT_WELLDIM"), NULL);
if (m_iOpenMode == 0) {
XPoint ptLow3, ptUp3;
m_ssAll.GetExtend(ptLow3, ptUp3);
GlobalFunc::AssureInCurrentView_New(ptLow3, ptUp3);
}
int nSelType = -1; // cet 2012.1.9 add 管线标注与管线原有标注不同时,用户的选择 0: Y 1: N 2: A 3: D
bool bShow = false; // cet 2012.1.9 add
std::vector<XPoint> vecPoolPts; // cet 2012.10.25 add 池子插入点
for (int i = 0; i < m_lstWellSys.Length(); i++) {
if (m_lstWellSys[i]->m_bIsWell) { //井
AcDbObjectId id = m_lstWellSys[i]->m_ID;
XPoint ptLoc;
CString csEleLow, csEleUp;
csEleLow.Format(_T("%.2f"), m_lstWellSys[i]->m_nDownEle);
csEleUp.Format(_T("%.2f"), m_lstWellSys[i]->m_nUpEle);
if (m_lstWellSys[i]->m_csName == _T("HC"))
{
OPENOBJ_BEGIN(id, AcDb::kForWrite, CDbPool, pEquip);
if (pEquip) {
pEquip->SetGroundEle(m_lstWellSys[i]->m_nUpEle);
vecPoolPts.push_back(pEquip->GetLocation()); // cet 2012.10.25 add 记录池子插入点以便更新池子连接的管底标注
}
OPENOBJ_END();
continue;
}
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecXDbWell, pEquip);
if (pEquip) {
pEquip->SetDropWell(m_lstWellSys[i]->m_bIsDropWell);
double nPipeDownEle = m_lstWellSys[i]->m_nFrondDownEle;
double nPipeDownEle2 = m_lstWellSys[i]->m_nDownEle;
if (i > 1) { //设置前管道 管底标高
AcDbObjectId idPipe = m_lstWellSys[i - 1]->m_ID;
pEquip->SetPipeEndEle(idPipe, XString(_T("%.3f"), m_lstWellSys[i]->m_nFrondDownEle));
}
if (i < m_lstWellSys.Length() - 1) { //设置后管道 管底标高
AcDbObjectId idPipe = m_lstWellSys[i + 1]->m_ID;
pEquip->SetPipeEndEle(idPipe, XString(_T("%.3f"), m_lstWellSys[i]->m_nDownEle));
}
ptLoc = pEquip->GetLocation();
//搜索这个井其他连接管,最低标高才是井标高
int num = pEquip->GetInterfaceNum();
double nEleOther = m_lstWellSys[i]->m_nDownEle;
for (int m = 0; m < num; m++) {
CPipeInterface iFace;
pEquip->GetInterface(m, iFace);
CString csLabel = pEquip->GetISysLabel(m);
if (csLabel != _T("") && nEleOther - _tstof(csLabel) > 0.001)
nEleOther = _tstof(csLabel);
}
// if(nEleOther > m_lstWellSys[i]->m_nDownEle)
// pEquip->SetWellEleDown(m_lstWellSys[i]->m_nDownEle);
if (fabs(nEleOther - m_lstWellSys[i]->m_nDownEle) < 0.001)
pEquip->SetWellEleDown(m_lstWellSys[i]->m_nDownEle);
pEquip->SetWellEleUp(m_lstWellSys[i]->m_nUpEle);
}
OPENOBJ_END();
CString csGroundEle;
csGroundEle.Format(_T("%.3f"), m_lstWellSys[i]->m_nGroundEle);
ads_name entWell;
acdbGetAdsName(entWell, id);
GlobalFunc::WriteXdata(entWell, _T("TG-WELL-GroundEle"), csGroundEle);
CString csSand = GlobalFunc::ReadXdata(entWell, _T("TG-WELL-DeepSand"));
if (m_lstWellSys[i]->m_nSpare > 0.001 || csSand != _T(""))
{
csSand.Format(_T("%.3f"), m_lstWellSys[i]->m_nSpare);
GlobalFunc::WriteXdata(entWell, _T("TG-WELL-DeepSand"), csSand);
}
// cet 2012.6.6 add 更新井半径
CString strWellRadius;
strWellRadius.Format(_T("%f"), m_lstWellSys[i]->m_nWellRadius * 2);
GlobalFunc::WriteXdata(entWell, _T("TG-WELL-RADIUS"), strWellRadius);
PickSet ss2(SS_FREE);
XPoint ptUcs = GlobalFunc::Wcs2Ucs(ptLoc);
GlobalFunc::GetPointPickSet(ptUcs, ss2, rbMaskDim, 50);
GlobalFunc::UpdateGraphic(ss2);
}
else {
bShow = false; // cet 2012.1.9 add
BOOL bDrawLabel = FALSE;// zxl 2012.12.26 add
int iDn = m_lstWellSys[i]->m_iDn;
double nI = m_lstWellSys[i]->m_nI * 1000;
double nEleDown = m_lstWellSys[i - 1]->m_nDownEle;
ads_name ent;
acdbGetAdsName(ent, m_lstWellSys[i]->m_ID);
OPENOBJ_BEGIN(ent, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe) {
pPipe->SetPipeGradient(nI / 1000);
XPoint pt1(pPipe->GetStartPoint()), pt2(pPipe->GetEndPoint());
pt1.z = 0;
pt2.z = 0;
double dLen = pPipe->GetPlanLength();
// dLen = ads_distance(pt1, pt2); //这时候, 要的是平面长度
// if(GlobalFunc::DocGetMeterUnitDraw())
// dLen = dLen * 1000.0;
double dI = pPipe->GetPipeGradient();
double nDrop = dLen * dI;
if (GlobalFunc::DocGetMeterUnitDraw())
{//米
if (pPipe->GetFlowDir() == TPipeSys::kFromStart) {
pt1.z = nEleDown + (double)iDn / 2000;
pt2.z = pt1.z - nDrop;
}
else {
pt2.z = nEleDown + (double)iDn / 2000;
pt1.z = pt2.z - nDrop;
}
}
else
{
nDrop = nDrop * 1000;
if (pPipe->GetFlowDir() == TPipeSys::kFromStart) {
pt1.z = nEleDown * 1000 + (double)iDn / 2;
pt2.z = pt1.z - nDrop;
}
else {
pt2.z = nEleDown * 1000 + (double)iDn / 2;
pt1.z = pt2.z - nDrop;
}
}
XPoint ptDimTmp = pPipe->GetLabelLocation();//先把标注点读出来,setstartpoint会修改这个点 2010-4-26 sr
pPipe->SetStartPoint(pt1);
pPipe->SetEndPoint(pt2);
if (!pPipe->IsDrawLabel())
{
SetPipeLabelType(pPipe);
}
else // cet 2012.1.9 add
{
bShow = HandlePipeDimType(pPipe, nSelType);
}
pPipe->SetLabelLocation(ptDimTmp);
// zxl 2012.12.28 del
// // cet 2011.12.5 add 标注样式为-1时不标注
// if (static_cast<int>(pPipe->GetSpare()) == -1)
// {
// pPipe->EnableDrawLabel(FALSE);
// }
bDrawLabel = pPipe->IsDrawLabel();// zxl 2012.12.26 add
}
OPENOBJ_END();
// cet 2012.1.9 add 显示交叉线
if (bShow)
{
ShowPipe(m_lstWellSys[i]->m_ID);
GlobalFunc::AnyKeyReturn(_T("\n按任意键继续查找下一段待修改管标注..."));
}
// zxl 2012.12.25 modify
//DoDimPipeDn(ent, iDn, _T("自动"), g_nPipeDnHeight, FALSE);
GlobalFunc::DoDimPipeDn(ent, iDn, _T("自动"), g_Option::instance().g_nPipeDnHeight, FALSE, TRUE);
OPENOBJ_BEGIN(ent, AcDb::kForWrite, CDbPipe, pPipe);
if (pPipe)
{
pPipe->EnableDrawLabel(bDrawLabel);
}
OPENOBJ_END();
////////////////////////////////标注////////////////////////////////////////
}
}
// 更新化粪池连接的管底标注 cet 2012.10.25 add
std::vector<XPoint>::iterator it;
PickSet ss2(SS_FREE);
for (it = vecPoolPts.begin(); it != vecPoolPts.end(); it++)
{
GlobalFunc::GetPointPickSet(GlobalFunc::Wcs2Ucs(*it), ss2, rbMaskDim, 50);
GlobalFunc::UpdateGraphic(ss2);
ss2.Free();
}
acedRedraw(0, 0); // cet 2012.1.9 add 刷新清除显示管线时的X
GlobalFunc::UpdateMultDim();
actrTransactionManager->flushGraphics(); //acad 刷新
TCHAR szTmp[32];
ads_getstring(NULL, _T("\n按任意键返回对话框:<返回>"), szTmp);
GlobalFunc::HideDialog(this, FALSE);
}
//vector 排序函数
extern bool CompareHeight(double dLen1, double dLen2);
// zxl 2011.11.15 add 计算井的跌落高度
CString CWellCalcSettingDlg::GetWellDropHeight(CString &sName)
{
std::vector<double> vecEle;
CString sTemp = _T("");
for (m_grid.MoveToFirst(); !m_grid.IsOut(); m_grid.MoveToNext())
{
WDGridRow *pRow = m_grid.CurRow();
CString csName1 = (LPCTSTR)(*pRow)[0].GetText();
CString csName2 = (LPCTSTR)(*pRow)[1].GetText();
// cet 2013.3.1 modify 将显示给用户的池子真实名称转换为HC
// if (csName1.Compare(_T("HC进")) == 0 || csName1.Compare(_T("HC出")) == 0)
// {
// csName1 = _T("HC");
// }
// else if (csName2.Compare(_T("HC进")) == 0 || csName2.Compare(_T("HC出")) == 0)
// {
// csName2 = _T("HC");
// }
int nIndex1 = -1, nIndex2 = -1;
nIndex1 = csName1.Find(_T("进"));
nIndex2 = csName1.Find(_T("出"));
if (nIndex1 > -1 || nIndex2 > -1)
{
csName1 = _T("HC");
}
nIndex1 = csName2.Find(_T("进"));
nIndex2 = csName2.Find(_T("出"));
if (nIndex1 > -1 || nIndex2 > -1)
{
csName2 = _T("HC");
}
if (sName.Compare(csName1) == 0)
{
vecEle.push_back((*pRow)[8].GetText());
}
else if (sName.Compare(csName2) == 0)
{
vecEle.push_back((*pRow)[9].GetText());
}
}
if (vecEle.size() > 1)
{
std::sort(vecEle.begin(), vecEle.end(), CompareHeight);
double dEleS = vecEle.front();
double dEleE = vecEle.back();
double dEle = fabs(dEleE - dEleS);
sTemp.Format(_T("%0.3f"), dEle);
if (fabs(dEle - 0.0) < 0.001)
{
sTemp = _T("");
}
}
return sTemp;
}
void CWellCalcSettingDlg::OnButtonModifyele()
{
CTemporaryResourceOverride vTemp;
CWellCalcModifyEleDlg dlg(0);
for (int i = 0; i < m_lstWellSys.Length(); i++) {
TWellData *pList = new TWellData();
pList->m_bIsWell = m_lstWellSys[i]->m_bIsWell;
pList->m_nGroundEle = m_lstWellSys[i]->m_nGroundEle;
pList->m_bIsDropWell = m_lstWellSys[i]->m_bIsDropWell;;
pList->m_csName = m_lstWellSys[i]->m_csName;
// cet 2013.3.1 add 将池名改为真实名
CString sName = pList->m_csName;
if (sName.Compare(_T("HC")) == 0)
{
pList->m_csName = GetPoolName(m_lstWellSys[i]->m_ID);
}
pList->m_nUpEle = m_lstWellSys[i]->m_nUpEle;
pList->m_nDownEle = m_lstWellSys[i]->m_nDownEle;
pList->m_nWellRadius = m_lstWellSys[i]->m_nWellRadius;
pList->m_nSpare = m_lstWellSys[i]->m_nSpare;
pList->m_dRealLength = m_lstWellSys[i]->m_dRealLength;
CString csDropEle;
if (m_map.Lookup(pList->m_csName, csDropEle))
pList->m_nFrondDownEle = _tstof(csDropEle); //临时记录一下支路的底标高
else
pList->m_nFrondDownEle = -9999;
// zxl 2011.11.16 add 设置跌落高度
pList->m_csSpare = GetWellDropHeight(m_lstWellSys[i]->m_csName);
dlg.m_lstWellSys.Append(pList);
}
if (dlg.DoModal() == IDOK) {
for (int i = 0; i < m_lstWellSys.Length(); i++) {
m_lstWellSys[i]->m_nUpEle = dlg.m_lstWellSys[i]->m_nUpEle;
m_lstWellSys[i]->m_nDownEle = dlg.m_lstWellSys[i]->m_nDownEle;
m_lstWellSys[i]->m_bIsDropWell = dlg.m_lstWellSys[i]->m_bIsDropWell;
m_lstWellSys[i]->m_nWellRadius = dlg.m_lstWellSys[i]->m_nWellRadius;
m_lstWellSys[i]->m_nGroundEle = dlg.m_lstWellSys[i]->m_nGroundEle;
m_lstWellSys[i]->m_nSpare = dlg.m_lstWellSys[i]->m_nSpare;
m_lstWellOld[i]->m_nDownEle = m_lstWellSys[i]->m_nDownEle;
m_lstWellOld[i]->m_bIsDropWell = m_lstWellSys[i]->m_bIsDropWell;
}
}
OnButtonCalc();
//UpdateGrid();
}
void CWellCalcSettingDlg::OnBtnLengthType()
{
CWnd *pWnd = GetDlgItem(IDC_BTN_MENU);
if (pWnd == NULL)
{
return;
}
CRect rc;
pWnd->GetWindowRect(rc);
if (m_pMenuLength == NULL)
{
m_pMenuLength = new CMenu;
m_pMenuLength->CreatePopupMenu();
}
else
{
m_pMenuLength->DestroyMenu();
m_pMenuLength->CreatePopupMenu();
}
m_pMenuLength->AppendMenu((m_iLengthType == 0) ? MF_CHECKED : MF_UNCHECKED, nMenuTypeId + 1, _T("表格中管长按实际显示"));
m_pMenuLength->AppendMenu((m_iLengthType == 1) ? MF_CHECKED : MF_UNCHECKED, nMenuTypeId + 2, _T("表格中管长0.5米模数显示"));
m_pMenuLength->AppendMenu((m_iLengthType == 2) ? MF_CHECKED : MF_UNCHECKED, nMenuTypeId + 3, _T("表格中管长1.0米模数显示"));
m_pMenuLength->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
rc.left, rc.bottom, this, &rc);
}
void CWellCalcSettingDlg::OnButtonShow()
{
CWnd *pWnd = GetDlgItem(IDC_BUTTON_SHOW);
if (pWnd == NULL)
{
return;
}
CRect rc;
pWnd->GetWindowRect(rc);
if (m_pMenu == NULL)
{
m_pMenu = new CMenu;
m_pMenu->CreatePopupMenu();
}
else
{
m_pMenu->DestroyMenu();
m_pMenu->CreatePopupMenu();
}
m_pMenu->AppendMenu(m_mapCheck[nMenuId + 1] ? MF_CHECKED : MF_UNCHECKED, nMenuId + 1, _T("给水管"));
m_pMenu->AppendMenu(m_mapCheck[nMenuId + 2] ? MF_CHECKED : MF_UNCHECKED, nMenuId + 2, _T("污水管"));
m_pMenu->AppendMenu(m_mapCheck[nMenuId + 3] ? MF_CHECKED : MF_UNCHECKED, nMenuId + 3, _T("废水管"));
m_pMenu->AppendMenu(m_mapCheck[nMenuId + 4] ? MF_CHECKED : MF_UNCHECKED, nMenuId + 4, _T("雨水管"));
m_pMenu->AppendMenu(m_mapCheck[nMenuId + 5] ? MF_CHECKED : MF_UNCHECKED, nMenuId + 5, _T("中水管"));
m_pMenu->AppendMenu(m_mapCheck[nMenuId + 6] ? MF_CHECKED : MF_UNCHECKED, nMenuId + 6, _T("消防管"));
m_pMenu->AppendMenu(m_mapCheck[nMenuId + 7] ? MF_CHECKED : MF_UNCHECKED, nMenuId + 7, _T("其他管"));
m_pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
rc.left, rc.bottom, this, &rc);
}
BOOL CWellCalcSettingDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
UINT nID = LOWORD(wParam);
if ((nID > nMenuId + 7 || nID < nMenuId + 1) && (nID > nMenuTypeId + 3 || nID < nMenuTypeId + 1))
{
return CDialog::OnCommand(wParam, lParam);
}
if (m_pMenu != NULL && (nID < nMenuId + 8 && nID > nMenuId))
{
m_mapCheck[nID] = !m_mapCheck[nID];
}
if (m_pMenuLength != NULL && (nID < nMenuTypeId + 4 && nID > nMenuTypeId))
{
m_iLengthType = nID - nMenuTypeId - 1;
}
return CDialog::OnCommand(wParam, lParam);
}
void CWellCalcSettingDlg::InitMapData()
{
m_mapCheck.insert(std::make_pair(nMenuId + 1, true));
m_mapCheck.insert(std::make_pair(nMenuId + 2, true));
m_mapCheck.insert(std::make_pair(nMenuId + 3, true));
m_mapCheck.insert(std::make_pair(nMenuId + 4, true));
m_mapCheck.insert(std::make_pair(nMenuId + 5, true));
m_mapCheck.insert(std::make_pair(nMenuId + 6, true));
m_mapCheck.insert(std::make_pair(nMenuId + 7, true));
}
void CWellCalcSettingDlg::GetShowPipeData(std::map<TPipeSys::SysType, bool> &data)
{
data.clear();
data[TPipeSys::kFeedWater] = m_mapCheck[nMenuId + 1];
data[TPipeSys::kDirtWater] = m_mapCheck[nMenuId + 2];
data[TPipeSys::kUselessWater] = m_mapCheck[nMenuId + 3];
data[TPipeSys::kRainWater] = m_mapCheck[nMenuId + 4];
data[TPipeSys::kUsedWater] = m_mapCheck[nMenuId + 5];
data[TPipeSys::kFireFighting] = m_mapCheck[nMenuId + 6];
data[TPipeSys::kOther] = m_mapCheck[nMenuId + 7];
}
void CWellCalcSettingDlg::SetShowPipeData(std::map<TPipeSys::SysType, bool> &data)
{
m_mapCheck[nMenuId + 1] = data[TPipeSys::kFeedWater];
m_mapCheck[nMenuId + 2] = data[TPipeSys::kDirtWater];
m_mapCheck[nMenuId + 3] = data[TPipeSys::kUselessWater];
m_mapCheck[nMenuId + 4] = data[TPipeSys::kRainWater];
m_mapCheck[nMenuId + 5] = data[TPipeSys::kUsedWater];
m_mapCheck[nMenuId + 6] = data[TPipeSys::kFireFighting];
m_mapCheck[nMenuId + 7] = data[TPipeSys::kOther];
}
void CWellCalcSettingDlg::ReadWriteScaleFromRegedit(BOOL bRead)
{
CString sXScale, sYScale;
if (GlobalFunc::DocGetMeterUnitDraw())
{
sXScale = _T("XScaleM");
sYScale = _T("YScaleM");
}
else
{
sXScale = _T("XScaleMM");
sYScale = _T("YScaleMM");
}
//CRegProperty regProp(GetRegLocation(), _T("VerticalSection"));
//regProp.SetTopRootKey(HKEY_CURRENT_USER);
//if (bRead)
//{
// if (!regProp.GetValue(sXScale, m_iX))
// {
// m_iX = static_cast<int>(GlobalFunc::DocGetPScale());
// if (GlobalFunc::DocGetMeterUnitDraw())
// {
// m_iX *= 1000;
// }
// }
// if (!regProp.GetValue(sYScale, m_iY))
// {
// m_iY = 50;
// }
//}
//else
//{
// regProp.SetValue(sXScale, m_iX);
// regProp.SetValue(sYScale, m_iY);
//}
}
void CWellCalcSettingDlg::EditVerticalSection(BOOL bEdit)
{
m_bEdit = bEdit;
}
void CWellCalcSettingDlg::SetListAll(SSearchPipeList *pList)
{
m_pListAll = pList;
}