1510 lines
35 KiB
C++
1510 lines
35 KiB
C++
#include "stdafx.h"
|
|
#include "StdArx.h"
|
|
#include "GJFCDlg.h"
|
|
#include "FloorNameDlg.h"
|
|
#include "FloorNamesDlg.h"
|
|
#include <vector>
|
|
#include "AecDbEwEquipment.h"
|
|
|
|
#ifndef IMG_FLOOR
|
|
#define IMG_FLOOR 0
|
|
#define IMG_CLASS 1
|
|
#define IMG_ENT 2
|
|
#endif
|
|
|
|
#ifndef ID_OBJLIST
|
|
#define ID_OBJLIST 341
|
|
#endif
|
|
|
|
#ifndef WM_ITEM_SEL
|
|
#define WM_ITEM_SEL (WM_USER+0x105)
|
|
#endif
|
|
|
|
#ifndef WM_PICKFIRSTMODIFIED
|
|
#define WM_PICKFIRSTMODIFIED (WM_USER+0x1008)
|
|
#endif
|
|
|
|
IMPLEMENT_DYNAMIC(CGJFCDlg, CDialog)
|
|
|
|
CGJFCDlg::CGJFCDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CGJFCDlg::IDD, pParent)
|
|
{
|
|
}
|
|
|
|
CGJFCDlg::~CGJFCDlg()
|
|
{
|
|
}
|
|
|
|
void CGJFCDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Control(pDX, IDC_STATIC_OBJLST, m_wndObjFrm);
|
|
DDX_Control(pDX, IDC_BUTTON3, m_wndBtNew);
|
|
DDX_Control(pDX, IDC_BUTTON4, m_wndBtDel);
|
|
DDX_Control(pDX, IDC_BUTTON6, m_wndBtRef);
|
|
DDX_Control(pDX, IDC_BUTTON7, m_wndBtHide);
|
|
DDX_Control(pDX, IDC_BUTTON8, m_wndBtShow);
|
|
DDX_Control(pDX, IDC_BUTTON1, m_wndBtAdd);
|
|
DDX_Control(pDX, IDC_BUTTON2, m_wndBtRemove);
|
|
DDX_Control(pDX, IDC_BUTTON5, m_wndButton7);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CGJFCDlg, CDialog)
|
|
ON_BN_CLICKED(IDC_BUTTON3, &CGJFCDlg::OnBnClickedButton3)
|
|
ON_MESSAGE(WM_ITEM_SEL,&CGJFCDlg::OnItemSelected)
|
|
ON_MESSAGE( WM_ACAD_KEEPFOCUS, &CGJFCDlg::onAcadKeepFocus )
|
|
ON_BN_CLICKED(IDC_BUTTON4, &CGJFCDlg::OnBnClickedButton4)
|
|
ON_BN_CLICKED(IDC_BUTTON6, &CGJFCDlg::OnBnClickedButton6)
|
|
ON_BN_CLICKED(IDC_BUTTON7, &CGJFCDlg::OnBnClickedButton7)
|
|
ON_BN_CLICKED(IDC_BUTTON8, &CGJFCDlg::OnBnClickedButton8)
|
|
ON_BN_CLICKED(IDC_BUTTON1, &CGJFCDlg::OnBnClickedButton1)
|
|
ON_BN_CLICKED(IDC_BUTTON2, &CGJFCDlg::OnBnClickedButton2)
|
|
ON_WM_SIZE()
|
|
ON_BN_CLICKED(IDC_BUTTON5, &CGJFCDlg::OnBnClickedButton5)
|
|
ON_MESSAGE(WM_PICKFIRSTMODIFIED,&CGJFCDlg::OnPickfirstModified)
|
|
ON_BN_CLICKED(IDC_BUTTON9, &CGJFCDlg::OnBnClickedButton9)
|
|
ON_BN_CLICKED(IDC_BUTTON10, &CGJFCDlg::OnBnClickedButton10)
|
|
ON_BN_CLICKED(IDC_BUTTON11, &CGJFCDlg::OnBnClickedButton11)
|
|
END_MESSAGE_MAP()
|
|
|
|
LONG_PTR CGJFCDlg::onAcadKeepFocus( UINT_PTR, LONG_PTR)
|
|
{
|
|
POINT pt;
|
|
::GetCursorPos(&pt);
|
|
CRect rect;
|
|
GetWindowRect(&rect);
|
|
if(!(rect.PtInRect(pt)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CGJFCDlg::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));
|
|
|
|
CRect rcFrameL;
|
|
m_wndObjFrm.GetWindowRect(rcFrameL);
|
|
ScreenToClient(rcFrameL);
|
|
m_wndObjFrm.ShowWindow(SW_HIDE);
|
|
|
|
m_wndObjList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP,CRect(0,0,0,0),this,ID_OBJLIST);
|
|
m_wndObjList.SetImageList(&m_imageList, LVSIL_SMALL);
|
|
m_wndObjList.SetImageSize(16,16);
|
|
m_wndObjList.SetDragStyle(FALSE);
|
|
m_wndObjList.SetEditStyle(FALSE);
|
|
m_wndObjList.SetExtendedStyle(0);
|
|
m_wndObjList.ModifyStyleEx(0,WS_EX_CLIENTEDGE);
|
|
m_wndObjList.SetExtendedStyle(LVS_EX_GRIDLINES);
|
|
if(m_wndObjList.GetSafeHwnd() != NULL)
|
|
{
|
|
m_wndObjList.MoveWindow(rcFrameL);
|
|
}
|
|
|
|
CBitmap bmp24;
|
|
if (!bmp24.LoadBitmap (IDB_BITMAP18))
|
|
{
|
|
AfxMessageBox(_T ("Can't load bitmap: IDB_BITMAP32"));
|
|
ASSERT (FALSE);
|
|
return FALSE;
|
|
}
|
|
|
|
BITMAP bmpObj24;
|
|
bmp24.GetBitmap (&bmpObj24);
|
|
m_Imagelist24.Create (24, bmpObj24.bmHeight, nFlags, 0, 0);
|
|
m_Imagelist24.Add (&bmp24, RGB (255, 0, 0));
|
|
|
|
m_wndBtNew.SetIcon(m_Imagelist24.ExtractIcon(0));
|
|
m_wndBtDel.SetIcon(m_Imagelist24.ExtractIcon(1));
|
|
m_wndBtRef.SetIcon(m_Imagelist24.ExtractIcon(2));
|
|
m_wndBtHide.SetIcon(m_Imagelist24.ExtractIcon(3));
|
|
m_wndBtShow.SetIcon(m_Imagelist24.ExtractIcon(4));
|
|
m_wndBtAdd.SetIcon(m_Imagelist24.ExtractIcon(5));
|
|
m_wndBtRemove.SetIcon(m_Imagelist24.ExtractIcon(6));
|
|
m_wndButton7.SetIcon(m_Imagelist24.ExtractIcon(7));
|
|
|
|
|
|
InitObjListColumn();
|
|
InitDxf2CnName();
|
|
|
|
UpdateData(FALSE);
|
|
|
|
GetWindowRect(&m_rcMain);
|
|
m_wndBtNew.GetWindowRect(&m_rcBt);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CGJFCDlg::InitDxf2CnName()
|
|
{
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBWALL"),_T("墙体"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBSLAB"),_T("板"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBCOLMN"),_T("柱"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBBEAM"),_T("梁"));
|
|
|
|
m_mapDXF2CnName.SetAt(_T("AEC_X3DPART"),_T("部件"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBASTAIR"),_T("弧梯"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBBOSSHOLDER"),_T("支墩"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_CLMSTAIR"),_T("圆护爬梯"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBEWFIT"),_T("管件"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_EWPIPE"),_T("管线"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBFLUME"),_T("集水槽"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_GUARDBAR"),_T("护栏"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBHANGER"),_T("吊架"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBHOLDER"),_T("支架"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBLSTAIR"),_T("直梯"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBOPENING"),_T("门窗"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBPARAEQUI"),_T("参数设备"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBWEQUIPMENT"),_T("设备"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_RIVERGROOVE"),_T("巴歇尔槽"));
|
|
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBDUCT"),_T("风管"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBHVACFIT"),_T("风管构件"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBCABTRY"),_T("桥架"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBECFIT"),_T("桥架构件"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_MULTIPARTENT"),_T("异构单体"));
|
|
}
|
|
|
|
void CGJFCDlg::InitObjListColumn()
|
|
{
|
|
LPCTSTR lpszCols[] = {_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
int lnColumns[] = {140,120,0,80,0};
|
|
|
|
LV_COLUMN lvColumn;
|
|
|
|
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
|
lvColumn.fmt = LVCFMT_LEFT;
|
|
lvColumn.cx = 120;
|
|
|
|
for(int i = 0; lpszCols[i]!=NULL; i++)
|
|
{
|
|
lvColumn.cx = lnColumns[i];
|
|
lvColumn.pszText = const_cast<LPTSTR>(lpszCols[i]);
|
|
m_wndObjList.InsertColumn(i,&lvColumn);
|
|
}
|
|
|
|
CList<int,int> listReadOnly;
|
|
listReadOnly.AddHead(0);
|
|
listReadOnly.AddHead(1);
|
|
listReadOnly.AddHead(2);
|
|
m_wndObjList.SetReadOnlyList(listReadOnly);
|
|
}
|
|
|
|
CString CGJFCDlg::GetCnEntName(CString& sDxf)
|
|
{
|
|
CString sName = _T("");
|
|
if ( m_mapDXF2CnName.Lookup(sDxf,sName))
|
|
{
|
|
return sName;
|
|
}
|
|
return sDxf;
|
|
}
|
|
|
|
LRESULT CGJFCDlg::OnPickfirstModified(WPARAM wp,LPARAM lp)
|
|
{
|
|
if (wp != NULL)
|
|
{
|
|
TCHAR szHandle[33];
|
|
_tcscpy(szHandle,(const TCHAR*)wp);
|
|
|
|
//查找
|
|
CTreeItem * pEntPos = NULL;
|
|
if (m_mapHandToItemPos.Lookup(szHandle,(void*&)pEntPos))
|
|
{
|
|
m_wndObjList.SelectNode(pEntPos);
|
|
}
|
|
}
|
|
return 0L;
|
|
}
|
|
|
|
LRESULT CGJFCDlg::OnItemSelected(WPARAM wp,LPARAM lp)
|
|
{
|
|
CPoint* pptPos = (CPoint*)lp;
|
|
int nSel = (int)pptPos->x;
|
|
int nSubItem = (int)pptPos->y;
|
|
|
|
CString sHandle;
|
|
|
|
CTreeItem* pItem = m_wndObjList.GetTreeItem(nSel);
|
|
if (pItem != NULL)
|
|
{
|
|
CItemInfo* pInf = m_wndObjList.GetData(pItem);
|
|
if (pInf != NULL)
|
|
{
|
|
sHandle = pInf->GetSubItem(1);
|
|
if (sHandle.IsEmpty())
|
|
{
|
|
//AfxMessageBox(_T("当前选择不是构件对象!"));
|
|
return 0L;
|
|
}
|
|
|
|
AcAxDocLock lock;
|
|
CString sNo,sDxf;
|
|
AcDbHandle hd((const TCHAR*)sHandle);
|
|
AcDbObjectId id;
|
|
|
|
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
|
|
{
|
|
//按照编号找到对应的实体,加亮选择
|
|
AcDbEntity* pEnt = NULL;
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
|
|
}
|
|
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
|
|
}
|
|
|
|
pEnt->close();
|
|
}
|
|
|
|
//选择当前
|
|
if ( !sNo.IsEmpty() && !sDxf.IsEmpty() )
|
|
{
|
|
ads_name ss,ent;
|
|
struct resbuf* pRb = acutBuildList(RTDXF0, sDxf, 0);
|
|
if (pRb != NULL)
|
|
{
|
|
acedSSGet(_T("A"),NULL,NULL,pRb,ss);
|
|
acutRelRb(pRb);
|
|
|
|
Adesk::Int32 nLen = 0;
|
|
acedSSLength(ss,&nLen);
|
|
|
|
CString sNo2;
|
|
AcDbObjectId idT;
|
|
AcDbEntity* pEntT = NULL;
|
|
BOOL bFind = FALSE;
|
|
|
|
for (int i = 0;i < nLen;i++)
|
|
{
|
|
acedSSName(ss,i,ent);
|
|
acdbGetObjectId(idT,ent);
|
|
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,idT,AcDb::kForRead))
|
|
{
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntT);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo2);
|
|
}
|
|
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntT);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo2);
|
|
}
|
|
pEntT->close();
|
|
}
|
|
|
|
if (sNo2.CompareNoCase(sNo) == 0)
|
|
{
|
|
bFind = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
acedSSFree(ss);
|
|
|
|
UnColorLightThisPick();
|
|
|
|
if (bFind)
|
|
{
|
|
//加入选择集
|
|
ads_name ssPick;
|
|
acdbGetAdsName(ent, idT);
|
|
acedSSAdd(ent, NULL, ssPick);
|
|
|
|
acedSSSetFirst(ssPick, ssPick);
|
|
acedSSFree(ssPick);
|
|
|
|
m_arLastPick.append(idT);
|
|
ColorLightThisPick();
|
|
|
|
acedUpdateDisplay();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return 0L;
|
|
}
|
|
|
|
void CGJFCDlg::UnColorLightThisPick()
|
|
{
|
|
AcDbObjectId idT;
|
|
AcDbEntity* pEntT = NULL;
|
|
for (int i = 0;i < m_arLastPick.length();i++)
|
|
{
|
|
idT = m_arLastPick.at(i);
|
|
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,idT,AcDb::kForWrite))
|
|
{
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntT);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pEntBase->SetActive(false);
|
|
}
|
|
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntT);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pCurBase->SetActive(false);
|
|
}
|
|
pEntT->close();
|
|
}
|
|
}
|
|
m_arLastPick.removeAll();
|
|
}
|
|
|
|
void CGJFCDlg::ColorLightThisPick()
|
|
{
|
|
AcDbObjectId idT;
|
|
AcDbEntity* pEntT = NULL;
|
|
for (int i = 0;i < m_arLastPick.length();i++)
|
|
{
|
|
idT = m_arLastPick.at(i);
|
|
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,idT,AcDb::kForWrite))
|
|
{
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntT);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pEntBase->SetActive(true);
|
|
}
|
|
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntT);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pCurBase->SetActive(true);
|
|
}
|
|
pEntT->close();
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL CGJFCDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDCLOSE:
|
|
return TRUE;
|
|
default:
|
|
break;
|
|
}
|
|
return CDialog::OnCommand(wParam, lParam);
|
|
}
|
|
|
|
//新建层
|
|
void CGJFCDlg::OnBnClickedButton3()
|
|
{
|
|
CAcModuleResourceOverride myResources;
|
|
CFloorNameDlg dlg;
|
|
dlg.SetNameMap(m_mapNameToRoot);
|
|
if (IDOK == dlg.DoModal() )
|
|
{
|
|
CString sName;
|
|
sName.Format(_T("%s-%g"),dlg.m_sName,dlg.m_dBomEl);
|
|
|
|
CTreeItem * pRoot = NULL;
|
|
if (!m_mapNameToRoot.Lookup(sName,(void*&)pRoot) )
|
|
{
|
|
//建立层
|
|
CTreeItem* pRoot = NULL;
|
|
CItemInfo* lpRoot = new CItemInfo();
|
|
lpRoot->SetImage(IMG_FLOOR);
|
|
|
|
//{_T("名称"),_T("编号"),_T("句柄"),0};
|
|
lpRoot->SetItemText(sName);
|
|
lpRoot->AddSubItemText("");
|
|
lpRoot->AddSubItemText("");
|
|
lpRoot->AddSubItemText("");
|
|
pRoot = m_wndObjList.InsertRootItem(lpRoot);
|
|
m_mapNameToRoot.SetAt(sName,pRoot);
|
|
m_wndObjList.SelectNode(pRoot);
|
|
|
|
int nScroll = 0;
|
|
m_wndObjList.ExpandAll(pRoot,nScroll);
|
|
|
|
//写入当前空间扩展数据
|
|
AcDbDatabase* pDb = acdbCurDwg();
|
|
if (pDb != NULL)
|
|
{
|
|
AcAxDocLock lock;
|
|
AcDbObjectId idSpace = pDb->currentSpaceId();
|
|
AecDbObjXDataMap xData;
|
|
xData.SetAt(KEY_NAME,sName);
|
|
xData.SetAt(PIPE_EL,dlg.m_dBomEl);
|
|
xData.Write(idSpace,sName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//删除层
|
|
void CGJFCDlg::OnBnClickedButton4()
|
|
{
|
|
AcAxDocLock lock;
|
|
AcDbObjectId id;
|
|
CString sHandle;
|
|
|
|
//{_T("名称"),_T("编号"),_T("句柄"),0};
|
|
int nSel = m_wndObjList.GetSelectedItem();
|
|
if (nSel != -1)
|
|
{
|
|
CTreeItem* pItem = m_wndObjList.GetTreeItem(nSel);
|
|
if (pItem != NULL)
|
|
{
|
|
CStringArray arDxfs;
|
|
GetChildDxfs(pItem,arDxfs);
|
|
|
|
CItemInfo* pInf = m_wndObjList.GetData(pItem);
|
|
if (pInf != NULL)
|
|
{
|
|
CString sFloor;
|
|
int nImage = pInf->GetImage();
|
|
sFloor = pInf->GetItemText();
|
|
|
|
if ( nImage == IMG_FLOOR )//是FLOOR层
|
|
{
|
|
CString sTip;
|
|
sTip.Format(_T("删除为永久删除!确认要删除[%s]层吗?"),sFloor);
|
|
int nRes = AfxMessageBox(sTip,MB_YESNO);
|
|
if (nRes == IDYES)
|
|
{
|
|
AcDbDatabase* pDb = acdbCurDwg();
|
|
AcDbObjectId idSpace = pDb->currentSpaceId();
|
|
AcDbObject* pObj = NULL;
|
|
if (Acad::eOk == acdbOpenObject(pObj,idSpace,AcDb::kForWrite))
|
|
{
|
|
struct resbuf* pTmp = acutNewRb(AcDb::kDxfRegAppName);
|
|
acutNewString(sFloor,pTmp->resval.rstring);
|
|
pObj->setXData(pTmp);
|
|
acutRelRb(pTmp);
|
|
pObj->close();
|
|
|
|
CString sDxf,sFName;
|
|
for (int i = 0;i < arDxfs.GetSize();i++)
|
|
{
|
|
sDxf = arDxfs.GetAt(i);
|
|
|
|
sFName = sFloor;
|
|
sFName += _T("-");
|
|
sFName += sDxf;
|
|
m_mapNameToRoot.RemoveKey(sFName);
|
|
}
|
|
|
|
//删除节点
|
|
m_wndObjList.DeleteItemEx(pItem,nSel);
|
|
m_mapNameToRoot.RemoveKey(sFloor);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AfxMessageBox(_T("选择的项不是层节点,不可删除!"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool CGJFCDlg::GetChildIds(CTreeItem* pChild,AcDbObjectIdArray& arIds,CMapStringToPtr* pmapHandToItem)
|
|
{
|
|
AcDbObjectId id;
|
|
CString sHandle,sName;
|
|
POSITION ps = NULL;
|
|
int nCount = 0;
|
|
|
|
ps = m_wndObjList.GetHeadPosition(pChild);
|
|
CTreeItem* pEntItem = NULL;
|
|
while( ps != NULL)
|
|
{
|
|
pEntItem = m_wndObjList.GetNextChild(pChild,ps);
|
|
|
|
//墙体
|
|
//{_T("名称"),_T("编号"),_T("句柄"),0};
|
|
|
|
CItemInfo* pInf = m_wndObjList.GetData(pEntItem);
|
|
if (pInf != NULL)
|
|
{
|
|
sHandle = pInf->GetSubItem(1);
|
|
|
|
if (!sHandle.IsEmpty())
|
|
{
|
|
AcDbHandle hd((const TCHAR*)sHandle);
|
|
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
|
|
{
|
|
if (pmapHandToItem != NULL)
|
|
{
|
|
pmapHandToItem->SetAt(sHandle,pEntItem);
|
|
}
|
|
arIds.append(id);
|
|
nCount++;
|
|
}
|
|
}
|
|
}
|
|
if (pEntItem != NULL)
|
|
{
|
|
GetChildIds(pEntItem,arIds,pmapHandToItem);
|
|
}
|
|
}
|
|
return nCount > 0 ? true : false;
|
|
}
|
|
|
|
bool CGJFCDlg::GetChildDxfs(CTreeItem* pChild,CStringArray& arDxfs)
|
|
{
|
|
AcDbObjectId id;
|
|
CString sHandle,sName;
|
|
POSITION ps = NULL;
|
|
int nCount = 0;
|
|
|
|
ps = m_wndObjList.GetHeadPosition(pChild);
|
|
CTreeItem* pEntItem = NULL;
|
|
while( ps != NULL)
|
|
{
|
|
pEntItem = m_wndObjList.GetNextChild(pChild,ps);
|
|
|
|
//墙体
|
|
//{_T("名称"),_T("编号"),_T("句柄"),0};
|
|
|
|
CItemInfo* pInf = m_wndObjList.GetData(pEntItem);
|
|
if (pInf != NULL)
|
|
{
|
|
sHandle = pInf->GetSubItem(1);
|
|
if (pInf->GetImage() == IMG_CLASS)
|
|
{
|
|
arDxfs.Add(sHandle);
|
|
}
|
|
}
|
|
if (pEntItem != NULL)
|
|
{
|
|
GetChildDxfs(pEntItem,arDxfs);
|
|
}
|
|
}
|
|
return nCount > 0 ? true : false;
|
|
}
|
|
|
|
bool SorFloorMap(AecDbObjXDataMap*& pFr1,AecDbObjXDataMap*& pFr2)
|
|
{
|
|
if (pFr1 != NULL && pFr2 != NULL)
|
|
{
|
|
double dEl1 = 0.0,dEl2 = 0.0;
|
|
pFr1->GetAt(PIPE_EL,dEl1);
|
|
pFr2->GetAt(PIPE_EL,dEl2);
|
|
|
|
if (dEl1 < dEl2 )
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//刷新
|
|
void CGJFCDlg::OnBnClickedButton6()
|
|
{
|
|
m_wndObjList.DeleteAll();
|
|
m_mapNameToRoot.RemoveAll();
|
|
m_mapHandToItemPos.RemoveAll();
|
|
|
|
AcAxDocLock lock;
|
|
AcDbDatabase* pDb = acdbCurDwg();
|
|
if (pDb != NULL)
|
|
{
|
|
CStringArray arNames;
|
|
AcDbRegAppTable* pTbl = NULL;
|
|
if ( Acad::eOk == pDb->getRegAppTable(pTbl,AcDb::kForRead) )
|
|
{
|
|
AcDbRegAppTableIterator* pIt = NULL;
|
|
pTbl->newIterator(pIt);
|
|
|
|
if (pIt != NULL)
|
|
{
|
|
LPCTSTR pszName = NULL;
|
|
AcDbRegAppTableRecord* pRec = NULL;
|
|
for(pIt->start();!pIt->done();pIt->step())
|
|
{
|
|
if ( Acad::eOk == pIt->getRecord(pRec,AcDb::kForRead) )
|
|
{
|
|
pRec->getName(pszName);
|
|
arNames.Add(pszName);
|
|
pRec->close();
|
|
}
|
|
}
|
|
delete pIt;
|
|
}
|
|
pTbl->close();
|
|
}
|
|
|
|
AcDbObjectId idSpace = pDb->currentSpaceId();
|
|
std::vector<AecDbObjXDataMap*> vtXDataPtrs;
|
|
AecDbObjXDataMap* pXData = NULL;
|
|
CString sApp,sTemp;
|
|
for(int i = 0;i < arNames.GetSize();i++)
|
|
{
|
|
sApp = arNames.GetAt(i);
|
|
|
|
double dEl = 0.0;
|
|
pXData = new AecDbObjXDataMap;
|
|
if ( pXData->Read(idSpace,sApp) )
|
|
{
|
|
if (!pXData->GetAt(KEY_NAME,sTemp))
|
|
{
|
|
pXData->SetAt(KEY_NAME,sApp);
|
|
}
|
|
vtXDataPtrs.push_back(pXData);
|
|
}
|
|
else
|
|
{
|
|
delete pXData;
|
|
}
|
|
}
|
|
|
|
if (!vtXDataPtrs.empty())
|
|
{
|
|
std::sort(vtXDataPtrs.begin(),vtXDataPtrs.end(),SorFloorMap);
|
|
|
|
//建立层
|
|
CString sName,sNameAll;
|
|
double dEl = 0.0;
|
|
|
|
typedef std::vector<AecDbObjXDataMap*>::iterator ITT;
|
|
for (ITT it = vtXDataPtrs.begin();it != vtXDataPtrs.end();it++)
|
|
{
|
|
AecDbObjXDataMap* pXData = (*it);
|
|
|
|
pXData->GetAt(KEY_NAME,sName);
|
|
pXData->GetAt(PIPE_EL,dEl);
|
|
sNameAll = sName;
|
|
|
|
CTreeItem* pRoot = NULL;
|
|
CItemInfo* lpRoot = new CItemInfo();
|
|
lpRoot->SetImage(IMG_FLOOR);
|
|
|
|
//{_T("名称"),_T("编号"),_T("句柄"),0};
|
|
lpRoot->SetItemText(sNameAll);
|
|
lpRoot->AddSubItemText("");
|
|
lpRoot->AddSubItemText("");
|
|
lpRoot->AddSubItemText("");
|
|
pRoot = m_wndObjList.InsertRootItem(lpRoot);
|
|
m_mapNameToRoot.SetAt(sNameAll,pRoot);
|
|
|
|
CreateChildItem(pXData);
|
|
|
|
int nScroll = 0;
|
|
m_wndObjList.ExpandAll(pRoot,nScroll);
|
|
|
|
delete pXData;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CGJFCDlg::CreateChildItem(AecDbObjXDataMap* pXData)
|
|
{
|
|
if (pXData == NULL)
|
|
return;
|
|
|
|
CString sName;
|
|
double dEl = 0.0;
|
|
|
|
pXData->GetAt(KEY_NAME,sName);
|
|
pXData->GetAt(PIPE_E,dEl);
|
|
CString sNameAll = sName;
|
|
|
|
AcAxDocLock lock;
|
|
CTreeItem * pRoot = NULL;
|
|
if (m_mapNameToRoot.Lookup(sNameAll,(void*&)pRoot) )
|
|
{
|
|
//DXF_HANDLE-HANDLE映射
|
|
CString sKey,sHandle,sDxf,sEntName,sNo;
|
|
AcDbObjectId id;
|
|
AecXData cVal;
|
|
memset(&cVal,0,sizeof(AecXData));
|
|
|
|
AecDbObjXDataMap::It it = pXData->Begin();
|
|
AecDbObjXDataMap::It end = pXData->End();
|
|
|
|
for (; it != end; )
|
|
{
|
|
if (!pXData->GetNext(it, sKey, cVal)) break;
|
|
if (cVal.nVt == VT_BSTR)
|
|
{
|
|
sHandle = cVal.pszVal;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
|
|
CItemInfo* lpItem = NULL;
|
|
CItemInfo* lpParent= NULL;
|
|
CTreeItem * pParent = NULL;
|
|
CTreeItem * pEntPos = NULL;
|
|
AecDbObjXDataMap* pXDataMap = NULL;
|
|
|
|
//分类
|
|
AcDbHandle hd((const TCHAR*)sHandle);
|
|
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
|
|
pXDataMap = NULL;
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pXDataMap = pEntBase->GetSpecialtyData(AcDb::kForRead);
|
|
}
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pXDataMap = pCurBase->GetSpecialtyData(AcDb::kForRead);
|
|
}
|
|
|
|
AcDb::Visibility vs = pEnt->visibility();
|
|
CString sVis = ( vs == AcDb::kVisible ) ? _T("显示") : _T("隐藏");
|
|
|
|
if (pXDataMap != NULL)
|
|
{
|
|
CString sFloorDxf = sNameAll;
|
|
sFloorDxf += _T("-");
|
|
sFloorDxf += sDxf;
|
|
|
|
//分类名称
|
|
sEntName = _T("");
|
|
pXDataMap->GetAt(KEY_NAME,sEntName);
|
|
if (sEntName.IsEmpty())
|
|
{
|
|
sEntName = GetCnEntName(sDxf);
|
|
}
|
|
|
|
if (m_mapNameToRoot.Lookup(sFloorDxf,(void*&)pParent) )//找到层的分类
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),0};
|
|
lpParent = m_wndObjList.GetData(pParent);
|
|
sEntName = lpParent->GetItemText();
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
|
|
lpParent = new CItemInfo();
|
|
lpParent->SetItemText(sEntName);
|
|
lpParent->SetImage(IMG_ENT);
|
|
lpParent->AddSubItemText(sNo);
|
|
lpParent->AddSubItemText(sHandle);
|
|
lpParent->AddSubItemText(sVis);
|
|
pEntPos = m_wndObjList.InsertItem(pParent,lpParent);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
else
|
|
{
|
|
lpParent = new CItemInfo();
|
|
lpParent->SetItemText(sEntName);
|
|
lpParent->SetImage(IMG_CLASS);
|
|
lpParent->AddSubItemText(_T(""));//no
|
|
lpParent->AddSubItemText(sDxf);//handle
|
|
lpParent->AddSubItemText(_T(""));//vs
|
|
pParent = m_wndObjList.InsertItem(pRoot,lpParent);
|
|
m_mapNameToRoot.SetAt(sFloorDxf,pParent);
|
|
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
lpParent = new CItemInfo();
|
|
lpParent->SetItemText(sEntName);
|
|
lpParent->SetImage(IMG_ENT);
|
|
lpParent->AddSubItemText(sNo);
|
|
lpParent->AddSubItemText(sHandle);
|
|
lpParent->AddSubItemText(sVis);
|
|
pEntPos = m_wndObjList.InsertItem(pParent,lpParent);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
|
|
int nScroll = 0;
|
|
m_wndObjList.ExpandAll(pRoot,nScroll);
|
|
}
|
|
}
|
|
|
|
//隐藏层
|
|
void CGJFCDlg::OnBnClickedButton7()
|
|
{
|
|
//隐藏
|
|
int nSel = m_wndObjList.GetSelectedItem();
|
|
if (nSel != -1)
|
|
{
|
|
CMapStringToPtr mapHandToItem;
|
|
CTreeItem* pItem = m_wndObjList.GetTreeItem(nSel);
|
|
if (pItem != NULL)
|
|
{
|
|
AcDbObjectIdArray arIds;
|
|
CItemInfo* pInf = m_wndObjList.GetData(pItem);
|
|
if (pInf != NULL)
|
|
{
|
|
CString sHandle = pInf->GetSubItem(1);
|
|
|
|
if (!sHandle.IsEmpty())
|
|
{
|
|
AcDbObjectId id;
|
|
AcDbHandle hd((const TCHAR*)sHandle);
|
|
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
|
|
{
|
|
mapHandToItem.SetAt(sHandle,pItem);
|
|
arIds.append(id);
|
|
}
|
|
}
|
|
}
|
|
|
|
GetChildIds(pItem,arIds,&mapHandToItem);
|
|
|
|
AcAxDocLock lock;
|
|
AcDbEntity* pEnt = NULL;
|
|
pItem = NULL;
|
|
Acad::ErrorStatus es;
|
|
for (int i = 0;i < arIds.length();i++)
|
|
{
|
|
if (Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,arIds.at(i),AcDb::kForWrite)))
|
|
{
|
|
pEnt->setVisibility(AcDb::kInvisible);
|
|
|
|
TCHAR szHandle[33];
|
|
memset(szHandle,0,sizeof(TCHAR) * 33);
|
|
arIds.at(i).handle().getIntoAsciiBuffer(szHandle);
|
|
|
|
if ( mapHandToItem.Lookup(szHandle,(void*&)pItem) )
|
|
{
|
|
CItemInfo* pInf = m_wndObjList.GetData(pItem);
|
|
if (pInf != NULL)
|
|
{
|
|
pInf->SetSubItemText(2,_T("隐藏"));
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedPostCommand(_T("regen "));
|
|
}
|
|
}
|
|
}
|
|
|
|
//显示
|
|
void CGJFCDlg::OnBnClickedButton8()
|
|
{
|
|
int nSel = m_wndObjList.GetSelectedItem();
|
|
if (nSel != -1)
|
|
{
|
|
CTreeItem* pItem = m_wndObjList.GetTreeItem(nSel);
|
|
if (pItem != NULL)
|
|
{
|
|
AcDbObjectIdArray arIds;
|
|
CMapStringToPtr mapHandToItem;
|
|
|
|
CItemInfo* pInf = m_wndObjList.GetData(pItem);
|
|
if (pInf != NULL)
|
|
{
|
|
CString sHandle = pInf->GetSubItem(1);
|
|
|
|
if (!sHandle.IsEmpty())
|
|
{
|
|
AcDbObjectId id;
|
|
AcDbHandle hd((const TCHAR*)sHandle);
|
|
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
|
|
{
|
|
mapHandToItem.SetAt(sHandle,pItem);
|
|
arIds.append(id);
|
|
}
|
|
}
|
|
}
|
|
|
|
GetChildIds(pItem,arIds,&mapHandToItem);
|
|
|
|
AcAxDocLock lock;
|
|
AcDbEntity* pEnt = NULL;
|
|
for (int i = 0;i < arIds.length();i++)
|
|
{
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,arIds.at(i),AcDb::kForWrite))
|
|
{
|
|
pEnt->setVisibility(AcDb::kVisible);
|
|
|
|
TCHAR szHandle[33];
|
|
memset(szHandle,0,sizeof(TCHAR) * 33);
|
|
arIds.at(i).handle().getIntoAsciiBuffer(szHandle);
|
|
|
|
if ( mapHandToItem.Lookup(szHandle,(void*&)pItem) )
|
|
{
|
|
CItemInfo* pInf = m_wndObjList.GetData(pItem);
|
|
if (pInf != NULL)
|
|
{
|
|
pInf->SetSubItemText(2,_T("显示"));
|
|
}
|
|
}
|
|
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedPostCommand(_T("regen "));
|
|
}
|
|
}
|
|
}
|
|
|
|
//添加构件
|
|
void CGJFCDlg::OnBnClickedButton1()
|
|
{
|
|
int nSel = m_wndObjList.GetSelectedItem();
|
|
//获取所在的层
|
|
if (nSel == -1)
|
|
{
|
|
AfxMessageBox(_T("请先选择目标分层!"));
|
|
return;
|
|
}
|
|
|
|
CTreeItem * pRoot = NULL;
|
|
pRoot = GetRootItem(nSel);
|
|
m_wndObjList.Collapse(pRoot);
|
|
|
|
//获取所在的层
|
|
CString sFloor;
|
|
CItemInfo* pRootItem = m_wndObjList.GetData(pRoot);
|
|
sFloor = pRootItem->GetItemText();
|
|
|
|
//层名 底标高:0
|
|
CString sLayName = sFloor;
|
|
|
|
ShowWindow(SW_HIDE);
|
|
|
|
AcAxDocLock lock;
|
|
struct resbuf* pRb = acutBuildList(RTDXF0, _T("AEC_*"), 0);
|
|
ads_name ss,ent;
|
|
|
|
//LPCTSTR pszMsg[] = {_T("\n请选择要提提资的构件:"), _T("")};
|
|
int nRes = acedSSGet(NULL,NULL,NULL,pRb,ss);
|
|
acutRelRb(pRb);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcDbObjectId id;
|
|
CString sDxf,sName,sEntName,sHandle,sNo,sKey;
|
|
|
|
Adesk::Int32 nLen = 0;
|
|
acedSSLength(ss,&nLen);
|
|
|
|
AecDbObjXDataMap* pXDataMap = NULL;
|
|
|
|
AecDbObjXDataMap xDataLayMap;
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
xDataLayMap.Read(idSpace,sLayName);
|
|
|
|
//DXF_HANDLE-HANDLE映射
|
|
|
|
CItemInfo* lpItem = NULL;
|
|
CItemInfo* lpParent= NULL;
|
|
CTreeItem * pParent = NULL;
|
|
CTreeItem * pEntPos = NULL;
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
|
|
for (int i = 0;i < nLen;i++)
|
|
{
|
|
acedSSName(ss,i,ent);
|
|
acdbGetObjectId(id,ent);
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
|
|
pXDataMap = NULL;
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pXDataMap = pEntBase->GetSpecialtyData(AcDb::kForRead);
|
|
}
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pXDataMap = pCurBase->GetSpecialtyData(AcDb::kForRead);
|
|
}
|
|
|
|
if (pXDataMap != NULL)
|
|
{
|
|
CString sFloorDxf = sFloor;
|
|
sFloorDxf += _T("-");
|
|
sFloorDxf += sDxf;
|
|
|
|
//分类名称
|
|
sEntName = _T("");
|
|
pXDataMap->GetAt(KEY_NAME,sEntName);
|
|
if (sEntName.IsEmpty())
|
|
{
|
|
sEntName = GetCnEntName(sDxf);
|
|
}
|
|
|
|
TCHAR szHanele[33];
|
|
memset(szHanele,0,sizeof(TCHAR) * 33);
|
|
id.handle().getIntoAsciiBuffer(szHanele);
|
|
sHandle = szHanele;
|
|
sKey = sHandle;
|
|
|
|
int nVt = -1;
|
|
if (xDataLayMap.HasKey(sKey,nVt))
|
|
{
|
|
//已经添加了此实体
|
|
pEnt->close();
|
|
acutPrintf(_T("\n选择实体已经在分层中!"));
|
|
continue;
|
|
}
|
|
|
|
xDataLayMap.SetAt(sKey,sHandle);
|
|
|
|
if ( m_mapNameToRoot.Lookup(sFloorDxf,(void*&)pParent) )//找到
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),0};
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
|
|
lpParent = new CItemInfo();
|
|
lpParent->SetItemText(sEntName);
|
|
lpParent->SetImage(IMG_ENT);
|
|
lpParent->AddSubItemText(sNo);
|
|
lpParent->AddSubItemText(sHandle);
|
|
pEntPos = m_wndObjList.InsertItem(pParent,lpParent);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
else
|
|
{
|
|
lpParent = new CItemInfo();
|
|
lpParent->SetItemText(sEntName);
|
|
lpParent->SetImage(IMG_CLASS);
|
|
lpParent->AddSubItemText(_T(""));
|
|
lpParent->AddSubItemText(sDxf);
|
|
lpParent->AddSubItemText(_T(""));
|
|
pParent = m_wndObjList.InsertItem(pRoot,lpParent);
|
|
|
|
m_mapNameToRoot.SetAt(sFloorDxf,pParent);
|
|
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
lpParent = new CItemInfo();
|
|
lpParent->SetItemText(sEntName);
|
|
lpParent->SetImage(IMG_ENT);
|
|
lpParent->AddSubItemText(sNo);
|
|
lpParent->AddSubItemText(sHandle);
|
|
pEntPos = m_wndObjList.InsertItem(pParent,lpParent);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedSSFree(ss);
|
|
|
|
int nScroll = 0;
|
|
m_wndObjList.ExpandAll(pRoot,nScroll);
|
|
|
|
ShowWindow(SW_SHOW);
|
|
|
|
xDataLayMap.Write(idSpace,sLayName);
|
|
}
|
|
}
|
|
|
|
CTreeItem* CGJFCDlg::GetRootItem(int nSel)
|
|
{
|
|
if (nSel == -1)
|
|
return NULL;
|
|
|
|
CTreeItem * pRoot = NULL;
|
|
CTreeItem * pRootT = NULL;
|
|
|
|
pRootT = m_wndObjList.GetTreeItem(nSel);
|
|
pRoot = pRootT;
|
|
|
|
CItemInfo* pRootItem = m_wndObjList.GetData(pRootT);
|
|
CString sFloor = pRootItem->GetItemText();
|
|
|
|
if ( !m_mapNameToRoot.Lookup(sFloor,(void*&)pRoot) )
|
|
{
|
|
while(pRoot != NULL)
|
|
{
|
|
pRootT = pRoot;
|
|
pRoot = m_wndObjList.GetParentItem(pRootT);
|
|
|
|
if (pRoot == NULL)
|
|
{
|
|
pRoot = pRootT;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return pRoot;
|
|
}
|
|
|
|
void CGJFCDlg::OnBnClickedButton2()
|
|
{
|
|
AcAxDocLock lock;
|
|
AcDbObjectId id;
|
|
CString sHandle;
|
|
|
|
int nSel = m_wndObjList.GetSelectedItem();
|
|
if (nSel != -1)
|
|
{
|
|
//获取所在的层
|
|
CString sFloor;
|
|
CTreeItem * pRoot = NULL;
|
|
pRoot = GetRootItem(nSel);
|
|
CItemInfo* pRootItem = m_wndObjList.GetData(pRoot);
|
|
sFloor = pRootItem->GetItemText();
|
|
|
|
//层名 底标高:0
|
|
CString sLayName = sFloor;
|
|
|
|
CTreeItem* pItem = m_wndObjList.GetTreeItem(nSel);
|
|
if (pItem != NULL)
|
|
{
|
|
CItemInfo* pInf = m_wndObjList.GetData(pItem);
|
|
if (pInf != NULL)
|
|
{
|
|
sHandle = pInf->GetSubItem(1);
|
|
int nImge = pInf->GetImage();
|
|
|
|
if (nImge != IMG_ENT)
|
|
{
|
|
AfxMessageBox(_T("当前选择不是构件对象!移除失败!"));
|
|
return;
|
|
}
|
|
|
|
AcDbHandle hd((const TCHAR*)sHandle);
|
|
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
|
|
{
|
|
CString sKey,sDxf;
|
|
AcAxDocLock lock;
|
|
AcDbEntity* pEnt = NULL;
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
pEnt->close();
|
|
}
|
|
|
|
m_wndObjList.DeleteItemEx(pItem,nSel);
|
|
m_mapHandToItemPos.RemoveKey(sHandle);
|
|
|
|
sKey.Format(_T("%s-%s"),sDxf,sHandle);
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
AecDbObjXDataMap xData;
|
|
xData.Read(idSpace,sLayName);
|
|
xData.RemoveAt(sKey);//兼容以前的版本
|
|
xData.RemoveAt(sDxf);//新的版本Handle作为KEY
|
|
xData.Write(idSpace,sLayName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CGJFCDlg::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CDialog::OnSize(nType, cx, cy);
|
|
|
|
if (::IsWindow(m_wndObjList.m_hWnd))
|
|
{
|
|
CRect rc;
|
|
GetClientRect(&rc);
|
|
|
|
rc.DeflateRect(7,7,7,m_rcBt.Height() + 7);
|
|
m_wndObjList.MoveWindow(rc);
|
|
}
|
|
|
|
//
|
|
if (::IsWindow(m_wndBtNew.m_hWnd) &&
|
|
::IsWindow(m_wndBtDel.m_hWnd) &&
|
|
::IsWindow(m_wndBtRef.m_hWnd) &&
|
|
::IsWindow(m_wndBtHide.m_hWnd) &&
|
|
::IsWindow(m_wndBtShow.m_hWnd) &&
|
|
::IsWindow(m_wndBtAdd.m_hWnd) &&
|
|
::IsWindow(m_wndBtRemove.m_hWnd) &&
|
|
::IsWindow(m_wndButton7.m_hWnd) )
|
|
{
|
|
CRect rc,rcItem;
|
|
GetClientRect(&rc);
|
|
|
|
rcItem = rc;
|
|
rcItem.left += 7;
|
|
rcItem.top = rcItem.bottom - 7 - m_rcBt.Height();
|
|
rcItem.right = rcItem.left + m_rcBt.Width();
|
|
m_wndBtNew.MoveWindow(rcItem);
|
|
|
|
rcItem.left += m_rcBt.Width();
|
|
rcItem.right += m_rcBt.Width();
|
|
m_wndBtDel.MoveWindow(rcItem);
|
|
|
|
rcItem.left += m_rcBt.Width();
|
|
rcItem.right += m_rcBt.Width();
|
|
m_wndBtRef.MoveWindow(rcItem);
|
|
|
|
rcItem.left += m_rcBt.Width();
|
|
rcItem.right += m_rcBt.Width();
|
|
m_wndBtHide.MoveWindow(rcItem);
|
|
|
|
rcItem.left += m_rcBt.Width();
|
|
rcItem.right += m_rcBt.Width();
|
|
m_wndBtShow.MoveWindow(rcItem);
|
|
|
|
rcItem.left += m_rcBt.Width();
|
|
rcItem.right += m_rcBt.Width();
|
|
m_wndBtAdd.MoveWindow(rcItem);
|
|
|
|
rcItem.left += m_rcBt.Width();
|
|
rcItem.right += m_rcBt.Width();
|
|
m_wndButton7.MoveWindow(rcItem);
|
|
|
|
rcItem.left += m_rcBt.Width();
|
|
rcItem.right += m_rcBt.Width();
|
|
m_wndBtRemove.MoveWindow(rcItem);
|
|
}
|
|
}
|
|
|
|
void CGJFCDlg::OnBnClickedButton5()
|
|
{
|
|
//当前选择的实体
|
|
AcAxDocLock lock;
|
|
AcDbObjectId id;
|
|
CString sHandle;
|
|
|
|
int nSel = m_wndObjList.GetSelectedItem();
|
|
if (nSel != -1)
|
|
{
|
|
//获取所在的层
|
|
CString sFloor;
|
|
CTreeItem * pRoot = NULL;
|
|
pRoot = GetRootItem(nSel);
|
|
CItemInfo* pRootItem = m_wndObjList.GetData(pRoot);
|
|
sFloor = pRootItem->GetItemText();
|
|
|
|
//层名 底标高:0
|
|
CString sLayName = sFloor;
|
|
|
|
CTreeItem* pItem = m_wndObjList.GetTreeItem(nSel);
|
|
if (pItem != NULL)
|
|
{
|
|
CItemInfo* pInf = m_wndObjList.GetData(pItem);
|
|
if (pInf != NULL)
|
|
{
|
|
sHandle = pInf->GetSubItem(1);
|
|
int nImge = pInf->GetImage();
|
|
|
|
if (nImge != IMG_ENT)
|
|
{
|
|
AfxMessageBox(_T("当前选择不是构件对象!"));
|
|
return;
|
|
}
|
|
|
|
AcDbHandle hd((const TCHAR*)sHandle);
|
|
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
|
|
{
|
|
CString sKey,sDxf;
|
|
AcAxDocLock lock;
|
|
AcDbEntity* pEnt = NULL;
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
pEnt->close();
|
|
}
|
|
|
|
CString sFloorT;
|
|
CStringArray arNames;
|
|
POSITION ps = m_wndObjList.GetRootHeadPosition();
|
|
while(ps != NULL)
|
|
{
|
|
CTreeItem* pRootT = m_wndObjList.GetNextRoot(ps);
|
|
if (pRootT != NULL)
|
|
{
|
|
CItemInfo* pRootItemT = m_wndObjList.GetData(pRootT);
|
|
sFloorT = pRootItemT->GetItemText();
|
|
if (sFloorT.CompareNoCase(sFloor) != 0)
|
|
{
|
|
arNames.Add(sFloorT);
|
|
}
|
|
}
|
|
}
|
|
m_wndObjList.Collapse(pRoot);
|
|
|
|
// 对话框
|
|
CAcModuleResourceOverride myResources;
|
|
CFloorNamesDlg dlg;
|
|
dlg.AppendNames(arNames);
|
|
|
|
if ( IDOK == dlg.DoModal() )
|
|
{
|
|
CString sLayName = dlg.m_sNameSel;
|
|
|
|
//先收缩
|
|
CTreeItem* pRootT = NULL;
|
|
ps = m_wndObjList.GetRootHeadPosition();
|
|
while(ps != NULL)
|
|
{
|
|
pRootT = m_wndObjList.GetNextRoot(ps);
|
|
if (pRootT != NULL)
|
|
{
|
|
CItemInfo* pRootItemT = m_wndObjList.GetData(pRootT);
|
|
sFloorT = pRootItemT->GetItemText();
|
|
if (sFloorT.CompareNoCase(sLayName) == 0)
|
|
{
|
|
m_wndObjList.Collapse(pRootT);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
AecDbObjXDataMap* pXDataMap = NULL;
|
|
|
|
AecDbObjXDataMap xDataLayMap;
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
xDataLayMap.Read(idSpace,sLayName);
|
|
|
|
//DXF_HANDLE-HANDLE映射
|
|
|
|
CItemInfo* lpItem = NULL;
|
|
CItemInfo* lpParent= NULL;
|
|
CTreeItem * pParent = NULL;
|
|
CTreeItem * pEntPos = NULL;
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
|
|
AcDb::Visibility vs = pEnt->visibility();
|
|
CString sVis = ( vs == AcDb::kVisible ) ? _T("显示") : _T("隐藏");
|
|
|
|
pXDataMap = NULL;
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pXDataMap = pEntBase->GetSpecialtyData(AcDb::kForRead);
|
|
}
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pXDataMap = pCurBase->GetSpecialtyData(AcDb::kForRead);
|
|
}
|
|
|
|
if (pXDataMap != NULL)
|
|
{
|
|
CString sFloorDxf = sFloorT;
|
|
sFloorDxf += _T("-");
|
|
sFloorDxf += sDxf;
|
|
|
|
//分类名称
|
|
CString sEntName = _T("");
|
|
pXDataMap->GetAt(KEY_NAME,sEntName);
|
|
if (sEntName.IsEmpty())
|
|
{
|
|
sEntName = GetCnEntName(sDxf);
|
|
}
|
|
|
|
TCHAR szHanele[33];
|
|
memset(szHanele,0,sizeof(TCHAR) * 33);
|
|
id.handle().getIntoAsciiBuffer(szHanele);
|
|
sHandle = szHanele;
|
|
sKey = sHandle;
|
|
|
|
int nVt = -1;
|
|
if (xDataLayMap.HasKey(sKey,nVt))
|
|
{
|
|
//已经添加了此实体
|
|
pEnt->close();
|
|
acutPrintf(_T("\n选择实体已经在分层中!"));
|
|
return;
|
|
}
|
|
|
|
xDataLayMap.SetAt(sKey,sHandle);
|
|
|
|
CString sNo;
|
|
if ( m_mapNameToRoot.Lookup(sFloorDxf,(void*&)pParent) )//找到
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),0};
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
|
|
lpParent = new CItemInfo();
|
|
lpParent->SetItemText(sEntName);
|
|
lpParent->SetImage(IMG_ENT);
|
|
lpParent->AddSubItemText(sNo);
|
|
lpParent->AddSubItemText(sHandle);
|
|
lpParent->AddSubItemText(sVis);
|
|
pEntPos = m_wndObjList.InsertItem(pParent,lpParent);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
else
|
|
{
|
|
lpParent = new CItemInfo();
|
|
lpParent->SetItemText(sEntName);
|
|
lpParent->SetImage(IMG_CLASS);
|
|
lpParent->AddSubItemText(_T(""));
|
|
lpParent->AddSubItemText(sDxf);
|
|
lpParent->AddSubItemText(_T(""));
|
|
pParent = m_wndObjList.InsertItem(pRootT,lpParent);
|
|
|
|
m_mapNameToRoot.SetAt(sFloorDxf,pParent);
|
|
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
lpParent = new CItemInfo();
|
|
lpParent->SetItemText(sEntName);
|
|
lpParent->SetImage(IMG_ENT);
|
|
lpParent->AddSubItemText(sNo);
|
|
lpParent->AddSubItemText(sHandle);
|
|
lpParent->AddSubItemText(sVis);
|
|
pEntPos = m_wndObjList.InsertItem(pParent,lpParent);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
|
|
int nScroll = 0;
|
|
m_wndObjList.ExpandAll(pRootT,nScroll);
|
|
xDataLayMap.Write(idSpace,sLayName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CGJFCDlg::OnBnClickedButton9()
|
|
{
|
|
|
|
}
|
|
|
|
void CGJFCDlg::OnBnClickedButton10()
|
|
{
|
|
|
|
}
|
|
|
|
void CGJFCDlg::OnBnClickedButton11()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
}
|