// 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;iLimitText(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; isItem == (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 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; isItem); } } //取得所有的组的名称,即过滤的名称 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; j0)){ 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=m_nMaxRecentBlb) m_lstBlbNames.Remove(0); m_lstBlbNames.Append(tstrnew(m_xsFileName)); nLen=m_lstBlbNames.Length(); for(i=0; isDrawing+ _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 && nItem0 ? 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;isDrawing){ 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; iSetDC(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;iClose(); 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;iAppendMenu(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 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 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 expert(_T("EXPERT"), 5); //XPushVar 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<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; isDrawing == 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 osmode(_T("OSMODE"), 0); XPushVar 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 -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 && indexsKind; if(m_nOpenMode != 0) SaveStatus2(); else SaveStatus(); ReadFile(); InitBaseData(); for(int i=0; isItem == 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 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 <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; jsetBlockTableRecord(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 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;jMoveNext(); } 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 -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;iitemNew.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 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;jMoveNext(); } 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); } }