#include "stdafx.h" #include "CSBBMDlg.h" #include "AecDbEntityBase.h" #include "KTTempZoom.h" #include "AecDbObjXDataMap.h" #ifndef DXF_EQU #define DXF_EQU _T("AEC_DBWEQUIPMENT,AEC_DBXEQUIPMENT,AEC_DBPARAEQUI,INSERT") #define DXF_PATH _T("LINE,LWPOLYLINE,AEC_ROADAXISLINE") #define DXF_CABLEPATH _T("AEC_ROADAXISLINE") #define DXF_ROUT_PATH _T("AEC_DBCABTRY,AEC_ROADAXISLINE") #endif #ifndef WM_INPLACEKILLFOCUS #define WM_INPLACEKILLFOCUS (WM_USER+0x1234) #endif #ifndef WM_ITEMSELECTED #define WM_ITEMSELECTED (WM_USER+0x1235) #endif IMPLEMENT_DYNAMIC(CSBBMDlg, CDialog) CSBBMDlg::CSBBMDlg(CWnd* pParent /*=NULL*/) : CDialog(IDD_SBBM_DLG, pParent) { } CSBBMDlg::~CSBBMDlg() { } void CSBBMDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_wndListEqus); DDX_Control(pDX, IDCANCEL, m_wndBt1); } BEGIN_MESSAGE_MAP(CSBBMDlg, CDialog) ON_MESSAGE(WM_ACAD_KEEPFOCUS, &CSBBMDlg::onAcadKeepFocus) ON_MESSAGE(WM_INPLACEKILLFOCUS, &CSBBMDlg::OnEditKillFocus) ON_MESSAGE(WM_ITEMSELECTED, &CSBBMDlg::OnItemSelected) ON_WM_SIZE() END_MESSAGE_MAP() LONG_PTR CSBBMDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR) { POINT pt; ::GetCursorPos(&pt); CRect rect; GetWindowRect(&rect); if (!(rect.PtInRect(pt))) { return FALSE; } return TRUE; } BOOL CSBBMDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp; if (!bmp.LoadBitmap(IDB_BITMAPI)) { AfxMessageBox(_T("Can't load bitmap: %x\n"), IDB_BITMAPI); 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)); m_wndListEqus.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SINGLEROW); m_wndListEqus.SetImageList(&m_imageList, LVSIL_SMALL); m_wndListEqus.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 120, 120); m_wndListEqus.InsertColumn(1, _T("名称"), LVCFMT_LEFT, 200, 120); m_wndListEqus.InsertColumn(2, _T("编码"), LVCFMT_LEFT, 200, 120); m_wndListEqus.InsertColumn(3, _T("句柄"), LVCFMT_LEFT, 80, 120); m_wndListEqus.SetColumnItemData(1, NULL, ET_Edit); m_wndListEqus.SetColumnItemData(2, NULL, ET_Edit); GetWindowRect(&m_rcMain); m_wndBt1.GetWindowRect(&m_rcBt); return TRUE; } void CSBBMDlg::OnSize(UINT nType, int cx, int cy) { if (cx < m_rcMain.Width() && cy < m_rcMain.Height()) return; CDialog::OnSize(nType, cx, cy); if (::IsWindow(m_wndListEqus.m_hWnd) && ::IsWindow(m_wndBt1.m_hWnd) ) { CRect rc; GetClientRect(&rc); rc.DeflateRect(12, 13, 10, m_rcBt.Height() + 10); m_wndListEqus.MoveWindow(rc); CRect rcBt; rcBt.left = rc.left; rcBt.right = rcBt.left + m_rcBt.Width(); rcBt.top = rc.bottom + 5; rcBt.bottom = rcBt.top + m_rcBt.Height(); m_wndBt1.MoveWindow(rcBt); } } static void HightEqu(AcDbObjectId& id) { AcAxDocLock lock; { //加入选择集 ads_name ssPick, ent; acdbGetAdsName(ent, id); acedSSAdd(ent, NULL, ssPick); acedSSSetFirst(ssPick, ssPick); acedSSFree(ssPick); AcDbExtents ext; AcDbEntity *pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)) { pEnt->getGeomExtents(ext); pEnt->close(); } KTTempZoom::arxZoom(asDblArray(ext.minPoint()), asDblArray(ext.maxPoint())); acedUpdateDisplay(); acedPostCommand(_T("regen ")); } } LRESULT CSBBMDlg::OnItemSelected(WPARAM wp,LPARAM lp) { NMHDR *pNMHDR = (NMHDR *)lp; LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); int nItem = pNMItemActivate->iItem; int nSubItem = pNMItemActivate->iSubItem; if (nItem != -1) { CString sHd = m_wndListEqus.GetItemText(nItem, 3); AcDbHandle hd(sHd); AcDbDatabase *pDb = acdbCurDwg(); if (pDb != NULL) { AcDbObjectId id; if (Acad::eOk == pDb->getAcDbObjectId(id, false, hd)) { HightEqu(id); } } } return 0L; } LRESULT CSBBMDlg::OnEditKillFocus(WPARAM wp, LPARAM lp) { int nCtrlID = (int)wp; if (nCtrlID == m_wndListEqus.GetDlgCtrlID()) { LV_DISPINFO *pDisp = (LV_DISPINFO *)lp; CString sVal = pDisp->item.pszText; int nItem = pDisp->item.iItem; int nSubItem = pDisp->item.iSubItem; if (nItem != -1) { CString sHd = m_wndListEqus.GetItemText(nItem, 3); AcDbHandle hd(sHd); AcDbDatabase *pDb = acdbCurDwg(); if (pDb != NULL) { AcDbObjectId id; AcDbEntity *pEnt = NULL; if (Acad::eOk == pDb->getAcDbObjectId(id, false, hd)) { AcAxDocLock lock; if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite)) { AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt); if (pEntBase != NULL) { if (nSubItem == 1)//名称 pEntBase->GetSpecialtyData(AcDb::kForRead)->SetAt(KEY_NAME, sVal); if (nSubItem == 2)//编码 pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sVal); } AcDbBlockReference *pRef = AcDbBlockReference::cast(pEnt); if (pEnt != NULL) { AecDbObjXDataMap xData; xData.Read(pRef, KEY_APP); if (nSubItem == 1)//名称 xData.SetAt(KEY_NAME, sVal); if (nSubItem == 2)//编码 xData.SetAt(KEY_NO, sVal); xData.Write(pRef, KEY_APP); } pEnt->close(); } } } } } return 0L; } void CSBBMDlg::ShowAllEqus() { m_wndListEqus.DeleteAllItems(); struct resbuf *pRb = acutBuildList(RTDXF0, DXF_EQU, 0); ads_name ss, ent; int nRes = acedSSGet(_T("X"), NULL, NULL, pRb, ss); acutRelRb(pRb); Adesk::Int32 nLen = 0; if (nRes == RTNORM) { acedSSLength(ss, &nLen); AcAxDocLock lock; TCHAR szHd[17]; AcDbObjectId id; AecDbObjXDataMap xData; CString sN,sNo, sTemp,sName; int nNo = 1, nItem = -1; 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)) { AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt); if (pEntBase != NULL) { pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NAME, sName); pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo); } AcDbBlockReference *pRef = AcDbBlockReference::cast(pEnt); if (pEnt != NULL) { AecDbObjXDataMap xData; if (xData.Read(pRef, KEY_APP)) { xData.GetAt(KEY_NAME, sName); xData.GetAt(KEY_NO, sNo); } } sN.Format(_T("%d"), nNo); nItem = m_wndListEqus.InsertItem(nNo, sN, 0); m_wndListEqus.SetItemText(nItem, 1, sName); m_wndListEqus.SetItemText(nItem, 2, sNo); id.handle().getIntoAsciiBuffer(szHd); m_wndListEqus.SetItemText(nItem, 3, szHd); nNo += 1; pEnt->close(); } } acedSSFree(ss); } } BOOL CSBBMDlg::OnCommand(WPARAM wParam, LPARAM lParam) { WORD lWord = LOWORD(wParam); switch (lWord) { case IDCLOSE: case IDOK: case IDCANCEL: { ShowWindow(SW_HIDE); return TRUE; } default: break; } return CDialog::OnCommand(wParam, lParam); }