807 lines
20 KiB
C++
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;
|
|
}
|