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

708 lines
16 KiB
C++

#include "stdafx.h"
#include "twt_pump.h"
#include "DoubleLinePipeReducerEditDlg.h"
#include "SelectBlkDlg.h"
#include "DbDoubleLinePipeReducer.h"
#include "DbDoubleLinePipe.h"
#include <set>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#ifdef _WIN64
#include "TGAs.h"
//#endif
// 编辑大小接头
int EditDoubleLineReducer(AcDbObjectId id)
{
TDbDoubleLinePipeReducer *pDLPipeReducer = NULL;
acdbOpenObject(pDLPipeReducer, id, AcDb::kForWrite);
if (pDLPipeReducer != NULL)
{
AcDbObjectId id1, id2;
id1 = pDLPipeReducer->GetIPipe(0); // 大小接头起点处接口
id2 = pDLPipeReducer->GetIPipe(1); // 大小接头终点处接口
if ((id1.isValid() && id2.isValid()&&!id1.isErased()&&!id2.isErased())) // 两个接口都连接着管子
{
acutPrintf(_T("\n无法编辑大小接头,请删除后重新绘制!"));
}
else if ((id1.isValid() && !id1.isErased()) ||
(id2.isValid() && !id2.isErased()) )
{
double dPipeDia1 = 0.0, dPipeDia2 = 0.0;
double dPressure = 1.0;
double dFlangeThick1 = 0.0, dFlangeThick2 = 0.0;
double dFlangeDia1 = 0.0, dFlangeDia2 = 0.0;
int nType = 0, nLinkType = 0;
dPipeDia1 = pDLPipeReducer->GetSPipeDiameter();
dPipeDia2 = pDLPipeReducer->GetEPipeDiameter();
dFlangeDia1 = pDLPipeReducer->GetSFlangeDiameter();
dFlangeDia2 = pDLPipeReducer->GetEFlangeDiameter();
dFlangeThick1 = pDLPipeReducer->GetSFlangeThick();
dFlangeThick2 = pDLPipeReducer->GetEFlangeThick();
nType = pDLPipeReducer->GetType();
nLinkType = pDLPipeReducer->GetLinkType();
CTemporaryResourceOverride vTemp;
CDoubleLinePipeReducerEditDlg dlg;
// 根据那个接口连接着管子确定大小接头的起点位置
if (id1.isValid() && !id1.isErased())
{
ads_name ent;
acdbGetAdsName(ent, id1);
CString csPn = ReadXdata(ent, _T("TG-PIPE-FLANGE-PN"));
// cet 2010.5.19 add
if (csPn.IsEmpty())
{
csPn = _T("1.0MPa");
}
csPn.TrimRight(_T("MPa"));
dPressure = _tstof(csPn);
dlg.SetOldPipeDiameter(dPipeDia1);
dlg.SetNewPipeDiameter(dPipeDia2);
dlg.SetOldPipePressure(dPressure);
dlg.SetNewPipePressure(dPressure);
dlg.SetOldFlangeDiameter(dFlangeDia1);
dlg.SetNewFlangeDiameter(dFlangeDia2);
dlg.SetOldFlangeThick(dFlangeThick1);
dlg.SetNewFlangeThick(dFlangeThick2);
dlg.SetPipeType(nType);
dlg.SetLinkType(nLinkType);
if (dlg.DoModal() == IDOK)
{
pDLPipeReducer->SetEPipeDiameter(dlg.GetNewPipeDiameter());
pDLPipeReducer->SetEFlangeDiameter(dlg.GetNewFlangeDiameter());
pDLPipeReducer->SetEFlangeThick(dlg.GetNewFlangeThick());
pDLPipeReducer->SetType(dlg.GetPipeType());
pDLPipeReducer->SetSPipeFlangeDist(dlg.GetH1());
pDLPipeReducer->SetEPipeFlangeDist(dlg.GetH2());
pDLPipeReducer->SetLenght(dlg.GetL());
}
}
else
{
ads_name ent;
acdbGetAdsName(ent, id2);
CString csPn = ReadXdata(ent, _T("TG-PIPE-FLANGE-PN"));
csPn.TrimRight(_T("MPa"));
dPressure = _tstof(csPn);
dlg.SetOldPipeDiameter(dPipeDia2);
dlg.SetNewPipeDiameter(dPipeDia1);
dlg.SetOldPipePressure(dPressure);
dlg.SetNewPipePressure(dPressure);
dlg.SetOldFlangeDiameter(dFlangeDia2);
dlg.SetNewFlangeDiameter(dFlangeDia1);
dlg.SetOldFlangeThick(dFlangeThick2);
dlg.SetNewFlangeThick(dFlangeThick1);
dlg.SetPipeType(nType);
dlg.SetLinkType(nLinkType);
if (dlg.DoModal() == IDOK)
{
pDLPipeReducer->SetSPipeDiameter(dlg.GetNewPipeDiameter());
pDLPipeReducer->SetSFlangeDiameter(dlg.GetNewFlangeDiameter());
pDLPipeReducer->SetSFlangeThick(dlg.GetNewFlangeThick());
pDLPipeReducer->SetType(dlg.GetPipeType());
pDLPipeReducer->SetSPipeFlangeDist(dlg.GetH1());
pDLPipeReducer->SetEPipeFlangeDist(dlg.GetH2());
pDLPipeReducer->SetLenght(dlg.GetL());
}
}
}
else // 两个接口都没有连接管子
{
acutPrintf(_T("\n无法编辑大小接头,请删除后重新绘制!"));
}
pDLPipeReducer->Close();
}
return 0;
}
CDoubleLinePipeReducerEditDlg::CDoubleLinePipeReducerEditDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDoubleLinePipeReducerEditDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDoubleLinePipeReducerEditDlg)
m_dWndEdtOldPipeDia = 0.0;
m_nWndRadPipeType = 0;
m_dWndEdtOldFlangeThick = 0.0;
m_dWndEdtOldFlangeDia = 0.0;
m_dWndEdtOldPressure = 0.0;
m_dWndEdtNewFlangeThick = 0.0;
m_dWndEdtNewFlangeDia = 0.0;
//}}AFX_DATA_INIT
m_nLinkType = 0;
m_dNewPipeDiameter = 0.0;
m_dNewPipePressure = 0.0;
m_dH1 = 0.0;
m_dH2 = 0.0;
m_dL = 0.0;
}
void CDoubleLinePipeReducerEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDoubleLinePipeReducerEditDlg)
DDX_Control(pDX, IDC_CMB_NEWPIPEDIAMETER, m_wndCmbPipeDiameter);
DDX_Control(pDX, IDC_CMB_NEWPRESSURE, m_wndCmbPipePressure);
DDX_Text(pDX, IDC_EDT_OLDFLANGEDIAMETER, m_dWndEdtOldFlangeDia);
DDX_Radio(pDX, IDC_RADIO1, m_nWndRadPipeType);
DDX_Text(pDX, IDC_EDT_OLDFLANGETHICK, m_dWndEdtOldFlangeThick);
DDX_Text(pDX, IDC_EDT_OLDPIPEDIAMETER, m_dWndEdtOldPipeDia);
// DDX_Text(pDX, IDC_EDT_OLDPRESSURE, m_dWndEdtOldPressure);
DDX_Text(pDX, IDC_EDT_NEWFLANGETHICK, m_dWndEdtNewFlangeThick);
DDX_Text(pDX, IDC_EDT_NEWFALNGEDIAMETER, m_dWndEdtNewFlangeDia);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDoubleLinePipeReducerEditDlg, CDialog)
//{{AFX_MSG_MAP(CDoubleLinePipeReducerEditDlg)
ON_WM_PAINT()
ON_CBN_SELCHANGE(IDC_CMB_NEWPRESSURE, OnSelchangeCmbNewpressure)
ON_CBN_SELCHANGE(IDC_CMB_NEWPIPEDIAMETER, OnSelchangeCmbNewpipediameter)
ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
ON_BN_CLICKED(IDC_RADIO2, OnRadio1)
ON_BN_CLICKED(IDC_RADIO3, OnRadio1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
double CDoubleLinePipeReducerEditDlg::GetNewPipePressure()
{
double dVal = 0.0;
int nIndex = m_wndCmbPipePressure.GetCurSel();
if (nIndex != -1)
{
CString strTemp;
m_wndCmbPipePressure.GetLBText(nIndex, strTemp);
dVal = _tstof(strTemp);
}
return dVal;
}
void CDoubleLinePipeReducerEditDlg::SetNewPipePressure(double dPipePressure)
{
CString strTemp;
strTemp.Format(_T("%f"), dPipePressure);
strTemp.TrimRight(_T("0"));
strTemp.TrimRight(_T("."));
m_strPressure = strTemp;
}
double CDoubleLinePipeReducerEditDlg::GetNewPipeDiameter()
{
return m_dNewPipeDiameter;
}
void CDoubleLinePipeReducerEditDlg::SetNewPipeDiameter(double dPipeDiameter)
{
m_dNewPipeDiameter = dPipeDiameter;
}
void CDoubleLinePipeReducerEditDlg::OpenSlide()
{
UpdateData(TRUE);
//比较两管径大小
CString strTmp;
int nIndex = m_wndCmbPipeDiameter.GetCurSel();
m_wndCmbPipeDiameter.GetLBText(nIndex, strTmp);
double dNewPipeDia = _tstof(strTmp);
bool bVal = m_dWndEdtOldPipeDia >= dNewPipeDia;
// 判断需显示的幻灯片
CString strSlb;
if (m_nLinkType == eJointing) // 焊接
{
if (m_nWndRadPipeType == 0) // 同心
{
if (bVal)
{
strSlb = _T("TWT(PIPEREDUCER1)");
}
else
{
strSlb = _T("TWT(PIPEREDUCER2)");
}
}
else if (m_nWndRadPipeType == 1) // 偏心顶平
{
if (bVal)
{
strSlb = _T("TWT(PIPEREDUCER3)");
}
else
{
strSlb = _T("TWT(PIPEREDUCER4)");
}
}
else if (m_nWndRadPipeType == 2) // 偏心底平
{
if (bVal)
{
strSlb = _T("TWT(PIPEREDUCER5)");
}
else
{
strSlb = _T("TWT(PIPEREDUCER6)");
}
}
}
else // 法兰链接
{
if (m_nWndRadPipeType == 0) // 同心
{
if (bVal)
{
strSlb = _T("TWT(PIPEREDUCER7)");
}
else
{
strSlb = _T("TWT(PIPEREDUCER8)");
}
}
else if (m_nWndRadPipeType == 1) // 偏心顶平
{
if (bVal)
{
strSlb = _T("TWT(PIPEREDUCER9)");
}
else
{
strSlb = _T("TWT(PIPEREDUCER10)");
}
}
else if (m_nWndRadPipeType == 2) // 偏心底平
{
if (bVal)
{
strSlb = _T("TWT(PIPEREDUCER11)");
}
else
{
strSlb = _T("TWT(PIPEREDUCER12)");
}
}
}
// 显示幻灯片
CWnd *pImageBox = GetDlgItem(IDC_STC_PREVIEW);
if (pImageBox != NULL)
{
DrawSlide((const TCHAR*)strSlb, pImageBox);
}
}
void CDoubleLinePipeReducerEditDlg::OnPaint()
{
CPaintDC dc(this);
OpenSlide();
}
void CDoubleLinePipeReducerEditDlg::Init()
{
FLANGEDATA data1[] = {
{50, 140, 12},
{65, 160, 14},
{80, 190, 14},
{100, 210, 14},
{125, 240, 14},
{150, 265, 16},
{200, 320, 18},
{250, 375, 22},
{300, 440, 22},
{350, 490, 22},
{400, 540, 22},
{450, 595, 24},
{500, 645, 24},
{600, 755, 24},
{700, 860, 26},
{800, 975, 26},
{900, 1075, 28},
{1000, 1175, 30},
{1200, 1375, 30},
{1400, 1575, 32},
{1600, 1790, 32},
{1800, 1990, 34},
{2000, 2190, 34},
};
std::vector<FLANGEDATA> vec1(data1, data1 + 23);
m_mapFlangeData.insert(std::make_pair(CString(_T("0.25")), vec1));
FLANGEDATA data2[] = {
{50, 140, 16},
{65, 160, 16},
{80, 190, 18},
{100, 210, 18},
{125, 240, 20},
{150, 265, 20},
{200, 320, 22},
{250, 375, 24},
{300, 440, 24},
{350, 490, 26},
{400, 540, 28},
{450, 595, 28},
{500, 645, 30},
{600, 755, 30},
{700, 860, 32},
{800, 975, 32},
{900, 1075, 34},
{1000, 1175, 36},
{1200, 1405, 38},
{1400, 1630, 44},
{1600, 1830, 46},
{1800, 2045, 52},
{2000, 2265, 54},
};
std::vector<FLANGEDATA> vec2(data2, data2 + 23);
m_mapFlangeData.insert(std::make_pair(CString(_T("0.6")), vec2));
FLANGEDATA data3[] = {
{50, 165, 18},
{65, 185, 20},
{80, 200, 20},
{100, 220, 22},
{125, 250, 24},
{150, 285, 24},
{200, 340, 24},
{250, 395, 26},
{300, 445, 28},
{350, 505, 28},
{400, 565, 30},
{450, 615, 30},
{500, 670, 32},
{600, 780, 36},
{700, 895, 36},
{800, 1015, 38},
{900, 1115, 42},
{1000, 1230, 44},
{1200, 1455, 48},
{1400, 1675, 54},
{1600, 1915, 62},
{1800, 2115, 66},
{2000, 2325, 72},
};
std::vector<FLANGEDATA> vec3(data3, data3 + 23);
m_mapFlangeData.insert(std::make_pair(CString(_T("1.0")), vec3));
FLANGEDATA data4[] = {
{50, 165, 22},
{65, 185, 24},
{80, 200, 24},
{100, 220, 26},
{125, 250, 28},
{150, 285, 28},
{200, 340, 30},
{250, 405, 32},
{300, 460, 32},
{350, 520, 34},
{400, 580, 38},
{450, 640, 42},
{500, 715, 48},
{600, 840, 50},
};
std::vector<FLANGEDATA> vec4(data4, data4 + 23);
m_mapFlangeData.insert(std::make_pair(CString(_T("1.6")), vec4));
CWnd *pWnd = NULL;
m_wndCmbPipePressure.EnableWindow(FALSE);
pWnd = NULL;
pWnd = GetDlgItem(IDC_EDT_NEWFALNGEDIAMETER);
if (pWnd != NULL)
{
pWnd->EnableWindow(FALSE);
}
pWnd = NULL;
pWnd = GetDlgItem(IDC_EDT_NEWFLANGETHICK);
if (pWnd != NULL)
{
pWnd->EnableWindow(FALSE);
}
// 为异径管管径添加数据
CodeBase db;
XString fullFile;
if(!FindFile(_T("PipeReducer.dbf"), fullFile))
{
Callme(_T("对不起,没有发现PipeReducer.dbf文件!"));
return;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
{
Callme(_T("PipeReducer.dbf文件出错!"));
return;
}
int nType = 0;
double dDn1 = 0.0, dDn2 = 0.0;
std::set<double> setData;
double dPipeDia = GetNewPipeDiameter();
pTable->MoveFirst();
while(!pTable->IsEOF())
{
GET_FIELD(pTable, _T("Type"), nType);
if (m_nWndRadPipeType == 0)
{
if (nType == 0) //同心
{
GET_FIELD(pTable, _T("Dn1"), dDn1);
GET_FIELD(pTable, _T("Dn2"), dDn2);
if (fabs(m_dWndEdtOldPipeDia - dDn1) < 1e-3)
{
setData.insert(dDn2);
}
else if (fabs(m_dWndEdtOldPipeDia - dDn2) < 1e-3)
{
setData.insert(dDn1);
}
}
}
else if (m_nWndRadPipeType == 1 || m_nWndRadPipeType == 2)
{
if (nType == 1) //偏心
{
GET_FIELD(pTable, _T("Dn1"), dDn1);
GET_FIELD(pTable, _T("Dn2"), dDn2);
if (fabs(m_dWndEdtOldPipeDia - dDn1) < 1e-3)
{
setData.insert(dDn2);
}
else if (fabs(m_dWndEdtOldPipeDia - dDn2) < 1e-3)
{
setData.insert(dDn1);
}
}
}
pTable->MoveNext();
}
std::set<double>::iterator it;
CString strTmp;
m_wndCmbPipeDiameter.Clear();
for (it = setData.begin(); it != setData.end(); it++)
{
strTmp.Format(_T("%f"), *it);
strTmp.TrimRight(_T("0"));
strTmp.TrimRight(_T("."));
m_wndCmbPipeDiameter.AddString(strTmp);
}
// 设置压力值
int i = m_wndCmbPipePressure.FindString(0, m_strPressure);
if (i != -1)
{
m_wndCmbPipePressure.SetCurSel(i);
}
pWnd = GetDlgItem(IDC_EDT_OLDPRESSURE);
if (pWnd != NULL)
{
if (fabs(m_dWndEdtOldPressure - 1.0) < 1e-3)
{
pWnd->SetWindowText(_T("1.0"));
}
else if (fabs(m_dWndEdtOldPressure - 0.6) < 1e-3)
{
pWnd->SetWindowText(_T("0.6"));
}
else if (fabs(m_dWndEdtOldPressure - 0.25) < 1e-3)
{
pWnd->SetWindowText(_T("0.25"));
}
else if (fabs(m_dWndEdtOldPressure - 1.6) < 1e-3)
{
pWnd->SetWindowText(_T("1.6"));
}
}
// 设置管子直径
strTmp.Format(_T("%.0f"), m_dNewPipeDiameter);
i = m_wndCmbPipeDiameter.FindString(0, strTmp);
if (i != -1)
{
m_wndCmbPipeDiameter.SetCurSel(i);
}
else
{
m_wndCmbPipeDiameter.SetCurSel(0);
}
}
BOOL CDoubleLinePipeReducerEditDlg::OnInitDialog()
{
CDialog::OnInitDialog();
Init();
if (m_nLinkType == eFlangeLInk)
{
OnSelchangeCmbNewpressure();
}
return TRUE;
}
void CDoubleLinePipeReducerEditDlg::OnSelchangeCmbNewpressure()
{
if (m_nLinkType == eJointing)
{
m_dWndEdtNewFlangeDia = 0.0;
m_dWndEdtNewFlangeThick = 0.0;
return;
}
int nIndex1 = m_wndCmbPipePressure.GetCurSel();
int nIndex2 = m_wndCmbPipeDiameter.GetCurSel();
if (nIndex1 != -1 && nIndex2 != -1)
{
CString strTemp;
m_wndCmbPipePressure.GetLBText(nIndex1, strTemp);
std::map<CString, std::vector<FLANGEDATA> >::iterator iter;
iter = m_mapFlangeData.find(strTemp);
if (iter != m_mapFlangeData.end())
{
double dDia = 0.0;
m_wndCmbPipeDiameter.GetLBText(nIndex2, strTemp);
dDia = _tstof(strTemp);
std::vector<FLANGEDATA>::iterator it;
for (it = (*iter).second.begin(); it != (*iter).second.end(); it++)
{
if (fabs((*it).dPipeDiameter - dDia) < 1e-3)
{
m_dWndEdtNewFlangeDia = (*it).dFlangeDiameter;
m_dWndEdtNewFlangeThick = (*it).dFlangeThick;
UpdateData(FALSE);
break;
}
}
}
}
}
void CDoubleLinePipeReducerEditDlg::OnOK()
{
CWnd *pWnd = NULL;
pWnd = GetDlgItem(IDC_CMB_NEWPIPEDIAMETER);
if (pWnd != NULL)
{
CString strTemp;
pWnd->GetWindowText(strTemp);
m_dNewPipeDiameter = _tstof(strTemp);
}
QueryData();
CDialog::OnOK();
}
void CDoubleLinePipeReducerEditDlg::OnSelchangeCmbNewpipediameter()
{
CWnd *pWnd = NULL;
pWnd = GetDlgItem(IDC_CMB_NEWPIPEDIAMETER);
if (pWnd != NULL)
{
CString strTemp;
pWnd->GetWindowText(strTemp);
m_dNewPipeDiameter = _tstof(strTemp);
}
OnSelchangeCmbNewpressure(); // 调整法兰参数
OpenSlide(); // 更改幻灯片
}
void CDoubleLinePipeReducerEditDlg::OnRadio1()
{
OpenSlide(); // 更改幻灯片
}
void CDoubleLinePipeReducerEditDlg::QueryData()
{
CodeBase db;
XString fullFile;
if(!FindFile(_T("PipeReducer.dbf"), fullFile))
{
Callme(_T("对不起,没有发现PipeReducer.dbf文件!"));
return;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
{
Callme(_T("PipeReducer.dbf文件出错!"));
return;
}
pTable->MoveFirst();
int nType = 0;
double dDn1 = 0.0, dDn2 = 0.0;
UpdateData(TRUE);
double dPipeDia = GetNewPipeDiameter();
while(!pTable->IsEOF())
{
GET_FIELD(pTable, _T("Type"), nType);
if (m_nWndRadPipeType == 0)
{
if (nType == 0) //同心
{
GET_FIELD(pTable, _T("Dn1"), dDn1);
GET_FIELD(pTable, _T("Dn2"), dDn2);
if (fabs(m_dWndEdtOldPipeDia - dDn1) < 1e-3 && fabs(dPipeDia - dDn2) < 1e-3)
{
GET_FIELD(pTable, _T("H1"), m_dH1);
GET_FIELD(pTable, _T("H2"), m_dH2);
GET_FIELD(pTable, _T("L"), m_dL);
break;
}
else if (fabs(m_dWndEdtOldPipeDia - dDn2) < 1e-3 && fabs(dPipeDia - dDn1) < 1e-3)
{
GET_FIELD(pTable, _T("H1"), m_dH2);
GET_FIELD(pTable, _T("H2"), m_dH1);
GET_FIELD(pTable, _T("L"), m_dL);
break;
}
}
}
else if (m_nWndRadPipeType == 1 || m_nWndRadPipeType == 2)
{
if (nType == 1) //偏心
{
GET_FIELD(pTable, _T("Dn1"), dDn1);
GET_FIELD(pTable, _T("Dn2"), dDn2);
if (fabs(m_dWndEdtOldPipeDia - dDn1) < 1e-3 && fabs(dPipeDia - dDn2) < 1e-3)
{
GET_FIELD(pTable, _T("H1"), m_dH1);
GET_FIELD(pTable, _T("H2"), m_dH2);
GET_FIELD(pTable, _T("L"), m_dL);
break;
}
else if (fabs(m_dWndEdtOldPipeDia - dDn2) < 1e-3 && fabs(dPipeDia - dDn1) < 1e-3)
{
GET_FIELD(pTable, _T("H1"), m_dH2);
GET_FIELD(pTable, _T("H2"), m_dH1);
GET_FIELD(pTable, _T("L"), m_dL);
break;
}
}
}
pTable->MoveNext();
}
if (m_nLinkType == eJointing)
{
m_dH1 = 0.0;
m_dH2 = 0.0;
}
}