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

317 lines
6.8 KiB
C++

#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<LPNMITEMACTIVATE>(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);
}