// 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;iGetType()==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 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; }