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

1827 lines
47 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "shs_outdoor.h"
#include "SiphonRainwaterCalcDlg.h"
#include "TWordFormulasTemplet.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include"TGAs.h"
CSiphonRainwaterCalcGrid::CSiphonRainwaterCalcGrid()
{
m_pWnd = NULL;
}
void CSiphonRainwaterCalcGrid::OnCellComboString(WDGridCell&cell,CComboBox&combo)
{
if(cell.GetColIndex()==3)
{
XString fullFile;
if(!FindFile(_T("pipe.dbf"), fullFile))
{
acutPrintf(_T("对不起,没有发现pipe.dbf文件!"));
return;
}
CodeBase db;
db.read_only = 1;
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
return;
CString strMaterial, strDn;
std::set<double> data;
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext())
{
GET_FIELD(pTable, _T("Gc"), strMaterial);
if (strMaterial.Compare(m_strPipeMaterial) != 0)
{
continue;
}
GET_FIELD(pTable, _T("Dn"), strDn);
data.insert(_tstof(strDn));
}
pTable->Close();
std::set<double>::iterator it;
for(it = data.begin(); it != data.end(); it++)
{
double dVal = *it;
if (dVal >= 50 && dVal <= 300)
{
CString str;
str.Format(_T("%.0f"), dVal);
combo.AddString(str);
}
}
}
}
void CSiphonRainwaterCalcGrid::SetPipeMaterial(const CString& strMaterial)
{
m_strPipeMaterial = strMaterial;
}
void CSiphonRainwaterCalcGrid::SetWnd(CSiphonRainwaterCalcDlg* pWnd)
{
m_pWnd = pWnd;
}
void CSiphonRainwaterCalcGrid::OnDblClick(WDGridRow&row)
{
if (m_pWnd != NULL)
{
m_pWnd->DblClickLst();
}
}
bool CSiphonRainwaterCalcGrid::OnModified(WDGridCell&cell,CString &text)
{
long i = cell.GetColIndex();
if (i == 3 && m_pWnd != NULL)
{
m_pWnd->UpDatePipeDia(cell.GetRowIndex(), text);
}
else if (i == 6 && m_pWnd != NULL)
{
m_pWnd->UpDateT(cell.GetRowIndex(), text);
}
return true;
}
void CSiphonRainwaterCalcGrid::SetData(std::set<int> &data)
{
m_setRow = data;
}
std::set<int>& CSiphonRainwaterCalcGrid::GetData()
{
return m_setRow;
}
void CSiphonRainwaterCalcGrid::OnBeforeRefresh(WDGridCell &cell)
{
if(cell.GetColIndex() == 4)
{
std::set<int>::iterator it;
it = m_setRow.find(cell.GetRowIndex());
if(it != m_setRow.end())
{
CDC&dc=GetDC();
COLORREF color=acedGetRGB(6);
dc.SetTextColor(color);
dc.SetBkMode(TRANSPARENT);
}
else
WDGrid::OnBeforeRefresh(cell);
}
else
WDGrid::OnBeforeRefresh(cell);
}
extern int GetPipeMaterialType(const CString &strMaterial);
CString CSiphonRainwaterCalcDlg::m_strWndCmbT = _T("10");
CSiphonRainwaterCalcDlg::CSiphonRainwaterCalcDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSiphonRainwaterCalcDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSiphonRainwaterCalcDlg)
m_dWndEdtDelta = 0.0;
//}}AFX_DATA_INIT
m_bExistPlan2Sys = FALSE;
}
void CSiphonRainwaterCalcDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSiphonRainwaterCalcDlg)
DDX_Control(pDX, IDC_LIST1, m_listCtrl);
DDX_CBString(pDX, IDC_COMBOTEMPERATURE, m_strWndCmbT);
DDX_Text(pDX, IDC_EDT_ROUGHNESS, m_dWndEdtDelta);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSiphonRainwaterCalcDlg, CDialog)
//{{AFX_MSG_MAP(CSiphonRainwaterCalcDlg)
ON_BN_CLICKED(IDC_BUTTON_TABALE, OnButtonTabale)
ON_BN_CLICKED(IDC_BUTTON_HIDE, OnButtonHide)
ON_BN_CLICKED(IDC_BUTTON_CALC, OnButtonCalc)
ON_BN_CLICKED(IDC_BUTTON_CHECK, OnButtonCheck)
ON_BN_CLICKED(IDC_BUTTON_WORD, OnButtonWord)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CSiphonRainwaterCalcDlg::SetSiphonInfo(std::vector<SIPHONINFO> &data)
{
m_vecData = data;
}
BOOL CSiphonRainwaterCalcDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CRect rect;
m_listCtrl.GetWindowRect(&rect);
ScreenToClient(&rect);
m_listCtrl.Clear();
m_listCtrl.Create(this, IDC_LIST1);
m_listCtrl.SetPipeMaterial(m_strPipeMaterial);
m_listCtrl.SetNoDefaultMenu();
m_listCtrl.SetNoAppendButton();
long nWidth = rect.Width() / 20;
COLORREF color = RGB(255,0,0);
m_listCtrl.AppendCol(_T("管段"), nWidth);
m_listCtrl.AppendCol(_T("流量L/s"), 1.5 * nWidth);
m_listCtrl.AppendCol(_T("管长(m)"), 1.5 * nWidth);
m_listCtrl.AppendCol(_T("管径(mm)"), 1.5 * nWidth);
m_listCtrl.AppendCol(_T("流速m/s"), 1.5 * nWidth);
m_listCtrl.AppendCol(_T("沿损kPa"), 1.5 * nWidth);
m_listCtrl.AppendCol(_T("局阻系数"), 1.5 * nWidth);
m_listCtrl.AppendCol(_T("局损(kPa)"), 2.0 * nWidth);
m_listCtrl.AppendCol(_T("总损失(kPa)"), 2 * nWidth);
m_listCtrl.AppendCol(_T("∑总损失(kPa)"), 2.5 * nWidth);
m_listCtrl.AppendCol(_T("高差(m)"), 1.5 * nWidth);
m_listCtrl.AppendCol(_T("压力(kPa)"), 1.5 * nWidth);
m_listCtrl.GetCol(0).SetCenterAlign(true);
m_listCtrl.GetCol(1).SetCenterAlign(true);
m_listCtrl.GetCol(2).SetCenterAlign(true);
m_listCtrl.GetCol(3).SetCenterAlign(true);
m_listCtrl.GetCol(4).SetCenterAlign(true);
m_listCtrl.GetCol(5).SetCenterAlign(true);
m_listCtrl.GetCol(6).SetCenterAlign(true);
m_listCtrl.GetCol(7).SetCenterAlign(true);
m_listCtrl.GetCol(8).SetCenterAlign(true);
m_listCtrl.GetCol(9).SetCenterAlign(true);
m_listCtrl.GetCol(10).SetCenterAlign(true);
m_listCtrl.GetCol(11).SetCenterAlign(true);
m_listCtrl.GetCol(3).SetComboEdit();
m_listCtrl.GetCol(0).SetReadOnly(true);
m_listCtrl.GetCol(1).SetReadOnly(true);
m_listCtrl.GetCol(2).SetReadOnly(true);
m_listCtrl.GetCol(4).SetReadOnly(true);
m_listCtrl.GetCol(5).SetReadOnly(true);
m_listCtrl.GetCol(7).SetReadOnly(true);
m_listCtrl.GetCol(8).SetReadOnly(true);
m_listCtrl.GetCol(9).SetReadOnly(true);
m_listCtrl.GetCol(10).SetReadOnly(true);
m_listCtrl.GetCol(11).SetReadOnly(true);
m_listCtrl.GetCol(3).SetTextColor(RGB(255,0,0));
m_listCtrl.GetCol(6).SetTextColor(RGB(255,0,0));
m_listCtrl.GetCol(4).SetTextColor(RGB(0,0,255));
m_listCtrl.GetCol(5).SetTextColor(RGB(0,0,255));
m_listCtrl.GetCol(7).SetTextColor(RGB(0,0,255));
m_listCtrl.GetCol(8).SetTextColor(RGB(0,0,255));
m_listCtrl.GetCol(9).SetTextColor(RGB(0,0,255));
m_listCtrl.GetCol(10).SetTextColor(RGB(0,0,255));
m_listCtrl.GetCol(11).SetTextColor(RGB(0,0,255));
m_listCtrl.FitLastCol();
m_listCtrl.SetWnd(this);
std::vector<SIPHONINFO>::iterator it;
int nIdex = 0;
for(it = m_vecData.begin(); it != m_vecData.end(); it++)
{
if ((*it).nType == 1)
{
continue;
}
m_listCtrl.AppendRow();
}
int nType = GetPipeMaterialType(m_strPipeMaterial);
if (nType == 0)
{
m_dWndEdtDelta = 0.007;
}
else if (nType == 1)
{
m_dWndEdtDelta = 0.015;
}
else if (nType == 2)
{
m_dWndEdtDelta = 0.15;
}
UpdateData(FALSE);
ResetList();
UpdateData(FALSE);
return TRUE;
}
void CSiphonRainwaterCalcDlg::CleanUseless0(CString &strText)
{
int nIndex = -1;
nIndex = strText.Find(_T("."));
if (nIndex != -1)
{
strText.TrimRight(_T("0"));
strText.TrimRight(_T("."));
}
}
void CSiphonRainwaterCalcDlg::ResetList()
{
UpdataInfo();
std::vector<SIPHONINFO>::iterator it;
int nIdex = 0;
for(it = m_vecData.begin(); it != m_vecData.end(); it++)
{
if ((*it).nType == 1)
{
continue;
}
CString strDia, strLen, strEle, strQ, strT;
strDia.Format(_T("%f"), (*it).dPipeDia);
strLen.Format(_T("%.2f"), (*it).dLen);
strEle.Format(_T("%f"), (*it).dEle);
strQ.Format(_T("%f"), (*it).dQ);
strT.Format(_T("%f"), (*it).dT);
CleanUseless0(strDia);
CleanUseless0(strEle);
CleanUseless0(strQ);
CleanUseless0(strT);
m_listCtrl.GetCell(nIdex, 0).SetText((*it).strName); //名称
m_listCtrl.GetCell(nIdex, 3).SetText(strDia); //管径
m_listCtrl.GetCell(nIdex, 2).SetText(strLen); //管长
m_listCtrl.GetCell(nIdex, 10).SetText(strEle); //高差
m_listCtrl.GetCell(nIdex, 1).SetText(strQ); //流量
m_listCtrl.GetCell(nIdex, 6).SetText(strT); //局部阻力系数
//流速
CString strV;
strV.Format(_T("%.3f"), (*it).dv);
m_listCtrl.GetCell(nIdex, 4).SetText(strV);
//沿程阻力损失
CString strHf;
strHf.Format(_T("%.3f"), (*it).dhf);
m_listCtrl.GetCell(nIdex, 5).SetText(strHf);
//局部阻力损失
CString strHj;
strHj.Format(_T("%.3f"), (*it).dhj);
m_listCtrl.GetCell(nIdex, 7).SetText(strHj);
//总阻力损失
CString strH;
strH.Format(_T("%.3f"), (*it).dH);
m_listCtrl.GetCell(nIdex, 8).SetText(strH);
//∑总阻力损失
CString strH2;
strH2.Format(_T("%.3f"), (*it).dH2);
m_listCtrl.GetCell(nIdex, 9).SetText(strH2);
//压力
CString strP;
strP.Format(_T("%.3f"), (*it).dP);
m_listCtrl.GetCell(nIdex, 11).SetText(strP);
++nIdex;
}
m_listCtrl.Invalidate();
}
void CSiphonRainwaterCalcDlg::SetPipeMaterial(const CString& strMaterial)
{
m_strPipeMaterial = strMaterial;
}
double CSiphonRainwaterCalcDlg::GetU()
{
UpdateData(TRUE);
double dU = 0.0;
double dT = _tstof(m_strWndCmbT);
if (dT < 0)
{
dU = 1.785*1e-6;
}
else if (dT >= 0 && dT <= 5)
{
dU = 1.785*1e-6 - (dT - 0) * (1.785*1e-6 - 1.519*1e-6)/(5 - 0);
}
else if (dT >= 5 && dT <= 10)
{
dU = 1.519*1e-6 - (dT - 5) * (1.519*1e-6 - 1.306*1e-6)/(10 - 5);
}
else if (dT >= 10 && dT <= 15)
{
dU = 1.306*1e-6 - (dT - 10) * (1.306*1e-6 - 1.139*1e-6)/(15 - 10);
}
else if (dT >= 15 && dT <= 20)
{
dU = 1.139*1e-6 - (dT - 15) * (1.139*1e-6 - 1.003*1e-6)/(20 - 15);
}
else if (dT >= 20 && dT <= 25)
{
dU = 1.003*1e-6 - (dT - 20) * (1.003*1e-6 - 0.893*1e-6)/(25 - 20);
}
else if (dT >= 25 && dT <= 30)
{
dU = 0.893*1e-6 - (dT - 25) * (0.893*1e-6 - 0.800*1e-6)/(30 - 25);
}
else if (dT >= 30 && dT <= 40)
{
dU = 0.800*1e-6 - (dT - 30) * (0.800*1e-6 - 0.658*1e-6)/(40 - 30);
}
else if (dT >= 40 && dT <= 50)
{
dU = 0.658*1e-6 - (dT - 40) * (0.658*1e-6 - 0.553*1e-6)/(50 - 40);
}
else if (dT >= 50 && dT <= 60)
{
dU = 0.553*1e-6 - (dT - 50) * (0.553*1e-6 - 0.474*1e-6)/(60 - 50);
}
else if (dT >= 60 && dT <= 70)
{
dU = 0.474*1e-6 - (dT - 60) * (0.474*1e-6 - 0.413*1e-6)/(70 - 60);
}
else if (dT >= 70 && dT <= 80)
{
dU = 0.413*1e-6 - (dT - 70) * (0.413*1e-6 - 0.364*1e-6)/(80 - 70);
}
else if (dT >= 80 && dT <= 90)
{
dU = 0.364*1e-6 - (dT - 80) * (0.364*1e-6 - 0.326*1e-6)/(90 - 80);
}
else if (dT >= 90 && dT <= 100)
{
dU = 0.326*1e-6 - (dT - 90) * (0.326*1e-6 - 0.294*1e-6)/(100 - 90);
}
else
{
dU = 0.294 * 1e-6;
}
return dU;
}
void CSiphonRainwaterCalcDlg::OnButtonTabale()
{
UpdateData(TRUE);
HideDialog(this, TRUE);
XPoint pt;
if(acedGetPoint(NULL, _T("\n点取表格左上角位置"), pt) != RTNORM)
{
HideDialog(this, FALSE);
return;
}
double CSiphonRainwaterCalcGrid = g_nSheetHeight; //字高
double nTableHeight = g_nSheetHeight+2;
AcDbObjectId idTextStyle=InitTwtTextStyle(g_csSheetStyle);
TDbSheet *pSheet = new TDbSheet;
TGridStyle gridStyle;
gridStyle.SetOverrideAll(TRUE);
gridStyle.SetTextHeight(CSiphonRainwaterCalcGrid);
gridStyle.SetTextStyleId(idTextStyle);
TSheetTitle &title=pSheet->GetTitle();
title.SetHeight(7.0);
title.SetText(_T("虹吸雨水计算表"));
TGridStyle &gridStyle2=title.GetGridStyle();
gridStyle2.SetTextHeight(CSiphonRainwaterCalcGrid);
gridStyle2.SetTextStyleId(idTextStyle);
TDividerStyle &style=title.GetDividerStyle();
style.SetDividerFlag(TDividerStyle::kNone);
gridStyle.SetHorMode(AcDb::kTextCenter);
gridStyle.SetVerMode(AcDb::kTextVertMid);
gridStyle.SetLineSpaceFactor(0.2);
gridStyle.SetTextWrap(FALSE);
pSheet->SetGridStyle(gridStyle);
pSheet->SetRowHeight(nTableHeight);
pSheet->SetLayoutRotation(Ucs2Wcs(0.0));
pSheet->SetLocation(Ucs2Wcs(pt));
int nAllRow = (int)m_listCtrl.GetRowNum();
pSheet->InitSheet(nAllRow + 1, 12, nTableHeight, 50);
TSheetColumn column;
column.SetWidth(15); //管段名称
pSheet->SetColumnAt(0, column);
column.SetWidth(20); //流量
pSheet->SetColumnAt(1, column);
column.SetWidth(15); //管长
pSheet->SetColumnAt(2, column);
column.SetWidth(20); //管径
pSheet->SetColumnAt(3, column);
column.SetWidth(20); //流速
pSheet->SetColumnAt(4, column);
column.SetWidth(30); //沿程阻力损失
pSheet->SetColumnAt(5, column);
column.SetWidth(20); //局部阻力系数
pSheet->SetColumnAt(6, column);
column.SetWidth(30); //局部阻力损失
pSheet->SetColumnAt(7, column);
column.SetWidth(30); //总阻力损失
pSheet->SetColumnAt(8, column);
column.SetWidth(30); //Σ总阻力损失
pSheet->SetColumnAt(9, column);
column.SetWidth(30); //高差
pSheet->SetColumnAt(10, column);
column.SetWidth(20); //压力
pSheet->SetColumnAt(11, column);
TGridCell &cell=*(*pSheet)(0, 0);
cell.SetText(_T("管段名称"));
TGridCell &cell2=*(*pSheet)(0, 1);
cell2.SetText(_T("流量(L/s)"));
TGridCell &cell3=*(*pSheet)(0, 2);
cell3.SetText(_T("管长(m)"));
TGridCell &cell4=*(*pSheet)(0, 3);
cell4.SetText(_T("管径(mm)"));
TGridCell &cell5=*(*pSheet)(0, 4);
cell5.SetText(_T("流速(m/s)"));
TGridCell &cell6=*(*pSheet)(0, 5);
cell6.SetText(_T("沿程阻力损失(kPa)"));
TGridCell &cell7=*(*pSheet)(0, 6);
cell7.SetText(_T("局部阻力系数"));
TGridCell &cell8=*(*pSheet)(0, 7);
cell8.SetText(_T("局部阻力损失(kPa)"));
TGridCell &cell9=*(*pSheet)(0, 8);
cell9.SetText(_T("总阻力损失(kPa)"));
TGridCell &cell10=*(*pSheet)(0, 9);
cell10.SetText(_T("Σ总阻力损失(kPa)"));
TGridCell &cell11=*(*pSheet)(0, 10);
cell11.SetText(_T("高差(m)"));
TGridCell &cell12=*(*pSheet)(0, 11);
cell12.SetText(_T("压力(kPa)"));
for(int i = 0; i < nAllRow; i++)
{
TGridCell &Cell11=*(*pSheet)(i+1, 0);
Cell11.SetText(m_listCtrl.GetCell(i, 0).GetText());
TGridCell &Cell12=*(*pSheet)(i+1, 1);
Cell12.SetText(m_listCtrl.GetCell(i, 1).GetText());
TGridCell &Cell13=*(*pSheet)(i+1, 2);
Cell13.SetText(m_listCtrl.GetCell(i, 2).GetText());
TGridCell &Cell14=*(*pSheet)(i+1, 3);
Cell14.SetText(m_listCtrl.GetCell(i, 3).GetText());
TGridCell &Cell15=*(*pSheet)(i+1, 4);
Cell15.SetText(m_listCtrl.GetCell(i, 4).GetText());
TGridCell &Cell16=*(*pSheet)(i+1, 5);
Cell16.SetText(m_listCtrl.GetCell(i, 5).GetText());
TGridCell &Cell17=*(*pSheet)(i+1, 6);
Cell17.SetText(m_listCtrl.GetCell(i, 6).GetText());
TGridCell &Cell18=*(*pSheet)(i+1, 7);
Cell18.SetText(m_listCtrl.GetCell(i, 7).GetText());
TGridCell &Cell19=*(*pSheet)(i+1, 8);
Cell19.SetText(m_listCtrl.GetCell(i, 8).GetText());
TGridCell &Cell110=*(*pSheet)(i+1, 9);
Cell110.SetText(m_listCtrl.GetCell(i, 9).GetText());
TGridCell &Cell111=*(*pSheet)(i+1, 10);
Cell111.SetText(m_listCtrl.GetCell(i, 10).GetText());
TGridCell &Cell112=*(*pSheet)(i+1, 11);
Cell112.SetText(m_listCtrl.GetCell(i, 11).GetText());
}
pSheet->AddToCSpace(TRUE);
TCHAR szTmp[32];
ads_getstring(NULL, _T("\n按任意键返回对话框:<返回>"), szTmp);
HideDialog(this,FALSE);
}
void CSiphonRainwaterCalcDlg::UpdataInfo()
{
UpdateData(TRUE);
std::vector<SIPHONINFO>::iterator it;
double dU = GetU();
int nNum = -1; //记录上一管段号
double dTotal = 0.0; //记录前一管段总损失
for(it = m_vecData.begin(); it != m_vecData.end(); it++)
{
if ((*it).nType == 1)
{
continue;
}
//流速
double dDia = GetPipeDjByDn(m_strPipeMaterial, (int)(*it).dPipeDia);
double dv = 4 * (*it).dQ / (PI * dDia * dDia * 1000);
(*it).dv = dv;
//沿程阻力损失
double dRes1 = 0.0, dRes2 = 0.0;
double dRe = dv * dDia / dU;
double dA = 0.0; //管道沿程阻力损失系数λ
for(double i = 0; i <= 1; i += 5 * 1e-6)
{
dRes1 = 1.0 / sqrt(i);
dRes2 = -2 * log10(m_dWndEdtDelta / (3.7 * dDia * 1000) + 2.51 / (dRe * sqrt(i)));
if (fabs(dRes1 - dRes2) < 1e-3)
{
dA = i;
break;
}
}
double dhf = dA * ((*it).dLen / dDia) * (dv * dv / (2 * 9.81)) * 10;
(*it).dhf = dhf;
(*it).dA = dA;
//局部阻力损失
double dhj = (*it).dT * 5 * dv * dv * 0.1;
(*it).dhj = dhj;
//总阻力损失
double dH = dhf + dhj;
(*it).dH = dH;
//∑总阻力损失
double dH2 = 0.0;
int nCurNum = (int)_tstof((*it).strName);
if (nNum == -1)
{
dH2 = dH;
nNum = nCurNum;
dTotal = dH2;
}
else if (nCurNum - nNum == 1) //与前段管道号码相差1,加上前段管段的∑总阻力损失
{
dH2 = dH + dTotal;
nNum = nCurNum;
dTotal = dH2;
}
else
{
dH2 = dH;
nNum = nCurNum;
dTotal = dH2;
}
(*it).dH2 = dH2;
//压力
double dP = 98.1 * (*it).dEle - 5 * dv * dv - dH2 * 10;
dP *= 0.1;
(*it).dP = dP;
}
}
void CSiphonRainwaterCalcDlg::SetMapInfo(std::map<AcDbObjectId, AcDbObjectId> &mapPipe, std::map<AcDbObjectId, AcDbObjectId> &mapDim, std::map<AcDbObjectId, AcDbObjectId> &map2PipeId)
{
m_mapPipe = mapPipe;
m_mapDim = mapDim;
m_map2PipeId = map2PipeId;
}
void CSiphonRainwaterCalcDlg::OnButtonHide()
{
UpdateData(TRUE);
int nIndex = m_listCtrl.GetCurRowIndex();
if (nIndex == -1 || !m_bExistPlan2Sys)
{
return;
}
HideDialog(this, TRUE);
AcDbObjectId idPipe = GetPipeId(nIndex);
ShowPipe(idPipe);
TCHAR szTmp[32];
ads_getstring(NULL, _T("\n按任意键返回对话框:<返回>"), szTmp);
HideDialog(this, FALSE);
}
void CSiphonRainwaterCalcDlg::SetPlan2Sys(BOOL bExist)
{
m_bExistPlan2Sys = bExist;
}
AcDbObjectId CSiphonRainwaterCalcDlg::GetPipeId(int nIndex)
{
AcDbObjectId idPipe;
std::vector<SIPHONINFO>::iterator it;
int i = 0; //第几行管段
for (it = m_vecData.begin(); it != m_vecData.end(); it++)
{
if ((*it).nType == 1)
{
continue;
}
if (i == nIndex)
{
idPipe = (*it).id;
break;
}
++i;
}
std::map<AcDbObjectId, AcDbObjectId>::iterator it2;
it2 = m_mapPipe.find(idPipe);
if (it2 != m_mapPipe.end())
{
idPipe = (*it2).second;
}
else
{
idPipe.setNull();
}
return idPipe;
}
void CSiphonRainwaterCalcDlg::ShowPipe(AcDbObjectId &idPipe)
{
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, idPipe, AcDb::kForRead);
if (pPipe != NULL)
{
XPoint ptCen, p1, p2, p3, p4;
ptCen = pPipe->MidPoint();
double nDist = pPipe->Length()*2000;
arxZoomTo(ptCen, nDist, nDist);
ads_polar(ptCen, 0, nDist/5, p1);
ads_polar(p1, PI/2, nDist/5, p1);
ads_polar(ptCen, PI, nDist/5, p2);
ads_polar(p2, PI/2, -nDist/5, p2);
ads_grdraw(p1, p2, 2, 0);
ads_polar(ptCen, PI/2, nDist/5, p3);
ads_polar(p3, PI, nDist/5, p3);
ads_polar(ptCen, PI/2, -nDist/5, p4);
ads_polar(p4, 0, nDist/5, p4);
ads_grdraw(p3, p4, 2, 0);
pPipe->close();
}
}
void CSiphonRainwaterCalcDlg::DblClickLst()
{
OnButtonHide();
}
extern CString GetDimInfo(std::vector<SIPHONINFO> &data, const AcDbObjectId &id);
void CSiphonRainwaterCalcDlg::UpDatePipeDia(long nIndex, CString &strText)
{
UpdateData(TRUE);
//更新管段管径
AcDbObjectId idPipe1, idPipe2;
std::vector<SIPHONINFO>::iterator it;
int i = 0; //表格第几行管段
for (it = m_vecData.begin(); it != m_vecData.end(); it++)
{
if ((*it).nType == 1)
{
continue;
}
if (i == nIndex)
{
idPipe1 = (*it).id; //原图管段
break;
}
++i;
}
if (it == m_vecData.end())
{
return;
}
std::map<AcDbObjectId, AcDbObjectId>::iterator it2;
it2 = m_mapPipe.find(idPipe1);
if (it2 == m_mapPipe.end())
{
return;
}
idPipe2 = (*it2).second; //系统图管段
double dDia = _tstof(strText);
UpDatePipeDia(idPipe1, dDia);
UpDatePipeDia(idPipe2, dDia);
// cet 2011.7.6 add 更新倒角管径
it2 = m_mapChamferPipe.find(idPipe1);
if (it2 != m_mapChamferPipe.end())
{
AcDbObjectId id1 = (*it2).second;
UpDatePipeDia(id1, dDia);
it2 = m_mapPipe.find(id1); // 系统图对应的倒角管段
if (it2 != m_mapPipe.end())
{
UpDatePipeDia((*it2).second, dDia);
}
}
it2 = m_mapDim.find(idPipe1);
if (it2 != m_mapDim.end()) //更新管道标注
{
CString strContext;
std::vector<SIPHONINFO>::iterator it3;
for (it3 = m_vecData.begin(); it3 != m_vecData.end(); it3++)
{
if ((*it3).id == idPipe1)
{
(*it3).dPipeDia = dDia; //更新管径
strContext = GetDimInfo(m_vecData, idPipe1);
break;
}
}
AcDbMText *pText = NULL;
acdbOpenObject(pText, (*it2).second, AcDb::kForWrite);
if (pText != NULL)
{
pText->setContents(strContext);
pText->close();
}
}
//管径改变时,更新计算局部阻力系数时需要考虑变径的管段的局部阻力系数
AcDbObjectId id2 = (*it).id2;
if (id2.isValid())
{
if (ComparePipeDia(idPipe1, id2) != 0 && !(*it).bDia)
{
(*it).bDia = true;
(*it).dT += 0.4;
}
else if (ComparePipeDia((*it).id, id2) == 0 && (*it).bDia)
{
(*it).bDia = false;
(*it).dT -= 0.4;
}
}
for (it = m_vecData.begin(); it != m_vecData.end(); it++)
{
AcDbObjectId id3 = (*it).id2;
if (id3 == idPipe1)
{
if (ComparePipeDia((*it).id, id3) != 0 && !(*it).bDia)
{
(*it).bDia = true;
(*it).dT += 0.4;
}
else if (ComparePipeDia((*it).id, id3) == 0 && (*it).bDia)
{
(*it).bDia = false;
(*it).dT -= 0.4;
}
}
}
m_listCtrl.GetCell(nIndex, 3).SetText(strText);
UpdateData(FALSE);
ResetList();
UpdateData(FALSE);
}
void CSiphonRainwaterCalcDlg::UpDatePipeDia(AcDbObjectId &id, double dDia)
{
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, id, AcDb::kForWrite);
if (pPipe != NULL)
{
pPipe->SetDnDiameter(dDia);
pPipe->close();
}
}
int CSiphonRainwaterCalcDlg::ComparePipeDia(const AcDbObjectId &id1, const AcDbObjectId &id2)
{
int nRet = 0;
double dDia1 = 0, dDia2 = 0;
TDbPipe *pPipe1 = NULL, *pPipe2 = NULL;
acdbOpenObject(pPipe1, id1, AcDb::kForRead);
if (pPipe1 != NULL)
{
dDia1 = pPipe1->GetDnDiameter();
pPipe1->close();
}
acdbOpenObject(pPipe2, id2, AcDb::kForRead);
if (pPipe2 != NULL)
{
dDia2 = pPipe2->GetDnDiameter();
pPipe2->close();
}
if (dDia1 > dDia2)
{
return 1;
}
else if (dDia2 > dDia1)
{
return -1;
}
else
{
return 0;
}
}
void CSiphonRainwaterCalcDlg::UpDateT(long nIndex, CString &strText)
{
std::vector<SIPHONINFO>::iterator it;
int i = 0; //表格第几行管段
for (it = m_vecData.begin(); it != m_vecData.end(); it++)
{
if ((*it).nType == 1)
{
continue;
}
if (i == nIndex)
{
(*it).dT = _tstof(strText);
break;
}
++i;
}
}
void CSiphonRainwaterCalcDlg::OnButtonCalc()
{
UpdateData(TRUE);
m_listCtrl.GetData().clear();
ResetList();
UpdateData(FALSE);
}
/* cet 2011.10.13 modify 校核规则发生变化
void CSiphonRainwaterCalcDlg::OnButtonCheck()
{
//流速 压力余量 最大负压管段
CString strP, strMaxNP, strVP;
BOOL bLess1 = FALSE; //流速是否小于1 m/s
BOOL bEqual1 = FALSE; //流速是否等于1 m/s
std::vector<SIPHONINFO>::iterator it;
int nRow = -1; //表格行号
std::set<int> setRow;
for(it = m_vecData.begin(); it != m_vecData.end(); it++)
{
SIPHONINFO info = *it;
if (info.nType == 1)
{
continue;
}
double dv = info.dv;
++nRow;
ads_name name;
acdbGetAdsName(name, info.id);
Entity ent(name);
CString strOutPipe = ReadXdata(ent, _T("OutPipe"));
if (strOutPipe == _T("1")) //出流端管段
{
double dEle = info.dEle, dH2 = info.dH2;
double dP = 98.1 * info.dEle - 5 * dv * dv - info.dH2 * 10; //压力余量
dP *= 0.1;
if (dP > 10)
{
strP.Format(_T("压力余量:%.1f kPa, 大于10 kPa, 符合要求!"), dP);
}
else
{
strP.Format(_T("压力余量:%.1f kPa, 小于10 kPa, 不符合要求!"), dP);
}
}
CString strTemp;
strTemp = ReadXdata(ent, _T("MaxNP"));
if (strTemp == _T("1")) //最大负压管段
{
int nType = GetPipeMaterialType(m_strPipeMaterial);
double dMaxP = info.dP;
if (nType == 0 || nType == 2) //0表示内壁涂塑离心排水铸铁管 1表示排水塑料管 2表示钢管
{
if (fabs(dMaxP) < 90)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值小于90 kPa,符合要求!"), dMaxP);
}
else
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值大于90 kPa,不符合要求!"), dMaxP);
}
}
else if (nType == 1)
{
if (info.dPipeDia >= 50 && info.dPipeDia <= 160 && fabs(dMaxP) < 80)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值小于80 kPa,符合要求!"), dMaxP);
}
else if (info.dPipeDia >= 200 && fabs(dMaxP) < 70)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值小于70 kPa,符合要求!"), dMaxP);
}
else if (info.dPipeDia >= 50 && info.dPipeDia <= 160)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值大于80 kPa,不符合要求!"), dMaxP);
}
else if (info.dPipeDia >= 200)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值大于70 kPa,不符合要求!"), dMaxP);
}
}
}
if (!bLess1 && dv < 1)
{
bLess1 = TRUE;
setRow.insert(nRow);
}
if (!bEqual1 && fabs(dv - 1) < 1e-3)
{
bEqual1 = TRUE;
}
if (info.bVertical && !info.bLinkWaterBucket)
{
CString strTemp;
if (dv < 2.2)
{
strTemp.Format(_T("立管流速:%.2f m/s,小于2.2 m/s,不符合要求!"), dv);
setRow.insert(nRow);
}
else if (fabs(dv - 2.2) < 1e-3)
{
strTemp.Format(_T("立管流速:%.2f m/s,等于2.2 m/s,符合要求!"), dv);
}
else if (dv < 6)
{
strTemp.Format(_T("立管流速:%.2f m/s,数值大于2.2 m/s且小于6 m/s,符合要求!"), dv);
}
else if (fabs(dv - 6.0) < 1e-3)
{
strTemp.Format(_T("立管流速:%.2f m/s,等于6 m/s,在最大允许值内!"), dv);
}
else if (dv <= 10)
{
strTemp.Format(_T("立管流速:%.2f m/s,数值大于6 m/s且小于10 m/s,在最大允许值内!"), dv);
}
else if (fabs(dv-10) < 1e-3)
{
strTemp.Format(_T("立管流速:%.2f m/s,等于10 m/s,在最大允许值内!"), dv);
}
else
{
strTemp.Format(_T("立管流速:%.2f m/s,大于10 m/s,不符合要求!"), dv);
setRow.insert(nRow);
}
if (strVP.IsEmpty())
{
strVP += strTemp;
}
else
{
strVP += _T("\n") + strTemp;
}
}
}
m_listCtrl.SetData(setRow);
m_listCtrl.Invalidate();
CString strV;
if (bLess1)
{
strV = _T("存在小于1m/s的管段流速,不符合要求!");
}
else if (bEqual1)
{
strV = _T("存在等于1m/s的管段流速,符合要求!");
}
else
{
strV = _T("全部管段流速大于1 m/s,符合要求!");
}
//各节点由不同支路计算得到的压力差
CString strNO;
std::map<AcDbObjectId, AcDbObjectId>::iterator it2;
for (it2 = m_map2PipeId.begin(); it2 != m_map2PipeId.end(); it2++)
{
CString strNO1, strNO2;
double dP = 0.0;
if (GetPressure((*it2).first, (*it2) .second, dP, strNO1, strNO2))
{
if (dP > 15)
{
if (strNO.IsEmpty())
{
strNO += _T("(NO.") + strNO1 + _T(", NO.") + strNO2 + _T(")");
}
else
{
strNO += _T("、(NO.") + strNO1 + _T(", NO.") + strNO2 + _T(")");
}
}
}
}
if (strNO.IsEmpty())
{
strNO = _T("由不同支路计算得到的压力差数值的绝对值均小于15kPa,符合要求!");
}
else
{
strNO += _T("节点处的压力差数值绝对值大于15kPa,不符合要求!");
}
CString strContext;
strContext = strV + _T("\n\n") + strVP + _T("\n\n") + strP + _T("\n\n") + strMaxNP + _T("\n\n") + strNO;
AfxMessageBox(strContext);
}
*/
void CSiphonRainwaterCalcDlg::OnButtonCheck()
{
//流速 压力余量 最大负压管段
CString strP, strMaxNP, strVP;
//悬吊管中心线与雨水斗出口的高差
CString sHangers;
//排出端
CString sDischargePipe;
BOOL bLess1 = FALSE; //流速是否小于1 m/s
BOOL bEqual1 = FALSE; //流速是否等于1 m/s
std::vector<SIPHONINFO>::iterator it;
int nRow = -1; //表格行号
std::set<int> setRow;
for(it = m_vecData.begin(); it != m_vecData.end(); it++)
{
SIPHONINFO info = *it;
if (info.nType == 1)
{
continue;
}
double dv = info.dv;
++nRow;
//检查悬吊管中心线与雨水斗出口的高差
if (info.bVertical && info.bLinkWaterBucket)
{
if (info.dEle < 1.0)
{
if (sHangers.IsEmpty())
{
sHangers += _T("NO.") + info.strName;
}
else
{
sHangers += _T("、NO.") + info.strName;
}
}
}
ads_name name;
acdbGetAdsName(name, info.id);
Entity ent(name);
CString strOutPipe = ReadXdata(ent, _T("OutPipe"));
if (strOutPipe == _T("1")) //出流端管段
{
double dEle = info.dEle, dH2 = info.dH2;
double dP = 98.1 * info.dEle - 5 * dv * dv - info.dH2 * 10; //压力余量
dP *= 0.1;
if (dP > 10)
{
strP.Format(_T("压力余量:%.1f kPa, 大于10 kPa, 符合要求!"), dP);
}
else
{
strP.Format(_T("压力余量:%.1f kPa, 小于10 kPa, 不符合要求!"), dP);
}
// 排出端流速
CString sV;
sV.Format(_T("%.2f"), dv);
if (fabs(dv - 1.8) < 0.001)
{
sDischargePipe = _T("排出端流速:") + sV + _T("m/s,等于1.8m/s,符合要求!");
}
else if (dv < 1.8)
{
sDischargePipe = _T("排出端流速:") + sV + _T("m/s,小于1.8m/s,符合要求!");
}
else
{
sDischargePipe = _T("排出端流速:") + sV + _T("m/s,大于1.8m/s,不符合要求!");
}
}
CString strTemp;
strTemp = ReadXdata(ent, _T("MaxNP"));
if (strTemp == _T("1")) //最大负压管段
{
int nType = GetPipeMaterialType(m_strPipeMaterial);
double dMaxP = info.dP;
if (nType == 0 || nType == 2) //0表示内壁涂塑离心排水铸铁管 1表示排水塑料管 2表示钢管
{
if (fabs(dMaxP) < 90)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值小于90 kPa,符合要求!"), dMaxP);
}
else
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值大于90 kPa,不符合要求!"), dMaxP);
}
}
else if (nType == 1)
{
if (info.dPipeDia >= 50 && info.dPipeDia <= 160 && fabs(dMaxP) < 80)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值小于80 kPa,符合要求!"), dMaxP);
}
else if (info.dPipeDia >= 200 && fabs(dMaxP) < 70)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值小于70 kPa,符合要求!"), dMaxP);
}
else if (info.dPipeDia >= 50 && info.dPipeDia <= 160)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值大于80 kPa,不符合要求!"), dMaxP);
}
else if (info.dPipeDia >= 200)
{
strMaxNP.Format(_T("最大负压值:%.2f kPa,其绝对值大于70 kPa,不符合要求!"), dMaxP);
}
}
}
if (!bLess1 && dv < 1)
{
bLess1 = TRUE;
setRow.insert(nRow);
}
if (!bEqual1 && fabs(dv - 1) < 1e-3)
{
bEqual1 = TRUE;
}
// 立管流速
if (info.bVertical && !info.bLinkWaterBucket)
{
CString strTemp;
if (dv < 2.2)
{
strTemp.Format(_T("立管流速:%.2f m/s,小于2.2 m/s,不符合要求!"), dv);
setRow.insert(nRow);
}
else if (fabs(dv - 2.2) < 1e-3)
{
strTemp.Format(_T("立管流速:%.2f m/s,等于2.2 m/s,符合要求!"), dv);
}
else if (dv < 6)
{
strTemp.Format(_T("立管流速:%.2f m/s,数值大于2.2 m/s且小于6 m/s,符合要求!"), dv);
}
else if (fabs(dv - 6.0) < 1e-3)
{
strTemp.Format(_T("立管流速:%.2f m/s,等于6 m/s,在最大允许值内!"), dv);
}
else if (dv <= 10)
{
strTemp.Format(_T("立管流速:%.2f m/s,数值大于6 m/s且小于10 m/s,在最大允许值内!"), dv);
}
else if (fabs(dv-10) < 1e-3)
{
strTemp.Format(_T("立管流速:%.2f m/s,等于10 m/s,在最大允许值内!"), dv);
}
else
{
strTemp.Format(_T("立管流速:%.2f m/s,大于10 m/s,不符合要求!"), dv);
setRow.insert(nRow);
}
if (strVP.IsEmpty())
{
strVP += strTemp;
}
else
{
strVP += _T("\n") + strTemp;
}
}
}
m_listCtrl.SetData(setRow);
m_listCtrl.Invalidate();
CString strV;
if (bLess1)
{
strV = _T("存在小于1m/s的管段流速,不符合要求!");
}
else if (bEqual1)
{
strV = _T("存在等于1m/s的管段流速,符合要求!");
}
else
{
strV = _T("全部管段流速大于1 m/s,符合要求!");
}
//各节点由不同支路计算得到的压力差
CString strNO, sDn75, sDn100;
std::map<AcDbObjectId, AcDbObjectId>::iterator it2;
for (it2 = m_map2PipeId.begin(); it2 != m_map2PipeId.end(); it2++)
{
CString strNO1, strNO2;
double dP = 0.0, dDn1 = 0.0, dDn2 = 0.0;
if (GetPressure((*it2).first, (*it2).second, dP, strNO1, strNO2)
&& GetPipeDn((*it2).first, dDn1) && GetPipeDn((*it2).second, dDn2))
{
if (dDn1 < 100 && dDn2 < 100) //管径均小于100;
{
if (dP > 10) //节点压力差大于10
{
if (sDn75.IsEmpty())
{
sDn75 += _T("(NO.") + strNO1 + _T(", NO.") + strNO2 + _T(")");
}
else
{
sDn75 += _T("、(NO.") + strNO1 + _T(", NO.") + strNO2 + _T(")");
}
}
}
else //存在管径不小于100的管
{
if (dP > 5) //节点压力差大于5
{
if (sDn100.IsEmpty())
{
sDn100 += _T("(NO.") + strNO1 + _T(", NO.") + strNO2 + _T(")");
}
else
{
sDn100 += _T("、(NO.") + strNO1 + _T(", NO.") + strNO2 + _T(")");
}
}
}
}
}
if (!sDn75.IsEmpty())
{
strNO = sDn75 + _T("节点上游不同支路的管径均小于等于DN75,但其计算水头损失之差绝对值大于10kPa,不符合要求!\n");
}
if (!sDn100.IsEmpty())
{
strNO += sDn100 + _T("节点上游不同支路存在大于等于DN100管径,且其计算水头损失之差大于5 kPa,不符合要求!\n");
}
if (sDn75.IsEmpty() && sDn100.IsEmpty())
{
strNO = _T("各节点上游不同支路的计算水头损失之差,在管径小于等于DN75时,均小于10 kPa;在管径大于等于DN100时,均小于5 kPa,符合要求!");
}
// 悬吊管信息
if (sHangers.IsEmpty())
{
sHangers = _T("悬吊管中心线与雨水斗出口高差均大于1.0m,符合要求!");
}
else
{
sHangers = _T("悬吊管中心线与雨水口高差存在小于1.0m现象,其管段编号为") + sHangers + _T(",不符合要求!");
}
CString strContext;
strContext = sHangers +_T("\n\n") + strV + _T("\n\n") + strVP + _T("\n\n") + sDischargePipe + _T("\n\n") + strP + _T("\n\n") + strMaxNP + _T("\n\n") + strNO;
AfxMessageBox(strContext);
}
BOOL CSiphonRainwaterCalcDlg::GetPressure(const AcDbObjectId &id1, const AcDbObjectId &id2, double &dPressure, CString &strNO1, CString &strNO2)
{
std::vector<SIPHONINFO>::iterator it1, it2;
it1 = Find(id1);
it2 = Find(id2);
if (it1 == m_vecData.end() || it2 == m_vecData.end())
{
return FALSE;
}
dPressure = fabs((*it1).dP - (*it2).dP);
strNO1 = (*it1).strName;
strNO2 = (*it2).strName;
return TRUE;
}
BOOL CSiphonRainwaterCalcDlg::GetPipeDn(const AcDbObjectId &id, double &dDn)
{
std::vector<SIPHONINFO>::iterator it;
it = Find(id);
if (it == m_vecData.end())
{
return FALSE;
}
dDn = (*it).dPipeDia;
return TRUE;
}
std::vector<SIPHONINFO>::iterator CSiphonRainwaterCalcDlg::Find(const AcDbObjectId &id)
{
std::vector<SIPHONINFO>::iterator it;
for (it = m_vecData.begin(); it != m_vecData.end(); it++)
{
if ((*it).id == id)
{
return it;
}
}
return m_vecData.end();
}
void CSiphonRainwaterCalcDlg::OnButtonWord()
{
int nLen = m_listCtrl.GetRowNum();
if(nLen < 1)
{
return;
}
//初始化
COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR), vtTrue((short)TRUE), vtFalse((short)FALSE);
_Application wordApplication;
Documents wordDocuments;
_Document activeDocument;
Paragraphs wordParagraphs;
Selection wordSelection;
if (!wordApplication.CreateDispatch(_T("Word.Application")))
{
AfxMessageBox(_T("不能执行Microsoft Word 8.0!"));
return;
}
// 打开公式模板
TWordFormulasTemplet wdFormula;
CString sPathName = g_csSysPath;
sPathName += _T("formula.doc");
if (!wdFormula.OpenWordFormulasTempletFile(sPathName))
{
return;
}
wordApplication.SetVisible(TRUE);
wordDocuments = wordApplication.GetDocuments();
activeDocument = wordDocuments.Add(vtOptional,vtOptional);
//写一行字
wordSelection = wordApplication.GetSelection();
wordParagraphs = wordSelection.GetParagraphs();
_Font font;
font = wordSelection.GetFont();
float dSize = font.GetSize();
float dBold = font.GetBold();
wordParagraphs.SetAlignment(1); // 0: 居左 1:居中 2:居右
font.SetSize(dSize + 2);
font.SetBold(dBold + 1);
wordSelection.TypeText(_T("虹吸雨水计算书\n"));
font.SetBold(dBold);
font.SetSize(dSize);
wordParagraphs.SetAlignment(0);
wordSelection.TypeText(_T("计算原理参考《建筑与小区雨水利用工程技术规范》(GB50400-2006)\n"));
font.SetSize(dSize + 1);
font.SetBold(dBold + 1);
wordSelection.TypeText(_T("一、基本参数:\n"));
font.SetBold(dBold);
font.SetSize(dSize);
CString strMatrial;
AcDbObjectId id;
std::vector<SIPHONINFO>::iterator it;
for (it = m_vecData.begin(); it != m_vecData.end(); it++)
{
if ((*it).nType == 0)
{
id = (*it).id;
break;
}
}
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, id, AcDb::kForRead);
if (pPipe != NULL)
{
strMatrial = GetPipeMaterialByIdx(pPipe->GetMaterial());
pPipe->close();
}
wordSelection.TypeText(_T("管材:") + strMatrial + _T("\n"));
wordSelection.TypeText(_T("温度:") + m_strWndCmbT + _T("℃ \n"));
font.SetSize(dSize + 1);
font.SetBold(dBold + 1);
wordSelection.TypeText(_T("\n二、基本计算公式:\n"));
font.SetBold(dBold);
font.SetSize(dSize);
wordSelection.TypeText(_T("1、 暴雨强度公式:\n"));
wordSelection.TypeText(_T(" "));
wdFormula.InsertFormula(WORD_FORMULA21, wordSelection);
wordSelection.TypeText(_T("\n 式中:"));
wordSelection.TypeText(_T("q -- 降雨强度,(L/s·ha、L/s·hm"));
font.SetSuperscript(2); //处理上标
wordSelection.TypeText(_T("2"));
font.SetSuperscript(0);
wordSelection.TypeText(_T("、L/s·10"));
font.SetSuperscript(2); //处理上标
wordSelection.TypeText(_T("4"));
font.SetSuperscript(0);
wordSelection.TypeText(_T("m"));
font.SetSuperscript(2); //处理上标
wordSelection.TypeText(_T("2"));
font.SetSuperscript(0);
wordSelection.TypeText(_T(")\n"));
wordSelection.TypeText(_T(" t -- 降雨历时(min)\n"));
wordSelection.TypeText(_T(" P -- 设计重现期(年)\n"));
wordSelection.TypeText(_T(" A、b、C、n -- 当地降雨参数\n"));
wordSelection.TypeText(_T("\n2、 雨水设计流量公式:\n"));
wordSelection.TypeText(_T(" "));
wdFormula.InsertFormula(WORD_FORMULA22, wordSelection);
wordSelection.TypeText(_T("\n 式中:Q -- 雨水设计流量(L/s)\n"));
wordSelection.TypeText(_T(" q -- 降雨强度,(L/s·ha、L/s·hm"));
font.SetSuperscript(2); //处理上标
wordSelection.TypeText(_T("2"));
font.SetSuperscript(0);
wordSelection.TypeText(_T("、L/s·10"));
font.SetSuperscript(2); //处理上标
wordSelection.TypeText(_T("4"));
font.SetSuperscript(0);
wordSelection.TypeText(_T("m"));
font.SetSuperscript(2); //处理上标
wordSelection.TypeText(_T("2"));
font.SetSuperscript(0);
wordSelection.TypeText(_T(")\n"));
wordSelection.TypeText(_T(" ψ-- 径流系数。\n"));
wordSelection.TypeText(_T(" F -- 汇水面积(hm"));
font.SetSuperscript(2); //处理上标
wordSelection.TypeText(_T("2"));
font.SetSuperscript(0);
wordSelection.TypeText(_T(")1 hm"));
font.SetSuperscript(2); //处理上标
wordSelection.TypeText(_T("2"));
font.SetSuperscript(0);
wordSelection.TypeText(_T(" = 10000平方米"));
wordSelection.TypeText(_T("\n\n3、 流速\n"));
wordSelection.TypeText(_T(" "));
wdFormula.InsertFormula(WORD_FORMULA23, wordSelection);
wordSelection.TypeText(_T("\n 式中:V -- 流速(m/s)\n"));
wordSelection.TypeText(_T(" Q -- 管段流量(L/s)\n "));
wordSelection.TypeText(_T(" d -- 管道的计算内径(m)\n"));
wordSelection.TypeText(_T("\n4、 沿程阻力损失:\n"));
wordSelection.TypeText(_T(" "));
wdFormula.InsertFormula(WORD_FORMULA24, wordSelection);
wordSelection.TypeText(_T("\n 式中:h"));
font.SetSubscript(2); //处理下标
wordSelection.TypeText(_T("f"));
font.SetSubscript(0);
wordSelection.TypeText(_T("-- 管道沿程阻力损失(m);1米=10kPa\n"));
wordSelection.TypeText(_T(" λ-- 管道沿程阻力损失系数,按下式计算\n"));
wordSelection.TypeText(_T(" l -- 管道长度(m)\n"));
wordSelection.TypeText(_T(" d -- 管道计算内径(m)\n"));
wordSelection.TypeText(_T(" v -- 管内流速(m/s)\n"));
wordSelection.TypeText(_T(" g -- 重力加速度(m/s"));
font.SetSuperscript(2); //处理上标
wordSelection.TypeText(_T("2"));
font.SetSuperscript(0);
wordSelection.TypeText(_T(") 取 9.81\n"));
wordSelection.TypeText(_T(" "));
wdFormula.InsertFormula(WORD_FORMULA25, wordSelection);
wordSelection.TypeText(_T("\n 式中:△ -- 管壁绝对粗糙度(mm),由管材生产厂提供\n"));
wordSelection.TypeText(_T(" Re -- 雷诺数\n"));
wordSelection.TypeText(_T("\n5、 局部阻力损失:\n"));
wordSelection.TypeText(_T(" "));
wdFormula.InsertFormula(WORD_FORMULA26, wordSelection);
wordSelection.TypeText(_T("\n 式中:h"));
font.SetSubscript(2); //处理下标
wordSelection.TypeText(_T("j"));
font.SetSubscript(0);
wordSelection.TypeText(_T("--局部阻力损失(mbar)1mbar=100pa=0.1kPa\n"));
wordSelection.TypeText(_T(" T -- 局部阻力系数\n"));
wordSelection.TypeText(_T(" V"));
font.SetSubscript(2); //处理下标
wordSelection.TypeText(_T("x"));
font.SetSubscript(0);
wordSelection.TypeText(_T(" -- 管道某一x断面处流速(m/s)\n"));
wordSelection.TypeText(_T("\n6、 总阻力损失\n"));
wordSelection.TypeText(_T(" "));
wdFormula.InsertFormula(WORD_FORMULA27, wordSelection);
wordSelection.TypeText(_T("\n\n7、管道某一x断面处的压力:\n"));
wordSelection.TypeText(_T(" "));
wdFormula.InsertFormula(WORD_FORMULA28, wordSelection);
wordSelection.TypeText(_T("\n 式中: P"));
font.SetSubscript(2); //处理下标
wordSelection.TypeText(_T("x"));
font.SetSubscript(0);
wordSelection.TypeText(_T(" -- 管道某一x断面处的压力(mbar)1mbar=100pa=0.1kPa\n"));
wordSelection.TypeText(_T(" h"));
font.SetSubscript(2); //处理下标
wordSelection.TypeText(_T("x"));
font.SetSubscript(0);
wordSelection.TypeText(_T(" -- 雨水斗顶面至计算断面的高度差(m)\n"));
wordSelection.TypeText(_T(" v"));
font.SetSubscript(2); //处理下标
wordSelection.TypeText(_T("x"));
font.SetSubscript(0);
wordSelection.TypeText(_T(" -- 管道某一x断面处流速(m/s)\n"));
wordSelection.TypeText(_T(" ∑Z"));
font.SetSubscript(2); //处理下标
wordSelection.TypeText(_T("x-2"));
font.SetSubscript(0);
wordSelection.TypeText(_T(" -- 断面处对应最远雨水斗至计算断面的总阻力损失之和(mbar)\n"));
wordSelection.TypeText(_T("\n8、压力余量计算公式:\n"));
wordSelection.TypeText(_T(" "));
wdFormula.InsertFormula(WORD_FORMULA29, wordSelection);
wordSelection.TypeText(_T("\n 式中:△P"));
font.SetSubscript(2); //处理下标
wordSelection.TypeText(_T("r"));
font.SetSubscript(0);
wordSelection.TypeText(_T(" -- 压力余量(mbar)1mbar=100pa=0.1kPa\n"));
wordSelection.TypeText(_T(" H--雨水斗顶面与排水管出口的几何高差(m)\n"));
wordSelection.TypeText(_T(" V"));
font.SetSubscript(2); //处理下标
wordSelection.TypeText(_T("1"));
font.SetSubscript(0);
wordSelection.TypeText(_T(" -- 排水管出口的管道流速(m/s)\n"));
wordSelection.TypeText(_T(" ∑Z -- 最远雨水斗至排水口处的总阻力损失之和(mbar)\n"));
wdFormula.CloseFile();
font.SetSize(dSize + 1);
font.SetBold(dBold + 1);
wordSelection.TypeText(_T("\n三、虹吸雨水水力计算表:\n"));
font.SetBold(dBold);
font.SetSize(dSize);
Selection wSelection2 = wordApplication.GetSelection();
wSelection2.TypeParagraph();
//画表格
int rows(nLen+1), columns(12);
Selection wSelection = wordApplication.GetSelection();
Range oRange = wSelection.GetRange();
Tables oTables = activeDocument.GetTables();
_Table oTable = oTables.Add(oRange, rows, columns);
Borders oBorders = oTable.GetBorders();
oBorders.SetInsideLineStyle(1); // 设置表格线型
oBorders.SetOutsideLineStyle(1);
Columns oColumns;
Column oColumn;
oColumns = oTable.GetColumns();
oColumn = oColumns.Item(1);
oColumn.SetWidth(30, 0); // 0 = wdAdjustNone
oColumn = oColumns.Item(2);
oColumn.SetWidth(30, 0);
oColumn = oColumns.Item(3);
oColumn.SetWidth(40, 0);
oColumn = oColumns.Item(4);
oColumn.SetWidth(40, 0);
oColumn = oColumns.Item(5);
oColumn.SetWidth(40, 0);
oColumn = oColumns.Item(6);
oColumn.SetWidth(40, 0);
oColumn = oColumns.Item(7);
oColumn.SetWidth(40, 0);
oColumn = oColumns.Item(8);
oColumn.SetWidth(40, 0);
oColumn = oColumns.Item(9);
oColumn.SetWidth(40, 0);
oColumn = oColumns.Item(10);
oColumn.SetWidth(50, 0);
oColumn = oColumns.Item(11);
oColumn.SetWidth(40, 0);
oColumn = oColumns.Item(12);
oColumn.SetWidth(50, 0);
Cell oCell;
oCell = oTable.Cell(1, 1);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("管段名称"));
oCell = oTable.Cell(1, 2);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("流量(L/s)"));
oCell = oTable.Cell(1, 3);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("管长(m)"));
oCell = oTable.Cell(1, 4);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("管径(mm)"));
oCell = oTable.Cell(1, 5);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("流速(m/s)"));
oCell = oTable.Cell(1, 6);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("沿程阻力损失(kPa)"));
oCell = oTable.Cell(1, 7);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("局部阻力系数"));
oCell = oTable.Cell(1, 8);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("局部阻力损失(kPa)"));
oCell = oTable.Cell(1, 9);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("总阻力损失(kPa)"));
oCell = oTable.Cell(1, 10);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("Σ总阻力损失(kPa)"));
oCell = oTable.Cell(1, 11);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("高差(m)"));
oCell = oTable.Cell(1, 12);
oRange = oCell.GetRange();
oRange.InsertAfter(_T("压力(kPa)"));
for(int i = 0; i < nLen; i++)
{
oCell = oTable.Cell(i+2, 1); //管段名称
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 0).GetText());
oCell = oTable.Cell(i+2, 2); //流量(L/s)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 1).GetText());
oCell = oTable.Cell(i+2, 3); //管长(m)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 2).GetText());
oCell = oTable.Cell(i+2, 4); //管径(mm)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 3).GetText());
oCell = oTable.Cell(i+2, 5); //流速(m/s)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 4).GetText());
oCell = oTable.Cell(i+2, 6); //沿程阻力损失(kPa)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 5).GetText());
oCell = oTable.Cell(i+2, 7); //局部阻力系数
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 6).GetText());
oCell = oTable.Cell(i+2, 8); //局部阻力损失(kPa)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 7).GetText());
oCell = oTable.Cell(i+2, 9); //总阻力损失(kPa)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 8).GetText());
oCell = oTable.Cell(i+2, 10); //Σ总阻力损失(kPa)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 9).GetText());
oCell = oTable.Cell(i+2, 11); //高差(m)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 10).GetText());
oCell = oTable.Cell(i+2, 12); //压力(kPa)
oRange = oCell.GetRange();
oRange.InsertAfter(m_listCtrl.GetCell(i, 11).GetText());
}
COleVariant vtOptional2((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
wordSelection = wordApplication.GetSelection();
wordSelection.GoTo(COleVariant((short)3), // 3 = wdGoToLine
COleVariant((short)-1),vtOptional2,vtOptional2); // -1 = wdGoToLast
wSelection = wordApplication.GetSelection();
wSelection.TypeParagraph();
font.SetSize(dSize + 1);
font.SetBold(dBold + 1);
wordSelection.TypeText(_T("四、计算结果:\n"));
font.SetBold(dBold);
font.SetSize(dSize);
CString strMaxP, strP;
for(it = m_vecData.begin(); it != m_vecData.end(); it++)
{
SIPHONINFO info = *it;
if (info.nType == 1)
{
continue;
}
ads_name name;
acdbGetAdsName(name, info.id);
Entity ent(name);
CString strTemp;
strTemp = ReadXdata(ent, _T("MaxNP"));
if (strTemp == _T("1")) //最大负压管段
{
double dMaxP = info.dP;
strMaxP.Format(_T("%.2f kPa\n"), dMaxP);
}
CString strOutPipe = ReadXdata(ent, _T("OutPipe"));
if (strOutPipe == _T("1")) //出流端管段
{
double dv = info.dv;
double dEle = info.dEle, dH2 = info.dH2;
double dP = 98.1 * info.dEle - 5 * dv * dv - info.dH2 * 10; //压力余量
dP *= 0.1;
strP.Format(_T("%.1f kPa\n"), dP);
}
}
wordSelection.TypeText(_T("管道最大负压值: ") + strMaxP);
wordSelection.TypeText(_T("压力余量:") + strP);
}
void CSiphonRainwaterCalcDlg::SetChamferPipe(std::map<AcDbObjectId, AcDbObjectId> &mapPipe)
{
m_mapChamferPipe.clear();
m_mapChamferPipe = mapPipe;
}