#include "stdafx.h" #include "StdArx.h" #include "GJFCNewDlg.h" #include "FloorNameDlg.h" #include "FloorNamesDlg.h" #include #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(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 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::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 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(pPipe); pszCmd = pPipe->GetGripCmd(); } if (pEnt->isKindOf(AecDbEwFitting::desc())) { AecDbEwFitting *pFitting = AecDbEwFitting::cast(pEnt); pInf = static_cast(pFitting); pszCmd = pFitting->GetGripCmd(); } if (pEnt->isKindOf(AecDbEwEquipment::desc())) { AecDbEwEquipment *pEqu = AecDbEwEquipment::cast(pEnt); pInf = static_cast(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); }