Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/CountAreaDlg.cpp
T

388 lines
8.5 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
// 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;
}