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