2913 lines
70 KiB
C++
2913 lines
70 KiB
C++
#include "stdafx.h"
|
|
#include "StdArx.h"
|
|
#include "GJFCNewDlg.h"
|
|
#include "FloorNameDlg.h"
|
|
#include "FloorNamesDlg.h"
|
|
#include <vector>
|
|
#include "AecDbEwEquipment.h"
|
|
#include "KTCadUtility.h"
|
|
#include "KTSetting.h"
|
|
#include "KTCADUtilityEx.h"
|
|
#include "AecDbPortRoom.h"
|
|
#include "AecDbCamera.h"
|
|
#include "CoreTools.h"
|
|
#include "entityfilter.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
|
|
|
|
#ifndef USER_DATA_SIZE
|
|
#define USER_DATA_SIZE 256
|
|
#endif USER_DATA_SIZE
|
|
|
|
IMPLEMENT_DYNAMIC(CGJFCNewDlg, CDialog)
|
|
|
|
CGJFCNewDlg::CGJFCNewDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CGJFCNewDlg::IDD, pParent)
|
|
{
|
|
m_bSelChanged = 0;
|
|
}
|
|
|
|
CGJFCNewDlg::~CGJFCNewDlg(void)
|
|
{
|
|
}
|
|
|
|
void CGJFCNewDlg::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_BUTTON9, m_wndBtRename);
|
|
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);
|
|
DDX_Control(pDX, IDC_BUTTON10, m_wndButton10);
|
|
DDX_Control(pDX, IDC_BUTTON11, m_wndButton11);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CGJFCNewDlg, CDialog)
|
|
ON_MESSAGE( WM_ACAD_KEEPFOCUS, &CGJFCNewDlg::onAcadKeepFocus )
|
|
ON_BN_CLICKED(IDC_BUTTON3, &CGJFCNewDlg::OnBnClickedButton3)
|
|
ON_BN_CLICKED(IDC_BUTTON4, &CGJFCNewDlg::OnBnClickedButton4)
|
|
ON_BN_CLICKED(IDC_BUTTON6, &CGJFCNewDlg::OnBnClickedButton6)
|
|
ON_BN_CLICKED(IDC_BUTTON7, &CGJFCNewDlg::OnBnClickedButton7)
|
|
ON_BN_CLICKED(IDC_BUTTON8, &CGJFCNewDlg::OnBnClickedButton8)
|
|
ON_BN_CLICKED(IDC_BUTTON1, &CGJFCNewDlg::OnBnClickedButton1)
|
|
ON_BN_CLICKED(IDC_BUTTON2, &CGJFCNewDlg::OnBnClickedButton2)
|
|
ON_BN_CLICKED(IDC_BUTTON5, &CGJFCNewDlg::OnBnClickedButton5)
|
|
ON_BN_CLICKED(IDC_BUTTON9, &CGJFCNewDlg::OnBnClickedButton9)
|
|
ON_BN_CLICKED(IDC_BUTTON10,&CGJFCNewDlg::OnBnClickedButton10)
|
|
ON_BN_CLICKED(IDC_BUTTON11,&CGJFCNewDlg::OnBnClickedButton11)
|
|
|
|
ON_WM_SIZE()
|
|
ON_MESSAGE(WM_PICKFIRSTMODIFIED,&CGJFCNewDlg::OnPickfirstModified)
|
|
ON_NOTIFY(TVN_SELCHANGED,ID_OBJLIST, &CGJFCNewDlg::OnSelChanged)
|
|
ON_NOTIFY(NM_RCLICK, ID_OBJLIST, &CGJFCNewDlg::OnNMRclickTreee)
|
|
END_MESSAGE_MAP()
|
|
|
|
LONG_PTR CGJFCNewDlg::onAcadKeepFocus( UINT_PTR, LONG_PTR)
|
|
{
|
|
POINT pt;
|
|
::GetCursorPos(&pt);
|
|
CRect rect;
|
|
GetWindowRect(&rect);
|
|
if(!(rect.PtInRect(pt)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CGJFCNewDlg::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);
|
|
|
|
unsigned uStyle = TVS_HASBUTTONS|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT|TVS_FULLROWSELECT;
|
|
unsigned uExStyle = TVS_EX_ITEMLINES|TVS_EX_ITEMLINES|TVS_EX_ALTERNATECOLOR|TVS_EX_SUBSELECT|TVS_EX_FULLROWMARK;
|
|
|
|
m_wndObjList.Create(uStyle|WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(0,0,0,0),this,ID_OBJLIST);
|
|
m_wndObjList.SetImageList(&m_imageList,TVSIL_NORMAL);
|
|
InitObjListColumn();
|
|
m_wndObjList.SetExtendedStyle(uExStyle);
|
|
m_wndObjList.SetUserDataSize(USER_DATA_SIZE);
|
|
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(10));
|
|
m_wndButton7.SetIcon(m_Imagelist24.ExtractIcon(7));
|
|
m_wndBtRename.SetIcon(m_Imagelist24.ExtractIcon(8));
|
|
m_wndButton10.SetIcon(m_Imagelist24.ExtractIcon(9));
|
|
m_wndButton11.SetIcon(m_Imagelist24.ExtractIcon(6));
|
|
|
|
InitDxf2CnName();
|
|
|
|
UpdateData(FALSE);
|
|
|
|
GetWindowRect(&m_rcMain);
|
|
m_wndBtNew.GetWindowRect(&m_rcBt);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CGJFCNewDlg::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);
|
|
}
|
|
}
|
|
|
|
void CGJFCNewDlg::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_DBZSTAIR"),_T("双跑楼梯"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBMRPSTAIR"),_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_DBXEQUIPMENT"),_T("参数设备"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBWEQUIPMENT"),_T("设备"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_RIVERGROOVE"),_T("巴歇尔槽"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBWEIR"),_T("进出水堰"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBWELL"),_T("井"));
|
|
m_mapDXF2CnName.SetAt(_T("AEC_DBEXTENDENT"),_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("异构单体"));
|
|
}
|
|
|
|
BOOL CGJFCNewDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDCLOSE:
|
|
return TRUE;
|
|
default:
|
|
break;
|
|
}
|
|
return CDialog::OnCommand(wParam, lParam);
|
|
}
|
|
|
|
void CGJFCNewDlg::OnBnClickedButton9()
|
|
{
|
|
OnRename();
|
|
}
|
|
|
|
void CGJFCNewDlg::AndRefrushFromEntity()
|
|
{
|
|
AcAxDocLock lock;
|
|
struct resbuf* pRb = acutBuildList(RTDXF0, _T("AEC_*"), 0);
|
|
ads_name ss,ent;
|
|
AcDbObjectId id;
|
|
|
|
int nRes = acedSSGet(_T("A"),NULL,NULL,pRb,ss);
|
|
if (nRes == RTNORM)
|
|
{
|
|
acutRelRb(pRb);
|
|
|
|
Adesk::Int32 nLen = 0;
|
|
acedSSLength(ss,&nLen);
|
|
|
|
CString sFloor,sFloors;
|
|
AecDbObjXDataMap* pXDataMap = NULL;
|
|
for (Adesk::Int32 i = 0;i < nLen;i++)
|
|
{
|
|
acedSSName(ss,i,ent);
|
|
acdbGetObjectId(id,ent);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
|
|
{
|
|
pXDataMap = NULL;
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pXDataMap = pEntBase->GetSpecialtyData();
|
|
}
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pXDataMap = pCurBase->GetSpecialtyData();
|
|
}
|
|
|
|
if (pXDataMap != NULL)
|
|
{
|
|
sFloors = _T("");
|
|
pXDataMap->GetAt(KEY_FLOORS,sFloors);
|
|
|
|
CStringArray arFloors;
|
|
CoreTools::SplitStrintToArray(sFloors,arFloors,_T(';'));
|
|
|
|
for (int j = 0;j < arFloors.GetSize();j++)
|
|
{
|
|
//添加构件到层
|
|
sFloor = arFloors.GetAt(j);
|
|
AppendFloor(sFloor,pEnt);
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
acedSSFree(ss);
|
|
}
|
|
}
|
|
|
|
void CGJFCNewDlg::RemoveLayerFromEntity(CString& sFloor, CStringArray& arHandles)
|
|
{
|
|
CString sHd;
|
|
for (int i = 0;i < arHandles.GetSize();i++)
|
|
{
|
|
sHd = arHandles.GetAt(i);
|
|
|
|
AcDbObjectId id;
|
|
AcDbHandle hd((const TCHAR *)sHd);
|
|
if (Acad::eOk == acdbCurDwg()->getAcDbObjectId(id, false, hd))
|
|
{
|
|
AcDbEntity *pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite))
|
|
{
|
|
AecDbObjXDataMap *pXDataMap = NULL;
|
|
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pXDataMap = pEntBase->GetSpecialtyData();
|
|
}
|
|
AecDbCurveBase *pCurBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pXDataMap = pCurBase->GetSpecialtyData();
|
|
}
|
|
|
|
if (pXDataMap != NULL)
|
|
{
|
|
CString sFloors = _T("");
|
|
pXDataMap->GetAt(KEY_FLOORS, sFloors);
|
|
|
|
CStringArray arFloors;
|
|
CoreTools::SplitStrintToArray(sFloors, arFloors, _T(';'));
|
|
|
|
for (int n = 0;n < arFloors.GetSize();n++)
|
|
{
|
|
if (sFloor.CompareNoCase(arFloors.GetAt(n)) == 0)
|
|
{
|
|
arFloors.RemoveAt(n);
|
|
break;
|
|
}
|
|
}
|
|
|
|
sFloors = _T("");
|
|
for (int n = 0; n < arFloors.GetSize(); n++)
|
|
{
|
|
sFloors += arFloors.GetAt(n);
|
|
sFloors += _T(';');
|
|
}
|
|
sFloors.TrimRight(_T(';'));
|
|
pXDataMap->SetAt(KEY_FLOORS, sFloors);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CGJFCNewDlg::OnBnClickedButton10()
|
|
{
|
|
AcAxDocLock lock;
|
|
AcDbDatabase* pDb = acdbCurDwg();
|
|
if (pDb == NULL)
|
|
return;
|
|
|
|
AcDbObjectId idSpace = pDb->currentSpaceId();
|
|
|
|
AecXData cVal;
|
|
AcDbObjectId id;
|
|
CString sKey,sHandle,sDxf,sEntName,sNo;
|
|
|
|
//取得所有的层名称
|
|
CString sFloor,sFloors;
|
|
HTREEITEM ps = m_wndObjList.GetRootItem();
|
|
while(ps != NULL)
|
|
{
|
|
//名称-标高
|
|
sFloor = m_wndObjList.GetItemText(ps);
|
|
|
|
AecDbObjXDataMap xData;
|
|
XDataMapRead(xData,idSpace,sFloor);
|
|
|
|
//写入实体xdata 可迁移
|
|
//1.先清空
|
|
AecDbObjXDataMap::It it = xData.Begin();
|
|
AecDbObjXDataMap::It end = xData.End();
|
|
|
|
for (; it != end; )
|
|
{
|
|
memset(&cVal,0,sizeof(AecXData));
|
|
if (!xData.GetNext(it, sKey, cVal)) break;
|
|
if (cVal.nVt == VT_BSTR)
|
|
{
|
|
sHandle = cVal.pszVal;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
|
|
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::kForWrite))
|
|
{
|
|
pXDataMap = NULL;
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pXDataMap = pEntBase->GetSpecialtyData();
|
|
}
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pXDataMap = pCurBase->GetSpecialtyData();
|
|
}
|
|
|
|
if (pXDataMap != NULL)
|
|
{
|
|
//清空
|
|
pXDataMap->RemoveAt(KEY_FLOORS);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
ps = m_wndObjList.GetNextSiblingItem(ps);
|
|
}
|
|
|
|
bool bOK = false;
|
|
|
|
//再累加写入
|
|
ps = m_wndObjList.GetRootItem();
|
|
while(ps != NULL)
|
|
{
|
|
//名称-标高
|
|
sFloor = m_wndObjList.GetItemText(ps);
|
|
|
|
AecDbObjXDataMap xData;
|
|
XDataMapRead(xData,idSpace,sFloor);
|
|
|
|
//写入实体xdata 可迁移
|
|
//1.先清空
|
|
AecDbObjXDataMap::It it = xData.Begin();
|
|
AecDbObjXDataMap::It end = xData.End();
|
|
|
|
for (; it != end; )
|
|
{
|
|
memset(&cVal,0,sizeof(AecXData));
|
|
if (!xData.GetNext(it, sKey, cVal)) break;
|
|
if (cVal.nVt == VT_BSTR)
|
|
{
|
|
sHandle = cVal.pszVal;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
|
|
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::kForWrite))
|
|
{
|
|
pXDataMap = NULL;
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pXDataMap = pEntBase->GetSpecialtyData();
|
|
}
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pXDataMap = pCurBase->GetSpecialtyData();
|
|
}
|
|
|
|
if (pXDataMap != NULL)
|
|
{
|
|
sFloors = _T("");
|
|
pXDataMap->GetAt(KEY_FLOORS,sFloors);
|
|
|
|
//外部层名中不能有;
|
|
sFloors += sFloor;
|
|
sFloors += _T(";");
|
|
pXDataMap->SetAt(KEY_FLOORS,sFloors);
|
|
bOK = true;
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
ps = m_wndObjList.GetNextSiblingItem(ps);
|
|
}
|
|
|
|
if (bOK)
|
|
AfxMessageBox(_T("构件分层保存回实体完毕,分层信息可以随实体复制粘贴到其他图中."));
|
|
}
|
|
|
|
void CGJFCNewDlg::OnRename()
|
|
{
|
|
HTREEITEM pItem = m_wndObjList.GetSelectedItem();
|
|
if (pItem != NULL)
|
|
{
|
|
CString sOldLayName = m_wndObjList.GetItemText(pItem);
|
|
|
|
AcAxDocLock lock;
|
|
AcDbDatabase* pDb = acdbCurDwg();
|
|
if (pDb == NULL)
|
|
return;
|
|
|
|
AcDbObjectId idSpace = pDb->currentSpaceId();
|
|
|
|
//读取数据
|
|
AecDbObjXDataMap xData;
|
|
XDataMapRead(xData,idSpace,sOldLayName);
|
|
|
|
CString sName;
|
|
double dBomEl = 0.0;
|
|
xData.GetAt(KEY_NAME,sName);
|
|
xData.GetAt(PIPE_EL,dBomEl);
|
|
|
|
CAcModuleResourceOverride myResources;
|
|
CFloorNameDlg dlg;
|
|
int nPos = sName.Find(_T('-'));
|
|
if (nPos != -1)
|
|
{
|
|
sName = sName.Mid(0,nPos);
|
|
}
|
|
dlg.m_sName = sName;
|
|
dlg.m_dBomEl = dBomEl;
|
|
|
|
dlg.SetNameMap(m_mapNameToRoot);
|
|
if (IDOK == dlg.DoModal() )
|
|
{
|
|
//pItem == pRoot
|
|
HTREEITEM pRoot = NULL;
|
|
m_mapNameToRoot.Lookup(sOldLayName,(void*&)pRoot);
|
|
m_mapNameToRoot.RemoveKey(sOldLayName);
|
|
|
|
sName.Format(_T("%s-%g"),dlg.m_sName,dlg.m_dBomEl);
|
|
m_mapNameToRoot.SetAt(sName,pRoot);
|
|
m_wndObjList.SetItemText(pRoot,sName);
|
|
|
|
xData.SetAt(KEY_NAME,sName);
|
|
xData.SetAt(PIPE_EL,dlg.m_dBomEl);
|
|
|
|
//先删除
|
|
AcDbObject* pObj = NULL;
|
|
if (Acad::eOk == acdbOpenObject(pObj,idSpace,AcDb::kForWrite))
|
|
{
|
|
struct resbuf* pTmp = acutNewRb(AcDb::kDxfRegAppName);
|
|
acutNewString(sOldLayName,pTmp->resval.rstring);
|
|
pObj->setXData(pTmp);
|
|
acutRelRb(pTmp);
|
|
|
|
AcDbObjectId idDic = pObj->extensionDictionary();
|
|
pObj->close();
|
|
|
|
AcDbObject* pDicObj = NULL;
|
|
if ( Acad::eOk == acdbOpenObject(pDicObj,idDic,AcDb::kForWrite))
|
|
{
|
|
AcDbDictionary* pDic = AcDbDictionary::cast(pDicObj);
|
|
if (pDic != NULL)
|
|
{
|
|
pDic->setName(sOldLayName,sName);
|
|
}
|
|
pDicObj->close();
|
|
}
|
|
|
|
pObj->close();
|
|
}
|
|
|
|
//写入旧数据
|
|
XDataMapWrite(xData,idSpace,sName);
|
|
}
|
|
}
|
|
}
|
|
|
|
//新建层
|
|
void CGJFCNewDlg::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);
|
|
HTREEITEM hFloor = NewFloor(sName,dlg.m_dBomEl,true);
|
|
}
|
|
}
|
|
|
|
HTREEITEM CGJFCNewDlg::NewFloor(CString& sName,double dBomEl,bool bTip/* = false*/)
|
|
{
|
|
HTREEITEM pRoot = NULL;
|
|
if (!m_mapNameToRoot.Lookup(sName,(void*&)pRoot) )
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
pRoot = m_wndObjList.InsertItem(sName,IMG_FLOOR,IMG_FLOOR,TVI_ROOT);
|
|
m_wndObjList.SetItem(pRoot,1,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_wndObjList.SetItem(pRoot,2,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_wndObjList.SetItem(pRoot,3,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_mapNameToRoot.SetAt(sName,pRoot);
|
|
m_wndObjList.SelectItem(pRoot);
|
|
m_wndObjList.Expand(pRoot,TVE_EXPAND);
|
|
|
|
//写入当前空间扩展数据
|
|
AcDbDatabase* pDb = acdbCurDwg();
|
|
if (pDb != NULL)
|
|
{
|
|
AcAxDocLock lock;
|
|
AcDbObjectId idSpace = pDb->currentSpaceId();
|
|
AecDbObjXDataMap xData;
|
|
xData.SetAt(KEY_NAME,sName);
|
|
xData.SetAt(PIPE_EL,dBomEl);
|
|
|
|
//xData.Write(idSpace,sName);
|
|
XDataMapWrite(xData,idSpace,sName);
|
|
}
|
|
return pRoot;
|
|
}
|
|
else
|
|
{
|
|
if (bTip)
|
|
{
|
|
CString sTip;
|
|
sTip.Format(_T("层 %s 已经存在!"),sName);
|
|
AfxMessageBox(sTip);
|
|
}
|
|
}
|
|
return pRoot;
|
|
}
|
|
|
|
bool CGJFCNewDlg::GetChildDxfs(HTREEITEM pChild,CStringArray& arDxfs)
|
|
{
|
|
AcDbObjectId id;
|
|
CString sHandle,sName;
|
|
POSITION ps = NULL;
|
|
int nImage = -1,nImageSel = -1;
|
|
|
|
HTREEITEM pEntItem = m_wndObjList.GetChildItem(pChild);
|
|
while( pEntItem != NULL)
|
|
{
|
|
//墙体
|
|
//{_T("名称"),_T("编号"),_T("句柄"),,_T("状态"),0};
|
|
sHandle = m_wndObjList.GetItemText(pEntItem);
|
|
m_wndObjList.GetItemImage(pEntItem,nImage,nImageSel);
|
|
if (nImage == IMG_CLASS)
|
|
{
|
|
arDxfs.Add(sHandle);
|
|
}
|
|
|
|
if (pEntItem != NULL)
|
|
{
|
|
GetChildDxfs(pEntItem,arDxfs);
|
|
}
|
|
pEntItem = m_wndObjList.GetNextSiblingItem(pEntItem);
|
|
}
|
|
return arDxfs.GetSize() > 0 ? true : false;
|
|
}
|
|
|
|
bool CGJFCNewDlg::GetChildDxfsAndHandles(HTREEITEM pChild,CStringArray& arDxfs,CStringArray& arHandles)
|
|
{
|
|
AcDbObjectId id;
|
|
CString sHandle,sName,sDxf;
|
|
POSITION ps = NULL;
|
|
int nImage = -1,nImageSel = -1;
|
|
|
|
HTREEITEM pEntItem = m_wndObjList.GetChildItem(pChild);
|
|
while( pEntItem != NULL)
|
|
{
|
|
//墙体
|
|
//{_T("名称"),_T("编号"),_T("句柄"),,_T("状态"),0};
|
|
sDxf = m_wndObjList.GetItemText(pEntItem);
|
|
|
|
sHandle = m_wndObjList.GetItemText(pEntItem,2);
|
|
if (!sHandle.IsEmpty())
|
|
{
|
|
arHandles.Add(sHandle);
|
|
}
|
|
|
|
m_wndObjList.GetItemImage(pEntItem,nImage,nImageSel);
|
|
if (nImage == IMG_CLASS)
|
|
{
|
|
arDxfs.Add(sDxf);
|
|
}
|
|
|
|
if (pEntItem != NULL)
|
|
{
|
|
GetChildDxfsAndHandles(pEntItem,arDxfs,arHandles);
|
|
}
|
|
pEntItem = m_wndObjList.GetNextSiblingItem(pEntItem);
|
|
}
|
|
return arDxfs.GetSize() > 0 ? true : false;
|
|
}
|
|
|
|
|
|
//删除层
|
|
void CGJFCNewDlg::OnBnClickedButton4()
|
|
{
|
|
AcAxDocLock lock;
|
|
AcDbObjectId id;
|
|
CString sHandle;
|
|
|
|
//{_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
HTREEITEM pItem = m_wndObjList.GetSelectedItem();
|
|
if (pItem != NULL)
|
|
{
|
|
CStringArray arDxfs;
|
|
GetChildDxfs(pItem,arDxfs);
|
|
|
|
CString sFloor = m_wndObjList.GetItemText(pItem);
|
|
int nImage = -1,nImageSel = -1;
|
|
m_wndObjList.GetItemImage(pItem,nImage,nImageSel);
|
|
|
|
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))
|
|
{
|
|
//先获得层下所有的实体
|
|
CStringArray arDxfs, arHandles;
|
|
GetChildDxfsAndHandles(pItem, arDxfs, arHandles);
|
|
|
|
struct resbuf *pTmpRb = pObj->xData(sFloor);
|
|
struct resbuf* pTmp = acutNewRb(AcDb::kDxfRegAppName);
|
|
acutNewString(sFloor,pTmp->resval.rstring);
|
|
Acad::ErrorStatus es = pObj->setXData(pTmp);// 清空本层实体数据
|
|
acutRelRb(pTmpRb);
|
|
acutRelRb(pTmp);
|
|
AcDbObjectId idDic = pObj->extensionDictionary();
|
|
pObj->close();
|
|
|
|
//移除实体中所属的层属性
|
|
RemoveLayerFromEntity(sFloor,arHandles);
|
|
|
|
AcDbObject* pDicObj = NULL;
|
|
if ( Acad::eOk == acdbOpenObject(pDicObj,idDic,AcDb::kForWrite))
|
|
{
|
|
AcDbDictionary* pDic = AcDbDictionary::cast(pDicObj);
|
|
if (pDic != NULL)
|
|
{
|
|
AcDbObjectId idXdata;
|
|
pDic->remove(sFloor,idXdata);
|
|
|
|
AcDbObject* pXDataObj = NULL;
|
|
if ( Acad::eOk == (es = acdbOpenObject(pXDataObj,idXdata,AcDb::kForWrite)))
|
|
{
|
|
pXDataObj->erase();
|
|
pXDataObj->close();
|
|
}
|
|
}
|
|
pDicObj->close();
|
|
}
|
|
|
|
//删除 sFloor 对应的层 RegAPP
|
|
AcDbRegAppTable *pRegTbl = NULL;
|
|
if (Acad::eOk == (es = pDb->getRegAppTable(pRegTbl, AcDb::kForRead)))
|
|
{
|
|
AcDbRegAppTableRecord *pRegRec = NULL;
|
|
if (Acad::eOk == pRegTbl->getAt(sFloor, pRegRec, AcDb::kForWrite))
|
|
{
|
|
pRegRec->erase();
|
|
pRegRec->close();
|
|
}
|
|
pRegTbl->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.DeleteItem(pItem);
|
|
m_mapNameToRoot.RemoveKey(sFloor);
|
|
|
|
m_wndObjList.Invalidate();
|
|
m_wndObjList.RedrawWindow();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AfxMessageBox(_T("选择的项不是层节点,不可删除!"));
|
|
}
|
|
}
|
|
|
|
OnBnClickedButton6();
|
|
}
|
|
|
|
static 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;
|
|
}
|
|
|
|
CString CGJFCNewDlg::GetCnEntName(CString& sDxf)
|
|
{
|
|
CString sName = _T("");
|
|
if ( m_mapDXF2CnName.Lookup(sDxf,sName))
|
|
{
|
|
return sName;
|
|
}
|
|
return sDxf;
|
|
}
|
|
|
|
//刷新
|
|
void CGJFCNewDlg::OnBnClickedButton6()
|
|
{
|
|
m_wndObjList.DeleteAllItems();
|
|
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;
|
|
CString sName,sRealName;
|
|
int nPos = 0;
|
|
|
|
AcDbRegAppTableRecord* pRec = NULL;
|
|
for(pIt->start();!pIt->done();pIt->step())
|
|
{
|
|
if ( Acad::eOk == pIt->getRecord(pRec,AcDb::kForRead) )
|
|
{
|
|
pRec->getName(pszName);
|
|
|
|
sName = pszName;
|
|
nPos = sName.Find(_T("_$#"));
|
|
if (nPos != -1)
|
|
{
|
|
sRealName = sName.Mid(0,nPos);
|
|
arNames.Add(sRealName);
|
|
}
|
|
else
|
|
{
|
|
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 (XDataMapRead(*pXData,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;
|
|
|
|
if (sName.Find(_T("_ttgx_")) != -1) continue;
|
|
|
|
//{_T("名称"),_T("编号"),_T("句柄"),,_T("状态"),0};
|
|
HTREEITEM pRoot = NULL;
|
|
pRoot = m_wndObjList.InsertItem(sNameAll,IMG_FLOOR,IMG_FLOOR,TVI_ROOT);
|
|
m_wndObjList.SetItem(pRoot,1,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_wndObjList.SetItem(pRoot,2,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_wndObjList.SetItem(pRoot,3,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
|
|
m_mapNameToRoot.SetAt(sNameAll,pRoot);
|
|
|
|
CreateChildItem(pXData);
|
|
|
|
m_wndObjList.Expand(pRoot,TVE_EXPAND);
|
|
delete pXData;
|
|
}
|
|
}
|
|
}
|
|
|
|
//补充支持从迁移中的刷新
|
|
AndRefrushFromEntity();
|
|
}
|
|
|
|
void CGJFCNewDlg::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;
|
|
HTREEITEM pRoot = NULL;
|
|
if (m_mapNameToRoot.Lookup(sNameAll,(void*&)pRoot) )
|
|
{
|
|
//DXF_HANDLE-HANDLE映射
|
|
CString sKey,sHandle,sDxf,sEntName,sNo;
|
|
AcDbObjectId id;
|
|
AecXData cVal;
|
|
|
|
AecDbObjXDataMap::It it = pXData->Begin();
|
|
AecDbObjXDataMap::It end = pXData->End();
|
|
|
|
for (; it != end; )
|
|
{
|
|
memset(&cVal,0,sizeof(AecXData));
|
|
if (!pXData->GetNext(it, sKey, cVal))
|
|
break;
|
|
|
|
if (cVal.nVt == VT_BSTR)
|
|
{
|
|
sHandle = cVal.pszVal;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
|
|
HTREEITEM pParent = NULL;
|
|
HTREEITEM 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("句柄"),_T("状态"),0};
|
|
sEntName = m_wndObjList.GetItemText(pParent);
|
|
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
|
|
pEntPos = m_wndObjList.InsertItem(sEntName,IMG_ENT,IMG_ENT,pParent);
|
|
m_wndObjList.SetItem(pEntPos,1,TVIF_TEXT,sNo,-1,-1,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,2,TVIF_TEXT,sHandle,-1,-1,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,3,TVIF_TEXT,sVis,-1,-1,0,0,0);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
else
|
|
{
|
|
//新建分类
|
|
pParent = m_wndObjList.InsertItem(sEntName,IMG_CLASS,IMG_CLASS,pRoot);
|
|
m_wndObjList.SetItem(pParent,1,TVIF_TEXT,_T(""),-1,-1,0,0,0);
|
|
m_wndObjList.SetItem(pParent,2,TVIF_TEXT,sDxf,-1,-1,0,0,0);
|
|
m_wndObjList.SetItem(pParent,3,TVIF_TEXT,_T(""),-1,-1,0,0,0);
|
|
m_mapNameToRoot.SetAt(sFloorDxf,pParent);
|
|
m_wndObjList.Expand(pRoot,TVE_EXPAND);
|
|
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
pEntPos = m_wndObjList.InsertItem(sEntName,IMG_ENT,IMG_ENT,pParent);
|
|
m_wndObjList.SetItem(pEntPos,1,TVIF_TEXT,sNo,-1,-1,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,2,TVIF_TEXT,sHandle,-1,-1,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,3,TVIF_TEXT,sVis,-1,-1,0,0,0);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool CGJFCNewDlg::GetChildIds(HTREEITEM pParent,AcDbObjectIdArray& arIds,CMapStringToPtr* pmapHandToItem)
|
|
{
|
|
AcDbObjectId id;
|
|
CString sHandle,sName;
|
|
POSITION ps = NULL;
|
|
int nCount = 0;
|
|
|
|
//第一个子开始
|
|
HTREEITEM pEntItem = NULL;
|
|
pEntItem = m_wndObjList.GetChildItem(pParent);
|
|
|
|
while( pEntItem != NULL)
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
sHandle = m_wndObjList.GetItemText(pEntItem,2);
|
|
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++;
|
|
}
|
|
}
|
|
|
|
GetChildIds(pEntItem,arIds,pmapHandToItem);
|
|
|
|
pEntItem = m_wndObjList.GetNextSiblingItem(pEntItem);
|
|
}
|
|
|
|
return nCount > 0 ? true : false;
|
|
}
|
|
|
|
//节点隐藏层
|
|
void CGJFCNewDlg::OnBnClickedButton7()
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
HTREEITEM pItem = m_wndObjList.GetSelectedItem();
|
|
if (pItem != NULL)
|
|
{
|
|
CMapStringToPtr mapHandToItem;
|
|
|
|
AcDbObjectIdArray arIds;
|
|
CString sHandle = m_wndObjList.GetItemText(pItem,2);
|
|
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) )
|
|
{
|
|
m_wndObjList.SetItemText(pItem,_T("隐藏"),3);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedPostCommand(_T("regen "));
|
|
}
|
|
}
|
|
|
|
//节点显示
|
|
void CGJFCNewDlg::OnBnClickedButton8()
|
|
{
|
|
HTREEITEM pItem = m_wndObjList.GetSelectedItem();
|
|
if (pItem != NULL)
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
AcDbObjectIdArray arIds;
|
|
CMapStringToPtr mapHandToItem;
|
|
|
|
CString sHandle = m_wndObjList.GetItemText(pItem,2);
|
|
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) )
|
|
{
|
|
m_wndObjList.SetItemText(pItem,_T("显示"),3);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedPostCommand(_T("regen "));
|
|
}
|
|
}
|
|
|
|
//添加构件
|
|
void CGJFCNewDlg::OnBnClickedButton1()
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
HTREEITEM hItemSel = m_wndObjList.GetSelectedItem();
|
|
//获取所在的层
|
|
if (hItemSel == NULL)
|
|
{
|
|
AfxMessageBox(_T("请先选择目标分层!"));
|
|
return;
|
|
}
|
|
|
|
HTREEITEM pRoot = NULL;
|
|
pRoot = GetRootItem(hItemSel);
|
|
|
|
//获取所在的层
|
|
CString sFloor;
|
|
sFloor = m_wndObjList.GetItemText(pRoot);
|
|
|
|
//层名 底标高:0
|
|
CString sLayName = sFloor;
|
|
|
|
ShowWindow(SW_HIDE);
|
|
|
|
AcAxDocLock lock;
|
|
struct resbuf* pRb = acutBuildList(RTDXF0, _T("AEC_*,HATCH,INSERT"), 0);
|
|
ads_name ss,ent;
|
|
|
|
acedPostCommand(_T("\x03"));
|
|
|
|
LPCTSTR pszMsg[] = {_T("\n请选择要添加的构件:"), _T("")};
|
|
int nRes = acedSSGet(_T(":$:S"), pszMsg, 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 xDataLayMap;
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
//xDataLayMap.Read(idSpace,sLayName);
|
|
XDataMapRead(xDataLayMap,idSpace,sLayName);
|
|
|
|
//DXF_HANDLE-HANDLE映射
|
|
HTREEITEM pParent = NULL;
|
|
HTREEITEM 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();
|
|
|
|
AcDb::Visibility vs = pEnt->visibility();
|
|
CString sVis = ( vs == AcDb::kVisible ) ? _T("显示") : _T("隐藏");
|
|
|
|
sEntName = _T("");
|
|
AecDbObjXDataMap* pXDataMap = NULL;
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pXDataMap = pEntBase->GetSpecialtyData(AcDb::kForRead);
|
|
if (!pXDataMap) continue;
|
|
pXDataMap->GetAt(KEY_NAME,sEntName);
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
if (sEntName.IsEmpty())
|
|
sEntName = GetCnEntName(sDxf);
|
|
}
|
|
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCurBase != NULL)
|
|
{
|
|
pXDataMap = pCurBase->GetSpecialtyData(AcDb::kForRead);
|
|
if (!pXDataMap) continue;
|
|
pXDataMap->GetAt(KEY_NAME,sEntName);
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
if (sEntName.IsEmpty())
|
|
sEntName = GetCnEntName(sDxf);
|
|
}
|
|
AcDbHatch *pHatch = AcDbHatch::cast(pEnt);
|
|
if (pHatch)
|
|
{
|
|
sEntName = _T("图案填充");
|
|
sNo = _T("无");
|
|
}
|
|
AcDbBlockReference *pBlockRef = AcDbBlockReference::cast(pEnt);
|
|
if (pBlockRef)
|
|
{
|
|
if (CEntityProperty::isZHSB(pEnt)
|
|
|| CEntityProperty::isShModel3d(pEnt)
|
|
|| CEntityProperty::isCZTZ(pEnt) )
|
|
{
|
|
sEntName = CEntityProperty::getNameOfEntity(pEnt);
|
|
sDxf = CEntityProperty::getNameOfEntityType(pEnt);
|
|
sNo = _T("无");
|
|
}
|
|
}
|
|
|
|
CString sFloorDxf = sFloor;
|
|
sFloorDxf += _T("-");
|
|
sFloorDxf += 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("句柄"),_T("状态"),0};
|
|
pEntPos = m_wndObjList.InsertItem(sEntName,IMG_ENT,IMG_ENT,pParent);
|
|
m_wndObjList.SetItem(pEntPos,1,TVIF_TEXT,sNo,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,2,TVIF_TEXT,sHandle,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,3,TVIF_TEXT,sVis,0,0,0,0,0);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
|
|
}
|
|
else
|
|
{
|
|
//墙体/墙体 DH0094 ...
|
|
pParent = m_wndObjList.InsertItem(GetCnEntName(sDxf),IMG_CLASS,IMG_CLASS,pRoot);
|
|
m_wndObjList.SetItem(pParent,1,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_wndObjList.SetItem(pParent,2,TVIF_TEXT,sDxf,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pParent,3,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_mapNameToRoot.SetAt(sFloorDxf,pParent);
|
|
m_wndObjList.Expand(pRoot,TVE_EXPAND);
|
|
|
|
pEntPos = m_wndObjList.InsertItem(sEntName,IMG_ENT,IMG_ENT,pParent);
|
|
m_wndObjList.SetItem(pEntPos,1,TVIF_TEXT,sNo,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,2,TVIF_TEXT,sHandle,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,3,TVIF_TEXT,sVis,0,0,0,0,0);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
m_wndObjList.Invalidate();
|
|
m_wndObjList.RedrawWindow();
|
|
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedSSFree(ss);
|
|
|
|
ShowWindow(SW_SHOW);
|
|
|
|
//xDataLayMap.Write(idSpace,sLayName);
|
|
XDataMapWrite(xDataLayMap,idSpace,sLayName);
|
|
}
|
|
}
|
|
|
|
void CGJFCNewDlg::AppendFloor(CString& sFloor,AcDbEntity* pEnt)
|
|
{
|
|
if (pEnt == NULL)
|
|
return;
|
|
|
|
//判断层是否存在
|
|
//层名-标高
|
|
int nPos = sFloor.ReverseFind(_T('-'));
|
|
if (nPos != -1)
|
|
{
|
|
CString sName,sEl,sFloorT;
|
|
sName = sFloor.Mid(0,nPos);
|
|
sEl = sFloor.Mid(nPos + 1);
|
|
double dBomEl = _ttof(sEl);
|
|
|
|
HTREEITEM hFloorHit = NULL;
|
|
|
|
HTREEITEM ps = m_wndObjList.GetRootItem();
|
|
while(ps != NULL)
|
|
{
|
|
//名称-标高
|
|
sFloorT = m_wndObjList.GetItemText(ps);
|
|
if (sFloorT.CompareNoCase(sFloor) == 0)
|
|
{
|
|
hFloorHit = ps;
|
|
break;
|
|
}
|
|
ps = m_wndObjList.GetNextSiblingItem(ps);
|
|
}
|
|
|
|
if (hFloorHit == NULL)
|
|
{
|
|
//建立层
|
|
hFloorHit = NewFloor(sFloor,dBomEl,false);
|
|
}
|
|
|
|
if (hFloorHit != NULL)
|
|
{
|
|
CString sDxf,sName,sEntName,sHandle,sNo,sKey;
|
|
|
|
AecDbObjXDataMap xDataLayMap;
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
//xDataLayMap.Read(idSpace,sLayName);
|
|
XDataMapRead(xDataLayMap,idSpace,sFloor);
|
|
|
|
//DXF_HANDLE-HANDLE映射
|
|
HTREEITEM pParent = NULL;
|
|
HTREEITEM pEntPos = NULL;
|
|
|
|
AcDbObjectId id = pEnt->objectId();
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
|
|
AcDb::Visibility vs = pEnt->visibility();
|
|
CString sVis = ( vs == AcDb::kVisible ) ? _T("显示") : _T("隐藏");
|
|
|
|
AecDbObjXDataMap* 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))
|
|
{
|
|
//已经添加了此实体,不用提示
|
|
//acutPrintf(_T("\n选择实体已经在分层中!"));
|
|
return;
|
|
}
|
|
|
|
xDataLayMap.SetAt(sKey,sHandle);
|
|
|
|
if ( m_mapNameToRoot.Lookup(sFloorDxf,(void*&)pParent) )//找到
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
|
|
pEntPos = m_wndObjList.InsertItem(sEntName,IMG_ENT,IMG_ENT,pParent);
|
|
m_wndObjList.SetItem(pEntPos,1,TVIF_TEXT,sNo,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,2,TVIF_TEXT,sHandle,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,3,TVIF_TEXT,sVis,0,0,0,0,0);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
|
|
}
|
|
else
|
|
{
|
|
//墙体/墙体 DH0094 ...
|
|
pParent = m_wndObjList.InsertItem(GetCnEntName(sDxf),IMG_CLASS,IMG_CLASS,hFloorHit);
|
|
m_wndObjList.SetItem(pParent,1,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_wndObjList.SetItem(pParent,2,TVIF_TEXT,sDxf,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pParent,3,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_mapNameToRoot.SetAt(sFloorDxf,pParent);
|
|
m_wndObjList.Expand(hFloorHit,TVE_EXPAND);
|
|
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
pEntPos = m_wndObjList.InsertItem(sEntName,IMG_ENT,IMG_ENT,pParent);
|
|
m_wndObjList.SetItem(pEntPos,1,TVIF_TEXT,sNo,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,2,TVIF_TEXT,sHandle,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,3,TVIF_TEXT,sVis,0,0,0,0,0);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
m_wndObjList.Invalidate();
|
|
m_wndObjList.RedrawWindow();
|
|
}
|
|
}
|
|
|
|
//xDataLayMap.Write(idSpace,sLayName);
|
|
XDataMapWrite(xDataLayMap,idSpace,sFloor);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CGJFCNewDlg::RemoveObjectId(AcDbObjectId& id)
|
|
{
|
|
AcDbHandle hd = id.handle();
|
|
|
|
TCHAR szHanele[33];
|
|
memset(szHanele,0,sizeof(TCHAR) * 33);
|
|
id.handle().getIntoAsciiBuffer(szHanele);
|
|
|
|
HTREEITEM pItem = NULL;
|
|
if ( m_mapHandToItemPos.Lookup(szHanele,(void*&)pItem) )
|
|
{
|
|
//获取所在的层
|
|
CString sFloor;
|
|
HTREEITEM pRoot = NULL;
|
|
pRoot = GetRootItem(pItem);
|
|
|
|
sFloor = m_wndObjList.GetItemText(pRoot);
|
|
|
|
//层名 底标高:0
|
|
CString sLayName = sFloor;
|
|
CString sHandle,sName;
|
|
sHandle = m_wndObjList.GetItemText(pItem,2);
|
|
sName = m_wndObjList.GetItemText(pItem);
|
|
|
|
int nImage = -1,nImageSel = -1;
|
|
m_wndObjList.GetItemImage(pItem,nImage,nImageSel);
|
|
|
|
if (nImage == IMG_ENT )
|
|
{
|
|
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::kForWrite))
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
pEnt->setVisibility(AcDb::kInvisible);
|
|
pEnt->close();
|
|
}
|
|
|
|
HTREEITEM hParent = m_wndObjList.GetParentItem(pItem);
|
|
|
|
m_wndObjList.DeleteItem(pItem);
|
|
m_mapHandToItemPos.RemoveKey(sHandle);
|
|
|
|
sKey.Format(_T("%s-%s"),sDxf,sHandle);
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
AecDbObjXDataMap xData;
|
|
|
|
//xData.Read(idSpace,sLayName);
|
|
XDataMapRead(xData,idSpace,sLayName);
|
|
|
|
xData.RemoveAt(sKey);//兼容以前的版本
|
|
xData.RemoveAt(sDxf);//新的版本Handle作为KEY
|
|
xData.RemoveAt(sHandle);
|
|
|
|
//xData.Write(idSpace,sLayName);
|
|
XDataMapWrite(xData,idSpace,sLayName);
|
|
|
|
pItem = m_wndObjList.GetChildItem(hParent);
|
|
if (pItem == NULL)//没有子
|
|
{
|
|
m_wndObjList.DeleteItem(hParent);
|
|
|
|
//移除floor-dxf
|
|
CString sFloorDxf;
|
|
sFloorDxf.Format(_T("%s-%s"),sFloor,sDxf);
|
|
m_mapNameToRoot.RemoveKey(sFloorDxf);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#define TTGX_2D _T("_ttgx_2d")
|
|
#define TTGX_3D _T("_ttgx_3d")
|
|
#define TTGX_ID_LEN _T("_id_len_")
|
|
#define TTGX_VT_MOVE _T("_vt_Move_")
|
|
namespace
|
|
{
|
|
BOOL XDataMapRead(AecDbObjXDataMap &xDataLayMap, AcDbObjectId &id, LPCTSTR sLayName)
|
|
{
|
|
BOOL bSuccess = xDataLayMap.Read(id, sLayName);
|
|
if (bSuccess)
|
|
{
|
|
//再读分出去的数据
|
|
xDataLayMap.ReadExDic(id, sLayName);
|
|
}
|
|
else
|
|
{
|
|
bSuccess = xDataLayMap.ReadExDic(id, sLayName);
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
BOOL XDataMapWrite(AecDbObjXDataMap &xDataLayMap, AcDbObjectId &id, LPCTSTR sLayName)
|
|
{
|
|
BOOL bSuccess = xDataLayMap.Write(id, sLayName);
|
|
if (bSuccess)
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
//注册
|
|
int nRes = acdbRegApp(sLayName);
|
|
bSuccess = xDataLayMap.WriteExDic(id, sLayName);
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
bool has3DBuffer(const AcDbObjectIdArray &ids)
|
|
{
|
|
AcDbEntity *pEnt(NULL);
|
|
for (int i = 0; i < ids.length(); ++i)
|
|
{
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, ids[i], AcDb::kForRead))
|
|
{
|
|
AecDbCurveBase *pCrvBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCrvBase != NULL)
|
|
{
|
|
if (!pCrvBase->Has3DBuffer())
|
|
{
|
|
pEnt->close();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
if (!pEntBase->Has3DBuffer())
|
|
{
|
|
pEnt->close();
|
|
return false;
|
|
}
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void GetInfPoints(AecMInterfaces *pInf, LPCTSTR pszDxf, LPCTSTR pszCmd, AecDbObjXDataMap *pXDataMap, AcDbVoidPtrArray &arEntPtrs, AcGePoint3dArray &arPtPair)
|
|
{
|
|
if (pInf != NULL)
|
|
{
|
|
AcArray<AecInterface> arInfs;
|
|
pInf->GetInterface(arInfs);
|
|
|
|
int nIndex = -1;
|
|
for (int i = 0; i < arInfs.length(); i++)
|
|
{
|
|
AecInterface &inf = arInfs.at(i);
|
|
|
|
nIndex = arPtPair.find(inf.ptPos);
|
|
if (nIndex == -1)
|
|
{
|
|
AcDbPoint *pPt = new AcDbPoint;
|
|
pPt->setPosition(inf.ptPos);
|
|
|
|
AecDbObjXDataMap xdataMap;
|
|
xdataMap.SetAt(KEY_POS, inf.ptPos);
|
|
xdataMap.SetAt(KEY_TYPE, inf.nType);
|
|
xdataMap.SetAt(PIPE_TDIR, inf.vtDir);
|
|
xdataMap.SetAt(KEY_SIZE1, inf.dSize1);
|
|
xdataMap.SetAt(KEY_SIZE2, inf.dSize2);
|
|
xdataMap.SetAt(KEY_NAME, pszDxf);
|
|
|
|
if (pszCmd != NULL)
|
|
xdataMap.SetAt(KEY_GRIPCMD, pszCmd);
|
|
|
|
xdataMap.Write(pPt, _T("INF"));
|
|
|
|
if (pXDataMap != NULL)
|
|
{
|
|
pXDataMap->Write(pPt, _T("BIMDATA"));
|
|
}
|
|
arPtPair.append(inf.ptPos);
|
|
arEntPtrs.append(pPt);
|
|
}
|
|
else //不加入
|
|
{
|
|
//arPtPair.removeAt(nIndex);
|
|
//AcDbPoint* pPt = (AcDbPoint*)arEntPtrs.at(nIndex);
|
|
//delete pPt;
|
|
//arEntPtrs.removeAt(nIndex);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void getAllAec3D(const AcDbObjectIdArray &ids, AcDbVoidPtrArray &arEntPtrs)
|
|
{
|
|
AcGePoint3dArray arPtPair;
|
|
Adesk::UInt16 nDrawStyle = 0;
|
|
|
|
LPCTSTR pszCmd = NULL;
|
|
AcDbEntity *pEnt = NULL;
|
|
AecMInterfaces *pInf = NULL;
|
|
AecDbObjXDataMap *pXDataMap = NULL;
|
|
|
|
AcDbObjectId id, idEw, idHos;
|
|
for (int i = 0; i < ids.length(); ++i)
|
|
{
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, ids[i], AcDb::kForRead))
|
|
{
|
|
pXDataMap = NULL;
|
|
AecDbCurveBase *pCrvBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCrvBase != NULL)
|
|
{
|
|
pCrvBase->GetDraw3dables(arEntPtrs, true);
|
|
pXDataMap = pCrvBase->GetSpecialtyData(AcDb::kForRead);
|
|
}
|
|
|
|
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pEntBase->GetDraw3dables(arEntPtrs, true);
|
|
pXDataMap = pEntBase->GetSpecialtyData(AcDb::kForRead);
|
|
}
|
|
|
|
pInf = NULL;
|
|
pszCmd = NULL;
|
|
if (pEnt->isKindOf(AecDbEwPipe::desc()))
|
|
{
|
|
AecDbEwPipe *pPipe = AecDbEwPipe::cast(pEnt);
|
|
pInf = static_cast<AecMInterfaces *>(pPipe);
|
|
pszCmd = pPipe->GetGripCmd();
|
|
}
|
|
|
|
if (pEnt->isKindOf(AecDbEwFitting::desc()))
|
|
{
|
|
AecDbEwFitting *pFitting = AecDbEwFitting::cast(pEnt);
|
|
pInf = static_cast<AecMInterfaces *>(pFitting);
|
|
pszCmd = pFitting->GetGripCmd();
|
|
}
|
|
|
|
if (pEnt->isKindOf(AecDbEwEquipment::desc()))
|
|
{
|
|
AecDbEwEquipment *pEqu = AecDbEwEquipment::cast(pEnt);
|
|
pInf = static_cast<AecMInterfaces *>(pEqu);
|
|
pszCmd = pEqu->GetGripCmd();
|
|
}
|
|
|
|
if (pInf != NULL)
|
|
{
|
|
GetInfPoints(pInf, pEnt->isA()->dxfName(), pszCmd, pXDataMap, arEntPtrs, arPtPair);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
|
|
void getAllAec2D(const AcDbObjectIdArray &ids, AcDbVoidPtrArray &arEntPtrs)
|
|
{
|
|
for (int i(0); i < ids.length(); ++i)
|
|
{
|
|
AcDbEntity *pEnt(NULL);
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, ids[i], AcDb::kForRead))
|
|
{
|
|
//if (pEnt->visibility() == AcDb::kInvisible)
|
|
//{
|
|
// pEnt->close();
|
|
// continue;
|
|
//}
|
|
|
|
AecDbPortRoom *pRoom = AecDbPortRoom::cast(pEnt);
|
|
if (pRoom != NULL)
|
|
{
|
|
pRoom->GetDraw2d(arEntPtrs, 0);
|
|
}
|
|
|
|
//可以把 pEnt 的句柄string记到arEntPtrs实体上
|
|
//后期联动
|
|
AecDbCurveBase *pCrvBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCrvBase != NULL)
|
|
{
|
|
pCrvBase->GetDraw2dables(2, arEntPtrs);
|
|
}
|
|
|
|
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pEntBase->GetDraw2dables(2, arEntPtrs);
|
|
}
|
|
|
|
AecDbEwPipeDim *pPipeDim = AecDbEwPipeDim::cast(pEnt);
|
|
if (pPipeDim != NULL)
|
|
{
|
|
arEntPtrs.append((AcDbEntity *)pPipeDim->clone());
|
|
}
|
|
|
|
if (AcDbHatch::cast(pEnt))
|
|
{
|
|
arEntPtrs.append((AcDbEntity*)pEnt->clone());
|
|
}
|
|
|
|
pEnt->close();
|
|
}
|
|
}
|
|
}
|
|
|
|
void getAxis2D(AcDbVoidPtrArray &arEntPtrs)
|
|
{
|
|
//选择轴网
|
|
ads_name ss2, ent;
|
|
CString sLay;
|
|
KTSetting::GetLayerName(_T("LAY_AXIS"), sLay);
|
|
resbuf *pRb = acutBuildList(RTDXF0, _T("LINE,CIRCLE,ARC"), 8, sLay, RTNONE);
|
|
|
|
LPCTSTR pszMsg[] = { _T("\n如果需要轴网,请选择轴网:"), _T("") };
|
|
int nRes = acedSSGet(_T(":$:S"), pszMsg, NULL, pRb, ss2);
|
|
acutRelRb(pRb);
|
|
pRb = NULL;
|
|
|
|
AcDbEntity *pEnt = NULL;
|
|
AcDbObjectId id;
|
|
Adesk::Int32 lLen = 0;
|
|
acedSSLength(ss2, &lLen);
|
|
for (long i = 0; i < lLen; i++)
|
|
{
|
|
acedSSName(ss2, i, ent);
|
|
acdbGetObjectId(id, ent);
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
|
|
{
|
|
arEntPtrs.append(pEnt->clone());
|
|
pEnt->close();
|
|
}
|
|
}
|
|
acedSSFree(ss2);
|
|
}
|
|
|
|
void projectToXOY(AcDbVoidPtrArray &arEntPtrs)
|
|
{
|
|
//投影到XY面 竖线为点
|
|
AcGeVector3d vt;
|
|
AcGePoint3d pt, pt2;
|
|
AcGeMatrix3d xform;
|
|
|
|
AcDbEntity *pEnt(NULL);
|
|
AcGePoint3dArray arPts;
|
|
for (int i = 0; i < arEntPtrs.length(); i++)
|
|
{
|
|
pEnt = (AcDbEntity *)arEntPtrs.at(i);
|
|
AcDbLine *pLn = AcDbLine::cast(pEnt);
|
|
if (pLn != NULL)
|
|
{
|
|
vt = pLn->endPoint() - pLn->startPoint();
|
|
if (vt.isParallelTo(AcGeVector3d::kZAxis))
|
|
{
|
|
pt = pLn->startPoint();
|
|
pt.z = 0.0;
|
|
AcDbPoint *pPt = new AcDbPoint;
|
|
pPt->setPosition(pt);
|
|
pPt->setLayer(pLn->layerId());
|
|
arEntPtrs.setAt(i, pPt);
|
|
delete pLn;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
AcDbIntArray osnapModes, geomIds;
|
|
arPts.removeAll();
|
|
pEnt->getGripPoints(arPts, osnapModes, geomIds);
|
|
|
|
if (arPts.length() > 0)
|
|
{
|
|
pt = arPts.first();
|
|
pt2 = pt.orthoProject(AcGePlane::kXYPlane);
|
|
vt = pt2 - pt;
|
|
xform.setToTranslation(vt);
|
|
pEnt->transformBy(xform);
|
|
}
|
|
}
|
|
}
|
|
|
|
void clearRecordForMSpace(LPCTSTR recName, const bool &b2D)
|
|
{
|
|
AecDbObjXDataMap xData;
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
XDataMapRead(xData, idSpace, recName);
|
|
|
|
CString sKey_Len = TTGX_ID_LEN;
|
|
sKey_Len += b2D ? _T("2D") : _T("3D");
|
|
|
|
CString str;
|
|
int len(0);
|
|
xData.GetAt(sKey_Len, len);
|
|
for (int i(0); i < len; ++i)
|
|
{
|
|
str.Format(_T("%s%d"), b2D ? _T("2D") : _T("3D"), i);
|
|
xData.RemoveAt(str);
|
|
}
|
|
XDataMapWrite(xData, idSpace, recName);
|
|
}
|
|
|
|
void recordIdToMSpace(AcDbObjectIdArray &arIds
|
|
, const AcGeVector3d &vtM
|
|
, LPCTSTR recName
|
|
, const bool &b2D)
|
|
{
|
|
clearRecordForMSpace(recName, b2D);
|
|
|
|
AecDbObjXDataMap xDataLayMap;
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
XDataMapRead(xDataLayMap, idSpace, recName);
|
|
|
|
|
|
if (arIds.isEmpty()) return;
|
|
|
|
CString sKey_Len = TTGX_ID_LEN;
|
|
sKey_Len += b2D ? _T("2D") : _T("3D");
|
|
|
|
CString str;
|
|
xDataLayMap.SetAt(sKey_Len, arIds.length());
|
|
for (int i(0); i < arIds.length(); ++i)
|
|
{
|
|
str.Format(_T("%s%d"), b2D ? _T("2D") : _T("3D"), i);
|
|
xDataLayMap.SetAt(str, arIds[i]);
|
|
}
|
|
|
|
CString sKey_vt(TTGX_VT_MOVE);
|
|
sKey_vt += b2D ? _T("2D") : _T("3D");
|
|
xDataLayMap.SetAt(sKey_vt, vtM);
|
|
XDataMapWrite(xDataLayMap, idSpace, recName);
|
|
}
|
|
|
|
void deleteIdFromXData(AecDbObjXDataMap &XData, const bool &b2D)
|
|
{
|
|
int len(0);
|
|
CString sKey_Len = TTGX_ID_LEN;
|
|
sKey_Len += b2D ? _T("2D") : _T("3D");
|
|
CString str(_T(""));
|
|
AcDbObjectId id;
|
|
if (XData.GetAt(sKey_Len, len))
|
|
{
|
|
for (int i(0); i < len; ++i)
|
|
{
|
|
str.Format(_T("%s%d"), b2D ? _T("2D") : _T("3D"), i);
|
|
if (XData.GetAt(str, id) && id.isValid())
|
|
{
|
|
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbEntity, pEnt)
|
|
if (pEnt)
|
|
pEnt->erase();
|
|
OPENOBJ_END()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void addToCurrentDb(AcDbVoidPtrArray &arEntPtrs
|
|
, const AcGeVector3d &vtM
|
|
, AcDbObjectIdArray *pArIds
|
|
, AcGeVector3d *pVtM)
|
|
{
|
|
AcGeMatrix3d xforM;
|
|
xforM.setToTranslation(vtM);
|
|
|
|
AcDbObjectId id;
|
|
AcDbEntity *pEnt = NULL;
|
|
for (int i = 0; i < arEntPtrs.length(); i++)
|
|
{
|
|
pEnt = (AcDbEntity *)arEntPtrs.at(i);
|
|
pEnt->transformBy(xforM);
|
|
id = CoreTools::AddToModelSpace(pEnt);
|
|
if (pVtM)
|
|
*pVtM = vtM;
|
|
if (pArIds)
|
|
pArIds->append(id);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
bool CGJFCNewDlg::GetSelectItem(CString &sFloor, AcDbObjectIdArray &ar)
|
|
{
|
|
int idx = m_wndObjList.ListGetFocusItem();
|
|
if (idx == -1) return false;
|
|
|
|
// 刷新列表
|
|
//OnBnClickedButton6();
|
|
|
|
HTREEITEM hSel = m_wndObjList.GetItemOfRow(idx);
|
|
if (hSel)
|
|
{
|
|
sFloor = m_wndObjList.GetItemText(hSel);
|
|
GetChildIds(hSel, ar, NULL);
|
|
return !ar.isEmpty();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void CGJFCNewDlg::export2D()
|
|
{
|
|
AcAxDocLock lock;
|
|
|
|
AcDbObjectIdArray ar;
|
|
CString sFloor;
|
|
if (!GetSelectItem(sFloor, ar))
|
|
{
|
|
AfxMessageBox(_T("未找到当前层的实体信息!"));
|
|
return;
|
|
}
|
|
|
|
ads_point adsPt;
|
|
if (acedGetPoint(NULL, _T("\n选择结果显示位置:"), adsPt) != RTNORM) return;
|
|
AcGePoint3d ptOutput(asPnt3d(adsPt));
|
|
CoreTools::UCS2WCS(ptOutput, ptOutput);
|
|
|
|
AecDbXCamera *pCam = new AecDbXCamera();
|
|
pCam->SetUsageMode(AecDbXCamera::eStatic);
|
|
pCam->SetOutputPoint(ptOutput);
|
|
pCam->updateSelecttionSet(ar);
|
|
|
|
CoreTools::AddToModelSpace(pCam);
|
|
|
|
|
|
/*typedef bool (_cdecl *_FUNC)(AcDbVoidPtrArray &, BOOL, AcDbObjectIdArray *, AcGeVector3d *);
|
|
|
|
AcDbObjectIdArray ar;
|
|
CString sFloor;
|
|
if (!GetSelectItem(sFloor, ar))
|
|
{
|
|
AfxMessageBox(_T("未找到当前层的实体信息!"));
|
|
return;
|
|
}
|
|
|
|
HMODULE hMod = ::LoadLibrary(FilePath::GetArxDir() + _T("\\CoreCommand.arx"));
|
|
if (!hMod) return;
|
|
|
|
_FUNC func = (_FUNC)::GetProcAddress(hMod, "WblockToNewFile");
|
|
|
|
if (func)
|
|
{
|
|
AcDbVoidPtrArray arEntPtrs;
|
|
getAllAec2D(ar, arEntPtrs);
|
|
getAxis2D(arEntPtrs);
|
|
if (arEntPtrs.isEmpty()) return;
|
|
projectToXOY(arEntPtrs);
|
|
AcDbObjectIdArray arIds;
|
|
AcGeVector3d vtM;
|
|
func(arEntPtrs, FALSE, &arIds, &vtM);
|
|
|
|
recordIdToMSpace(arIds, vtM, sFloor, true);
|
|
}
|
|
|
|
::FreeLibrary(hMod);*/
|
|
return;
|
|
}
|
|
|
|
void CGJFCNewDlg::export3D()
|
|
{
|
|
AcAxDocLock lock;
|
|
typedef bool (_cdecl *_FUNC)(AcDbVoidPtrArray &, BOOL, AcDbObjectIdArray *, AcGeVector3d *);
|
|
|
|
AcDbObjectIdArray ar;
|
|
CString sFloor;
|
|
if (!GetSelectItem(sFloor, ar))
|
|
{
|
|
AfxMessageBox(_T("未找到当前层的实体信息!"));
|
|
return;
|
|
}
|
|
|
|
if (!has3DBuffer(ar))
|
|
{
|
|
AfxMessageBox(_T("当前三维显示不全,请转到 三维视图 后再进行 俯视图 下的三维提图!"));
|
|
return;
|
|
}
|
|
|
|
HMODULE hMod = ::LoadLibrary(FilePath::GetArxDir() + _T("\\CoreCommand.arx"));
|
|
if (!hMod) return;
|
|
|
|
_FUNC func = (_FUNC)::GetProcAddress(hMod, "WblockToNewFile");
|
|
|
|
if (func)
|
|
{
|
|
AcDbVoidPtrArray arEntPtrs;
|
|
getAllAec3D(ar, arEntPtrs);
|
|
if (arEntPtrs.isEmpty()) return;
|
|
|
|
AcDbObjectIdArray arIds;
|
|
AcGeVector3d vtM;
|
|
func(arEntPtrs, TRUE, &arIds, &vtM);
|
|
|
|
recordIdToMSpace(arIds, vtM, sFloor, false);
|
|
}
|
|
|
|
::FreeLibrary(hMod);
|
|
return;
|
|
}
|
|
|
|
void CGJFCNewDlg::exportUpdate()
|
|
{
|
|
AcAxDocLock lock;
|
|
|
|
AcDbObjectIdArray ar;
|
|
CString sFloor;
|
|
if (!GetSelectItem(sFloor, ar))
|
|
{
|
|
AfxMessageBox(_T("未找到当前层的实体信息!"));
|
|
return;
|
|
}
|
|
|
|
AcDbVoidPtrArray arEntPtrs;
|
|
AcDbObjectIdArray arIds;
|
|
AcGeVector3d vtM(AcGeVector3d::kIdentity);
|
|
AecDbObjXDataMap xDataLayMap;
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
//if (XDataMapRead(xDataLayMap, idSpace, sFloor))
|
|
//{
|
|
// deleteIdFromXData(xDataLayMap, true);
|
|
// xDataLayMap.GetAt(CString(TTGX_VT_MOVE) + _T("2D"), vtM);
|
|
// getAllAec2D(ar, arEntPtrs);
|
|
// if (!arEntPtrs.isEmpty())
|
|
// {
|
|
// projectToXOY(arEntPtrs);
|
|
// addToCurrentDb(arEntPtrs, vtM, &arIds, &vtM);
|
|
// recordIdToMSpace(arIds, vtM, sFloor, true);
|
|
// }
|
|
//}
|
|
|
|
arEntPtrs.removeAll();
|
|
arIds.removeAll();
|
|
if (XDataMapRead(xDataLayMap, idSpace, sFloor))
|
|
{
|
|
if (!has3DBuffer(ar))
|
|
{
|
|
acutPrintf(_T("当前三维显示不全,建议转到 三维视图 后再进行 提图更新!"));
|
|
//return;
|
|
}
|
|
|
|
deleteIdFromXData(xDataLayMap, false);
|
|
xDataLayMap.GetAt(CString(TTGX_VT_MOVE) + _T("3D"), vtM);
|
|
getAllAec3D(ar, arEntPtrs);
|
|
if (!arEntPtrs.isEmpty())
|
|
{
|
|
addToCurrentDb(arEntPtrs, vtM, &arIds, &vtM);
|
|
recordIdToMSpace(arIds, vtM, sFloor, false);
|
|
}
|
|
}
|
|
}
|
|
|
|
//移除构件
|
|
void CGJFCNewDlg::OnBnClickedButton2()
|
|
{
|
|
//设计视图选择集移除
|
|
ads_name ssSet,ent;
|
|
CKTCadUtility::GetCurrentPickSet(ssSet);
|
|
|
|
Adesk::Int32 nLen = 0;
|
|
acedSSLength(ssSet,&nLen);
|
|
|
|
AcDbObjectId id;
|
|
for (int i = 0;i < nLen;i++)
|
|
{
|
|
acedSSName(ssSet,i,ent);
|
|
acdbGetObjectId(id,ent);
|
|
RemoveObjectId(id);
|
|
}
|
|
acedSSFree(ssSet);
|
|
}
|
|
|
|
void CGJFCNewDlg::OnBnClickedButton11()
|
|
{
|
|
//{_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
AcAxDocLock lock;
|
|
CString sHandle,sName;
|
|
|
|
HTREEITEM pItem = m_wndObjList.GetSelectedItem();
|
|
if (pItem != NULL)
|
|
{
|
|
//获取所在的层
|
|
CString sFloor;
|
|
HTREEITEM pRoot = NULL;
|
|
pRoot = GetRootItem(pItem);
|
|
|
|
sFloor = m_wndObjList.GetItemText(pRoot);
|
|
|
|
//层名 底标高:0
|
|
CString sLayName = sFloor;
|
|
sHandle = m_wndObjList.GetItemText(pItem,2);
|
|
sName = m_wndObjList.GetItemText(pItem);
|
|
|
|
int nImage = -1,nImageSel = -1;
|
|
m_wndObjList.GetItemImage(pItem,nImage,nImageSel);
|
|
|
|
AcDbObjectId id;
|
|
if (nImage == IMG_ENT )
|
|
{
|
|
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::kForWrite))
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
pEnt->setVisibility(AcDb::kInvisible);
|
|
pEnt->close();
|
|
}
|
|
|
|
HTREEITEM hParent = m_wndObjList.GetParentItem(pItem);
|
|
|
|
m_wndObjList.DeleteItem(pItem);
|
|
m_mapHandToItemPos.RemoveKey(sHandle);
|
|
|
|
sKey.Format(_T("%s-%s"),sDxf,sHandle);
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
AecDbObjXDataMap xData;
|
|
|
|
//xData.Read(idSpace,sLayName);
|
|
XDataMapRead(xData,idSpace,sLayName);
|
|
|
|
xData.RemoveAt(sKey);//兼容以前的版本
|
|
xData.RemoveAt(sDxf);//新的版本Handle作为KEY
|
|
xData.RemoveAt(sHandle);
|
|
|
|
//xData.Write(idSpace,sLayName);
|
|
XDataMapWrite(xData,idSpace,sLayName);
|
|
|
|
pItem = m_wndObjList.GetChildItem(hParent);
|
|
if (pItem == NULL)//没有子
|
|
{
|
|
m_wndObjList.DeleteItem(hParent);
|
|
|
|
//移除floor-dxf
|
|
CString sFloorDxf;
|
|
sFloorDxf.Format(_T("%s-%s"),sFloor,sDxf);
|
|
m_mapNameToRoot.RemoveKey(sFloorDxf);
|
|
}
|
|
}
|
|
}
|
|
else if (nImage == IMG_CLASS)
|
|
{
|
|
CString sTip;
|
|
sTip.Format(_T("将要删除分类[ %s ]下所有的节点,确认要移除吗?"),sName);
|
|
|
|
int nRes = AfxMessageBox(sTip,MB_YESNO);
|
|
if (nRes == IDYES)
|
|
{
|
|
CStringArray arDxfs,arHandles;
|
|
GetChildDxfsAndHandles(pItem,arDxfs,arHandles);
|
|
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
AecDbObjXDataMap xData;
|
|
|
|
//xData.Read(idSpace,sLayName);
|
|
XDataMapRead(xData,idSpace,sLayName);
|
|
|
|
for (int i = 0;i < arHandles.GetSize();i++)
|
|
{
|
|
sHandle = arHandles.GetAt(i);
|
|
|
|
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::kForWrite))
|
|
{
|
|
sDxf = pEnt->isA()->dxfName();
|
|
pEnt->setVisibility(AcDb::kInvisible);
|
|
pEnt->close();
|
|
}
|
|
|
|
m_mapHandToItemPos.RemoveKey(sHandle);
|
|
|
|
sKey.Format(_T("%s-%s"),sDxf,sHandle);
|
|
xData.RemoveAt(sKey);//兼容以前的版本
|
|
xData.RemoveAt(sDxf);//新的版本Handle作为KEY
|
|
xData.RemoveAt(sHandle);
|
|
|
|
//移除floor-dxf
|
|
CString sFloorDxf;
|
|
sFloorDxf.Format(_T("%s-%s"),sFloor,sDxf);
|
|
m_mapNameToRoot.RemoveKey(sFloorDxf);
|
|
}
|
|
}
|
|
|
|
m_wndObjList.DeleteItem(pItem);
|
|
|
|
//xData.Write(idSpace,sLayName);
|
|
XDataMapWrite(xData,idSpace,sLayName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool CGJFCNewDlg::IsRootItem(HTREEITEM hItem)
|
|
{
|
|
if (hItem == NULL) return false;
|
|
|
|
int nImage = -1,nImageSel = -1;
|
|
m_wndObjList.GetItemImage(hItem, nImage, nImageSel);
|
|
if (nImage == IMG_FLOOR)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
HTREEITEM CGJFCNewDlg::GetRootItem(HTREEITEM hItem)
|
|
{
|
|
if (hItem != NULL)
|
|
{
|
|
int nImage = -1,nImageSel = -1;
|
|
m_wndObjList.GetItemImage(hItem,nImage,nImageSel);
|
|
if (nImage == IMG_FLOOR)
|
|
{
|
|
return hItem;
|
|
}
|
|
|
|
HTREEITEM hParent = m_wndObjList.GetParentItem(hItem);
|
|
while(hParent != NULL)
|
|
{
|
|
m_wndObjList.GetItemImage(hParent,nImage,nImageSel);
|
|
if (nImage == IMG_FLOOR)
|
|
{
|
|
return hParent;
|
|
}
|
|
hParent = m_wndObjList.GetParentItem(hParent);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
//复制到
|
|
void CGJFCNewDlg::OnBnClickedButton5()
|
|
{
|
|
//当前选择的实体
|
|
AcAxDocLock lock;
|
|
AcDbObjectId id;
|
|
CString sHandle;
|
|
|
|
HTREEITEM hItemSel = m_wndObjList.GetSelectedItem();
|
|
if (hItemSel != NULL)
|
|
{
|
|
//获取所在的层
|
|
CString sFloor;
|
|
HTREEITEM pRoot = NULL;
|
|
pRoot = GetRootItem(hItemSel);
|
|
|
|
sFloor = m_wndObjList.GetItemText(pRoot);
|
|
|
|
//层名 底标高:0
|
|
CString sLayName = sFloor;
|
|
|
|
//{_T("名称"),_T("编号"),_T("句柄"),_T("状态"),0};
|
|
sHandle = m_wndObjList.GetItemText(hItemSel,2);
|
|
|
|
int nImge = -1,nImgeSel = -1;
|
|
m_wndObjList.GetItemImage(hItemSel,nImge,nImgeSel);
|
|
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;
|
|
HTREEITEM ps = m_wndObjList.GetRootItem();
|
|
while(ps != NULL)
|
|
{
|
|
sFloorT = m_wndObjList.GetItemText(ps);
|
|
if (sFloorT.CompareNoCase(sFloor) != 0)
|
|
{
|
|
arNames.Add(sFloorT);
|
|
}
|
|
ps = m_wndObjList.GetNextSiblingItem(ps);
|
|
}
|
|
|
|
// 对话框
|
|
CAcModuleResourceOverride myResources;
|
|
CFloorNamesDlg dlg;
|
|
dlg.AppendNames(arNames);
|
|
|
|
if ( IDOK == dlg.DoModal() )
|
|
{
|
|
CString sLayName = dlg.m_sNameSel;
|
|
|
|
//先收缩
|
|
HTREEITEM pRootT = NULL;
|
|
pRootT = m_wndObjList.GetRootItem();
|
|
while(pRootT != NULL)
|
|
{
|
|
sFloorT = m_wndObjList.GetItemText(pRootT);
|
|
if (sFloorT.CompareNoCase(sLayName) == 0)
|
|
{
|
|
break;
|
|
}
|
|
pRootT = m_wndObjList.GetNextSiblingItem(pRootT);
|
|
}
|
|
|
|
AecDbObjXDataMap* pXDataMap = NULL;
|
|
|
|
AecDbObjXDataMap xDataLayMap;
|
|
AcDbObjectId idSpace = acdbCurDwg()->currentSpaceId();
|
|
|
|
//xDataLayMap.Read(idSpace,sLayName);
|
|
XDataMapRead(xDataLayMap,idSpace,sLayName);
|
|
|
|
//DXF_HANDLE-HANDLE映射
|
|
HTREEITEM pParent = NULL;
|
|
HTREEITEM 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);
|
|
|
|
pEntPos = m_wndObjList.InsertItem(sEntName,IMG_ENT,IMG_ENT,pParent);
|
|
m_wndObjList.SetItem(pEntPos,1,TVIF_TEXT,sNo,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,2,TVIF_TEXT,sHandle,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,3,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
else//没有找到,新建分类
|
|
{
|
|
pParent = m_wndObjList.InsertItem(sEntName,IMG_CLASS,IMG_CLASS,pRootT);
|
|
m_wndObjList.SetItem(pParent,1,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_wndObjList.SetItem(pParent,2,TVIF_TEXT,sDxf,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pParent,3,TVIF_TEXT,_T(""),0,0,0,0,0);
|
|
m_mapNameToRoot.SetAt(sFloorDxf,pParent);
|
|
m_wndObjList.Expand(pRoot,TVE_EXPAND);
|
|
|
|
pXDataMap->GetAt(KEY_NO,sNo);
|
|
pEntPos = m_wndObjList.InsertItem(sEntName,IMG_ENT,IMG_ENT,pParent);
|
|
m_wndObjList.SetItem(pEntPos,1,TVIF_TEXT,sNo,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,2,TVIF_TEXT,sHandle,0,0,0,0,0);
|
|
m_wndObjList.SetItem(pEntPos,3,TVIF_TEXT,sVis,0,0,0,0,0);
|
|
m_mapHandToItemPos.SetAt(sHandle,pEntPos);
|
|
}
|
|
m_wndObjList.Invalidate();
|
|
m_wndObjList.RedrawWindow();
|
|
}
|
|
pEnt->close();
|
|
}
|
|
|
|
//xDataLayMap.Write(idSpace,sLayName);
|
|
XDataMapWrite(xDataLayMap,idSpace,sLayName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CGJFCNewDlg::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) &&
|
|
::IsWindow(m_wndButton10.m_hWnd) &&
|
|
::IsWindow(m_wndButton11.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_wndBtRename.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);
|
|
|
|
rcItem.left += m_rcBt.Width();
|
|
rcItem.right += m_rcBt.Width();
|
|
m_wndButton10.MoveWindow(rcItem);
|
|
|
|
rcItem.left += m_rcBt.Width();
|
|
rcItem.right += m_rcBt.Width();
|
|
m_wndButton11.MoveWindow(rcItem);
|
|
}
|
|
}
|
|
|
|
LRESULT CGJFCNewDlg::OnPickfirstModified(WPARAM wp,LPARAM lp)
|
|
{
|
|
if (wp != NULL)
|
|
{
|
|
TCHAR szHandle[33];
|
|
_tcscpy(szHandle,(const TCHAR*)wp);
|
|
|
|
//查找
|
|
HTREEITEM pEntPos = NULL;
|
|
if (m_mapHandToItemPos.Lookup(szHandle,(void*&)pEntPos))
|
|
{
|
|
if (!m_bSelChanged)
|
|
{
|
|
m_wndObjList.SelectItem(pEntPos);
|
|
}
|
|
m_bSelChanged = FALSE;
|
|
}
|
|
}
|
|
return 0L;
|
|
}
|
|
|
|
void CGJFCNewDlg::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 CGJFCNewDlg::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();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CGJFCNewDlg::OnNMRclickTreee(NMHDR *pNMHDR, LRESULT *pResult)
|
|
{
|
|
CPoint point,ptcursor;
|
|
::GetCursorPos(&point);
|
|
ptcursor = point;
|
|
m_wndObjList.ScreenToClient(&point);
|
|
|
|
UINT uFlags;
|
|
HTREEITEM hItem = m_wndObjList.HitTest(point,&uFlags);
|
|
if(hItem != NULL)
|
|
{
|
|
m_wndObjList.SelectItem(hItem);
|
|
DoPopularMenu(hItem,ptcursor);
|
|
}
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CGJFCNewDlg::DoPopularMenu(HTREEITEM hItem,CPoint point)
|
|
{
|
|
CAcModuleResourceOverride myResources;
|
|
CMenu menu;
|
|
menu.CreatePopupMenu();
|
|
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_NEWLAY,_T("新建层(&N)"));
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_RENAME,_T("改层名(&M)"));
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_DELAY, _T("删除层(&D)"));
|
|
menu.AppendMenu(MF_SEPARATOR);
|
|
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_REFRUSH,_T("刷新(&R)"));
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_HIDE,_T("隐藏(&H)"));
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_SHOW, _T("显示(&S)"));
|
|
menu.AppendMenu(MF_SEPARATOR);
|
|
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_ADD, _T("添加件(&A)"));
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_COPYTO,_T("复制到(&C)"));
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_REMOVE,_T("移除件(&T)"));
|
|
|
|
HTREEITEM hItemSel = m_wndObjList.GetSelectedItem();
|
|
if (IsRootItem(hItemSel))
|
|
{
|
|
menu.AppendMenu(MF_SEPARATOR);
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_EXPORT_2D, _T("二维提图(&O)"));
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_EXPORT_3D, _T("三维提图(&P)"));
|
|
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_EXPORT_UPDATE, _T("三维提图更新(&U)"));
|
|
}
|
|
|
|
int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, point.x, point.y,this);
|
|
switch(nID)
|
|
{
|
|
case ID_EXPORT_2D:
|
|
export2D();
|
|
break;
|
|
case ID_EXPORT_3D:
|
|
export3D();
|
|
break;
|
|
case ID_EXPORT_UPDATE:
|
|
exportUpdate();
|
|
break;
|
|
case ID_RENAME:
|
|
{
|
|
OnRename();
|
|
break;
|
|
}
|
|
case ID_NEWLAY:
|
|
{
|
|
OnBnClickedButton3();
|
|
break;
|
|
}
|
|
case ID_DELAY:
|
|
{
|
|
OnBnClickedButton4();
|
|
break;
|
|
}
|
|
case ID_REFRUSH:
|
|
{
|
|
OnBnClickedButton6();
|
|
break;
|
|
}
|
|
case ID_HIDE:
|
|
{
|
|
OnBnClickedButton7();
|
|
break;
|
|
}
|
|
case ID_SHOW:
|
|
{
|
|
OnBnClickedButton8();
|
|
break;
|
|
}
|
|
case ID_ADD:
|
|
{
|
|
OnBnClickedButton1();
|
|
break;
|
|
}
|
|
case ID_COPYTO:
|
|
{
|
|
OnBnClickedButton5();
|
|
break;
|
|
}
|
|
case ID_REMOVE:
|
|
{
|
|
OnBnClickedButton2();
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CGJFCNewDlg::OnSelChanged(NMHDR *pNmHdr,LRESULT *pResult)
|
|
{
|
|
m_bSelChanged = TRUE;
|
|
NM_TREEVIEW *pNmTreeView = (NM_TREEVIEW*)pNmHdr;
|
|
if(pNmTreeView && pNmTreeView->itemNew.hItem )
|
|
{
|
|
//增加选择
|
|
HTREEITEM hItem = pNmTreeView->itemNew.hItem;
|
|
CString sHandle = m_wndObjList.GetItemText(hItem,2);
|
|
if (sHandle.IsEmpty())
|
|
{
|
|
m_bSelChanged = FALSE;
|
|
return;
|
|
}
|
|
|
|
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)
|
|
{
|
|
acedSSSetFirst(NULL, NULL);
|
|
|
|
//加入选择集
|
|
ads_name ssPick;
|
|
acdbGetAdsName(ent, idT);
|
|
acedSSAdd(ent, NULL, ssPick);
|
|
|
|
acedSSSetFirst(ssPick, ssPick);
|
|
acedSSFree(ssPick);
|
|
|
|
m_arLastPick.append(idT);
|
|
ColorLightThisPick();
|
|
|
|
acedUpdateDisplay();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
m_bSelChanged = FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL CGJFCNewDlg::XDataMapRead(AecDbObjXDataMap& xDataLayMap,AcDbObjectId& id,CString& sLayName)
|
|
{
|
|
return ::XDataMapRead(xDataLayMap, id, sLayName);
|
|
}
|
|
|
|
BOOL CGJFCNewDlg::XDataMapWrite(AecDbObjXDataMap& xDataLayMap,AcDbObjectId& id,CString& sLayName)
|
|
{
|
|
return ::XDataMapWrite(xDataLayMap, id, sLayName);
|
|
} |