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

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