#include "stdafx.h" #include "AcDbObjectPtr.h" #include "globalFunc.h" #include "ElevationCalc.h" #include "DbVerticalSectionFeed.h" #include "DbWell.h" #include "DbStake.h" #include "VerticalSectionFeedDlg.h" #include "WellCalcModifyEleDlg.h" #include "PickEntSet.h" #include "layerdef.h" extern BOOL SearchOutdoorWell(Entity ent, Entity entEnd, SSearchPipeList *pListAll, PickSet &ssAll, BOOL bFeedSys); //extern void DrawVerticalSectionFeed(DList &lstWellSys, int iScaleX, int iScaleY, double nGridScale, double nDeepStart); extern void DrawVerticalSectionFeed(DList &lstWellSys, int iScaleX, int iScaleY, double nGridScale, double nDeepStart, bool bDimEle, bool bDimDist, const std::map &data); extern void SetPipeLabelType(CDbPipe *pPipe); //*************************************************************************************************** // 编辑给水纵断 //*************************************************************************************************** int EditVerticalSectionFeed(AcDbObjectId id) { if (!id) return RTERROR; CTemporaryResourceOverride vTemp; CVerticalSectionFeedDlg dlg(1); // zxl 2013.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; // DList lstWellSys; OPENOBJ_BEGIN(id, AcDb::kForRead, CDbVerticalSectionFeed, pVS); if (pVS) { dlg.m_bDimEle = pVS->IsDimEle(); dlg.m_bDimDist = pVS->IsDimDist(); dlg.m_csSheetHead = pVS->GetSheetHead(); // zxl 2012.08.20 add pVS->GetWellDatas(dlg.m_lstFeedWellSys); dlg.m_iX = pVS->GetScaleX(); dlg.m_iY = pVS->GetScaleY(); 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; // zxl 2013.12.5 add std::map::iterator it; for (it = data.begin(); it != data.end(); it++) { (*it).second = pVS->IsShowCrossPipe(it->first); } } OPENOBJ_END(); // dlg.GetFeedWellListData(lstWellSys, dlg.m_lstFeedWellSys); OPENOBJ_BEGIN(dlg.m_lstFeedWellSys[0]->m_ID, AcDb::kForRead, AecXDbWell, pWell); if (!pWell) { g_Option::instance().adsout << _T("\n平面图信息已经丢失!请确认平面图和纵断面图在一张DWG中。"); return RTERROR; } OPENOBJ_END(); dlg.SetShowPipeData(data);// zxl 2013.12.5 add if (dlg.DoModal() == IDOK) { // lstWellSys.Reset(); // dlg.GetRainWellListData(lstWellSys, dlg.m_lstFeedWellSys); dlg.GetShowPipeData(data);// zxl 2013.12.5 add OPENOBJ_BEGIN(id, AcDb::kForWrite, CDbVerticalSectionFeed, 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_lstFeedWellSys); pVS->SetScaleX(dlg.m_iX); pVS->SetScaleY(dlg.m_iY); pVS->Calc(); // zxl 2013.12.5 add pVS->SetDimEle(dlg.m_bDimEle ? true : false); pVS->SetDimDist(dlg.m_bDimDist ? true : false); std::map::iterator it; for (it = data.begin(); it != data.end(); it++) { pVS->SetShowCrossPipe(it->first, it->second); } } OPENOBJ_END(); } return 1; } //*************************************************************************************************** // 给水纵断 //*************************************************************************************************** void VerticalSectionFeed(Entity entStartWell) { Entity entEndWell; RBList rbMask(RTDXF0, _T("AEC_ZT_WELL"), 8, LAY_WELL_FEED, NULL); GlobalFunc::SelectEntity(_T("\n请选择终止井:<自动搜索>"), entEndWell, rbMask); SSearchPipeList *pListAll = new SSearchPipeList(); PickSet ssAll(SS_FREE); ssAll += entStartWell; if (!SearchOutdoorWell(entStartWell, entEndWell, pListAll, ssAll, TRUE)) { delete pListAll; return; } if (ssAll.Length() < 3) { AfxMessageBox(_T("系统数据不全, 请检查管线是否标注管径, 管线流动方向是否不一致!")); delete pListAll; return; } actrTransactionManager->flushGraphics(); //acad 刷新 ssAll.Redraw(3); long len = ssAll.Length(); TCHAR szTmp[256]; int rett = ads_getstring(NULL, _T("\n需要计算的管网系统已高亮显示:<计算>"), szTmp); if (rett == RTCAN) { ssAll.Redraw(4); delete pListAll; return; } CTemporaryResourceOverride vTemp; CVerticalSectionFeedDlg dlg(0); double dDeep(1); if (fabs(pListAll->m_nStartPress) < 0.0001) {//没有进行过计算 ads_getreal(_T("\n请输入覆土厚度<1米>:"), &dDeep); } else dDeep = 0; BOOL bRet = dlg.GetFeedWellListData(pListAll, dlg.m_lstFeedWellSys); if (!bRet) { AfxMessageBox(_T("2管线相交,系统要求必须有井或节点!")); delete pListAll; //删除链头 ssAll.Redraw(4); return; } delete pListAll; //删除链头 dlg.GetWellEleInfo(dlg.m_lstFeedWellSys, dDeep); dlg.m_ssAll += ssAll; dlg.DoModal(); ssAll.Redraw(4); return; } ///////////////////////////////////////////////////////////////////////////// // CVerticalSectionFeedDlg dialog const UINT nMenuId = 100; // zxl 2013.12.5 add const UINT nMenuTypeId = 1000; // zxl 2013.12.5 add int CVerticalSectionFeedDlg::m_iLengthType = 0;// zxl 2013.12.5 add CVerticalSectionFeedDlg::CVerticalSectionFeedDlg(int mode, CWnd* pParent /*=NULL*/) : CDialog(CVerticalSectionFeedDlg::IDD, pParent), m_ssAll(SS_FREE) { //{{AFX_DATA_INIT(CVerticalSectionFeedDlg) m_iGridScale = 0; m_csX = _T("100"); m_csY = _T("50"); m_csText = _T("覆土厚度(m)"); m_iType = 1; m_csSheetHead = _T(""); //}}AFX_DATA_INIT m_iOpenMode = mode; // zxl 2013.12.5 add m_bDimEle = FALSE; m_bDimDist = FALSE; InitMapData(); m_pMenu = NULL; m_pMenuLength = NULL; } void CVerticalSectionFeedDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CVerticalSectionFeedDlg) DDX_CBIndex(pDX, IDC_COMBO_GRID, m_iGridScale); DDX_CBString(pDX, IDC_COMBO_X, m_csX); DDX_CBString(pDX, IDC_COMBO_Y, m_csY); DDX_Text(pDX, IDC_STATIC_TEXT, m_csText); DDX_Radio(pDX, IDC_RADIO_TYPE, m_iType); DDX_Check(pDX, IDC_CHECK_DIMELE, m_bDimEle); DDX_Check(pDX, IDC_CHECK_DIMDIST, m_bDimDist); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CVerticalSectionFeedDlg, CDialog) //{{AFX_MSG_MAP(CVerticalSectionFeedDlg) //ON_BN_CLICKED(IDC_BUTTON_TODWG, OnButtonTodwg) ON_BN_CLICKED(IDC_RADIO_TYPE, OnRadioType) ON_BN_CLICKED(IDC_RADIO_TYPE2, OnRadioType2) ON_BN_CLICKED(IDC_BUTTON_MODIFYELE, OnButtonModifyele) ON_BN_CLICKED(IDC_BUTTON_SHOW, OnButtonShow) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CVerticalSectionFeedDlg message handlers BOOL CVerticalSectionFeedDlg::OnInitDialog() { CDialog::OnInitDialog(); if (m_iOpenMode == 1) {//编辑对话框 CWnd *pWnd2 = GetDlgItem(IDOK); pWnd2->SetWindowText(_T("更新")); } // m_csText = "覆土厚度(m)"; // UpdateData(FALSE); m_grid.Clear(); m_grid.Create(this, IDC_LIST_PIPE); m_grid.AppendCol(_T("起点"), 40); m_grid.AppendCol(_T("终点"), 40); m_grid.AppendCol(_T("管长m"), 66); m_grid.AppendCol(_T("管径mm"), 66); m_grid.AppendCol(_T("起点"), 60); m_grid.AppendCol(_T("终点"), 60); m_grid.AppendCol(_T("起点"), 60); m_grid.AppendCol(_T("终点"), 60); COLORREF color = RGB(255, 0, 0); m_grid.GetCol(3).SetTextColor(color); // m_grid.GetCol(4).SetTextColor(color); // m_grid.GetCol(5).SetTextColor(color); m_grid.GetCol(6).SetTextColor(color); m_grid.GetCol(7).SetTextColor(color); m_grid.GetCol(0).SetReadOnly(); m_grid.GetCol(1).SetReadOnly(); m_grid.GetCol(2).SetReadOnly(); m_grid.GetCol(4).SetReadOnly(); m_grid.GetCol(5).SetReadOnly(); m_grid.FitLastCol(); m_grid.SetNoAppendButton(TRUE); m_grid.SetNoDefaultMenu(true); UpdateGrid(); if (m_iOpenMode == 1) {//编辑对话框 m_csX.Format(_T("%d"), m_iX); m_csY.Format(_T("%d"), m_iY); UpdateData(FALSE); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CVerticalSectionFeedDlg::OnRadioType() { UpdateData(TRUE); m_csText = "管中标高(m)"; UpdateData(FALSE); UpdateGrid(); } void CVerticalSectionFeedDlg::OnRadioType2() { UpdateData(TRUE); m_csText = "覆土厚度(m)"; UpdateData(FALSE); UpdateGrid(); } void CVerticalSectionFeedDlg::GetWellEleInfo(DList &lstWellSys, double dDeep) { for (int i = 1; i < lstWellSys.Length(); i++) { if (lstWellSys[i]->m_bIsWell) { //井 CString csName1 = lstWellSys[i - 2]->m_csName; CString csName2 = lstWellSys[i]->m_csName; if (csName1 == _T("") || csName2 == _T("")) { break; } CString csName = csName1 + csName2; if (dDeep > 0.001) { double dDn = (double)lstWellSys[i - 1]->m_iDn / 2000.0; double dFrontEle = lstWellSys[i]->m_nUpEle - dDeep - dDn; lstWellSys[i]->m_nFrondDownEle = dFrontEle; } else { AcDbObjectId id = lstWellSys[i]->m_ID; OPENOBJ_BEGIN(id, AcDb::kForWrite, AecXDbWell, pEquip); if (pEquip) { int num = pEquip->GetInterfaceNum(); for (int m = 0; m < num; m++) { CPipeInterface iFace; pEquip->GetInterface(m, iFace); AcDbObjectId idPipe = iFace.m_idPipe; CString csPipeName; OPENOBJ_BEGIN(idPipe, AcDb::kForRead, CDbPipe, pPipe); if (pPipe) { csPipeName = pPipe->GetSysLabel(); } OPENOBJ_END(); CString csLabel = pEquip->GetISysLabel(m); if (csPipeName == csName) lstWellSys[i]->m_nFrondDownEle = _tstof(csLabel); } } OPENOBJ_END(); } } else {//得到管线的详细信息 int len = lstWellSys[i]->m_lstID.Length(); lstWellSys[i]->m_iDn = 0; for (int j = 0; j < len; j++) { AcDbObjectId idPipe = *lstWellSys[i]->m_lstID[j]; OPENOBJ_BEGIN(idPipe, AcDb::kForRead, CDbPipe, pPipe); if (pPipe) { int iDn = (int)pPipe->GetDnDiameter(); lstWellSys[i]->m_iDn = iDn; double dPipeLen = pPipe->Length(); lstWellSys[i]->m_nLength += dPipeLen; } OPENOBJ_END(); } // if(!GlobalFunc::DocGetMeterUnitDraw()) // lstWellSys[i]->m_nLength = lstWellSys[i]->m_nLength/1000; } } for (i = 0; i < lstWellSys.Length() - 1; i++) { if (lstWellSys[i]->m_bIsWell) { //井 CString csName1 = lstWellSys[i]->m_csName; CString csName2 = lstWellSys[i + 2]->m_csName; if (csName1 == _T("") || csName2 == _T("")) { break; } CString csName = csName1 + csName2; if (dDeep > 0.001) { double dDn = (double)lstWellSys[i + 1]->m_iDn / 2000.0; double dFrontEle = lstWellSys[i]->m_nUpEle - dDeep - dDn; lstWellSys[i]->m_nDownEle = dFrontEle; } else { AcDbObjectId id = lstWellSys[i]->m_ID; OPENOBJ_BEGIN(id, AcDb::kForWrite, AecXDbWell, pEquip); if (pEquip) { int num = pEquip->GetInterfaceNum(); for (int m = 0; m < num; m++) { CPipeInterface iFace; pEquip->GetInterface(m, iFace); AcDbObjectId idPipe = iFace.m_idPipe; CString csPipeName; OPENOBJ_BEGIN(idPipe, AcDb::kForRead, CDbPipe, pPipe); if (pPipe) { csPipeName = pPipe->GetSysLabel(); } OPENOBJ_END(); CString csLabel = pEquip->GetISysLabel(m); if (csPipeName == csName) lstWellSys[i]->m_nDownEle = _tstof(csLabel); } } OPENOBJ_END(); } } } } // 已知管线系统链表pListAll, 返回给水系统链表lstWellSys, 如果 dDeep>0, 则作为默认覆土厚度 BOOL CVerticalSectionFeedDlg::GetFeedWellListData(SSearchPipeList *pListAll, DList &lstWellSys) { BOOL bRet = TRUE; while (1) { TFeedWellData *pNewList = new TFeedWellData(); if (pListAll->m_iType == 3) { //井 pNewList->m_bIsWell = TRUE; AcDbObjectId id = pListAll->m_ID; ads_name ent; acdbGetAdsName(ent, id); CString csWellRadius = GlobalFunc::ReadXdata(ent, _T("TG-WELL-RADIUS")); pNewList->m_nWellRadius = _tstof(csWellRadius) / 2.0; //转化为半径 if (pNewList->m_nWellRadius < 0.1) pNewList->m_nWellRadius = 600; pNewList->m_nSpare = 150;//沉沙井 pNewList->m_ID = id; pNewList->m_csName = pListAll->m_csName; pNewList->m_nUpEle = pListAll->m_nDang; //井地面标高 pNewList->m_nDownEle = pListAll->m_nStartPress; //跌水井底标高 pNewList->m_nFrondDownEle = 0; //跌水井底标高 // if(dDeep > 0.0001){ // pNewList->m_nDownEle = pNewList->m_nUpEle - dDeep; // pNewList->m_nFrondDownEle = pNewList->m_nDownEle; // } CString csGroundEle = GlobalFunc::ReadXdata(ent, _T("TG-WELL-GroundEle")); pNewList->m_nGroundEle = _tstof(csGroundEle); if (csGroundEle == "") pNewList->m_nGroundEle = pNewList->m_nUpEle; } else if (pListAll->m_iType == 0) { //管 // pNewList->m_iDn = pListAll->m_iDn; // pNewList->m_nLength = pListAll->m_nLength; // if(!GlobalFunc::DocGetMeterUnitDraw()) pNewList->m_nLength = 0; pNewList->m_bIsWell = FALSE; AcDbSoftPointerId id = pListAll->m_ID; pNewList->m_ID = id;// zxl 2013.12.5 add pNewList->m_lstID.Append(new AcDbSoftPointerId(id)); if (pListAll->m_lstNode.Length() > 1) return FALSE; else if (pListAll->m_lstNode.Length() == 0) break; SSearchPipeList *pList = pListAll->m_lstNode[0]; while (pList->m_iType == -1) {//继续得到下段管线 if (pList->m_lstNode.Length() > 1) return FALSE; else if (pList->m_lstNode.Length() == 0) return FALSE; pList = pList->m_lstNode[0]; if (pList->m_iType == 0) { AcDbSoftPointerId id2 = pList->m_ID; pListAll = pList; pNewList->m_lstID.Append(new AcDbSoftPointerId(id2)); if (pList->m_lstNode.Length() > 1) return FALSE; else if (pList->m_lstNode.Length() == 0) return FALSE; pList = pList->m_lstNode[0]; } else break; } } lstWellSys.Append(pNewList); long len = pListAll->m_lstNode.Length(); if (len > 1) return FALSE; else if (len == 0) break; pListAll = pListAll->m_lstNode[0]; } return bRet; } void CVerticalSectionFeedDlg::UpdateGrid() { m_grid.Clear(); int idx = 0; for (int i = 0; i < m_lstFeedWellSys.Length() - 1; i++) { if (m_lstFeedWellSys[i]->m_bIsWell) { //井 if (i == m_lstFeedWellSys.Length() - 2) break; CString csName1 = m_lstFeedWellSys[i]->m_csName; CString csName2 = m_lstFeedWellSys[i + 2]->m_csName; double dDn = m_lstFeedWellSys[i + 1]->m_iDn; if (csName1 == _T("") || csName2 == _T("")) { MessageBox(_T("请检查井是否都编号。")); break; } m_grid.AppendRow(); m_grid.GetCell(idx, 0).SetText(csName1); m_grid.GetCell(idx, 1).SetText(csName2); double nEle = m_lstFeedWellSys[i]->m_nUpEle; double nDownEle = m_lstFeedWellSys[i]->m_nDownEle; if (m_iType == 1) { nDownEle = nEle - nDownEle - dDn / 2000.0; } CString csWellUpEle, csDeep, csDownEle, csWellUpEle2, csDeep2, csDownEle2; csDownEle.Format(_T("%.3f"), nDownEle); csWellUpEle.Format(_T("%.3f"), nEle); nEle = m_lstFeedWellSys[i + 2]->m_nUpEle; nDownEle = m_lstFeedWellSys[i + 2]->m_nFrondDownEle; if (m_iType == 1) { nDownEle = nEle - nDownEle - dDn / 2000.0; } csDownEle2.Format(_T("%.3f"), nDownEle); csWellUpEle2.Format(_T("%.3f"), nEle); m_grid.GetCell(idx, 4).SetText(csWellUpEle); m_grid.GetCell(idx, 5).SetText(csWellUpEle2); m_grid.GetCell(idx, 6).SetText(csDownEle); m_grid.GetCell(idx, 7).SetText(csDownEle2); } else { //管 if (i == m_lstFeedWellSys.Length() - 1) continue; int iDn = m_lstFeedWellSys[i]->m_iDn; CString csDn, csPipeLen; if (iDn > 0) csDn.Format(_T("%d"), iDn); csPipeLen.Format(_T("%.2f"), m_lstFeedWellSys[i]->m_nLength); m_grid.GetCell(idx, 2).SetText(csPipeLen); m_grid.GetCell(idx, 3).SetText(csDn); idx++; } } } void CVerticalSectionFeedDlg::OnOK() { UpdateData(TRUE); double dDeep(0); 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(); csName = csName1 + csName2; if (csName == _T("")) break; CString csUpEle = (LPCTSTR)(*pRow)[4].GetText(); CString csDownEle = (LPCTSTR)(*pRow)[6].GetText(); CString csUpEle2 = (LPCTSTR)(*pRow)[5].GetText(); CString csDownEle2 = (LPCTSTR)(*pRow)[7].GetText(); double dDownEle1 = _tstof(csDownEle); double dDownEle2 = _tstof(csDownEle2); double dUpEle1 = _tstof(csUpEle); double dUpEle2 = _tstof(csUpEle2); if (m_iType == 1) {//把覆土厚度换算为管中标高 dDownEle1 = dUpEle1 - dDownEle1 - _tstof(csDn) / 2000.0; dDownEle2 = dUpEle2 - dDownEle2 - _tstof(csDn) / 2000.0; } for (int i = 0; i < m_lstFeedWellSys.Length(); i++) { if (!m_lstFeedWellSys[i]->m_bIsWell) { CString csNameF = m_lstFeedWellSys[i - 1]->m_csName; CString csNameB = m_lstFeedWellSys[i + 1]->m_csName; if (csName == csNameF + csNameB) { m_lstFeedWellSys[i]->m_iDn = _ttoi(csDn); for (int m = 0; m < m_lstFeedWellSys[i]->m_lstID.Length(); m++) { OPENOBJ_BEGIN(*m_lstFeedWellSys[i]->m_lstID[m], AcDb::kForWrite, CDbPipe, pPipe); if (pPipe) { pPipe->SetSysLabel(csName); } OPENOBJ_END(); } } } else { m_lstFeedWellSys[i]->m_bIsDropWell = TRUE; if (m_lstFeedWellSys[i]->m_csName == csName1) { m_lstFeedWellSys[i]->m_nUpEle = dUpEle1; m_lstFeedWellSys[i]->m_nDownEle = dDownEle1; } else if (m_lstFeedWellSys[i]->m_csName == csName2) { m_lstFeedWellSys[i]->m_nUpEle = dUpEle2; m_lstFeedWellSys[i]->m_nFrondDownEle = dDownEle2; if (i == m_lstFeedWellSys.Length() - 1) m_lstFeedWellSys[i]->m_nDownEle = dDownEle2; } } } } OnButtonTodwg(); m_iX = _ttoi(m_csX); m_iY = _ttoi(m_csY); ResetWellStake();// zxl 2012.08.20 add if (m_iOpenMode == 1) { CDialog::OnOK(); return; } if (m_lstFeedWellSys.Length() < 2) return; if (m_iX < 1 || m_iY < 1) return; dDeep = m_lstFeedWellSys[0]->m_nUpEle - m_lstFeedWellSys[0]->m_nDownEle; 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; CDialog::OnOK(); // DList lstWellSys; // GetRainWellListData(lstWellSys, m_lstFeedWellSys); // zxl 2013.12.5 modify //DrawVerticalSectionFeed(m_lstFeedWellSys, m_iX, m_iY, nGridScale, dDeep); std::map data; GetShowPipeData(data); DrawVerticalSectionFeed(m_lstFeedWellSys, m_iX, m_iY, nGridScale, dDeep, m_bDimEle ? true : false, m_bDimDist ? true : false, data); } void CVerticalSectionFeedDlg::OnButtonTodwg() { UpdateData(TRUE); if (m_lstFeedWellSys.Length() < 3) return; GlobalFunc::HideDialog(this, TRUE); for (int i = 0; i < m_lstFeedWellSys.Length(); i++) { if (m_lstFeedWellSys[i]->m_bIsWell) { //井 AcDbObjectId id = m_lstFeedWellSys[i]->m_ID; XPoint ptLoc; CString csEleLow, csEleUp; csEleLow.Format(_T("%.2f"), m_lstFeedWellSys[i]->m_nDownEle); csEleUp.Format(_T("%.2f"), m_lstFeedWellSys[i]->m_nUpEle); ads_name ent; acdbGetAdsName(ent, id); GlobalFunc::WriteXdata(ent, _T("TG-WELL-GroundEle"), XString(_T("%.3f"), m_lstFeedWellSys[i]->m_nGroundEle)); // cet 2012.6.6 add 更新井半径 CString strWellRadius; strWellRadius.Format(_T("%f"), m_lstFeedWellSys[i]->m_nWellRadius * 2); GlobalFunc::WriteXdata(ent, _T("TG-WELL-RADIUS"), strWellRadius); OPENOBJ_BEGIN(id, AcDb::kForWrite, AecXDbWell, pEquip); if (pEquip) { pEquip->SetDropWell(TRUE); double nPipeDownEle = m_lstFeedWellSys[i]->m_nFrondDownEle; double nPipeDownEle2 = m_lstFeedWellSys[i]->m_nDownEle; if (i > 1) { //设置前管道 管底标高 int lenPipe = m_lstFeedWellSys[i - 1]->m_lstID.Length(); AcDbObjectId idPipe = *m_lstFeedWellSys[i - 1]->m_lstID[lenPipe - 1]; pEquip->SetPipeEndEle(idPipe, XString(_T("%.3f"), m_lstFeedWellSys[i]->m_nFrondDownEle)); } if (i < m_lstFeedWellSys.Length() - 1) { //设置后管道 管底标高 AcDbObjectId idPipe = *m_lstFeedWellSys[i + 1]->m_lstID[0]; pEquip->SetPipeEndEle(idPipe, XString(_T("%.3f"), m_lstFeedWellSys[i]->m_nDownEle)); } ptLoc = pEquip->GetLocation(); //搜索这个井其他连接管,最低标高才是井标高 int num = pEquip->GetInterfaceNum(); double nEleOther = m_lstFeedWellSys[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 (fabs(nEleOther - m_lstFeedWellSys[i]->m_nDownEle) < 0.001) pEquip->SetWellEleDown(m_lstFeedWellSys[i]->m_nDownEle); pEquip->SetWellEleUp(m_lstFeedWellSys[i]->m_nUpEle); } OPENOBJ_END(); } else { int iDn = m_lstFeedWellSys[i]->m_iDn; double nEleDown = m_lstFeedWellSys[i - 1]->m_nDownEle; double nEleDown2 = m_lstFeedWellSys[i + 1]->m_nFrondDownEle; double dPipeAllLen = m_lstFeedWellSys[i]->m_nLength; double dI = (nEleDown - nEleDown2) / dPipeAllLen; double dCurEle = nEleDown; AcDbObjectIdArray idArray; for (int m = 0; m < m_lstFeedWellSys[i]->m_lstID.Length(); m++) { ads_name ent; BOOL bDrawLabel = FALSE;// zxl 2012.12.26 add 记录初始设置 acdbGetAdsName(ent, *m_lstFeedWellSys[i]->m_lstID[m]); OPENOBJ_BEGIN(ent, AcDb::kForWrite, CDbPipe, pPipe); if (pPipe) { pPipe->SetDnDiameter(iDn); double dPipeLen = pPipe->Length(); // if(!GlobalFunc::DocGetMeterUnitDraw()) // dPipeLen = dPipeLen/1000; double dLastEnd = dCurEle - dI * dPipeLen; XPoint pt1(pPipe->GetStartPoint()), pt2(pPipe->GetEndPoint()); if (GlobalFunc::DocGetMeterUnitDraw()) {//米 if (pPipe->GetFlowDir() == TPipeSys::kFromStart) { pt1.z = dCurEle; pt2.z = dLastEnd; } else { pt2.z = dCurEle; pt1.z = dLastEnd; } } else { if (pPipe->GetFlowDir() == TPipeSys::kFromStart) { pt1.z = dCurEle * 1000; pt2.z = dLastEnd * 1000; } else { pt2.z = dCurEle * 1000; pt1.z = dLastEnd * 1000; } } // if(pPipe->GetFlowDir() == TPipeSys::kFromStart){ // pt1.z = dCurEle*1000; // pt2.z = dLastEnd*1000; // } // else{ // pt2.z = dCurEle*1000; // pt1.z = dLastEnd*1000; // } pPipe->SetStartPoint(pt1); pPipe->SetEndPoint(pt2); // cet 2011.8.30 modify // pPipe->SetSpare((double)g_iDimPipeGradientType); if (!pPipe->IsDrawLabel()) { SetPipeLabelType(pPipe); } bDrawLabel = pPipe->IsDrawLabel();// zxl 2012.12.26 add dCurEle = dLastEnd; ////////////////////////////////////////////////////////////////// //还要考虑支管的标高也要同时改变 sr 2008-7-8 AcDbObjectId idNode1 = pPipe->GetNode(0); AcDbObjectId idNode2 = pPipe->GetNode(1); AppendIdArray(idArray, idNode1); AppendIdArray(idArray, idNode2); XPoint pt3, pt4; pt3 = pt1; pt3.z = 0; pt4 = pt2; pt4.z = 0; //先把节点附件的标高改过来 //OPENOBJ_BEGIN(idNode1, AcDb::kForWrite, CDbPipeFitting, pNode); //if (pNode) { // XPoint ptLoc = pNode->GetLocation(); // ptLoc.z = 0; // if (ptLoc == pt3) // pNode->SetLocation(pt1); // else if (ptLoc == pt4) // pNode->SetLocation(pt2); //} //OPENOBJ_END(); //OPENOBJ_BEGIN(idNode2, AcDb::kForWrite, CDbPipeFitting, pNode); //if (pNode) { // XPoint ptLoc = pNode->GetLocation(); // ptLoc.z = 0; // if (ptLoc == pt3) // pNode->SetLocation(pt1); // else if (ptLoc == pt4) // pNode->SetLocation(pt2); //} //OPENOBJ_END(); } OPENOBJ_END(); // 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(); } //处理节点里面的支管标高, 如果节点所连接管线端点标高不等于节点标高,就把它改过来 for (int j = 0; j < idArray.length(); j++) { AcDbObjectId idTmp = idArray[j]; //OPENOBJ_BEGIN(idTmp, AcDb::kForRead, CDbPipeFitting, pNode); //if (pNode) { // int num = pNode->GetInterfaceNum(); // XPoint ptLoc = pNode->GetLocation(); // XPoint ptLoc2 = ptLoc; // ptLoc2.z = 0; // for (int k = 0; k < num; k++) { // CPipeInterface iFace; // pNode->GetInterface(k, iFace); // AcDbObjectId nextPipeId = iFace.m_idPipe; // OPENOBJ_BEGIN(nextPipeId, AcDb::kForRead, CDbPipe, pPipe); // if (pPipe) { // XPoint ptS = pPipe->StartPoint(); // XPoint ptE = pPipe->EndPoint(); // if (ptS == ptLoc || ptE == ptLoc) // continue; // ptS.z = 0; // ptE.z = 0; // if (pPipe->upgradeOpen() == Acad::eOk) { // if (ptS == ptLoc2) // pPipe->SetStartPoint(ptLoc); // else if (ptE == ptLoc2) // pPipe->SetEndPoint(ptLoc); // pPipe->downgradeOpen(); // } // } // OPENOBJ_END(); // } //} //OPENOBJ_END(); } } } actrTransactionManager->flushGraphics(); //acad 刷新 GlobalFunc::UpdateMultDim(); // ads_getstring(NULL, _T("\n按任意键返回对话框:<返回>"), szTmp); GlobalFunc::HideDialog(this, FALSE); } BOOL CVerticalSectionFeedDlg::AppendIdArray(AcDbObjectIdArray &idArray, AcDbObjectId id) { BOOL bFlag = FALSE; //OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPipeFitting, pNode); //if (pNode) { // if (pNode->GetInterfaceNum() > 2) // bFlag = TRUE; //} //OPENOBJ_END(); if (!bFlag) return FALSE; int len = idArray.length(); for (int i = 0; i < len; i++) { AcDbObjectId idTmp = idArray[i]; if (idTmp == id) return FALSE; } idArray.append(id); return TRUE; } void CVerticalSectionFeedDlg::OnButtonModifyele() { CTemporaryResourceOverride vTemp; CWellCalcModifyEleDlg dlg(1); for (int i = 0; i < m_lstFeedWellSys.Length(); i++) { TFeedWellData *pList = new TFeedWellData(); pList->m_bIsWell = m_lstFeedWellSys[i]->m_bIsWell; pList->m_nGroundEle = m_lstFeedWellSys[i]->m_nGroundEle; pList->m_bIsDropWell = m_lstFeedWellSys[i]->m_bIsDropWell;; pList->m_csName = m_lstFeedWellSys[i]->m_csName; pList->m_nUpEle = m_lstFeedWellSys[i]->m_nUpEle; pList->m_nDownEle = m_lstFeedWellSys[i]->m_nDownEle; pList->m_nWellRadius = m_lstFeedWellSys[i]->m_nWellRadius; pList->m_nSpare = m_lstFeedWellSys[i]->m_nSpare; dlg.m_lstFeedWellSys.Append(pList); } if (dlg.DoModal() == IDOK) { for (int i = 0; i < m_lstFeedWellSys.Length(); i++) { m_lstFeedWellSys[i]->m_nUpEle = dlg.m_lstFeedWellSys[i]->m_nUpEle; m_lstFeedWellSys[i]->m_nWellRadius = dlg.m_lstFeedWellSys[i]->m_nWellRadius; m_lstFeedWellSys[i]->m_nGroundEle = dlg.m_lstFeedWellSys[i]->m_nGroundEle; m_lstFeedWellSys[i]->m_nSpare = dlg.m_lstFeedWellSys[i]->m_nSpare; } } if (m_iType == 1) {//如果是覆土厚度,则根据新井面标高,重新计算井低标高 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(); csName = csName1 + csName2; if (csName == _T("")) break; CString csDownEle1 = (LPCTSTR)(*pRow)[6].GetText(); CString csDownEle2 = (LPCTSTR)(*pRow)[7].GetText(); double dDownEle1 = _tstof(csDownEle1); double dDownEle2 = _tstof(csDownEle2); for (int i = 0; i < m_lstFeedWellSys.Length(); i++) { if (m_lstFeedWellSys[i]->m_bIsWell) { if (m_lstFeedWellSys[i]->m_csName == csName1) {//把覆土厚度换算为管中标高 dDownEle1 = m_lstFeedWellSys[i]->m_nUpEle - dDownEle1 - _tstof(csDn) / 2000.0; m_lstFeedWellSys[i]->m_nDownEle = dDownEle1; } else if (m_lstFeedWellSys[i]->m_csName == csName2) { dDownEle2 = m_lstFeedWellSys[i]->m_nUpEle - dDownEle2 - _tstof(csDn) / 2000.0; m_lstFeedWellSys[i]->m_nFrondDownEle = dDownEle2; // if(i == m_lstFeedWellSys.Length()-1) // m_lstFeedWellSys[i]->m_nDownEle = dDownEle2; } } } // dDownEle1 = dUpEle1 - dDownEle1 - _tstof(csDn)/2000.0; // dDownEle2 = dUpEle2 - dDownEle2 - _tstof(csDn)/2000.0; } } UpdateGrid(); } //std::vector 的回调函数 extern bool GreaterByParm(TPtOnStake item1, TPtOnStake item2); //对桩进行排序 extern BOOL SortStakePoints(AcArray &arStake, AcDbCurve * pCurve); //已知桩号数字,返回标注内容, 如:820 返回K0+825 extern CString GetStakeName(double dTextValue, CString sStakePrefix); //更新井的桩号 zxl 2012.08.20 add void CVerticalSectionFeedDlg::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_csVerticalSectionHeadFeed.Find(_T("桩号")) < 0) return; } //1. 得到桩号所经过的路径曲线 CString csStakeHead = _T("K"); Entity entCurve; for (int i = 0; i < m_lstFeedWellSys.Length(); i++) { if (m_lstFeedWellSys[i]->m_bIsWell) { //井 AcDbObjectId id = m_lstFeedWellSys[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(); } //3. 对容器中的桩号,按曲线进行排序(倒序) OPENOBJ_BEGIN(entCurve, AcDb::kForRead, AcDbCurve, pCurve); if (pCurve) { SortStakePoints(arStake2, pCurve); //4. 求每个井的桩号(先投影到曲线上,然后根据前后2桩号,差值求桩号) for (i = 0; i < m_lstFeedWellSys.Length(); i++) { if (m_lstFeedWellSys[i]->m_bIsWell) { //井 AcDbObjectId id = m_lstFeedWellSys[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(); } void CVerticalSectionFeedDlg::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); } } void CVerticalSectionFeedDlg::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 CVerticalSectionFeedDlg::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 CVerticalSectionFeedDlg::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 CVerticalSectionFeedDlg::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 CVerticalSectionFeedDlg::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]; }