#include "stdafx.h" #include "AddBlockDlg.h" #include "dbsymtb.h " #include "RnameBlkDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CAddBlockDlg::CAddBlockDlg(CWnd* pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAcUiDialog(CAddBlockDlg::IDD, pParent, hInstance) { //{{AFX_DATA_INIT(CAddBlockDlg) m_pDescDb=NULL; //}}AFX_DATA_INIT m_bAddCur=FALSE; } CAddBlockDlg::~CAddBlockDlg() { if(m_pDescDb!=NULL) delete m_pDescDb; } void CAddBlockDlg::DoDataExchange(CDataExchange* pDX) { CAcUiDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAddBlockDlg) DDX_Control(pDX, IDC_LISTORG, m_ListOrg); DDX_Control(pDX, IDC_LISTDESC, m_ListDesc); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAddBlockDlg, CAcUiDialog) //{{AFX_MSG_MAP(CAddBlockDlg) ON_BN_CLICKED(IDC_INSERTBTN, OnInsertbtn) ON_BN_CLICKED(IDC_DELETEBTN, OnDeletebtn) ON_BN_CLICKED(IDC_BDELETEALLBTN, OnBdeleteallbtn) ON_WM_SIZE() ON_BN_CLICKED(IDC_BDRENAME, OnBdrename) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAddBlockDlg message handlers void CAddBlockDlg::OnOK() { InsertBlockToDesc(m_sOrgPath,m_itemArr); Acad::ErrorStatus es=m_pDescDb->saveAs(m_sDescPath); if(es!=Acad::eOk) AfxMessageBox(_T("\n保存失败")); CAcUiDialog::OnOK(); } void CAddBlockDlg::OnCancel() { CAcUiDialog::OnCancel(); } void CAddBlockDlg::SetOrgPath(CString sOrgPath) { m_sOrgPath=sOrgPath; } void CAddBlockDlg::SetDescPath(CString sDescPath) { m_sDescPath=sDescPath; } void CAddBlockDlg::SetOrgList() { m_ListOrg.DeleteAllItems(); // 清除所有的图形 m_ListImageOrg.DeleteImageList(); AcDbDatabase *pDb = NULL; AcDbBlockTable *pBlockTable = NULL; AcDbBlockTableIterator *pBlkItr = NULL; AcDbBlockTableRecord *pBlkTlbRcd=NULL; CStringArray strNameArray; // 得到一个DWG文件内部的所有块 acDocManagerPtr()->lockDocument(curDoc()); if(!m_bAddCur) { pDb = new AcDbDatabase(Adesk::kFalse); Acad :: ErrorStatus res1 = pDb->readDwgFile(m_sOrgPath); } else pDb=acdbHostApplicationServices()->workingDatabase(); Acad :: ErrorStatus res = pDb->getSymbolTable(pBlockTable, AcDb::kForRead); if(res != Acad::eOk) { acDocManagerPtr()->unlockDocument(curDoc()); if(!m_bAddCur) delete pDb; return; } pBlockTable->newIterator(pBlkItr); if(pBlkItr == NULL) { pBlockTable->close(); delete pBlkItr; if(!m_bAddCur) delete pDb; acDocManagerPtr()->unlockDocument(curDoc()); return; } // 得到内部块的数量 int iNum = 0; for(; !pBlkItr->done(); pBlkItr->step()) { iNum++; } delete pBlkItr; pBlockTable->newIterator(pBlkItr); m_ListImageOrg.Create(32, 32, ILC_MASK, iNum, 0); ACHAR *RcdName; iNum=0; for(;!pBlkItr->done();pBlkItr->step()) { pBlkItr->getRecord(pBlkTlbRcd,AcDb::kForWrite); pBlkTlbRcd->getName(RcdName); pBlkTlbRcd->close(); CString sName=RcdName; free(RcdName); if(sName.Find(_T("*"))>=0) continue; // 根据一个内部块,得到对应的ICON if(pBlkTlbRcd->hasPreviewIcon()) { AcDbBlockTableRecord::PreviewIcon previewIcon; pBlkTlbRcd->getPreviewIcon(previewIcon); HANDLE hDib = BaseFuncs::readDibFromMemory((LPVOID)previewIcon.asArrayPtr()); HBITMAP hBitmap = BaseFuncs::BitmapFromDib(hDib, NULL); if(hBitmap) { m_ListImageOrg.Add(CBitmap::FromHandle(hBitmap), RGB(255, 0, 255)); ::DeleteObject(hBitmap); strNameArray.Add(sName); } if(hDib) GlobalFree(hDib); } else { HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON1); m_ListImageOrg.Add(hIcon); strNameArray.Add(sName); } } pBlockTable->close(); delete pBlkItr; if(!m_bAddCur) delete pDb; acDocManagerPtr()->unlockDocument(curDoc()); // 插入到ListCtrl中 int iCount = (int)strNameArray.GetSize(); //设置listwnd中的说明数组 m_ListOrg.SetImageList(&m_ListImageOrg, TVSIL_NORMAL); m_ListOrg.SetImageList(&m_ListImageOrg, LVSIL_SMALL); for(int i=0; im_sExplains.SetAt(i,"未找到图块说明"); m_ListOrg.InsertItem(i, strNameArray.GetAt(i), i); } m_ListOrg.RedrawWindow(); } void CAddBlockDlg::SetDescList() { // 清除所有的图形 AcDbDatabase *pDb = NULL; AcDbBlockTable *pBlockTable = NULL; AcDbBlockTableIterator *pBlkItr = NULL; AcDbBlockTableRecord *pBlkTlbRcd=NULL; CStringArray strNameArray; // 得到一个DWG文件内部的所有块 acDocManagerPtr()->lockDocument(curDoc()); pDb = new AcDbDatabase(Adesk::kFalse); Acad :: ErrorStatus res1 = pDb->readDwgFile(m_sDescPath); Acad :: ErrorStatus res = pDb->getSymbolTable(pBlockTable, AcDb::kForRead); if(res != Acad::eOk) { acDocManagerPtr()->unlockDocument(curDoc()); delete pDb; return; } pBlockTable->newIterator(pBlkItr); if(pBlkItr == NULL) { pBlockTable->close(); delete pBlkItr; delete pDb; acDocManagerPtr()->unlockDocument(curDoc()); return; } // 得到内部块的数量 int iNum = 0; for(; !pBlkItr->done(); pBlkItr->step()) { iNum++; } delete pBlkItr; pBlockTable->newIterator(pBlkItr); m_ListImageDesc.Create(32, 32, ILC_MASK, iNum, 0); ACHAR *RcdName; iNum=0; for(;!pBlkItr->done();pBlkItr->step()) { pBlkItr->getRecord(pBlkTlbRcd,AcDb::kForWrite); pBlkTlbRcd->getName(RcdName); pBlkTlbRcd->close(); CString sName=RcdName; free(RcdName); if(sName.Find(_T("*"))>=0) continue; // 根据一个内部块,得到对应的ICON if(pBlkTlbRcd->hasPreviewIcon()) { AcDbBlockTableRecord::PreviewIcon previewIcon; pBlkTlbRcd->getPreviewIcon(previewIcon); HANDLE hDib = BaseFuncs::readDibFromMemory((LPVOID)previewIcon.asArrayPtr()); HBITMAP hBitmap = BaseFuncs::BitmapFromDib(hDib, NULL); if(hBitmap) { m_ListImageDesc.Add(CBitmap::FromHandle(hBitmap), RGB(255, 0, 255)); ::DeleteObject(hBitmap); strNameArray.Add(sName); } if(hDib) GlobalFree(hDib); } else { HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON1); m_ListImageOrg.Add(hIcon); strNameArray.Add(sName); } } pBlockTable->close(); delete pBlkItr; delete pDb; acDocManagerPtr()->unlockDocument(curDoc()); // 插入到ListCtrl中 int iCount = (int)strNameArray.GetSize(); //设置listwnd中的说明数组 m_ListDesc.SetImageList(&m_ListImageDesc, TVSIL_NORMAL); m_ListDesc.SetImageList(&m_ListImageDesc, LVSIL_SMALL); for(int i=0; im_sExplains.SetAt(i,"未找到图块说明"); m_ListDesc.InsertItem(i, strNameArray.GetAt(i), i); // m_ListDesc.SetItemData(i,(DWORD*)strNameArray.GetAt(i)); } m_ListDesc.RedrawWindow(); } BOOL CAddBlockDlg::OnInitDialog() { CAcUiDialog::OnInitDialog(); acDocManagerPtr()->lockDocument(curDoc()); m_pDescDb=new AcDbDatabase(Adesk::kFalse); m_pDescDb->readDwgFile(m_sDescPath); acDocManagerPtr()->unlockDocument(curDoc()); // TODO: Add extra initialization here SetDescList(); SetOrgList(); return TRUE; } BOOL CAddBlockDlg::findTextInListDesc(CString sText) { int nCount=m_ListDesc.GetItemCount(); for(int nLen=0;nLenlockDocument(curDoc()); CStringArray strNameArray; AcDbBlockTableRecord *pDescTblRcd=NULL; AcDbBlockTableIterator *pBlkItr=NULL; AcDbBlockTable *pDesdTbl; if(m_pDescDb->getBlockTable(pDesdTbl,AcDb::kForWrite)!=Acad::eOk) { acDocManagerPtr()->unlockDocument(curDoc()); return; } int nLen=0; for( nLen=0;nLengetAt(sBlockArr.GetAt(nLen),pDescTblRcd,AcDb::kForWrite)==Acad::eOk) { Acad::ErrorStatus es=pDescTblRcd->erase(); if(es!=Acad::eOk) { pDescTblRcd->close(); continue; } pDescTblRcd=NULL; } } pDesdTbl->newIterator(pBlkItr); ACHAR *RcdName; for(;!pBlkItr->done();pBlkItr->step()) { if(pBlkItr->getRecord(pDescTblRcd,AcDb::kForWrite)!=Acad::eOk) continue; pDescTblRcd->getName(RcdName); CString sName=RcdName; free(RcdName); if(sName.Find(_T("*"))>=0) continue; // 根据一个内部块,得到对应的ICON if(pDescTblRcd->hasPreviewIcon()) { AcDbBlockTableRecord::PreviewIcon previewIcon; pDescTblRcd->getPreviewIcon(previewIcon); HANDLE hDib = BaseFuncs::readDibFromMemory((LPVOID)previewIcon.asArrayPtr()); HBITMAP hBitmap = BaseFuncs::BitmapFromDib(hDib, NULL); if(hBitmap) { m_ListImageDesc.Add(CBitmap::FromHandle(hBitmap), RGB(255, 0, 255)); ::DeleteObject(hBitmap); strNameArray.Add(sName); } if(hDib) GlobalFree(hDib); } else { HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON1); m_ListImageOrg.Add(hIcon); strNameArray.Add(sName); } pDescTblRcd->close(); } delete pBlkItr; pDesdTbl->close(); m_ListDesc.SetImageList(&m_ListImageDesc, TVSIL_NORMAL); m_ListDesc.SetImageList(&m_ListImageDesc, LVSIL_SMALL); for(nLen=0;nLenunlockDocument(curDoc()); } void CAddBlockDlg::AddOrgListItemToDescList(CListItemArray &itemArr) { int nCount=m_ListDesc.GetItemCount(); for(int nLen=0;nLenlockDocument(curDoc()); if(m_bAddCur) { pDb=acdbHostApplicationServices()->workingDatabase(); } else { pDb=new AcDbDatabase(Adesk::kFalse); pDb->readDwgFile(sDwgPath); } if(pDb->getBlockTable(pBlokTable,AcDb::kForRead)==Acad::eOk) { for(int nLen=0;nLen 24 if(pBlokTable->getAt(item.m_strName,RcdId)==Acad::eOk) #else if(pBlokTable->getAt(item.m_strName,RcdId,AcDb::kForRead)==Acad::eOk) #endif { BlcokIds.append(RcdId); } else { itemArr.RemoveAt(nLen); nLen--; } } pBlokTable->close(); } for( int nLen=0;nLenwblock(pInsertDb,BlcokIds[nLen])==Acad::eOk) { Acad::ErrorStatus es=m_pDescDb->insert(RcdId,item.m_strName,pInsertDb); AcDbBlockTableRecord *pRcd=NULL; BOOL bHasIcon=FALSE; AcDbBlockTableRecord::PreviewIcon vieIcon; if(acdbOpenObject(pRcd,RcdId,AcDb::kForWrite)==Acad::eOk) { if(!pRcd->hasPreviewIcon()) //没有icon { // pRcd->setPreviewIcon( vieIcon); bHasIcon=pRcd->hasPreviewIcon(); } pRcd->close(); pRcd=NULL; } } delete pInsertDb; } if(!m_bAddCur) delete pDb; acDocManager->unlockDocument(curDoc()); return TRUE; } BOOL CAddBlockDlg::ClearAcadCmdLine() { HWND hAcadDocWnd=adsw_acadDocWnd(); if (hAcadDocWnd == NULL) return false; ::SendMessage(hAcadDocWnd, WM_CHAR, VK_ESCAPE, 0); ::SendMessage(hAcadDocWnd, WM_CHAR, VK_ESCAPE, 0); acedPostCommandPrompt(); return true; } void CAddBlockDlg::OnInsertbtn() { // TODO: Add your control notification handler code here CString sBlockName; POSITION pos = m_ListOrg.GetFirstSelectedItemPosition(); if (pos == NULL) TRACE0(_T("No items were selected!\n")); else { CListItemArray itemArr; CStringArray sBlockArr; while (pos) { CListItem item; int nItem = m_ListOrg.GetNextSelectedItem(pos); sBlockName=m_ListOrg.GetItemText(nItem,0); LVITEM rItem; ZeroMemory ( &rItem, sizeof(LVITEM) ); rItem.mask = LVIF_IMAGE | LVIF_STATE;//LVIF_STATE,状态 rItem.iItem = nItem; rItem.stateMask = LVIS_SELECTED; m_ListOrg.GetItem ( &rItem ); sBlockArr.Add(sBlockName); HICON hIcon=m_ListImageOrg.ExtractIcon(rItem.iImage); item.m_strName=sBlockName; item.m_hIcon=hIcon; itemArr.Add(item); m_itemArr.Add(item); } AddOrgListItemToDescList(itemArr); } } void CAddBlockDlg::OnDeletebtn() { CString sBlockName; POSITION pos = m_ListDesc.GetFirstSelectedItemPosition(); if (pos == NULL) TRACE0(_T("No items were selected!\n")); else { CStringArray sBlockArr; while (pos) { int nItem = m_ListDesc.GetNextSelectedItem(pos); sBlockName=m_ListDesc.GetItemText(nItem,0); sBlockArr.Add(sBlockName); // m_ListDesc.DeleteItem(nItem); } DeleteBlockBtwDwg(sBlockArr); m_ListDesc.RedrawWindow(); } } void CAddBlockDlg::OnBdeleteallbtn() { CStringArray sItemArray; // TODO: Add your control notification handler code here int nCount=m_ListOrg.GetItemCount(); CListItemArray itemArr; CListItem item; for(int nLen=0;nLenGetWindowRect(BtnRect); InsertRect=BtnRect; dBtnWidth=BtnRect.Width(); dBtnHeight=BtnRect.Height(); // GetDlgItem(IDC_LISTORG)->GetWindowRect(OrgRect); OrgRect.bottom=(LONG)(ClientRect.bottom-dBtnHeight-dHDelta); //设置底步 OrgRect.left=ClientRect.left; OrgRect.top=ClientRect.top; OrgRect.right=(LONG)(OrgRect.left+ClientRect.Width()/2-dBtnWidth/2-dWDelta); GetDlgItem(IDC_LISTORG)->MoveWindow(OrgRect); // GetDlgItem(IDC_LISTDESC)->GetWindowRect(DescRect); DescRect.bottom=(LONG)(ClientRect.bottom-dBtnHeight-dHDelta); //设置底步 DescRect.top=ClientRect.top; DescRect.right=ClientRect.right; DescRect.left=DescRect.right-OrgRect.Width(); GetDlgItem(IDC_LISTDESC)->MoveWindow(DescRect); // GetDlgItem(IDC_INSERTBTN)->GetWindowRect(InsertRect); InsertRect.left=(LONG)(OrgRect.right+dWDelta);//ClientRect.Width()/2-dBtnWidth/2; InsertRect.right=(LONG)(InsertRect.left+dBtnWidth); InsertRect.top=ClientRect.Height()/5; InsertRect.bottom=(LONG)(InsertRect.top+dBtnHeight); GetDlgItem(IDC_INSERTBTN)->MoveWindow(InsertRect); // DeleteRect=InsertRect; DeleteRect.top+=ClientRect.Height()/5; DeleteRect.bottom+=ClientRect.Height()/5; GetDlgItem(IDC_DELETEBTN)->MoveWindow(DeleteRect); // AllIstRect=DeleteRect; AllIstRect.top+=ClientRect.Height()/5; AllIstRect.bottom+=ClientRect.Height()/5; GetDlgItem(IDC_BDELETEALLBTN)->MoveWindow(AllIstRect); // RenameRect=AllIstRect; RenameRect.top+=ClientRect.Height()/5; RenameRect.bottom+=ClientRect.Height()/5; GetDlgItem(IDC_BDRENAME)->MoveWindow(RenameRect); //ok OkRect.right=OrgRect.right; OkRect.left=(LONG)(OkRect.right-dBtnWidth); OkRect.bottom=ClientRect.bottom; OkRect.top=(LONG)(OkRect.bottom-dBtnHeight); GetDlgItem(IDOK)->MoveWindow(OkRect); //cancle CleRect.left=DescRect.left; CleRect.right=(LONG)(CleRect.left+dBtnWidth); CleRect.bottom=ClientRect.bottom; CleRect.top=(LONG)(CleRect.bottom-dBtnHeight); GetDlgItem(IDCANCEL)->MoveWindow(CleRect); } void CAddBlockDlg::OnBdrename() { // TODO: Add your control notification handler code here CString sOldBldName; POSITION pos = m_ListDesc.GetFirstSelectedItemPosition(); if (pos == NULL) TRACE0(_T("No items were selected!\n")); int nItem = m_ListDesc.GetNextSelectedItem(pos); sOldBldName=m_ListDesc.GetItemText(nItem,0); CRnameBlkDlg dlg; dlg.m_sOldBlkName=sOldBldName; if(dlg.DoModal()!=IDOK) return; CString sNewBlkName=dlg.m_sNewBlockName; if(BaseFuncs::RenameBlock(m_pDescDb,sOldBldName,sNewBlkName)) m_ListDesc.SetItemText(nItem,0,sNewBlkName); }