Files
envi-code/SourceCode/Code2026/Dimension/WellCalcSettingDlg.cpp
T
2026-09-28 15:28:50 +08:00

2845 lines
81 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
}