/******************************************************************** created: 2004/09/07 created: 7:9:2004 16:42 filename: f:\tg_dev\telecdev\twtkernal\feedcalc.cpp file path: f:\tg_dev\telecdev\twtkernal file base: feedcalc file ext: cpp author: 沈睿 purpose: 给水计算 *********************************************************************/ #include "stdafx.h" //#include #include #include #include #include "CalcFeedDataDlg.h" //*************************************************************************************************** // 住宅给水计算 //*************************************************************************************************** double GetAcByU0(double nU0) { //差值法查表 2003规范 P107页 double nAc(0); if(nU0 <= 1) nAc = 0.00323; else if(nU0 > 1 && nU0 <= 1.5) nAc = GetValBetween2(0.00323, 0.00697, 1.0, 1.5, nU0); else if(nU0 > 1.5 && nU0 <= 2.0) nAc = GetValBetween2(0.00697, 0.01097, 1.5, 2.0, nU0); else if(nU0 > 2.0 && nU0 <= 2.5) nAc = GetValBetween2(0.01097, 0.01512, 2.0, 2.5, nU0); else if(nU0 > 2.5 && nU0 <= 3.0) nAc = GetValBetween2(0.01512, 0.01939, 2.5, 3.0, nU0); else if(nU0 > 3.0 && nU0 <= 3.5) nAc = GetValBetween2(0.01939, 0.02374, 3.0, 3.5, nU0); else if(nU0 > 3.5 && nU0 <= 4.0) nAc = GetValBetween2(0.02374, 0.02816, 3.5, 4.0, nU0); else if(nU0 > 4.0 && nU0 <= 4.5) nAc = GetValBetween2(0.02816, 0.03263, 4.0, 4.5, nU0); else if(nU0 > 4.5 && nU0 <= 5.0) nAc = GetValBetween2(0.03263, 0.03715, 4.5, 5.0, nU0); else if(nU0 > 5.0 && nU0 <= 6.0) nAc = GetValBetween2(0.03715, 0.04629, 5.0, 6.0, nU0); else if(nU0 > 6.0 && nU0 <= 7.0) nAc = GetValBetween2(0.04629, 0.05555, 6.0, 7.0, nU0); else if(nU0 > 7.0 && nU0 <= 8.0) nAc = GetValBetween2(0.05555, 0.06489, 7.0, 8.0, nU0); else if(nU0 > 8.0 ) nAc = 0.06489; return nAc; } //把立管加入SCalcFloorData结构中 void AddVerticalPipeToData(SSearchPipeList *pListAll, DList &lstFeedData, BOOL bFromDownToUp) { AcDbObjectId id = NULL; id = pListAll->m_ID; if(pListAll->m_iType == 0){//管线 CString csFloor,csVPipeName; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ CString csLabel = pPipe->GetSysLabel(); int idx = csLabel.Find(_T("-")); if(idx > -1){ csFloor = csLabel.Left(idx); csVPipeName = csLabel.Right(csLabel.GetLength()-idx-1); } } OPENOBJ_END(); if(csFloor.Find(_T("立管")) >= 0){ int iLen = (int)_tcslen(_T("立管")); int iNum = csFloor.GetLength() - iLen; csFloor = csFloor.Left(iNum); if(!bFromDownToUp){//自上往下供水,4楼立管属于3楼,。。。//小心UNICODE iLen = (int)_tcslen(_T("楼")); csFloor = csFloor.Left(csFloor.GetLength() - iLen); csFloor.Format(_T("%d楼"), _ttoi(csFloor) - 1); } int len = lstFeedData.Length(); for(int i=0;im_csFloor == csFloor && pDataTmp->m_csVPipeName == csVPipeName){ pDataTmp->m_IDMain = id; break; } } } } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; AddVerticalPipeToData(pList, lstFeedData, bFromDownToUp); } } //转换数据函数 把链表转换为数组 BOOL TransformCalcFeedData(SSearchPipeList *pListAll, DList &lstFeedData, CString csCurFloor, CString csCurVPipeName) { AcDbObjectId id = NULL; id = pListAll->m_ID; if(pListAll->m_iType == -1){ double nDang(0); double nPeopleNum(3); double nFactor(2.8); int iRation(250), iDoorNum(1); double nU0(0); double nAc(0); double nU(0); AcDbObjectId id = pListAll->m_ID; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ nDang = pEquip->GetDang(); nPeopleNum = pEquip->GetPipeLength(); nFactor = _tstof(pEquip->GetNumber()); iRation = _ttoi(pEquip->GetSysBlock()); iDoorNum = pEquip->GetICookie(0); if(iDoorNum < 1) iDoorNum = 1; if(nDang < 0 && nPeopleNum < 0.5)//根本没有住宅信息 return FALSE; if(iDoorNum < 0.001 || nDang < 0.001) nU0 = 0; else nU0 = (iDoorNum * iRation * nPeopleNum * nFactor) / (0.2*iDoorNum * nDang*24*3600); nAc = GetAcByU0(nU0*100); if(iDoorNum < 0.001 || nDang < 0.001) nU = 0; else nU = (1 + nAc * pow((iDoorNum * nDang -1), 0.49)) / sqrt(iDoorNum * nDang); } OPENOBJ_END(); int len = lstFeedData.Length(); for(int i=0;im_csFloor == csCurFloor && pDataTmp->m_csVPipeName == csCurVPipeName){ SCalcHouseData *pData = new SCalcHouseData(); pData->m_ID = id;//前一节点是管线 pData->m_iDoorNum = iDoorNum; pData->m_nNg = nDang; pData->m_nPeopleNum = nPeopleNum; pData->m_nFactor = nFactor; pData->m_iRation = iRation; pData->m_nU0 = nU0; pData->m_nAc = nAc; pData->m_nU = nU; pDataTmp->m_lstHouse.Append(pData); break; } } } else if(pListAll->m_iType == 0){//管线 CString csFloor, csVPipeName; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ CString csLabel = pPipe->GetSysLabel(); int idx = csLabel.Find(_T("-")); if(idx > -1){ csFloor = csLabel.Left(idx); csVPipeName = csLabel.Right(csLabel.GetLength()-idx-1); } } OPENOBJ_END(); if(csFloor != _T("") && csFloor.Find(_T("立管")) < 0){ int len = lstFeedData.Length(); BOOL bExist = FALSE; for(int i=0;im_csFloor == csFloor && pDataTmp->m_csVPipeName == csVPipeName){ bExist = TRUE; break; } } if(!bExist){ csCurFloor = csFloor; csCurVPipeName = csVPipeName; SCalcFloorData *pNewData = new SCalcFloorData(); pNewData->m_csFloor = csFloor; pNewData->m_csVPipeName = csVPipeName; pNewData->m_ID = id; lstFeedData.Append(pNewData); } } } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; BOOL ret = TransformCalcFeedData(pList, lstFeedData, csCurFloor, csCurVPipeName); if(!ret) return FALSE; } return TRUE; } //计算函数 void DoCalcResidenceFeed(DList &lstFeedData, BOOL bFromDownToUp, BOOL bIsReCalc) { int len = lstFeedData.Length(); double nI(-1), nLost(-1), nSpeed(0); //计算每层支管管径 for(int i=0;im_lstHouse.Length(); double nSigmaU0(0), nSigmaNg(0); for(int j=0;jm_lstHouse[j]; double nAllNg = pData->m_iDoorNum * pData->m_nNg; AcDbObjectId id = pData->m_ID; AcDbObjectId idPipe = NULL; nSigmaU0 += (pData->m_nU0 * pData->m_nNg * pData->m_iDoorNum); nSigmaNg += pData->m_nNg * pData->m_iDoorNum; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ int num = pEquip->GetInterfaceNum(); if(num == 1){ TPipeInterface face; pEquip->GetInterface(0, face); idPipe = face.m_idPipe; } } OPENOBJ_END(); if(!idPipe) continue; int iDn = GetPipeDnByQ(0.2*pData->m_nU*nAllNg, idPipe, nLost, nI, nSpeed, bIsReCalc); ads_name ent; acdbGetAdsName(ent, idPipe); DoDimPipeDn(ent, iDn, _T("自动"), g_nPipeDnHeight-0.5, FALSE, FALSE); } double nTmpU0(0); //平均出流概率 加权 if(nSigmaNg < 0.001) nTmpU0 = 0; else nTmpU0 = nSigmaU0 / nSigmaNg; double nTmpAc = GetAcByU0(nTmpU0*100); double nTmpU(0); if(nSigmaNg < 0.001) nTmpU = 0; else nTmpU = (1 + nTmpAc * pow((nSigmaNg -1), 0.49)) / sqrt(nSigmaNg); pDataTmp->m_nNg = nSigmaNg; pDataTmp->m_nSigmaU0 = nSigmaU0; if(!pDataTmp->m_ID) continue; int iDn2 = GetPipeDnByQ(0.2*nTmpU*nSigmaNg, pDataTmp->m_ID, nLost, nI, nSpeed, bIsReCalc); ads_name ent2; acdbGetAdsName(ent2, pDataTmp->m_ID); DoDimPipeDn(ent2, iDn2, _T("自动"), g_nPipeDnHeight, FALSE, FALSE); } DList lstVPipeData; //计算每层立管管径 int iLen = (int)_tcslen(_T("楼"));//兼容UNICODE for(i=0;im_csFloor; CString csCurVPipeName = pDataCur->m_csVPipeName; int iCurFloor = _ttoi(csCurFloor.Left(csCurFloor.GetLength() - iLen)); for(int j=0;jm_csFloor; CString csVPipeName = pDataTmp->m_csVPipeName; int iFloor = _ttoi(csFloor.Left(csFloor.GetLength() - iLen)); if(bFromDownToUp){//自下向上 if(iCurFloor <= iFloor && csVPipeName == csCurVPipeName){ nSigmaU0 += pDataTmp->m_nSigmaU0; nSigmaNg += pDataTmp->m_nNg; } } else{ if(iCurFloor >= iFloor && csVPipeName == csCurVPipeName){ nSigmaU0 += pDataTmp->m_nSigmaU0; nSigmaNg += pDataTmp->m_nNg; } } } ////////// 创建立管信息 ///////////////////////////// int lenVPipe = lstVPipeData.Length(); BOOL bFlag = TRUE; for(int nn=0;nnm_csVPipeName == csCurVPipeName){ bFlag = FALSE; lstVPipeData[nn]->m_nSigmaU0 += pDataCur->m_nSigmaU0; lstVPipeData[nn]->m_nAllNg += pDataCur->m_nNg; if(csCurFloor == _T("干管")) lstVPipeData[nn]->m_IDMain = pDataCur->m_ID; } } if(bFlag){ SCalcFloorData *pNew = new SCalcFloorData(); pNew->m_csFloor = _T("干管"); pNew->m_csVPipeName = csCurVPipeName; pNew->m_nSigmaU0 = pDataCur->m_nSigmaU0; pNew->m_nAllNg = pDataCur->m_nNg; lstVPipeData.Append(pNew); if(csCurFloor == _T("干管")) lstVPipeData[nn]->m_IDMain = pDataCur->m_ID; } ////////////////////////////////////////////////////////////// double nTmpU0(0); //平均出流概率 加权 if(nSigmaNg < 0.001) nTmpU0 = 0; else nTmpU0 = nSigmaU0 / nSigmaNg; double nTmpAc = GetAcByU0(nTmpU0*100); double nTmpU(0); if(nSigmaNg < 0.001) nTmpU = 0; else nTmpU = (1 + nTmpAc * pow((nSigmaNg -1), 0.49)) / sqrt(nSigmaNg); double nQ = 0.2*nTmpU*nSigmaNg; pDataCur->m_nQ = nQ; pDataCur->m_nAllNg = nSigmaNg; pDataCur->m_nRetU = nTmpU; if(!pDataCur->m_IDMain) continue; int iDn3 = GetPipeDnByQ(nQ, pDataCur->m_IDMain, nLost, nI, nSpeed, bIsReCalc); pDataCur->m_iDn = iDn3; pDataCur->m_nV = nSpeed; pDataCur->m_nI = nI; pDataCur->m_nLost = nLost; ads_name ent3; acdbGetAdsName(ent3, pDataCur->m_IDMain); DoDimPipeDn(ent3, iDn3, _T("自动"), g_nPipeDnHeight, FALSE, FALSE); } //计算每栋立管管径 for(i=0;im_csVPipeName; int iCurPipeName = _ttoi(csCurVPipeName); for(int j=0;jm_csVPipeName; int iPipeName = _ttoi(csVPipeName); if(iCurPipeName >= iPipeName){ nSigmaU0 += pDataTmp->m_nSigmaU0; nSigmaNg += pDataTmp->m_nAllNg; } } double nTmpU0(0); //平均出流概率 加权 if(nSigmaNg < 0.001) nTmpU0 = 0; else nTmpU0 = nSigmaU0 / nSigmaNg; double nTmpAc = GetAcByU0(nTmpU0*100); double nTmpU(0); if(nSigmaNg < 0.001) nTmpU = 0; else nTmpU = (1 + nTmpAc * pow((nSigmaNg -1), 0.49)) / sqrt(nSigmaNg); double nQ = 0.2*nTmpU*nSigmaNg; pDataCur->m_nQ = nQ; pDataCur->m_nAllNg = nSigmaNg; pDataCur->m_nRetU = nTmpU; if(!pDataCur->m_IDMain) continue; int iDn3 = GetPipeDnByQ(nQ, pDataCur->m_IDMain, nLost, nI, nSpeed, bIsReCalc); pDataCur->m_iDn = iDn3; pDataCur->m_nV = nSpeed; pDataCur->m_nI = nI; pDataCur->m_nLost = nLost; ads_name ent3; acdbGetAdsName(ent3, pDataCur->m_IDMain); DoDimPipeDn(ent3, iDn3, _T("自动"), g_nPipeDnHeight, FALSE, FALSE); //计算每层立管管径 for(int m=0;mm_csVPipeName == pDataCur->m_csVPipeName && pData->m_csFloor == pDataCur->m_csFloor){ pData->m_nQ = pDataCur->m_nQ; pData->m_nAllNg = pDataCur->m_nAllNg; pData->m_nRetU = pDataCur->m_nRetU; pData->m_iDn = pDataCur->m_iDn; pData->m_nV = pDataCur->m_nV; pData->m_nI = pDataCur->m_nI; pData->m_nLost = pDataCur->m_nLost; break; } } } } void CalcFeedImportWord(DList &lstFeedData) { //初始化 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(0); // 0: 居左 1:居中 2:居右 wordSelection.TypeText(_T("按照建筑给水排水设计规范 (GB 50015-2003)进行计算 \n")); wordSelection.TypeText(_T("计算公式: \n")); wordSelection.TypeText(_T("1:计算U0 = (q0*m*Kh)/(0.2*Ng*T*3600)\n")); wordSelection.TypeText(_T("αc 对应于不同U0的系数 \n")); wordSelection.TypeText(_T("式中: \n")); wordSelection.TypeText(_T("U0 -- 生活给水管道的最大用水时卫生器具给水当量平均出流概率(%) \n")); wordSelection.TypeText(_T("q0-- 最高用水日的用水定额\n")); wordSelection.TypeText(_T("m-- 每户用水人数 \n")); wordSelection.TypeText(_T("Kh-- 小时变化系数 \n")); wordSelection.TypeText(_T("Ng-- 每户设置的卫生器具给水当量数\n")); wordSelection.TypeText(_T("T-- 用水时数(h)\n")); wordSelection.TypeText(_T("0.2-- 一个卫生器具给水当量的额定流量(L/s) \n\n")); wordSelection.TypeText(_T("2:计算U = (1 + αc * pow((Ng - 1), 0.49)) / SQRT(Ng) \n")); wordSelection.TypeText(_T("式中: \n")); wordSelection.TypeText(_T("U--计算管段的卫生器具给水当量同时出溜概率(%) \n")); wordSelection.TypeText(_T("αc对应于不同U0的系数 \n")); wordSelection.TypeText(_T("Ng--计算管段的卫生器具给水当量总数 \n\n")); wordSelection.TypeText(_T("3:计算管段的设计秒流量Qg = 0.2*U*Ng \n\n")); wordSelection.TypeText(_T("各楼层计算结果如下 \n")); int iNumFloor = lstFeedData.Length(); //画表格 int rows(iNumFloor+1), columns(9); Selection wSelection = wordApplication.GetSelection(); Range oRange = wSelection.GetRange(); Tables oTables = activeDocument.GetTables(); _Table oTable = oTables.Add(oRange, rows, columns); // cet 2010.3.25 add Borders oBorders = oTable.GetBorders(); oBorders.SetInsideLineStyle(1); // 设置表格线型 oBorders.SetOutsideLineStyle(1); Columns oColumns; Column oColumn; oColumns = oTable.GetColumns(); oColumn = oColumns.Item(1); oColumn.SetWidth(50, 0); // 0 = wdAdjustNone oColumn = oColumns.Item(2); oColumn.SetWidth(55, 0); oColumn = oColumns.Item(3); oColumn.SetWidth(50, 0); oColumn = oColumns.Item(4); oColumn.SetWidth(70, 0); oColumn = oColumns.Item(5); oColumn.SetWidth(50, 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); Cell oCell; oCell = oTable.Cell(1, 1); oRange = oCell.GetRange(); oRange.InsertAfter(_T("楼层")); oCell = oTable.Cell(1, 2); oRange = oCell.GetRange(); oRange.InsertAfter(_T("本层当量")); oCell = oTable.Cell(1, 3); oRange = oCell.GetRange(); oRange.InsertAfter(_T("总当量∑Ng")); oCell = oTable.Cell(1, 4); oRange = oCell.GetRange(); oRange.InsertAfter(_T("同时出流概率U")); oCell = oTable.Cell(1, 5); oRange = oCell.GetRange(); oRange.InsertAfter(_T("流量(l/s)")); oCell = oTable.Cell(1, 6); oRange = oCell.GetRange(); oRange.InsertAfter(_T("立管管径")); oCell = oTable.Cell(1, 7); oRange = oCell.GetRange(); oRange.InsertAfter(_T("流速")); oCell = oTable.Cell(1, 8); oRange = oCell.GetRange(); oRange.InsertAfter(_T("水力坡降")); oCell = oTable.Cell(1, 9); oRange = oCell.GetRange(); oRange.InsertAfter(_T("沿程损失")); for(int i=1;i<=iNumFloor;i++){ SCalcFloorData *pData = lstFeedData[i-1]; CString csFloor, csAllNg, csU, csQ, csDn, csCurNg, csDe, csV , csI, csLost; csFloor = pData->m_csVPipeName + _T("#-") + pData->m_csFloor; csCurNg.Format(_T("%.1f"), pData->m_nNg); csDn.Format(_T("%d"), pData->m_iDn); csU.Format(_T("%.2f"), pData->m_nRetU); csQ.Format(_T("%.2f"), pData->m_nQ); csAllNg.Format(_T("%.1f"), pData->m_nAllNg); csV.Format(_T("%.2f"), pData->m_nV); csI.Format(_T("%.3f"), pData->m_nI); csLost.Format(_T("%.3f"), pData->m_nLost); oCell = oTable.Cell(i+1, 1); // 楼层 oRange = oCell.GetRange(); oRange.InsertAfter(csFloor); oCell = oTable.Cell(i+1, 2); // 当量 oRange = oCell.GetRange(); oRange.InsertAfter(csCurNg); oCell = oTable.Cell(i+1, 3); // 总当量 oRange = oCell.GetRange(); oRange.InsertAfter(csAllNg); oCell = oTable.Cell(i+1, 4); // 同时出流概率 oRange = oCell.GetRange(); oRange.InsertAfter(csU); oCell = oTable.Cell(i+1, 5); // 流量 oRange = oCell.GetRange(); oRange.InsertAfter(csQ); oCell = oTable.Cell(i+1, 6); // 立管管径 oRange = oCell.GetRange(); oRange.InsertAfter(csDn); oCell = oTable.Cell(i+1, 7); // 流速 oRange = oCell.GetRange(); oRange.InsertAfter(csV); oCell = oTable.Cell(i+1, 8); oRange = oCell.GetRange(); oRange.InsertAfter(csI); oCell = oTable.Cell(i+1, 9); oRange = oCell.GetRange(); oRange.InsertAfter(csLost); } } //主函数 void ResidenceFeedCalc() { Entity entMainPipe; RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT"), 8, _T("*"), NULL); RBList rbMaskPipe = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); if(SelectEntity(_T("\n请选择给水总干管<退出>"), entMainPipe, rbMaskPipe) != RTNORM) { return; } DList lstFeedData; SSearchPipeList *pListAll = new SSearchPipeList(); PickSet ssAll(SS_FREE); ssAll += entMainPipe; if(!SearchSprinkPipeSys(entMainPipe, NULL, pListAll, ssAll)){ AfxMessageBox(_T("系统有回路!")); delete pListAll; return; } if(!TransformCalcFeedData(pListAll, lstFeedData, CString(), CString())){ AfxMessageBox(_T("没有住宅信息!请首先执行【修改当量】")); delete pListAll; return; } BOOL bFromDownToUp = TRUE; CString csFeedDir = ReadXdata(entMainPipe, _T("TG-FEED-DIR")); if(csFeedDir == _T("自下而上")) bFromDownToUp = TRUE; else if(csFeedDir == _T("自上而下")) bFromDownToUp = FALSE; else if(csFeedDir == _T("")){ bFromDownToUp = TRUE; // OPENOBJ_BEGIN(entMainPipe, AcDb::kForRead, TDbPipe, pPipe); // if(pPipe){ // CString csFloor = pPipe->GetSysLabel(); // if(csFloor.Find(_T("1楼立管")) > -1) // bFromDownToUp = TRUE; // else{ // CString csTmp; // csTmp.Format(_T("%d楼立管"), lstFeedData.Length()+1); // if(csFloor.Find(csTmp) > -1) // bFromDownToUp = FALSE; // else{ // delete pListAll; // return; // } // } // } // OPENOBJ_END(); } AddVerticalPipeToData(pListAll, lstFeedData, bFromDownToUp); delete pListAll; TCHAR szTmp[64]; BOOL bIsReCale = FALSE; OPENOBJ_BEGIN(entMainPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ CString csLable = pPipe->GetLabel(); if(csLable != _T("")) { int ret2 = ads_getstring(0, _T("\n已经计算过,是否进行复算(已知管径,计算流速):"), szTmp); if(_tcsicmp(szTmp, _T("Y")) == 0) bIsReCale = TRUE; if(ret2 == RTCAN) return; } } OPENOBJ_END(); DoCalcResidenceFeed(lstFeedData, bFromDownToUp, bIsReCale); UpdateMultDim(); CalcFeedImportWord(lstFeedData); return; }