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

378 lines
9.4 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.
#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();
}