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

981 lines
25 KiB
C++

#include "StdAfx.h"
#include "resource.h"
#include "DockDialog.h"
#include "ChildFrame.h"
#include "MyListView.h"
#include "dbsymtb.h "
#include "AddBlockDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CDockDialog::CDockDialog(CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/)
: CAcUiDialog(CDockDialog::IDD, pParent, hInstance)
{
//{{AFX_DATA_INIT(CDockDialog)
m_pMyFrame = NULL;
//}}AFX_DATA_INIT
m_nCurrentPos = 0;
m_bFirst = FALSE;
m_bFouth = TRUE;
m_bSecond = TRUE;
m_bThree = TRUE;
m_bCurDb = FALSE;
// 加载文件类型BMP
}
void CDockDialog::DoDataExchange(CDataExchange *pDX)
{
CAcUiDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDockDialog)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDockDialog, CAcUiDialog)
//{{AFX_MSG_MAP(CDockDialog)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_DESTROY()
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText)
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown)
ON_WM_INITMENUPOPUP()
ON_COMMAND(ID_BUTTONFIRST, OnButtonfirst)
ON_COMMAND(ID_BUTTONSECOND, OnButtonsecond)
ON_COMMAND(ID_BUTTONTREE, OnButtontree)
ON_COMMAND(ID_BUTTONFOUR, OnButtonfour)
ON_COMMAND(ID_BUTTONFIVE, OnButtonfive)
ON_COMMAND(ID_BUTTONSIX, OnButtonsix)
ON_COMMAND(ID_BLOCKINSERT, OnInSertBlock)
ON_UPDATE_COMMAND_UI(ID_BLOCKINSERT, OnUpdateBlockInsert)
ON_COMMAND(ID_BLOCKINSTEAD, OnBlockInstead)
ON_UPDATE_COMMAND_UI(ID_BLOCKINSTEAD, OnUpdateBlockInstead)
ON_COMMAND(ID_BLOCKDEL, OnBlockDel)
ON_UPDATE_COMMAND_UI(ID_BLOCKDEL, OnUpdateBlockDel)
ON_COMMAND(ID_SELECTALL, OnSelectAll)
ON_UPDATE_COMMAND_UI(ID_SELECTALL, OnUpdateSelectAll)
ON_COMMAND(ID_BLOCKSET, OnBlockSet)
ON_UPDATE_COMMAND_UI(ID_BLOCKSET, OnUpdateBlockSet)
ON_UPDATE_COMMAND_UI(ID_BUTTONFIRST, OnUpdateButtonfirst)
ON_UPDATE_COMMAND_UI(ID_BUTTONSECOND, OnUpdateButtonsecond)
ON_UPDATE_COMMAND_UI(ID_BUTTONTREE, OnUpdateButtontree)
ON_UPDATE_COMMAND_UI(ID_BUTTONFOUR, OnUpdateButtonfour)
ON_UPDATE_COMMAND_UI(ID_BUTTONFIVE, OnUpdateButtonfive)
ON_UPDATE_COMMAND_UI(ID_BUTTONSIX, OnUpdateButtonsix)
ON_COMMAND(ID_MENUITEMFIRST, OnBigIcon)
ON_COMMAND(ID_MENUITEMSECOND, OnSmallIcon)
ON_COMMAND(ID_MENUITEMTREE, OnListIcon)
ON_COMMAND(ID_MENUITEMFOUR, OnReportIcon)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDockDialog message handlers
/*
BOOL CDockDialog::PreTranslateMessage(MSG* pMsg)
{
m_wndToolBar.SendMessage(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0L); //modify by hrp
return CAcUiDialog::PreTranslateMessage(pMsg);
}*/
void CDockDialog::OnUpdateBlockInsert(CCmdUI *pCmdUI)
{
if (getListCtrl().GetSelectedCount()>0)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
void CDockDialog::OnUpdateBlockInstead(CCmdUI *pCmdUI)
{
if (getListCtrl().GetSelectedCount()>0)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
void CDockDialog::OnUpdateBlockDel(CCmdUI *pCmdUI)
{
if (getListCtrl().GetSelectedCount()>0)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
void CDockDialog::OnUpdateBlockSet(CCmdUI *pCmdUI)
{
if (getListCtrl().GetSelectedCount()>0)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
void CDockDialog::OnUpdateSelectAll(CCmdUI *pCmdUI)
{
pCmdUI->Enable(TRUE);
}
void CDockDialog::OnBlockInstead()
{
CMainFrame *pMain = m_pMyFrame;
CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0);
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
pListView->BlockInstead();
}
void CDockDialog::OnBlockDel()
{
CMainFrame *pMain = m_pMyFrame;
CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0);
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
pListView->DeleteBlock();
//pListView->BlockInstead();
}
void CDockDialog::OnBlockSet()
{
CMainFrame *pMain = m_pMyFrame;
CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0);
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
pListView->SetBlockCommand();
//pListView->BlockInstead();
}
void CDockDialog::OnSelectAll()
{
CMainFrame *pMain = m_pMyFrame;
CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0);
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
pListView->SelectAll();
}
void CDockDialog::OnInSertBlock()
{
CMainFrame *pMain = m_pMyFrame;
CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0);
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
pListView->InSertBlock();
}
BOOL CDockDialog::OnInitDialog()
{
CAcUiDialog::OnInitDialog();
AfxSetResourceHandle(_hdllInstance);
//////////////////////////////////////////////////////////////////////////
// 工具条
//////////////////////////////////////////////////////////////////////////
// 增加工具条功能
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP |
CBRS_TOOLTIPS | CBRS_FLYBY|CBRS_SIZE_DYNAMIC, CRect(0, 2, 0, 0)) ||
!m_wndToolBar.LoadToolBar(IDR_DOCKTOOLBAR))
{
TRACE0(_T("未能创建工具栏\n"));
return -1;
}
m_wndToolBar.ShowWindow(SW_SHOW);
// 修改工具条为下拉样式
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
int i = m_wndToolBar.CommandToIndex(ID_BUTTONSIX);
UINT id, style;
int image;
m_wndToolBar.GetButtonInfo(i, id, style, image);
// m_wndToolBar.SetButtonInfo(i,id,TBSTYLE_DROPDOWN,image);
AfxSetResourceHandle(acedGetAcadResourceInstance());
// 重排对话框中控件位置
CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,
0, reposQuery, rcClientNow);
CPoint ptOffset(rcClientNow.left - rcClientStart.left,
rcClientNow.top - rcClientStart.top);
CRect rcChild;
CWnd *pwndChild = GetWindow(GW_CHILD);
while (pwndChild)
{
pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild, FALSE);
pwndChild = pwndChild->GetNextWindow();
}
// 对齐对话框
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
MoveWindow(rcWindow, FALSE);
// 将工具条加到对话框中
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
///////////////////////
CRect rect;
getListCtrl().GetClientRect(&rect);
getListCtrl().InsertColumn(0, _T(""), LVCFMT_LEFT, rect.right / 2, -1);
// 得到软件的安装路径
BaseFuncs::GetPathName(m_sPathName);
m_sDirPath = m_sPathName;
HBITMAP hBit = ::LoadBitmap(_hdllInstance, MAKEINTRESOURCE(IDB_FILETYPE16));
if (hBit != NULL)
m_FileTypeBMP.Attach(hBit);
else
acutPrintf(_T("\n没有找到指定的FileType16X16.bmp文件!"));
// 添加列表数据
AddItemToTreeCtrl();
/* long nStyle;
if(getListCtrl().m_hWnd!=NULL)
{
nStyle=GetWindowLong(getListCtrl().m_hWnd,GWL_STYLE );
SetWindowLong(getListCtrl().m_hWnd,GWL_STYLE,nStyle|LVS_AUTOARRANGE);
}*/
return TRUE;
}
int CDockDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CAcUiDialog::OnCreate(lpCreateStruct) == -1)
return -1;
CString strMyClass = AfxRegisterWndClass(CS_VREDRAW |
CS_HREDRAW,
::LoadCursor(NULL, IDC_ARROW),
(HBRUSH) ::GetStockObject(WHITE_BRUSH),
::LoadIcon(NULL, IDI_APPLICATION));
m_pMyFrame = new CMainFrame();
m_pMyFrame->Create(strMyClass, _T(""), WS_CHILD, CRect(0, 0, 1, 1), this);
m_pMyFrame->ShowWindow(SW_SHOW);
m_pMyFrame->MoveWindow(0, 0, 300, 300);
return 0;
}
void CDockDialog::OnSize(UINT nType, int cx, int cy)
{
CAcUiDialog::OnSize(nType, cx, cy);
if (GetDlgItem(IDC_STATIC1) == NULL)
return;
CRect cConRect, cDiaRect;
GetWindowRect(&cDiaRect);
GetDlgItem(IDC_STATIC1)->GetWindowRect(&cConRect);
ScreenToClient(&cConRect);
ScreenToClient(&cDiaRect);
cConRect.left = cConRect.left-2;
cConRect.bottom = cDiaRect.bottom;
cConRect.right = cDiaRect.right+2;
m_pMyFrame->MoveWindow(&cConRect, FALSE);
}
void CDockDialog::OnDestroy()
{
CAcUiDialog::OnDestroy();
if (m_pMyFrame)
{
m_pMyFrame->DestroyWindow();
m_pMyFrame = NULL;
}
}
BOOL CDockDialog::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (wParam)
{
case IDOK:
case IDCANCEL:
return (FALSE);
}
return CAcUiDialog::OnCommand(wParam, lParam);
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 插入块 1
void CDockDialog::OnButtonfirst()
{
SetState();
m_nCurrentPos = 0;
getTreeCtrl().DeleteAllItems();
getListCtrl().DeleteAllItems();
getPreviewCtrl().mpView->eraseAll();
// getPreviewCtrl().mpDevice->setBackgroundColor(g_BlkViewClr);
getPreviewCtrl().mpView->update();
HTREEITEM hParentItem;
hParentItem = getTreeCtrl().InsertItem(m_sIniArr[m_nCurrentPos], _ttoi(m_sIniBigIcon[m_nCurrentPos]), _ttoi(m_sIniSmlIcon[m_nCurrentPos]));
//modify by hrp
CString sIniName = m_sPathName + _T("\\tk\\Customer\\图库中心\\")+m_sIniArr[m_nCurrentPos];
ViewIni(hParentItem, sIniName);
getTreeCtrl().Expand(hParentItem, TVE_TOGGLE);
return;
}
void CDockDialog::OnUpdateButtonfirst(CCmdUI *pCmdUI)
{
pCmdUI->Enable(m_bFirst);
// pCmdUI->SetCheck(m_bFirst);
}
void CDockDialog::SetState()
{
m_bFirst = !m_bFirst;
m_bSecond = !m_bSecond;
}
// 文件视图 2
void CDockDialog::OnButtonsecond()
{
SetState();
m_nCurrentPos = 1;
getTreeCtrl().DeleteAllItems();
getListCtrl().DeleteAllItems();
getPreviewCtrl().mpView->eraseAll();
// getPreviewCtrl().mpDevice->setBackgroundColor(g_BlkViewClr);
getPreviewCtrl().mpView->update();
HTREEITEM hParentItem;
hParentItem = getTreeCtrl().InsertItem(m_sIniArr[m_nCurrentPos], _ttoi(m_sIniBigIcon[m_nCurrentPos]), _ttoi(m_sIniSmlIcon[m_nCurrentPos]));
//modify by hrp
CString sIniName = m_sPathName + _T("\\tk\\Customer\\图库中心\\")+m_sIniArr[m_nCurrentPos];
ViewIni(hParentItem, sIniName);
getTreeCtrl().Expand(hParentItem, TVE_TOGGLE);
}
void CDockDialog::OnUpdateButtonsecond(CCmdUI *pCmdUI)
{
pCmdUI->Enable(m_bSecond);
// pCmdUI->SetCheck(m_bSecond);
}
// 插入图案 3
void CDockDialog::OnButtontree()
{
m_pMyFrame->ShowListDock();
}
void CDockDialog::OnUpdateButtontree(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_pMyFrame->IsShowListDock());
}
// 显示预览 4
void CDockDialog::OnButtonfour()
{
m_pMyFrame->ShowPreViewCtrl();
}
void CDockDialog::OnUpdateButtonfour(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_pMyFrame->IsShowPreViewCtrl());
}
// 显示说明 5
void CDockDialog::OnButtonfive()
{
m_pMyFrame->ShowExplainCtrl();
}
void CDockDialog::OnUpdateButtonfive(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_pMyFrame->IsShowExplainCtrl());
}
// 显示方式 6
void CDockDialog::OnButtonsix()
{
}
void CDockDialog::OnUpdateButtonsix(CCmdUI *pCmdUI)
{
}
//工具栏提示
BOOL CDockDialog::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult)
{
CAcModuleResourceOverride res;
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
// UNICODE消息
TOOLTIPTEXTA *pTTTA = (TOOLTIPTEXTA *)pNMHDR;
TOOLTIPTEXTW *pTTTW = (TOOLTIPTEXTW *)pNMHDR;
//TCHAR szFullText[512];
CString strTipText;
CString strStatusText;
UINT nID = (UINT)pNMHDR->idFrom;
if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
{
// idFrom为工具条的HWND
nID = ::GetDlgCtrlID((HWND)nID);
}
if (nID != 0) //不为分隔符
{
strTipText.LoadString(nID);
// 得到提示的文字
strTipText = strTipText.Mid(strTipText.Find('\n', 0)+1);
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
{
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
}
else
{
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
}
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
{
_wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
}
else
{
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
}
#endif
*pResult = 0;
// 使工具条提示窗口在最上面
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE|
SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
return TRUE;
}
return TRUE;
}
// 工具条下拉消息
void CDockDialog::OnDropDown(NMHDR *pNotifyStruct, LRESULT *result)
{
CWnd *pWnd;
UINT nID;
NMTOOLBAR *pInfo = (NMTOOLBAR *)pNotifyStruct;
switch (pInfo->iItem)
{
case ID_BUTTONSIX:
pWnd = &m_wndToolBar;
nID = IDR_MENU1;
break;
default:
return;
}
CString sParentText = getTreeCtrl().m_sCurParentText;
// load and display popup menu
CPoint point;
GetCursorPos(&point);
CMenu menu;
menu.LoadMenu(nID);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
}
// 更新下拉菜单
void CDockDialog::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
if (!bSysMenu)
{
ASSERT(pPopupMenu != NULL);
// check the enabled state of various menu items
CCmdUI state;
state.m_pMenu = pPopupMenu;
ASSERT(state.m_pOther == NULL);
state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
state.m_nIndex++)
{
state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
if (state.m_nID == 0)
continue; // menu separator or invalid cmd - ignore it
ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pMenu != NULL);
if (state.m_nID == (UINT)-1)
{
// possibly a popup menu, route to first item of that popup
state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
if (state.m_pSubMenu == NULL ||
(state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
state.m_nID == (UINT)-1)
{
continue; // first item of popup can't be routed to
}
state.DoUpdate(this, FALSE); // popups are never auto disabled
}
else
{
// normal menu item
// Auto enable/disable if command is _not_ a system command
state.m_pSubMenu = NULL;
state.DoUpdate(this, state.m_nID < 0xF000);
}
}
}
}
CListCtrl &CDockDialog::getListCtrl()
{
CMainFrame *pMain = m_pMyFrame;
CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0);
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
return pListView->GetListCtrl();
}
CCoolTreeCtrl &CDockDialog::getTreeCtrl()
{
return m_pMyFrame->m_wndMyDialogBar.m_tree;
}
CGsPreviewCtrl &CDockDialog::getPreviewCtrl()
{
CMainFrame *pMain = m_pMyFrame;
CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0);
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
return pChild->m_wndPreViewBar.m_previewCtrl; //hrp
}
CHYCoolBar3 &CDockDialog::getExPlainBar()
{
CMainFrame *pMain = m_pMyFrame;
CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0);
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
return pChild->m_wndExplainBar;
}
void CDockDialog::GetIniArray()
{
CString sIniName = m_sPathName+_T("\\tk\\Customer\\图库中心");
//GetFolderByIni(sIniName,m_sIniArr);
BaseFuncs::GetInIFolderAndIcon(sIniName, m_sIniArr, m_sIniBigIcon, m_sIniSmlIcon);
}
void CDockDialog::AddItemToTreeCtrl()
{
if (!getTreeCtrl().m_hWnd)
return;
// 加载ICON到imageList
m_TreeImage.Create(16, 16, ILC_MASK, 15, 0);
m_TreeImage.Add(&m_FileTypeBMP, RGB(255, 255, 255));
getTreeCtrl().SetImageList(&m_TreeImage, TVSIL_NORMAL);
getTreeCtrl().SetIndent(18);
getTreeCtrl().SetItemHeight(18);
//////////////////////////////////////////////////////////////////////////
// 添加数据 **************************************************************
CStringArray sDwgNameArray;
CString sDirPath;
HTREEITEM hItem;// hItemChild;
sDirPath = m_sPathName + _T("\\tk\\Customer\\图库中心\\图块库");
HTREEITEM hParentItem;
hParentItem = hItem = getTreeCtrl().InsertItem(_T("图块库"), 0, 1);
ViewIni(hParentItem, sDirPath);
hParentItem = hItem = getTreeCtrl().InsertItem(_T("用户图库"), 0, 1);
sDirPath = m_sPathName + _T("\\tk\\Customer\\图库中心\\用户图库");
ViewIni(hParentItem, sDirPath);
}
BOOL IsOpenFile(CString strFileName, AcApDocument *&pOpenDoc)
{
strFileName.MakeLower();
BOOL bFileAlreadyOpened = FALSE;
AcApDocumentIterator *pIterator;
pIterator = acDocManager->newAcApDocumentIterator();
AcApDocument *pDoc;
CString strDocName;
for (; !pIterator->done(); pIterator->step())
{
pDoc = pIterator->document();
strDocName = pDoc->fileName();
strDocName.MakeLower();
if (strFileName == strDocName)
{
pOpenDoc = pDoc;
// acDocManager->setCurDocument(pDoc,AcAp::kNone,true);
bFileAlreadyOpened = TRUE;
break;
}
}
delete pIterator;
return bFileAlreadyOpened;
}
void CDockDialog::AddItemToListCtrl(CString sDwgName) //更新listview
{
if (!getListCtrl().m_hWnd)
return;
getListCtrl().DeleteAllItems();
CString sCurParentText = getTreeCtrl().m_sCurParentText;
CString sCurSltText = getTreeCtrl().m_sCurSltText;
m_ListImage.DeleteImageList();
{
AcDbDatabase *pDb = NULL;
AcDbBlockTable *pBlockTable = NULL;
AcDbBlockTableIterator *pBlkItr = NULL;
AcDbBlockTableRecord *pBlkTlbRcd = NULL;
CStringArray strNameArray;
// 得到一个DWG文件内部的所有块
AcApDocument *pDoc = NULL;
BOOL bIsOpenDocument = FALSE;
if (bIsOpenDocument = IsOpenFile(sDwgName, pDoc))
{
pDb = pDoc->database();
acDocManagerPtr()->lockDocument(curDoc());
}
else
{
acDocManagerPtr()->lockDocument(curDoc());
pDb = new AcDbDatabase(Adesk::kFalse);
Acad::ErrorStatus res1 = pDb->readDwgFile(sDwgName);
}
Acad::ErrorStatus res = pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
if (res != Acad::eOk)
{
if (!bIsOpenDocument)
delete pDb;
acDocManagerPtr()->unlockDocument(curDoc());
return;
}
pBlockTable->newIterator(pBlkItr);
if (pBlkItr == NULL)
{
pBlockTable->close();
delete pBlkItr;
if (!bIsOpenDocument)
delete pDb;
acDocManagerPtr()->unlockDocument(curDoc());
return;
}
// 得到内部块的数量
int iNum = 0;
for (; !pBlkItr->done(); pBlkItr->step())
{
iNum++;
}
delete pBlkItr;
pBlockTable->newIterator(pBlkItr);
//ILC_COLOR8
m_ListImage.Create(32, 32, ILC_MASK, iNum, 0);
// AfxMessageBox("hrp");
iNum = 0;
for (; !pBlkItr->done(); pBlkItr->step())
{
ACHAR *RcdName;
if (pBlkItr->getRecord(pBlkTlbRcd, AcDb::kForRead)!=Acad::eOk)
continue;
pBlkTlbRcd->getName(RcdName);
pBlkTlbRcd->close();
CString sName = RcdName;
if (RcdName)
free(RcdName);
if (sName.Find(_T("*"))>=0)
continue;
// 根据一个内部块,得到ad对应的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_ListImage.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_ListImage.Add(hIcon);
strNameArray.Add(sName);
}
}
pBlockTable->close();
delete pBlkItr;
if (!bIsOpenDocument)
delete pDb;
acDocManagerPtr()->unlockDocument(curDoc());
// 插入到ListCtrl中
int iCount = (int)strNameArray.GetSize();
//设置listwnd中的说明数组
getListCtrl().SetImageList(&m_ListImage, TVSIL_NORMAL);
getListCtrl().SetImageList(&m_ListImage, LVSIL_SMALL);
for (int i = 0; i<iCount; i++)
{
//pListWnd->m_sExplains.SetAt(i,"未找到图块说明");
getListCtrl().InsertItem(i, strNameArray.GetAt(i), i);
//CListCtrl
}
}
}
void CDockDialog::ViewIni(HTREEITEM hParent, CString sIniName)
{
CStringArray sSubDir;
BaseFuncs::GetSubDir(sIniName, sSubDir);
int nLen = 0;
for (nLen = 0; nLen<sSubDir.GetSize(); nLen++)
{
HTREEITEM hParentNew;
hParentNew = getTreeCtrl().InsertItem(sSubDir.GetAt(nLen), 0, 1, hParent);
ViewIni(hParentNew, sIniName+_T("\\")+sSubDir.GetAt(nLen));
}
CStringArray sFileNameArr;
BaseFuncs::GetFileNameByDir(sIniName, _T(".dwg"), sFileNameArr);
for (nLen = 0; nLen<sFileNameArr.GetSize(); nLen++)
{
CString strFileName = sFileNameArr[nLen];
strFileName.TrimLeft();
strFileName.TrimRight();
if (strFileName.IsEmpty())
continue;
getTreeCtrl().InsertItem(sFileNameArr.GetAt(nLen), 3, 4, hParent);
}
}
void CDockDialog::ColorHatch(int nColor) //填充
{
if (acedGetAcadDwgView()!=NULL)
acedGetAcadDwgView()->SetFocus(); //设置CAD焦点
// CAD_SendStringToExecute("pline",FALSE);
// return;
CString sText;
AcDbObjectIdArray ExtIds;
AcDbObjectIdArray DftIds;
AcDbObjectId ExtId;
AcDbObjectId DftId;
ads_point pt;
ads_name first;
ads_name last;
acedInitGet(0, _T("D S"));
ACHAR kw[10];
ads_name ExtName;
ads_name DftName;
ads_point OutPnt;
ads_point InPnt;
AcDbObjectId FirstId;
AcDbObjectId LastId;
while (1)
{
acdbEntLast(first);
acdbGetObjectId(FirstId, first);
acedInitGet(0, _T("S"));
//绘边界(D)/
switch (acedGetPoint(NULL, _T("\n请在要填充的区域内点取一点: 或[选边界(S)]"), pt))
{
case RTNORM:
ExtIds.setLogicalLength(0);
DftIds.setLogicalLength(0);
sText.Format(_T("-boundary %0.2f,%0.2f "), pt[0], pt[1]);
BaseFuncs::CAD_SendStringToExecute(sText, TRUE);
BaseFuncs::ClearAcadCmdLine();
acdbEntLast(last);
acdbGetObjectId(LastId, last);
if (FirstId!=LastId)
{
ExtIds.append(LastId);
acdbEntNext(first, first);
acdbGetObjectId(FirstId, first);
if (FirstId!=LastId)
{
DftIds.append(FirstId);
}
BaseFuncs::makeHatch3(_T("SOLID"), ExtIds, DftIds, nColor);
BaseFuncs::DeleteEnt(LastId);
if (DftIds.logicalLength()>0)
BaseFuncs::DeleteEnt(FirstId);
}
break;
case RTKWORD:
acedGetInput(kw);
switch (kw[0])
{
case 'D':
BaseFuncs::DrawD(DftId);
{
ExtIds.setLogicalLength(0);
DftIds.setLogicalLength(0);
DftIds.append(DftId);
BaseFuncs::makeHatch3(_T("SOLID"), ExtIds, DftIds, nColor);
BaseFuncs::ClearAcadCmdLine();
}
break;
case 'S':
ExtIds.setLogicalLength(0);
DftIds.setLogicalLength(0);
if (acedEntSel(_T("\n选择要填充的边界:"), ExtName, OutPnt)!=RTNORM)
return;
acedEntSel(_T("\n选择内部孤岛边界:"), DftName, InPnt);
if (acdbGetObjectId(ExtId, ExtName)==Acad::eOk)
ExtIds.append(ExtId);
if (acdbGetObjectId(DftId, DftName)==Acad::eOk)
DftIds.append(DftId);
BaseFuncs::makeHatch3(_T("SOLID"), ExtIds, DftIds, nColor);
BaseFuncs::ClearAcadCmdLine();
break;
default:
BaseFuncs::ClearAcadCmdLine();
return;
}
break;
default:
BaseFuncs::ClearAcadCmdLine();
return;
}
}
}
void CDockDialog::patternHatch(CString sPattern) //填充
{
if (acedGetAcadDwgView()!=NULL)
acedGetAcadDwgView()->SetFocus(); //设置CAD焦点
CString sText;
AcDbObjectIdArray ExtIds;
AcDbObjectIdArray DftIds;
AcDbObjectId ExtId;
AcDbObjectId DftId;
ads_point pt;
ads_name first;
ACHAR kw[10];
AcDbObjectId FirstId;
AcDbObjectId LastId;
acdbEntLast(first);
acdbGetObjectId(FirstId, first);
double dAngle = 0.0;
double dScale = 10;
if ((acedGetReal(_T("\n输入角度(0.0):"), &dAngle)==RTCAN))
return;
if (acedGetReal(_T("\n放大比例(10):"), &dScale)==RTCAN)
return;
CString sNew;
acedInitGet(0, _T("S"));
//绘边界(D)/
switch (acedGetPoint(NULL, _T("\n请在要填充的区域内点取一点: 或[选边界(S)]"), pt))
{
case RTNORM:
ExtIds.setLogicalLength(0);
DftIds.setLogicalLength(0);
sText = _T("-bhatch p ") +sPattern;
sNew.Format(_T(" %0.2f %0.2f %0.2f,%0.2f "), dScale, dAngle, pt[0], pt[1]);
sText = sText+sNew;
BaseFuncs::CAD_SendStringToExecute(sText, TRUE);
BaseFuncs::ClearAcadCmdLine();
return;
case RTKWORD:
acedGetInput(kw);
switch (kw[0])
{
case 'D':
break;
case 'S':
sText = _T("hatch ") +sPattern;
sNew.Format(_T(" %0.2f %0.2f "), dScale, dAngle);
sText = sText+sNew;
BaseFuncs::CAD_SendStringToExecute(sText, FALSE);
return;
default:
BaseFuncs::ClearAcadCmdLine();
return;
}
break;
default:
BaseFuncs::ClearAcadCmdLine();
return;
}
}
void CDockDialog::OnBigIcon() //大图标
{
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
pListView->ModifyStyle(LVS_TYPEMASK, LVS_ICON);
}
void CDockDialog::OnSmallIcon() //小图标
{
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
pListView->ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);
}
void CDockDialog::OnListIcon() //列表
{
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
pListView->ModifyStyle(LVS_TYPEMASK, LVS_LIST);
}
void CDockDialog::OnReportIcon() //详细资料
{
CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0)));
CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0));
pListView->ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
}