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

698 lines
17 KiB
C++

#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; i<iCount; i++)
{
//pListWnd->m_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; i<iCount; i++)
{
//pListWnd->m_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;nLen<nCount;nLen++)
{
CString sItemText=m_ListDesc.GetItemText(nLen,0);
if(_tcscmp(sItemText,sText)==0)
return TRUE;
}
return FALSE;
}
void CAddBlockDlg::DeleteBlockBtwDwg(CStringArray &sBlockArr)
{
// 清除所有的图形
int nLength=m_ListDesc.GetItemCount()-(int)sBlockArr.GetSize();
m_ListDesc.DeleteAllItems();
m_ListImageDesc.DeleteImageList();
m_ListImageDesc.Create(32, 32, ILC_MASK, nLength, 0);
acDocManagerPtr()->lockDocument(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;nLen<sBlockArr.GetSize();nLen++)
{
if(pDesdTbl->getAt(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;nLen<strNameArray.GetSize();nLen++)
{
m_ListDesc.InsertItem(nLen, strNameArray.GetAt(nLen), nLen);
}
m_ListDesc.RedrawWindow();
acDocManagerPtr()->unlockDocument(curDoc());
}
void CAddBlockDlg::AddOrgListItemToDescList(CListItemArray &itemArr)
{
int nCount=m_ListDesc.GetItemCount();
for(int nLen=0;nLen<itemArr.GetSize();nLen++)
{
CListItem item=itemArr.GetAt(nLen);
int nImage=m_ListImageDesc.Add(item.m_hIcon);
m_ListDesc.InsertItem(nLen+nCount, item.m_strName, nImage);
}
m_ListDesc.RedrawWindow();
}
BOOL CAddBlockDlg::InsertBlockToDesc(CString sDwgPath,CListItemArray &itemArr)
{
CString sCommand;
AcDbObjectId RcdId;
AcDbBlockTable *pBlokTable;
AcDbObjectIdArray BlcokIds;
AcDbBlockTableRecord *pBlkTblRcd=NULL;
AcDbDatabase *pDb=NULL;
acDocManager->lockDocument(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<itemArr.GetSize();nLen++)
{
CListItem item=itemArr.GetAt(nLen);
#if ARX > 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;nLen<BlcokIds.logicalLength();nLen++)
{
CListItem item=itemArr.GetAt(nLen);
AcDbDatabase *pInsertDb=new AcDbDatabase;
if(pDb->wblock(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;nLen<nCount;nLen++)
{
LVITEM rItem;
ZeroMemory ( &rItem, sizeof(LVITEM) );
rItem.mask = LVIF_IMAGE | LVIF_STATE;//LVIF_STATE,状态
rItem.iItem = nLen;
rItem.stateMask = LVIS_SELECTED;
m_ListOrg.GetItem ( &rItem );
HICON hIcon=m_ListImageOrg.ExtractIcon(rItem.iImage);
item.m_strName=m_ListOrg.GetItemText(nLen,0);
item.m_hIcon=hIcon;
itemArr.Add(item);
m_itemArr.Add(item);
}
AddOrgListItemToDescList(itemArr);
}
void CAddBlockDlg::OnSize(UINT nType, int cx, int cy)
{
CAcUiDialog::OnSize(nType, cx, cy);
double dHDelta=5;
double dWDelta=5;
double dBtnWidth;
double dBtnHeight;
CRect BtnRect;
CRect OrgRect;
CRect DescRect;
CRect InsertRect;
CRect DeleteRect;
CRect AllIstRect;
CRect RenameRect;
CRect OkRect;
CRect CleRect;
CRect ClientRect;
GetClientRect(ClientRect);
ClientRect.DeflateRect(8,8,8,8);
CWnd *pWnd=(CWnd*)GetDlgItem(IDC_INSERTBTN);
if(pWnd==NULL)
return;
GetDlgItem(IDC_INSERTBTN)->GetWindowRect(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);
}