Files
envi-code/SourceCode/Code2026/tg_shs/shs_outdoor/WellEditDlg.cpp
T
2026-09-28 15:28:50 +08:00

607 lines
19 KiB
C++

// WellEditDlg.cpp : implementation file
//
#include "stdafx.h"
#include "twtdef.h"
#include <DbWell.h>
#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);
}