397 lines
9.3 KiB
C++
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);
|
|
}
|
|
}
|
|
}
|