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

3361 lines
89 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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);
}
}