389 lines
8.5 KiB
C++
389 lines
8.5 KiB
C++
// CountAreaDlg.cpp : 实现文件
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "CountAreaDlg.h"
|
||
#include "SpaceNameClassDlg.h"
|
||
|
||
// CCountAreaDlg 对话框
|
||
BOOL CCountAreaDlg::m_bDuplex(FALSE);
|
||
BOOL CCountAreaDlg::m_bCountMode(FALSE);
|
||
|
||
IMPLEMENT_DYNAMIC(CCountAreaDlg, GlwCAcUiDialog)
|
||
|
||
CCountAreaDlg::CCountAreaDlg(CWnd* pParent /*=NULL*/)
|
||
: GlwCAcUiDialog(CCountAreaDlg::IDD, pParent)
|
||
, m_bCount(false)
|
||
{
|
||
}
|
||
|
||
CCountAreaDlg::~CCountAreaDlg()
|
||
{
|
||
}
|
||
|
||
void CCountAreaDlg::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CDialog::DoDataExchange(pDX);
|
||
DDX_Check(pDX, IDC_CHK_DUPLEX, m_bDuplex);
|
||
DDX_Radio(pDX, IDC_RAD_FLOOR, m_bCountMode);
|
||
}
|
||
|
||
BOOL CCountAreaDlg::OnInitDialog()
|
||
{
|
||
UpdateData(FALSE);
|
||
|
||
// 根据统计模式,调用不同的处理函数
|
||
if (m_bCountMode)
|
||
{
|
||
// 整个工程面积统计
|
||
OnBnClickedRadPrj();
|
||
}
|
||
else
|
||
{
|
||
// 标准层面积统计
|
||
OnBnClickedRadFloor();
|
||
}
|
||
|
||
// Zyu add on 101119,支持名称分类
|
||
CString csSysPath = g_sDwbPath;
|
||
csSysPath = csSysPath.Left(csSysPath.GetLength() - 5) + _T("\\sys\\");
|
||
CSpaceFileOperator fileReader(csSysPath + _T("spacenam.txt"));
|
||
|
||
// 设置室、厅、卫的名称数组
|
||
fileReader.GetTypeNameAry(CSpaceDataTable::eHall, TBAHouse::m_arHallString);
|
||
fileReader.GetTypeNameAry(CSpaceDataTable::eRoom, TBAHouse::m_arRoomString);
|
||
fileReader.GetTypeNameAry(CSpaceDataTable::eToilet, TBAHouse::m_arToiletString);
|
||
|
||
return CDialog::OnInitDialog();
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CCountAreaDlg, GlwCAcUiDialog)
|
||
ON_BN_CLICKED(IDC_BTN_PICK, OnBnClickedBtnPick)
|
||
ON_BN_CLICKED(IDC_BTN_CLASSIFY, OnBnClickedBtnClassify)
|
||
ON_BN_CLICKED(IDC_RAD_FLOOR, OnBnClickedRadFloor)
|
||
ON_BN_CLICKED(IDC_RAD_PRJ, OnBnClickedRadPrj)
|
||
ON_BN_CLICKED(IDC_CHK_DUPLEX, OnBnClickedChkDuplex)
|
||
ON_WM_CTLCOLOR()
|
||
END_MESSAGE_MAP()
|
||
|
||
|
||
// CCountAreaDlg 消息处理程序
|
||
|
||
void CCountAreaDlg::OnBnClickedBtnPick()
|
||
{
|
||
// 清空原有数据
|
||
m_baBuilding.Clear();
|
||
m_lstHouseData.Clear();
|
||
|
||
HideDialog(true);
|
||
// 选择面积对象
|
||
m_bCount = PickSpaceEntities();
|
||
// 如果成功,进行面积统计
|
||
if (m_bCount)
|
||
{
|
||
m_bCount = CountArea();
|
||
}
|
||
HideDialog(false);
|
||
// 更新控件
|
||
UpdateCtrls();
|
||
}
|
||
|
||
void CCountAreaDlg::OnBnClickedBtnClassify()
|
||
{
|
||
CSpaceNameClassDlg dlg(true, this);
|
||
|
||
// 名称分类对话框
|
||
CAcModuleResourceOverride vTemp;
|
||
if (dlg.DoModal() == IDOK)
|
||
{
|
||
// Zyu modify on 101119,设置室、厅、卫的名称数组
|
||
// sg modify 110309,CSpaceNameClassDlg类错误,下列接口返回数组为空,无法使用
|
||
/*
|
||
// 厅字符串数组
|
||
//CStringArray aryHallString;
|
||
//dlg.GetTypeNameAry(CSpaceDataTable::eHall, aryHallString);
|
||
dlg.GetTypeNameAry(CSpaceDataTable::eHall, TBAHouse::m_arHallString);
|
||
// 室字符串数组
|
||
//CStringArray aryRoomString;
|
||
//dlg.GetTypeNameAry(CSpaceDataTable::eRoom, aryRoomString);
|
||
dlg.GetTypeNameAry(CSpaceDataTable::eRoom, TBAHouse::m_arRoomString);
|
||
// 卫字符串数组
|
||
//CStringArray aryToiletString;
|
||
//dlg.GetTypeNameAry(CSpaceDataTable::eToilet, aryToiletString);
|
||
dlg.GetTypeNameAry(CSpaceDataTable::eToilet, TBAHouse::m_arToiletString);
|
||
*/
|
||
|
||
CString csSysPath = g_sDwbPath;
|
||
csSysPath = csSysPath.Left(csSysPath.GetLength() - 5) + _T("\\sys\\");
|
||
|
||
// 设置室、厅、卫的名称数组
|
||
CSpaceFileOperator fileReader(csSysPath + _T("spacenam.txt"));
|
||
fileReader.GetTypeNameAry(CSpaceDataTable::eHall, TBAHouse::m_arHallString);
|
||
fileReader.GetTypeNameAry(CSpaceDataTable::eRoom, TBAHouse::m_arRoomString);
|
||
fileReader.GetTypeNameAry(CSpaceDataTable::eToilet, TBAHouse::m_arToiletString);
|
||
}
|
||
}
|
||
|
||
void CCountAreaDlg::OnBnClickedRadFloor()
|
||
{
|
||
// 清空原有数据
|
||
m_baBuilding.Clear();
|
||
m_lstHouseData.Clear();
|
||
|
||
m_bCount = false;
|
||
m_sPrompt = _T("请先选择需要统计的标准层房间\\面积对象。");
|
||
|
||
UpdateData();
|
||
UpdateCtrls();
|
||
}
|
||
|
||
void CCountAreaDlg::OnBnClickedRadPrj()
|
||
{
|
||
// 清空原有数据
|
||
m_baBuilding.Clear();
|
||
m_lstHouseData.Clear();
|
||
|
||
// 读取tpr文件,得到面积对象
|
||
m_bCount = CheckProject();
|
||
// 进行面积统计
|
||
if (m_bCount)
|
||
{
|
||
m_bCount = CountArea();
|
||
CString sPrjName;
|
||
g_project.GetProjectName(sPrjName);
|
||
m_sPrompt = _T("当前工程:") + sPrjName + _T("\r\n") + m_sPrompt;
|
||
}
|
||
|
||
UpdateData();
|
||
UpdateCtrls();
|
||
}
|
||
|
||
HBRUSH CCountAreaDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
|
||
{
|
||
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
|
||
|
||
// 修改提示文字为红色
|
||
if (nCtlColor == CTLCOLOR_STATIC && pWnd->GetDlgCtrlID() == IDC_STC_PROMPT)
|
||
{
|
||
pDC->SetTextColor(RGB(255, 0, 0));
|
||
}
|
||
|
||
return hbr;
|
||
}
|
||
|
||
void CCountAreaDlg::OnBnClickedChkDuplex()
|
||
{
|
||
UpdateData();
|
||
|
||
// 根据统计模式,调用不同的处理函数
|
||
if (m_bCountMode)
|
||
{
|
||
// 整个工程面积统计
|
||
OnBnClickedRadPrj();
|
||
}
|
||
else
|
||
{
|
||
// 标准层面积统计
|
||
OnBnClickedRadFloor();
|
||
}
|
||
}
|
||
|
||
// 显示或隐藏对话框
|
||
void CCountAreaDlg::HideDialog(bool bHide)
|
||
{
|
||
if (bHide)
|
||
{
|
||
GetParent()->EnableWindow(TRUE);
|
||
GetParent()->SetFocus();
|
||
GetParent()->SetActiveWindow();
|
||
ShowWindow(SW_HIDE);
|
||
}
|
||
else
|
||
{
|
||
GetParent()->EnableWindow(FALSE);
|
||
EnableWindow(TRUE);
|
||
SetActiveWindow();
|
||
ShowWindow(SW_SHOW);
|
||
}
|
||
}
|
||
|
||
// 选择面积对象
|
||
bool CCountAreaDlg::PickSpaceEntities()
|
||
{
|
||
RBList mask=ads_buildlist(RTDXF0,_T("TCH_SPACE"),NULL);
|
||
|
||
PickSet ss(SS_FREE);
|
||
if (SelectEntities(_T("\n请选择需要统计的标准层房间/面积对象<返回>:"),ss,mask)!=RTNORM)
|
||
{
|
||
m_sPrompt = _T("请先选择需要统计的标准层房间\\面积对象。");
|
||
return false;
|
||
}
|
||
|
||
int nTA=0; // 建筑面积对象数量
|
||
int nHA=0; // 套内面积对象数量
|
||
double dTotalArea=0; // 总建筑面积
|
||
double dSumHouseArea=0; // 总套内面积
|
||
// 判断选择的面积对象是否可以进行统计
|
||
for(long i=0;i<ss.Length();i++)
|
||
{
|
||
Entity ent=ss[i];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbSpace, pSpace);
|
||
if (pSpace == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
if (pSpace->GetType()==TDbSpace::kHouseArea)
|
||
{
|
||
nHA++;
|
||
dSumHouseArea+=pSpace->m_nUseArea;
|
||
}
|
||
|
||
if (pSpace->GetType()==TDbSpace::kTotalArea)
|
||
{
|
||
nTA++;
|
||
AcGeVector3d vt;
|
||
XPoly2D poly(1);
|
||
pSpace->GetPathPoly(poly,vt);
|
||
dTotalArea=poly.Area();
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
if (nHA<1)
|
||
{
|
||
m_sPrompt = _T("未发现套内面积对象,请正确选择。");
|
||
return false;
|
||
}
|
||
if (nTA<1)
|
||
{
|
||
m_sPrompt = _T("未发现建筑面积对象,请正确选择。");
|
||
return false;
|
||
}
|
||
if (dTotalArea-dSumHouseArea < -1E-6)
|
||
{
|
||
m_sPrompt = _T("建筑面积小于总套内面积,请正确选择。");
|
||
return false;
|
||
}
|
||
|
||
// 将标准层统计看成只有一层的建筑工程统计
|
||
TBAFloor *pFloor=new TBAFloor;
|
||
pFloor->Append(ss);
|
||
m_baBuilding.AddTail(pFloor);
|
||
|
||
m_sPrompt = _T("请点击“开始统计”按钮查看统计结果。");
|
||
return true;
|
||
}
|
||
|
||
// 更改控件对象状态
|
||
void CCountAreaDlg::UpdateCtrls()
|
||
{
|
||
GetDlgItem(IDC_BTN_PICK)->EnableWindow(!m_bCountMode);
|
||
GetDlgItem(IDOK)->EnableWindow(m_bCount);
|
||
// 提示
|
||
SetDlgItemText(IDC_STC_PROMPT, m_sPrompt);
|
||
}
|
||
|
||
// 通过tpr文件读取面积对象
|
||
bool CCountAreaDlg::CheckProject()
|
||
{
|
||
if (g_project.IsEmpty())
|
||
{
|
||
m_sPrompt = _T("请打开或新建一个工程项目,并在工程数据库中建立楼层表!");
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
TProjectGroupItem* pTable=GetFloorTable();
|
||
if (pTable==NULL)
|
||
{
|
||
m_sPrompt = _T("请在工程数据库中建立楼层表!");
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
for(pTable->MoveToFirst();!pTable->IsOut();pTable->MoveToNext())
|
||
{
|
||
TProjectFloor* pFloor=(TProjectFloor*)pTable->GetCurData();
|
||
TBAFloor *pBaFloor = new TBAFloor(pFloor);
|
||
m_baBuilding.AddTail(pBaFloor);
|
||
}
|
||
}
|
||
}
|
||
|
||
m_sPrompt = _T("");
|
||
return true;
|
||
}
|
||
|
||
// 进行面积统计
|
||
bool CCountAreaDlg::CountArea()
|
||
{
|
||
// Zyu modify on 100906,按全楼公摊
|
||
//m_baBuilding.Share(); // 分摊计算
|
||
m_baBuilding.ShareInBuilding(); // 分摊计算
|
||
|
||
if (m_bDuplex)
|
||
{
|
||
m_baBuilding.FindHouseUp(); // 处理跃层
|
||
}
|
||
// Zyu add on 100910,判断是否存在建筑面积对象
|
||
bool bHasBuildArea = true;
|
||
|
||
// 套型统计
|
||
Array<CString> arrayLayerName;
|
||
for(m_baBuilding.MoveToFirst();!m_baBuilding.IsOut();m_baBuilding.MoveToNext())
|
||
{
|
||
TBAFloor *pFloor=(TBAFloor*)m_baBuilding.GetCurData();
|
||
|
||
TProjectFloor *pFloorDef=pFloor->m_pFloorDef;
|
||
CString strLayNo;
|
||
if (!pFloorDef)
|
||
strLayNo=_T("1");
|
||
else
|
||
{
|
||
strLayNo=pFloorDef->GetLayerNo();
|
||
}
|
||
arrayLayerName.AddTail(strLayNo);
|
||
|
||
for(pFloor->m_lstHouse.MoveToFirst();!pFloor->m_lstHouse.IsOut();pFloor->m_lstHouse.MoveToNext())
|
||
{
|
||
TBAHouse *pHouse =(TBAHouse*)pFloor->m_lstHouse.GetCurData();
|
||
|
||
// 考虑跃层
|
||
if (pHouse->IsHouseUp())
|
||
continue;
|
||
|
||
m_lstHouseData.Append(pHouse,m_baBuilding.GetCur(),m_baBuilding.GetLength());
|
||
}
|
||
|
||
// Zyu add on 100910,判断是否存在建筑面积对象
|
||
if (bHasBuildArea && pFloor->GetOutlineNum() == 0)
|
||
{
|
||
bHasBuildArea = false;
|
||
}
|
||
}
|
||
|
||
if (m_lstHouseData.GetLength()<1)
|
||
{
|
||
m_sPrompt = _T("未找到已分户房间!");
|
||
return false;
|
||
}
|
||
|
||
// Zyu add on 100910,提示不存在建筑面积对象
|
||
if (!bHasBuildArea)
|
||
{
|
||
m_sPrompt = _T("未发现建筑面积对象!");
|
||
return false;
|
||
}
|
||
|
||
for(m_lstHouseData.MoveToFirst();!m_lstHouseData.IsOut();m_lstHouseData.MoveToNext())
|
||
{
|
||
TBAHouseData *pHD = m_lstHouseData.GetCurData();
|
||
pHD->m_arrayLayerName = arrayLayerName;
|
||
}
|
||
|
||
m_sPrompt = _T("请点击“开始统计”按钮查看统计结果。");
|
||
return true;
|
||
}
|
||
|