// OutDrainCalcDlg.cpp : implementation file // #include "stdafx.h" #include #include #include "OutDrainCalcDlg.h" #include "CanalCalcDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define TAB_FULL 0 #define TAB_GRADE 1 //extern double GetValBetween2(double n1, double n2, double nRange1, double nRange2, double nFactor); //*************************************************************************************************** // 雨水水力 //*************************************************************************************************** //《给水排水设计手册》红皮 P436 满流 double CalcPipeV(double nDn, double nI, double n) { double nTemp = 1 / n; nI = pow(nI, 0.5); double nR = pow(0.25*nDn, 2.0/3.0); return nTemp*nI*nR; } int PlusRainDn(int dn, BOOL bPlus) { int ret(0); if(bPlus){ //增大一级管径 if(dn == 250) ret = 300; else if(dn == 300) ret = 350; else if(dn == 350) ret = 400; else if(dn == 400) ret = 450; else if(dn == 450) ret = 500; else if(dn == 500) ret = 600; else if(dn == 600) ret = 700; else if(dn == 700) ret = 800; else if(dn == 800) ret = 900; else if(dn == 900) ret = 1000; else if(dn == 1000) ret = 1100; else if(dn == 1100) ret = 1200; else if(dn == 1200) ret = 1350; else if(dn == 1350) ret = 1500; else if(dn == 1500) ret = 1650; else if(dn == 1650) ret = 1800; else if(dn == 1800) ret = 2000; else if(dn == 2000) ret = 2100; else if(dn == 2100) ret = 2200; else if(dn == 2200) ret = 2300; else if(dn == 2300) ret = 2400; else if(dn == 2400) ret = 2500; else if(dn == 2500) ret = 2600; else if(dn == 2600) ret = 2700; else if(dn == 2700) ret = 2800; else if(dn == 2800) ret = 2900; else if(dn == 2900) ret = 3000; else ret = 3000; } else{ if(dn == 300) ret = 250; else if(dn == 350) ret = 300; else if(dn == 400) ret = 350; else if(dn == 450) ret = 400; else if(dn == 500) ret = 450; else if(dn == 600) ret = 500; else if(dn == 700) ret = 600; else if(dn == 800) ret = 700; else if(dn == 900) ret = 800; else if(dn == 1000) ret = 900; else if(dn == 1100) ret = 1000; else if(dn == 1200) ret = 1100; else if(dn == 1350) ret = 1200; else if(dn == 1500) ret = 1350; else if(dn == 1650) ret = 1500; else if(dn == 1800) ret = 1650; else if(dn == 2000) ret = 1800; else if(dn == 2100) ret = 2000; else if(dn == 2200) ret = 2100; else if(dn == 2300) ret = 2200; else if(dn == 2400) ret = 2300; else if(dn == 2500) ret = 2400; else if(dn == 2600) ret = 2500; else if(dn == 2700) ret = 2600; else if(dn == 2800) ret = 2700; else if(dn == 2900) ret = 2800; else if(dn == 3000) ret = 2900; } return ret; } // 初算管径 // 已知流量 以及 粗糙系数 根据 流速不能小于 0.6 原则, 给出最大管径 int GetFirstPipeDnByQ(double nQ, double nN, double &nRetI, double &nRetV) { BOOL bMetal = FALSE; if(fabs(nN - 0.012) < 0.001 || fabs(nN - 0.013) < 0.001 || fabs(nN - 0.014) < 0.001) bMetal = TRUE; double nTempI = 0.003; //以下数字出自:《给水排水管网系统》P217 主要针对于污水管,所以经验流量×1。5 (污水充满度55%) int dn = 300;//小区道路最小是300 if(nQ < 23.9) dn = 300; else if(nQ < 39.72*1.8) dn = 350; else if(nQ < 51.88*1.8){ dn = 400; nTempI = 0.0025; } else if(nQ < 65.66*1.8){ dn = 450; nTempI = 0.002; } else if(nQ < 88.08*1.8){ dn = 500; nTempI = 0.0015; } else if(nQ < 126.84*1.8){ dn = 600; nTempI = 0.0015; } else if(nQ < 172.65*1.8){ dn = 700; nTempI = 0.001; } else if(nQ < 222.5*1.8){ dn = 800; nTempI = 0.001; } else if(nQ < 285.39*1.8){ dn = 900; nTempI = 0.001; } else if(nQ < 379.11*1.8){ dn = 1000; nTempI = 0.001; } else if(nQ < 458.72*1.8){ dn = 1100; nTempI = 0.001; } else if(nQ < 545.92*1.8){ dn = 1200; nTempI = 0.0005; } else if(nQ < 690.93*1.8){ dn = 1350; nTempI = 0.0005; } else if(nQ < 853*1.8){ dn = 1500; nTempI = 0.0005; } else if(nQ < 1032.13*1.8){ dn = 1650; nTempI = 0.0005; } else { dn = 1800; nTempI = 0.0005; } nQ = nQ / 1000;// 把L/S 转化为 M3/S double nSlowV = 0.7; while(1){ double nV(0); double nI = nTempI - 0.0005; double nRadius = (double)dn / 1000; while(nV < nSlowV || (nV > 10 && bMetal) || (nV > 5 && !bMetal)){ nI += 0.0005; nV = CalcPipeV(nRadius, nI, nN); if(dn == 300 && nRetI > 0.003){ nI = 0.003; nV = CalcPipeV(nRadius, nI, nN); } } nRetI = nI; nRetV = nV; double nTempQ = (0.25*nRadius*nRadius*PI)*nV; double nTmp = nTempQ - nQ; if(nTempQ < nQ && dn < 3000){ dn = PlusRainDn(dn, TRUE); //设计流量不够,管径加大一号 continue; } if(dn == 300) break; //把当前管径小2号,计算设计流量,如果设计流量仍然大于计算流量,就把当前管径小1号 int iTempDn = PlusRainDn(dn, FALSE); iTempDn = PlusRainDn(iTempDn, FALSE); double nTempDn = (double)iTempDn / 1000; nTempQ = (0.25*nTempDn*nTempDn*PI)*nV; if(nTempQ > nQ && dn > 300){ dn = PlusRainDn(dn, FALSE); continue; } else break; if(dn == 300) break; } return dn; } ///////////////////////////////////////////////////////////////////////////// // COutDrainCalcDlg dialog void OutDrainCalc() { CTemporaryResourceOverride vTemp; COutDrainCalcDlg dlg; dlg.DoModal(); } COutDrainCalcDlg::COutDrainCalcDlg(CWnd* pParent /*=NULL*/) : CDialog(COutDrainCalcDlg::IDD, pParent) { //{{AFX_DATA_INIT(COutDrainCalcDlg) m_iFull = 0; m_iPipeType = 0; m_csN = _T("0.014"); m_csDn = _T("300"); m_nQ = 30; m_csFull = _T("55"); m_csI = _T(""); m_csV = _T(""); m_csGrade = _T("3"); //}}AFX_DATA_INIT m_dQ = 0.0; m_dA = 0.0; } void COutDrainCalcDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(COutDrainCalcDlg) DDX_Control(pDX, IDC_TAB_METHOD, m_tabDrain); DDX_Control(pDX, IDC_COMBO_DN, m_comboDn); DDX_Radio(pDX, IDC_RADIO_FULL1, m_iFull); DDX_Radio(pDX, IDC_RADIO_PIPE1, m_iPipeType); DDX_CBString(pDX, IDC_COMBO_N, m_csN); DDX_CBString(pDX, IDC_COMBO_DN, m_csDn); DDX_Text(pDX, IDC_EDIT_Q, m_nQ); DDX_CBString(pDX, IDC_COMBO_FULL, m_csFull); DDX_Text(pDX, IDC_EDIT_I, m_csI); DDX_Text(pDX, IDC_EDIT_V, m_csV); DDX_CBString(pDX, IDC_COMBO_GRADE, m_csGrade); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(COutDrainCalcDlg, CDialog) //{{AFX_MSG_MAP(COutDrainCalcDlg) ON_BN_CLICKED(IDC_RADIO_PIPE1, OnRadioPipe1) ON_BN_CLICKED(IDC_RADIO_PIPE2, OnRadioPipe2) ON_BN_CLICKED(IDC_RADIO_PIPE3, OnRadioPipe3) ON_BN_CLICKED(IDC_RADIO_PIPE4, OnRadioPipe4) ON_BN_CLICKED(IDC_BUTTON_LAW, OnButtonLaw) ON_BN_CLICKED(IDC_RADIO_FULL1, OnRadioFull1) ON_BN_CLICKED(IDC_RADIO_FULL2, OnRadioFull2) ON_CBN_SELCHANGE(IDC_COMBO_DN, OnSelchangeComboDn) ON_BN_CLICKED(IDC_BUTTON_LOOKUP, OnButtonLookup) ON_BN_CLICKED(IDC_BUTTON_WORD, OnButtonWord) ON_BN_CLICKED(IDC_RADIO_PIPE5, OnRadioPipe5) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_METHOD, OnSelchangeTabMethod) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COutDrainCalcDlg message handlers BOOL COutDrainCalcDlg::OnInitDialog() { CDialog::OnInitDialog(); m_tabDrain.InsertItem(0,_T("充满度")); m_tabDrain.InsertItem(1,_T("坡度")); m_tabDrain.SetCurSel(0); InitCalcData(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void COutDrainCalcDlg::OnRadioPipe1() { UpdateData(TRUE); m_csN = _T("0.014"); UpdateData(FALSE); } void COutDrainCalcDlg::OnRadioPipe2() { UpdateData(TRUE); m_csN = _T("0.013"); UpdateData(FALSE); } void COutDrainCalcDlg::OnRadioPipe3() { UpdateData(TRUE); m_csN = _T("0.012"); UpdateData(FALSE); } void COutDrainCalcDlg::OnRadioPipe4() { UpdateData(TRUE); m_csN = _T("0.009"); UpdateData(FALSE); } void COutDrainCalcDlg::OnRadioPipe5() { CTemporaryResourceOverride vTemp; CCanalCalcDlg dlg; dlg.DoModal(); } void COutDrainCalcDlg::OnButtonLaw() { AfxMessageBox(_T("建筑小区室外生活排水管最小管径、最小设计坡度、最大设计充满度!《2003全国民用建筑工程设计技术措施》\n\n排水管道类别 位置 管材 最小管径 最小设计坡度 最大设计充满度\n----------------------------------------------------------------------------------------------------------------------------------\n接户管 建筑物周围 埋地塑料管 160 0.005 0.5\n接户管 建筑物周围 混凝土管 150 0.007 0.5\n支管 组团内道路下 埋地塑料管 160 0.005 0.5\n支管 组团内道路下 混凝土管 200 0.004 0.55\n干管 小区道路、市政道路下 埋地塑料管 200 0.004 0.55\n干管 小区道路、市政道路下 混凝土管 300 0.003 0.55\n\n注:\n1:任何直径的排水管道,其坡度不得大于0.15\n2:管径超过900mm时,最小设计坡度不得小于0.001\n3:居住小区排水管道接户管最小管径150mm,服务人口不宜超过250人(70户),超过的最小管径宜用200mm\n")); } void COutDrainCalcDlg::OnSelchangeComboDn() { UpdateData(TRUE); int sel = m_comboDn.GetCurSel(); m_comboDn.GetLBText(sel, m_csDn); if(m_iFull == 1) return; double nDn = _tstof(m_csDn); if(nDn > 999) m_csFull = _T("75"); else if(nDn > 499) m_csFull = _T("70"); else if(nDn > 399) m_csFull = _T("65"); else m_csFull = _T("55"); UpdateData(FALSE); } void COutDrainCalcDlg::OnRadioFull1() { UpdateData(TRUE); CWnd *pWnd = GetDlgItem(IDC_COMBO_FULL); pWnd->EnableWindow(TRUE); double nDn = _tstof(m_csDn); if(nDn > 999) m_csFull = _T("75"); else if(nDn > 499) m_csFull = _T("70"); else if(nDn > 399) m_csFull = _T("65"); else m_csFull = _T("55"); CWnd *pWnd2 = GetDlgItem(IDC_COMBO_DN); pWnd2->EnableWindow(TRUE); UpdateData(FALSE); } void COutDrainCalcDlg::OnRadioFull2() { UpdateData(TRUE); CWnd *pWnd = GetDlgItem(IDC_COMBO_FULL); pWnd->EnableWindow(FALSE); CWnd *pWnd2 = GetDlgItem(IDC_COMBO_DN); pWnd2->EnableWindow(FALSE); m_csFull = _T("100"); UpdateData(FALSE); } //查表已知h/D 求 A/A0 q/q0 数据来源孙洁 中国建筑工业出版社 《给水排水管网系统》 非满流管渠水力计算 P53 void COutDrainCalcDlg::LookUp(double nFull, double &nA, double &nQ) { if(fabs(nFull - 0.05) < 0.001){ nA = 0.019; nQ = 0.005; } else if(fabs(nFull - 0.1) < 0.001){ nA = 0.052; nQ = 0.021; } else if(fabs(nFull - 0.15) < 0.001){ nA = 0.094; nQ = 0.049; } else if(fabs(nFull - 0.2) < 0.001){ nA = 0.142; nQ = 0.088; } else if(fabs(nFull - 0.25) < 0.001){ nA = 0.196; nQ = 0.137; } else if(fabs(nFull - 0.3) < 0.001){ nA = 0.252; nQ = 0.196; } else if(fabs(nFull - 0.35) < 0.001){ nA = 0.312; nQ = 0.263; } else if(fabs(nFull - 0.4) < 0.001){ nA = 0.374; nQ = 0.337; } else if(fabs(nFull - 0.45) < 0.001){ nA = 0.436; nQ = 0.417; } else if(fabs(nFull - 0.5) < 0.001){ nA = 0.5; nQ = 0.5; } else if(fabs(nFull - 0.55) < 0.001){ nA = 0.564; nQ = 0.586; } else if(fabs(nFull - 0.6) < 0.001){ nA = 0.626; nQ = 0.672; } else if(fabs(nFull - 0.65) < 0.001){ nA = 0.688; nQ = 0.756; } else if(fabs(nFull - 0.7) < 0.001){ nA = 0.748; nQ = 0.837; } else if(fabs(nFull - 0.75) < 0.001){ nA = 0.804; nQ = 0.912; } else if(fabs(nFull - 0.8) < 0.001){ nA = 0.858; nQ = 0.977; } else if(fabs(nFull - 0.85) < 0.001){ nA = 0.906; nQ = 1.03; } else if(fabs(nFull - 0.9) < 0.001){ nA = 0.948; nQ = 1.066; } else if(fabs(nFull - 0.95) < 0.001){ nA = 0.981; nQ = 1.075; } else if(fabs(nFull - 1.0) < 0.001){ nA = 1; nQ = 1; } } //求一个2位小数点实数的四舍五入,注意是0.05进位 void GetDoubleLimit(double nRes, double &Up, double &Down) { nRes = nRes * 10; int iTmp = (int)nRes; double nTmp = nRes - iTmp; double nTmp2 = nRes + 0.5; int iTmp2 = (int)nTmp2; if(iTmp2 > iTmp){ //发生进位 Up = (double)iTmp2 / 10; Down = ((double)iTmp + 0.5) / 10; } else{ Down = (double)iTmp / 10; Up = ((double)iTmp + 0.5) / 10; } } //雨水满流计算 void COutDrainCalcDlg::DoCalcRain() { UpdateData(TRUE); double n = _tstof(m_csN);//粗糙系数 double nI(0), nV(0); int iDn = GetFirstPipeDnByQ(m_nQ, n, nI, nV); // double nQ = m_nQ / 1000;// 把L/S 转化为 M3/S // double nDn = _tstof(m_csDn) / 1000; //单位是 平方米 // double nA = (0.25*nDn*nDn*PI); // double nV = nQ / nA; // // double nI(0); // double nR = pow(0.25*nDn, 2.0/3.0); // double nTmp = 1 / n; // nTmp = nTmp * nR; // nTmp = nV / nTmp; // nI = nTmp*nTmp * 1000; nI = nI * 1000; m_csV.Format(_T("%.2f"), nV); m_csI.Format(_T("%.2f"), nI); m_csDn.Format(_T("%d"), iDn); UpdateData(FALSE); if(nV < 0.6) MessageBox(_T("2003技术措施:排水管道的最小设计流速:在设计充满度下为0.6m/s")); else if(nV > 5 && (m_iPipeType == 0 || m_iPipeType == 3)) MessageBox(_T("2003技术措施:非金属排水管道的最大设计流速为5m/s")); else if(nV > 10 && (m_iPipeType == 1 || m_iPipeType == 2)) MessageBox(_T("2003技术措施:金属排水管道的最大设计流速为10m/s")); } void COutDrainCalcDlg::OnOK() { UpdateData(TRUE); int nCur = m_tabDrain.GetCurSel(); switch(nCur) { case TAB_FULL: //计算充满度 CaculateFull(); break; case TAB_GRADE: //计算坡度 CaculateGrade(); break; default: break; } UpdateData(FALSE); } void COutDrainCalcDlg::OnButtonLookup() { //以下数字出自:《给水排水管网系统》P217 主要针对于污水管 UpdateData(TRUE); if(m_nQ < 0.01){ MessageBox(_T("请输入流量值。上华软件提供用水量计算。")); return; } int dn = 200; if(m_nQ < 9.19) dn = 200; else if(m_nQ < 16.6) dn = 250; else if(m_nQ < 23.9) dn = 300; else if(m_nQ < 39.72) dn = 350; else if(m_nQ < 51.88) dn = 400; else if(m_nQ < 65.66) dn = 450; else if(m_nQ < 88.08) dn = 500; else if(m_nQ < 126.84) dn = 600; else if(m_nQ < 172.65) dn = 700; else if(m_nQ < 222.5) dn = 800; else if(m_nQ < 285.39) dn = 900; else if(m_nQ < 379.11) dn = 1000; else if(m_nQ < 458.72) dn = 1100; else if(m_nQ < 545.92) dn = 1200; else if(m_nQ < 690.93) dn = 1350; else if(m_nQ < 853) dn = 1500; else if(m_nQ < 1032.13) dn = 1650; else dn = 1800; CString csTmp; csTmp.Format(_T("流量为%.2f时,污水管最大管径是:%d (n = 0.014)"), m_nQ, dn); MessageBox(csTmp); } void COutDrainCalcDlg::RainWord() { DoCalcRain(); //初始化 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; } wordApplication.SetVisible(TRUE); wordDocuments = wordApplication.GetDocuments(); activeDocument = wordDocuments.Add(vtOptional,vtOptional); //写一行字 wordSelection = wordApplication.GetSelection(); wordParagraphs = wordSelection.GetParagraphs(); wordParagraphs.SetAlignment(1); // 0: 居左 1:居中 2:居右 wordSelection.TypeText(_T("室外雨水水力计算书\n")); wordParagraphs.SetAlignment(0); // 0: 居左 1:居中 2:居右 wordSelection.TypeText(_T("已知条件:\n")); wordSelection.TypeText((const TCHAR*)XString(_T("流量Q = %.2f (L/s)\n"), m_nQ)); wordSelection.TypeText((const TCHAR*)XString(_T("粗糙系数n = %s\n"), m_csN)); wordSelection.TypeText(_T("计算结果:\n")); wordSelection.TypeText((const TCHAR*)XString(_T("管径DN = %s mm\n"), m_csDn)); wordSelection.TypeText((const TCHAR*)XString(_T("坡度(千分之) = %s\n"), m_csI)); wordSelection.TypeText((const TCHAR*)XString(_T("流速(m/s) = %s\n\n"), m_csV)); double nV = _tstof(m_csV); if(nV < 0.6) wordSelection.TypeText(_T("不符合规范设计!2003技术措施:排水管道的最小设计流速:在设计充满度下为0.6m/s")); else if(nV > 5 && (m_iPipeType == 0 || m_iPipeType == 3)) wordSelection.TypeText(_T("不符合规范设计!2003技术措施:非金属排水管道的最大设计流速为5m/s")); else if(nV > 10 && (m_iPipeType == 1 || m_iPipeType == 2)) wordSelection.TypeText(_T("不符合规范设计!2003技术措施:金属排水管道的最大设计流速为10m/s")); else wordSelection.TypeText(_T("符合规范设计!")); } void COutDrainCalcDlg::OnButtonWord() { UpdateData(); int nCur = m_tabDrain.GetCurSel(); switch(nCur) { case TAB_FULL: //充满度计算书 CaculateFullWord(); break; case TAB_GRADE: //坡度计算书 CaculateGradeWord(); break; default: break; } } void COutDrainCalcDlg::OnSelchangeTabMethod(NMHDR* pNMHDR, LRESULT* pResult) { int nCur = m_tabDrain.GetCurSel(); CWnd *pWnd = NULL; switch(nCur) { case TAB_FULL: //hide pWnd = GetDlgItem(IDC_STATIC_NOT_FILL); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); pWnd = GetDlgItem(IDC_STATIC_PD_DATA); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); pWnd = GetDlgItem(IDC_COMBO_GRADE); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); //show pWnd = GetDlgItem(IDC_RADIO_FULL1); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_RADIO_FULL2); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_COMBO_FULL); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_COMBO_FULL); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_STATIC_FILL_DATA); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); //处理特殊控件 pWnd = GetDlgItem(IDC_RADIO_PIPE5); ASSERT(pWnd != NULL); pWnd->EnableWindow(TRUE); pWnd = GetDlgItem(IDC_STATIC_TEXT_CHANGE); ASSERT(pWnd != NULL); pWnd->SetWindowText(_T("坡度(千分之):")); break; case TAB_GRADE: //show pWnd = GetDlgItem(IDC_STATIC_NOT_FILL); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_STATIC_PD_DATA); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_COMBO_GRADE); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); //hide pWnd = GetDlgItem(IDC_RADIO_FULL1); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); pWnd = GetDlgItem(IDC_RADIO_FULL2); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); pWnd = GetDlgItem(IDC_COMBO_FULL); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); pWnd = GetDlgItem(IDC_COMBO_FULL); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); pWnd = GetDlgItem(IDC_STATIC_FILL_DATA); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); //处理特殊控件 pWnd = GetDlgItem(IDC_RADIO_PIPE5); ASSERT(pWnd != NULL); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_STATIC_TEXT_CHANGE); ASSERT(pWnd != NULL); pWnd->SetWindowText(_T("充满度(%):")); break; default: break; } *pResult = 0; } //初始化,默认充满度 void COutDrainCalcDlg::InitCalcData() { CWnd *pWnd = NULL; //hide pWnd = GetDlgItem(IDC_STATIC_NOT_FILL); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); pWnd = GetDlgItem(IDC_STATIC_PD_DATA); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); pWnd = GetDlgItem(IDC_COMBO_GRADE); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_HIDE); //show pWnd = GetDlgItem(IDC_RADIO_FULL1); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_RADIO_FULL2); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_COMBO_FULL); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_COMBO_FULL); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); pWnd = GetDlgItem(IDC_STATIC_FILL_DATA); ASSERT(pWnd != NULL); pWnd->ShowWindow(SW_SHOW); } //根据充满度计算 void COutDrainCalcDlg::CaculateFull() { if(m_nQ < 0.01){ MessageBox(_T("请输入流量值。上华软件提供用水量计算。")); return; } if(m_iFull == 1){ DoCalcRain(); return; } //以下污水非满流计算 double nTmpA(-1), nTmpQ(-1); double nFull = _tstof(m_csFull)/100; //第一步,根据充满度得到, 查表 nTmpA(A/A0) nTmpQ(q/q0), LookUp(nFull, nTmpA, nTmpQ); //第二步,nTmpA(A/A0) nTmpQ(q/q0) 差值法计算得到最终的 A/A0 q/q0 if(nTmpA < 0 || nTmpQ < 0){ double nUp(-1), nDown(-1); double nTmpA2(-1), nTmpQ2(-1), nTmpA3(-1), nTmpQ3(-1); GetDoubleLimit(nFull, nUp, nDown); LookUp(nUp, nTmpA2, nTmpQ2); LookUp(nDown, nTmpA3, nTmpQ3); //差值法 //GetValBetween2(0.005, 0.021, 0.05, 0.1, 0.7); 比如查0.7的q/q0 nTmpA = GetValBetween2(nTmpA3, nTmpA2, nDown, nUp, nFull); nTmpQ = GetValBetween2(nTmpQ3, nTmpQ2, nDown, nUp, nFull); } if(nTmpA < 0 || nTmpQ < 0){ return; } // 《给水排水管网系统》P54 //公式:I= 10.29/ pow(D, 5.333) * (n * q / nTmpQ) * (n * q / nTmpQ) double nQ = m_nQ / 1000;// 把L/S 转化为 M3/S double n = _tstof(m_csN);//粗糙系数 double nDn = _tstof(m_csDn) / 1000; //单位是 平方米 double nI = 10.29/ pow(nDn, 5.333); nI = nI * (n * nQ / nTmpQ) * (n * nQ / nTmpQ) * 1000; double nV = 1.273 * nQ; // 把L/S 转化为 M3/S nV = nV / (nDn * nDn * nTmpA); m_csV.Format(_T("%.2f"), nV); m_csI.Format(_T("%.2f"), nI); if(nV < 0.6) MessageBox(_T("2003技术措施:排水管道的最小设计流速:在设计充满度下为0.6m/s")); else if(nV > 5 && (m_iPipeType == 0 || m_iPipeType == 3)) MessageBox(_T("2003技术措施:非金属排水管道的最大设计流速为5m/s")); else if(nV > 10 && (m_iPipeType == 1 || m_iPipeType == 2)) MessageBox(_T("2003技术措施:金属排水管道的最大设计流速为10m/s")); } //根据坡度计算 void COutDrainCalcDlg::CaculateGrade() { if(m_nQ < 0.01) { MessageBox(_T("请输入流量值。上华软件提供用水量计算。")); return; } //1 计算q/q0 double dQ = 0.0,dFull = 0.0,dA = 0.0; double dAMax = 0.0,dAMin = 0.0; double dFullMax = 0.0,dFullMin = 0.0; double dTmpQMax = 0.0,dTmpQMin = 0.0; dQ = (pow(4,1.67) * m_nQ * 0.001 * _tstof(m_csN))/(PI * pow(_tstof(m_csGrade)*0.001,0.5) * pow(_tstof(m_csDn)*0.001,2.67)); if (dQ > 0.977) { MessageBox(_T("非满流管道流量比大于1,请增大管径")); m_csI.Empty(); m_csV.Empty(); UpdateData(FALSE); return; } else if (dQ < 0.005) { MessageBox(_T("非满流管道流量比过小,请减小管径")); m_csV.Empty(); m_csI.Empty(); UpdateData(FALSE); return; } //2查表得到近似的dFull和dA GetSearchTableData(dQ,dFullMax,dFullMin,dAMax,dAMin,dTmpQMax,dTmpQMin); //3利用内插法计算真正的dFull,dA dA = (dQ - dTmpQMin)/(dTmpQMax - dTmpQMin)*(dAMax - dAMin) + dAMin; dFull = (dQ - dTmpQMin)/(dTmpQMax - dTmpQMin)*(dFullMax - dFullMin) + dFullMin; m_dA = dA; m_dQ = dQ; //4计算流量 double dV = 0.0; dV = (4 * m_nQ * 0.001)/(PI * pow(_tstof(m_csDn)*0.001,2) * dA); //5显示结果 m_csI.Format(_T("%.2f"),dFull*100); m_csV.Format(_T("%.2f"),dV); if(dV < 0.6) MessageBox(_T("2003技术措施:排水管道的最小设计流速:在设计充满度下为0.6m/s")); else if(dV > 5 && (m_iPipeType == 0 || m_iPipeType == 3)) MessageBox(_T("2003技术措施:非金属排水管道的最大设计流速为5m/s")); else if(dV > 10 && (m_iPipeType == 1 || m_iPipeType == 2)) MessageBox(_T("2003技术措施:金属排水管道的最大设计流速为10m/s")); } //根据充满度计算的计算书 void COutDrainCalcDlg::CaculateFullWord() { if(m_nQ < 0.01){ MessageBox(_T("请输入流量值。上华软件提供用水量计算。")); return; } if(m_iFull == 1){ RainWord(); return; } double nTmpA(-1), nTmpQ(-1); double nFull = _tstof(m_csFull)/100; LookUp(nFull, nTmpA, nTmpQ); if(nTmpA < 0 || nTmpQ < 0){ double nUp(-1), nDown(-1); double nTmpA2(-1), nTmpQ2(-1), nTmpA3(-1), nTmpQ3(-1); GetDoubleLimit(nFull, nUp, nDown); LookUp(nUp, nTmpA2, nTmpQ2); LookUp(nDown, nTmpA3, nTmpQ3); //差值法 //GetValBetween2(0.005, 0.021, 0.05, 0.1, 0.7); 比如查0.7的q/q0 nTmpA = GetValBetween2(nTmpA3, nTmpA2, nDown, nUp, nFull); nTmpQ = GetValBetween2(nTmpQ3, nTmpQ2, nDown, nUp, nFull); } if(nTmpA < 0 || nTmpQ < 0){ return; } // nTmpA = A / A0 nTmpQ = q / q0 //公式:I= 10.29/ pow(D, 5.333) * (n * q / nTmpQ) * (n * q / nTmpQ) double nQ = m_nQ / 1000;// 把L/S 转化为 M3/S double n = _tstof(m_csN);//粗糙系数 double nDn = _tstof(m_csDn) / 1000; //单位是 平方米 double nI = 10.29/ pow(nDn, 5.333); nI = nI * (n * nQ / nTmpQ) * (n * nQ / nTmpQ) * 1000; double nV = 1.273 * nQ; // 把L/S 转化为 M3/S nV = nV / (nDn * nDn * nTmpA); //初始化 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; } wordApplication.SetVisible(TRUE); wordDocuments = wordApplication.GetDocuments(); activeDocument = wordDocuments.Add(vtOptional,vtOptional); //写一行字 wordSelection = wordApplication.GetSelection(); wordParagraphs = wordSelection.GetParagraphs(); wordParagraphs.SetAlignment(1); // 0: 居左 1:居中 2:居右 wordSelection.TypeText(_T("室外污水水力计算书\n")); wordParagraphs.SetAlignment(0); // 0: 居左 1:居中 2:居右 wordSelection.TypeText(_T("已知条件:\n")); wordSelection.TypeText((const TCHAR*)XString(_T("流量Q = %.2f (L/s)\n"), m_nQ)); wordSelection.TypeText((const TCHAR*)XString(_T("粗糙系数n = %s\n"), m_csN)); wordSelection.TypeText((const TCHAR*)XString(_T("设计充满度 = %s %\n\n"), m_csFull)); wordSelection.TypeText(_T("查表结果:\n")); wordSelection.TypeText((const TCHAR*)XString(_T("A/A0非满流管道过水断面面积比 = %.2f\n"), nTmpA)); wordSelection.TypeText((const TCHAR*)XString(_T("q/q0非满流管道流量比 = %.2f\n\n"), nTmpQ)); wordSelection.TypeText(_T("计算结果:\n")); wordSelection.TypeText((const TCHAR*)XString(_T("管径DN = %s mm\n"), m_csDn)); wordSelection.TypeText((const TCHAR*)XString(_T("坡度(千分之) = %.2f\n"), nI)); wordSelection.TypeText((const TCHAR*)XString(_T("流速(m/s) = %.2f\n\n"), nV)); if(nV < 0.6) wordSelection.TypeText(_T("不符合规范设计!2003技术措施:排水管道的最小设计流速:在设计充满度下为0.6m/s")); else if(nV > 5 && (m_iPipeType == 0 || m_iPipeType == 3)) wordSelection.TypeText(_T("不符合规范设计!2003技术措施:非金属排水管道的最大设计流速为5m/s")); else if(nV > 10 && (m_iPipeType == 1 || m_iPipeType == 2)) wordSelection.TypeText(_T("不符合规范设计!2003技术措施:金属排水管道的最大设计流速为10m/s")); else wordSelection.TypeText(_T("符合规范设计!")); } //根据坡度计算的计算书 void COutDrainCalcDlg::CaculateGradeWord() { //初始化 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; } CString sTmpText; wordApplication.SetVisible(TRUE); wordDocuments = wordApplication.GetDocuments(); activeDocument = wordDocuments.Add(vtOptional,vtOptional); //写一行字 wordSelection = wordApplication.GetSelection(); wordParagraphs = wordSelection.GetParagraphs(); wordParagraphs.SetAlignment(1); // 0: 居左 1:居中 2:居右 wordSelection.TypeText(_T("室外污水水力计算书\n")); wordParagraphs.SetAlignment(0); // 0: 居左 1:居中 2:居右 wordSelection.TypeText(_T("已知条件:\n")); wordSelection.TypeText((const TCHAR*)XString(_T("流量Q = %.2f (L/s)\n"), m_nQ)); wordSelection.TypeText((const TCHAR*)XString(_T("粗糙系数n = %s\n"), m_csN)); wordSelection.TypeText((const TCHAR*)XString(_T("水力坡度(千分之) = %s \n\n"), m_csGrade)); wordSelection.TypeText(_T("查表结果:\n")); wordSelection.TypeText((const TCHAR*)XString(_T("A/A0非满流管道过水断面面积比 = %.2f\n"), m_dA)); wordSelection.TypeText((const TCHAR*)XString(_T("q/q0非满流管道流量比 = %.2f\n"), m_dQ)); sTmpText.Format(_T("h/D充满度 = %.2f\n\n"), _tstof(m_csI)/100); wordSelection.TypeText(sTmpText); wordSelection.TypeText(_T("计算结果:\n")); wordSelection.TypeText((const TCHAR*)XString(_T("管径DN = %s mm\n"), m_csDn)); sTmpText.Format(_T("充满度 = %.2f%s\n"), _tstof(m_csI),_T("%")); wordSelection.TypeText(sTmpText); wordSelection.TypeText((const TCHAR*)XString(_T("流速(m/s) = %.2f\n\n"), _tstof(m_csV))); if(_tstof(m_csV) < 0.6) wordSelection.TypeText(_T("不符合规范设计!2003技术措施:排水管道的最小设计流速:在设计充满度下为0.6m/s")); else if(_tstof(m_csV) > 5 && (m_iPipeType == 0 || m_iPipeType == 3)) wordSelection.TypeText(_T("不符合规范设计!2003技术措施:非金属排水管道的最大设计流速为5m/s")); else if(_tstof(m_csV) > 10 && (m_iPipeType == 1 || m_iPipeType == 2)) wordSelection.TypeText(_T("不符合规范设计!2003技术措施:金属排水管道的最大设计流速为10m/s")); else wordSelection.TypeText(_T("符合规范设计!")); } //查表求得h/D和A/A0 查表《给水排水管网系统》P53 表3.7 //已知q/q0,返回2行数据,调用程序再去求差值 void COutDrainCalcDlg::GetSearchTableData(double dQ,double &dFullMax,double &dFullMin,double &dAMax,double &dAMin,double &dTmpQMax,double &dTmpQMin) { dFullMin = 0.05; dAMin = 0.019; dTmpQMin = 0.005; dFullMax = 0.10; dAMax = 0.052; dTmpQMax = 0.021; //sr 2010-4-23 修改 if (dQ > (0.005 - 0.000001) && dQ < 0.021) { dFullMin = 0.05; dAMin = 0.019; dTmpQMin = 0.005; dFullMax = 0.10; dAMax = 0.052; dTmpQMax = 0.021; } else if (dQ > (0.021 - 0.000001) && dQ < 0.049) { dFullMin = 0.10; dAMin = 0.052; dTmpQMin = 0.021; dFullMax = 0.15; dAMax = 0.094; dTmpQMax = 0.049; } else if (dQ > (0.049 - 0.000001) && dQ < 0.088) { dFullMin = 0.15; dAMin = 0.094; dTmpQMin = 0.049; dFullMax = 0.20; dAMax = 0.142; dTmpQMax = 0.088; } else if (dQ > (0.088 - 0.000001) && dQ < 0.137) { dFullMin = 0.20; dAMin = 0.142; dTmpQMin = 0.088; dFullMax = 0.25; dAMax = 0.196; dTmpQMax = 0.137; } else if (dQ > (0.137 - 0.000001) && dQ < 0.196) { dFullMin = 0.25; dAMin = 0.196; dTmpQMin = 0.137; dFullMax = 0.30; dAMax = 0.252; dTmpQMax = 0.196; } else if (dQ > (0.196 - 0.000001) && dQ < 0.263) { dFullMin = 0.30; dAMin = 0.252; dTmpQMin = 0.196; dFullMax = 0.35; dAMax = 0.312; dTmpQMax = 0.263; } else if (dQ > (0.263 - 0.000001) && dQ < 0.337) { dFullMin = 0.35; dAMin = 0.312; dTmpQMin = 0.263; dFullMax = 0.40; dAMax = 0.374; dTmpQMax = 0.337; } else if (dQ > (0.337 - 0.000001) && dQ < 0.417) { dFullMin = 0.40; dAMin = 0.374; dTmpQMin = 0.337; dFullMax = 0.45; dAMax = 0.436; dTmpQMax = 0.417; } else if (dQ > (0.417 - 0.000001) && dQ < 0.500) { dFullMin = 0.45; dAMin = 0.436; dTmpQMin = 0.417; dFullMax = 0.50; dAMax = 0.500; dTmpQMax = 0.500; } else if (dQ > (0.500 - 0.000001) && dQ < 0.586) { dFullMin = 0.50; dAMin = 0.500; dTmpQMin = 0.500; dFullMax = 0.55; dAMax = 0.564; dTmpQMax = 0.586; } else if (dQ > (0.586 - 0.000001) && dQ < 0.672) { dFullMin = 0.55; dAMin = 0.564; dTmpQMin = 0.586; dFullMax = 0.60; dAMax = 0.626; dTmpQMax = 0.672; } else if (dQ > (0.672 - 0.000001) && dQ < 0.756) { dFullMin = 0.60; dAMin = 0.626; dTmpQMin = 0.672; dFullMax = 0.65; dAMax = 0.688; dTmpQMax = 0.756; } else if (dQ > (0.756 - 0.000001) && dQ < 0.837) { dFullMin = 0.65; dAMin = 0.688; dTmpQMin = 0.756; dFullMax = 0.70; dAMax = 0.748; dTmpQMax = 0.837; } else if (dQ > (0.837 - 0.000001) && dQ < 0.912) { dFullMin = 0.70; dAMin = 0.748; dTmpQMin = 0.837; dFullMax = 0.75; dAMax = 0.804; dTmpQMax = 0.912; } else if (dQ > (0.912 - 0.000001) && dQ < 0.977) { dFullMin = 0.75; dAMin = 0.804; dTmpQMin = 0.912; dFullMax = 0.80; dAMax = 0.858; dTmpQMax = 0.977; } else if (dQ > (0.977 - 0.000001) && dQ < 1.030) { dFullMin = 0.80; dAMin = 0.858; dTmpQMin = 0.977; dFullMax = 0.85; dAMax = 0.906; dTmpQMax = 1.030; } else if (dQ > (1.030 - 0.000001) && dQ < 1.066) { dFullMin = 0.85; dAMin = 0.906; dTmpQMin = 1.030; dFullMax = 0.90; dAMax = 0.948; dTmpQMax = 1.066; } else if (dQ > (1.066 - 0.000001) && dQ < 1.075) { dFullMin = 0.90; dAMin = 0.948; dTmpQMin = 1.066; dFullMax = 0.95; dAMax = 0.981; dTmpQMax = 1.075; } else if (dQ > (1.075 - 0.000001)) { dFullMin = 0.95; dAMin = 0.981; dTmpQMin = 1.075; dFullMax = 1.00; dAMax = 1.000; dTmpQMax = 1.000; } /* if (fabs((dQ - 0.005)*(dQ - 0.021) < 0)) { dFullMin = 0.05; dAMin = 0.019; dTmpQMin = 0.005; dFullMax = 0.10; dAMax = 0.052; dTmpQMax = 0.021; } else if (fabs((dQ - 0.021)*(dQ - 0.049) < 0)) { dFullMin = 0.10; dAMin = 0.052; dTmpQMin = 0.021; dFullMax = 0.15; dAMax = 0.094; dTmpQMax = 0.049; } else if (fabs((dQ - 0.049)*(dQ - 0.088) < 0)) { dFullMin = 0.15; dAMin = 0.094; dTmpQMin = 0.049; dFullMax = 0.20; dAMax = 0.142; dTmpQMax = 0.088; } else if (fabs((dQ - 0.088)*(dQ - 0.137) < 0)) { dFullMin = 0.20; dAMin = 0.142; dTmpQMin = 0.088; dFullMax = 0.25; dAMax = 0.196; dTmpQMax = 0.137; } else if (fabs((dQ - 0.137)*(dQ - 0.196) < 0)) { dFullMin = 0.25; dAMin = 0.196; dTmpQMin = 0.137; dFullMax = 0.30; dAMax = 0.252; dTmpQMax = 0.196; } else if (fabs((dQ - 0.196)*(dQ - 0.263) < 0)) { dFullMin = 0.30; dAMin = 0.252; dTmpQMin = 0.196; dFullMax = 0.35; dAMax = 0.312; dTmpQMax = 0.263; } else if (fabs((dQ - 0.263)*(dQ - 0.337) < 0)) { dFullMin = 0.35; dAMin = 0.312; dTmpQMin = 0.263; dFullMax = 0.40; dAMax = 0.374; dTmpQMax = 0.337; } else if (fabs((dQ - 0.337)*(dQ - 0.417) < 0)) { dFullMin = 0.40; dAMin = 0.374; dTmpQMin = 0.337; dFullMax = 0.45; dAMax = 0.436; dTmpQMax = 0.417; } else if (fabs((dQ - 0.417)*(dQ - 0.500) < 0)) { dFullMin = 0.45; dAMin = 0.436; dTmpQMin = 0.417; dFullMax = 0.50; dAMax = 0.500; dTmpQMax = 0.500; } else if (fabs((dQ - 0.500)*(dQ - 0.586) < 0)) { dFullMin = 0.50; dAMin = 0.500; dTmpQMin = 0.500; dFullMax = 0.55; dAMax = 0.564; dTmpQMax = 0.586; } else if (fabs((dQ - 0.586)*(dQ - 0.672) < 0)) { dFullMin = 0.55; dAMin = 0.564; dTmpQMin = 0.586; dFullMax = 0.60; dAMax = 0.626; dTmpQMax = 0.672; } else if (fabs((dQ - 0.672)*(dQ - 0.756) < 0)) { dFullMin = 0.60; dAMin = 0.626; dTmpQMin = 0.672; dFullMax = 0.65; dAMax = 0.688; dTmpQMax = 0.756; } else if (fabs((dQ - 0.756)*(dQ - 0.837) < 0)) { dFullMin = 0.65; dAMin = 0.688; dTmpQMin = 0.756; dFullMax = 0.70; dAMax = 0.748; dTmpQMax = 0.837; } else if (fabs((dQ - 0.837)*(dQ - 0.912) < 0)) { dFullMin = 0.70; dAMin = 0.748; dTmpQMin = 0.837; dFullMax = 0.75; dAMax = 0.804; dTmpQMax = 0.912; } else if (fabs((dQ - 0.912)*(dQ - 0.977) < 0)) { dFullMin = 0.75; dAMin = 0.804; dTmpQMin = 0.912; dFullMax = 0.80; dAMax = 0.858; dTmpQMax = 0.977; } else if (fabs((dQ - 0.977)*(dQ - 1.030) < 0)) { dFullMin = 0.80; dAMin = 0.858; dTmpQMin = 0.977; dFullMax = 0.85; dAMax = 0.906; dTmpQMax = 1.030; } else if (fabs((dQ - 1.030)*(dQ - 1.066) < 0)) { dFullMin = 0.85; dAMin = 0.906; dTmpQMin = 1.030; dFullMax = 0.90; dAMax = 0.948; dTmpQMax = 1.066; } else if (fabs((dQ - 1.066)*(dQ - 1.075) < 0)) { dFullMin = 0.90; dAMin = 0.948; dTmpQMin = 1.066; dFullMax = 0.95; dAMax = 0.981; dTmpQMax = 1.075; } else if (dQ > 1.075) { dFullMin = 0.95; dAMin = 0.981; dTmpQMin = 1.075; dFullMax = 1.00; dAMax = 1.000; dTmpQMax = 1.000; } */ }