// SprinklerCalcDlg.cpp : implementation file // #include "stdafx.h" #include "SprinklerCalcDlg.h" #include "DbPipe.h" #include "AcDbObjectPtr.h" #include "MSWORD8.h" #include "dbgridsheet.h" #include "TWordFormulasTemplet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define WORD_FORMULA14 14 // 流速 #define WORD_FORMULA15 15 // 水力坡降 #define WORD_FORMULA16 16 // 沿程水头损失 #define WORD_FORMULA17 17 // 局部水头损失 #define WORD_FORMULA18 18 // 喷头流量 #define WORD_FORMULA19 19 // 总水头损失 #define WORD_FORMULA20 20 // 喷淋终点压力 extern SSearchPipeList *GetNextExportNode(SSearchPipeList *pListAll, SSearchPipeList *pDisadvantage); extern void DoSprinklerCalc(SSearchPipeList *pListAll, double nPress, double nK, int iStart); extern double DoSprinklerCalc2(SSearchPipeList *pListAll, double nPress, double nK, int iStart); extern AcDbObjectId InitLayer(const TCHAR *szLayer, AcDbDatabase *pDb = NULL); extern TCHAR *LAY_TEXT; BOOL IsParallel(XLine &l1, XLine &l2) { AcGeVector3d vt1 = XVector3D(l1.EndPoint() - l1.StartPoint()).AsAcGeVector3d(); AcGeVector3d vt2 = XVector3D(l2.EndPoint() - l2.StartPoint()).AsAcGeVector3d(); if (vt1.isParallelTo(vt2)==Adesk::kTrue) //平行 return TRUE; else if (vt1.isCodirectionalTo(vt2)==Adesk::kTrue) //相反 return TRUE; return FALSE; } BOOL Is2PipeParallel(AcDbObjectId id1, AcDbObjectId id2) { XPoint p1, p2, p3, p4; OPENOBJ_BEGIN(id1, AcDb::kForRead, CDbPipe, pPipe); if (pPipe) { p1 = pPipe->StartPoint(); p2 = pPipe->EndPoint(); } OPENOBJ_END(); OPENOBJ_BEGIN(id2, AcDb::kForRead, CDbPipe, pPipe); if (pPipe) { p3 = pPipe->StartPoint(); p4 = pPipe->EndPoint(); } OPENOBJ_END(); XLine line1(p1, p2, 1); XLine line2(p3, p4, 1); if (IsParallel(line1, line2)) return TRUE; else return FALSE; } TGridSprinklerCalc::TGridSprinklerCalc() { AppendCol(_T("管段名称"), 55); AppendCol(_T("起点压力"), 55); AppendCol(_T("流量L/s"), 50); AppendCol(_T("管长(m)"), 55); AppendCol(_T("当量"), 50); AppendCol(_T("管径(mm)"), 55); AppendCol(_T("特性K"), 35); AppendCol(_T("水力坡降"), 55); AppendCol(_T("流速m/s"), 55); AppendCol(_T("损失mH2O"), 55); AppendCol(_T("终点压力"), 55); SetColPosFix(); SetColFixLength(); SetNoPaste(); // FitLastCol(); GetCol(5).SetComboEdit(); GetCol(4).SetRightButton(); COLORREF color = RGB(255,0,0); GetCol(5).SetTextColor(color); GetCol(6).SetTextColor(color); COLORREF color2 = RGB(0,0,255);; GetCol(7).SetTextColor(color2); GetCol(8).SetTextColor(color2); GetCol(9).SetTextColor(color2); GetCol(10).SetTextColor(color2); } void TGridSprinklerCalc::OnBeforeRefresh(WDGridCell&cell) { if(cell.GetColIndex()==8) { double dV = _tstof(cell.GetText()); if(dV > 4.9999){ CDC&dc=GetDC(); COLORREF color=acedGetRGB(6); // dc.SetBkColor(TRANSPARENT); dc.SetTextColor(color); dc.SetBkMode(TRANSPARENT); } else WDGrid::OnBeforeRefresh(cell); } else WDGrid::OnBeforeRefresh(cell); } void TGridSprinklerCalc::OnCellComboString(WDGridCell&cell,CComboBox&combo) { if(cell.GetColIndex()==5){ combo.AddString(_T("25")); combo.AddString(_T("32")); combo.AddString(_T("40")); combo.AddString(_T("50")); combo.AddString(_T("65")); combo.AddString(_T("80")); combo.AddString(_T("100")); combo.AddString(_T("125")); combo.AddString(_T("150")); combo.AddString(_T("200")); } } bool TGridSprinklerCalc::OnCellButtonDown(WDGridCell &cell, CString &res) { if(cell.GetColIndex() == 4) { WDGridRow &row = cell.GetRow(); TGridSprinklerData *pNewData = (TGridSprinklerData *)row.GetExtendData(); AfxMessageBox(pNewData->m_csNg); return true; } return false; } CSprinklerCalcDlg::CSprinklerCalcDlg(CWnd* pParent /*=NULL*/) : CDialog(CSprinklerCalcDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSprinklerCalcDlg) m_nPress = 7; m_nK = 80; m_iMode = 1; m_nPressIn = 20; m_csRetArea = _T(""); m_csRetEven = _T(""); m_csRetPress = _T(""); m_csRetQ = _T(""); m_bNg = TRUE; //}}AFX_DATA_INIT m_nProtectArea=0; m_nProtectQ =0; m_dElePress = 0; } void CSprinklerCalcDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSprinklerCalcDlg) DDX_Text(pDX, IDC_EDIT_PRESS, m_nPress); DDV_MinMaxDouble(pDX, m_nPress, 1., 100.); DDX_Text(pDX, IDC_EDIT_K, m_nK); DDX_Radio(pDX, IDC_RADIO_MODE1, m_iMode); DDX_Text(pDX, IDC_EDIT_PRESS2, m_nPressIn); DDX_Text(pDX, IDC_EDIT_RET_AREA, m_csRetArea); DDX_Text(pDX, IDC_EDIT_RET_EVEN, m_csRetEven); DDX_Text(pDX, IDC_EDIT_RET_PRESS, m_csRetPress); DDX_Text(pDX, IDC_EDIT_RET_Q, m_csRetQ); DDX_Check(pDX, IDC_CHECK_NG, m_bNg); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSprinklerCalcDlg, CDialog) //{{AFX_MSG_MAP(CSprinklerCalcDlg) ON_BN_CLICKED(IDC_BUTTON_WORD, OnButtonWord) ON_BN_CLICKED(IDC_BUTTON_SHEET, OnButtonSheet) ON_BN_CLICKED(IDC_RADIO_MODE1, OnRadioMode1) ON_BN_CLICKED(IDC_RADIO_MODE2, OnRadioMode2) ON_BN_CLICKED(IDC_BUTTON_HIDE, OnButtonHide) ON_BN_CLICKED(IDC_BUTTON_DN, OnButtonDn) ON_BN_CLICKED(IDC_BUTTON_HELP, OnButtonHelp) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSprinklerCalcDlg message handlers BOOL CSprinklerCalcDlg::OnInitDialog() { CDialog::OnInitDialog(); m_grid.Clear(); m_grid.Create(this, IDC_LIST_PIPE); //m_grid.FitLastCol(); m_grid.SetNoAppendButton(TRUE); m_grid.SetNoDefaultMenu(true); m_nRetK = 0.42 / 80 * m_nK; DoCalcNg(m_pListAll); DoSprinklerCalc(m_pListAll, m_nPress, m_nRetK, m_iStart); UpdateGrid(); CWnd *pWnd = GetDlgItem(IDC_EDIT_PRESS2); pWnd->EnableWindow(FALSE); m_csRetArea.Format(_T("%.2f"), m_nUserArea); UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSprinklerCalcDlg::OnRadioMode1() { CWnd *pWnd1 = GetDlgItem(IDC_EDIT_PRESS); CWnd *pWnd2 = GetDlgItem(IDC_EDIT_PRESS2); pWnd1->EnableWindow(FALSE); pWnd2->EnableWindow(TRUE); } void CSprinklerCalcDlg::OnRadioMode2() { CWnd *pWnd1 = GetDlgItem(IDC_EDIT_PRESS); CWnd *pWnd2 = GetDlgItem(IDC_EDIT_PRESS2); pWnd1->EnableWindow(TRUE); pWnd2->EnableWindow(FALSE); } void CSprinklerCalcDlg::UpdateGrid() { long iCurRow = m_grid.GetCurRowIndex(); m_grid.Clear(); m_lstNode.Reset(); SSearchPipeList *pNode = GetNextExportNode(m_pListAll, NULL); while(pNode){ SSearchPipeList *pNodeNew = new SSearchPipeList(); pNodeNew->m_iDn = pNode->m_iDn; pNodeNew->m_ID = pNode->m_ID; if(pNode->m_lstNode[0] != NULL){ if(pNode->m_lstNode[0]->m_iType == 2) pNodeNew->m_iSpare = pNode->m_lstNode[0]->m_iSpare; else pNodeNew->m_iSpare = 0; } CString csNg = GetPipeNg(pNode); CString csName = pNode->m_csName + _T(" 管 当量 = ") + csNg; pNodeNew->m_csName = csName; pNodeNew->m_nLength = pNode->m_nLength; pNodeNew->m_nPipeQ = pNode->m_nPipeQ; pNodeNew->m_nDang = pNode->m_nDang; pNodeNew->m_nStartPress = pNode->m_nStartPress; pNodeNew->m_nI = pNode->m_nI; pNodeNew->m_nV = pNode->m_nV; pNodeNew->m_nLost = pNode->m_nLost; m_lstNode.Append(pNodeNew); pNode->m_iNum = 0; pNode = GetNextExportNode(m_pListAll, NULL); } int len = m_lstNode.Length(); for(int i=0; im_csName; int idx = csName.Find(_T(" ")); csName = csName.Left(idx); pNewData->m_csNg = m_lstNode[i]->m_csName; WDGridRow &row = m_grid.GetRow(i); row.SetExtendData(pNewData); m_grid.GetCell(i, 0).SetText(csName); m_grid.GetCell(i, 1).SetText(XString(_T("%.2f"), m_lstNode[i]->m_nStartPress)); m_grid.GetCell(i, 2).SetText(XString(_T("%.2f"), m_lstNode[i]->m_nPipeQ)); m_grid.GetCell(i, 3).SetText(XString(_T("%.2f"), m_lstNode[i]->m_nLength)); m_grid.GetCell(i, 4).SetText(XString(_T("%.2f"), m_lstNode[i]->m_nDang)); m_grid.GetCell(i, 5).SetText(XString(_T("%d"), m_lstNode[i]->m_iDn)); m_grid.GetCell(i, 7).SetText(XString(_T("%.2f"), m_lstNode[i]->m_nI)); m_grid.GetCell(i, 8).SetText(XString(_T("%.2f"), m_lstNode[i]->m_nV)); m_grid.GetCell(i, 9).SetText(XString(_T("%.2f"), m_lstNode[i]->m_nLost)); m_grid.GetCell(i, 10).SetText(XString(_T("%.2f"), m_lstNode[i]->m_nLost + m_lstNode[i]->m_nStartPress)); if(m_lstNode[i]->m_iSpare < 1) m_grid.GetCell(i, 6).SetText(_T("默认")); else m_grid.GetCell(i, 6).SetText(XString(_T("%d"), m_lstNode[i]->m_iSpare)); } if(len < 1) return; m_grid.SelectRow(iCurRow, TRUE); m_csRetQ.Format(_T("%.2f"), m_lstNode[len-1]->m_nPipeQ); m_csRetPress.Format(_T("%.2f"), m_lstNode[len-1]->m_nLost + m_lstNode[len-1]->m_nStartPress + m_dElePress); m_csRetEven.Format(_T("%.2f"), m_lstNode[len-1]->m_nPipeQ/m_nUserArea*60); UpdateData(FALSE); } /* void CSprinklerCalcDlg::OnSelchangeComboLevel() { UpdateData(TRUE); if(m_iLevel == 0){ //轻危险级 m_nIntension = 4; m_nArea = 160; } else if(m_iLevel == 1){//中危险级1级 m_nIntension = 6; m_nArea = 160; } else if(m_iLevel == 2){//中危险级2级 m_nIntension = 8; m_nArea = 160; } else if(m_iLevel == 3){//严重危险级1级 m_nIntension = 12; m_nArea = 260; } else if(m_iLevel == 4){//严重危险级2级 m_nIntension = 16; m_nArea = 260; } else if(m_iLevel == 5){//仓库危险级1级 m_nIntension = 12; m_nArea = 200; } else if(m_iLevel == 6){//仓库危险级2级 m_nIntension = 16; m_nArea = 300; } else if(m_iLevel == 7){//仓库危险级3级 m_nIntension = 20; m_nArea = 260; } UpdateData(FALSE); } */ void CSprinklerCalcDlg::ResetList(SSearchPipeList *pListAll) { // if(pListAll->m_lstNode.Length() != 0) pListAll->m_nStartPress = 0; pListAll->m_nPipeQ = 0; long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; ResetList(pList); } } void CSprinklerCalcDlg::OnOK() { UpdateData(TRUE); m_nRetK = 0.42 / 80 * m_nK; // CMapStringToString map; for(m_grid.MoveToFirst(); !m_grid.IsOut(); m_grid.MoveToNext()){ WDGridRow *pRow = m_grid.CurRow(); CString csName = (LPCTSTR)(*pRow)[0].GetText(); CString csDn = (LPCTSTR)(*pRow)[5].GetText(); CString csStart = (LPCTSTR)(*pRow)[1].GetText(); if(csName == _T("")) break; SSearchPipeList *pList = GlobalFunc::GetPipeNodeByName(m_pListAll, csName, NULL); if(pList != NULL){ // if(pList->m_lstNode.Length() == 1){ // SSearchPipeList *pList2 = pList->m_lstNode[0]; // if(pList2->m_lstNode.Length() == 0){//末端 // map.SetAt(csName, csStart); // } // } if(pList->m_iDn != _ttoi(csDn)){ pList->m_iDn = _ttoi(csDn); OPENOBJ_BEGIN(pList->m_ID, AcDb::kForWrite, CDbPipe, pPipe); if(pPipe){ pPipe->SetDnDiameter(_ttoi(csDn)); } OPENOBJ_END(); } // cet 2010.11.25 add 支持修改K值更新计算 CString strK = (LPCTSTR)(*pRow)[6].GetText(); if (strK.CompareNoCase(_T("默认")) != 0 && pList->m_lstNode[0] != NULL && pList->m_lstNode[0]->m_iType == 2) { pList->m_lstNode[0]->m_iSpare = _tstof(strK); ads_name name; acdbGetAdsName(name, pList->m_lstNode[0]->m_ID); GlobalFunc::WriteXdata(name, _T("SPRINKLER_K"), strK); // 修改喷头k值 } } } ResetList(m_pListAll); DoCalcNg(m_pListAll); if(m_iMode == 1) DoSprinklerCalc(m_pListAll, m_nPress, m_nRetK, m_iStart); else DoSprinklerCalc2(m_pListAll, (m_nPressIn - m_dElePress), m_nRetK, m_iStart); UpdateGrid(); } //判断本管线是否需要计算(只要后面有1个计算喷头) BOOL CSprinklerCalcDlg::IsNeedCalc(SSearchPipeList *pListAll) { BOOL bRet = FALSE; long len = pListAll->m_lstNode.Length(); CString csName = pListAll->m_csName; if(pListAll->m_bNeedCale) return TRUE; for(long i=0;im_lstNode[i]; bRet = IsNeedCalc(pList); if(bRet) return TRUE; } return bRet; } //自动喷水灭火系统设计规范 附录C 当量长度表 double GetDangLenByElbow90(int iDn1) //90度弯头当量长度 { if(iDn1 == 25) return 0.6; else if(iDn1 == 32) return 0.9; else if(iDn1 == 40) return 1.2; else if(iDn1 == 50) return 1.5; else if(iDn1 == 65) return 1.8; else if(iDn1 == 80) return 2.1; else if(iDn1 == 100) return 3.1; else if(iDn1 == 125) return 3.7; else if(iDn1 == 150) return 4.3; else return 0; } extern double GetDangLenByTaiIn(int iDn1, int iDn2); //接头当量长度 extern double GetDangLenByCorner(int iDn); //3通4通当量长度 //计算得到每段管线的当量 void CSprinklerCalcDlg::DoCalcNg(SSearchPipeList *pListAll) { if(pListAll->m_iType == 0){ AcDbObjectId id = NULL; id = pListAll->m_ID; int iDn1(0), iDn2(0), iDn0(0); OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPipe, pPipe); if(pPipe){ iDn1 = (int)pPipe->GetDnDiameter(); } OPENOBJ_END(); double dNg(0); DList lstPipe; if(pListAll->m_lstNode.Length() == 1){ SSearchPipeList *pList = pListAll->m_lstNode[0]; //得到后节点 if(IsNeedCalc(pList)){ BOOL bIsSprinkler = FALSE; if(pList->m_iType == 2) bIsSprinkler = TRUE; //第一步, 得到后节点管件的当量 int iLen = pList->m_lstNode.Length(); int iNoCalc(0); if(m_bNg){//当量统计仅考虑水流情况 for(int j=0;jm_lstNode[j]; if(!IsNeedCalc(pListTmp)) iNoCalc++; } iLen-=iNoCalc; } if(bIsSprinkler) iLen++; iLen++; if(iLen > 2){ //三通 四通 dNg = GetDangLenByCorner(iDn1); } else if(iLen == 2){ if(bIsSprinkler){ //接喷淋立管弯头 dNg = GetDangLenByElbow90(iDn1); } else if(iNoCalc==0){//iNoCalc==0 表示不考虑水流情况下,实际情况就是2跟管。 SSearchPipeList *pListTmp = pList->m_lstNode[0]; OPENOBJ_BEGIN(pListTmp->m_ID, AcDb::kForRead, CDbPipe, pPipe2); if(pPipe2){ iDn2 = (int)pPipe2->GetDnDiameter(); } OPENOBJ_END(); if(Is2PipeParallel(pListTmp->m_ID, id)) //前后管是否平行 dNg = GetDangLenByTaiIn(iDn1, iDn2); //根据接头查当量长度 else dNg = GetDangLenByElbow90(iDn1); //根据弯头查当量长度 } } //第二步, 看看和前节点是否存在变径 if(pListAll->m_pPrevious != NULL){ SSearchPipeList *pList2 = pListAll->m_pPrevious; int iLen2 = pList2->m_lstNode.Length(); if(iLen2 > 1 || pList2->m_iType == 2){//肯定是个三通 if(pList2->m_pPrevious != NULL){ SSearchPipeList *pList3 = pList2->m_pPrevious;//得到前管 OPENOBJ_BEGIN(pList3->m_ID, AcDb::kForRead, CDbPipe, pPipe2); if(pPipe2){ iDn0 = (int)pPipe2->GetDnDiameter(); } OPENOBJ_END(); double dNg2 = GetDangLenByTaiIn(iDn0, iDn1); //异径接头 dNg += dNg2; } } } } } pListAll->m_nDang = dNg; } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; DoCalcNg(pList); } } /* void CSprinklerCalcDlg::DoCalcNg(SSearchPipeList *pListAll) { if(pListAll->m_iType == 0){ AcDbObjectId id = NULL; id = pListAll->m_ID; int iDn1(0), iDn2(0), iDn0(0); OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPipe, pPipe); if(pPipe){ iDn1 = (int)pPipe->GetDnDiameter(); } OPENOBJ_END(); double dNg(0); DList lstPipe; if(pListAll->m_lstNode.Length() == 1){ SSearchPipeList *pList = pListAll->m_lstNode[0]; //得到后节点 if(IsNeedCalc(pList)){ BOOL bIsSprinkler = FALSE; if(pList->m_iType == 2) bIsSprinkler = TRUE; //第一步, 得到后节点管件的当量 int iLen = pList->m_lstNode.Length(); if(bIsSprinkler) iLen++; iLen++; if(iLen > 2){ //三通 四通 dNg = GetDangLenByCorner(iDn1); } else if(iLen == 2){ if(bIsSprinkler){ //接喷淋立管弯头 dNg = GetDangLenByElbow90(iDn1); } else{ SSearchPipeList *pListTmp = pList->m_lstNode[0]; OPENOBJ_BEGIN(pListTmp->m_ID, AcDb::kForRead, CDbPipe, pPipe2); if(pPipe2){ iDn2 = (int)pPipe2->GetDnDiameter(); } OPENOBJ_END(); if(Is2PipeParallel(pListTmp->m_ID, id)) //前后管是否平行 dNg = GetDangLenByTaiIn(iDn1, iDn2); //根据接头查当量长度 else dNg = GetDangLenByElbow90(iDn1); //根据弯头查当量长度 } } //第二步, 看看和前节点是否存在变径 if(pListAll->m_pPrevious != NULL){ SSearchPipeList *pList2 = pListAll->m_pPrevious; int iLen2 = pList2->m_lstNode.Length(); if(iLen2 > 1 || pList2->m_iType == 2){//肯定是个三通 if(pList2->m_pPrevious != NULL){ SSearchPipeList *pList3 = pList2->m_pPrevious;//得到前管 OPENOBJ_BEGIN(pList3->m_ID, AcDb::kForRead, CDbPipe, pPipe2); if(pPipe2){ iDn0 = (int)pPipe2->GetDnDiameter(); } OPENOBJ_END(); double dNg2 = GetDangLenByTaiIn(iDn0, iDn1); //异径接头 dNg += dNg2; } } } } } pListAll->m_nDang = dNg; } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; DoCalcNg(pList); } } */ //计算得到每段管线的当量 CString CSprinklerCalcDlg::GetPipeNg(SSearchPipeList *pListAll) { CString csRet; double dNg(0); if(pListAll->m_iType == 0){ AcDbObjectId id = NULL; id = pListAll->m_ID; int iDn1(0), iDn2(0), iDn0(0); OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPipe, pPipe); if(pPipe){ iDn1 = (int)pPipe->GetDnDiameter(); } OPENOBJ_END(); DList lstPipe; if(pListAll->m_lstNode.Length() == 1){ SSearchPipeList *pList = pListAll->m_lstNode[0]; //得到后节点 if(IsNeedCalc(pList)){ BOOL bIsSprinkler = FALSE; if(pList->m_iType == 2) bIsSprinkler = TRUE; //第一步, 得到后节点管件的当量 int iLen = pList->m_lstNode.Length(); int iNoCalc(0); if(m_bNg){//当量统计仅考虑水流情况 for(int j=0;jm_lstNode[j]; if(!IsNeedCalc(pListTmp)) iNoCalc++; } iLen-=iNoCalc; } if(bIsSprinkler) iLen++; iLen++; if(iLen > 2){ //三通 四通 double dNg1 = GetDangLenByCorner(iDn1); csRet.Format(_T("三通四通 %.2f "), dNg1); } else if(iLen == 2){ if(bIsSprinkler){ //接喷淋立管弯头 double dNg1 = GetDangLenByElbow90(iDn1); csRet.Format(_T("90度弯头 %.2f "), dNg1); } else if(iNoCalc==0){ SSearchPipeList *pListTmp = pList->m_lstNode[0]; OPENOBJ_BEGIN(pListTmp->m_ID, AcDb::kForRead, CDbPipe, pPipe2); if(pPipe2){ iDn2 = (int)pPipe2->GetDnDiameter(); } OPENOBJ_END(); if(Is2PipeParallel(pListTmp->m_ID, id)){ //前后管是否平行 double dNg1 = GetDangLenByTaiIn(iDn1, iDn2); //根据接头查当量长度 csRet.Format(_T("异径接头 %.2f "), dNg1); } else{ double dNg1 = GetDangLenByElbow90(iDn1); //根据弯头查当量长度 csRet.Format(_T("90度弯头 %.2f "), dNg1); } } } //第二步, 看看和前节点是否存在变径 if(pListAll->m_pPrevious != NULL){ SSearchPipeList *pList2 = pListAll->m_pPrevious; int iLen2 = pList2->m_lstNode.Length(); if(iLen2 > 1 || pList2->m_iType == 2){//肯定是个三通 if(pList2->m_pPrevious != NULL){ SSearchPipeList *pList3 = pList2->m_pPrevious;//得到前管 OPENOBJ_BEGIN(pList3->m_ID, AcDb::kForRead, CDbPipe, pPipe2); if(pPipe2){ iDn0 = (int)pPipe2->GetDnDiameter(); } OPENOBJ_END(); double dNg2 = GetDangLenByTaiIn(iDn0, iDn1); //异径接头 csRet.Format(_T("%s 异径接头 %.2f "), csRet, dNg2); dNg += dNg2; } } } } } } // csRet.Format("%.2f", dNg); return csRet; } void CSprinklerCalcDlg::OnButtonWord() { UpdateData(TRUE); ImportWord(m_lstNode, m_nUserArea, m_nK); } void CSprinklerCalcDlg::OnButtonSheet() { GlobalFunc::HideDialog(this, TRUE); UpdateData(TRUE); if(m_lstNode.Length() > 0){ ImportSheet(m_lstNode, m_nUserArea, m_nK); actrTransactionManager->flushGraphics(); //acad 刷新 } GlobalFunc::HideDialog(this, FALSE); } //输出计算书函数 void CSprinklerCalcDlg::ImportWord(DList &lstNode, double nArea, double nK) { int len = lstNode.Length(); if(len < 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; } // cet 2010.7.9 add 打开公式模板 TWordFormulasTemplet wdFormula; CString sPathName = GlobalFunc::GetSysDir(); sPathName += _T("formula.doc"); if (!wdFormula.OpenWordFormulasTempletFile(sPathName)) { return; } wordApplication.SetVisible(TRUE); wordDocuments = wordApplication.GetDocuments(); activeDocument = wordDocuments.Add(vtOptional,vtOptional); // CString csK; // cet 2010.7.14 del // csK.Format(_T("自喷计算书 K = %.0f \n"), nK); // cet 2010.7.14 del //写一行字 wordSelection = wordApplication.GetSelection(); wordParagraphs = wordSelection.GetParagraphs(); wordParagraphs.SetAlignment(0); // 0: 居左 1:居中 2:居右 // wordSelection.TypeText(csK); // cet 2010.7.14 del // wordSelection.TypeText(szLevel); // cet 2010.7.9 del // wordSelection.TypeText(_T("\n计算原理参照《自动喷水灭火系统设计规范GB 50084-2001》(2005年版) \n")); // wordSelection.TypeText(_T("基本计算公式 \n")); // wordSelection.TypeText(_T("1. 喷头流量 \n")); // wordSelection.TypeText(_T("q = K * SQRT(10P) \n")); // wordSelection.TypeText(_T("式中:\n")); // wordSelection.TypeText(_T("q-喷头处节点流量,L/min \n")); // wordSelection.TypeText(_T("P-喷头处水压,MPa\n")); // wordSelection.TypeText(_T("K-喷头流量系数\n")); // wordSelection.TypeText(_T("2. 流速V \n")); // wordSelection.TypeText(_T("V = (4 * Q) / (π * Dj * Dj)\n")); // wordSelection.TypeText(_T("式中:\n")); // wordSelection.TypeText(_T("Q-管段流量L/s\n")); // wordSelection.TypeText(_T("Dj-管道的计算内径(m)\n")); // wordSelection.TypeText(_T("3. 水力坡降 \n")); // wordSelection.TypeText(_T("i = 0.00107 * V * V / (pow(Dj, 1.3) \n")); // wordSelection.TypeText(_T("式中:\n")); // wordSelection.TypeText(_T("i-每米管道的水头损失(m H20/m)\n")); // wordSelection.TypeText(_T("V-管道内水的平均流速(m/s)\n")); // wordSelection.TypeText(_T("Dj-管道的计算内径(m)\n")); // wordSelection.TypeText(_T("4. 沿程水头损失 \n")); // wordSelection.TypeText(_T("h = i * L \n")); // wordSelection.TypeText(_T("式中:\n")); // wordSelection.TypeText(_T("L-管段长度m\n")); // wordSelection.TypeText(_T("5. 局部损失(采用当量长度法) \n")); // wordSelection.TypeText(_T("h = i * L(当量) \n")); // wordSelection.TypeText(_T("式中:\n")); // wordSelection.TypeText(_T("L(当量) 管段当量长度,单位m(《自动喷水灭火系统设计规范》附录C)\n")); // wordSelection.TypeText(_T("6. 总损失 \n")); // wordSelection.TypeText(_T("h = h(局) + h(沿) \n")); // wordSelection.TypeText(_T("7. 终点压力 \n")); // wordSelection.TypeText(_T("Hn = Hn-1 + h \n\n")); // cet 2010.7.9 add _Font font; font = wordSelection.GetFont(); wordSelection.TypeText(_T("计算原理参照《自动喷水灭火系统设计规范GB 50084-2001》(2005年版) \n")); wordSelection.TypeText(_T("基本计算公式: \n")); wordSelection.TypeText(_T("1、喷头流量: \n")); wordSelection.TypeText(_T(" ")); wdFormula.InsertFormula(WORD_FORMULA18, wordSelection); wordSelection.TypeText(_T("\n 式中:")); wordSelection.TypeText(_T("q -- 喷头处节点流量,L/min \n")); wordSelection.TypeText(_T(" P -- 喷头处水压(喷头工作压力)MPa\n")); wordSelection.TypeText(_T(" K -- 喷头流量系数\n")); wordSelection.TypeText(_T("2、流速V: \n")); wordSelection.TypeText(_T(" ")); wdFormula.InsertFormula(WORD_FORMULA14, wordSelection); wordSelection.TypeText(_T("\n 式中:")); wordSelection.TypeText(_T("Q -- 管段流量L/s\n")); wordSelection.TypeText(_T(" D")); font.SetSubscript(2); //处理下标 wordSelection.TypeText(_T("j")); font.SetSubscript(0); wordSelection.TypeText(_T(" --管道的计算内径(m)\n")); wordSelection.TypeText(_T("3、水力坡降: \n")); wordSelection.TypeText(_T(" ")); wdFormula.InsertFormula(WORD_FORMULA15, wordSelection); wordSelection.TypeText(_T("\n 式中:")); wordSelection.TypeText(_T("i -- 每米管道的水头损失(mH")); font.SetSubscript(2); //处理下标 wordSelection.TypeText(_T("2")); font.SetSubscript(0); wordSelection.TypeText(_T("0/m)\n")); wordSelection.TypeText(_T(" V -- 管道内水的平均流速(m/s)\n")); wordSelection.TypeText(_T(" d")); font.SetSubscript(2); //处理下标 wordSelection.TypeText(_T("j")); font.SetSubscript(0); wordSelection.TypeText(_T(" -- 管道的计算内径(m),取值应按管道的内径减1mm确定\n")); wordSelection.TypeText(_T("4、沿程水头损失: \n")); wordSelection.TypeText(_T(" ")); wdFormula.InsertFormula(WORD_FORMULA16, wordSelection); wordSelection.TypeText(_T("\n 式中:")); wordSelection.TypeText(_T("L -- 管段长度m\n")); wordSelection.TypeText(_T("5、局部损失(采用当量长度法): \n")); wordSelection.TypeText(_T(" ")); wdFormula.InsertFormula(WORD_FORMULA17, wordSelection); wordSelection.TypeText(_T("(当量)")); wordSelection.TypeText(_T("\n 式中:")); wordSelection.TypeText(_T("L(当量) -- 管段当量长度,单位m(《自动喷水灭火系统设计规范》附录C)\n")); wordSelection.TypeText(_T("6、总损失: \n")); wordSelection.TypeText(_T(" ")); wdFormula.InsertFormula(WORD_FORMULA19, wordSelection); wordSelection.TypeText(_T("\n7、终点压力: \n")); wordSelection.TypeText(_T(" ")); wdFormula.InsertFormula(WORD_FORMULA20, wordSelection); wordSelection.TypeText(_T("\n")); wdFormula.CloseFile(); Selection wSelection2 = wordApplication.GetSelection(); wSelection2.TypeParagraph(); //画表格 int rows(len+1), columns(11); 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(38, 0); // 0 = wdAdjustNone oColumn = oColumns.Item(2); oColumn.SetWidth(52, 0); oColumn = oColumns.Item(3); oColumn.SetWidth(45, 0); oColumn = oColumns.Item(4); oColumn.SetWidth(35, 0); oColumn = oColumns.Item(5); oColumn.SetWidth(35, 0); oColumn = oColumns.Item(6); oColumn.SetWidth(35, 0); oColumn = oColumns.Item(7); oColumn.SetWidth(30, 0); oColumn = oColumns.Item(8); oColumn.SetWidth(60, 0); oColumn = oColumns.Item(9); oColumn.SetWidth(40, 0); oColumn = oColumns.Item(10); oColumn.SetWidth(45, 0); oColumn = oColumns.Item(11); oColumn.SetWidth(55, 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("起点压力mH2O")); 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("当量长度")); oCell = oTable.Cell(1, 6); oRange = oCell.GetRange(); oRange.InsertAfter(_T("管径mm")); oCell = oTable.Cell(1, 7); oRange = oCell.GetRange(); oRange.InsertAfter(_T("K")); oCell = oTable.Cell(1, 8); oRange = oCell.GetRange(); oRange.InsertAfter(_T("水力坡降mH2O/m")); oCell = oTable.Cell(1, 9); oRange = oCell.GetRange(); oRange.InsertAfter(_T("流速m/s")); oCell = oTable.Cell(1, 10); oRange = oCell.GetRange(); oRange.InsertAfter(_T("损失mH2O")); oCell = oTable.Cell(1, 11); oRange = oCell.GetRange(); oRange.InsertAfter(_T("终点压力mH2O")); for(int i=0; im_csName; int idx = csName.Find(_T(" ")); csName = csName.Left(idx); oRange.InsertAfter(csName); csTmp.Format(_T("%.2f"), lstNode[i]->m_nStartPress); oCell = oTable.Cell(i+2, 2); //起点压力mH2O 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); 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_nDang); oCell = oTable.Cell(i+2, 5); //当量长度m oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%d"), lstNode[i]->m_iDn); oCell = oTable.Cell(i+2, 6); //管径mm oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); int iK = lstNode[i]->m_iSpare; if(iK < 1) iK = (int)m_nK; csTmp.Format(_T("%d"), iK); oCell = oTable.Cell(i+2, 7); //K oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.3f"), lstNode[i]->m_nI); oCell = oTable.Cell(i+2, 8); //水力坡降mH2O/m oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.2f"), lstNode[i]->m_nV); oCell = oTable.Cell(i+2, 9); //流速m/s oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.2f"), lstNode[i]->m_nLost); oCell = oTable.Cell(i+2, 10); //损失mH2O oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); csTmp.Format(_T("%.2f"), lstNode[i]->m_nLost + lstNode[i]->m_nStartPress); oCell = oTable.Cell(i+2, 11); //终点压力mH2O oRange = oCell.GetRange(); oRange.InsertAfter(csTmp); } 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(); wordSelection.TypeText(_T("计算结果:\n")); CString csRet; csRet.Format(_T("所选作用面积:%.1f平方米\n"), nArea); wordSelection.TypeText(csRet); csRet.Format(_T("总流量:%.2f L/s\n"), lstNode[len-1]->m_nPipeQ); wordSelection.TypeText(csRet); csRet.Format(_T("平均喷水强度:%.2f L/min.平方米\n"), lstNode[len-1]->m_nPipeQ/nArea*60); wordSelection.TypeText(csRet); csRet.Format(_T("入口压力:%.2f 米水柱\n"), lstNode[len-1]->m_nLost + lstNode[len-1]->m_nStartPress + m_dElePress); wordSelection.TypeText(csRet); if(fabs(m_dElePress) > 0.001) { csRet.Format(_T("其中高差压力:%.2f 米水柱\n"), m_dElePress); wordSelection.TypeText(csRet); } if(m_nProtectArea > 0 && m_nProtectQ > 0){ wordSelection.TypeText(_T("4喷头校核结果:\n")); csRet.Format(_T("4喷头保护面积:%.1f平方米\n"), m_nProtectArea); wordSelection.TypeText(csRet); csRet.Format(_T("4喷头总流量:%.2f L/s\n"), m_nProtectQ); wordSelection.TypeText(csRet); csRet.Format(_T("4喷头喷水强度:%.2f L/min.平方米\n"), m_nProtectQ/m_nProtectArea*60); wordSelection.TypeText(csRet); } } //输出计算表函数 void CSprinklerCalcDlg::ImportSheet(DList &lstNode, double nArea, double nK) { XPoint pt; int ret = XGetPoint(NULL, _T("点取计算结果表位置\n"), pt); if(ret != RTNORM) { return; } int nColNum(11); int len = lstNode.Length(); if(len < 0) return; AcDbObjectId idTextStyle = GlobalFunc::InitTwtTextStyle(g_Option::instance().g_csSheetStyle); if(!idTextStyle) idTextStyle = GlobalFunc::GetTextStyleId(_T("Standard")); CDbSheet *pSheet = new CDbSheet; pSheet->SetRotation(GlobalFunc::Ucs2Wcs(0.0));//add by sr InitLayer(LAY_TEXT); pSheet->setLayer(LAY_TEXT); GridStyle gridStyle; gridStyle.SetOverrideAll(TRUE); gridStyle.SetTextHeight(g_Option::instance().g_nSheetHeight); gridStyle.SetTextStyleId(idTextStyle); SheetTitle &title=pSheet->GetTitle(); title.SetHeight(7.0); title.SetVisible(TRUE); DividerStyle &style=title.GetDividerStyle(); style.SetDividerFlag(DividerStyle::kNone); gridStyle.SetHorMode(AcDb::kTextCenter); gridStyle.SetVerMode(AcDb::kTextVertMid); pSheet->SetGridStyle(gridStyle); pSheet->SetRowHeight(g_Option::instance().g_nSheetHeight+3); pSheet->InitSheet(len+2, 11, g_Option::instance().g_nSheetHeight+3, 50); CString csTitle; // csTitle.Format(_T("采用作用面积法计算 K = %.0f"), nK); // cet 2010.7.14 del csTitle = _T("采用作用面积法计算"); // cet 2010.7.14 add pSheet->SetTitleText(csTitle); SheetColumn column; column.SetWidth(15); pSheet->SetColumnAt(0, column); GridCell &cell=*(*pSheet)(0, 0); cell.SetText(_T("管段名称")); column.SetWidth(30); pSheet->SetColumnAt(1, column); GridCell &cell2=*(*pSheet)(0, 1); cell2.SetText(_T("起点压力(mH2O)")); column.SetWidth(25); pSheet->SetColumnAt(2, column); GridCell &cell3=*(*pSheet)(0, 2); cell3.SetText(_T("管道流量(L/s)")); column.SetWidth(20); pSheet->SetColumnAt(3, column); GridCell &cell4=*(*pSheet)(0, 3); cell4.SetText(_T("管长(m)")); column.SetWidth(20); pSheet->SetColumnAt(4, column); GridCell &cell5=*(*pSheet)(0, 4); cell5.SetText(_T("当量长度")); column.SetWidth(20); pSheet->SetColumnAt(5, column); GridCell &cell6=*(*pSheet)(0, 5); cell6.SetText(_T("管径(mm)")); column.SetWidth(20); pSheet->SetColumnAt(6, column); GridCell &cell11=*(*pSheet)(0, 6); cell11.SetText(_T("特性系数K")); column.SetWidth(35); pSheet->SetColumnAt(7, column); GridCell &cell7=*(*pSheet)(0, 7); cell7.SetText(_T("水力坡降(mH2O/m)")); column.SetWidth(20); pSheet->SetColumnAt(8, column); GridCell &cell8=*(*pSheet)(0, 8); cell8.SetText(_T("流速(m/s)")); column.SetWidth(30); pSheet->SetColumnAt(9, column); GridCell &cell9=*(*pSheet)(0, 9); cell9.SetText(_T("损失(mH2O)")); column.SetWidth(30); pSheet->SetColumnAt(10, column); GridCell &cell10=*(*pSheet)(0, 10); cell10.SetText(_T("终点压力(mH2O)")); for(int i=1; i<=len; i++){ CString csTmp; GridCell &Cell11=*(*pSheet)(i, 0); csTmp = lstNode[i-1]->m_csName; csTmp.Replace(_T("-"), _T("~")); int idx = csTmp.Find(_T(" ")); csTmp = csTmp.Left(idx); Cell11.SetText(csTmp); //管段名称 csTmp.Format(_T("%.2f"), lstNode[i-1]->m_nStartPress); GridCell &Cell12=*(*pSheet)(i, 1); Cell12.SetText(csTmp); //起点压力mH2O csTmp.Format(_T("%.2f"), lstNode[i-1]->m_nPipeQ); GridCell &Cell13=*(*pSheet)(i, 2); Cell13.SetText(csTmp); //管道流量L/s csTmp.Format(_T("%.2f"), lstNode[i-1]->m_nLength); GridCell &Cell14=*(*pSheet)(i, 3); Cell14.SetText(csTmp); //管长m csTmp.Format(_T("%.2f"), lstNode[i-1]->m_nDang); GridCell &Cell15=*(*pSheet)(i, 4); Cell15.SetText(csTmp); //当量长度m csTmp.Format(_T("%d"), lstNode[i-1]->m_iDn); GridCell &Cell16=*(*pSheet)(i, 5); Cell16.SetText(csTmp); //管径mm int iK(0); iK = lstNode[i-1]->m_iSpare; if(iK < 1) iK = (int)m_nK; csTmp.Format(_T("%d"), iK); GridCell &Cell21=*(*pSheet)(i, 6); Cell21.SetText(csTmp); //特性系数K csTmp.Format(_T("%.3f"), lstNode[i-1]->m_nI); GridCell &Cell17=*(*pSheet)(i, 7); Cell17.SetText(csTmp); //水力坡降mH2O/m csTmp.Format(_T("%.2f"), lstNode[i-1]->m_nV); GridCell &Cell18=*(*pSheet)(i, 8); Cell18.SetText(csTmp); //流速m/s csTmp.Format(_T("%.2f"), lstNode[i-1]->m_nLost); GridCell &Cell19=*(*pSheet)(i, 9); Cell19.SetText(csTmp); //损失mH2O csTmp.Format(_T("%.2f"), lstNode[i-1]->m_nLost + lstNode[i-1]->m_nStartPress); GridCell &Cell20=*(*pSheet)(i, 10); Cell20.SetText(csTmp); //终点压力mH2O } CString csRet; csRet.Format(_T("%.2f"), lstNode[len-1]->m_nPipeQ); GridCell &Cell20=*(*pSheet)(len+1, 0); Cell20.SetText(_T("计算结果")); GridCell &Cell21=*(*pSheet)(len+1, 1); Cell21.SetText(_T("总流量(L/s):")); GridCell &Cell22=*(*pSheet)(len+1, 2); Cell22.SetText(csRet); GridCell &Cell23=*(*pSheet)(len+1, 6); Cell23.SetText(_T("入口压力:")); csRet.Format(_T("%.2f"), lstNode[len-1]->m_nLost + lstNode[len-1]->m_nStartPress + m_dElePress); GridCell &Cell24=*(*pSheet)(len+1, 7); Cell24.SetText(csRet); GridCell &Cell25=*(*pSheet)(len+1, 3); Cell25.SetText(_T("作用面积")); GridCell &Cell26=*(*pSheet)(len+1, 4); csRet.Format(_T("%.1f平方米"), nArea); Cell26.SetText(csRet); GridCell &Cell27=*(*pSheet)(len+1, 8); Cell27.SetText(_T("平均喷水强度")); GridCell &Cell28=*(*pSheet)(len+1, 9); csRet.Format(_T("%.1fL/min.平方米"), lstNode[len-1]->m_nPipeQ/nArea*60); Cell28.SetText(csRet); pSheet->SetLocation(GlobalFunc::Ucs2Wcs(pt)); GlobalFunc::AddToModelSpace(pSheet); } BOOL CSprinklerCalcDlg::GetIdByNode(SSearchPipeList *pListAll, CString csName, AcDbObjectId &idRet) { BOOL bRet=FALSE; AcDbObjectId id = pListAll->m_ID; CString csName2 = pListAll->m_csName; if(csName2 == csName){ idRet = id; return TRUE; } long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; bRet = GetIdByNode(pList, csName, idRet); } return bRet; } SSearchPipeList *CSprinklerCalcDlg::GetNodeById(SSearchPipeList *pListAll, AcDbObjectId idSprinkler, SSearchPipeList *pNode) { AcDbObjectId id = NULL; id = pListAll->m_ID; if(idSprinkler == id) return pListAll; long len = pListAll->m_lstNode.Length(); for(long i=0;im_lstNode[i]; pNode = GetNodeById(pList, idSprinkler, pNode); } return pNode; } /* void CSprinklerCalcDlg::OnButtonCheck() { GlobalFunc::HideDialog(this, TRUE); Entity entPoly; RBList rbMask(RTDXF0, _T("LWPOLYLINE"), 8, _T("*"), NULL); if(SelectEntity(_T("\n请选择表示4个相邻喷头所组成保护面积的闭合PLINE:<退出>"), entPoly, rbMask) != RTNORM){ UpdateData(FALSE); GlobalFunc::HideDialog(this, FALSE); return; } PickSet ss(SS_FREE); XPoly2D poly(entPoly); RBList rbMask2(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_SPRINKLE, NULL); poly.TransUCS(Groups(0), Groups(1));//Groups(0) wcs, Groups(1) ucs RBList rbFence = poly.Fence(); ss.Get(_T("CP"), rbFence, NULL, rbMask2); if(ss.Length() != 4){ MessageBox(_T("必须框住4个喷头!")); UpdateData(FALSE); GlobalFunc::HideDialog(this, FALSE); return; } m_nProtectQ = 0; m_nProtectArea = AS_SQMETER(poly.Area()); int len = m_lstNode.Length(); for(long i=0;i<4;i++){ Entity ent = ss[i]; AcDbObjectId id = NULL; acdbGetObjectId(id, ent); SSearchPipeList *pNode = GetNodeById(m_pListAll, id, NULL); if(pNode){ double nStartPress = pNode->m_nStartPress; double nQ = m_nRetK * sqrt(nStartPress); m_nProtectQ += nQ; } } UpdateData(FALSE); GlobalFunc::HideDialog(this, FALSE); CString csRet; csRet.Format(_T("4喷头喷水强度:%.2f L/min.平方米\n"), m_nProtectQ/m_nProtectArea*60); MessageBox(csRet); } */ void CSprinklerCalcDlg::OnButtonHide() { long idx = m_grid.GetCurRowIndex(); CString csName1; if(idx > -1){ WDGridRow *pRow = &m_grid.GetRow(idx); if(pRow) csName1 = (*pRow)[0].GetText(); } if(csName1 != _T("")){ AcDbObjectId id = NULL; GetIdByNode(m_pListAll, csName1, id); OPENOBJ_BEGIN(id, AcDb::kForRead, CDbPipe, pPipe); if(pPipe){ XPoint ptCen, p1, p2, p3, p4; ptCen = pPipe->MidPoint(); double nDist = pPipe->Length()*2000; GlobalFunc::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); } OPENOBJ_END(); } GlobalFunc::HideDialog(this, TRUE); TCHAR szTmp[256]; ads_getstring(NULL, _T("\n按任意键返回对话框:<返回>"), szTmp); GlobalFunc::HideDialog(this, FALSE); } //校正管径,让流速控制在5之内 void CSprinklerCalcDlg::OnButtonDn() { BOOL bFind = FALSE; for(m_grid.MoveToFirst(); !m_grid.IsOut(); m_grid.MoveToNext()){ WDGridRow *pRow = m_grid.CurRow(); CString csName = (LPCTSTR)(*pRow)[0].GetText(); CString csV = (LPCTSTR)(*pRow)[8].GetText(); CString csDn = (LPCTSTR)(*pRow)[5].GetText(); if(csName == _T("")) break; if(_tstof(csV) > 5.0){ bFind = TRUE; break; } } if(bFind == FALSE){ MessageBox(_T("没有流速超过5米的管线(紫色流速值),如果需要调整可以手工修改管径值")); return; } else{ int nRes = AfxMessageBox(_T("发现有流速超过5米的管线(紫色流速值),是否统一将管径调整大一号?"),MB_YESNO | MB_ICONWARNING); if (nRes == IDNO) return; } for(m_grid.MoveToFirst(); !m_grid.IsOut(); m_grid.MoveToNext()){ WDGridRow *pRow = m_grid.CurRow(); CString csName = (LPCTSTR)(*pRow)[0].GetText(); CString csV = (LPCTSTR)(*pRow)[8].GetText(); CString csDn = (LPCTSTR)(*pRow)[5].GetText(); if(csName == _T("")) break; if(_tstof(csV) > 5.0){ int iDn = _ttoi(csDn); if(iDn <= 25) iDn = 32; else if(iDn == 32) iDn = 40; else if(iDn == 40) iDn = 50; else if(iDn == 50) iDn = 65; else if(iDn == 65) iDn = 80; else if(iDn == 80) iDn = 100; else if(iDn == 100) iDn = 125; else if(iDn == 125) iDn = 150; else if(iDn >= 150) iDn = 200; csDn.Format(_T("%d"), iDn); (*pRow)[5].SetText(csDn); SSearchPipeList *pList = GlobalFunc::GetPipeNodeByName(m_pListAll, csName, NULL); if(pList != NULL){ pList->m_iDn = iDn; OPENOBJ_BEGIN(pList->m_ID, AcDb::kForWrite, CDbPipe, pPipe); if(pPipe){ pPipe->SetDnDiameter(iDn); } OPENOBJ_END(); } } } OnOK(); } void CSprinklerCalcDlg::OnButtonHelp() { AfxMessageBox(_T("《自动喷水灭火系统设计规范》5.0.1:\n\n轻危险级,中危险级,严重危险级:系统最不利点喷头出的工作压力不应低于0.05MPa。")); }