#include "stdafx.h" #include "AcDbObjectPtr.h" #include "globalfunc.h" #include "WellDnDlg.h" #include "DbWell.h" #include "Dbpipe.h" #include "PickEntSet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CWellDnGrid::CWellDnGrid() { } void CWellDnGrid::SetColorIndex(std::vector vecIndex) { m_vecIndex = vecIndex; } void CWellDnGrid::OnBeforeRefresh(WDGridCell &cell) { CDC &dc=GetDC(); COLORREF color; std::vector::iterator it = m_vecIndex.begin(); int i = 0; for (; it != m_vecIndex.end(); it++, i++) { if (i == cell.GetRowIndex() && cell.GetColIndex() == 0) { if (*it == 0) { color=acedGetRGB(6); } else if (*it == -1) { color = acedGetRGB(3); } else { WDGrid::OnBeforeRefresh(cell); continue; } dc.SetBkColor(color); dc.SetBkMode(TRANSPARENT); } } } CWellDnDlg::CWellDnDlg(CWnd* pParent /*=NULL*/) : CDialog(CWellDnDlg::IDD, pParent) { //{{AFX_DATA_INIT(CWellDn) m_sWellSerial = _T(""); //}}AFX_DATA_INIT } void CWellDnDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWellDn) DDX_Control(pDX, IDC_LIST_WELLDN, m_lstWellDn); DDX_Text(pDX, IDC_EDIT_WELLSERIAL, m_sWellSerial); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CWellDnDlg, CDialog) //{{AFX_MSG_MAP(CWellDn) ON_BN_CLICKED(IDC_BTN_FIND, OnBtnFind) ON_BN_CLICKED(IDC_BTN_WELLDN, OnBtnWelldn) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CWellDnDlg::OnInitDialog() { CDialog::OnInitDialog(); CWnd *pWnd = GetDlgItem(IDC_BTN_WELLDN); if (pWnd != NULL) { pWnd->SetFocus(); } m_lstWellDn.Clear(); m_lstWellDn.Create(this, IDC_LIST_WELLDN); m_lstWellDn.FitLastCol(); m_lstWellDn.SetNoAppendButton(TRUE); m_lstWellDn.SetNoDefaultMenu(true); m_lstWellDn.AppendCol( _T("井编号"), 60); m_lstWellDn.AppendCol( _T("实际井径"), 80); m_lstWellDn.GetCol(0).SetReadOnly(); SetWellDn(); return TRUE; } void CWellDnDlg::SetWells(std::map &mapWell) { m_mapWell = mapWell; } void CWellDnDlg::SetWellDn() { m_lstWellDn.Clear(); std::map::iterator it = m_mapWell.begin(); AcDbObjectId id; AecXDbWell *pWell = NULL; ads_name ent; int iIndex = 1; std::vector vecIndex; vecIndex.clear(); for (int i = 0; it != m_mapWell.end(); it++, i++) { id = it->first; acdbOpenObject(pWell, id, AcDb::kForRead); if (pWell) { m_lstWellDn.AppendRow(); m_lstWellDn.GetCell(i, 0).SetText(pWell->GetWellName()); WDGridCell cell = m_lstWellDn.GetCell(i, 1); acdbGetAdsName(ent, id); CString sWellRadius = GlobalFunc::ReadXdata(ent, _T("TG-WELL-RADIUS")); double dRadius = 0.0; if (it->second <= 0.0)//连井管线太多或太少,或连井管线方向不符合计算要求,无法计算 { iIndex = it->second; dRadius = _tstof(sWellRadius); } else { iIndex = 1; dRadius = it->second; } m_lstWellDn.GetCell(i, 1).SetText(XString(_T("%0.2f"), dRadius)); pWell->close(); } vecIndex.push_back(iIndex); } m_lstWellDn.SetColorIndex(vecIndex); UpdateData(FALSE); } //比较两个井编号是否相等 void SetName(CString &sTemp) { int iIndex = 0; TCHAR szTemp; for (; iIndex < sTemp.GetLength(); iIndex ++) { szTemp = sTemp[iIndex]; if (szTemp >= _T('a') && szTemp <= _T('z')) { szTemp -= 32; sTemp.SetAt(iIndex, szTemp); } } } bool CompareName(CString &sTemp, CString &sTemp2) { SetName(sTemp); SetName(sTemp2); if (sTemp.Compare(sTemp2) == 0) { return true; } return false; } void CWellDnDlg::OnBtnFind() { UpdateData(TRUE); m_lstWellDn.UnSelect(); CString sName; CString sName2 = m_sWellSerial; int iRow = 0; for(m_lstWellDn.MoveToFirst(); !m_lstWellDn.IsOut(); m_lstWellDn.MoveToNext()) { WDGridRow *pRow = m_lstWellDn.CurRow(); sName = (*pRow)[0].GetText(); if (CompareName(sName, sName2)) { m_lstWellDn.SelectRow(iRow); return; } iRow ++; } AfxMessageBox(_T("请输入有效的井编号!")); } void CWellDnDlg::GetPipeInfo(AcDbObjectId PipeId, XPoint ptLoc, double &dDn, AcGeVector3d &vt, BOOL &bIsIn) { OPENOBJ_BEGIN(PipeId, AcDb::kForRead, CDbPipe, 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 CWellDnDlg::OnBtnWelldn() { std::map::iterator it = m_mapWell.begin(); AcDbObjectId id; double dWellRaius; for (; it != m_mapWell.end(); it ++) { id = it->first; OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbWell, 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) { dWellRaius = 0.0; it->second = dWellRaius; continue; } //zxl 2011.12.07 modify CPipeInterface 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) dWellRaius = 700; else if(dn1 < 601) dWellRaius = 1000; else if(dn1 < 801) dWellRaius = 1250; else dWellRaius = 1500; } else if(num == 2) { //zxl 2011.12.07 add CPipeInterface 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) dWellRaius = 700; else if(dn1 < 501 && dn2 < 501) dWellRaius = 1000; else if(dn1 < 601 && dn2 < 601) dWellRaius = 1250; else dWellRaius = 1500; } else { //转弯井 if(dn1 < 401 && dn2 < 401) dWellRaius = 700; else if(dn1 < 601 && dn2 < 601) dWellRaius = 1000; else if(dn1 < 801 && dn2 <801) dWellRaius = 1250; else dWellRaius = 1500; } } else if(num == 3) { //zxl 2011.12.07 add CPipeInterface face2; pEquip->GetInterface(1, face2); AcDbObjectId PipeId2 = face2.m_idPipe; double dn2; AcGeVector3d vt2; BOOL bIn2; GetPipeInfo(PipeId2,ptLoc,dn2, vt2, bIn2); CPipeInterface 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 { //井所接的管线方向错误 it->second = -1; continue; } if((dAng1-0.1) < PI/2 && (dAng2-0.1) < PI/2) //90°三通井 { if(dnOut < 401 && dnIn < 301) dWellRaius = 700; else if(dnOut < 601 && dnIn < 501) dWellRaius = 1000; else if(dnOut < 801 && dnIn < 601) dWellRaius = 1250; else dWellRaius = 1500; } else if((dAng1-0.1) < PI/3*2 && (dAng2-0.1) < PI/3*2) //91°~ 120°三通井 { if(dnOut < 401 && dnIn < 301) dWellRaius = 700; else if(dnOut < 601 && dnIn < 401) dWellRaius = 1000; else if(dnOut < 801 && dnIn < 501) dWellRaius = 1250; else dWellRaius = 1500; } else if((dAng1-0.1) < PI/180*135 && (dAng2-0.1) < PI/180*135)//121°~ 135°三通井 { if(dnOut < 401 && dnIn < 201) dWellRaius = 700; else if(dnOut < 601 && dnIn < 301) dWellRaius = 1000; else if(dnOut < 801 && dnIn < 401) dWellRaius = 1250; else dWellRaius = 1500; } } else if(num == 4) { //zxl 2011.12.07 add CPipeInterface face2; pEquip->GetInterface(1, face2); AcDbObjectId PipeId2 = face2.m_idPipe; double dn2; AcGeVector3d vt2; BOOL bIn2; GetPipeInfo(PipeId2,ptLoc,dn2, vt2, bIn2); CPipeInterface face3; pEquip->GetInterface(2, face3); CPipeInterface 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 { it->second = -1; continue; } //找到其中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) dWellRaius = 700; else if(D < 601 && D1 < 601 && D2 < 501 && D3 < 501) dWellRaius = 1000; else if(D < 801 && D1 < 801 && D2 < 601 && D3 < 601) dWellRaius = 1250; else 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) dWellRaius = 700; else if(D < 401 && D1 < 301 && D2 < 301 && D3 < 301) dWellRaius = 700; else if(D < 601 && D1 < 601 && D2 < 201 && D3 < 201) dWellRaius = 1000; else if(D < 601 && D1 < 501 && D2 < 301 && D3 < 301) dWellRaius = 1000; else if(D < 601 && D1 < 401 && D2 < 401 && D3 < 401) dWellRaius = 1000; else if(D < 801 && D1 < 801 && D2 < 201 && D3 < 201) dWellRaius = 1250; else if(D < 801 && D1 < 701 && D2 < 301 && D3 < 301) dWellRaius = 1250; else if(D < 801 && D1 < 601 && D2 < 401 && D3 < 401) dWellRaius = 1250; else if(D < 801 && D1 < 501 && D2 < 501 && D3 < 501) dWellRaius = 1250; else 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) dWellRaius = 700; else if(D < 601 && D1 < 401 && D2 < 201 && D3 < 201) dWellRaius = 1000; else if(D < 601 && D1 < 301 && D2 < 301 && D3 < 301) dWellRaius = 1000; else if(D < 801 && D1 < 601 && D2 < 201 && D3 < 201) dWellRaius = 1250; else if(D < 801 && D1 < 501 && D2 < 301 && D3 < 301) dWellRaius = 1250; else if(D < 801 && D1 < 401 && D2 < 401 && D3 < 401) dWellRaius = 1250; else dWellRaius = 1500; } } } OPENOBJ_END(); it->second = dWellRaius; } SetWellDn(); } void CWellDnDlg::OnOK() { UpdateData(); CString sWellSerial; double dRadius; int iRow = 0; for(m_lstWellDn.MoveToFirst(); !m_lstWellDn.IsOut(); m_lstWellDn.MoveToNext()) { WDGridRow *pRow = m_lstWellDn.CurRow(); sWellSerial = (*pRow)[0].GetText(); dRadius = _tstof((*pRow)[1].GetText()); UpdateWellDn(sWellSerial, dRadius); iRow ++; } CDialog::OnOK(); } void CWellDnDlg::UpdateWellDn(CString &sWellName, double &dRadius) { std::map::iterator it = m_mapWell.begin(); AcDbObjectId id; AecXDbWell *pWell = NULL; for (int i = 0; it != m_mapWell.end(); it ++, i++) { id = it->first; acdbOpenObject(pWell, id, AcDb::kForRead); if (pWell) { if (sWellName.Compare(pWell->GetWellName()) == 0) { it->second = dRadius; } pWell->close(); } } }