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