Files
envi-code/SourceCode/Code2026/Pool3dCmd/GJFCDlg.cpp
T
2026-09-28 15:28:50 +08:00

1510 lines
35 KiB
C++

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