283 lines
6.2 KiB
C++
283 lines
6.2 KiB
C++
#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;i<len;i++)
|
|
{
|
|
Entity ent = ss[i];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbFloorRect, pFloor);
|
|
if(pFloor)
|
|
{
|
|
csName = pFloor->GetFloorName();
|
|
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();
|
|
} |