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

397 lines
9.3 KiB
C++

#include "stdafx.h"
#include "CSBTBDlg.h"
#include "afxdialogex.h"
#include "AecDbEntityBase.h"
#include "KTTempZoom.h"
#include "excel9.h"
#include "AecDbObjXDataMap.h"
#ifndef DXF_EQU
#define DXF_EQU _T("AEC_DBWEQUIPMENT,AEC_DBXEQUIPMENT,AEC_DBPARAEQUI")
#endif
IMPLEMENT_DYNAMIC(CSBTBDlg, CDialog)
CSBTBDlg::CSBTBDlg(CWnd* pParent /*=NULL*/)
: CDialog(IDD_SBTB_DLG, pParent)
{
}
CSBTBDlg::~CSBTBDlg()
{
}
void CSBTBDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_wndList);
DDX_Control(pDX, IDC_BUTTON1, m_wndBt1);
DDX_Control(pDX, IDC_PROGRESS1, m_wndProgress);
}
BEGIN_MESSAGE_MAP(CSBTBDlg, CDialog)
ON_WM_SIZE()
ON_MESSAGE(WM_ACAD_KEEPFOCUS, &CSBTBDlg::onAcadKeepFocus)
ON_BN_CLICKED(IDC_BUTTON1, &CSBTBDlg::OnBnClickedButton1)
ON_NOTIFY(NM_CLICK, IDC_LIST1, &CSBTBDlg::OnNMClickList1)
ON_BN_CLICKED(IDC_BUTTON2, &CSBTBDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON6, &CSBTBDlg::OnBnClickedButton6)
END_MESSAGE_MAP()
LONG_PTR CSBTBDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR)
{
POINT pt;
::GetCursorPos(&pt);
CRect rect;
GetWindowRect(&rect);
if (!(rect.PtInRect(pt)))
{
return FALSE;
}
return TRUE;
}
BOOL CSBTBDlg::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_wndList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SINGLEROW | LVS_EX_BORDERSELECT);
m_wndList.SetImageList(&m_imageList, LVSIL_SMALL);
m_wndList.InsertColumn(0, _T("设备列表"), LVCFMT_LEFT, 200);
m_wndList.InsertColumn(1, _T("设备名称"), LVCFMT_LEFT, 300);
m_wndList.InsertColumn(2, _T("设备编码"), LVCFMT_LEFT, 300);
GetWindowRect(&m_rcMain);
m_wndBt1.GetWindowRect(&m_rcBt);
m_wndProgress.ShowWindow(SW_HIDE);
return TRUE;
}
void CSBTBDlg::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_wndList.m_hWnd))
{
CRect rc;
GetClientRect(&rc);
rc.DeflateRect(12, m_rcBt.Height() + 13, 10, 10);
m_wndList.MoveWindow(rc);
}
}
BOOL CSBTBDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
case IDCLOSE:
{
ShowWindow(SW_HIDE);
}
return TRUE;
default:
break;
}
return CDialog::OnCommand(wParam, lParam);
}
void CSBTBDlg::OnBnClickedButton1()
{
ShowWindow(SW_MINIMIZE);
AcAxDocLock lock;
ads_name ss, ent;
AcDbObjectId id;
LPCTSTR pszMsg[] = { _T("\n请选择设备统一编号:"), _T("") };
struct resbuf *pRb = acutBuildList(RTDXF0, DXF_EQU, 0);
int nRes = acedSSGet(_T(":$:S"), pszMsg, NULL, pRb, ss);
acutRelRb(pRb);
m_wndList.DeleteAllItems();
if (nRes == RTNORM)
{
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
int nItem = 0;
CString sNo,sName;
TCHAR szEqu[17];
AcDbEntity *pEnt = NULL;
acedSetStatusBarProgressMeter(_T("正在提取设备编号..."), 0, nLen);
for (int i = 0; i < nLen; i++)
{
acedSetStatusBarProgressMeterPos(i);
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
id.handle().getIntoAsciiBuffer(szEqu);
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
{
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
sNo = _T("");
sName = _T("");
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo);
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NAME, sName);
nItem = m_wndList.InsertItem(m_wndList.GetItemCount(), szEqu, RGB(0, 0, 0), RGB(0, 255, 0));
m_wndList.SetItemText(nItem, 1, sName);
m_wndList.SetItemText(nItem, 2, sNo);
m_wndList.SetEdit(nItem, 1);
m_wndList.SetEdit(nItem, 2);
}
pEnt->close();
}
}
acedRestoreStatusBar();
acedSSFree(ss);
}
ShowWindow(SW_NORMAL);
}
void CSBTBDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
int nItem = pNMItemActivate->iItem;
if (nItem != -1)
{
CString sHd = m_wndList.GetItemText(nItem, 0);
AcDbHandle hd((const TCHAR*)sHd);
AcDbObjectId id;
AcAxDocLock lock;
if (Acad::eOk == acdbCurDwg()->getAcDbObjectId(id, false, hd))
{
//加入选择集
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 "));
}
}
*pResult = 0;
}
//更新设备
void CSBTBDlg::OnBnClickedButton2()
{
m_wndProgress.SetRange32(0, m_wndList.GetItemCount());
m_wndProgress.SetStep(1);
m_wndProgress.ShowWindow(SW_SHOW);
CString sHd, sName, sNo;
for (int i = 0;i < m_wndList.GetItemCount();i++)
{
sHd = m_wndList.GetItemText(i, 0);
sName = m_wndList.GetItemText(i, 1);
sNo = m_wndList.GetItemText(i, 2);
AcDbHandle hd((const TCHAR *)sHd);
AcDbObjectId id;
AcAxDocLock lock;
if (Acad::eOk == acdbCurDwg()->getAcDbObjectId(id, false, hd))
{
AcDbEntity *pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite))
{
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData()->SetAt(KEY_NO, sNo);
pEntBase->GetSpecialtyData()->SetAt(KEY_NAME, sName);
}
pEnt->close();
}
}
m_wndProgress.StepIt();
}
m_wndProgress.ShowWindow(SW_HIDE);
}
bool WriteCell(_Worksheet& excelSheet, CString& sVal, CString& sCell)
{
COleVariant varCell(sCell);
Range range = excelSheet.GetRange(varCell, varCell);
COleVariant varVal(sVal);
range.SetValue(varVal);
return true;
}
//导出表单
void CSBTBDlg::OnBnClickedButton6()
{
if (m_wndList.GetItemCount() == 0)
return;
CString sFullPath = FilePath::GetSysDir();
sFullPath.MakeLower();
sFullPath.Replace(_T("\\sys"), _T("\\temp\\设备名称编号.xls"));
CString szFilter = _T("Excel 文件 (*.xls;)|*.xls||");
CFileDialog fileDlg(FALSE, _T("xls"), sFullPath, OFN_HIDEREADONLY, szFilter, acedGetAcadFrame());
int nRes = (int)fileDlg.DoModal();
if (nRes == IDOK)
{
CString sXlsNewFile = fileDlg.GetPathName();
CString sXlsTmpFile = FilePath::GetSysDir() + _T("\\设备名称编号.xls");
CString sSheetName2, sSheetName = _T("设备名称编号");
CString sCell;
BOOL bSuccess = CopyFile(sXlsTmpFile, sXlsNewFile, FALSE);
if (bSuccess)
{
::CoInitialize(NULL);
_Application excelApp;
Workbooks excelBooks;
_Workbook excelBook;
Worksheets excelSheets;
_Worksheet excelSheet;
COleVariant vResult;
COleVariant covTrue((short)TRUE), covFalse((short)FALSE);
Range range;
Range iCell;
Validation vald;
bool bOpenNow = false;
bSuccess = excelApp.CreateDispatch(_T("excel.application"));
if (bSuccess)
{
LPDISPATCH pLpDisp = NULL;
excelBooks.AttachDispatch(excelApp.GetWorkbooks());
COleVariant vOp((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant vUpdateLinks((short)0), vReadOnly((short)0), vFormat=vOp, vPassword=vOp;
COleVariant vWriteResPassword=vOp, vIgnoreReadOnlyRecommended=vOp;
COleVariant vOrigin=vOp, vDelimiter = vOp, vEditable((short)0), vNotify=vOp, vConverter=vOp, vAddToMru=vOp;
pLpDisp = excelBooks.Open(sXlsNewFile, vUpdateLinks, vReadOnly, vFormat, vPassword,
vWriteResPassword, vIgnoreReadOnlyRecommended, vOrigin, vDelimiter, vEditable,
vNotify, vConverter, vAddToMru);
if (pLpDisp == NULL)
{
AfxMessageBox(_T("启动excel 服务失败!请确认系统是否安装Excel!"));
return;
}
excelBook.AttachDispatch(pLpDisp);
//得到Worksheets
excelSheets.AttachDispatch(excelBook.GetWorksheets());
//获取sheet 数量
long lCount = excelSheets.GetCount();
for (short nSheetIndex = 1; nSheetIndex <= lCount; nSheetIndex++)
{
COleVariant varIndex(nSheetIndex);
pLpDisp = excelSheets.GetItem(varIndex);
if (pLpDisp != NULL)
{
excelSheet.AttachDispatch(pLpDisp);
sSheetName2 = excelSheet.GetName();
if (sSheetName.CompareNoCase(sSheetName2) == 0)
{
//A B C
CString sHd, sName, sNo;
for (int i = 0; i < m_wndList.GetItemCount(); i++)
{
sHd = m_wndList.GetItemText(i, 0);
sName = m_wndList.GetItemText(i, 1);
sNo = m_wndList.GetItemText(i, 2);
sCell.Format(_T("A%d"),i + 2);
WriteCell(excelSheet,sHd,sCell);
sCell.Format(_T("B%d"), i + 2);
WriteCell(excelSheet, sName, sCell);
sCell.Format(_T("C%d"), i + 2);
WriteCell(excelSheet, sNo, sCell);
}
bOpenNow = true;
break;
}
}
}
}
excelBook.Save();
excelBooks.Close();
excelApp.Quit();
excelSheet.ReleaseDispatch();
excelSheets.ReleaseDispatch();
excelBook.ReleaseDispatch();
excelBooks.ReleaseDispatch();
excelApp.ReleaseDispatch();
if (bOpenNow)
{
ShellExecute(NULL, _T("open"), sXlsNewFile, NULL, NULL, SW_SHOWNORMAL);
}
}
else
{
szFilter.Format(_T("复制文件失败!请确认模板文件%s是否存在"), sXlsTmpFile);
AfxMessageBox(szFilter);
}
}
}