Files
envi-code/SourceCode/Code2026/Dimension/SprinklerCalcDlg.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1446 lines
46 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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; i<len; i++){
m_grid.AppendRow();
TGridSprinklerData *pNewData = new TGridSprinklerData();
CString csName = m_lstNode[i]->m_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;i<len;i++){
SSearchPipeList *pList = pListAll->m_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;i<len;i++){
SSearchPipeList *pList = pListAll->m_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<AcDbObjectId> 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;j<iLen;j++){
SSearchPipeList *pListTmp = pList->m_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;i<len;i++){
SSearchPipeList *pList = pListAll->m_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<AcDbObjectId> 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;i<len;i++){
SSearchPipeList *pList = pListAll->m_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<AcDbObjectId> 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;j<iLen;j++){
SSearchPipeList *pListTmp = pList->m_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<SSearchPipeList> &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; i<len; i++){
CString csTmp;
oCell = oTable.Cell(i+2, 1); //管段名称
oRange = oCell.GetRange();
CString csName = lstNode[i]->m_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<SSearchPipeList> &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;i<len;i++){
SSearchPipeList *pList = pListAll->m_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;i<len;i++){
SSearchPipeList *pList = pListAll->m_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。"));
}