3361 lines
89 KiB
C++
3361 lines
89 KiB
C++
// BlockManDlg.cpp : implementation file
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "BlockManDlg.h"
|
||
#include "Finddlg.h"
|
||
#include "XFilePathName.h"
|
||
#include "BlkManReplaceOption.h"
|
||
#include "Ayrdlg.h"
|
||
#include "Progresswnd.h"
|
||
|
||
#include "NewDbfAccessTools.h"
|
||
|
||
#ifdef _DEBUG
|
||
#define new DEBUG_NEW
|
||
#undef THIS_FILE
|
||
static char THIS_FILE[] = __FILE__;
|
||
#endif
|
||
|
||
//GEOAPI BOOL arxWBlock(PickSet &ss, const TCHAR* szFileName, XPoint ptIns);
|
||
extern TARCH_IMPEXP int g_nRunMode;
|
||
//extern TARCH_IMPEXP int DragInsertBlock1(const TCHAR *szBlock, int nFlag, const AcGeScale3d &scales);
|
||
extern TARCH_EXP int DragInsertBlock(const TCHAR *szBlock, int nFlag, const AcGeScale3d &scales);
|
||
XString GetBlbFromFileName(LPCTSTR totalName);
|
||
void Copy2Temp(const TCHAR* szFileName, BOOL IsCopy);
|
||
extern BOOL CreateTKFile(const TCHAR *pszFile);
|
||
extern int ProcessBlockInsert(PickSet &ss);
|
||
//extern void MakeVisible(PickSet &ss, bool bTrue);
|
||
//extern GEOAPI int GetPickSetByGroup(const TCHAR *szGroup, PickSet &ss);
|
||
const UINT myMenuID = 9000;
|
||
int CBlockManDlg::m_nPageRow = 3;
|
||
int CBlockManDlg::m_nPageColumn = 2;
|
||
int CBlockManDlg::m_nMaxRecentBlb = 6;
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CBlockManDlg dialog
|
||
|
||
|
||
IMPLEMENT_DYNAMIC(CBlockManDlg, CTKImageDlg)
|
||
CBlockManDlg::CBlockManDlg(CWnd* pParent /*=NULL*/)
|
||
: CTKImageDlg(CBlockManDlg::IDD, pParent)
|
||
{
|
||
//{{AFX_DATA_INIT(CBlockManDlg)
|
||
//}}AFX_DATA_INIT
|
||
m_hOldItem = NULL;
|
||
m_dragTarget=NULL;
|
||
m_bCellIsDragging = FALSE;
|
||
m_bNodeIsDragging = FALSE;
|
||
m_nOpenMode = 0;
|
||
m_nMenuItem = 0;
|
||
m_bBiginEdit = FALSE;
|
||
m_bInitReady = FALSE;
|
||
m_bMultiSel = TRUE; //SR ADD 2002/7/25
|
||
m_csCopyTKFile = _T(""); //SR ADD 2002/7/25
|
||
|
||
InitBaseData();
|
||
}
|
||
|
||
CBlockManDlg::CBlockManDlg(const TCHAR* szLibName, int nOpenMode, CWnd* pParent)
|
||
: CTKImageDlg(CBlockManDlg::IDD, pParent)
|
||
{
|
||
m_hOldItem = NULL;
|
||
m_dragTarget=NULL;
|
||
m_bCellIsDragging = FALSE;
|
||
m_bBiginEdit = FALSE;
|
||
m_bInitReady = FALSE;
|
||
m_bMultiSel = TRUE;
|
||
|
||
m_nOpenMode = nOpenMode;
|
||
m_xsLibName = szLibName;
|
||
InitBaseData();
|
||
}
|
||
|
||
CBlockManDlg::CBlockManDlg(const TCHAR* szLibName, int nOpenMode, const TCHAR* szBlkName, CWnd* pParent)
|
||
: CTKImageDlg(CBlockManDlg::IDD, pParent)
|
||
{
|
||
m_hOldItem = NULL;
|
||
m_dragTarget=NULL;
|
||
m_bCellIsDragging = FALSE;
|
||
m_bBiginEdit = FALSE;
|
||
m_bInitReady = FALSE;
|
||
m_bMultiSel = TRUE;
|
||
|
||
m_nOpenMode = nOpenMode;
|
||
m_xsBlkName = szBlkName;
|
||
m_xsLibName = szLibName;
|
||
InitBaseData();
|
||
}
|
||
|
||
void CBlockManDlg::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CTKImageDlg::DoDataExchange(pDX);
|
||
//{{AFX_DATA_MAP(CBlockManDlg)
|
||
//}}AFX_DATA_MAP
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CBlockManDlg, CTKImageDlg)
|
||
//{{AFX_MSG_MAP(CBlockManDlg)
|
||
ON_NOTIFY(TVN_SELCHANGED, IDC_TK_TREE, OnSelchangedTkTree)
|
||
ON_NOTIFY(LVN_ITEMCHANGED, IDC_TK_LIST, OnItemchangedTkList)
|
||
ON_WM_CONTEXTMENU()
|
||
ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TK_TREE, OnBeginlabeleditTkTree)
|
||
ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_TK_LIST, OnBeginlabeleditTkList)
|
||
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_TK_LIST, OnEndlabeleditTkList)
|
||
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TK_TREE, OnEndlabeleditTkTree)
|
||
ON_NOTIFY(NM_CLICK, IDC_TK_TREE, OnClickTkTree)
|
||
ON_NOTIFY(NM_RCLICK, IDC_TK_TREE, OnRclickTkTree)
|
||
ON_NOTIFY(TVN_BEGINDRAG, IDC_TK_TREE, OnBegindragTkTree)
|
||
ON_COMMAND(ID_TK_POPUP_NEW, OnTkPopupNew)
|
||
ON_COMMAND(ID_TK_POPUP_DEL, OnTkPopupDel)
|
||
ON_COMMAND(ID_TK_POPUP_RENAMEKIND, OnTkPopupRenamekind)
|
||
ON_WM_LBUTTONDOWN()
|
||
ON_WM_MOUSEMOVE()
|
||
ON_WM_CLOSE()
|
||
ON_COMMAND(ID_BLK_FIND, OnBlkFind)
|
||
ON_COMMAND(ID_BLK_DEL, OnBlkDel)
|
||
ON_COMMAND(ID_BLK_NEXT, OnBlkNext)
|
||
ON_COMMAND(ID_BLK_PREVIOUS, OnBlkPrevious)
|
||
ON_COMMAND(ID_BLK_NEWDWG, OnBlkNewDwg)
|
||
ON_COMMAND(ID_BLK_UPGRADE, OnBlkUpgrade)
|
||
ON_COMMAND(ID_BLK_NEWLIB, OnBlkNewlib)
|
||
ON_COMMAND(ID_BLK_RENAME, OnBlkRename)
|
||
ON_COMMAND(ID_BLK_LAYOUT, OnBlkLayout)
|
||
ON_COMMAND(ID_BLK_REBUILD, OnBlkRebuild)
|
||
ON_COMMAND(ID_BLK_REPLACE, OnBlkReplace)
|
||
ON_COMMAND(ID_BLK_SORT, OnBlkSort)
|
||
ON_NOTIFY(TBN_DROPDOWN, IDR_TOOLBAR, OnToolbarDropDown)
|
||
ON_NOTIFY(NM_RCLICK, IDC_TK_LIST, OnRclickTkList)
|
||
ON_NOTIFY(NM_CLICK, IDC_TK_LIST, OnClickTkList)
|
||
ON_WM_LBUTTONUP()
|
||
ON_COMMAND(ID_BLK_IMPORT, OnBlkImport)
|
||
ON_COMMAND(ID_BLK_EXPORTTK, OnBlkExporttk)
|
||
ON_NOTIFY(TBN_DROPDOWN, IDR_TOOLBAR1, OnToolbarDropDown)
|
||
ON_NOTIFY(TBN_DROPDOWN, IDR_TOOLBAR2, OnToolbarDropDown)
|
||
ON_COMMAND(ID_BLK_DELKIND, OnTkPopupDel)
|
||
ON_COMMAND(ID_BLK_OPENLIB, OnSelectlib)
|
||
ON_COMMAND(ID_BLK_COPY, OnBlkCopy)
|
||
ON_COMMAND(ID_BLK_PASTE, OnBlkPaste)
|
||
|
||
ON_UPDATE_COMMAND_UI(ID_BLK_SORT, OnUpdateSort)
|
||
//}}AFX_MSG_MAP
|
||
ON_COMMAND_EX(myMenuID, OnSelectRecentBlb)
|
||
ON_COMMAND_EX(myMenuID + 1, OnSelectRecentBlb)
|
||
ON_COMMAND_EX(myMenuID + 2, OnSelectRecentBlb)
|
||
ON_COMMAND_EX(myMenuID + 3, OnSelectRecentBlb)
|
||
ON_COMMAND_EX(myMenuID + 4, OnSelectRecentBlb)
|
||
ON_COMMAND_EX(myMenuID + 5, OnSelectRecentBlb)
|
||
END_MESSAGE_MAP()
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CBlockManDlg message handlers
|
||
|
||
BOOL CBlockManDlg::OnInitDialog()
|
||
{
|
||
CTKImageDlg::OnInitDialog();
|
||
InitToolBar();
|
||
|
||
//add by xlc on 080828
|
||
if(m_nOpenMode == 2)
|
||
{
|
||
m_menu.LoadMenu(IDR_MENU_BLKMAN);
|
||
SetMenu(&m_menu);
|
||
}
|
||
|
||
CTemporaryResourceOverride vTmp;
|
||
m_imageTree.Create( IDB_TREE, 14, 1, RGB(255,255,255) );
|
||
m_treeCtrl.SetImageList( &m_imageTree, TVSIL_NORMAL );
|
||
m_imageList.Create( IDB_LIST, 14, 1, RGB(255,255,255) );
|
||
m_listCtrl.SetImageList( &m_imageList, LVSIL_SMALL);
|
||
|
||
if(m_bMultiSel){
|
||
HWND hWndList = m_listCtrl.m_hWnd;
|
||
LONG_PTR dwOldStyle;
|
||
#ifndef _WIN64
|
||
dwOldStyle = GetWindowLong(hWndList, GWL_STYLE);
|
||
#else
|
||
dwOldStyle = GetWindowLongPtr(hWndList, GWL_STYLE);
|
||
#endif
|
||
DWORD dwNewStyle = LVS_SINGLESEL;
|
||
dwNewStyle |= dwOldStyle;
|
||
dwOldStyle &=~LVS_SINGLESEL;
|
||
|
||
#ifndef _WIN64
|
||
SetWindowLong(hWndList, GWL_STYLE, dwOldStyle);
|
||
#else
|
||
SetWindowLongPtr(hWndList, GWL_STYLE, dwOldStyle);
|
||
#endif
|
||
}
|
||
|
||
|
||
SetupTreeView();
|
||
SetStateText(_T("初始化完毕!"));
|
||
SetListHighLight();
|
||
return FALSE; // return TRUE unless you set the focus to a control
|
||
}
|
||
|
||
|
||
|
||
void CBlockManDlg::InitToolBar()
|
||
{
|
||
CTemporaryResourceOverride vTmp;
|
||
if(m_nOpenMode == 0) {
|
||
int ButtonID[]={ ID_BLK_NEWLIB, ID_BLK_OPENLIB ,0,
|
||
ID_BLK_COPY,ID_BLK_PASTE,0, ID_BLK_UPGRADE,
|
||
ID_BLK_NEWDWG, ID_BLK_EXPORTTK, ID_BLK_IMPORT, ID_BLK_REBUILD, 0, ID_BLK_DELKIND,
|
||
ID_BLK_DEL, 0,// ID_BLK_FIND, ID_BLK_PREVIOUS, ID_BLK_NEXT, 0,
|
||
ID_BLK_LAYOUT, ID_BLK_PAGEUP,
|
||
ID_BLK_PAGEDOWN, ID_BLK_SORT, 0, ID_BLK_REPLACE, IDOK,};
|
||
m_ToolBar.InitToolBar(ButtonID, 26, IDR_TOOLBAR, this);
|
||
m_ToolBar.SetStyle(ID_BLK_OPENLIB, TBSTYLE_DROPDOWN);
|
||
}
|
||
else if(m_nOpenMode == 1) {
|
||
int ButtonID[]={ ID_BLK_UPGRADE, ID_BLK_NEWDWG, ID_BLK_REBUILD, 0,
|
||
ID_BLK_DELKIND, ID_BLK_DEL, 0, //ID_BLK_FIND, ID_BLK_PREVIOUS, ID_BLK_NEXT,0,
|
||
ID_BLK_LAYOUT,ID_BLK_PAGEUP, ID_BLK_PAGEDOWN, ID_BLK_SORT,
|
||
0, ID_BLK_REPLACE, IDOK,};
|
||
m_ToolBar.InitToolBar(ButtonID, 19, IDR_TOOLBAR1, this);
|
||
}
|
||
else if(m_nOpenMode == 2) {
|
||
int ButtonID[]={ ID_BLK_DELKIND, ID_BLK_DEL,
|
||
//0,ID_BLK_FIND, ID_BLK_PREVIOUS, ID_BLK_NEXT, 0,
|
||
ID_BLK_LAYOUT, ID_BLK_PAGEUP, ID_BLK_PAGEDOWN,
|
||
ID_BLK_SORT, //0,
|
||
IDOK, };
|
||
m_ToolBar.InitToolBar(ButtonID, 7, IDR_TOOLBAR2, this);
|
||
}
|
||
m_ToolBar.SetStyle(ID_BLK_SORT, TBSTYLE_CHECK);
|
||
m_ToolBar.SetStyle(ID_BLK_LAYOUT, TBSTYLE_DROPDOWN);
|
||
// m_ToolBar.EnableButton(ID_BLK_PREVIOUS, FALSE);
|
||
// m_ToolBar.EnableButton(ID_BLK_NEXT, FALSE);
|
||
}
|
||
|
||
const XString ConnectStr(XStringList& lstKind, int index, XString xsNew)
|
||
{
|
||
XString xsRet;
|
||
int len = lstKind.Length();
|
||
for(int i=0;i<len;i++)
|
||
{
|
||
if(i != index) {
|
||
_tcscat(xsRet, lstKind[i]);
|
||
_tcscat(xsRet,_T("\\"));
|
||
}
|
||
else {
|
||
_tcscat(xsRet,xsNew);
|
||
_tcscat(xsRet,_T("\\"));
|
||
}
|
||
}
|
||
len = xsRet.Length();
|
||
xsRet[len - 1] = _T('\0'); // B: 末尾多了 _T("\\")
|
||
return xsRet;
|
||
}
|
||
|
||
void SplitStr(const TCHAR *szInput, XStringList& lstKind)
|
||
{
|
||
int len = (int)_tcslen(szInput);
|
||
TCHAR szTemp[256]=_T("");
|
||
int j =0;
|
||
szTemp[0] = _T('\0');
|
||
lstKind.Reset();
|
||
for(int i=0; i<=len; i++)
|
||
{
|
||
|
||
if(szInput[i] != _T('\\') && szInput[i] != _T('\0'))
|
||
szTemp[j] = szInput[i];
|
||
else {
|
||
szTemp[j] = _T('\0');
|
||
if(szTemp[0] != _T('\0'))
|
||
lstKind.Append(tstrnew(szTemp));
|
||
j =-1;
|
||
}
|
||
j++;
|
||
}
|
||
|
||
}
|
||
|
||
void CBlockManDlg::SetupTreeView()
|
||
{
|
||
{ // ZJQ modify here, resource override is considered here
|
||
CTemporaryResourceOverride vTemp;
|
||
m_bIsDelTree = TRUE;
|
||
m_treeCtrl.DeleteAllItems();
|
||
m_bIsDelTree = FALSE;
|
||
}
|
||
|
||
HTREEITEM hHead= m_treeCtrl.InsertItem(m_csTKName, 0, 1);
|
||
HTREEITEM hCul=NULL, hTemp=NULL, hRoot=NULL, hFilter=NULL; // ZJQ modify here
|
||
int lenTree = m_lstKindNames.Length();
|
||
|
||
hRoot = hHead;
|
||
XStringList lstKind;
|
||
CString csFilter=(const TCHAR *)m_xskindFilter;
|
||
hFilter = hHead;
|
||
for(int i=0; i< lenTree; i++)
|
||
{
|
||
CString csKindName = m_lstKindNames[i];
|
||
if(csKindName.IsEmpty()) continue;
|
||
SplitStr(csKindName, lstKind);
|
||
CString csNode, csAllNode;
|
||
int kindlen = lstKind.Length();
|
||
if(kindlen == 1) { // 一级目录
|
||
hTemp = m_treeCtrl.InsertItem(m_lstKindNames[i], 0, 1, hHead);
|
||
if(csKindName == csFilter)
|
||
hFilter = hTemp; // !!! 记住默认树节点句柄
|
||
}
|
||
else // 多级目录
|
||
for(int j=0; j< kindlen; j++)
|
||
{
|
||
csNode = lstKind[j];
|
||
csAllNode = csAllNode + csNode + _T("\\"); // 记住该树节点全路径(注意:最后一次多加一个“\\”)
|
||
hCul = FindTreeNode(hRoot, csNode);
|
||
if(!hCul) {
|
||
hRoot = m_treeCtrl.InsertItem(csNode, 0, 1, hRoot);
|
||
if(csKindName == csFilter || csAllNode == (csFilter + _T("\\"))) // 比较时也多加一个“\\”
|
||
hFilter = hRoot; // !!! 记住默认树节点句柄
|
||
}
|
||
else //已存在此节点
|
||
hRoot = hCul;
|
||
}
|
||
hRoot = hHead;
|
||
}
|
||
|
||
// 刷新
|
||
m_treeCtrl.Invalidate();
|
||
m_treeCtrl.UpdateWindow();// 刷新
|
||
|
||
ASSERT(hFilter); // ZJQ add here
|
||
m_treeCtrl.SelectItem(hFilter);
|
||
m_treeCtrl.Expand(hFilter, TVE_EXPAND);
|
||
|
||
}
|
||
|
||
//初始化TREEVIEW时调用: insert节点 时看它是否已存在
|
||
HTREEITEM CBlockManDlg::FindTreeNode(HTREEITEM hItem, const TCHAR* szNode)
|
||
{
|
||
CString csNode = szNode;
|
||
HTREEITEM htree;
|
||
CString csCurText;
|
||
|
||
htree = m_treeCtrl.GetChildItem(hItem);
|
||
csCurText = m_treeCtrl.GetItemText(htree);
|
||
if(csCurText == csNode) return htree;
|
||
|
||
while( htree=m_treeCtrl.GetNextSiblingItem(htree))
|
||
{
|
||
csCurText = m_treeCtrl.GetItemText(htree);
|
||
if(csCurText == csNode) return htree;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
|
||
|
||
void CBlockManDlg::OnSelchangedTkTree(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
if(m_bIsDelTree) return; // 如果正在删除树,暂时屏蔽此函数
|
||
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
||
HTREEITEM htree;
|
||
htree = m_treeCtrl.GetSelectedItem();
|
||
ASSERT(htree); // ZJQ add here
|
||
m_treeCtrl.SetItemState(htree, TVIS_BOLD ,TVIS_BOLD);
|
||
SetupListView(); // 立即更新LISTVIEW
|
||
SetupImage(TRUE);
|
||
InitVSBar();
|
||
|
||
if(m_hOldItem) {
|
||
m_treeCtrl.SetItemState(m_hOldItem, 0, TVIS_BOLD); // 让上一个节点字型恢复
|
||
if(m_lstBlk.Length() != 0) // 保证根目录选中时不执行
|
||
{
|
||
if(!IsValid(m_nIndex)) {
|
||
m_nIndex=0;
|
||
SetupImage(TRUE);
|
||
InitVSBar();
|
||
}
|
||
|
||
ASSERT(IsValid(m_nIndex)); // ZJQ add here
|
||
//SelectIndex(m_nIndex);
|
||
SetListHighLight();
|
||
SwapFlipImage(-1, CurImage());
|
||
}
|
||
}
|
||
m_hOldItem = htree;
|
||
ResetStateText();
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CBlockManDlg::OnClickTkTree(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
m_nIndex = 0;
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CBlockManDlg::OnClickTkList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
SetListHighLight();
|
||
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CBlockManDlg::OnRclickTkTree(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
POINT pt;
|
||
TV_HITTESTINFO tvhti;
|
||
::GetCursorPos((LPPOINT)&pt);
|
||
ScreenToClient(&pt);
|
||
MapWindowPoints(&m_treeCtrl, &pt, 1);
|
||
tvhti.pt = pt;
|
||
m_treeCtrl.HitTest(&tvhti);
|
||
if(tvhti.hItem) {
|
||
m_nIndex = 0;
|
||
m_treeCtrl.SelectItem(tvhti.hItem);
|
||
}
|
||
*pResult = 0;
|
||
}
|
||
void CBlockManDlg::OnRclickTkList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CBlockManDlg::OnBeginlabeleditTkList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
|
||
m_bBiginEdit = TRUE;
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CBlockManDlg::OnBeginlabeleditTkTree(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
|
||
CEdit* pEdit = m_treeCtrl.GetEditControl();
|
||
pEdit->LimitText(15);
|
||
m_bBiginEdit = TRUE;
|
||
*pResult = FALSE;
|
||
}
|
||
//更改LIST项内容 即:改变图块名称
|
||
void CBlockManDlg::OnEndlabeleditTkList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
|
||
if((pDispInfo->item.pszText != NULL)&&(pDispInfo->item.iItem != -1))
|
||
{
|
||
CString sKind, sItem, sText; //类别,名称
|
||
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
m_bBiginEdit = FALSE;
|
||
return;
|
||
}
|
||
sText = m_lstBlk[m_nIndex]->sDrawing;
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
GET_FIELD(pTable, _T("kind"), sKind);
|
||
GET_FIELD(pTable, _T("drawing"), sItem);
|
||
|
||
if(sKind == m_xskindFilter && sItem == sText) {
|
||
SET_FIELD(pTable, _T("item"), pDispInfo->item.pszText);
|
||
if(m_nOpenMode != 0){
|
||
SaveStatus2();
|
||
m_xsBlkName = _T("");
|
||
}
|
||
else
|
||
SaveStatus();
|
||
|
||
pTable->Close();
|
||
ReadFile();
|
||
InitBaseData();
|
||
*pResult = 0; // 原本为TRUE, 重新绑定数据库后就不需要了
|
||
for(int i=0; i<m_lstBlk.Length(); i++) {
|
||
if(m_lstBlk[i]->sItem == (LPCTSTR)pDispInfo->item.pszText) {
|
||
m_nIndex = i; // 找出本图新的位置
|
||
break;
|
||
}
|
||
}
|
||
SetupTreeView();
|
||
m_bBiginEdit = FALSE;
|
||
return;
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
|
||
}else{
|
||
m_bBiginEdit = FALSE;
|
||
*pResult = 0;
|
||
}
|
||
}
|
||
|
||
void CBlockManDlg::OnEndlabeleditTkTree(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
|
||
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
|
||
|
||
CEdit* pEdit = m_treeCtrl.GetEditControl();
|
||
CString csNew, csOld;
|
||
pEdit->GetWindowText(csNew);
|
||
HTREEITEM htree;
|
||
htree = m_treeCtrl.GetSelectedItem();
|
||
csOld = m_treeCtrl.GetItemText(htree);
|
||
|
||
if(csNew.GetLength()==0 || csNew == _T("新建") ){
|
||
m_treeCtrl.SetFocus();
|
||
m_treeCtrl.EditLabel(pTVDispInfo->item.hItem);
|
||
m_bBiginEdit = TRUE;
|
||
*pResult = FALSE;
|
||
SetStateText(_T("提示:请尽量避免用‘新建’作为类别名称!"));
|
||
return ;
|
||
}
|
||
if(csNew == csOld) {
|
||
m_bBiginEdit = FALSE;
|
||
*pResult = FALSE;
|
||
return;
|
||
} // 如果没有变化,则退出
|
||
|
||
if(csNew.Find(_T('\\')) != -1){
|
||
AfxMessageBox(_T("节点名称中不可包括字符'\\'!"));
|
||
*pResult = FALSE;
|
||
return ;
|
||
}
|
||
XStringList lstKind, lstFilter;
|
||
CString csKind, csFilter;
|
||
csFilter = (const TCHAR *)m_xskindFilter; // ZJQ modify here
|
||
CString sKind, sNew; //类别
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
m_bBiginEdit = FALSE;
|
||
return;
|
||
}
|
||
SplitStr((const TCHAR*)csFilter, lstFilter);
|
||
sNew = pTVDispInfo->item.pszText;
|
||
pTable->MoveFirst();
|
||
|
||
|
||
while(!pTable->IsEOF()) {
|
||
BOOL flag = TRUE;
|
||
GET_FIELD(pTable, _T("kind"), sKind);
|
||
|
||
|
||
csKind = (const TCHAR *)sKind; // ZJQ modify here
|
||
SplitStr((const TCHAR*)csKind, lstKind);
|
||
if(lstKind.Length() < lstFilter.Length()) {
|
||
pTable->MoveNext();
|
||
continue;
|
||
}
|
||
for(int i=0; i<lstFilter.Length(); i++) {
|
||
// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
|
||
CString str1,str2;
|
||
str1 = lstKind[i]; // lstKind 链表 :当前记录 -> sKind
|
||
str2 = lstFilter[i]; // lstFilter链表 :当前树接点
|
||
if(str1 != str2) {
|
||
flag = FALSE;
|
||
break;
|
||
}
|
||
}
|
||
if(flag) {
|
||
sKind = ConnectStr(lstKind,lstFilter.Length()-1,sNew);
|
||
SET_FIELD(pTable, _T("kind"), (LPCTSTR)sKind);
|
||
}
|
||
|
||
pTable->MoveNext();
|
||
}
|
||
|
||
|
||
m_xskindFilter = ConnectStr(lstFilter,lstFilter.Length()-1,sNew);
|
||
if(m_nOpenMode != 0){
|
||
SaveStatus2();
|
||
m_xsBlkName = _T("");
|
||
}
|
||
else
|
||
SaveStatus();
|
||
|
||
pTable->Close();
|
||
ReadFile();
|
||
InitBaseData();
|
||
*pResult = 0; // 原本为TRUE, 重新绑定数据库后就不需要了
|
||
SetupTreeView();
|
||
m_bBiginEdit = FALSE;
|
||
return;
|
||
}
|
||
|
||
void CBlockManDlg::SetupListView()
|
||
{
|
||
int n=1;
|
||
HTREEITEM htree;
|
||
m_listCtrl.DeleteAllItems();
|
||
htree = m_treeCtrl.GetSelectedItem();
|
||
m_xskindFilter = GetNodeAllPath(htree);
|
||
if(_tcscmp(m_xskindFilter, m_csTKName) == 0) m_xskindFilter = _T("");
|
||
ReadFile();
|
||
int len = m_lstBlk.Length();
|
||
for(int i=0; i<len ; i++)
|
||
{
|
||
m_listCtrl.InsertItem(i, m_lstBlk[i]->sItem);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
//取得所有的组的名称,即过滤的名称
|
||
void CBlockManDlg::GetFilterList()
|
||
{
|
||
m_lstKindNames.Reset();
|
||
CString sKind; //类别
|
||
CodeBase db;
|
||
db.read_only = 1;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) return;
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
GET_FIELD(pTable, _T("kind"), sKind);
|
||
if(m_lstKindNames.Index(sKind, 0) < 0 ) // 如果没有重复
|
||
m_lstKindNames.Append(tstrnew(sKind));
|
||
pTable->MoveNext();
|
||
}
|
||
|
||
m_lstKindNames.QuickSort(_tcscmp);
|
||
|
||
}
|
||
|
||
void CBlockManDlg::LoadStatus3(TCHAR* strFilter)
|
||
{
|
||
|
||
ASSERT(strFilter); //ZJQ add here
|
||
CString xsKind, xsDrawing ; //类别,名称
|
||
CodeBase db;
|
||
db.read_only =1;
|
||
XDbfTable *pTable = db.Open(m_xsLibName);
|
||
if(!pTable) return;
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
GET_FIELD(pTable, _T("kind"), xsKind);
|
||
GET_FIELD(pTable, _T("Drawing"), xsDrawing);
|
||
if(_tcsicmp(xsDrawing, m_xsBlkName) == 0) {
|
||
_tcscpy(strFilter, (LPCTSTR)xsKind);
|
||
break;
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
}
|
||
|
||
int CBlockManDlg::LoadStatus2(TCHAR *strBlb,TCHAR *strFilter,int &index)
|
||
{
|
||
TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
|
||
_tsplitpath(m_xsLibName, szDrive, szDir, szFile, szExt);
|
||
|
||
|
||
XString strRoot;
|
||
_tcscat(strRoot, GetRegLocation());
|
||
_tcscat(strRoot, _T("\\BLKMAN"));
|
||
CRegProperty regProp(strRoot, szFile);
|
||
|
||
CString strKM,strLB;
|
||
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
||
index=0;
|
||
bool ret;
|
||
ret = regProp.GetValue(_T("LibName"), strKM);
|
||
if(ret == false) return FALSE;
|
||
ret = regProp.GetValue(_T("Type"), strLB);
|
||
ret = regProp.GetValue(_T("Index"), index);
|
||
if(_tcscmp(strKM, strBlb) != 0) return FALSE;
|
||
|
||
_tcscpy(strBlb,(LPCTSTR)strKM);
|
||
_tcscpy(strFilter,(LPCTSTR)strLB);
|
||
return RTNORM;
|
||
}
|
||
//读状态
|
||
int CBlockManDlg::LoadStatus(TCHAR *strBlb,TCHAR *strFilter,int &index)
|
||
{
|
||
CString strKM,strLB;
|
||
CRegProperty regProp(GetRegLocation(), _T("BLKMAN"));
|
||
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
||
|
||
index=0;
|
||
regProp.GetValue(_T("LibName"), strKM);
|
||
regProp.GetValue(_T("Type"), strLB);
|
||
regProp.GetValue(_T("Index"), index);
|
||
|
||
|
||
_tcscpy(strBlb,(LPCTSTR)strKM);
|
||
_tcscpy(strFilter,(LPCTSTR)strLB);
|
||
|
||
for(int i=0; i<=m_nMaxRecentBlb; i++) {
|
||
XString sKey(256);
|
||
CString csValue;
|
||
sKey << _T("The recent lib") << (i + 1);
|
||
regProp.GetValue(sKey, csValue);
|
||
if(csValue.IsEmpty()) continue;
|
||
if(!FindFile(csValue)) //目录已经不存在
|
||
continue;
|
||
|
||
BOOL bAppend=TRUE;
|
||
for(int j=0; j<m_lstBlbNames.Length(); j++) {
|
||
if(m_lstBlbNames[j]==csValue) {
|
||
bAppend=FALSE;
|
||
break;
|
||
}
|
||
}
|
||
if(bAppend) m_lstBlbNames.Append(tstrnew(csValue));
|
||
}
|
||
|
||
return RTNORM;
|
||
}
|
||
|
||
//重新选库
|
||
void CBlockManDlg::OnSelectlib()
|
||
{
|
||
if(!IsValid(m_nIndex)) m_nIndex = 0;
|
||
|
||
if(m_bBiginEdit) return;
|
||
if(SelectDbfFile(TRUE)==TRUE) {
|
||
m_xskindFilter = _T("");
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
InitBaseData();
|
||
SetupTreeView();
|
||
SetListHighLight();
|
||
SetStateText(_T("选库操作完毕!"));
|
||
if(m_nOpenMode != 0) return; //只有方式0才可以复制
|
||
if((_tcscmp((const TCHAR*)m_csCopyTKFile, (const TCHAR*)m_xsFileName) != 0)
|
||
&& (m_lstCopyBlk.Length() >0)){
|
||
m_ToolBar.EnableButton(ID_BLK_PASTE, TRUE);
|
||
}
|
||
else
|
||
m_ToolBar.EnableButton(ID_BLK_PASTE, FALSE);
|
||
}
|
||
}
|
||
|
||
//选最近库
|
||
BOOL CBlockManDlg::OnSelectRecentBlb(UINT nID)
|
||
{
|
||
if(m_bBiginEdit) return FALSE;
|
||
int nLen=m_lstBlbNames.Length();
|
||
int nIndex=nID - myMenuID;
|
||
ASSERT(nIndex < nLen && nIndex>=0);
|
||
XString szName = m_lstBlbNames[nIndex];
|
||
if(!FindFile(szName)){
|
||
return FALSE;
|
||
}
|
||
|
||
if(szName != m_xsFileName) {
|
||
m_xsFileName=szName;
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
m_xskindFilter = _T("");
|
||
ReadFile();
|
||
m_nIndex= m_lstBlk.Length()>0 ? 0:-1;
|
||
InitBaseData();
|
||
SetupTreeView();
|
||
SetListHighLight();
|
||
SetStateText(_T("选库操作完毕!"));
|
||
if(m_nOpenMode != 0) return TRUE; //只有方式0才可以复制
|
||
if((_tcscmp((const TCHAR*)m_csCopyTKFile, (const TCHAR*)m_xsFileName) != 0)
|
||
&& (m_lstCopyBlk.Length() >0)){
|
||
m_ToolBar.EnableButton(ID_BLK_PASTE, TRUE);
|
||
}
|
||
else
|
||
m_ToolBar.EnableButton(ID_BLK_PASTE, FALSE);
|
||
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
int CBlockManDlg::SaveStatus2()
|
||
{
|
||
XString strRoot;
|
||
_tcscat(strRoot, GetRegLocation());
|
||
_tcscat(strRoot, _T("\\BLKMAN"));
|
||
CRegProperty regProp(strRoot, m_csTKAllName);
|
||
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
||
regProp.SetValue(_T("LibName"), (TCHAR*)m_xsFileName);
|
||
if(!m_xskindFilter){
|
||
regProp.SetValue(_T("Type"),_T("*"));
|
||
}else{
|
||
regProp.SetValue(_T("Type"),(TCHAR *)m_xskindFilter);
|
||
}
|
||
regProp.SetValue(_T("Index"),m_nIndex);
|
||
|
||
return RTNORM;
|
||
}
|
||
|
||
|
||
//存储状态
|
||
int CBlockManDlg::SaveStatus()
|
||
{
|
||
//if(m_bSaveStatus){
|
||
CRegProperty regProp(GetRegLocation(), _T("BLKMAN"));
|
||
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
||
regProp.SetValue(_T("LibName"),(const TCHAR*)m_xsFileName);
|
||
if(!m_xskindFilter){
|
||
regProp.SetValue(_T("Type"),_T("*"));
|
||
}else{
|
||
regProp.SetValue(_T("Type"),(const TCHAR *)m_xskindFilter);
|
||
}
|
||
regProp.SetValue(_T("Index"),m_nIndex);
|
||
|
||
int nLen=m_lstBlbNames.Length();
|
||
for(int i=0; i<nLen; i++) {
|
||
if(m_xsFileName==(LPCTSTR)m_lstBlbNames[i]) {
|
||
m_lstBlbNames.Remove(i);
|
||
nLen--;
|
||
break;
|
||
}
|
||
}
|
||
if(nLen>=m_nMaxRecentBlb) m_lstBlbNames.Remove(0);
|
||
m_lstBlbNames.Append(tstrnew(m_xsFileName));
|
||
nLen=m_lstBlbNames.Length();
|
||
for(i=0; i<nLen; i++) {
|
||
if(i<m_nMaxRecentBlb) {
|
||
XString sKey(256), sValue(256);
|
||
sKey << _T("The recent lib") << (i + 1);
|
||
sValue << m_lstBlbNames[i];
|
||
regProp.SetValue(sKey, sValue);
|
||
}
|
||
else break;
|
||
}
|
||
//}
|
||
|
||
return RTNORM;
|
||
}
|
||
|
||
// 设置nIndex个图像/幻灯
|
||
void CBlockManDlg::SetupNthImage(int nIndex, CImageDC *pImg)
|
||
{
|
||
BOOL bValid = IsValid(nIndex);
|
||
XString sFile(256), xsDrawing;
|
||
if (bValid) {
|
||
xsDrawing = (const TCHAR *)(m_csTKAllName + _T("(") + (const TCHAR *)m_lstBlk[nIndex]->sDrawing+ _T(")"));
|
||
sFile << m_xsFilePath<< xsDrawing;
|
||
}
|
||
if(!bValid) {
|
||
//pImg->Fill(RGB(192,192,192));
|
||
pImg->PaintSlide(NULL);
|
||
} else {
|
||
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
|
||
if (pos == NULL){
|
||
pImg->PaintSlide(sFile);
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
while (pos)
|
||
{
|
||
int nItem = m_listCtrl.GetNextSelectedItem(pos);
|
||
if(nItem == nIndex){
|
||
pImg->SetBackColor(RGB(0,128,192));
|
||
pImg->PaintSlide(sFile);
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
pImg->PaintSlide(sFile);
|
||
}
|
||
}
|
||
|
||
//读取文件
|
||
BOOL CBlockManDlg::ReadFile()
|
||
{
|
||
if(!m_xsFileName) return FALSE;
|
||
m_lstBlk.Reset();
|
||
|
||
CString sKind, sItem, sDrawing; //类别,名称,内部图名
|
||
CodeBase db;
|
||
db.read_only = 1;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) return FALSE;
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
GET_FIELD(pTable, _T("kind"), sKind);
|
||
GET_FIELD(pTable, _T("item"), sItem);
|
||
GET_FIELD(pTable, _T("drawing"), sDrawing);
|
||
if(sKind == m_xskindFilter && sDrawing != _T("")) {
|
||
m_lstBlk.Append(new DwbStruct(sKind, sItem, sDrawing));
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
if(m_bSort)
|
||
m_lstBlk.QuickSort(DwbStruct::SortByItem);
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
void CBlockManDlg::CheckBak(const TCHAR* szFile)
|
||
{
|
||
XString xsFile = szFile;
|
||
TCHAR dwgPrefix[256] = _T("");
|
||
XString xstempSlb, xstempDwb, xstempBlb, xsDwbPath(256), xsSlbPath(256);
|
||
GetTempPath(255, dwgPrefix);
|
||
|
||
XString xsDrive1, xsDir1(256), xsFname1, xsKind, xsExt1, xsSldName;
|
||
int nWayToGetSld = 0;
|
||
|
||
_tsplitpath(xsFile, xsDrive1, xsDir1, xsFname1, xsExt1);
|
||
xstempSlb << dwgPrefix << xsFname1 << _T(".slb");
|
||
xstempDwb << dwgPrefix << xsFname1 << _T(".dwb");
|
||
xstempBlb << dwgPrefix << xsFname1 << _T(".tk");
|
||
CFileFind find;
|
||
if(find.FindFile(xstempBlb)) {
|
||
if(AfxMessageBox(_T("图库在上次编辑过程中非正常结束,可能受到毁损,是否恢复原样"), MB_YESNO)==IDYES) {
|
||
xsDwbPath << xsDrive1 << xsDir1 << xsFname1 << _T(".DWB");
|
||
xsSlbPath << xsDrive1 << xsDir1 << xsFname1 << _T(".SLB");
|
||
DeleteFile(xsDwbPath);
|
||
DeleteFile(xsSlbPath);
|
||
DeleteFile(xsFile);
|
||
CopyFile(xstempSlb, xsSlbPath, FALSE);
|
||
CopyFile(xstempDwb, xsDwbPath, FALSE);
|
||
CopyFile(xstempBlb, xsFile, FALSE);
|
||
DeleteFile(xstempSlb);
|
||
DeleteFile(xstempDwb);
|
||
DeleteFile(xstempBlb);
|
||
} else {
|
||
DeleteFile(xstempSlb);
|
||
DeleteFile(xstempDwb);
|
||
DeleteFile(xstempBlb);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
void CBlockManDlg::InitBaseData()
|
||
{
|
||
TCHAR szFile[256] = _T(""), szKind[256] = _T("");
|
||
int nItem = 0;
|
||
if(m_nOpenMode == 2 && m_xsBlkName != _T("")) {
|
||
_tcscpy(szFile, m_xsLibName);
|
||
LoadStatus3(szKind);
|
||
nItem = 0;
|
||
} else if(m_nOpenMode == 1 || (m_nOpenMode == 2 && m_xsBlkName == _T(""))) {
|
||
_tcscpy(szFile, m_xsLibName);
|
||
LoadStatus2(szFile, szKind, nItem);
|
||
if(_tcscmp(szKind, _T("*"))==0) szKind[0]=0;
|
||
} else{
|
||
LoadStatus(szFile, szKind, nItem);
|
||
CheckBak(szFile);
|
||
if(_tcscmp(szKind, _T("*"))==0) szKind[0]=0;
|
||
}
|
||
if(szFile[0]) //检查是否存在该文件!
|
||
{
|
||
CFileFind find;
|
||
if(find.FindFile(szFile))//如果存在,正常;
|
||
m_xsFileName = szFile;
|
||
else {//否则,重新选取
|
||
_tcscpy(szFile,_T(""));
|
||
_tcscpy(szKind,_T(""));
|
||
}
|
||
}
|
||
if((m_xsFileName==_T("") && m_nOpenMode == 1) || (m_xsFileName==_T("") && m_nOpenMode == 2))
|
||
{
|
||
AfxMessageBox(_T("查无此图库文件!请确认文件名输入正确。"));
|
||
m_bInitReady=FALSE;
|
||
return;
|
||
}
|
||
if(m_xsFileName!=_T(""))
|
||
{
|
||
TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
|
||
_tsplitpath(m_xsFileName, szDrive, szDir, szFile, szExt);
|
||
m_xsFilePath=XString(_T("%s%s"), szDrive, szDir);
|
||
m_csTKName = szFile;
|
||
m_csTKAllName = szFile;
|
||
m_csTKName = m_csTKName + _T(" 位于");
|
||
m_csTKName = m_csTKName + (const TCHAR *)m_xsFilePath;
|
||
}
|
||
else {
|
||
if(!szFile[0] && SelectDbfFile(FALSE)!=TRUE) {
|
||
m_bInitReady=FALSE;
|
||
return;
|
||
}
|
||
else {
|
||
TCHAR drive[_MAX_DRIVE]=_T(""), dir[_MAX_DIR]=_T(""), fname[_MAX_FNAME]=_T(""), ext[_MAX_EXT]=_T("");
|
||
_tsplitpath(m_xsFileName, drive, dir, fname, ext);
|
||
XString sTemp(256);
|
||
sTemp << drive << dir;
|
||
m_xsFilePath = sTemp;
|
||
m_csTKName = fname;
|
||
m_csTKAllName = fname;
|
||
m_csTKName = m_csTKName + _T(" 位于");
|
||
m_csTKName = m_csTKName + (const TCHAR*)m_xsFilePath;
|
||
}
|
||
}
|
||
if(szKind[0]) m_xskindFilter = szKind;
|
||
//初始化完毕,进行数据的读取,以便在INITDIALOG中填充
|
||
if(!ReadFile())
|
||
{
|
||
AfxMessageBox(_T("读取文件错误,请检查库文件是否损坏!"));
|
||
m_bInitReady = FALSE;
|
||
return;
|
||
}
|
||
if(m_lstBlk.Length() == 0){
|
||
if(!ReadFile())
|
||
{
|
||
AfxMessageBox(_T("读取文件错误,请检查库文件是否损坏!"));
|
||
m_bInitReady = FALSE;
|
||
return;
|
||
}
|
||
}
|
||
if(nItem>=0 && nItem<m_lstBlk.Length()){
|
||
m_nIndex = nItem;//初始化位置
|
||
}else if(nItem == BLK_LIST_LAST){
|
||
m_nIndex = m_lstBlk.Length()>0 ? m_lstBlk.Length():-1;
|
||
}else{
|
||
m_nIndex = m_lstBlk.Length()>0 ?0 :-1;
|
||
}
|
||
|
||
if(m_nOpenMode == 2 && m_xsBlkName != _T(""))
|
||
{
|
||
int i, len;
|
||
len = m_lstBlk.Length();
|
||
for(i=0;i<len;i++)
|
||
{
|
||
if(m_xsBlkName == m_lstBlk[i]->sDrawing){
|
||
m_nIndex = i;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
SetPageSize(m_nPageRow, m_nPageColumn);//初始化页面
|
||
GetFilterList();
|
||
m_bInitReady = TRUE;
|
||
}
|
||
//选取新的库管理文件
|
||
BOOL CBlockManDlg::SelectDbfFile(BOOL bHasParent)
|
||
{
|
||
XString sTemp(256);
|
||
CString csFileName=(const TCHAR *)m_xsFileName; // ZJQ modify here
|
||
CWnd* pParentWnd;
|
||
if(bHasParent) //对话框起来了。
|
||
pParentWnd = this;
|
||
else
|
||
pParentWnd = acedGetAcadFrame();
|
||
CFileDialog dlg(TRUE,_T("*.tk"),csFileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
|
||
_T("上华图库文件 (*.TK) |*.TK||"), pParentWnd);
|
||
TCHAR szDlgTitle[] = _T("选择上华图库文件或新建");
|
||
dlg.m_ofn.lpstrTitle = szDlgTitle;
|
||
|
||
if(dlg.DoModal()!=IDOK)
|
||
return FALSE;
|
||
TCHAR szShortPath[256]=_T("");
|
||
_tcscpy(szShortPath, dlg.GetPathName());
|
||
if(_tcsicmp(m_xsFileName, szShortPath) == 0) return FALSE;
|
||
m_xsFileName = szShortPath;
|
||
|
||
TCHAR drive[_MAX_DRIVE]=_T(""), dir[_MAX_DIR]=_T(""), fname[_MAX_FNAME]=_T(""), ext[_MAX_EXT]=_T("");
|
||
_tsplitpath(m_xsFileName, drive, dir, fname, ext);
|
||
|
||
sTemp << drive << dir;
|
||
m_xsFilePath = sTemp;
|
||
|
||
BOOL bRet=TRUE;
|
||
if(!FindFile(m_xsFileName)) { //如果没有,新建一个
|
||
bRet=CreateTKFile(m_xsFileName);
|
||
}
|
||
return bRet;
|
||
}
|
||
|
||
|
||
|
||
int CBlockManDlg::GetTotalRecords() //取得当前链表的节点个数
|
||
{
|
||
return m_lstBlk.Length();
|
||
}
|
||
|
||
|
||
|
||
void CBlockManDlg::ClearBkColor()
|
||
{
|
||
CDC *pDC = m_ImageBox.GetDC();
|
||
int pageSize = PageSize();
|
||
for(int i=0; i<pageSize; i++) {
|
||
int index = CurPage()*pageSize + i;
|
||
if(IsSelected(index)){
|
||
CImageDC *pImageDC = m_lstImage[i];
|
||
pImageDC->SetDC(pDC);
|
||
pImageDC->SetBackColor(GetAcadBackColor());
|
||
pImageDC->Redraw();
|
||
pImageDC->SetDC(NULL);
|
||
}
|
||
}
|
||
m_ImageBox.ReleaseDC(pDC);
|
||
}
|
||
|
||
//鼠标按下
|
||
void CBlockManDlg::OnLButtonDown(UINT nFlags, CPoint point)
|
||
{
|
||
if(IsPointOnImage(point) && (!m_bBiginEdit)){
|
||
BOOL bFlag;
|
||
if((nFlags & MK_CONTROL) | (nFlags & MK_SHIFT))
|
||
bFlag = TRUE;
|
||
else
|
||
bFlag = FALSE;
|
||
|
||
if(m_bMultiSel && !bFlag){ //如果多选,但没有按CTRL键
|
||
int lastImage = CurImage();
|
||
if(GetPageIndex(point) == lastImage) {
|
||
CTKImageDlg::OnLButtonDown(nFlags, point);
|
||
return;
|
||
}
|
||
|
||
m_bMultiSel = FALSE;
|
||
if(IsMultSelected())
|
||
ClearBkColor();
|
||
for(int i=0;i<m_listCtrl.GetItemCount();i++){
|
||
m_listCtrl.SetItemState(i, 0, LVIS_SELECTED);
|
||
}
|
||
SelectPageIndex(GetPageIndex(point));
|
||
m_bMultiSel = TRUE;
|
||
}
|
||
else if(m_bMultiSel && (nFlags & MK_CONTROL)){//如果多选,且按CTRL键{
|
||
SelectPageIndex(GetPageIndex(point));
|
||
m_listCtrl.SetFocus();
|
||
if(m_listCtrl.GetItemState(m_nIndex, LVIS_SELECTED)){//如果已经选过了,取消选中
|
||
m_listCtrl.SetItemState(m_nIndex, 0, LVIS_SELECTED);
|
||
SwapFlipImage(CurImage(), -1);
|
||
}
|
||
else{
|
||
m_listCtrl.SetItemState(m_nIndex, LVIS_SELECTED, LVIS_SELECTED);
|
||
m_listCtrl.SetHotItem(m_nIndex);
|
||
m_listCtrl.EnsureVisible(m_nIndex, TRUE);
|
||
SwapFlipImage(CurImage(), GetPageIndex(point));
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
CTKImageDlg::OnLButtonDown(nFlags, point);
|
||
return;
|
||
}
|
||
if(nFlags & MK_SHIFT){
|
||
m_bCellIsDragging = TRUE;
|
||
m_dragTarget = NULL;
|
||
SetCapture();
|
||
}
|
||
ResetStateText();
|
||
|
||
CTKImageDlg::OnLButtonDown(nFlags, point);
|
||
}
|
||
|
||
|
||
|
||
//鼠标弹起
|
||
void CBlockManDlg::OnLButtonUp(UINT nFlags, CPoint point)
|
||
{
|
||
if(m_bCellIsDragging == TRUE){
|
||
HTREEITEM hOldSelItem;
|
||
hOldSelItem = m_treeCtrl.GetSelectedItem();
|
||
|
||
if((m_dragTarget != NULL) && (m_dragTarget != hOldSelItem)){
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
m_dragTarget = NULL;
|
||
m_bCellIsDragging = FALSE;
|
||
ReleaseCapture();
|
||
m_treeCtrl.SelectDropTarget(NULL);
|
||
return;
|
||
}
|
||
UINT len = m_listCtrl.GetSelectedCount();
|
||
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
|
||
if (pos == NULL) {
|
||
pTable->Close();
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
while (pos)
|
||
{
|
||
int nItem = m_listCtrl.GetNextSelectedItem(pos);
|
||
CString sKind,sDrawing, sText; //类别,名称
|
||
sText = m_lstBlk[nItem]->sDrawing;
|
||
|
||
CopyCell(sText);
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
GET_FIELD(pTable, _T("kind"), sKind);
|
||
GET_FIELD(pTable, _T("Drawing"), sDrawing);
|
||
if(sKind == m_xskindFilter && sDrawing == sText) {
|
||
pTable->Delete();
|
||
break;
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
}
|
||
}
|
||
pTable->Close();
|
||
m_dragTarget = NULL;
|
||
|
||
/* if(m_nOpenMode != 0){
|
||
SaveStatus2();
|
||
m_xsBlkName = _T("");
|
||
}
|
||
else
|
||
SaveStatus();
|
||
|
||
InitBaseData();
|
||
if(m_nIndex != 0 && m_nIndex != (m_lstBlk.Length() - 1))
|
||
m_nIndex--; // 当前图块不是首尾时,将其值减1
|
||
SetupListView(); // 立即更新LISTVIEW
|
||
ResetStateText();
|
||
SetupImage(TRUE);
|
||
InitVSBar();
|
||
SetupImage(FALSE);
|
||
SetListHighLight();*/
|
||
|
||
if(m_nOpenMode != 0){
|
||
SaveStatus2();
|
||
m_xsBlkName = _T("");
|
||
}
|
||
else
|
||
SaveStatus();
|
||
InitBaseData();
|
||
if(m_nIndex != 0 && m_nIndex != (m_lstBlk.Length() - 1))
|
||
m_nIndex--; // 当前图块不是首尾时,将其值减1
|
||
SetupTreeView();
|
||
SetStateText(_T("已成功移动图块"));
|
||
}
|
||
m_bCellIsDragging = FALSE;
|
||
ReleaseCapture();
|
||
m_treeCtrl.SelectDropTarget(NULL);
|
||
}
|
||
else if(m_bNodeIsDragging == TRUE){ // 类别拖动 2002-7-25沈睿加入
|
||
CImageList::DragLeave(&m_treeCtrl);
|
||
CImageList::EndDrag();
|
||
ReleaseCapture();
|
||
m_treeCtrl.SelectDropTarget(NULL);
|
||
HTREEITEM hOldSelItem;
|
||
hOldSelItem = m_treeCtrl.GetSelectedItem();
|
||
m_bNodeIsDragging = FALSE;
|
||
if((m_dragTarget != NULL) && (m_dragTarget != hOldSelItem) && (m_treeCtrl.GetParentItem(m_dragItem) != m_dragTarget)) {
|
||
BOOL bIsChild = FALSE;
|
||
HTREEITEM hItem = m_treeCtrl.GetParentItem(m_dragTarget);
|
||
while(hItem != NULL){
|
||
if(hItem == m_dragItem){
|
||
bIsChild = TRUE;
|
||
MessageBox(_T("对不起,不能将父类别移动至其子类别下!"));
|
||
break;
|
||
}
|
||
hItem = m_treeCtrl.GetParentItem(hItem);
|
||
}
|
||
if(!bIsChild){
|
||
XStringList lstBlk, lstType;
|
||
XString xsDragTaget;
|
||
if(m_dragTarget == m_treeCtrl.GetRootItem())
|
||
xsDragTaget = _T("");
|
||
else
|
||
xsDragTaget = GetNodeAllPath(m_dragTarget);
|
||
|
||
SetNewType(xsDragTaget);
|
||
m_treeCtrl.SelectItem(m_dragTarget);
|
||
m_treeCtrl.Expand(m_dragTarget, TVE_EXPAND);
|
||
m_nIndex = 0;
|
||
if(m_nOpenMode != 0){
|
||
SaveStatus2();
|
||
m_xsBlkName = _T("");
|
||
}
|
||
else
|
||
SaveStatus();
|
||
InitBaseData();
|
||
SetupTreeView();
|
||
SetStateText(_T("已成功移动类别"));
|
||
}
|
||
}
|
||
m_dragTarget=NULL;
|
||
}
|
||
|
||
CTKImageDlg::OnLButtonUp(nFlags, point);
|
||
}
|
||
|
||
|
||
|
||
|
||
BOOL CBlockManDlg::PreTranslateMessage(MSG* pMsg)
|
||
{
|
||
if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE && m_bBiginEdit)
|
||
return FALSE; // 正在改名时, 禁止ESC
|
||
|
||
|
||
return CTKImageDlg::PreTranslateMessage(pMsg);
|
||
}
|
||
|
||
//鼠标移动
|
||
void CBlockManDlg::OnMouseMove(UINT nFlags, CPoint point)
|
||
{
|
||
|
||
if(!(nFlags & MK_LBUTTON) ) {
|
||
CTKImageDlg::OnMouseMove(nFlags, point);
|
||
return;
|
||
}
|
||
if(!m_bCellIsDragging && !m_bNodeIsDragging) {
|
||
CTKImageDlg::OnMouseMove(nFlags, point);
|
||
return;
|
||
}
|
||
|
||
if(m_bNodeIsDragging){
|
||
CPoint ptTree( point );
|
||
MapWindowPoints( &m_treeCtrl, &ptTree, 1 );
|
||
CImageList::DragMove( ptTree );
|
||
UINT uHitTest = TVHT_ONITEM;
|
||
m_dragTarget = m_treeCtrl.HitTest( ptTree, &uHitTest );
|
||
if(m_dragTarget!=NULL)
|
||
m_treeCtrl.SelectDropTarget(m_dragTarget);
|
||
}
|
||
else{
|
||
HICON hIcon;
|
||
CPoint pntScreen(point);
|
||
ClientToScreen(&pntScreen);
|
||
CRect rcTree;
|
||
m_treeCtrl.GetWindowRect(rcTree);
|
||
CWinApp* pApp = AfxGetApp();
|
||
{
|
||
|
||
CTemporaryResourceOverride vTemp; // ZJQ add here
|
||
if( rcTree.PtInRect( pntScreen ) == TRUE ){ // 鼠标落在TREE中换光标
|
||
if(IsMultSelected())
|
||
hIcon = pApp->LoadCursor(IDC_CUR_MULTMOVE);
|
||
else
|
||
hIcon = pApp->LoadCursor(IDC_CUR_CELLMOVE);
|
||
|
||
SetStateText(_T("拖动至目标类型可移动图块!"));
|
||
SetCursor(hIcon);
|
||
CPoint ptTree( point );
|
||
MapWindowPoints( &m_treeCtrl, &ptTree, 1 );
|
||
UINT uHitTest = TVHT_ONITEM;
|
||
m_dragTarget = m_treeCtrl.HitTest(ptTree, &uHitTest);
|
||
if(m_dragTarget != NULL)
|
||
m_treeCtrl.SelectDropTarget(m_dragTarget);
|
||
}
|
||
else {
|
||
HICON hIcon = ::LoadCursor( NULL,IDC_NO );
|
||
SetCursor(hIcon);
|
||
}
|
||
}
|
||
}
|
||
CTKImageDlg::OnMouseMove(nFlags, point);
|
||
}
|
||
|
||
// 右键菜单
|
||
void CBlockManDlg::OnContextMenu(CWnd* pWnd, CPoint point)
|
||
{
|
||
|
||
CTemporaryResourceOverride vTemp;//加载菜单
|
||
CMenu menu;
|
||
menu.LoadMenu(IDR_MENU_IMAGELAYOUT);
|
||
|
||
if(IsInRect(IDC_PIC_IMAGE, point))
|
||
{
|
||
|
||
CMenu *pSubMenu = menu.GetSubMenu(0);
|
||
if(m_nOpenMode == 2) {
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
}
|
||
if(pSubMenu)
|
||
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
|
||
point.x, point.y, this, NULL);
|
||
}
|
||
if(IsInRect(IDC_TK_LIST, point))
|
||
{
|
||
|
||
CMenu *pSubMenu = menu.GetSubMenu(0);
|
||
pSubMenu->DeleteMenu(7, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(7, MF_BYPOSITION);
|
||
if(m_nOpenMode == 2) {
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(0, MF_BYPOSITION);
|
||
}
|
||
if(pSubMenu)
|
||
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
|
||
point.x, point.y, this, NULL);
|
||
|
||
}
|
||
if(IsInRect(IDC_TK_TREE, point) && !m_bBiginEdit)
|
||
{
|
||
CMenu Menu;
|
||
Menu.LoadMenu(IDR_MENU_TREE);
|
||
CMenu *pSubMenu = Menu.GetSubMenu(0);
|
||
if(m_nOpenMode == 2) {
|
||
pSubMenu->DeleteMenu(4, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(4, MF_BYPOSITION);
|
||
pSubMenu->DeleteMenu(4, MF_BYPOSITION);
|
||
}
|
||
if(pSubMenu)
|
||
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
|
||
point.x, point.y, this, NULL);
|
||
}
|
||
|
||
}
|
||
|
||
void CBlockManDlg::OnToolbarDropDown(NMHDR* pnmtb0, LRESULT *plr)
|
||
{
|
||
NMTOOLBAR* pnmtb=(NMTOOLBAR *)pnmtb0;
|
||
CTemporaryResourceOverride vTemp;//加载菜单
|
||
|
||
CWnd *pWnd = &m_ToolBar;
|
||
CMenu menu;
|
||
CMenu* pPopup, *pPopupLayout;
|
||
CStringArray array;
|
||
// UINT MenuID;
|
||
CRect rc;
|
||
pWnd->SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc);
|
||
pWnd->ClientToScreen(&rc);
|
||
int len, i;
|
||
switch (pnmtb->iItem)
|
||
{
|
||
case ID_BLK_LAYOUT:
|
||
menu.LoadMenu(IDR_MENU_IMAGELAYOUT);
|
||
pPopup = menu.GetSubMenu(0);
|
||
pPopupLayout = pPopup->GetSubMenu(8);
|
||
|
||
pPopupLayout->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
|
||
rc.left, rc.bottom, this, &rc);
|
||
|
||
break;
|
||
case ID_BLK_OPENLIB:
|
||
|
||
len = m_lstBlbNames.Length();
|
||
if(m_pPopupMenu) {
|
||
m_pPopupMenu->DestroyMenu();
|
||
m_pPopupMenu->CreatePopupMenu();
|
||
} else {
|
||
m_pPopupMenu=new CMenu;
|
||
m_pPopupMenu->CreatePopupMenu();
|
||
}
|
||
|
||
for(i=0; i< len; i++) // 将最近使用过的库加入菜单
|
||
m_pPopupMenu->AppendMenu(MF_STRING, myMenuID + i, m_lstBlbNames[i]);
|
||
|
||
//沈睿 remove 2003/6/13
|
||
/* m_pPopupMenu->AppendMenu(MF_SEPARATOR);
|
||
MenuID = myMenuID + len;
|
||
GetAllTkName(array);
|
||
nLenArray = array.GetSize();
|
||
for(i=0;i<nLenArray;i++)
|
||
m_pPopupMenu->AppendMenu(MF_STRING, MenuID + i, array[i]);
|
||
*/
|
||
m_pPopupMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
|
||
rc.left, rc.bottom, this, &rc);
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
const XString CBlockManDlg::GetNodeAllPath(HTREEITEM htree)
|
||
{
|
||
CString csCur, csNodeName;
|
||
csCur = m_treeCtrl.GetItemText(htree);
|
||
csNodeName = csCur;
|
||
while(csCur != m_csTKName) { // 得到该节点的全路径
|
||
htree = m_treeCtrl.GetParentItem(htree);
|
||
csCur = m_treeCtrl.GetItemText(htree);
|
||
if(csCur != m_csTKName)
|
||
csNodeName = csCur + _T("\\") + csNodeName;
|
||
}
|
||
XString xsKind;
|
||
xsKind = (const TCHAR*)csNodeName;
|
||
return xsKind;
|
||
}
|
||
|
||
//新建一个类别TREE
|
||
void CBlockManDlg::OnTkPopupNew()
|
||
{
|
||
if(m_bBiginEdit) return;
|
||
HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
|
||
HTREEITEM hSubItem, htree;
|
||
if(hItem != NULL){
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return;
|
||
}
|
||
|
||
hSubItem = m_treeCtrl.InsertItem(_T("新建"), 0, 1, hItem );
|
||
m_treeCtrl.SelectItem(hSubItem);
|
||
htree = m_treeCtrl.GetSelectedItem();
|
||
|
||
pTable->AppendBegin();
|
||
SET_FIELD(pTable, _T("kind"), GetNodeAllPath(htree));
|
||
pTable->AppendEnd();
|
||
}else{
|
||
AfxMessageBox(_T("Please select an item first"));
|
||
}
|
||
ASSERT(hItem); // ZJQ add here
|
||
m_treeCtrl.Expand(hItem, TVE_EXPAND);
|
||
m_treeCtrl.SetFocus();
|
||
ASSERT(hSubItem); // ZJQ add here
|
||
m_treeCtrl.EditLabel(hSubItem);
|
||
|
||
|
||
}
|
||
|
||
//删除类型及图块
|
||
void CBlockManDlg::OnTkPopupDel()
|
||
{
|
||
if(m_bBiginEdit) return;
|
||
HTREEITEM htree, hParant;
|
||
htree = m_treeCtrl.GetSelectedItem();
|
||
CString csCur = m_treeCtrl.GetItemText(htree);
|
||
|
||
if(csCur == m_csTKName) return;
|
||
if(htree != NULL){
|
||
if(MessageBox(_T("注意:该类型所属的所有的图块都将删除!\n\n您是否真的删除此类型?"),_T("警告"),MB_OKCANCEL|MB_ICONQUESTION) != IDOK)
|
||
return;
|
||
hParant = m_treeCtrl.GetParentItem(htree);
|
||
CString csFilter;
|
||
csFilter = (const TCHAR *)m_xskindFilter; // zjq modify here
|
||
int nNumDel = DelKind(csFilter, 0);
|
||
if(!nNumDel) {
|
||
return;
|
||
}
|
||
|
||
Copy2Temp(m_xsFileName, TRUE);
|
||
nNumDel = DelKind(csFilter, nNumDel);
|
||
Copy2Temp(m_xsFileName, FALSE);
|
||
m_treeCtrl.SelectItem(hParant);
|
||
if(m_nOpenMode != 0){
|
||
SaveStatus2();
|
||
m_xsBlkName = _T("");
|
||
}
|
||
else
|
||
SaveStatus();
|
||
|
||
ReadFile();
|
||
m_nIndex = 0;
|
||
InitBaseData();
|
||
SetupTreeView();
|
||
}else{
|
||
AfxMessageBox(_T("Please select an item first!"));
|
||
}
|
||
}
|
||
|
||
int CBlockManDlg::DelKind(const TCHAR* szFilter, int bIsDel)
|
||
{
|
||
CString csFilter = szFilter;
|
||
|
||
int nNumDel = 0;
|
||
CString xsKind, xsDrawing; //类别
|
||
XStringList lstKind, lstFilter;
|
||
CString csKind;
|
||
int nPos = 0;
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return 0;
|
||
}
|
||
|
||
|
||
CProgressWnd wndProgress(this, _T("Progress"), TRUE);
|
||
wndProgress.SetRange(0, bIsDel);
|
||
wndProgress.SetText(_T("正在删除图块...\n")
|
||
_T("按取消键中断此次操作!"));
|
||
|
||
|
||
SplitStr(csFilter, lstFilter);
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
BOOL flag = TRUE;
|
||
GET_FIELD(pTable, _T("kind"), xsKind);
|
||
GET_FIELD(pTable, _T("Drawing"), xsDrawing);
|
||
csKind = (const TCHAR *)xsKind; // ZJQ add here
|
||
SplitStr(csKind, lstKind);
|
||
if(lstKind.Length() < lstFilter.Length()) {
|
||
pTable->MoveNext();
|
||
continue;
|
||
}
|
||
for(int i=0; i<lstFilter.Length(); i++)
|
||
{// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
|
||
CString cs1,cs2;
|
||
cs1 = (const TCHAR *)lstKind[i]; // lstKind链表 :当前记录 -> sKind
|
||
cs2 = (const TCHAR *)lstFilter[i]; // lstFilter链表 :当前树接点
|
||
if(cs1 != cs2) {flag = FALSE; break;}
|
||
}
|
||
if(flag) nNumDel ++;
|
||
if(flag && bIsDel) {
|
||
|
||
pTable->Delete();
|
||
XString xsLib, xsDwg;
|
||
XString xsDwb(256), xsSlb(256);
|
||
xsDwb << m_xsFilePath << m_csTKAllName << _T(".DWB");
|
||
xsSlb << m_xsFilePath << m_csTKAllName << _T(".SLB");
|
||
XDrawingLib dwb(xsDwb);
|
||
XSlideLib slb(xsSlb);
|
||
if(!(!dwb)) dwb.Remove(xsDrawing);
|
||
if(!(!slb)) slb.Remove(xsDrawing);
|
||
//acedSetStatusBarProgressMeterPos(nPos++);
|
||
wndProgress.StepIt();
|
||
wndProgress.PeekAndPump();
|
||
if (wndProgress.Cancelled()) break;
|
||
if(ads_usrbrk() == 1) break; //用户中断
|
||
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
pTable->Close();
|
||
//acedRestoreStatusBar();
|
||
return nNumDel;
|
||
}
|
||
|
||
int CBlockManDlg::ChoseImage(const TCHAR* szDrawing)
|
||
{
|
||
XString xsDrawing = szDrawing;
|
||
|
||
PickSet ss(SS_FREE);
|
||
int rc=SelectEntities(_T("\n选择构成图块的图元:"), ss, RBList(RTDXF0, _T("*"), NULL));
|
||
if(rc==RTNORM) {
|
||
XPoint center, basePt;
|
||
ads_real sx, sy, sz;
|
||
ss.GetExtend(center, &sx, &sy, &sz);
|
||
center.z -= sz/2.0; //基点在下方
|
||
adsout << _T("\n图块基点<") << center << _T(">:");
|
||
rc=ads_getpoint(Wcs2Ucs(center), _T(""), basePt);
|
||
if(rc==RTNONE) {
|
||
basePt=Wcs2Ucs(center);
|
||
rc=RTNORM;
|
||
}
|
||
|
||
if(rc==RTNORM) {
|
||
PickSet ssAll(SS_FREE);
|
||
ssAll.Get(_T("X"));
|
||
ssAll -= ss;
|
||
|
||
//add by xlc on 080812 解决对局部隐藏对象的影响
|
||
PickSet ssHide(SS_FREE);
|
||
GetPickSetByGroup(_T("_TCH_HIDE_GROUP"), ssHide);
|
||
ssAll -= ssHide;
|
||
|
||
MakeVisible(ssAll, false);
|
||
//actrTransactionManager->flushGraphics();
|
||
rc=AddImage(ss, basePt, xsDrawing);
|
||
MakeVisible(ssAll, true);
|
||
}
|
||
}
|
||
return rc;
|
||
}
|
||
|
||
int CBlockManDlg::AddImage(PickSet &ss, XPoint &basePt, const TCHAR* szDrawing)
|
||
{
|
||
XString xsDrawing = szDrawing;
|
||
if(!!ss) {
|
||
if(ProcessBlockInsert(ss)!=RTNORM)
|
||
return RTERROR;
|
||
}
|
||
|
||
XString xsFullSld, xsFullDwg;
|
||
BOOL bHide = FALSE;
|
||
TCHAR dwgPrefix[256]=_T("");
|
||
GetTempPath(255, dwgPrefix);
|
||
if(dwgPrefix[_tcslen(dwgPrefix)-1]!=_T('\\'))
|
||
_tcscat(dwgPrefix, _T("\\"));
|
||
_tcscat(dwgPrefix, _T("SRTEMP\\"));
|
||
MakeDir(dwgPrefix);
|
||
{
|
||
xsFullSld << dwgPrefix << xsDrawing << _T(".sld");
|
||
xsFullDwg << dwgPrefix << xsDrawing << _T(".dwg");
|
||
|
||
|
||
while(1) {
|
||
const TCHAR *szPrompt=_T("\n制作幻灯片(请用zoom调整合适)或 [消隐(H)/不制作返回(X)]<制作>:");
|
||
XString sKeyword;
|
||
int nRet = 0;
|
||
INITGET_BEG(0, _T("H X"));
|
||
nRet = ads_getkword(szPrompt, sKeyword);
|
||
INITGET_END();
|
||
if(nRet == RTNONE)
|
||
break;
|
||
if(sKeyword[0]==_T('H')) {
|
||
bHide = TRUE;
|
||
} else {
|
||
return RTERROR;
|
||
}
|
||
}
|
||
|
||
if(bHide) {
|
||
XPushVar<int> splframe(_T("SPLFRAME"), 0);
|
||
SHads_command(RTSTR, _T("HIDE"), RTNONE);
|
||
SHads_command(RTSTR, _T("MSLIDE"), RTSTR, (TCHAR *)xsFullSld, RTNONE);
|
||
SHads_command(RTSTR, _T("REGEN"), RTNONE);
|
||
}
|
||
else {
|
||
|
||
SHads_command(RTSTR, _T("MSLIDE"), RTSTR, (TCHAR *)xsFullSld, RTNONE);
|
||
}
|
||
|
||
XString xsSlbFile(256);
|
||
xsSlbFile << m_xsFilePath << (const TCHAR *)m_csTKAllName << _T(".SLB");
|
||
XSlideLib slbMan(xsSlbFile);
|
||
if(!slbMan) return RTERROR;
|
||
slbMan.Append(xsFullSld);
|
||
_tremove(xsFullSld);
|
||
}
|
||
if(!ss) return RTNORM;
|
||
|
||
|
||
//XPushVar<int> expert(_T("EXPERT"), 5);
|
||
//XPushVar<int> vOsMode("OSMODE", 0);
|
||
//SHads_command(RTSTR, "WBLOCK", RTSTR, (char *)xsFullDwg, RTSTR, "",RT3DPOINT, &basePt.x, RTPICKS, (long *)ss, RTSTR, "", NULL);
|
||
//SHads_command(RTSTR, "OOPS", NULL);
|
||
if(!arxWBlock(ss, xsFullDwg, Ucs2Wcs(basePt)))
|
||
return RTERROR;
|
||
|
||
XString xsDwbFile(256);
|
||
xsDwbFile << m_xsFilePath << (const TCHAR *)m_csTKAllName << _T(".DWB");
|
||
XDrawingLib dwbMan(xsDwbFile);
|
||
if(!dwbMan) return RTERROR;
|
||
dwbMan.Append(xsFullDwg);
|
||
_tremove(xsFullDwg);
|
||
|
||
|
||
return RTNORM;
|
||
}
|
||
|
||
//得到ID
|
||
BOOL CBlockManDlg::getLocationFromDB(const TCHAR* szDrawing, CString &csRet)
|
||
{
|
||
XString sDrawing = szDrawing;
|
||
XString xsDwbFileName, xsResStr;
|
||
|
||
xsDwbFileName<<m_xsFilePath<<(const TCHAR *)m_csTKAllName<<_T(".dwb");
|
||
if(GetNextItem(xsDwbFileName, xsResStr)!=RTNORM) {
|
||
return FALSE;
|
||
}
|
||
csRet = (const TCHAR *)xsResStr; // ZJQ modify here
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
inline XString GetBlbFromFileName(LPCTSTR szTotalName)
|
||
{
|
||
if(!szTotalName){
|
||
assert(FALSE);
|
||
return XString();
|
||
}
|
||
XString xsFullName = szTotalName;
|
||
TCHAR *p1 = xsFullName.StrChr(_T('('));
|
||
if(p1) {
|
||
*p1=0;
|
||
}else{
|
||
assert(FALSE);
|
||
}
|
||
return xsFullName;
|
||
}
|
||
|
||
// 新建图库
|
||
void CBlockManDlg::OnBlkNewlib()
|
||
{
|
||
if(m_bBiginEdit) return;
|
||
if(g_nArchType==4) {
|
||
AfxMessageBox(_T("学习版不支持,欢迎购买正版!"));
|
||
return;
|
||
}
|
||
|
||
XString sTemp(256);
|
||
CString csFileName=(const TCHAR *)m_xsFileName;
|
||
CFileDialog dlg(TRUE,_T("*.tk"),csFileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
|
||
_T("上华图库文件 (*.TK) |*.TK||"),this); // sr modify
|
||
if(dlg.DoModal()!=IDOK)
|
||
return;
|
||
TCHAR szShortPath[256]=_T("");
|
||
_tcscpy(szShortPath, dlg.GetPathName());
|
||
if(FindFile(szShortPath)) {
|
||
AfxMessageBox(_T("已存在此文件!请换一文件。"));
|
||
return;
|
||
}
|
||
|
||
if(_tcsicmp(m_xsFileName, szShortPath)==0)//如果没有更换库文件,无需改动直接返回
|
||
return;
|
||
else m_xsFileName=szShortPath;
|
||
|
||
if(!CreateTKFile(m_xsFileName))
|
||
return;
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
ReadFile();
|
||
m_nIndex = -1;
|
||
InitBaseData();
|
||
SetupTreeView();
|
||
|
||
}
|
||
|
||
// 新图入库
|
||
void CBlockManDlg::OnBlkNewDwg()
|
||
{
|
||
if(m_bBiginEdit) return;
|
||
if(g_nArchType==4) {
|
||
AfxMessageBox(_T("学习版不支持,欢迎购买正版!"));
|
||
return;
|
||
}
|
||
|
||
HideDialog(TRUE);
|
||
DwbStruct rec;
|
||
GetCurRecord(rec); // get current record from dbf and save to dlg
|
||
rec.sKind=m_xskindFilter;
|
||
rec.sItem=_T("新图块");
|
||
CString csRet = (const TCHAR *)rec.sDrawing;
|
||
if(getLocationFromDB(rec.sDrawing, csRet)==FALSE){
|
||
HideDialog(FALSE);
|
||
SetStateText(_T("新建取消!"));
|
||
return;
|
||
}
|
||
rec.sDrawing = (const TCHAR *)csRet;
|
||
if(ChoseImage(rec.sDrawing)==RTNORM) {
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return;
|
||
}
|
||
pTable->AppendBegin();
|
||
SET_FIELD(pTable, _T("kind"), rec.sKind);
|
||
SET_FIELD(pTable, _T("Item"), rec.sItem);
|
||
SET_FIELD(pTable, _T("Drawing"), rec.sDrawing);
|
||
pTable->AppendEnd();
|
||
HideDialog(FALSE);
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
pTable->Close();
|
||
ReadFile();
|
||
InitBaseData();
|
||
for(int i=0; i<m_lstBlk.Length(); i++) {
|
||
if(m_lstBlk[i]->sDrawing == rec.sDrawing) {
|
||
m_nIndex = i; // 找出本图新的位置
|
||
break;
|
||
}
|
||
}
|
||
|
||
SetupTreeView();
|
||
|
||
SetStateText(_T("新建成功!"));
|
||
}else{
|
||
HideDialog(FALSE);
|
||
SetStateText(_T("新建取消!"));
|
||
}
|
||
|
||
}
|
||
|
||
void Copy2Temp(const TCHAR* szFileName, BOOL IsCopy)
|
||
{
|
||
XString xsFileName = szFileName;
|
||
TCHAR szDwgPrefix[256] = _T("");
|
||
XString xsTempSlb, xsTempDwb, xsTempTk, xsDwbPath(256), xsSlbPath(256);
|
||
GetTempPath(255, szDwgPrefix);
|
||
|
||
XString sDrive, sDir(256), sFname, sKind, sExt;
|
||
|
||
_tsplitpath(xsFileName, sDrive, sDir, sFname, sExt); //分割!
|
||
xsTempSlb << szDwgPrefix << sFname << _T(".slb");
|
||
xsTempDwb << szDwgPrefix << sFname << _T(".dwb");
|
||
xsTempTk << szDwgPrefix << sFname << _T(".tk");
|
||
|
||
xsDwbPath << sDrive << sDir << sFname << _T(".DWB");
|
||
xsSlbPath << sDrive << sDir << sFname << _T(".SLB");
|
||
|
||
if(IsCopy) {
|
||
CopyFile(xsSlbPath, xsTempSlb, FALSE);
|
||
CopyFile(xsDwbPath, xsTempDwb, FALSE);
|
||
CopyFile(xsFileName, xsTempTk, FALSE);
|
||
}
|
||
else {
|
||
DeleteFile(xsTempSlb);
|
||
DeleteFile(xsTempDwb);
|
||
DeleteFile(xsTempTk);
|
||
}
|
||
|
||
}
|
||
|
||
extern TCHAR g_szDirName[]; //申请自己的16K缓冲区
|
||
|
||
//批量入库
|
||
void CBlockManDlg::OnBlkUpgrade()
|
||
{
|
||
if(g_nArchType==4) {
|
||
AfxMessageBox(_T("学习版不支持,欢迎购买正版!"));
|
||
return;
|
||
}
|
||
if(m_bBiginEdit) return;
|
||
CAyrDlg AyrDlg(this);
|
||
{
|
||
CTemporaryResourceOverride vTmp;
|
||
if(AyrDlg.DoModal() != IDOK)
|
||
return;
|
||
}
|
||
|
||
|
||
const TCHAR *pszFilter = _T("DWG Files (*.dwg)|*.dwg||");
|
||
CFileDialog dlg(TRUE, _T("DWG"), NULL, OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY, pszFilter, this);
|
||
TCHAR strFileName[4056] = _T("");
|
||
|
||
TCHAR szDlgTitle[] = _T("选择需入库的DWG文件");
|
||
int maxChar = 4055;
|
||
dlg.m_ofn.lpstrFile = strFileName;
|
||
dlg.m_ofn.nMaxFile = maxChar;
|
||
dlg.m_ofn.lpstrTitle = szDlgTitle;
|
||
dlg.m_ofn.lpstrInitialDir = g_szDirName;
|
||
HideDialog(TRUE);
|
||
|
||
XString xsDwbPath(256), xsSlbPath(256);
|
||
XString sDrive1, sDir1(256), sFname1,sKind, sExt1, sSldName;
|
||
_tsplitpath(m_xsFileName, sDrive1, sDir1, sFname1, sExt1); //分割!
|
||
xsDwbPath << sDrive1 << sDir1 << sFname1 << _T(".DWB");
|
||
xsSlbPath << sDrive1 << sDir1 << sFname1 << _T(".SLB");
|
||
|
||
INT_PTR nCode;
|
||
if((nCode=dlg.DoModal())==IDOK)
|
||
{
|
||
Copy2Temp(m_xsFileName, TRUE);
|
||
CProgressWnd wndProgress(acedGetAcadFrame(), _T("Progress"), TRUE);
|
||
CRect rect;
|
||
wndProgress.GetWindowRect(&rect);
|
||
|
||
wndProgress.MoveWindow(0,0,rect.Width(),rect.Height());
|
||
_tcscpy(g_szDirName, dlg.GetPathName());
|
||
CodeBase db;
|
||
CString csIndex;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
Copy2Temp(m_xsFileName, FALSE);
|
||
return;
|
||
}
|
||
|
||
ASSERT(pTable);
|
||
POSITION pos = dlg.GetStartPosition();
|
||
int Num = 0;
|
||
while(pos!=NULL) {
|
||
dlg.GetNextPathName(pos);
|
||
Num++;
|
||
}
|
||
pos = dlg.GetStartPosition();
|
||
wndProgress.SetRange(0,Num);
|
||
wndProgress.SetText(_T("正在入库,请稍候...\n按取消键中断此次操作!"));
|
||
|
||
PickSet ss(SS_FREE);
|
||
if(ss.Get(_T("X"),NULL,NULL,NULL)==RTNORM) {
|
||
MakeVisible(ss, false);
|
||
//actrTransactionManager->flushGraphics();
|
||
}
|
||
|
||
while(pos!=NULL) {
|
||
XFilePathName xfpn=(LPCTSTR)dlg.GetNextPathName(pos);
|
||
csIndex=xfpn.getFileName();
|
||
XString xsRet;
|
||
if(GetNextItem(xsDwbPath, xsRet)!=RTNORM) {
|
||
MakeVisible(ss, true);
|
||
Copy2Temp(m_xsFileName, FALSE);
|
||
return;
|
||
}
|
||
|
||
|
||
pTable->AppendBegin();
|
||
SET_FIELD(pTable, _T("kind"), (const TCHAR *)m_xskindFilter);
|
||
SET_FIELD(pTable, _T("item"), (const TCHAR *)csIndex);
|
||
SET_FIELD(pTable, _T("drawing"), (const TCHAR *)xsRet);
|
||
pTable->AppendEnd();
|
||
// Add DWB
|
||
XDrawingLib dwb(xsDwbPath);
|
||
dwb.Append(xfpn, xsRet);
|
||
|
||
CString csSldName = xfpn.getDriver()+xfpn.getDir()+xfpn.getFileName()+_T(".SLD");//源路径
|
||
if(!FindFile(csSldName)) {
|
||
XPushVar<int> osmode(_T("OSMODE"), 0);
|
||
XPushVar<int> attreq(_T("ATTREQ"), 0);
|
||
SHads_command(RTSTR, _T(".INSERT"), RTSTR, (const TCHAR *)xfpn, RTSTR, _T("0,0,0"),
|
||
RTREAL, 1.0, RTREAL, 1.0, RTREAL, 0.0, RTNONE);
|
||
Entity ent;
|
||
ent.GetLast();
|
||
SHads_command(RTSTR, _T(".ZOOM"),RTSTR, _T("extent"), RTNONE);
|
||
if(AyrDlg.m_bNeedHide)
|
||
SHads_command(RTSTR, _T("HIDE"), RTNONE);
|
||
XString xsTempSld=GetTempFileName(_T(".SLD"));
|
||
SHads_command(RTSTR, _T(".MSLIDE"), RTSTR, (const TCHAR *)xsTempSld, RTNONE);
|
||
XSlideLib slb(xsSlbPath);
|
||
slb.Append(xsTempSld, xsRet);
|
||
ent.Delete();
|
||
_tremove(xsTempSld);
|
||
} else {
|
||
XSlideLib slb(xsSlbPath);
|
||
slb.Append(csSldName, xsRet);
|
||
|
||
}
|
||
wndProgress.StepIt();
|
||
wndProgress.PeekAndPump();
|
||
if (wndProgress.Cancelled()) break;
|
||
if(ads_usrbrk() == 1) break; //用户中断
|
||
}
|
||
MakeVisible(ss, true);
|
||
Copy2Temp(m_xsFileName, FALSE);
|
||
} else {
|
||
if(nCode!=IDCANCEL)
|
||
AfxMessageBox(_T("不正常的情况发生"));
|
||
}
|
||
|
||
|
||
HideDialog(FALSE);
|
||
m_nIndex = 0;
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
InitBaseData();
|
||
SetupTreeView();
|
||
|
||
}
|
||
|
||
|
||
|
||
//替换
|
||
void CBlockManDlg::OnBlkReplace()
|
||
{
|
||
UpdateData();
|
||
if(!IsCurrentValid()) return;
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
CTKImageDlg::OnOK();
|
||
DwbStruct rec = *m_lstBlk[m_nIndex];
|
||
rec.sDrawing = (const TCHAR *)(m_csTKAllName + _T("(") + ((const TCHAR *)rec.sDrawing) + _T(")"));
|
||
int ret = ReplaceBlk(rec);
|
||
}
|
||
|
||
//查找
|
||
void CBlockManDlg::OnBlkFind()
|
||
{
|
||
SetStateText(_T("在当前类型及子类型中查找图块!可利用*、?等通配符。"));
|
||
CFindDlg FindDlg;
|
||
if(FindDlg.DoModal() != IDOK)
|
||
return;
|
||
XString sFindName = FindDlg.m_strName;
|
||
FindBlk(sFindName);
|
||
m_ToolBar.EnableButton(ID_BLK_PREVIOUS, FALSE); //上一个有效
|
||
m_ToolBar.EnableButton(ID_BLK_NEXT, FALSE); //下一个有效
|
||
|
||
if(m_lstFindBlk.Length() < 1) {
|
||
AfxMessageBox(_T("没有找到该名称图块!"));
|
||
return;
|
||
}
|
||
if(m_lstFindBlk.Length() > 1) {
|
||
m_ToolBar.EnableButton(ID_BLK_PREVIOUS, TRUE); //上一个有效
|
||
m_ToolBar.EnableButton(ID_BLK_NEXT, TRUE); //下一个有效
|
||
}
|
||
|
||
m_nFindIndex = 0; // 第一次设为0
|
||
GotoFindCell(m_nFindIndex);
|
||
}
|
||
|
||
//LIST 节点改名
|
||
void CBlockManDlg::OnBlkRename()
|
||
{
|
||
m_listCtrl.SetFocus();
|
||
ASSERT(m_nIndex>=0);
|
||
m_listCtrl.EditLabel(m_nIndex);
|
||
}
|
||
|
||
void CBlockManDlg::OnBlkLayout()
|
||
{
|
||
CWnd *pWnd = &m_ToolBar;
|
||
CMenu menu;
|
||
CMenu* pPopup, *pPopupLayout;
|
||
CMenu popupMenu;
|
||
CRect rc;
|
||
pWnd->SendMessage(TB_GETRECT, ID_BLK_LAYOUT, (LPARAM)&rc);
|
||
pWnd->ClientToScreen(&rc);
|
||
{
|
||
CTemporaryResourceOverride vTemp;//加载菜单
|
||
menu.LoadMenu(IDR_MENU_IMAGELAYOUT);
|
||
}
|
||
pPopup = menu.GetSubMenu(0);
|
||
pPopupLayout = pPopup->GetSubMenu(8);
|
||
|
||
pPopupLayout->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
|
||
rc.left, rc.bottom, this, &rc);
|
||
|
||
}
|
||
|
||
//排序
|
||
void CBlockManDlg::OnBlkSort()
|
||
{
|
||
m_bSort = !m_bSort;
|
||
if (m_bSort)
|
||
{
|
||
m_menu.CheckMenuItem(ID_BLK_SORT,MF_CHECKED);
|
||
}
|
||
else
|
||
{
|
||
m_menu.CheckMenuItem(ID_BLK_SORT,MF_UNCHECKED);
|
||
}
|
||
if(!IsValid(m_nIndex)) return;
|
||
XString xsDrg = m_lstBlk[m_nIndex]->sDrawing;
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
InitBaseData();
|
||
for(int i=0; i < m_lstBlk.Length(); i++) {
|
||
if(m_lstBlk[i]->sDrawing == xsDrg) {
|
||
m_nIndex = i; // 找出本图新的位置
|
||
break;
|
||
}
|
||
}
|
||
SetupTreeView();
|
||
}
|
||
|
||
//Tree 节点改名
|
||
void CBlockManDlg::OnTkPopupRenamekind()
|
||
{
|
||
HTREEITEM hTreeItem;
|
||
hTreeItem = m_treeCtrl.GetSelectedItem();
|
||
m_treeCtrl.SetFocus();
|
||
ASSERT(hTreeItem);
|
||
m_treeCtrl.EditLabel(hTreeItem);
|
||
}
|
||
|
||
//************************** 拷贝图块 ************************************
|
||
void CBlockManDlg::OnBlkCopy()
|
||
{
|
||
m_lstCopyBlk.Reset();
|
||
m_lstCopyDesName.Reset();
|
||
XString xsBlockName;
|
||
m_csCopyTKFile = (const TCHAR*)m_xsFileName;
|
||
|
||
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
|
||
if (pos == NULL)
|
||
return;
|
||
else
|
||
{
|
||
while (pos)
|
||
{
|
||
int nItem = m_listCtrl.GetNextSelectedItem(pos);
|
||
xsBlockName = m_lstBlk[nItem]->sDrawing;
|
||
if(m_lstCopyBlk.Index(xsBlockName, 0) < 0 ) { // 如果没有重复
|
||
m_lstCopyBlk.Append(tstrnew(xsBlockName));
|
||
xsBlockName = m_lstBlk[nItem]->sItem;
|
||
m_lstCopyDesName.Append(tstrnew(xsBlockName));
|
||
}
|
||
}
|
||
}
|
||
SetStateText(_T("已复制到粘贴板。请打开目标图库文件,再点击粘贴按钮。"));
|
||
}
|
||
|
||
//************************** 粘贴图块 ************************************
|
||
void CBlockManDlg::OnBlkPaste()
|
||
{
|
||
if(_tcscmp((const TCHAR*)m_csCopyTKFile, (const TCHAR*)m_xsFileName) == 0){
|
||
AfxMessageBox(_T("对不起,不能在本图库中复制拷贝!"));
|
||
return;
|
||
}
|
||
|
||
CString csCopyDwbFile, csCopySlbFile, csTargetDwb, csTargetSlb, strTemp;
|
||
csCopyDwbFile = m_csCopyTKFile;
|
||
strTemp = csCopyDwbFile.Left(m_csCopyTKFile.GetLength() - 3);
|
||
csCopyDwbFile = strTemp + _T(".DWB");
|
||
csCopySlbFile = strTemp + _T(".SLB");
|
||
csTargetDwb = (const TCHAR*)m_xsFileName;
|
||
strTemp = csTargetDwb.Left(csTargetDwb.GetLength() - 3);
|
||
csTargetDwb = strTemp + _T(".DWB");
|
||
csTargetSlb = strTemp + _T(".SLB");
|
||
|
||
|
||
XSlideLib SlbLibTarget(csTargetSlb);// 拷贝目标
|
||
XSlideLib SlbLibCopy(csCopySlbFile, _ios::in | _ios::binary); // 拷贝源
|
||
if(!SlbLibTarget) {
|
||
AfxMessageBox(_T("目标SLB文件打不开!"));
|
||
return;
|
||
}
|
||
if(!SlbLibCopy) {
|
||
AfxMessageBox(_T("源SLB文件打不开!"));
|
||
return;
|
||
}
|
||
|
||
XDrawingLib DwbLibTarget(csTargetDwb);
|
||
XDrawingLib DwbLibCopy(csCopyDwbFile, _ios::in | _ios::binary);
|
||
if(!DwbLibTarget) {
|
||
AfxMessageBox(_T("目标DWB文件打不开!"));
|
||
return;
|
||
}
|
||
if(!DwbLibCopy) {
|
||
AfxMessageBox(_T("源DWB文件打不开!"));
|
||
return;
|
||
}
|
||
|
||
|
||
TCHAR dwgPrefix[256]=_T("");
|
||
TCHAR sldPrefix[256]=_T("");
|
||
TCHAR tempPrefix[256]=_T("");
|
||
GetTempPath(255, tempPrefix);
|
||
if(tempPrefix[_tcslen(tempPrefix)-1]!=_T('\\'))
|
||
_tcscat(tempPrefix, _T("\\"));
|
||
_tcscat(tempPrefix, _T("SRTEMP\\"));
|
||
MakeDir(tempPrefix);
|
||
|
||
XStringList lstSlbLib,lstDwbLib;
|
||
lstSlbLib.Reset();
|
||
SlbLibCopy.GetAll(lstSlbLib);
|
||
lstDwbLib.Reset();
|
||
DwbLibCopy.GetAll(lstDwbLib);
|
||
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return;
|
||
}
|
||
|
||
acedSetStatusBarProgressMeter(XString(_T("\n粘贴%d个记录"), m_lstCopyBlk.Length()),
|
||
0, m_lstCopyBlk.Length());
|
||
for(int i=0;i<m_lstCopyBlk.Length();i++) {
|
||
acedSetStatusBarProgressMeterPos(i);
|
||
XString xsResStr;
|
||
if(GetNextItem(csTargetDwb, xsResStr)!=RTNORM) {
|
||
AfxMessageBox(_T("Dwb文件中无法添加该图块!"));
|
||
return;
|
||
}
|
||
|
||
_tcscpy(sldPrefix, tempPrefix);
|
||
_tcscpy(dwgPrefix, tempPrefix);
|
||
_tcscat(sldPrefix, m_lstCopyBlk[i]);
|
||
_tcscat(sldPrefix, _T(".sld"));
|
||
|
||
int index = -1;
|
||
index = lstSlbLib.Index(m_lstCopyBlk[i], FALSE);
|
||
|
||
if(index > -1){
|
||
SlbLibCopy.Copy(index, sldPrefix);
|
||
SlbLibTarget.Append(sldPrefix, xsResStr);
|
||
_tremove(sldPrefix);
|
||
}
|
||
else {
|
||
AfxMessageBox(_T("Slb文件中无法找到该图块!"));
|
||
continue;
|
||
}
|
||
|
||
_tcscat(dwgPrefix, m_lstCopyBlk[i]);
|
||
_tcscat(dwgPrefix, _T(".dwg"));
|
||
|
||
index = -1;
|
||
index = lstDwbLib.Index(m_lstCopyBlk[i], FALSE);
|
||
|
||
if(index > -1){
|
||
DwbLibCopy.Copy(index, dwgPrefix);
|
||
int f = DwbLibTarget.Append(dwgPrefix, xsResStr);
|
||
_tremove(dwgPrefix);
|
||
}
|
||
else {
|
||
AfxMessageBox(_T("Dwb文件中无法找到该图块!"));
|
||
continue;
|
||
}
|
||
|
||
pTable->AppendBegin();
|
||
SET_FIELD(pTable, _T("kind"), m_xskindFilter);
|
||
SET_FIELD(pTable, _T("Item"), m_lstCopyDesName[i]);
|
||
SET_FIELD(pTable, _T("Drawing"), xsResStr);
|
||
pTable->AppendEnd();
|
||
}
|
||
acedRestoreStatusBar();
|
||
|
||
m_nIndex = 0;
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
InitBaseData();
|
||
SetupTreeView();
|
||
|
||
SetStateText(_T("已成功拷贝幻灯片!"));
|
||
}
|
||
|
||
|
||
|
||
// 删除当前图块
|
||
void CBlockManDlg::DelCell()
|
||
{
|
||
if(m_lstBlk.Length() == 0) return;
|
||
UINT len = m_listCtrl.GetSelectedCount();
|
||
if(len == 0) return;
|
||
|
||
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
|
||
if (pos == NULL)
|
||
return;
|
||
else
|
||
{
|
||
while (pos)
|
||
{
|
||
int nItem = m_listCtrl.GetNextSelectedItem(pos);
|
||
DwbStruct &cur = *(m_lstBlk[nItem]);
|
||
/*
|
||
DbfAccess db(m_xsFileName, FLAG_DELETE, 1, 0);
|
||
db.keyFieldName[0] = strdup("drawing");
|
||
db.keyinfo[0]=strdup(_AS(cur.sDrawing));
|
||
if(DBFFUN(db)) return;
|
||
*/
|
||
NewDbfTool::DeleteRecordByTKStruct(m_xsFileName, _T("drawing"), cur.sDrawing);
|
||
|
||
XString xsDwb(256), xsSlb(256);
|
||
xsDwb << m_xsFilePath << m_csTKAllName << _T(".DWB");
|
||
xsSlb << m_xsFilePath << m_csTKAllName << _T(".SLB");
|
||
XDrawingLib dwb(xsDwb);
|
||
XSlideLib slb(xsSlb);
|
||
if(!(!dwb)) dwb.Remove(cur.sDrawing);
|
||
if(!(!slb)) slb.Remove(cur.sDrawing);
|
||
|
||
|
||
}
|
||
}
|
||
|
||
if(m_nOpenMode != 0){
|
||
SaveStatus2();
|
||
m_xsBlkName = _T("");
|
||
}
|
||
else
|
||
SaveStatus();
|
||
|
||
ReadFile();
|
||
InitBaseData();
|
||
if(m_nIndex != 0 && m_nIndex != (m_lstBlk.Length() - 1))
|
||
m_nIndex--; // 当前图块不是首尾时,将其值减1
|
||
SetupTreeView();
|
||
}
|
||
|
||
//重制
|
||
void CBlockManDlg::OnBlkRebuild()
|
||
{
|
||
if(m_bBiginEdit) return;
|
||
if(!IsCurrentValid())
|
||
return ;
|
||
HideDialog(TRUE);
|
||
if(ReplaceLibrary()) {
|
||
HideDialog(FALSE);
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
ReadFile();
|
||
InitBaseData();
|
||
SetupImage(TRUE);
|
||
SetupTreeView();
|
||
SetStateText(_T("替换幻灯完毕!"));
|
||
}
|
||
else
|
||
HideDialog(FALSE);
|
||
}
|
||
|
||
//ToolBar 删除
|
||
void CBlockManDlg::OnBlkDel()
|
||
{
|
||
if(MessageBox(_T("注意:此图块删除将无法恢复!您是否真的删除?"),_T("警告"),MB_OKCANCEL|MB_ICONQUESTION) != IDOK)
|
||
return;
|
||
DelCell();
|
||
}
|
||
|
||
void CBlockManDlg::OnBlkNext()
|
||
{
|
||
if(m_nFindIndex < 0) return;
|
||
else if(m_nFindIndex == (m_lstFindBlk.Length() - 1))
|
||
m_nFindIndex = 0;
|
||
else m_nFindIndex++;
|
||
GotoFindCell(m_nFindIndex);
|
||
}
|
||
|
||
void CBlockManDlg::OnBlkPrevious()
|
||
{
|
||
if(m_nFindIndex < 0) return;
|
||
else if(m_nFindIndex == 0)
|
||
m_nFindIndex = m_lstFindBlk.Length() - 1;
|
||
else m_nFindIndex--;
|
||
GotoFindCell(m_nFindIndex);
|
||
}
|
||
|
||
|
||
int CBlockManDlg::GetCurRecord(DwbStruct &ds)
|
||
{
|
||
if(!IsCurrentValid()) return RTERROR;
|
||
DwbStruct &rec=*m_lstBlk[m_nIndex];
|
||
ds.sKind = rec.sKind;
|
||
ds.sItem = rec.sItem;
|
||
ds.sDrawing = rec.sDrawing;
|
||
return RTNORM;
|
||
}
|
||
|
||
void CBlockManDlg::CopyCell(const TCHAR* szText)
|
||
{
|
||
XString xsText = szText;
|
||
XString xsDragTaget;
|
||
xsDragTaget = GetNodeAllPath(m_dragTarget);
|
||
if(_tcscmp(xsDragTaget, m_csTKName) == 0) xsDragTaget = _T(""); // 根
|
||
|
||
CString sKind,sItem, sDrawing;
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return;
|
||
}
|
||
|
||
//sText = m_lstBlk[m_nIndex]->sDrawing;
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
GET_FIELD(pTable, _T("kind"), sKind);
|
||
GET_FIELD(pTable, _T("item"), sItem);
|
||
GET_FIELD(pTable, _T("Drawing"), sDrawing);
|
||
if(sKind == m_xskindFilter && sDrawing == xsText) {
|
||
pTable->AppendBegin();
|
||
SET_FIELD(pTable, _T("kind"), xsDragTaget);
|
||
SET_FIELD(pTable, _T("item"), (LPCTSTR)sItem);
|
||
SET_FIELD(pTable, _T("Drawing"), (LPCTSTR)sDrawing);
|
||
pTable->AppendEnd();
|
||
return;
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
pTable->Close();
|
||
}
|
||
|
||
//替换幻灯或图形
|
||
BOOL CBlockManDlg::ReplaceLibrary()
|
||
{
|
||
XPoint basePt;
|
||
ads_real sx=0, sy=0, sz=0;
|
||
|
||
PickSet ss(SS_FREE);
|
||
//ads_prompt(_T("\n如果不选取物体,就假定只是修改幻灯"));
|
||
if(SelectEntities(_T("\n选择构成图块的图元(不选则只改幻灯):"), ss, RBList(RTDXF0, _T("*"), NULL))!=RTNORM) {
|
||
if(AddImage(ss,basePt,m_lstBlk[m_nIndex]->sDrawing) == RTERROR)
|
||
return FALSE;
|
||
else
|
||
return TRUE;
|
||
}
|
||
//如果选取物体,就假定是替换图库,先删除再添加;
|
||
{
|
||
XPoint ptCen;
|
||
ss.GetExtend(ptCen, &sx, &sy, &sz);
|
||
ptCen.z -= sz/2.0;
|
||
adsout << _T("\n图块基点<") << ptCen << _T(">: ");
|
||
int nRetCode = ads_getpoint(Wcs2Ucs(ptCen), _T(""), basePt);
|
||
//auxSet.Erase();
|
||
if(nRetCode == RTNONE)
|
||
basePt = Wcs2Ucs(ptCen);
|
||
else if(nRetCode != RTNORM){
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
if(!IsCurrentValid()) return FALSE;
|
||
|
||
DwbStruct rec=*m_lstBlk[m_nIndex];
|
||
{
|
||
XString sDwb(256), sSlb(256);
|
||
sDwb << m_xsFilePath << (const TCHAR *)m_csTKAllName << _T(".DWB");
|
||
sSlb << m_xsFilePath << (const TCHAR *)m_csTKAllName << _T(".SLB");
|
||
{
|
||
XDrawingLib dwb(sDwb);
|
||
XSlideLib slb(sSlb);
|
||
if(!(!dwb)) dwb.Remove(rec.sDrawing);
|
||
if(!(!slb)) slb.Remove(rec.sDrawing);
|
||
} // Close()
|
||
|
||
CString cs = (const TCHAR *)rec.sDrawing; // ZJQ modify here
|
||
CString xsOldDrawing, sdrawing;
|
||
xsOldDrawing = rec.sDrawing;
|
||
if(getLocationFromDB(rec.sDrawing, cs)==FALSE)
|
||
return FALSE;
|
||
rec.sDrawing = (const TCHAR *)cs;
|
||
|
||
PickSet ssAll(SS_FREE);
|
||
ssAll.Get(_T("X"));
|
||
ssAll -= ss;
|
||
|
||
//add by xlc on 080812 解决对局部隐藏对象的影响
|
||
PickSet ssHide(SS_FREE);
|
||
GetPickSetByGroup(_T("_TCH_HIDE_GROUP"), ssHide);
|
||
ssAll -= ssHide;
|
||
|
||
MakeVisible(ssAll, false);
|
||
int rCode = AddImage(ss, basePt, rec.sDrawing);//加入幻灯片
|
||
MakeVisible(ssAll, true);
|
||
|
||
CodeBase db;
|
||
if(rCode == RTERROR)
|
||
return FALSE;
|
||
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return FALSE;
|
||
}
|
||
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
GET_FIELD(pTable, _T("drawing"), sdrawing);
|
||
if(sdrawing == xsOldDrawing) {
|
||
SET_FIELD(pTable, _T("drawing"), rec.sDrawing);
|
||
break;
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
//跳到查找列表中指定的记录
|
||
void CBlockManDlg::GotoFindCell(int index)
|
||
{
|
||
ASSERT(index>=0 && index<m_lstFindBlk.Length());
|
||
m_xskindFilter = m_lstFindBlk[index]->sKind;
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
ReadFile();
|
||
InitBaseData();
|
||
for(int i=0; i<m_lstBlk.Length(); i++) {
|
||
if((m_lstBlk[i]->sItem == m_lstFindBlk[index]->sItem) &&
|
||
(m_lstBlk[i]->sDrawing == m_lstFindBlk[index]->sDrawing)) {
|
||
m_nIndex = i; // 找出本图新的位置
|
||
break;
|
||
}
|
||
}
|
||
SetupTreeView();
|
||
}
|
||
|
||
void CBlockManDlg::FindBlk(const TCHAR* szFindName)
|
||
{
|
||
XString xsFindName = szFindName;
|
||
CString sKind,sItem, sDrawing ; //类别,名称
|
||
XStringList lstKind, lstFilter;
|
||
XString xsKind, xsFilter; // ZJQ Modify here
|
||
xsFilter = m_xskindFilter;
|
||
|
||
CodeBase db;
|
||
db.read_only = 1;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return;
|
||
}
|
||
SplitStr(xsFilter, lstFilter);
|
||
m_lstFindBlk.Reset();
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
BOOL flag = TRUE;
|
||
GET_FIELD(pTable, _T("kind"), sKind);
|
||
GET_FIELD(pTable, _T("item"), sItem);
|
||
GET_FIELD(pTable, _T("Drawing"), sDrawing);
|
||
xsKind = sKind;
|
||
SplitStr(xsKind, lstKind);
|
||
if(lstKind.Length() < lstFilter.Length()) {
|
||
pTable->MoveNext();
|
||
continue;
|
||
}
|
||
for(int i=0; i<lstFilter.Length(); i++)
|
||
{// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
|
||
XString cs1,cs2; // ZJQ Modify here
|
||
cs1 = lstKind[i]; // lstKind 链表 :当前记录 -> sKind
|
||
cs2 = lstFilter[i]; // lstFilter链表 :当前树接点
|
||
if(cs1 != cs2) {
|
||
flag = FALSE;
|
||
break;
|
||
}
|
||
}
|
||
if(flag) {
|
||
if((ads_wcmatch(sItem, xsFindName) == RTNORM) && sKind != _T("") && sDrawing != _T(""))
|
||
m_lstFindBlk.Append(new DwbStruct(sKind, sItem, sDrawing)); //找到匹配
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
|
||
}
|
||
|
||
void CBlockManDlg::ResetStateText()
|
||
{
|
||
CString csMsg, csRecord;
|
||
if(!IsValid(m_nIndex)) return;
|
||
csRecord = (const TCHAR *)m_lstBlk[m_nIndex]->sDrawing;
|
||
csMsg.Format(_T("记录号:%s 页号:%d/%d 总记录: %d"), (const TCHAR *)csRecord, CurPage() + 1, TotalPages(), GetTotalRecords());
|
||
SetStateText(csMsg);
|
||
//Invalidate(FALSE);
|
||
}
|
||
|
||
int CBlockManDlg::ReplaceBlk(const DwbStruct &rec)
|
||
{
|
||
XString sBlockName(256);// 从图库中加载图块
|
||
TCHAR szLibFile[80]=_T(""), szDwgFile[80]=_T("");
|
||
if(!rec.sDrawing || SplitSlbName(rec.sDrawing, szLibFile, szDwgFile)!=RTNORM) return 0;
|
||
if(LoadDwbBlock(XString(_T("%s%s"), (const TCHAR*)m_xsFilePath, szLibFile), szDwgFile, sBlockName)!=RTNORM)//存在图块
|
||
return 0;
|
||
|
||
XDbBlockTableRec objBlock(sBlockName, AcDb::kForRead);
|
||
ASSERT(!!objBlock);
|
||
AcDbObjectId idBlock = objBlock.m_pBlockTableRec->objectId();
|
||
objBlock.Close();
|
||
|
||
CBlkManReplaceOption dlg(acedGetAcadFrame());
|
||
dlg.m_sSldFile <<m_xsFilePath <<rec.sDrawing;
|
||
{
|
||
CTemporaryResourceOverride vTemp1;
|
||
dlg.Create(dlg.IDD,acedGetAcadFrame());
|
||
}
|
||
dlg.ShowWindow(SW_SHOW);
|
||
acedGetAcadFrame()->SetFocus();
|
||
|
||
RBList mask(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT"), NULL);
|
||
dlg.GetStatus();
|
||
int nControlFlag=dlg.GetControlFlag();
|
||
|
||
|
||
lab_SelectInsert:
|
||
if(nControlFlag & LO_ALLINSERT_R) {//如果允许一次替换所有的
|
||
Entity ent;
|
||
int nRetCode=ent.FilterSelect(_T("\n选择图中将要被替换的图块: "), mask);
|
||
dlg.GetStatus();
|
||
nControlFlag=dlg.GetControlFlag();
|
||
if(!(nControlFlag & LO_ALLINSERT_R)) //替换方式发生变化
|
||
goto lab_SelectInsert;
|
||
if(nRetCode==RTNORM) {
|
||
TCHAR szBlkname[256] = _T("");
|
||
VERIFY(ent.GetData(2,szBlkname)==RTNORM);
|
||
if(szBlkname[0]==_T('*')) {
|
||
// 无名块, 不能通过块名过滤
|
||
ReplaceBlock(nControlFlag, ent,idBlock);
|
||
goto lab_SelectInsert;
|
||
} else {
|
||
RBList rb=ads_buildlist(RTDXF0,_T("INSERT,AEC_BLOCK_INSERT"),2,szBlkname,0);
|
||
PickSet ss(SS_FREE);
|
||
if(ss.Get(_T("X"),NULL,NULL,rb)==RTNORM) {
|
||
for (long j =0; j < ss.Length(); j++) {
|
||
Entity ent1=ss[j];
|
||
ReplaceBlock(nControlFlag, ent1,idBlock);
|
||
}
|
||
goto lab_SelectInsert;
|
||
} else {
|
||
ads_printf(_T("\n内部错误!不能取得同类的图块."));
|
||
ASSERT(0);
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
PickSet ss(SS_FREE);
|
||
adsout << _T("\n选择图中将要被替换的图块!");
|
||
int nRetCode=ss.Get(NULL, NULL, NULL, mask);
|
||
dlg.GetStatus();
|
||
nControlFlag=dlg.GetControlFlag();
|
||
if((nControlFlag & LO_ALLINSERT_R)) //替换方式发生变化
|
||
goto lab_SelectInsert;
|
||
|
||
if(nRetCode==RTNORM) {
|
||
long lCount=ss.Length();
|
||
for(long j=0L; j<ss.Length(); j++) {
|
||
Entity ent1=ss[j];
|
||
ReplaceBlock(nControlFlag, ent1,idBlock);
|
||
}
|
||
goto lab_SelectInsert;
|
||
}
|
||
|
||
}
|
||
int dlgTemp=dlg.m_nUseOtherBlkToRepl;
|
||
dlg.DestroyWindow();
|
||
return dlgTemp;
|
||
}
|
||
|
||
void CBlockManDlg::ReplaceBlock(int nControlFlag, Entity &ent, AcDbObjectId &idBlock)
|
||
{
|
||
XDbObject obj(ent, AcDb::kForWrite);
|
||
if(!obj) return;
|
||
AcDbBlockReference *pBlk = AcDbBlockReference::cast(obj.m_pObject);
|
||
ASSERT(pBlk);
|
||
if((nControlFlag&LO_FIXDIMENSION_R))
|
||
{
|
||
XPoint ptInsert, ptCen, ptCenOld;
|
||
double nRot, nSizeX, nSizeY, nSizeZ, nSizeX1, nSizeY1;
|
||
if(GetBlockRefSizeInfo(pBlk, ptInsert, &nRot,ptCenOld, &nSizeX, &nSizeY,&nSizeZ)!=RTNORM)
|
||
return;
|
||
pBlk->setBlockTableRecord(idBlock);
|
||
if(GetBlockRefSizeInfo(pBlk, ptInsert, &nRot,ptCen, &nSizeX1, &nSizeY1,&nSizeZ)!=RTNORM)
|
||
return;
|
||
AcGeScale3d scale=pBlk->scaleFactors();
|
||
scale[0] *= nSizeX/nSizeX1;
|
||
scale[1] *= nSizeY/nSizeY1;
|
||
pBlk->setScaleFactors(scale);
|
||
|
||
// 重新取中心
|
||
XPoint ptCenNew;
|
||
if(GetBlockRefSizeInfo(pBlk, ptInsert, &nRot,ptCenNew, &nSizeX1, &nSizeY1,&nSizeZ)!=RTNORM)
|
||
return;
|
||
ptInsert += ptCenOld-ptCenNew;
|
||
pBlk->setPosition(ptInsert); //改变基点保证位置重合
|
||
}
|
||
else
|
||
{
|
||
AcGeScale3d scale=pBlk->scaleFactors();
|
||
pBlk->setBlockTableRecord(idBlock);
|
||
pBlk->setScaleFactors(scale);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void CBlockManDlg::OnItemchangedTkList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
if(!m_bMultiSel) return;
|
||
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
|
||
int nSel = pNMListView->iItem;
|
||
|
||
if(nSel < 0 || nSel == m_nIndex){
|
||
|
||
return;
|
||
}
|
||
SelectIndex(nSel);
|
||
m_listCtrl.SetHotItem(nSel);
|
||
ResetStateText();
|
||
*pResult = 0;
|
||
}
|
||
|
||
// 改变当前项
|
||
|
||
|
||
BOOL InsertBlock(DwbStruct &rec, XString m_sFileName);
|
||
|
||
void CBlockManDlg::OnOK()
|
||
{
|
||
/* if(IsMultSelected())
|
||
return;
|
||
*/
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
|
||
if(m_nOpenMode != 2) {
|
||
|
||
DwbStruct rec;
|
||
if(GetCurRecord(rec)!=RTNORM) {
|
||
return;
|
||
}
|
||
rec.sDrawing = (const TCHAR *)(m_csTKAllName + _T("(") + (const TCHAR *)rec.sDrawing+ _T(")"));
|
||
HideDialog(TRUE);
|
||
BOOL bRet=InsertBlock(rec, m_xsFilePath);
|
||
if(bRet)
|
||
HideDialog(FALSE);
|
||
else{
|
||
|
||
CTKImageDlg::OnOK();
|
||
}
|
||
}
|
||
else{
|
||
|
||
CTKImageDlg::OnOK();
|
||
}
|
||
|
||
}
|
||
|
||
|
||
BOOL CBlockManDlg::GetBlockName(XString &xsName)
|
||
{
|
||
DwbStruct rec;
|
||
if(GetCurRecord(rec)!=RTNORM) {
|
||
return FALSE;
|
||
}
|
||
xsName = (const TCHAR *)(m_csTKAllName + _T("(") + (const TCHAR *)rec.sDrawing+ _T(")"));
|
||
return TRUE;
|
||
}
|
||
|
||
void CBlockManDlg::OnClose()
|
||
{
|
||
//ClearLib();
|
||
SaveStatus();
|
||
CTKImageDlg::OnClose();
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
int BlkMgr()
|
||
{
|
||
CBlockManDlg dlg;//(_T("D:\\tch5\\沈睿图库\\srlib2.tk"), 2);
|
||
if(!dlg.m_bInitReady) return 0;
|
||
{
|
||
CTemporaryResourceOverride vTmp;
|
||
dlg.DoModal();
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//此输出函数被componets动态调用
|
||
extern "C" HINSTANCE _hdllInstance;
|
||
|
||
__declspec(dllexport) BOOL BlockManForAutoLm(LPCTSTR pszArg0,AcDbObjectId &objId,CString &sDwbDwg)
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL InsertBlock(DwbStruct &rec, XString m_sFileName)
|
||
{
|
||
TCHAR libFile[80]=_T(""), dwgFile[80]=_T(""), blkName[80]=_T("");
|
||
XString xsDwbDwg;
|
||
xsDwbDwg=rec.sDrawing;
|
||
|
||
if(!xsDwbDwg || SplitSlbName(xsDwbDwg, libFile, dwgFile)!=RTNORM)
|
||
{
|
||
ads_printf(_T("\n内部错误:图块名称%s有问题!"),(const TCHAR *)xsDwbDwg); // ZJQ modify here
|
||
return FALSE;
|
||
}
|
||
if(LoadDwbBlock(XString(_T("%s%s"), (const TCHAR*)m_sFileName, libFile), dwgFile, blkName)!=RTNORM)//如果不存在图块,直接返回
|
||
{
|
||
ads_printf(_T("\n内部错误:无法找到并提取图块%s!"),blkName);
|
||
return FALSE;
|
||
}
|
||
|
||
int nInsFlag=IBF_MINSERT|IBF_ROT90|IBF_MIRLR|IBF_MIRUD|IBF_ALIGN
|
||
|IBF_FRAME|IBF_ROTATE|IBF_BASEPT|IBF_RESEL;
|
||
int nRet;
|
||
if(!g_nRunMode) {
|
||
nInsFlag |= IBF_TINSERT;
|
||
nRet=DragInsertBlock(blkName, nInsFlag, AcGeScale3d(1,1,1));
|
||
} else {
|
||
nRet=DragInsertBlock1(blkName, nInsFlag, AcGeScale3d(1,1,1));
|
||
}
|
||
return (nRet==IBF_RESEL)? TRUE : FALSE;
|
||
|
||
}
|
||
|
||
|
||
CString CBlockManDlg::SelectTKFile(BOOL bCreateTK)
|
||
{
|
||
CString csRet;
|
||
CString csFileName=_T("");
|
||
CFileDialog dlg(TRUE,_T("*.tk"),csFileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
|
||
_T("上华图库文件 (*.TK) |*.TK||"), this);
|
||
|
||
const TCHAR *szDlgTitle = bCreateTK? _T("选择导出的TK文件") : _T("选择导入的TK文件");
|
||
dlg.m_ofn.lpstrTitle = szDlgTitle;
|
||
dlg.m_ofn.lpstrInitialDir = g_szDirName;
|
||
|
||
if(dlg.DoModal()!=IDOK)
|
||
return csRet;
|
||
TCHAR szNewTkName[256]=_T("");
|
||
_tcscpy(szNewTkName, dlg.GetPathName());
|
||
if(bCreateTK){
|
||
if(FindFile(szNewTkName)) {
|
||
// AfxMessageBox(_T("已存在此文件!请换一文件。"));
|
||
return szNewTkName;
|
||
}
|
||
if(!CreateTKFile(szNewTkName))
|
||
return csRet;
|
||
else
|
||
return (const TCHAR*)szNewTkName;
|
||
}
|
||
else{
|
||
if(!FindFile(szNewTkName)) {
|
||
AfxMessageBox(_T("无此文件!请换一文件。"));
|
||
return csRet;
|
||
}
|
||
return szNewTkName;
|
||
}
|
||
return csRet;
|
||
}
|
||
|
||
void CBlockManDlg::OnBlkExporttk()
|
||
{
|
||
if(m_bBiginEdit) return;
|
||
|
||
CString szNewTkName = SelectTKFile(TRUE);
|
||
if(szNewTkName == _T(""))
|
||
return;
|
||
|
||
CString xsKind, xsDrawing, sItem;
|
||
XStringList lstKind, lstFilter;
|
||
CString csKind;
|
||
int nPos = 0;
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return;
|
||
}
|
||
XStringList lstCopyKind, lstCopyBlk, lstCopyDesName;
|
||
SplitStr((const TCHAR *)m_xskindFilter, lstFilter);
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
BOOL flag = TRUE;
|
||
GET_FIELD(pTable, _T("kind"), xsKind);
|
||
GET_FIELD(pTable, _T("item"), sItem);
|
||
GET_FIELD(pTable, _T("Drawing"), xsDrawing);
|
||
if(!xsDrawing){
|
||
pTable->MoveNext();
|
||
continue;
|
||
}
|
||
csKind = (const TCHAR *)xsKind;
|
||
SplitStr(csKind, lstKind);
|
||
if(lstKind.Length() < lstFilter.Length()) {
|
||
pTable->MoveNext();
|
||
continue;
|
||
}
|
||
for(int i=0; i<lstFilter.Length(); i++)
|
||
{// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
|
||
CString cs1,cs2;
|
||
cs1 = (const TCHAR *)lstKind[i]; // lstKind链表 :当前记录 -> sKind
|
||
cs2 = (const TCHAR *)lstFilter[i]; // lstFilter链表 :当前树接点
|
||
if(cs1 != cs2) {flag = FALSE; break;}
|
||
}
|
||
if(flag) {
|
||
CString csNewKind;
|
||
int len1 = lstFilter.Length();
|
||
int len2 = lstKind.Length();
|
||
for(int j=len1-1;j<len2;j++){
|
||
csNewKind = csNewKind + _T("\\") + lstKind[j];
|
||
}
|
||
if(lstCopyBlk.Index(xsDrawing, 0) < 0 ){ // 如果没有重复
|
||
lstCopyBlk.Append(tstrnew(xsDrawing));
|
||
lstCopyDesName.Append(tstrnew(sItem));
|
||
lstCopyKind.Append(tstrnew(xsKind));
|
||
}
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
pTable->Close();
|
||
int l1= lstCopyBlk.Length();
|
||
int l2 = lstCopyDesName.Length();
|
||
|
||
CString csCopyDwbFile, csCopySlbFile, csTargetDwb, csTargetSlb, strTemp;
|
||
csCopyDwbFile = (const TCHAR*)m_xsFileName; //当前TK
|
||
strTemp = csCopyDwbFile.Left(csCopyDwbFile.GetLength() - 3);
|
||
csCopyDwbFile = strTemp + _T(".DWB");
|
||
csCopySlbFile = strTemp + _T(".SLB");
|
||
csTargetDwb = szNewTkName; //新TK
|
||
strTemp = csTargetDwb.Left(csTargetDwb.GetLength() - 3);
|
||
csTargetDwb = strTemp + _T(".DWB");
|
||
csTargetSlb = strTemp + _T(".SLB");
|
||
XSlideLib SlbLibTarget(csTargetSlb);// 拷贝目标
|
||
XSlideLib SlbLibCopy(csCopySlbFile, _ios::in | _ios::binary); // 拷贝源
|
||
if(!SlbLibTarget) {
|
||
AfxMessageBox(_T("目标SLB文件打不开!"));
|
||
return;
|
||
}
|
||
if(!SlbLibCopy) {
|
||
AfxMessageBox(_T("源SLB文件打不开!"));
|
||
return;
|
||
}
|
||
XDrawingLib DwbLibTarget(csTargetDwb);
|
||
XDrawingLib DwbLibCopy(csCopyDwbFile, _ios::in | _ios::binary);
|
||
if(!DwbLibTarget) {
|
||
AfxMessageBox(_T("目标DWB文件打不开!"));
|
||
return;
|
||
}
|
||
if(!DwbLibCopy) {
|
||
AfxMessageBox(_T("源DWB文件打不开!"));
|
||
return;
|
||
}
|
||
TCHAR dwgPrefix[256]=_T("");
|
||
TCHAR sldPrefix[256]=_T("");
|
||
TCHAR tempPrefix[256]=_T("");
|
||
GetTempPath(255, tempPrefix);
|
||
if(tempPrefix[_tcslen(tempPrefix)-1]!=_T('\\'))
|
||
_tcscat(tempPrefix, _T("\\"));
|
||
_tcscat(tempPrefix, _T("SRTEMP\\"));
|
||
MakeDir(tempPrefix);
|
||
XStringList lstSlbLib,lstDwbLib;
|
||
lstSlbLib.Reset();
|
||
SlbLibCopy.GetAll(lstSlbLib);
|
||
lstDwbLib.Reset();
|
||
DwbLibCopy.GetAll(lstDwbLib);
|
||
XDbfTable *pTableNew = db.Open(szNewTkName);
|
||
if(!pTableNew) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return;
|
||
}
|
||
|
||
int nTotalRec=lstCopyBlk.Length();
|
||
acedSetStatusBarProgressMeter(XString(_T("导出%d个选中的图块"), nTotalRec), 0, nTotalRec);
|
||
|
||
for(int i=0;i<lstCopyBlk.Length();i++) {
|
||
acedSetStatusBarProgressMeterPos(i);
|
||
XString xsResStr;
|
||
if(GetNextItem(csTargetDwb, xsResStr)!=RTNORM) {
|
||
AfxMessageBox(_T("Dwb文件中无法添加该图块!"));
|
||
return;
|
||
}
|
||
_tcscpy(sldPrefix, tempPrefix);
|
||
_tcscpy(dwgPrefix, tempPrefix);
|
||
_tcscat(sldPrefix, lstCopyBlk[i]);
|
||
_tcscat(sldPrefix, _T(".sld"));
|
||
int index = -1;
|
||
index = lstSlbLib.Index(lstCopyBlk[i], FALSE);
|
||
if(index > -1){
|
||
SlbLibCopy.Copy(index, sldPrefix);
|
||
SlbLibTarget.Append(sldPrefix, xsResStr);
|
||
_tremove(sldPrefix);
|
||
}
|
||
else {
|
||
AfxMessageBox(_T("Slb文件中无法找到该图块!"));
|
||
continue;
|
||
}
|
||
_tcscat(dwgPrefix, lstCopyBlk[i]);
|
||
_tcscat(dwgPrefix, _T(".dwg"));
|
||
index = -1;
|
||
index = lstDwbLib.Index(lstCopyBlk[i], FALSE);
|
||
if(index > -1){
|
||
DwbLibCopy.Copy(index, dwgPrefix);
|
||
int f = DwbLibTarget.Append(dwgPrefix, xsResStr);
|
||
_tremove(dwgPrefix);
|
||
}
|
||
else {
|
||
AfxMessageBox(_T("Dwb文件中无法找到该图块!"));
|
||
continue;
|
||
}
|
||
pTableNew->AppendBegin();
|
||
SET_FIELD(pTableNew, _T("kind"), lstCopyKind[i]);
|
||
SET_FIELD(pTableNew, _T("Item"), lstCopyDesName[i]);
|
||
SET_FIELD(pTableNew, _T("Drawing"), xsResStr);
|
||
pTableNew->AppendEnd();
|
||
}
|
||
acedRestoreStatusBar();
|
||
return;
|
||
}
|
||
|
||
void CBlockManDlg::OnBlkImport()
|
||
{
|
||
if(m_bBiginEdit) return;
|
||
CString csNewTK = SelectTKFile(FALSE);
|
||
if(csNewTK == _T(""))
|
||
return;
|
||
|
||
//打开SLB, DWB文件
|
||
CString csCopyDwbFile, csCopySlbFile, csTargetDwb, csTargetSlb, strTemp;
|
||
csCopyDwbFile = csNewTK; //新TK, 源TK
|
||
strTemp = csCopyDwbFile.Left(csCopyDwbFile.GetLength() - 3);
|
||
csCopyDwbFile = strTemp + _T(".DWB");
|
||
csCopySlbFile = strTemp + _T(".SLB");
|
||
csTargetDwb = (const TCHAR*)m_xsFileName; //当前TK, 目标TK
|
||
strTemp = csTargetDwb.Left(csTargetDwb.GetLength() - 3);
|
||
csTargetDwb = strTemp + _T(".DWB");
|
||
csTargetSlb = strTemp + _T(".SLB");
|
||
XSlideLib SlbLibTarget(csTargetSlb);// 拷贝目标
|
||
XSlideLib SlbLibCopy(csCopySlbFile, _ios::in | _ios::binary); // 拷贝源
|
||
if(!SlbLibTarget) {
|
||
AfxMessageBox(_T("目标SLB文件打不开!"));
|
||
return;
|
||
}
|
||
if(!SlbLibCopy) {
|
||
AfxMessageBox(_T("源SLB文件打不开!"));
|
||
return;
|
||
}
|
||
XDrawingLib DwbLibTarget(csTargetDwb);
|
||
XDrawingLib DwbLibCopy(csCopyDwbFile, _ios::in | _ios::binary);
|
||
if(!DwbLibTarget) {
|
||
AfxMessageBox(_T("目标DWB文件打不开!"));
|
||
return;
|
||
}
|
||
if(!DwbLibCopy) {
|
||
AfxMessageBox(_T("源DWB文件打不开!"));
|
||
return;
|
||
}
|
||
|
||
TCHAR dwgPrefix[256]=_T("");
|
||
TCHAR sldPrefix[256]=_T("");
|
||
TCHAR tempPrefix[256]=_T("");
|
||
GetTempPath(255, tempPrefix);
|
||
if(tempPrefix[_tcslen(tempPrefix)-1]!=_T('\\'))
|
||
_tcscat(tempPrefix, _T("\\"));
|
||
_tcscat(tempPrefix, _T("SRTEMP\\"));
|
||
MakeDir(tempPrefix);
|
||
XStringList lstSlbLib,lstDwbLib;
|
||
lstSlbLib.Reset();
|
||
SlbLibCopy.GetAll(lstSlbLib);
|
||
lstDwbLib.Reset();
|
||
DwbLibCopy.GetAll(lstDwbLib);
|
||
|
||
//打开TK文件
|
||
XStringList lstCopyKind, lstCopyBlk, lstCopyDesName;
|
||
CodeBase db;
|
||
CString xsKind, xsDrawing, xsItem;
|
||
XDbfTable *pTable = db.Open(csNewTK);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return;
|
||
}
|
||
XDbfTable *pTable2 = db.Open(m_xsFileName);
|
||
if(!pTable2) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return;
|
||
}
|
||
|
||
int nTotalRec=pTable->GetRecordCount(TRUE);
|
||
acedSetStatusBarProgressMeter(XString(_T("导入%d个选中的图块"), nTotalRec), 0, nTotalRec);
|
||
|
||
int idx=0;
|
||
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext(), idx++) {
|
||
acedSetStatusBarProgressMeterPos(idx);
|
||
BOOL flag = TRUE;
|
||
GET_FIELD(pTable, _T("kind"), xsKind);
|
||
GET_FIELD(pTable, _T("item"), xsItem);
|
||
GET_FIELD(pTable, _T("Drawing"), xsDrawing);
|
||
if(!xsDrawing)
|
||
continue;
|
||
XString xsResStr;
|
||
if(GetNextItem(csTargetDwb, xsResStr)!=RTNORM) {
|
||
AfxMessageBox(_T("Dwb文件中无法添加该图块!"));
|
||
return;
|
||
}
|
||
_tcscpy(sldPrefix, tempPrefix);
|
||
_tcscpy(dwgPrefix, tempPrefix);
|
||
_tcscat(sldPrefix, xsDrawing);
|
||
_tcscat(sldPrefix, _T(".sld"));
|
||
int index = -1;
|
||
index = lstSlbLib.Index(xsDrawing, FALSE);
|
||
if(index > -1){
|
||
SlbLibCopy.Copy(index, sldPrefix);
|
||
SlbLibTarget.Append(sldPrefix, xsResStr);
|
||
_tremove(sldPrefix);
|
||
} else {
|
||
AfxMessageBox(_T("Slb文件中无法找到该幻灯!"));
|
||
continue;
|
||
}
|
||
_tcscat(dwgPrefix, xsDrawing);
|
||
_tcscat(dwgPrefix, _T(".dwg"));
|
||
index = -1;
|
||
index = lstDwbLib.Index(xsDrawing, FALSE);
|
||
if(index > -1){
|
||
DwbLibCopy.Copy(index, dwgPrefix);
|
||
int f = DwbLibTarget.Append(dwgPrefix, xsResStr);
|
||
_tremove(dwgPrefix);
|
||
} else {
|
||
AfxMessageBox(_T("Dwb文件中无法找到该图块!"));
|
||
continue;
|
||
}
|
||
//if(lstCopyBlk.Index(xsDrawing, 0) < 0 ){ // 如果没有重复
|
||
// lstCopyBlk.Append(tstrnew(xsResStr));
|
||
//lstCopyDesName.Append(tstrnew(xsItem));
|
||
if(m_xskindFilter != _T("")){
|
||
CString csKind;
|
||
csKind=(const TCHAR *)xsKind;
|
||
if(csKind != _T(""))
|
||
csKind = _T("\\") + csKind;
|
||
csKind = CString((const TCHAR*)m_xskindFilter) + csKind;
|
||
xsKind = (const TCHAR *)csKind;
|
||
}
|
||
//lstCopyKind.Append(tstrnew(xsKind));
|
||
pTable2->AppendBegin();
|
||
SET_FIELD(pTable2, _T("kind"), (LPCTSTR)xsKind);
|
||
SET_FIELD(pTable2, _T("Item"), (LPCTSTR)xsItem);
|
||
SET_FIELD(pTable2, _T("Drawing"), (LPCTSTR)xsResStr);
|
||
pTable2->AppendEnd();
|
||
//}
|
||
}
|
||
acedRestoreStatusBar();
|
||
|
||
|
||
//for(int i=0;i<lstCopyBlk.Length();i++)
|
||
//{
|
||
//}
|
||
m_nIndex = 0;
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
InitBaseData();
|
||
SetupTreeView();
|
||
SetStateText(_T("已成功拷贝幻灯片!"));
|
||
}
|
||
|
||
void CBlockManDlg::OnBegindragTkTree(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
||
m_dragItem = pNMTreeView->itemNew.hItem;
|
||
if( m_treeCtrl.GetParentItem( m_dragItem ) != NULL ) {
|
||
CImageList* pDragImage;
|
||
pDragImage = m_treeCtrl.CreateDragImage( m_dragItem );
|
||
m_treeCtrl.SelectItem( m_dragItem );
|
||
pDragImage->BeginDrag( 0, CPoint(0,0) );
|
||
pDragImage->DragEnter( &m_treeCtrl, pNMTreeView->ptDrag );
|
||
SetCapture();
|
||
m_bNodeIsDragging = TRUE;
|
||
delete pDragImage; //必须
|
||
}
|
||
*pResult = 0;
|
||
}
|
||
|
||
|
||
|
||
|
||
BOOL CBlockManDlg::SetNewType(const TCHAR* szDragTaget)
|
||
{
|
||
XString xsDragTaget = szDragTaget;
|
||
XStringList lstKind, lstFilter;
|
||
CString xsKind;
|
||
CString csKind;
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(m_xsFileName);
|
||
if(!pTable) {
|
||
AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
SplitStr((const TCHAR *)m_xskindFilter, lstFilter);
|
||
pTable->MoveFirst();
|
||
while(!pTable->IsEOF()) {
|
||
BOOL flag = TRUE;
|
||
GET_FIELD(pTable, _T("kind"), xsKind);
|
||
csKind = (const TCHAR *)xsKind;
|
||
SplitStr(csKind, lstKind);
|
||
if(lstKind.Length() < lstFilter.Length()) {
|
||
pTable->MoveNext();
|
||
continue;
|
||
}
|
||
for(int i=0; i<lstFilter.Length(); i++)
|
||
{// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
|
||
CString cs1,cs2;
|
||
cs1 = (const TCHAR *)lstKind[i]; // lstKind链表 :当前记录 -> sKind
|
||
cs2 = (const TCHAR *)lstFilter[i]; // lstFilter链表 :当前树接点
|
||
if(cs1 != cs2) {flag = FALSE; break;}
|
||
}
|
||
if(flag) {
|
||
CString csNewKind;
|
||
int len1 = lstFilter.Length();
|
||
int len2 = lstKind.Length();
|
||
for(int j=len1-1;j<len2;j++){
|
||
if(j == len1 -1)
|
||
csNewKind = (const TCHAR *)lstKind[j];
|
||
else
|
||
csNewKind = csNewKind + _T("\\") + (const TCHAR *)lstKind[j];
|
||
}
|
||
if(!xsDragTaget)
|
||
csNewKind = csNewKind; //移动至根
|
||
else{
|
||
csNewKind = _T("\\") + csNewKind;
|
||
csNewKind = (const TCHAR*)xsDragTaget + csNewKind;
|
||
}
|
||
SET_FIELD(pTable, _T("kind"), (const TCHAR*)csNewKind);
|
||
}
|
||
pTable->MoveNext();
|
||
}
|
||
pTable->Close();
|
||
return TRUE;
|
||
}
|
||
|
||
void CBlockManDlg::OnSelectSysLib(const TCHAR* szTkName)
|
||
{
|
||
XString xsTkName = szTkName;
|
||
if(xsTkName != m_xsFileName) {
|
||
m_xsFileName=xsTkName;
|
||
if(m_nOpenMode != 0)
|
||
SaveStatus2();
|
||
else
|
||
SaveStatus();
|
||
|
||
m_xskindFilter = _T("");
|
||
ReadFile();
|
||
m_nIndex= m_lstBlk.Length()>0 ? 0:-1;
|
||
InitBaseData();
|
||
SetupTreeView();
|
||
|
||
SetListHighLight();
|
||
SetStateText(_T("选库操作完毕!"));
|
||
if(m_nOpenMode != 0) return; //只有方式0才可以复制
|
||
if((_tcscmp((const TCHAR*)m_csCopyTKFile, (const TCHAR*)m_xsFileName) != 0)
|
||
&& (m_lstCopyBlk.Length() >0)){
|
||
m_ToolBar.EnableButton(ID_BLK_PASTE, TRUE);
|
||
}
|
||
else
|
||
m_ToolBar.EnableButton(ID_BLK_PASTE, FALSE);
|
||
|
||
}
|
||
}
|
||
|
||
BOOL CBlockManDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
||
{
|
||
CString csCommand, csTKFullName;
|
||
if(!m_pPopupMenu)
|
||
return CTKImageDlg::OnCommand(wParam, lParam);
|
||
m_pPopupMenu->GetMenuString(wParam,csCommand,MF_BYCOMMAND); //判断用户是否点的是弹出菜单
|
||
if(csCommand.IsEmpty())
|
||
return CTKImageDlg::OnCommand(wParam, lParam);
|
||
m_nMenuItem = 0;
|
||
/* GetTkForName(csCommand, csTKFullName);
|
||
if(!csTKFullName.IsEmpty() && FindFile(csTKFullName)){
|
||
OnSelectSysLib((const char*)csTKFullName);
|
||
m_nMenuItem = wParam;
|
||
return TRUE;
|
||
}
|
||
else if(!FindFile(csTKFullName) && !csTKFullName.IsEmpty())
|
||
MessageBox("没有找到库文件!请确认安装是否完全。");*/
|
||
return CTKImageDlg::OnCommand(wParam, lParam);
|
||
}
|
||
|
||
void CBlockManDlg::SwapFlipImage(int from_image, int to_image)
|
||
{
|
||
CClientDC dc(&m_ImageBox);
|
||
if(IsValid(to_image)) {
|
||
m_lstImage[to_image]->SetDC(&dc);
|
||
m_lstImage[to_image]->SetBackColor ( RGB(0,128,192));
|
||
m_lstImage[to_image]->Redraw();
|
||
m_lstImage[to_image]->SetDC(NULL);
|
||
}
|
||
if(IsValid(from_image)) {
|
||
int pageSize = PageSize();
|
||
int index = CurPage()*pageSize + from_image;
|
||
m_lstImage[from_image]->SetDC(&dc);
|
||
if(IsSelected(index))
|
||
m_lstImage[from_image]->SetBackColor(RGB(0,128,192));
|
||
else
|
||
m_lstImage[from_image]->SetBackColor(GetAcadBackColor());
|
||
|
||
m_lstImage[from_image]->Redraw();
|
||
m_lstImage[from_image]->SetDC(NULL);
|
||
}
|
||
CTKImageDlg::SwapFlipImage(from_image, to_image);
|
||
}
|
||
|
||
void CBlockManDlg::OnUpdateSort(CCmdUI* pCmdUI)
|
||
{
|
||
if (m_bSort)
|
||
{
|
||
m_menu.CheckMenuItem(ID_BLK_SORT,MF_UNCHECKED);
|
||
m_ToolBar.CheckButton(ID_BLK_SORT,0);
|
||
}
|
||
else
|
||
{
|
||
m_menu.CheckMenuItem(ID_BLK_SORT,MF_CHECKED);
|
||
m_ToolBar.CheckButton(ID_BLK_SORT,1);
|
||
}
|
||
}
|
||
|