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

807 lines
20 KiB
C++

#include "stdafx.h"
#include "StdArx.h"
#include "FloorMgrDlg.h"
#include "KTCadUtility.h"
#include "KTSetting.h"
#include "AecDbEwEquipment.h"
const LPCTSTR g_sBuiding = _T("构筑物");
#ifndef IMG_ROOT
#define IMG_ROOT 7
#endif
#define IMG_ITEM 1
#define IMG_ITEMSEL 2
#define IMG_SUBITEM 0
#define IMG_SUBITEMSEL 0
#ifndef WM_SHOWORHIDEFLOOR
#define WM_SHOWORHIDEFLOOR (WM_USER + 0x1001)
#endif
//#define ID_REFRUSH 117
#define ID_MODIFY 118
IMPLEMENT_DYNAMIC(CFloorMgrDlg, CDialog)
CFloorMgrDlg::CFloorMgrDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFloorMgrDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFloorMgrDlg)
//}}AFX_DATA_INIT
}
CFloorMgrDlg::~CFloorMgrDlg(void)
{
}
void CFloorMgrDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFloorMgrDlg)
DDX_Control(pDX, IDC_TREE1, m_wndFloorTree);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFloorMgrDlg, CDialog)
//{{AFX_MSG_MAP(CFloorMgrDlg)
ON_MESSAGE( WM_ACAD_KEEPFOCUS, &CFloorMgrDlg::onAcadKeepFocus )
//}}AFX_MSG_MAP
ON_NOTIFY(NM_CLICK, IDC_TREE1, &CFloorMgrDlg::OnNMClickTree1)
ON_MESSAGE(WM_SHOWORHIDEFLOOR,&CFloorMgrDlg::OnShowOrHideFloor)
ON_WM_SIZE()
ON_NOTIFY(NM_RCLICK, IDC_TREE1, &CFloorMgrDlg::OnNMRClickTree1)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CFloorMgrDlg::OnTvnSelchangedTree1)
ON_NOTIFY(NM_DBLCLK, IDC_TREE1, &CFloorMgrDlg::OnNMDblclkTree1)
END_MESSAGE_MAP()
LONG_PTR CFloorMgrDlg::onAcadKeepFocus( UINT_PTR, LONG_PTR)
{
POINT pt;
::GetCursorPos(&pt);
CRect rect;
GetWindowRect(&rect);
if(!(rect.PtInRect(pt)))
{
return FALSE;
}
return TRUE;
}
BOOL CFloorMgrDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmp;
if (!bmp.LoadBitmap (IDB_BITMAPPRIV))
{
AfxMessageBox(_T ("Can't load bitmap: %x\n"), IDB_BITMAPPRIV);
ASSERT (FALSE);
return FALSE;
}
BITMAP bmpObj;
bmp.GetBitmap (&bmpObj);
UINT nFlags = ILC_COLOR24 | ILC_MASK;
m_Imagelist.Create (16, bmpObj.bmHeight, nFlags, 0, 0);
m_Imagelist.Add (&bmp, RGB (255, 0, 0));
m_wndFloorTree.SetImageList(&m_Imagelist,TVSIL_NORMAL);
//if (::IsWindow(m_wndFloorTree.m_hWnd))
{
CRect rc;
GetClientRect(&rc);
rc.DeflateRect(7,7,7,7);
m_wndFloorTree.MoveWindow(rc);
}
return TRUE;
}
void CFloorMgrDlg::InsertChildItem(HTREEITEM hRoot,LPCTSTR pszName,Adesk::IntDbId nId,AcDb::Visibility eShow)
{
typedef std::map<int,HTREEITEM>::iterator It;
typedef std::map<Adesk::IntDbId,int>::iterator IIt;
CString sText,sClassName,sName;
sName = pszName;//可以拆解分类名称
IIt iit = m_mapIdToEl.find(nId);
if (iit != m_mapIdToEl.end())
{
int nEl = iit->second;//实体的标高
int nPos = -1,nEl2 = -1.0;
BOOL bFind = FALSE;
HTREEITEM hRoot = m_wndFloorTree.GetRootItem();
if (hRoot != NULL)
{
HTREEITEM hChild = m_wndFloorTree.GetChildItem(hRoot);
while(hChild != NULL)
{
sText = m_wndFloorTree.GetItemText(hChild);
nPos = sText.ReverseFind(_T(':'));
if (nPos != -1)
{
nEl2 = _ttoi(sText.Mid(nPos + 1));
if (nEl == nEl2)//find el 找到标高层
{
//找分类
HTREEITEM hSubChild = m_wndFloorTree.GetChildItem(hChild);
while(hSubChild != NULL)
{
sClassName = m_wndFloorTree.GetItemText(hSubChild);
if (sClassName.CompareNoCase(sName) == 0)
{
bFind = TRUE;
break;
}
hSubChild = m_wndFloorTree.GetNextSiblingItem(hSubChild);
}
if ( bFind )
{
//建立下级构件
HTREEITEM hSubItem = m_wndFloorTree.InsertItem(pszName,IMG_SUBITEM,IMG_SUBITEM,hSubChild);
m_wndFloorTree.SetItemData(hSubItem,nId);
m_wndFloorTree.SetCheck(hSubItem,(eShow == AcDb::kVisible) ? TRUE : FALSE);
}
else
{
hSubChild = m_wndFloorTree.InsertItem(sName,IMG_SUBITEM,IMG_SUBITEM,hChild);
if (hSubChild != NULL)
{
m_wndFloorTree.SetCheck(hSubChild,TRUE);
//建立下级构件
HTREEITEM hSubItem = m_wndFloorTree.InsertItem(pszName,IMG_SUBITEM,IMG_SUBITEM,hSubChild);
m_wndFloorTree.SetItemData(hSubItem,nId);
m_wndFloorTree.SetCheck(hSubItem,(eShow == AcDb::kVisible) ? TRUE : FALSE);
}
}
return;
}
}
hChild = m_wndFloorTree.GetNextSiblingItem(hChild);
}
//层已经排序建立了
//第n层 底标高:3000
//没有找到,在某一层内
HTREEITEM hPos = NULL;
hChild = m_wndFloorTree.GetChildItem(hRoot);
while(hChild != NULL)
{
sText = m_wndFloorTree.GetItemText(hChild);
nPos = sText.ReverseFind(_T(':'));
if (nPos != -1)
{
nEl2 = _ttoi(sText.Mid(nPos + 1));
if (nEl > nEl2)//找到最后大的
{
hPos = hChild;
}
}
hChild = m_wndFloorTree.GetNextSiblingItem(hChild);
}
if (hPos != NULL)
{
//从找到的层中,找分类
HTREEITEM hSubChild = m_wndFloorTree.GetChildItem(hPos);
while(hSubChild != NULL)
{
sClassName = m_wndFloorTree.GetItemText(hSubChild);
if (sClassName.CompareNoCase(sName) == 0)
{
bFind = TRUE;
break;
}
hSubChild = m_wndFloorTree.GetNextSiblingItem(hSubChild);
}
if ( bFind )
{
//建立下级构件
HTREEITEM hSubItem = m_wndFloorTree.InsertItem(pszName,IMG_SUBITEM,IMG_SUBITEM,hSubChild);
m_wndFloorTree.SetItemData(hSubItem,nId);
m_wndFloorTree.SetCheck(hSubItem,(eShow == AcDb::kVisible) ? TRUE : FALSE);
}
else
{
hSubChild = m_wndFloorTree.InsertItem(sName,IMG_SUBITEM,IMG_SUBITEM,hPos);
if (hSubChild != NULL)
{
m_wndFloorTree.SetCheck(hSubChild,TRUE);
//建立下级构件
HTREEITEM hSubItem = m_wndFloorTree.InsertItem(pszName,IMG_SUBITEM,IMG_SUBITEM,hSubChild);
m_wndFloorTree.SetItemData(hSubItem,nId);
m_wndFloorTree.SetCheck(hSubItem,(eShow == AcDb::kVisible) ? TRUE : FALSE);
}
}
}
}
}
}
void CFloorMgrDlg::ShowFloorElItems()
{
AcDbDatabase *pDb = acdbCurDwg();
if (pDb != NULL)
{
AcDbObjectId idLay;
AcDbObjectId idAxis = KTSetting::InitLayer(_T("LAY_AXIS"));
std::vector<int> vtFloor;
AcGePoint3d ptPos;
AcGeVector3d vtDir;
Acad::ErrorStatus es;
AcDbBlockTable* pTable = NULL;
if ( Acad::eOk == (es = pDb->getBlockTable(pTable,AcDb::kForRead) ) )
{
AcDbBlockTableRecord* pRecord = NULL;
if (Acad::eOk == (es = pTable->getAt(ACDB_MODEL_SPACE,pRecord,AcDb::kForRead)))
{
AcDbEntity* pEnt = NULL;
AcDbBlockTableRecordIterator* pIt = NULL;
pRecord->newIterator(pIt);
if (pIt != NULL)
{
for (pIt->start();!pIt->done();pIt->step())
{
if ( Acad::eOk == (es = pIt->getEntity(pEnt,AcDb::kForRead) ) )
{
AecDbXWall* pWall = AecDbXWall::cast(pEnt);
if (pWall != NULL)
{
WallData data;
pWall->GetWallData(data);
int nEl = (int)(data.dBomEl + 0.5);
if ( std::find(vtFloor.begin(),vtFloor.end(),nEl) == vtFloor.end())
{
vtFloor.push_back(nEl);
}
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AecDbBeam* pBeam = AecDbBeam::cast(pEnt);
if (pBeam != NULL)
{
ColumnParam data;
pBeam->GetBeamData(data);
int nEl = (int)(data.m_dBomEl + 0.5);
if ( std::find(vtFloor.begin(),vtFloor.end(),nEl) == vtFloor.end())
{
vtFloor.push_back(nEl);
}
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AecDbXSlab* pSlab = AecDbXSlab::cast(pEnt);
if (pSlab != NULL)
{
int nEl = (int)(pSlab->GetElBom() + 0.5);
if ( std::find(vtFloor.begin(),vtFloor.end(),nEl) == vtFloor.end())
{
vtFloor.push_back(nEl);
}
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AecDbColumn* pCol = AecDbColumn::cast(pEnt);
if (pCol != NULL)
{
ColumnParam data;
pCol->GetColumnData(data);
int nEl = (int)(data.m_dBomEl + 0.5);
if ( std::find(vtFloor.begin(),vtFloor.end(),nEl) == vtFloor.end())
{
vtFloor.push_back(nEl);
}
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AecDbClimbStair* pCStair = AecDbClimbStair::cast(pEnt);
if (pCStair != NULL)
{
ClimbStair data;
pCStair->GetClimbStairData(data);
int nEl = (int)(data.dBomEl + 0.5);
if ( std::find(vtFloor.begin(),vtFloor.end(),nEl) == vtFloor.end())
{
vtFloor.push_back(nEl);
}
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AecDbLineStair* pLStair = AecDbLineStair::cast(pEnt);
if (pLStair != NULL)
{
LineStair data;
pLStair->GetLineStairData(data);
int nEl = (int)(data.dBomEl + 0.5);
if ( std::find(vtFloor.begin(),vtFloor.end(),nEl) == vtFloor.end())
{
vtFloor.push_back(nEl);
}
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AecDbX3dPartEntity* pPart = AecDbX3dPartEntity::cast(pEnt);
if (pPart != NULL)
{
ptPos = pPart->GetOrgPoint();
int nEl = (int)(ptPos.z + 0.5);
if ( std::find(vtFloor.begin(),vtFloor.end(),nEl) == vtFloor.end())
{
vtFloor.push_back(nEl);
}
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt);
if (pPipe != NULL)
{
pPipe->getStartPoint(ptPos);
int nEl = (int)(ptPos.z + 0.5);
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt);
if (pFit != NULL)
{
pFit->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MID,ptPos);
int nEl = (int)(ptPos.z + 0.5);
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt);
if (pEqu != NULL)
{
pEqu->GetInsert(ptPos,vtDir);
int nEl = (int)(ptPos.z + 0.5);
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
AcDbLine* pLn = AcDbLine::cast(pEnt);
if (pLn != NULL)
{
idLay = pEnt->layerId();
if (idLay == idAxis)
{
pLn->getStartPoint(ptPos);
int nEl = (int)(ptPos.z + 0.5);
if ( std::find(vtFloor.begin(),vtFloor.end(),nEl) == vtFloor.end())
{
vtFloor.push_back(nEl);
}
std::pair<Adesk::IntDbId,int> pa(pEnt->objectId().asOldId(),nEl);
m_mapIdToEl.insert(pa);
}
}
pEnt->close();
}
}
delete pIt;
}
pRecord->close();
}
pTable->close();
}
std::sort(vtFloor.begin(),vtFloor.end());
typedef std::map<int,HTREEITEM>::iterator It;
int nFloor = 0.0,nEl = 0;
CString sText;
for (int i = 0;i < vtFloor.size();i++)
{
nEl = vtFloor.at(i);
It it = m_mapFloorToItem.find(nEl);
if ( it == m_mapFloorToItem.end())//没有找到
{
nFloor++;
sText.Format(_T("第%d层 底标高:%d"),nFloor,vtFloor.at(i));
HTREEITEM hItem = m_wndFloorTree.InsertItem(sText,IMG_ITEM,IMG_ITEM,m_wndFloorTree.GetRootItem());
std::pair<int,HTREEITEM> pa(nEl,hItem);
m_mapFloorToItem.insert(pa);
m_wndFloorTree.SetCheck(hItem,TRUE);//显示
}
}
}
}
void CFloorMgrDlg::RefrushFloorInfo()
{
AcAxDocLock lock;
m_wndFloorTree.DeleteAllItems();
m_mapFloorToItem.clear();
m_mapIdToEl.clear();
HTREEITEM hRoot = m_wndFloorTree.InsertItem(g_sBuiding,IMG_ROOT,IMG_ROOT);
m_wndFloorTree.SetItemData(hRoot,1);
AcDbDatabase *pDb = acdbCurDwg();
if (pDb != NULL)
{
AcDbObjectId idLay;
AcDbObjectId idAxis = KTSetting::InitLayer(_T("LAY_AXIS"));
//提取所有的标高列表
ShowFloorElItems();
CString sText;
int nFloor = -1;
Acad::ErrorStatus es;
AcDbBlockTable* pTable = NULL;
if ( Acad::eOk == (es = pDb->getBlockTable(pTable,AcDb::kForRead) ) )
{
AcDbBlockTableRecord* pRecord = NULL;
if (Acad::eOk == (es = pTable->getAt(ACDB_MODEL_SPACE,pRecord,AcDb::kForRead)))
{
AcDbEntity* pEnt = NULL;
AcDbBlockTableRecordIterator* pIt = NULL;
pRecord->newIterator(pIt);
if (pIt != NULL)
{
for (pIt->start();!pIt->done();pIt->step())
{
if ( Acad::eOk == (es = pIt->getEntity(pEnt,AcDb::kForRead) ) )
{
//墙,梁,板,柱子,池底,素砼
AecDbXWall* pWall = AecDbXWall::cast(pEnt);
if (pWall != NULL)
{
InsertChildItem(hRoot,_T("墙体"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbColumn* pCol = AecDbColumn::cast(pEnt);
if (pCol != NULL)
{
InsertChildItem(hRoot,_T("柱子"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbBeam* pBeam = AecDbBeam::cast(pEnt);
if (pBeam != NULL)
{
InsertChildItem(hRoot,_T("梁"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbXSlab* pSlab = AecDbXSlab::cast(pEnt);
if (pSlab != NULL)
{
InsertChildItem(hRoot,_T("板"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbClimbStair* pCStair = AecDbClimbStair::cast(pEnt);
if (pCStair != NULL)
{
InsertChildItem(hRoot,_T("圆护梯"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbLineStair* pLStair = AecDbLineStair::cast(pEnt);
if (pLStair != NULL)
{
InsertChildItem(hRoot,_T("直梯"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbGuardBar* pBar = AecDbGuardBar::cast(pEnt);
if (pBar != NULL)
{
InsertChildItem(hRoot,_T("护栏"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbX3dPartEntity* pPart = AecDbX3dPartEntity::cast(pEnt);
if (pPart != NULL)
{
InsertChildItem(hRoot,_T("部件"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbEwPipe* pPipe = AecDbEwPipe::cast(pEnt);
if (pPipe != NULL)
{
InsertChildItem(hRoot,_T("管子"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEnt);
if (pFit != NULL)
{
InsertChildItem(hRoot,_T("管件"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AecDbEwEquipment* pEqu = AecDbEwEquipment::cast(pEnt);
if (pEqu != NULL)
{
InsertChildItem(hRoot,_T("设备"),pEnt->objectId().asOldId(),pEnt->visibility());
}
AcDbLine* pLn = AcDbLine::cast(pEnt);
if (pLn != NULL)
{
idLay = pEnt->layerId();
if (idLay == idAxis)
{
InsertChildItem(hRoot,_T("轴网"),pEnt->objectId().asOldId(),pEnt->visibility());
}
}
//其他各种沟渠待补充...
pEnt->close();
}
}
delete pIt;
}
pRecord->close();
}
pTable->close();
}
}
m_wndFloorTree.SelectItem(hRoot);
m_wndFloorTree.Expand(hRoot,TVE_EXPAND);
}
void CFloorMgrDlg::ModifyItem(HTREEITEM hItem)
{
}
void CFloorMgrDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point,ptcursor;
::GetCursorPos(&point);
ptcursor = point;
m_wndFloorTree.ScreenToClient(&point);
UINT uFlags = 0;
HTREEITEM hItem = m_wndFloorTree.HitTest(point, &uFlags), hP(NULL);
if (hItem != NULL)
{
if (uFlags == TVHT_ONITEMSTATEICON) // check框
{
DWORD_PTR nXData = m_wndFloorTree.GetItemData(hItem);
//if (nXData == 0)
{
PostMessage(WM_SHOWORHIDEFLOOR,(WPARAM)hItem,0);
}
}
}
*pResult = 0;
}
LRESULT CFloorMgrDlg::OnShowOrHideFloor(WPARAM wp,LPARAM lp)
{
AcAxDocLock lock;
HTREEITEM hItem = (HTREEITEM)wp;
if (hItem != NULL)
{
DWORD_PTR dXData = m_wndFloorTree.GetItemData(hItem);
AcDbObjectId id;
#ifdef _WIN64
id.setFromOldId((Adesk::IntDbId)dXData);
#else
id.setFromOldId((long)dXData);
#endif
BOOL bCheck = FALSE;
m_wndFloorTree.GetCheck(hItem);
bCheck = m_wndFloorTree.GetCheck(hItem);
if (dXData == 0)
{
//有可能点在类别上
ShowOrHideFloor(hItem,bCheck);
}
else
{
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)))
{
pEnt->setVisibility(bCheck ? AcDb::kVisible : AcDb::kInvisible);
pEnt->close();
}
}
}
acedPostCommand(_T("regen "));
return 0L;
}
void CFloorMgrDlg::ShowOrHideFloor(HTREEITEM hFloor,BOOL bShowOrHide)
{
AcDbObjectId id;
AcDbEntity* pEnt = NULL;
Acad::ErrorStatus es;
HTREEITEM hChild = m_wndFloorTree.GetChildItem(hFloor);
while(hChild != NULL)
{
m_wndFloorTree.SetCheck(hChild,bShowOrHide);
DWORD_PTR dXData = m_wndFloorTree.GetItemData(hChild);
#ifdef _WIN64
id.setFromOldId((Adesk::IntDbId)dXData);
#else
id.setFromOldId((long)dXData);
#endif
if (dXData == 0)
{
ShowOrHideFloor(hChild,bShowOrHide);
}
else
{
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)))
{
pEnt->setVisibility(bShowOrHide ? AcDb::kVisible : AcDb::kInvisible);
pEnt->close();
}
}
hChild = m_wndFloorTree.GetNextSiblingItem(hChild);
}
}
void CFloorMgrDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (::IsWindow(m_wndFloorTree.m_hWnd))
{
CRect rc;
GetClientRect(&rc);
rc.DeflateRect(7,7,7,7);
m_wndFloorTree.MoveWindow(rc);
}
}
void CFloorMgrDlg::OnNMRClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point,ptcursor;
::GetCursorPos(&point);
ptcursor = point;
m_wndFloorTree.ScreenToClient(&point);
CMenu menu;
UINT uFlags;
HTREEITEM hItem = m_wndFloorTree.HitTest(point,&uFlags);
if(hItem != NULL)
{
m_wndFloorTree.SelectItem(hItem);
CAcModuleResourceOverride myResources;
menu.CreatePopupMenu();
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_REFRUSH, _T("刷新(&R)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_MODIFY, _T("修改(&M)"));
int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, ptcursor.x, ptcursor.y,&m_wndFloorTree);
switch(nID)
{
case ID_REFRUSH:
{
RefrushFloorInfo();
break;
}
case ID_MODIFY:
{
ModifyItem(hItem);
break;
}
default:
break;
}
}
else
{
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_REFRUSH, _T("刷新(&R)"));
int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, ptcursor.x, ptcursor.y,&m_wndFloorTree);
switch(nID)
{
case ID_REFRUSH:
{
RefrushFloorInfo();
break;
}
default:
break;
}
}
*pResult = 0;
}
BOOL CFloorMgrDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
case IDCLOSE:
{
ShowWindow(SW_HIDE);
return TRUE;
}
default:
break;
}
return CDialog::OnCommand(wParam, lParam);
}
void CFloorMgrDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HighLightEntity(pNMTreeView->itemOld.hItem, FALSE);
HighLightEntity(pNMTreeView->itemNew.hItem, TRUE);
*pResult = 0;
}
void CFloorMgrDlg::HighLightEntity(HTREEITEM hItem, BOOL bHighLight/* = TRUE*/)
{
#ifndef _WIN64
DWORD dwData;
#else
DWORD_PTR dwData;
#endif
AcDbObjectId idObj;
while (hItem != NULL && hItem != TVI_ROOT)
{
dwData = m_wndFloorTree.GetItemData(hItem);
hItem = m_wndFloorTree.GetParentItem(hItem);
#ifdef _WIN64
idObj.setFromOldId((Adesk::IntDbId)dwData);
#else
idObj.setFromOldId(dwData);
#endif
if (idObj.isNull() || !idObj.isValid())
continue;
if (!CKTCadUtility::HighLightEntity(idObj, bHighLight,acDocManager->curDocument()))
continue;
break;
}
}
void CFloorMgrDlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
}