#include "stdafx.h" #include "FloorOperDlg.h" #include "actrans.h" BOOL g_bFloorOperDlgOpen = FALSE; IMPLEMENT_DYNAMIC(CFloorOperDlg, CModelessDialog) void FloorOper() { if(g_bFloorOperDlgOpen) return; CTemporaryResourceOverride ResTemp; CFloorOperDlg* pDlg = new CFloorOperDlg; if (pDlg) { pDlg->CreateModelDlg(); g_bFloorOperDlgOpen = TRUE; } } CFloorOperDlg::CFloorOperDlg(CWnd* pParent) : CModelessDialog(CFloorOperDlg::IDD, pParent) , m_sCurFloorName(_T("")) { } CFloorOperDlg::~CFloorOperDlg() { } void CFloorOperDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); DDX_LBString(pDX, IDC_LIST_FLOOR, m_sCurFloorName); DDX_Control(pDX, IDC_LIST_FLOOR, m_wndLstFloor); } BEGIN_MESSAGE_MAP(CFloorOperDlg, CModelessDialog) ON_WM_CLOSE() ON_WM_DESTROY() ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus) ON_BN_CLICKED(IDC_BTN_NEWFLOOR, OnBtnNewfloor) ON_BN_CLICKED(IDC_BTN_COPY, OnBtnCopyfloor) ON_BN_CLICKED(IDC_BTN_DELFLOOR, OnBtnDelfloor) ON_BN_CLICKED(IDC_BTN_VIEWFLOOR, OnBtnViewfloor) ON_LBN_DBLCLK(IDC_LIST_FLOOR, OnDblclkListFloor) END_MESSAGE_MAP() LONG_PTR CFloorOperDlg::OnAcadKeepFocus(UINT_PTR, LONG_PTR) { CPoint pt; GetCursorPos(&pt); CRect rc; GetWindowRect(&rc); return (rc.PtInRect(pt) ? TRUE : FALSE); } BOOL CFloorOperDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); FilterAllFloorRect(); ShowFloorRect(); ShowFloorList(); return TRUE; } void CFloorOperDlg::CreateModelDlg() { Create(IDD,acedGetAcadFrame()); ShowWindow(TRUE); } void CFloorOperDlg::ZoomToCurFloor() { if (!m_sCurFloorName.IsEmpty()) { AcApDocument* pDoc = acDocManager->curDocument(); acDocManager->lockDocument(pDoc); XPoint ptLowLeft,ptUpRight; AcDbObjectId oid; oid = m_arFloors[m_sCurFloorName]; OPENOBJ_BEGIN(oid,AcDb::kForRead,TDbFloorRect,pFloorRect); if (pFloorRect) { ptLowLeft = pFloorRect->GetLowLeft(); ptUpRight = pFloorRect->GetUpRight(); // ptLowLeft = Wcs2Ucs(ptLowLeft); // ptUpRight = Wcs2Ucs(ptUpRight); ArxZoom(ptLowLeft,ptUpRight); // ads_command(RTSTR,_T("ZOOM"),RTSTR,_T("W"),RT3DPOINT,&ptLowLeft,RT3DPOINT,&ptUpRight,NULL); } OPENOBJ_END(); acDocManager->unlockDocument(pDoc); } } void CFloorOperDlg::ShowFloorList() { //显示楼层列表 m_wndLstFloor.ResetContent(); for (FloorList::iterator itor = m_arFloors.begin(); itor != m_arFloors.end();++itor) { m_wndLstFloor.InsertString(m_wndLstFloor.GetCount(),itor->first); } } void CFloorOperDlg::FilterAllFloorRect() { //过滤当前图纸所有楼层框 RBList mask(RTDXF0, _T("ATS_FLOORRECT"), NULL); PickSet ss(SS_FREE); ss.Get(_T("X"), NULL, NULL, mask); long len = ss.Length(); AcDbObjectId oid; CString csName = _T(""); for(long i=0;iGetFloorName(); oid = pFloor->objectId(); m_arFloors.insert(std::make_pair(csName,oid)); } OPENOBJ_END(); } } void CFloorOperDlg::ShowFloorRect(BOOL bShow) { AcApDocument* pDoc = acDocManager->curDocument(); acDocManager->lockDocument(pDoc); FloorList::iterator itor; for (itor = m_arFloors.begin(); itor != m_arFloors.end();++itor) { OPENOBJ_BEGIN(itor->second,AcDb::kForWrite,TDbFloorRect,pFloor); if (pFloor) { pFloor->SetShow(bShow); } OPENOBJ_END(); } acDocManager->unlockDocument(pDoc); } void CFloorOperDlg::OnClose() { DestroyWindow(); PostCommand(_T("\33")); } void CFloorOperDlg::OnDestroy() { ShowFloorRect(FALSE); CModelessDialog::OnDestroy(); delete this; g_bFloorOperDlgOpen = FALSE; } void CFloorOperDlg::OnDblclkListFloor() { //OnOK(); OnBtnViewfloor(); } void CFloorOperDlg::OnBtnCopyfloor() { PostCommand(_T("lcfz\n")); } void CFloorOperDlg::OnBtnNewfloor() { //新建楼层 XPoint ptBase,ptLeft,ptRight,ptCen; double dHeight; CString csName; BOOL bRet = FALSE; if(ads_getpoint(NULL, _T("\n请点选楼层基点<退出>:"), ptBase) != RTNORM) return; ptBase.z = 0; TCHAR szName[256]; ads_getstring(0, _T("\n请输入楼层名称<退出>:"), szName); csName = szName; if(csName == _T("")) { PostCommand(_T("\33")); return ; } if(m_arFloors.find(csName) != m_arFloors.end()) { adsout << _T("\n注意:楼层基点名称重复!"); PostCommand(_T("\33")); return ; } double dFloorHeight(3.0); ads_getreal(_T("\n楼层高:<3.0m>"), &dFloorHeight); dHeight = dFloorHeight; if(dHeight > 900) dHeight = dHeight / 1000; //必须米单位 if(ads_getpoint(NULL, _T("\n请点该楼层一角<退出>:"), ptLeft) != RTNORM) { PostCommand(_T("\33")); return ; } if(ads_getcorner(ptLeft, _T("\n请点该楼层对角<退出>:"), ptRight) != RTNORM) { PostCommand(_T("\33")); return ; } ptLeft.z = 0; ptRight.z = 0; AcApDocument* pDoc = acDocManager->curDocument(); acDocManager->lockDocument(pDoc); XRectAngle rect(ptLeft, ptRight); TDbFloorRect *pNew = new TDbFloorRect; pNew->SetBase(ptBase); rect.Center(ptCen); pNew->SetCenter(ptCen); pNew->SetLength(rect.Width()); pNew->SetWidth(rect.Height()); pNew->SetFloorName(csName); pNew->SetFloorHeight(dHeight); pNew->SetTextStyleId(InitTextStyle(TS_STANDARD)); pNew->SetTextHeight(5.0); pNew->SetLayoutRotation(Ucs2Wcs(0.0)); // 设置布局转角,支持UCS pNew->SetShow(TRUE); AcDbObjectId idNew = AddToCurrentSpace(pNew, Adesk::kTrue); acDocManager->unlockDocument(pDoc); if (idNew.isValid()) { m_arFloors.insert(std::make_pair(csName,idNew)); m_wndLstFloor.InsertString(m_wndLstFloor.GetCount(),csName); } PostCommand(_T("\33")); } void CFloorOperDlg::OnBtnDelfloor() { //删除楼层 UpdateData(); if (!m_sCurFloorName.IsEmpty()) { AcApDocument* pDoc = acDocManager->curDocument(); acDocManager->lockDocument(pDoc); AcDbObjectId oid; Acad::ErrorStatus es; oid = m_arFloors[m_sCurFloorName]; OPENOBJ_BEGIN(oid,AcDb::kForRead,TDbFloorRect,pFloor); if (pFloor) { es = pFloor->upgradeOpen(); if ( es == Acad::eOk) { pFloor->erase(); pFloor->downgradeOpen(); } } OPENOBJ_END(); PostCommand(_T("RE\n")); acDocManager->unlockDocument(pDoc); int nPos = m_wndLstFloor.GetCurSel(); m_wndLstFloor.DeleteString(nPos); m_arFloors.erase(m_sCurFloorName); } } void CFloorOperDlg::OnBtnViewfloor() { UpdateData(); //锁定楼层 ZoomToCurFloor(); }