// WellEditDlg.cpp : implementation file // #include "stdafx.h" #include "twtdef.h" #include #include "WellEditDlg.h" #include "DbSymbolAnnotate.h" #include "SelectBlkDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //*************************************************************************************************** // 编辑井 //*************************************************************************************************** extern void ChangeWellNameSerial(Entity ent, const TCHAR* szNewName); int EditWell(AcDbObjectId id) { if(!id) return RTERROR; ads_name ent; XPoint ptLoc; double nScale(0), nPoltScale(0); acdbGetAdsName(ent, id); CString csName, csBlkName; CString csEleUp; CString csEleLow, csEleBlk; BOOL bDrawLable(FALSE), bDrop(FALSE), bIsFeed(FALSE); CString csQ = ReadXdata(ent, _T("TG-DIRTWELLQ")); CString csWellRadius = ReadXdata(ent, _T("TG-WELL-RADIUS")); CString csGroundEle = ReadXdata(ent, _T("TG-WELL-GroundEle")); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbWell, pEquip); if(pEquip){ AcDbObjectId eqId = pEquip->GetBlock2d(); csBlkName = GetBlkNameById(eqId); nPoltScale = pEquip->GetPScale(); nScale = pEquip->GetScale(); ptLoc = pEquip->GetLocation(); csName = pEquip->GetWellName(); csEleUp.Format(_T("%.3f"), pEquip->GetWellEleUp()); csEleLow.Format(_T("%.3f"), pEquip->GetWellEleDown()); csEleBlk.Format(_T("%.1f"), pEquip->GetLocation().z/1000); bDrawLable = pEquip->IsDrawLabel(); bDrop = pEquip->IsDropWell(); TCHAR *szLay = pEquip->layer(); CString csLay = szLay; delete [] szLay; if(csLay == LAY_WELL_FEED) bIsFeed = TRUE; } OPENOBJ_END(); RBList rbMaskDim(RTDXF0, _T("ATS_WELLDIM"), NULL); CTemporaryResourceOverride vTemp; CWellEditDlg dlg; dlg.m_csName = csName; dlg.m_csBlkName = csBlkName; dlg.m_csSclae.Format(_T("1:%.0f"), nPoltScale); dlg.m_csEleUp = csEleUp; dlg.m_csEleDown = csEleLow; dlg.m_nScale = nScale; dlg.m_csEleBlk = csEleBlk; dlg.m_dWellRaius = _tstof(csWellRadius); dlg.m_csGroundEle = csGroundEle; dlg.m_id = id; dlg.m_bIsFeed = bIsFeed; dlg.m_bDrop = bDrop; dlg.m_bDrawLable = bDrawLable; dlg.m_nQ = _tstof(csQ); if(dlg.DoModal() != IDOK) return 1; OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbWell, pEquip); if(pEquip){ pEquip->SetBlock2d(GetBlkIdByName(dlg.m_csBlkName)); pEquip->SetScale(dlg.m_nScale); pEquip->SetWellModify(); pEquip->SetWellEleUp(_tstof(dlg.m_csEleUp)); pEquip->SetWellEleDown(_tstof(dlg.m_csEleDown)); pEquip->EnableDrawLabel(dlg.m_bDrawLable); pEquip->SetDropWell(dlg.m_bDrop); XPoint ptLoc = pEquip->GetLocation(); ptLoc.z = _tstof(dlg.m_csEleBlk)*1000; pEquip->SetLocation(ptLoc); pEquip->SetInsert(ptLoc); if(_tcsicmp(_T("$TwtSys$00000389"), dlg.m_csBlkName) == 0 ) pEquip->SetHidePipe(FALSE); else if(_tcsicmp(_T("$TwtSys$00000414"), dlg.m_csBlkName) == 0 || _tcsicmp(_T("$TwtSys$00000336"), dlg.m_csBlkName) == 0){ pEquip->SetHidePipe(TRUE); } else{ pEquip->SetHidePipe(TRUE); // pEquip->SetAngle(0); cet 2010.6.7 del 图块方向发生变化应保持不变 } if(_tcsicmp(_T("$TwtSys$00000336"), dlg.m_csBlkName) != 0 && _tcsicmp(_T("$TwtSys$00000395"), dlg.m_csBlkName) != 0 && _tcsicmp(_T("$TwtSys$00000414"), dlg.m_csBlkName) != 0) pEquip->SetNumber(_T("CIRCLE-0.5")); else pEquip->SetNumber(_T("")); } OPENOBJ_END(); if(dlg.m_nQ > 0){ WriteXdata(ent, _T("TG-DIRTWELLQ"), XString(_T("%.2f"), dlg.m_nQ)); } if(dlg.m_csName != csName){ ChangeWellNameSerial(ent, dlg.m_csName); } WriteXdata(ent, _T("TG-WELL-RADIUS"), XString(_T("%.2f"), dlg.m_dWellRaius)); WriteXdata(ent, _T("TG-WELL-GroundEle"), dlg.m_csGroundEle); PickSet ss2(SS_FREE); XPoint ptUcs = Wcs2Ucs(ptLoc); GetPointPickSet(ptUcs, ss2, rbMaskDim, 50); UpdateGraphic(ss2); return 1; } ///////////////////////////////////////////////////////////////////////////// // CWellEditDlg dialog CWellEditDlg::CWellEditDlg(CWnd* pParent /*=NULL*/) : CDialog(CWellEditDlg::IDD, pParent) { //{{AFX_DATA_INIT(CWellEditDlg) m_nScale = 0.0; m_csName = _T(""); m_csEleUp = _T(""); m_csEleDown = _T(""); m_csSclae = _T(""); m_bDrawLable = FALSE; m_nQ = 0.0; m_bDrop = FALSE; m_csEleBlk = _T(""); m_dWellRaius = 0.0; m_csGroundEle = _T(""); //}}AFX_DATA_INIT m_bIsFeed = FALSE; } void CWellEditDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWellEditDlg) DDX_Text(pDX, IDC_EDIT_DIM, m_nScale); DDX_Text(pDX, IDC_EDIT_NAME, m_csName); DDX_Text(pDX, IDC_EDIT_ELEV, m_csEleUp); DDX_Text(pDX, IDC_EDIT_ELEV2, m_csEleDown); DDX_Text(pDX, IDC_EDIT_SCALEPAPLE, m_csSclae); DDX_Check(pDX, IDC_CHECK_DIM, m_bDrawLable); DDX_Text(pDX, IDC_EDIT_Q, m_nQ); DDX_Check(pDX, IDC_CHECK_DROP, m_bDrop); DDX_Text(pDX, IDC_EDIT_ELEV3, m_csEleBlk); DDX_Text(pDX, IDC_EDIT_WELL_RADIUS, m_dWellRaius); DDX_Text(pDX, IDC_EDIT_GROUNDELE, m_csGroundEle); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CWellEditDlg, CDialog) //{{AFX_MSG_MAP(CWellEditDlg) ON_WM_PAINT() ON_BN_CLICKED(IDC_PREVIEW_WELL, OnPreviewWell) ON_BN_CLICKED(IDC_BUTTON_WELLRADIUS, OnButtonWellradius) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWellEditDlg message handlers void CWellEditDlg::OnPaint() { CPaintDC dc(this); // device context for painting OpenSlide(); } BOOL CWellEditDlg::OnInitDialog() { CDialog::OnInitDialog(); if(m_bIsFeed){ CWnd *pWnd = GetDlgItem(IDC_CHECK_DROP); pWnd->ShowWindow(SW_HIDE); } OpenSlide(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CWellEditDlg::OpenSlide() { UpdateData(TRUE); CWnd *pImageBox1 = GetDlgItem(IDC_PREVIEW_WELL); CString csSldName; CString csTK, csRecord; SplitBlkStr(m_csBlkName, csTK, csRecord); csSldName.Format(_T("TWTSYS(%s)"), csRecord); DrawSlide((const TCHAR*)csSldName, pImageBox1); } void CWellEditDlg::OnPreviewWell() { CString csSldName; CString csTK, csRecord; SplitBlkStr(m_csBlkName, csTK, csRecord); csSldName.Format(_T("TWTSYS(%s)"), csRecord); CTemporaryResourceOverride vTemp; CSelectBlkDlg dlg; dlg.m_csTkName = _T("TWTSYS"); dlg.m_csType = _T("室外\\井"); CWnd *pWnd = GetDlgItem(IDC_PREVIEW_WELL); CRect rect; dlg.m_staticSlide.m_csCurRecord = csSldName; pWnd->GetWindowRect(&rect); dlg.m_ptBase = rect.TopLeft(); if(dlg.DoModal() == IDOK){ CString csRet = dlg.m_staticSlide.m_csCurRecord; XString xsTKName, xsRocord, xsTmp; SplitSlbName(csRet, xsTKName, xsRocord); AcDbDatabase *dwg=acdbCurDwg(); AcAxDocLock docLock(dwg); VERIFY(docLock.lockStatus() == Acad::eOk); if(LoadDwbBlock((const TCHAR*)xsTKName, (const TCHAR*)xsRocord, xsTmp) != RTNORM) return; m_csBlkName = (const TCHAR*)xsTmp; OpenSlide(); } } void CWellEditDlg::GetPipeInfo(AcDbObjectId PipeId, XPoint ptLoc, double &dDn, AcGeVector3d &vt, BOOL &bIsIn) { OPENOBJ_BEGIN(PipeId, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ dDn = pPipe->GetDnDiameter(); XPoint ptS, ptE, ptTmp; ptS = pPipe->StartPoint(); ptE = pPipe->EndPoint(); ptS.z = 0; ptE.z = 0; if(ptLoc == ptS) ptTmp = ptE; else ptTmp = ptS; AcGeVector3d vt1(ptTmp.x - ptLoc.x, ptTmp.y - ptLoc.y, ptTmp.z - ptLoc.z); vt = vt1; TPipeSys::FlowDirection dir = pPipe->GetFlowDir(); if(dir == TPipeSys::kFromStart){ if(ptLoc == ptS) bIsIn = FALSE; else bIsIn = TRUE; } else{ if(ptLoc == ptS) bIsIn = TRUE; else bIsIn = FALSE; } } OPENOBJ_END(); } //根据排水检查井图集, 计算井径 void CWellEditDlg::OnButtonWellradius() { OPENOBJ_BEGIN(m_id, AcDb::kForRead, TDbWell, pEquip); if(pEquip){ int num = pEquip->GetInterfaceNum(); XPoint ptLoc = pEquip->GetLocation(); ptLoc.z = 0; //zxl 2011.12.07 modify //if(num < 2 || num > 4) if (num < 1 || num > 4){ MessageBox(_T("该井所接管线太少或太多!无法计算")); return; } //zxl 2011.12.07 modify TPipeInterface face1; pEquip->GetInterface(0, face1); AcDbObjectId PipeId1 = face1.m_idPipe; double dn1; AcGeVector3d vt1; BOOL bIn1; GetPipeInfo(PipeId1,ptLoc,dn1, vt1, bIn1); //zxl 2011.12.07 modify if(num == 1) { if(dn1 < 401) m_dWellRaius = 700; else if(dn1 < 601) m_dWellRaius = 1000; else if(dn1 < 801) m_dWellRaius = 1250; else m_dWellRaius = 1500; } else if(num == 2) { //zxl 2011.12.07 add TPipeInterface face2; pEquip->GetInterface(1, face2); AcDbObjectId PipeId2 = face2.m_idPipe; double dn2; AcGeVector3d vt2; BOOL bIn2; GetPipeInfo(PipeId2,ptLoc,dn2, vt2, bIn2); double dAng = vt1.angleTo(vt2); if((dAng-0.1) < PI/2){ //90°转弯井 if(dn1 < 301 && dn2 < 301) m_dWellRaius = 700; else if(dn1 < 501 && dn2 < 501) m_dWellRaius = 1000; else if(dn1 < 601 && dn2 < 601) m_dWellRaius = 1250; else m_dWellRaius = 1500; } else{ //转弯井 if(dn1 < 401 && dn2 < 401) m_dWellRaius = 700; else if(dn1 < 601 && dn2 < 601) m_dWellRaius = 1000; else if(dn1 < 801 && dn2 <801) m_dWellRaius = 1250; else m_dWellRaius = 1500; } } else if(num == 3){ //zxl 2011.12.07 add TPipeInterface face2; pEquip->GetInterface(1, face2); AcDbObjectId PipeId2 = face2.m_idPipe; double dn2; AcGeVector3d vt2; BOOL bIn2; GetPipeInfo(PipeId2,ptLoc,dn2, vt2, bIn2); TPipeInterface face3; pEquip->GetInterface(2, face3); AcDbObjectId PipeId3 = face3.m_idPipe; double dn3, dnIn, dnOut; AcGeVector3d vt3; BOOL bIn3; double dAng1, dAng2; GetPipeInfo(PipeId3, ptLoc, dn3, vt3, bIn3); if(!bIn1 && bIn2 && bIn3){ dAng1 = vt1.angleTo(vt2); dAng2 = vt1.angleTo(vt3); dnOut = dn1; dnIn = dn2; } else if(bIn1 && !bIn2 && bIn3){ dAng1 = vt2.angleTo(vt1); dAng2 = vt2.angleTo(vt3); dnOut = dn2; dnIn = dn1; } else if(bIn1 && bIn2 && !bIn3){ dAng1 = vt3.angleTo(vt1); dAng2 = vt3.angleTo(vt2); dnOut = dn3; dnIn = dn1; } else{ MessageBox(_T("井所接的管线方向错误!")); return; } if((dAng1-0.1) < PI/2 && (dAng2-0.1) < PI/2){ //90°三通井 if(dnOut < 401 && dnIn < 301) m_dWellRaius = 700; else if(dnOut < 601 && dnIn < 501) m_dWellRaius = 1000; else if(dnOut < 801 && dnIn < 601) m_dWellRaius = 1250; else m_dWellRaius = 1500; } else if((dAng1-0.1) < PI/3*2 && (dAng2-0.1) < PI/3*2){ //91°~ 120°三通井 if(dnOut < 401 && dnIn < 301) m_dWellRaius = 700; else if(dnOut < 601 && dnIn < 401) m_dWellRaius = 1000; else if(dnOut < 801 && dnIn < 501) m_dWellRaius = 1250; else m_dWellRaius = 1500; } else if((dAng1-0.1) < PI/180*135 && (dAng2-0.1) < PI/180*135){//121°~ 135°三通井 if(dnOut < 401 && dnIn < 201) m_dWellRaius = 700; else if(dnOut < 601 && dnIn < 301) m_dWellRaius = 1000; else if(dnOut < 801 && dnIn < 401) m_dWellRaius = 1250; else m_dWellRaius = 1500; } } else if(num == 4){ //zxl 2011.12.07 add TPipeInterface face2; pEquip->GetInterface(1, face2); AcDbObjectId PipeId2 = face2.m_idPipe; double dn2; AcGeVector3d vt2; BOOL bIn2; GetPipeInfo(PipeId2,ptLoc,dn2, vt2, bIn2); TPipeInterface face3; pEquip->GetInterface(2, face3); TPipeInterface face4; pEquip->GetInterface(3, face4); AcDbObjectId PipeId3 = face3.m_idPipe; AcDbObjectId PipeId4 = face4.m_idPipe; double dn3, dn4; AcGeVector3d vt3, vt4; BOOL bIn3, bIn4; double dAng1, dAng2, dAng3; GetPipeInfo(PipeId3, ptLoc, dn3, vt3, bIn3); GetPipeInfo(PipeId4, ptLoc, dn4, vt4, bIn4); double dAngTmp1, dAngTmp2; double D, D1, D2, D3; if(!bIn1 && bIn2 && bIn3 && bIn4){ dAng1 = vt1.angleTo(vt2); dAng2 = vt1.angleTo(vt3); dAng3 = vt1.angleTo(vt4); D = dn1; //流出管的管径 if(dAng1 > dAng2 && dAng1 > dAng3){//流入管的管径 D1 = dn2; D2 = dn3; D3 = dn4; } else if(dAng2 > dAng1 && dAng2 > dAng3){ D1 = dn3; D2 = dn2; D3 = dn4; } else if(dAng3 > dAng1 && dAng3 > dAng2){ D1 = dn4; D2 = dn3; D3 = dn2; } } else if(bIn1 && !bIn2 && bIn3 && bIn4){ dAng1 = vt2.angleTo(vt1); dAng2 = vt2.angleTo(vt3); dAng3 = vt2.angleTo(vt4); D = dn2; if(dAng1 > dAng2 && dAng1 > dAng3){//流入管的管径 D1 = dn1; D2 = dn3; D3 = dn4; } else if(dAng2 > dAng1 && dAng2 > dAng3){ D1 = dn3; D2 = dn1; D3 = dn4; } else if(dAng3 > dAng1 && dAng3 > dAng2){ D1 = dn4; D2 = dn3; D3 = dn1; } } else if(bIn1 && bIn2 && !bIn3 && bIn4){ dAng1 = vt3.angleTo(vt1); dAng2 = vt3.angleTo(vt2); dAng3 = vt3.angleTo(vt4); D = dn3; if(dAng1 > dAng2 && dAng1 > dAng3){//流入管的管径 D1 = dn1; D2 = dn2; D3 = dn4; } else if(dAng2 > dAng1 && dAng2 > dAng3){ D1 = dn2; D2 = dn1; D3 = dn4; } else if(dAng3 > dAng1 && dAng3 > dAng2){ D1 = dn4; D2 = dn2; D3 = dn1; } } else if(bIn1 && bIn2 && bIn3 && !bIn4){ dAng1 = vt4.angleTo(vt1); dAng2 = vt4.angleTo(vt2); dAng3 = vt4.angleTo(vt3); D = dn4; if(dAng1 > dAng2 && dAng1 > dAng3){//流入管的管径 D1 = dn1; D2 = dn2; D3 = dn3; } else if(dAng2 > dAng1 && dAng2 > dAng3){ D1 = dn2; D2 = dn1; D3 = dn3; } else if(dAng3 > dAng1 && dAng3 > dAng2){ D1 = dn3; D2 = dn2; D3 = dn1; } } else{ MessageBox(_T("井所接的管线方向错误!")); return; } //找到其中2个较小角度 if(dAng1 > dAng2 && dAng1 > dAng3){ dAngTmp1 = dAng2; dAngTmp2 = dAng3; } else if(dAng2 > dAng1 && dAng2 > dAng3){ dAngTmp1 = dAng1; dAngTmp2 = dAng3; } else if(dAng3 > dAng1 && dAng3 > dAng2){ dAngTmp1 = dAng1; dAngTmp2 = dAng2; } if((dAngTmp1-0.1) < PI/2 && (dAngTmp2-0.1) < PI/2){ //90°四通井 if(D < 401 && D1 < 401 && D2 < 301 && D3 < 301) m_dWellRaius = 700; else if(D < 601 && D1 < 601 && D2 < 501 && D3 < 501) m_dWellRaius = 1000; else if(D < 801 && D1 < 801 && D2 < 601 && D3 < 601) m_dWellRaius = 1250; else m_dWellRaius = 1500; } else if((dAngTmp1-0.1) < PI/3*2 && (dAngTmp2-0.1) < PI/3*2){ //91°~ 120°四通井 if(D < 401 && D1 < 401 && D2 < 201 && D3 < 201) m_dWellRaius = 700; else if(D < 401 && D1 < 301 && D2 < 301 && D3 < 301) m_dWellRaius = 700; else if(D < 601 && D1 < 601 && D2 < 201 && D3 < 201) m_dWellRaius = 1000; else if(D < 601 && D1 < 501 && D2 < 301 && D3 < 301) m_dWellRaius = 1000; else if(D < 601 && D1 < 401 && D2 < 401 && D3 < 401) m_dWellRaius = 1000; else if(D < 801 && D1 < 801 && D2 < 201 && D3 < 201) m_dWellRaius = 1250; else if(D < 801 && D1 < 701 && D2 < 301 && D3 < 301) m_dWellRaius = 1250; else if(D < 801 && D1 < 601 && D2 < 401 && D3 < 401) m_dWellRaius = 1250; else if(D < 801 && D1 < 501 && D2 < 501 && D3 < 501) m_dWellRaius = 1250; else m_dWellRaius = 1500; } else if((dAngTmp1-0.1) < PI/180*135 && (dAngTmp2-0.1) < PI/180*135){//121°~ 135°四通井 if(D < 401 && D1 < 201 && D2 < 201 && D3 < 201) m_dWellRaius = 700; else if(D < 601 && D1 < 401 && D2 < 201 && D3 < 201) m_dWellRaius = 1000; else if(D < 601 && D1 < 301 && D2 < 301 && D3 < 301) m_dWellRaius = 1000; else if(D < 801 && D1 < 601 && D2 < 201 && D3 < 201) m_dWellRaius = 1250; else if(D < 801 && D1 < 501 && D2 < 301 && D3 < 301) m_dWellRaius = 1250; else if(D < 801 && D1 < 401 && D2 < 401 && D3 < 401) m_dWellRaius = 1250; else m_dWellRaius = 1500; } } } OPENOBJ_END(); UpdateData(FALSE); }