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