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

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