// RainCalcDlg.cpp : implementation file // /******************************************************************** created: 2005/02/23 created: 23:2:2005 14:48 filename: f:\tg_dev\telecdev\twtkernal\raincalcdlg.cpp file path: f:\tg_dev\telecdev\twtkernal file base: raincalcdlg file ext: 沈睿 author: purpose: 室外雨水水力计算 *********************************************************************/ #include "stdafx.h" #include #include #include #include #include #include #include "CalcSheetDlg.h" #include "TWordFormulasTemplet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern int DoSerialNumber(SSearchPipeList *pListLast, int idx, BOOL IsMainNode); extern double CalcPipeV(double nDn, double nI, double n); extern double CalcPipeV(double nQ, double nDn, double nI, double n); extern BOOL CheckWellSys(SSearchPipeList *pListAll, BOOL bChcekPool); extern void SetPipeLabelType(TDbPipe *pPipe); //*************************************************************************************************** // 显示面积 //*************************************************************************************************** int g_iShowRainArea = 1; int GetRainAreaState() { ads_retint(g_iShowRainArea); return RTNORM; } int SetRainAreaState() { CString csAreaLayer = LAY_CALC_AREA; // 8.0发行之前要修改过来 if(g_iShowRainArea == 1) g_iShowRainArea = 0; else g_iShowRainArea = 1; TDocLock vLock; RBList rbMask(RTDXF0, _T("ATS_SPACE"), 8, csAreaLayer, NULL); PickSet ssAll(SS_FREE); ssAll.Get(_T("X"), NULL, NULL, rbMask); for(long j=0;jsetVisibility(AcDb::kVisible); else pSpace->setVisibility(AcDb::kInvisible); pSpace->SetHighlight(TRUE); } OPENOBJ_END(); } SetLayerOnOff(csAreaLayer, g_iShowRainArea); return GetRainAreaState(); } // ////*************************************************************************************************** //// 雨水参数 ////*************************************************************************************************** //void RainCalcParm() //{ // TCHAR szText[256]; // if(ads_getstring(0,_T("\n请选择要输入的雨水井参数1:径流系数 2:重现期 3:汇水时间<径流系数>:"), szText) != RTNORM) // return; // RBList rbMask(RTDXF0, _T("ATS_WELL"), 8, LAY_WELL_RAIN, NULL); // PickSet ss(SS_FREE); // if(_tcsicmp(szText, _T("3")) == 0){ // Entity ent; // if(SelectEntity(_T("\n请选择起点雨水井:<退出>"), ent, rbMask) != RTNORM) // return; // OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbWell, pEquip); // if(pEquip){ // int num = pEquip->GetInterfaceNum(); // if(num != 1){ // adsout << _T("\n不是起点井!"); // return; // } // } // OPENOBJ_END(); // ss+=ent; // } // else{ // if(SelectEntities(_T("\n请选择雨水井:<退出>"), ss, rbMask) != RTNORM) // return; // } // // CString csTime, csFactor, csP; // if(_tcsicmp(szText, _T("2")) == 0){ // int iP(0); // if(ads_getint(_T("\n请给出重现期<默认>:"), &iP) == RTNORM){ // if(iP > 0.001){ // csP.Format(_T("%d"), iP); // } // } // } // else if(_tcsicmp(szText, _T("3")) == 0){ // int iTime(0); // if(ads_getint(_T("\n请给出汇水时间(5~15分钟)<默认>:"), &iTime) == RTNORM){ // if(iTime > 0.1){ // csTime.Format(_T("%d"), iTime); // } // } // } // else{ // double nFactor(-1); // if(ads_getreal(_T("\n请给出单井径流系数(如:绿地0.15, 沥青路面0.6等))<默认>:"), &nFactor) == RTNORM){ // if(nFactor > 0.001){ // csFactor.Format(_T("%.2f"), nFactor); // } // } // } // for(long i=0;im_outline; // RBList rbFence = poly2d.Fence(); // PickSet ss(SS_FREE); // ss.Get(_T("CP"), rbFence, NULL, rbMask); // int len = ss.Length(); // if(len == 1){ // CString csArea; // double nArea = pDbSpace->m_nUseArea; // if(nArea < 1 && DocGetMeterUnitDraw()) // nArea = nArea * 1000000; // csArea.Format(_T("%.2f"), nArea); // WriteXdata(ss[0L], _T("TG-WELLAREA"), csArea); // } // } // OPENOBJ_END(); // } // } // // //void RainWellAreaCmd() //{ // double nArea(0); // CString csArea; // RBList rbMask(RTDXF0, _T("ATS_WELL"), 8, LAY_WELL_RAIN, NULL); // RBList rbMask2(RTDXF0, _T("ATS_SPACE"), 8, LAY_TWT_OUT, NULL); // PickSet ss(SS_FREE); // PickSet ssAll(SS_FREE); // ssAll.Get(_T("X"), NULL, NULL, rbMask2); // for(long j=0;jSetHighlight(TRUE); // } // OPENOBJ_END(); // } // // if(SelectEntities(_T("\n请选择雨水井:<退出>"), ss, rbMask) != RTNORM){ // return; // } // // long len = ss.Length(); // if(len == 1){ // XPoly2D poly2d; // if(GetOpenPoly2D(_T("\n请勾绘封闭汇流面积:"), poly2d)!=RTNORM) { // int iRet = ads_getreal(_T("\n请给出单井汇流面积(平方米)<退出>:"), &nArea); // if(iRet != RTNORM) // return; // } // else{ // if(!poly2d.IsClosed()) // poly2d.flag = 1; // XPoint ptLoc; // CString csName; // OPENOBJ_BEGIN(ss[0L], AcDb::kForWrite, TDbWell, pEquip); // if(pEquip){ // ptLoc = pEquip->GetLocation(); // csName = pEquip->GetWellName(); // double nScale = pEquip->GetScale(); // ads_polar(ptLoc, -PI/2, nScale*2, ptLoc); // } // OPENOBJ_END(); // if(!DocGetMeterUnitDraw()) // nArea = AS_SQMETER(poly2d.Area()); // else // nArea = poly2d.Area(); // adsout << _T("汇流面积=") << nArea << _T("(平方米)\n"); // TDbSpace *pDbSpace = new TDbSpace(); // pDbSpace->m_sName = csName + _T("汇流面积"); // pDbSpace->m_ptLocation = ptLoc; // pDbSpace->SetHas3D(FALSE); // pDbSpace->SetHighlight(TRUE); // pDbSpace->m_outline = poly2d; // pDbSpace->m_nUseArea = nArea; // pDbSpace->m_nOccuArea = 0; // pDbSpace->m_nCeilArea = 0; // pDbSpace->m_nWallSurfArea = 0; // pDbSpace->m_nExtWallArea = 0; // pDbSpace->m_nExtWinArea = 0; // pDbSpace->m_nExtDoorArea = 0; // pDbSpace->m_nPerimeter = 0; // pDbSpace->m_nKickboardLength = 0; // pDbSpace->SetShowOutline(TRUE); // // // pDbSpace->SetTextStyleId(InitTextStyle(g_csDimWellStyle)); // pDbSpace->AddToCSpace(Adesk::kFalse); // pDbSpace->setLayer(InitLayer(LAY_TWT_OUT)); // pDbSpace->close(); // } // } // else{ // int iRet = ads_getreal(_T("\n请给出单井汇流面积(平方米)<退出>:"), &nArea); // if(iRet != RTNORM) // return; // } // csArea.Format(_T("%.2f"), nArea); // for(long i=0;i &lstSpec, const TCHAR* szMat); int DoPlusRainDn(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; } int GetDnBySpecList(int dn) { DList lstSpec; GetPipeSpecList(lstSpec, _T("钢筋混凝土管")); int idx = -1; int len = lstSpec.Length(); for(int j=0;j dn) return iDnTmp; } return dn; } int PlusRainDn(int dn, BOOL bPlus) { DList lstSpec; GetPipeSpecList(lstSpec, _T("钢筋混凝土管")); int idx = -1; int len = lstSpec.Length(); for(int j=0;j dn && bPlus){ return iDnTmp; } else if(iDnTmp > dn && !bPlus && j>1){ iDnTmp = *lstSpec[j-1]; return iDnTmp; } } int ret(dn); if(bPlus && idx != len-1) ret = *lstSpec[idx+1]; else if(!bPlus && idx != 0) ret = *lstSpec[idx-1]; return ret; } // 根据<<给水排水管网系统>> P55 按充满度为1 进行计算管径 int GetFirstPipeDnByQ2(double nQ, double nN, double nI, double &nRetV) { int dn = 300;//小区道路最小是300 double dTmp = pow(nQ / 1000.0, 3.0/8.0); double dTmp2 = pow(nI / 1000.0, 3.0/16.0); dTmp = dTmp / dTmp2 * 0.304 * 1000; dTmp -= 0.1; if(dTmp < 300) dn = 300; else if(dTmp < 350) dn = 350; else if(dTmp < 400) dn = 400; else if(dTmp < 450) dn = 450; else if(dTmp < 500) dn = 500; else if(dTmp < 600) dn = 600; else if(dTmp < 700) dn = 700; else if(dTmp < 800) dn = 800; else if(dTmp < 900) dn = 900; else if(dTmp < 1000) dn = 1000; else if(dTmp < 1100) dn = 1100; else if(dTmp < 1200) dn = 1200; else if(dTmp < 1350) dn = 1350; else if(dTmp < 1500) dn = 1500; else if(dTmp < 1650) dn = 1650; else if(dTmp < 1800) dn = 1800; else if(dTmp < 2000) dn = 2000; else if(dTmp < 2100) dn = 2100; else if(dTmp < 2200) dn = 2200; else if(dTmp < 2300) dn = 2300; else if(dTmp < 2400) dn = 2400; else if(dTmp < 2500) dn = 2500; else if(dTmp < 2600) dn = 2600; else if(dTmp < 2700) dn = 2700; else dn = 2800; double nRadius = (double)dn / 1000; nRetV = CalcPipeV(nQ/1000.0, nRadius, nI/1000.0, nN); return dn; } // 初算管径 已知坡度 // 已知流量 以及 粗糙系数 根据 流速不能小于 0.6 原则, 给出最大管径 int GetFirstPipeDnByQ3(double nQ, double nN, double nI, 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; //以下数字出自:《给水排水管网系统》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; else if(nQ < 65.66*1.8) dn = 450; else if(nQ < 88.08*1.8) dn = 500; else if(nQ < 126.84*1.8) dn = 600; else if(nQ < 172.65*1.8) dn = 700; else if(nQ < 222.5*1.8) dn = 800; else if(nQ < 285.39*1.8) dn = 900; else if(nQ < 379.11*1.8) dn = 1000; else if(nQ < 458.72*1.8) dn = 1100; else if(nQ < 545.92*1.8) dn = 1200; else if(nQ < 690.93*1.8) dn = 1350; else if(nQ < 853*1.8) dn = 1500; else if(nQ < 1032.13*1.8) dn = 1650; else dn = 1800; nI = nI / 1000; nQ = nQ / 1000;// 把L/S 转化为 M3/S double nSlowV = 0.7; dn = GetDnBySpecList(dn); while(1){ double nV(0); double nRadius = (double)dn / 1000; nV = CalcPipeV(nQ, nRadius, nI, nN); while(nV < nSlowV || (nV > 10 && bMetal) || (nV > 5 && !bMetal)){ if(nV > nSlowV) dn = PlusRainDn(dn, FALSE); else dn = PlusRainDn(dn, TRUE); nRadius = (double)dn / 1000; nV = CalcPipeV(nQ, nRadius, nI, nN); if(dn == 250){ nRetV = nV; return dn; } if(nV < 0){ dn = PlusRainDn(dn, TRUE); nRadius = (double)dn / 1000; nV = CalcPipeV(nRadius, nI, nN); break; } } 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); break; } else break; if(dn == 300) break; } return dn; } // 初算管径 // 已知流量 以及 粗糙系数 根据 流速不能小于 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; dn = GetDnBySpecList(dn); 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){ int dn2 = dn; dn = PlusRainDn(dn2, TRUE); //设计流量不够,管径加大一号 if(dn == dn2) break; 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); if(dn == 300) break; else continue; } else break; if(dn == 300) break; } return dn; } //计算本节点往后有多少井 void CalcWellNum(SSearchPipeList *pListAll) { AcDbObjectId id = NULL; id = pListAll->m_ID; pListAll->m_iNum = 0; if(pListAll->m_iType == 3) pListAll->m_iNum = 1; ads_name ent; acdbGetAdsName(ent, id); long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; CalcWellNum(pList); pListAll->m_iNum += pList->m_iNum; } } extern void ShowPipe(const AcDbObjectId &idPipe); extern void AnyKeyReturn(const CString &sTip); extern bool HandlePipeDimType(TDbPipe *pPipe, int &nSelType); bool g_bPipeShow = false; // cet 2012.1.9 add 图面赋值控制变量 int g_nSelType = -1; // cet 2012.1.9 add 图面赋值控制变量 //将初算结果标注在图中 管径 & 坡度 void DimRainCalcResult(SSearchPipeList *pListAll) { BOOL bDrawLabel = false; // cet 2012.1.10 add 管线是否显示标注 AcDbObjectId id = NULL; id = pListAll->m_ID; if(pListAll->m_iType == 0){ ads_name ent; acdbGetAdsName(ent, id); XPoint ptStart, ptEnd; GetPipePoint(ent, ptStart, ptEnd); //对于接雨水口的支管,不需要标注 BOOL bIsLink2Gully = FALSE; OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe){ bDrawLabel = pPipe->IsDrawLabel(); // cet 2012.1.10 add 记录原始设置 AcDbObjectId idNode1 = pPipe->GetNode(0); OPENOBJ_BEGIN(idNode1, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ TCHAR* szLay = pEquip->layer(); if(_tcsicmp(szLay, LAY_TWT_GULLY) == 0) bIsLink2Gully = TRUE; delete [] szLay; } OPENOBJ_END(); AcDbObjectId idNode2 = pPipe->GetNode(1); OPENOBJ_BEGIN(idNode2, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ TCHAR* szLay = pEquip->layer(); if(_tcsicmp(szLay, LAY_TWT_GULLY) == 0) bIsLink2Gully = TRUE; delete [] szLay; } OPENOBJ_END(); } OPENOBJ_END(); if(!bIsLink2Gully) DoDimPipeDn(ent, pListAll->m_iDn, _T("自动"), g_nPipeDnHeight, FALSE, FALSE); BOOL bReverse = FALSE; if(pListAll->m_pPrevious != NULL){ //得到前一节点 AcDbObjectId idFront = pListAll->m_pPrevious->m_ID; XPoint ptNode; OPENOBJ_BEGIN(idFront, AcDb::kForRead, TDbPipeNode, pNode); if(pNode){ ptNode = pNode->GetLocation(); } OPENOBJ_END(); if(ptStart == ptNode) bReverse = TRUE; //如果前一节点位置等于本管线的起点位置,说明管线画反了 } if(pListAll->m_nI > 0){ OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe){ pPipe->SetPipeGradient(pListAll->m_nI/1000); } OPENOBJ_END(); } // cet 2012.1.10 add 在管线信息更新完毕后设置管线标注以防计算标注信息长度有误 OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe != NULL) { pPipe->EnableDrawLabel(bDrawLabel); // 设置为管线原有标注设置 if (!pPipe->IsDrawLabel()) { SetPipeLabelType(pPipe); } else { g_bPipeShow = HandlePipeDimType(pPipe, g_nSelType); } if (static_cast(pPipe->GetSpare()) == -1) { pPipe->EnableDrawLabel(FALSE); } else { pPipe->EnableDrawLabel(TRUE); } } OPENOBJ_END(); // 显示交叉线 if(g_bPipeShow) { ShowPipe(id); AnyKeyReturn(_T("\n按任意键继续查找下一段待修改管标注...")); } } else if(pListAll->m_iType == 3){ if(pListAll->m_pPrevious != NULL){ ads_name ent; acdbGetAdsName(ent, pListAll->m_ID); WriteXdata(ent, _T("TG-DIRTWELLQ"), XString(_T("%.2f"), pListAll->m_pPrevious->m_nPipeQ)); } } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; DimRainCalcResult(pList); } } //将每个井的汇流面积写入链表 // m_nDang 记录本井汇流面积 // m_nStartPress 记录总汇流面积 // m_iNum 记录径流系数 BOOL SetWellArea(SSearchPipeList *pListAll, BOOL &bHasArea) { BOOL bRet = TRUE; AcDbObjectId id = NULL; id = pListAll->m_ID; if(IsWell(id)) pListAll->m_iType = 3; if(pListAll->m_iType == 3){ ads_name ent; acdbGetAdsName(ent, id); CString csArea = ReadXdata(ent, _T("TG-WELLAREA")); CString csFactor = ReadXdata(ent, _T("TG-RAINWELLFACTOR")); CString csP = ReadXdata(ent, _T("TG-RAINWELLP")); CString csTime = ReadXdata(ent, _T("TG-WELLTIME")); int iFactor = int(_tstof(csFactor) * 1000); pListAll->m_nDang = _tstof(csArea); pListAll->m_iNum = iFactor; pListAll->m_iSpare = _ttoi(csP); if(csTime != _T("") && pListAll->m_lstNode.Length() == 0)//必须是末端井 pListAll->m_nLost = _tstof(csTime); if(pListAll->m_nDang > 0.01) bHasArea = TRUE; pListAll->m_nStartPress = _tstof(csArea); } else if(pListAll->m_iType == 0){ OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ pListAll->m_nLength = pPipe->Length(); // if(!DocGetMeterUnitDraw()) // pListAll->m_nLength = pListAll->m_nLength/1000; } OPENOBJ_END(); } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; bRet = SetWellArea(pList, bHasArea); pListAll->m_nStartPress += pList->m_nStartPress; //m_nStartPress记录总汇流面积 } return bRet; } BOOL IsDirtPool(AcDbObjectId idNode) { if(!idNode) return FALSE; OPENOBJ_BEGIN(idNode, AcDb::kForRead, TDbPool, pEquip); if(pEquip) return TRUE; else return FALSE; OPENOBJ_END(); } //将井编号写入链表 BOOL SetWellName(SSearchPipeList *pListAll) { BOOL bRet = TRUE; AcDbObjectId id = NULL; id = pListAll->m_ID; if(IsWell(id)) pListAll->m_iType = 3; if(IsDirtPool(id)) pListAll->m_iType = 4; if(pListAll->m_iType == 3){ pListAll->m_csName = GetWellName(id); if(pListAll->m_csName == _T("")) return FALSE; } if(pListAll->m_iType == 4){ pListAll->m_csName = _T("HC"); } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; bRet = SetWellName(pList); if(!bRet) return FALSE; } return bRet; } //返回用户选择的最远井所在链表的位置 SSearchPipeList *GetWellNode(SSearchPipeList *pListAll, Entity entLongWell, SSearchPipeList *pNode) { AcDbObjectId id = NULL; id = pListAll->m_ID; ads_name ent; acdbGetAdsName(ent, id); Entity entTmp = ent; if(entTmp == entLongWell) return pListAll; long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; pNode = GetWellNode(pList, entLongWell, pNode); } return pNode; } //得到下一个计算支路的起点节点 根据流量是否为0且最远 SSearchPipeList *GetNextCalcWell(SSearchPipeList *pListAll, SSearchPipeList *pDisadvantage) { AcDbObjectId id = NULL; id = pListAll->m_ID; double nCurPipeLength(0); if(pListAll->m_nPipeQ == 0 && pListAll->m_iType == 3){ nCurPipeLength = pListAll->m_nLength; if(pDisadvantage){ if(nCurPipeLength > pDisadvantage->m_nLength) pDisadvantage = pListAll; } else pDisadvantage = pListAll; //条件3: 临时节点为空 } int len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; pDisadvantage = GetNextCalcWell(pList, pDisadvantage); } return pDisadvantage; } CString TransformDouble2String(double dDouble, int iPre) { CString csRet; CString csNote; csNote.Format(_T("%d"), iPre--); CString sFormat = _T("%.") + csNote + _T("f"); csRet.Format(sFormat, dDouble); while (csRet.ReverseFind(_T('0')) > 0 && iPre >= 0) { csNote.Format(_T("%d"), iPre--); CString sFormat = _T("%.") + csNote + _T("f"); csRet.Format(sFormat, dDouble); } return csRet; } //输出计算书函数 void ImportRainCalcWord(DList &lstNode, DList &lstWell, CCalcRainWellDlg &dlg) { int len = lstNode.Length(); if(len < 1) return; int len2 = lstWell.Length(); if(len2 < 1) return; // 打开公式模板 zxl 2013.12.31 add TWordFormulasTemplet wdFormula; CString sPathName = g_csSysPath; sPathName += _T("formula.doc"); if (!wdFormula.OpenWordFormulasTempletFile(sPathName)) { 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; } wordApplication.SetVisible(TRUE); wordDocuments = wordApplication.GetDocuments(); activeDocument = wordDocuments.Add(vtOptional,vtOptional); wordSelection = wordApplication.GetSelection(); wordParagraphs = wordSelection.GetParagraphs(); wordParagraphs.SetAlignment(1); // 0: 居左 1:居中 2:居右 CString csFisrt = lstWell[0]->m_csName; CString csLast = lstWell[len2-1]->m_csName; CString csTitle = _T("室外雨水井") + csFisrt + _T(" ~ ") + csLast + _T("水力计算书\n\n"); wordSelection.TypeText(csTitle); //写一行字 wordSelection = wordApplication.GetSelection(); wordParagraphs = wordSelection.GetParagraphs(); wordParagraphs.SetAlignment(0); // 0: 居左 1:居中 2:居右 // zxl 2014.01.03 add _Font font; font = wordSelection.GetFont(); wordSelection.TypeText(_T("计算原理参照《室外排水设计规范》GB 50014-2006(2011版),《给水排水设计手册》(第五册城镇排水) \n")); wordSelection.TypeText(_T("一、基本计算公式 \n")); wordSelection.TypeText(_T("1、降雨强度公式: \n")); wordSelection.TypeText(_T(" ")); wdFormula.InsertFormula(WORD_FORMULA30, wordSelection); wordSelection.TypeText(_T("mm/min")); wordSelection.TypeText(_T("")); wordSelection.TypeText(_T("\n 式中: i —— 降雨强度(mm/min)")); wordSelection.TypeText(_T("\n 其中:1mm/min=1L/(m")); font.SetSuperscript(2); //处理上标 wordSelection.TypeText(_T("2")); font.SetSuperscript(0); wordSelection.TypeText(_T("·min)= 10000L/(min·公顷)")); wordSelection.TypeText(_T("\n t —— 降雨历时(min)")); wordSelection.TypeText(_T("\n 雨水管渠的设计降雨历时公式:")); wordSelection.TypeText(_T("\n ")); wdFormula.InsertFormula(WORD_FORMULA31, wordSelection); wordSelection.TypeText(_T("\n t —— 降雨历时(min);")); wordSelection.TypeText(_T("\n t")); font.SetSubscript(2); //处理下标 wordSelection.TypeText(_T("1")); font.SetSubscript(0); wordSelection.TypeText(_T(" —— 地面集水时间(min),视距离长短、地形坡度和地面铺盖情")); wordSelection.TypeText(_T(" 况而定,一般采用5~10min")); wordSelection.TypeText(_T("\n m —— 折减系数")); wordSelection.TypeText(_T("\n t")); font.SetSubscript(2); //处理下标 wordSelection.TypeText(_T("2")); font.SetSubscript(0); wordSelection.TypeText(_T(" —— 管渠内雨水流行时间(min)\n ")); wdFormula.InsertFormula(WORD_FORMULA32, wordSelection); wordSelection.TypeText(_T("\n L")); font.SetSubscript(2); //处理下标 wordSelection.TypeText(_T("i")); font.SetSubscript(0); wordSelection.TypeText(_T(" —— 为设计断面上游各管道的长度(m)")); wordSelection.TypeText(_T("\n v")); font.SetSubscript(2); //处理下标 wordSelection.TypeText(_T("i")); font.SetSubscript(0); wordSelection.TypeText(_T(" —— 为上游管段的设计流速(m/s)")); wordSelection.TypeText(_T("\n P —— 设计重现期(年)")); wordSelection.TypeText(_T("\n A,C,n,B —— 参数,根据统计方法进行计算确定.")); wordSelection.TypeText(_T("\n2、暴雨强度公式:")); wordSelection.TypeText(_T("\n ")); wdFormula.InsertFormula(WORD_FORMULA33, wordSelection); wordSelection.TypeText(_T(" L/(s·公顷)")); wordSelection.TypeText(_T("\n 式中: q —— 设计暴雨强度L/(s·公顷)、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(")")); wordSelection.TypeText(_T("\n3、雨水设计流量公式:")); wordSelection.TypeText(_T("\n ")); wdFormula.InsertFormula(WORD_FORMULA34, wordSelection); wordSelection.TypeText(_T("\n 式中:")); wordSelection.TypeText(_T(" Q —— 雨水设计流量(L/s)")); wordSelection.TypeText(_T("\n q —— 设计降雨强度 L/(s·公顷)")); wordSelection.TypeText(_T("\n ψ—— 径流系数")); wordSelection.TypeText(_T("\n F —— 汇水面积(ha 、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(")")); wordSelection.TypeText(_T("\n4、流速公式:")); wordSelection.TypeText(_T("\n ")); wdFormula.InsertFormula(WORD_FORMULA35, wordSelection); wordSelection.TypeText(_T("\n 式中:")); wordSelection.TypeText(_T(" V —— 流速(m/s)")); wordSelection.TypeText(_T("\n R —— 水力半径(m)")); wordSelection.TypeText(_T("\n I —— 水力坡度")); wordSelection.TypeText(_T("\n n —— 粗糙系数")); wordSelection.TypeText(_T("\n5、泄流量公式:")); wordSelection.TypeText(_T("\n ")); wdFormula.InsertFormula(WORD_FORMULA36, wordSelection); wordSelection.TypeText(_T("\n 式中:")); wordSelection.TypeText(_T(" Q —— 泄流量(m")); font.SetSuperscript(2); //处理上标 wordSelection.TypeText(_T("3")); font.SetSuperscript(0); wordSelection.TypeText(_T("/s)")); wordSelection.TypeText(_T("\n V —— 流速(m/s)")); wordSelection.TypeText(_T("\n A —— 管截面积(m")); font.SetSuperscript(2); //处理上标 wordSelection.TypeText(_T("2")); font.SetSuperscript(0); wordSelection.TypeText(_T(")")); wordSelection.TypeText(_T("\n二、计算参数")); wordSelection.TypeText(_T("\n1、地区:")); wordSelection.TypeText(dlg.m_csProvince); wordSelection.TypeText(_T(" ")); wordSelection.TypeText(dlg.m_csCity); wdFormula.CloseFile(); Selection wSelection = wordApplication.GetSelection(); wSelection.TypeParagraph(); //画表格 int nrows(2), ncolumns(4); wSelection = wordApplication.GetSelection(); Range oRange = wSelection.GetRange(); Tables oTables = activeDocument.GetTables(); _Table oTable = oTables.Add(oRange, nrows, ncolumns); Borders oBordersn = oTable.GetBorders(); oBordersn.SetInsideLineStyle(1); // 设置表格线型 oBordersn.SetOutsideLineStyle(1); Columns oColumns; Column oColumn; oColumns = oTable.GetColumns(); oColumn = oColumns.Item(1); oColumn.SetWidth(110, 0); // 0 = wdAdjustNone oColumn = oColumns.Item(2); oColumn.SetWidth(110, 0); oColumn = oColumns.Item(3); oColumn.SetWidth(110, 0); oColumn = oColumns.Item(4); oColumn.SetWidth(110, 0); Cell oCell; oCell = oTable.Cell(1, 1); oRange = oCell.GetRange(); oRange.InsertAfter(_T("A")); oCell = oTable.Cell(1, 2); oRange = oCell.GetRange(); oRange.InsertAfter(_T("B")); oCell = oTable.Cell(1, 3); oRange = oCell.GetRange(); oRange.InsertAfter(_T("C")); oCell = oTable.Cell(1, 4); oRange = oCell.GetRange(); oRange.InsertAfter(_T("n")); oCell = oTable.Cell(2, 1); oRange = oCell.GetRange(); oRange.InsertAfter(dlg.m_csA); oCell = oTable.Cell(2, 2); oRange = oCell.GetRange(); oRange.InsertAfter(dlg.m_csB); oCell = oTable.Cell(2, 3); oRange = oCell.GetRange(); oRange.InsertAfter(dlg.m_csC); oCell = oTable.Cell(2, 4); oRange = oCell.GetRange(); oRange.InsertAfter(dlg.m_csN); wordSelection = wordApplication.GetSelection(); wordSelection.GoTo(COleVariant((short)3), // 3 = wdGoToLine COleVariant((short)-1),vtOptional,vtOptional); // -1 = wdGoToLast wordSelection.TypeText(XString(_T("2、重现期:%s年"), TransformDouble2String(dlg.m_nP, 3))); wordSelection.TypeText(XString(_T("\n3、汇流时间:%smin"), TransformDouble2String(dlg.m_dTime, 3))); wordSelection.TypeText(XString(_T("\n4、径流系数:%s"), TransformDouble2String(dlg.m_nFactor, 3))); wordSelection.TypeText(XString(_T("\n5、折减系数:%s"), TransformDouble2String(dlg.m_dM, 3))); wordSelection.TypeText(_T("\n6、粗糙系数:")); wSelection = wordApplication.GetSelection(); wSelection.TypeParagraph(); //画表格 nrows = dlg.m_mapMeratialN.size() + 1, ncolumns = 2; wSelection = wordApplication.GetSelection(); oRange = wSelection.GetRange(); oTables = activeDocument.GetTables(); oTable = oTables.Add(oRange, nrows, ncolumns); oBordersn = oTable.GetBorders(); oBordersn.SetInsideLineStyle(1); // 设置表格线型 oBordersn.SetOutsideLineStyle(1); oColumns = oTable.GetColumns(); oColumn = oColumns.Item(1); oColumn.SetWidth(200, 0); // 0 = wdAdjustNone oColumn = oColumns.Item(2); oColumn.SetWidth(100, 0); oCell = oTable.Cell(1, 1); oRange = oCell.GetRange(); oRange.InsertAfter(_T("管材")); oCell = oTable.Cell(1, 2); oRange = oCell.GetRange(); oRange.InsertAfter(_T("粗糙系数")); std::map::iterator it; int iIndex = 0; for ( it = dlg.m_mapMeratialN.begin(); it != dlg.m_mapMeratialN.end(); it++) { oCell = oTable.Cell(iIndex+2, 1); oRange = oCell.GetRange(); oRange.InsertAfter(it->first); oCell = oTable.Cell(iIndex+2, 2); oRange = oCell.GetRange(); oRange.InsertAfter(XString(_T("%.3f"), it->second)); iIndex++; } wordSelection = wordApplication.GetSelection(); wordSelection.GoTo(COleVariant((short)3), // 3 = wdGoToLine COleVariant((short)-1),vtOptional,vtOptional); // -1 = wdGoToLast wSelection = wordApplication.GetSelection(); wSelection.TypeParagraph(); wordSelection.TypeText(_T("三、计算结果:")); Selection wSelection2 = wordApplication.GetSelection(); wSelection2.TypeParagraph(); wordSelection.TypeText(_T("主干管线信息:\n")); //画表格 int rows(len+1), columns(7); wSelection = wordApplication.GetSelection(); oRange = wSelection.GetRange(); oTables = activeDocument.GetTables(); oTable = oTables.Add(oRange, rows, columns); // cet 2010.3.25 add Borders oBorders = oTable.GetBorders(); oBorders.SetInsideLineStyle(1); // 设置表格线型 oBorders.SetOutsideLineStyle(1); oColumns = oTable.GetColumns(); oColumn = oColumns.Item(1); oColumn.SetWidth(60, 0); // 0 = wdAdjustNone oColumn = oColumns.Item(2); oColumn.SetWidth(60, 0); oColumn = oColumns.Item(3); oColumn.SetWidth(70, 0); oColumn = oColumns.Item(4); oColumn.SetWidth(50, 0); oColumn = oColumns.Item(5); oColumn.SetWidth(50, 0); oColumn = oColumns.Item(6); oColumn.SetWidth(65, 0); oColumn = oColumns.Item(7); oColumn.SetWidth(75, 0); oCell = oTable.Cell(1, 1); oRange = oCell.GetRange(); oRange.InsertAfter(_T("管段名称")); oCell = oTable.Cell(1, 2); oRange = oCell.GetRange(); oRange.InsertAfter(_T("管径mm")); oCell = oTable.Cell(1, 3); oRange = oCell.GetRange(); oRange.InsertAfter(_T("管道流量L/s")); oCell = oTable.Cell(1, 4); oRange = oCell.GetRange(); oRange.InsertAfter(_T("管长m")); oCell = oTable.Cell(1, 5); oRange = oCell.GetRange(); oRange.InsertAfter(_T("流速m/s")); oCell = oTable.Cell(1, 6); oRange = oCell.GetRange(); oRange.InsertAfter(_T("水力坡降‰")); oCell = oTable.Cell(1, 7); oRange = oCell.GetRange(); oRange.InsertAfter(_T("管材")); for(int i=0; im_csName); csTmp.Format(_T("%d"), lstNode[i]->m_iDn); oCell = oTable.Cell(i+2, 2); oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.2f"), lstNode[i]->m_nPipeQ); oCell = oTable.Cell(i+2, 3); //管道流量L/s oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); // if(DocGetMeterUnitDraw()) // csTmp.Format(_T("%.2f"), lstNode[i]->m_nLength); // else csTmp.Format(_T("%.2f"), lstNode[i]->m_nLength); oCell = oTable.Cell(i+2, 4); //管长m oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.2f"), lstNode[i]->m_nV); oCell = oTable.Cell(i+2, 5); //流速m/s oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.3f"), lstNode[i]->m_nI); oCell = oTable.Cell(i+2, 6); //水力坡降mH2O/m oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); OPENOBJ_BEGIN(lstNode[i]->m_ID, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ csTmp = GetPipeMaterialByIdx(pPipe->GetMaterial()); } OPENOBJ_END(); oCell = oTable.Cell(i+2, 7); //管材 oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); } wordSelection = wordApplication.GetSelection(); wordSelection.GoTo(COleVariant((short)3), // 3 = wdGoToLine COleVariant((short)-1),vtOptional,vtOptional); // -1 = wdGoToLast wSelection = wordApplication.GetSelection(); wSelection.TypeParagraph(); wordSelection.TypeText(_T("主要井信息:\n")); //画表格 rows = len2+1; columns = 6; wSelection = wordApplication.GetSelection(); oRange = wSelection.GetRange(); oTables = activeDocument.GetTables(); oTable = oTables.Add(oRange, rows, columns); // cet 2010.3.25 add oBorders = oTable.GetBorders(); oBorders.SetInsideLineStyle(1); // 设置表格线型 oBorders.SetOutsideLineStyle(1); 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(85, 0); oColumn = oColumns.Item(4); oColumn.SetWidth(85, 0); oColumn = oColumns.Item(5); oColumn.SetWidth(75, 0); oColumn = oColumns.Item(6); oColumn.SetWidth(88, 0); 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("汇流面积平方米")); oCell = oTable.Cell(1, 4); oRange = oCell.GetRange(); oRange.InsertAfter(_T("总面积平方米")); oCell = oTable.Cell(1, 5); oRange = oCell.GetRange(); oRange.InsertAfter(_T("汇流时间min")); oCell = oTable.Cell(1, 6); oRange = oCell.GetRange(); oRange.InsertAfter(_T("暴雨强度L/s/顷")); for(i=0; im_csName); csTmp.Format(_T("%.2f"), lstWell[i]->m_nPipeQ); oCell = oTable.Cell(i+2, 2); //管道流量L/s oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.0f"), lstWell[i]->m_nDang); oCell = oTable.Cell(i+2, 3); //当量长度m oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.0f"), lstWell[i]->m_nStartPress); oCell = oTable.Cell(i+2, 4); oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.2f"), lstWell[i]->m_nLost); oCell = oTable.Cell(i+2, 5); oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.2f"), lstWell[i]->m_nSpare); oCell = oTable.Cell(i+2, 6); //暴雨强度 oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); } wordSelection = wordApplication.GetSelection(); wordSelection.GoTo(COleVariant((short)3), // 3 = wdGoToLine COleVariant((short)-1),vtOptional,vtOptional); // -1 = wdGoToLast wSelection = wordApplication.GetSelection(); wSelection.TypeParagraph(); } //将其它井加入输出列表 void GetOtherWellNode(SSearchPipeList *pListAll, DList &lstWell) { if(pListAll->m_iType == 3){ SSearchPipeList *pNodeNew = new SSearchPipeList(); pNodeNew->m_iDn = pListAll->m_iDn; pNodeNew->m_csName = pListAll->m_csName; pNodeNew->m_nLength = pListAll->m_nLength; pNodeNew->m_nPipeQ = pListAll->m_nPipeQ; pNodeNew->m_nDang = pListAll->m_nDang; pNodeNew->m_nStartPress = pListAll->m_nStartPress; pNodeNew->m_nI = pListAll->m_nI; pNodeNew->m_nV = pListAll->m_nV; pNodeNew->m_nLost = pListAll->m_nLost; pNodeNew->m_nSpare = pListAll->m_nSpare; int len = lstWell.Length(); BOOL bFlag = FALSE; for(int i=0;im_csName == lstWell[i]->m_csName){ bFlag = TRUE; break; } } if(!bFlag) lstWell.Append(pNodeNew); } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; GetOtherWellNode(pList, lstWell); } } //得到下一个标注节点 根据节点编号是否为空 //3个条件 SSearchPipeList *GetLongestWell(SSearchPipeList *pListAll, SSearchPipeList *pDisadvantage) { AcDbObjectId id = NULL; id = pListAll->m_ID; double nCurPipeLength(0); nCurPipeLength = pListAll->m_nLength; if(pListAll->m_csName == _T("") && pListAll->m_iType == 3){ int idx = GetFirstAncestorSerial(pListAll); if(pDisadvantage){ int idx2 = GetFirstAncestorSerial(pDisadvantage); if(idx < idx2){ //条件1: 当前节点的祖先编号小于临时节点的祖先编号 pDisadvantage = pListAll; } else if(idx == 0){ //条件2: if(pDisadvantage && nCurPipeLength > pDisadvantage->m_nLength) pDisadvantage = pListAll; } else if(idx == idx2){//条件3: 当前节点的祖先编号等于临时节点的祖先编号, 但离起始节点最远 int iParentIdx1 = GetAncestorSerial(pListAll); int iParentIdx2 = GetAncestorSerial(pDisadvantage); if(iParentIdx1 == iParentIdx2){ if(pDisadvantage && nCurPipeLength > pDisadvantage->m_nLength) pDisadvantage = pListAll; } else if(iParentIdx1 < iParentIdx2 || iParentIdx2 == idx2){ pDisadvantage = pListAll; } } } else pDisadvantage = pListAll; //条件3: 临时节点为空 } int len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; pDisadvantage = GetLongestWell(pList, pDisadvantage); } return pDisadvantage; } extern BOOL SetWellData(SSearchPipeList *pListAll, BOOL bFeedSys); //主函数 void RainCalc() { Entity entMainPipe, entLongWell; //RBList rbMaskPipe(RTDXF0, _T("ATS_PIPE"), 8, LAY_PIPE_RAIN, NULL); RBList rbMask(RTDXF0, _T("ATS_WELL"), NULL); RBList rbMaskMain = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); if(SelectEntity(_T("\n请选择排出干管或排出井<退出>"), entMainPipe, rbMaskMain) != RTNORM) { return; } SSearchPipeList *pListAll = new SSearchPipeList(); PickSet ssAll(SS_FREE); ssAll += entMainPipe; if(!SearchSprinkPipeSys(entMainPipe, NULL, pListAll, ssAll)){ AfxMessageBox(_T("雨水系统有回路!")); delete pListAll; return; } if(!CalcLstPipeLength(pListAll, NULL, ssAll)){ AfxMessageBox(_T("雨水系统没有标注管径,请先执行命令[管径标注]")); delete pListAll; return; } if(pListAll->m_lstNode.Length() == 2 && entMainPipe.Is(_T("ATS_PIPE"))){ ssAll.Free(); //计算源头应为节点,而不是管线. 以下计算管线2节点哪个是源头 CalcWellNum(pListAll); SSearchPipeList *p1 = pListAll->m_lstNode[0]; SSearchPipeList *p2 = pListAll->m_lstNode[1]; SSearchPipeList *p3 = p1->m_iNum > p2->m_iNum ? p2 : p1; ads_name ent; acdbGetAdsName(ent, p3->m_ID); delete pListAll; pListAll = new SSearchPipeList(); //重新搜索系统 if(!SearchSprinkPipeSys(ent, NULL, pListAll, ssAll)){ AfxMessageBox(_T("雨水系统有回路!")); delete pListAll; return; } CalcLstPipeLength(pListAll, NULL, ssAll); pListAll->m_iType = GetNodeType(ent); } XPoint ptLow, ptUp; ssAll.GetExtend(ptLow, ptUp); AssureInCurrentView(ptLow, ptUp); //UpdateRainWellArea(); zxl 20131218 del 汇流面积新实体能实时更新井的汇流面积 ssAll.Redraw(3); SSearchPipeList *pNodeLong = GetLongestWell(pListAll, NULL); if(pNodeLong == NULL){ ssAll.Redraw(4); delete pListAll; return; } if(!SetWellName(pListAll)){ AfxMessageBox(_T("没有完整输入井编号!")); delete pListAll; return; } BOOL bHasArea(FALSE); SetWellArea(pListAll, bHasArea); if(!bHasArea){ AfxMessageBox(_T("没有完整输入汇流面积!")); delete pListAll; return; } if(CheckWellSys(pListAll, TRUE) == FALSE){ ssAll.Redraw(4); delete pListAll; return; } CString csDwb = g_csDwbPath + _T("TwtSys"); XString xsTmp; Entity entBlk; if(LoadDwbBlock(csDwb, _T("00000069"), xsTmp) != RTNORM ){ delete pListAll; return; } OPENOBJ_BEGIN(pNodeLong->m_ID, AcDb::kForRead, TDbPipeNode, pNode); if(pNode){ XPoint pt = pNode->GetLocation(); InsertBlock((const TCHAR*)xsTmp, asPnt3d(pt), 20*DocGetPScale(), 20*DocGetPScale(), 0, _T("0")); entBlk.GetLast(); } OPENOBJ_END(); if(SelectEntity(_T("\n请选择最远井<系统搜索>:"), entLongWell, rbMask) != RTNORM || !entLongWell.In(&ssAll)) { AcDbObjectId id = pNodeLong->m_ID; ads_name entTmp; acdbGetAdsName(entTmp, id); entLongWell = entTmp; } DoDimPipeSerialNumber(pListAll); //2008-6-5 沈睿 改到对话框参数实现 // ssAll.Redraw(3); // double nTime(10); // ads_getreal(_T("\n请输入最远井汇流时间<10分钟>:"), &nTime); // ssAll.Redraw(4); // WriteXdata(entLongWell, _T("TG-WELLTIME"), XString(_T("%.1f"), nTime)); pNodeLong = GetWellNode(pListAll, entLongWell, NULL); // pNodeLong->m_nLost = nTime; // ssAll.Redraw(4); entBlk.Erase(); CTemporaryResourceOverride vTemp; CCalcRainWellDlg dlg; dlg.m_pListAll = pListAll; dlg.m_ssAll += ssAll; dlg.m_pNodeLong = pNodeLong; if(dlg.DoModal() != IDOK){ delete pListAll; return; } delete pListAll; return; }