Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

646 lines
14 KiB
C++

#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<int> vecIndex)
{
m_vecIndex = vecIndex;
}
void CWellDnGrid::OnBeforeRefresh(WDGridCell &cell)
{
CDC &dc=GetDC();
COLORREF color;
std::vector<int>::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<AcDbObjectId, double> &mapWell)
{
m_mapWell = mapWell;
}
void CWellDnDlg::SetWellDn()
{
m_lstWellDn.Clear();
std::map<AcDbObjectId, double>::iterator it = m_mapWell.begin();
AcDbObjectId id;
AecXDbWell *pWell = NULL;
ads_name ent;
int iIndex = 1;
std::vector<int> 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<AcDbObjectId, double>::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<AcDbObjectId, double>::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();
}
}
}