Files
envi-code/SourceCode/Code2026/tg_shs/shs_outdoor/RoofInfoCalcDlg.cpp
T

377 lines
9.3 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#include "stdafx.h"
#include "shs_outdoor.h"
#include "RoofInfoCalcDlg.h"
#include "RecurCycleDlg.h"
#include "RunoffQuotietyDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#ifdef _WIN64
#include"TGAs.h"
//#endif
CString CRoofInfoCalcDlg::m_strt = _T("5");
CString CRoofInfoCalcDlg::m_strP = _T("50");
CString CRoofInfoCalcDlg::m_strQuotiety = _T("1");
CString CRoofInfoCalcDlg::m_strK1 = _T("0.9");
IMPLEMENT_DYNAMIC(CRoofInfoCalcDlg, CModelessDialog)
CRoofInfoCalcDlg::CRoofInfoCalcDlg(int iType, CWnd* pParent /*=NULL*/)
: CModelessDialog(CRoofInfoCalcDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CRoofInfoCalcDlg)
m_strA = _T("");
m_strB = _T("");
m_strC = _T("");
m_strN = _T("");
m_strProvince = _T("北京");
m_strCity = _T("北京");
m_strWndEdtArea = _T("0.0");
m_strN2 = _T("");
//}}AFX_DATA_INIT
m_bExistSideWall = FALSE;
}
void CRoofInfoCalcDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRoofInfoCalcDlg)
DDX_Control(pDX, IDC_LIST_CITY, m_listCity);
DDX_Control(pDX, IDC_LIST_PROVINCE, m_listProvince);
DDX_Text(pDX, IDC_STATIC_A, m_strA);
DDX_Text(pDX, IDC_STATIC_B, m_strB);
DDX_Text(pDX, IDC_STATIC_C, m_strC);
DDX_Text(pDX, IDC_STATIC_N, m_strN);
DDX_LBString(pDX, IDC_LIST_PROVINCE, m_strProvince);
DDX_LBString(pDX, IDC_LIST_CITY, m_strCity);
DDX_Text(pDX, IDC_EDIT_AREA, m_strWndEdtArea);
DDX_Text(pDX, IDC_EDIT_RAINTIME, m_strt);
DDX_Text(pDX, IDC_EDIT_RECURTIME, m_strP);
DDX_Text(pDX, IDC_EDIT_QUOTIETY, m_strQuotiety);
DDX_Text(pDX, IDC_EDIT_K1, m_strK1);
DDX_Text(pDX, IDC_STATIC_N2, m_strN2);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRoofInfoCalcDlg, CModelessDialog)
//{{AFX_MSG_MAP(CRoofInfoCalcDlg)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, onAcadKeepFocus)
ON_LBN_SELCHANGE(IDC_LIST_PROVINCE, OnSelchangeListProvince)
ON_LBN_SELCHANGE(IDC_LIST_CITY, OnSelchangeListCity)
ON_BN_CLICKED(IDC_BUTTON_NEWCITY, OnButtonNewcity)
ON_BN_CLICKED(IDC_BUTTON_CALC, OnButtonCalc)
ON_BN_CLICKED(IDC_BUTTON_RUNOFF, OnButtonRunoff)
ON_BN_CLICKED(IDC_BUTTON_RECUR, OnButtonRecur)
ON_BN_CLICKED(IDC_BUTTON_REGULATE, OnButtonRegulate)
ON_BN_CLICKED(IDC_BUTTON_AREA, OnButtonArea)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
LONG_PTR CRoofInfoCalcDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR)
{
CPoint pt;
GetCursorPos(&pt);
CRect rc;
GetWindowRect(&rc);
return (rc.PtInRect(pt) ? TRUE : FALSE);
}
BOOL CRoofInfoCalcDlg::OnInitDialog()
{
CDialog::OnInitDialog();
XString fullFile;
if(!FindFile(_T("raincity.dbf"), fullFile)) {
MessageBox(_T("对不起,没有发现raincity.dbf文件!"));
return TRUE;
}
CodeBase db;
db.read_only = 1;
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
return TRUE;
CString csTmp;
XStringList lstProvince;
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()){
GET_FIELD(pTable, _T("province"), csTmp);
if(lstProvince.Index(csTmp) < 0 && csTmp != _T(""))
lstProvince.Append(tstrnew(csTmp));
}
for(int i=0;i<lstProvince.Length();i++){
CString csProvince = lstProvince[i];
m_listProvince.AddString(csProvince);
}
CRegProperty regProp(GetRegLocation(), _T("TWTConfig"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.GetValue(_T("CurProvince"), m_strProvince);
regProp.GetValue(_T("CurCity"), m_strCity);
UpdateData(FALSE);
OnSelchangeListProvince();
regProp.GetValue(_T("CurCity"), m_strCity);
UpdateData(FALSE);
OnSelchangeListCity();
if (!m_bExistSideWall)
{
CEdit *pWnd1 = (CEdit*)GetDlgItem(IDC_EDIT_AREA);
CWnd *pWnd2 = GetDlgItem(IDC_BUTTON_AREA);
if (pWnd1 != NULL)
{
pWnd1->EnableWindow(FALSE);
}
if (pWnd2 != NULL)
{
pWnd2->EnableWindow(FALSE);
}
}
return TRUE;
}
BOOL CRoofInfoCalcDlg::GetAllCityByProvince(const TCHAR* szProvince, XStringList &lstCity)
{
CodeBase db;
db.read_only = 1;
XString fullFile;
if(!FindFile(_T("raincity.dbf"), fullFile)) {
AfxMessageBox(_T("对不起,没有发现raincity.dbf文件!"));
return TRUE;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
return TRUE;
CString csTmp, csCity;
XStringList lstProvince;
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()){
GET_FIELD(pTable, _T("province"), csTmp);
GET_FIELD(pTable, _T("city"), csCity);
if(_tcsicmp(csTmp, szProvince) == 0 && lstCity.Index(csCity) < 0)
lstCity.Append(tstrnew(csCity));
}
return TRUE;
}
void CRoofInfoCalcDlg::OnSelchangeListProvince()
{
UpdateData(TRUE);
XStringList lstCity;
GetAllCityByProvince(m_strProvince, lstCity);
m_listCity.ResetContent();
for(int i=0;i<lstCity.Length();i++)
{
CString csTmp = lstCity[i];
m_listCity.AddString(csTmp);
}
m_listCity.SetCurSel(0);
UpdateData(FALSE);
OnSelchangeListCity();
}
void CRoofInfoCalcDlg::OnSelchangeListCity()
{
UpdateData(TRUE);
CodeBase db;
db.read_only = 1;
XString fullFile;
if(!FindFile(_T("raincity.dbf"), fullFile)) {
AfxMessageBox(_T("对不起,没有发现raincity.dbf文件!"));
return;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
return;
CString csTmp, csCity;
XStringList lstProvince;
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext())
{
GET_FIELD(pTable, _T("province"), csTmp);
GET_FIELD(pTable, _T("city"), csCity);
if(_tcsicmp(csTmp, m_strProvince) == 0 && _tcsicmp(csCity, m_strCity) == 0)
{
GET_FIELD(pTable, _T("A"), m_strA);
GET_FIELD(pTable, _T("B"), m_strB);
GET_FIELD(pTable, _T("C"), m_strC);
GET_FIELD(pTable, _T("D"), m_strN);
if(m_strCity == _T("成都"))
{
m_strB = _T("12.8P");
m_strN2 = _T("0.231");
}
else if(m_strCity == _T("贵阳"))
{
m_strB = _T("9.35P");
m_strN2 = _T("0.031");
}
else
{
m_strN2 = _T("");
}
UpdateData(FALSE);
return;
}
}
}
BOOL InvokeNewCity(CString csText)
{
CString csRet;
RBList rbCmd=ads_buildlist(RTSTR, _T("ICreateNewCity"), RTSTR, csText, NULL);
resbuf *rbRes=NULL;
if(ads_invoke(rbCmd, &rbRes)==RTNORM && rbRes)
{
if(rbRes && rbRes->restype==RTSTR)
csRet=rbRes->resval.rstring;
ads_relrb(rbRes);
return TRUE;
}
return FALSE;
}
void CRoofInfoCalcDlg::OnButtonNewcity()
{
UpdateData(TRUE);
InvokeNewCity(m_strProvince);
OnSelchangeListProvince();
}
void CRoofInfoCalcDlg::OnButtonCalc()
{
UpdateData(TRUE);
double dA = 0.0, dC = 0.0, dP = 0.0, dB = 0.0, dt = 0.0, dn = 0.0, dq = 0.0;
dA = _tstof(m_strA);
dC = _tstof(m_strC);
dB = _tstof(m_strB);
dn = _tstof(m_strN);
dt = _tstof(m_strt);
dP = _tstof(m_strP);
if(m_strCity == _T("成都"))
{
dB = pow(dP, 0.231) * 12.8;
}
else if(m_strCity == _T("贵阳"))
{
dB = pow(dP, 0.031) * 9.35;
}
dq = (10000.0 / 60) * dA * (1.0 + dC * log10(dP)) / pow((dt + dB), dn);
double dQuotiety = 0.0, dK1 = 0.0;
dQuotiety = _tstof(m_strQuotiety);
dK1 = _tstof(m_strK1);
double dSizeWallArea = _tstof(m_strWndEdtArea) / 2.0;
std::vector<AcDbObjectId>::iterator it;
for (it = m_idData.begin(); it != m_idData.end(); it++)
{
TDbSpace *pSpace = NULL;
acdbOpenObject(pSpace, *it, AcDb::kForWrite);
if (pSpace != NULL)
{
double dArea = pSpace->GetUseArea() + dSizeWallArea;
double dFlux = dK1 * dQuotiety * dq * dArea / 10000;
CString strFlux;
strFlux.Format(_T("流量:%.2fL/s"), dFlux);
pSpace->SetSndName(strFlux);
pSpace->close();
}
}
OnCancel();
}
void CRoofInfoCalcDlg::OnButtonRunoff()
{
CRunoffQuotietyDlg dlg;
dlg.DoModal();
}
void CRoofInfoCalcDlg::OnButtonRecur()
{
CRecurCycleDlg dlg;
dlg.DoModal();
}
void CRoofInfoCalcDlg::OnButtonRegulate()
{
AfxMessageBox(_T("流量校正系数,对于坡度大于2.5%的屋面,取1.2~1.5;\n室外地面和其余屋面,取1。"));
}
void CRoofInfoCalcDlg::SetSpaceIdData(const std::vector<AcDbObjectId> &data)
{
std::vector<AcDbObjectId>::const_iterator it;
for (it = data.begin(); it != data.end(); it++)
{
m_idData.push_back(*it);
}
}
void CRoofInfoCalcDlg::GetSpaceIdData(std::vector<AcDbObjectId> &data)
{
std::vector<AcDbObjectId>::iterator it;
for (it = m_idData.begin(); it != m_idData.end(); it++)
{
data.push_back(*it);
}
}
void CRoofInfoCalcDlg::SetSideWall(BOOL bVal)
{
m_bExistSideWall = bVal;
}
BOOL CRoofInfoCalcDlg::GetSideWall()
{
return m_bExistSideWall;
}
void CRoofInfoCalcDlg::OnButtonArea()
{
HideDialog(this, TRUE);
RBList rbMark = ads_buildlist(RTDXF0, _T("ATS_SPACE"), NULL);
PickSet ss(SS_FREE);
if (SelectEntities(_T("\n请框选侧墙汇水面积<退出>:"), ss, rbMark) != RTNORM)
{
HideDialog(this, FALSE);
return;
}
double dArea = 0.0;
for (long i = 0; i < ss.Length(); i++)
{
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbSpace, pEnt);
if(pEnt != NULL)
{
dArea += pEnt->GetUseArea();
}
OPENOBJ_END();
}
m_strWndEdtArea.Format(_T("%.3f"), dArea);
HideDialog(this, FALSE);
UpdateData(FALSE);
}
void CRoofInfoCalcDlg::OnCancel()
{
UpdateData();
CRegProperty regProp(GetRegLocation(), _T("TWTConfig"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.SetValue(_T("CurProvince"), m_strProvince);
regProp.SetValue(_T("CurCity"), m_strCity);
CModelessDialog::OnCancel();
}