#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 #include #include "DbStake.h" #include #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 &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 &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 &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 &lstWellSys, int iScaleX, int iScaleY, double nGridScale, int iMode, double nDeepStart) cet 2011.6.3 modify 添加控制是否显示碰撞标高 //void DrawVerticalSection(DList &lstWellSys, int iScaleX, int iScaleY, double nGridScale, int iMode, double nDeepStart, bool bDimEle) // cet 2011.12.5 modify 添加控制交叉管是否显示 //void DrawVerticalSection(DList &lstWellSys, int iScaleX, int iScaleY, double nGridScale, int iMode, double nDeepStart, bool bDimEle, const std::map &data)// zxl 2013.12.10 modify void DrawVerticalSection(DList &lstWellSys, int iScaleX, int iScaleY, double nGridScale, int iMode, double nDeepStart, bool bDimEle, bool bDimDist, const std::map &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::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 &lstWellSys, int iScaleX, int iScaleY, double nGridScale, double nDeepStart, bool bDimEle, bool bDimDist, const std::map &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::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 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(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 &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 &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 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::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::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 &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 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 &arStake, AcDbCurve * pCurve) { std::vector 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::iterator itHead = PtOnStakeVector.begin(); std::vector::iterator itTail = PtOnStakeVector.end(); std::sort(itHead, itTail, GreaterByParm); itHead = PtOnStakeVector.begin(); itTail = PtOnStakeVector.end(); arStake.setLogicalLength(0); std::vector::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 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 &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 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 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(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::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 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 &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 &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(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; }