388 lines
8.5 KiB
C++
388 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;
|
|||
|
|
}
|
|||
|
|
|