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

389 lines
9.1 KiB
C++
Raw Permalink 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.
// 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;
}