// TKTreeCtrl.cpp : implementation file // #include "stdafx.h" #include "TKTreeCtrl.h" #include "BlkManReplaceOption.h" #include "Progresswnd.h" #include "XFilePathName.h" #include "tkwfile.h" #include "NewDbfAccessTools.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern void SplitStr(const TCHAR *szInput, XStringList& lstKind); extern const XString ConnectStr(XStringList& lstKind, int index, XString xsNew); extern CString GetFileNameByAllName(const TCHAR* szAllFileName); extern CString GetPathNameByAllName(const TCHAR* szAllFileName); int GetNextDrawing(const TCHAR *tkName, TCHAR *dwg); BOOL IsKindInKind(const TCHAR* szKind, const TCHAR* szFilterKind, CString &csNewType) { CString csKind, csFilterKind; csKind = szKind; csFilterKind = szFilterKind; BOOL bRet = TRUE; XStringList lstKind, lstFilterKind; SplitStr(csKind, lstKind); SplitStr(csFilterKind, lstFilterKind); if(lstKind.Length() < lstFilterKind.Length()) return FALSE; CString csHeadType; for(int i=0; i sKind cs2 = (const TCHAR *)lstFilterKind[i]; if(cs1 != cs2) { bRet = FALSE; break; } else if(i != (lstFilterKind.Length() - 1)){ csHeadType += cs1; csHeadType += _T("\\"); } } if(bRet) csNewType = csKind.Right(csKind.GetLength() - csHeadType.GetLength()); return bRet; } //取得所有的组的名称,即过滤的名称 void GetTKFilterList(const TCHAR* szTKName, XStringList &lstKindName) { CString csTKName = szTKName; lstKindName.Reset(); CString sKind; //类别 CodeBase db; db.read_only = 1; XDbfTable *pTable = db.Open(csTKName); if(!pTable) return; for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) { GET_FIELD(pTable, _T("kind"), sKind); if(lstKindName.Index(sKind, 0) < 0 ) // 如果没有重复 lstKindName.Append(tstrnew(sKind)); } lstKindName.QuickSort(_tcscmp); } void GetTKWFilterList(const TCHAR* szTKWName, XStringList &lstKindName) { CString csTKWName = szTKWName; XStringList lstTKFiles; CString csDes, csVer; CTkwFile tkw(csTKWName); tkw.GetTKList(lstTKFiles); lstKindName.Reset(); CString sKind; //类别 for(int i=0;iMoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) { GET_FIELD(pTable, _T("kind"), sKind); if(lstKindName.Index(sKind, 0) < 0 ) // 如果没有重复 lstKindName.Append(tstrnew(sKind)); } } lstKindName.QuickSort(_tcscmp); } //GEOAPI BOOL GetBlcCtrlPoint(AcDbObjectId id, XPoint &ptMax); BOOL DoReplaceBlock(int nControlFlag, Entity &ent, AcDbObjectId &idBlock) { BOOL bRet=FALSE; XDbObject obj(ent, AcDb::kForWrite); if(!obj) return bRet; AcDbBlockReference *pBlk = AcDbBlockReference::cast(obj.m_pObject); TDbMultiViewInsert *pMv = TDbMultiViewInsert::cast(obj.m_pObject); if(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 bRet; pBlk->setBlockTableRecord(idBlock); if(GetBlockRefSizeInfo(pBlk, ptInsert, &nRot,ptCen, &nSizeX1, &nSizeY1,&nSizeZ)!=RTNORM) return bRet; 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 bRet; ptInsert += ptCenOld-ptCenNew; pBlk->setPosition(ptInsert); //改变基点保证位置重合 bRet=TRUE; } else if(nControlFlag&LO_FIX_POINT)//add by whl,通过右上角控制点对齐来替换图块,插入点不变 { XPoint ptMax0,ptMax1; GetBlcCtrlPoint(pBlk->blockTableRecord(),ptMax0); GetBlcCtrlPoint(idBlock,ptMax1); double sx=ptMax1.x/ptMax0.x; double sy=ptMax1.y/ptMax0.y; AcGeScale3d scale=pBlk->scaleFactors(); scale[0] /= sx; scale[1] /= sy; pBlk->setScaleFactors(scale); pBlk->setBlockTableRecord(idBlock); bRet=true; } else{ AcGeScale3d scale=pBlk->scaleFactors(); pBlk->setBlockTableRecord(idBlock); pBlk->setScaleFactors(scale); bRet=TRUE; } } else if(pMv) { // extern TARCH_IMPEXP AcDbObjectId GetBlock2dFromBlock3d(AcDbObjectId idBlock); AcDbObjectId idBlock2d=GetBlock2dFromBlock3d(idBlock); if(idBlock2d.isValid()) { //多视图块只允许用多视图块来替换 if((nControlFlag&LO_FIXDIMENSION_R)) { XPoint ptInsert, ptCen, ptCenOld; double nRot, nSizeX, nSizeY, nSizeZ, nSizeX1, nSizeY1; AcDbBlockReference *pTempBlk=pMv->NewBlock(TRUE); if(GetBlockRefSizeInfo(pTempBlk, ptInsert, &nRot,ptCenOld, &nSizeX, &nSizeY,&nSizeZ)!=RTNORM) { delete pTempBlk; return bRet; } pTempBlk->setBlockTableRecord(idBlock); pMv->SetBlockId(TRUE, idBlock); pMv->SetBlockId(FALSE, idBlock2d); int nRetCode=GetBlockRefSizeInfo(pTempBlk, ptInsert, &nRot,ptCen, &nSizeX1, &nSizeY1,&nSizeZ); if(nRetCode!=RTNORM) { delete pTempBlk; return bRet; } AcGeScale3d scale=pMv->GetScaleFactors(); scale[0] *= nSizeX/nSizeX1; scale[1] *= nSizeY/nSizeY1; pMv->SetScaleFactors(scale); pTempBlk->setScaleFactors(scale); // 重新取中心 XPoint ptCenNew; nRetCode = GetBlockRefSizeInfo(pTempBlk, ptInsert, &nRot,ptCenNew, &nSizeX1, &nSizeY1,&nSizeZ); delete pTempBlk; if(nRetCode!=RTNORM) return bRet; ptInsert += ptCenOld-ptCenNew; pMv->SetLocation(ptInsert); //改变基点保证位置重合 bRet=TRUE; } else { //AcGeScale3d scale=pMv->scaleFactors(); pMv->SetBlockId(TRUE, idBlock); pMv->SetBlockId(FALSE, idBlock2d); //pBlk->setScaleFactors(scale); bRet=TRUE; } } } return bRet; } ///////////////////////////////////////////////////////////////////////////// // CTKTreeCtrl CTKTreeCtrl::CTKTreeCtrl() { m_bNeedMenu = TRUE; m_csTKWFile = _T(""); m_csCurKind = _T(""); m_bMerge = FALSE; m_bLock = FALSE; m_bCellIsDragging = FALSE; m_bNodeIsDragging = FALSE; m_dragItem = NULL; m_dragTarget = NULL; m_bIsJpgShow = FALSE; m_bCopyAndDel = FALSE; } CTKTreeCtrl::~CTKTreeCtrl() { } BEGIN_MESSAGE_MAP(CTKTreeCtrl, CTreeCtrl) //{{AFX_MSG_MAP(CTKTreeCtrl) ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick) ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnBeginlabeledit) ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit) ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CTKTreeCtrl::SetDataSource(const TCHAR* szTKWFile) { CString csTKWFile = szTKWFile; XString fullFile; if(!FindFile(csTKWFile, fullFile)) {//目录已经不存在 AfxMessageBox(_T("TKW文件不存在")); return; } m_csTKWFile = csTKWFile; CTkwFile tkw(m_csTKWFile); tkw.GetTKList(m_lstTKFiles); m_csVersion = tkw.m_csVersion; m_csDescrption = tkw.m_csDescription; m_bIsJpgShow = tkw.m_bIsJpg; SetupTreeData(); Expand(GetRootItem(), TVE_EXPAND); } //初始化TREEVIEW时调用: insert节点 时看它是否已存在 HTREEITEM CTKTreeCtrl::FindTreeNode(HTREEITEM hItem, const TCHAR* szNode) { CString csNode = szNode; HTREEITEM htree; CString csCurText; htree = GetChildItem(hItem); csCurText = GetItemText(htree); if(csCurText == csNode) return htree; while( htree=GetNextSiblingItem(htree)) { csCurText = GetItemText(htree); if(csCurText == csNode) return htree; } return 0; } void CTKTreeCtrl::GetNodeAllPath(HTREEITEM htree, CString &csTKName, CString &csAllType) { //add by cwk on 060912 if (htree == NULL) return; CString csCur, csNodeName; csCur = GetItemText(htree); csNodeName = csCur; HTREEITEM hTmp = NULL; HTREEITEM hRoot = GetRootItem(); hTmp = GetParentItem(htree); if(hTmp == hRoot){ DWORD_PTR dwAllTk = GetItemData(htree); CString csAllTk; if(dwAllTk){ TCHAR szAlltk[1024]; _tcscpy(szAlltk, (const TCHAR*)dwAllTk); csAllTk = szAlltk; } for(int i=0;iDeleteMenu(2, MF_BYPOSITION); //删除“批量入库”“新图入库” pSubMenu->DeleteMenu(2, MF_BYPOSITION); pSubMenu->DeleteMenu(2, MF_BYPOSITION); } } else{ // TK类别结点 pSubMenu = Menu.GetSubMenu(3); if(!m_bNeedMenu){ pSubMenu->DeleteMenu(3, MF_BYPOSITION); //删除“批量入库”“新图入库” pSubMenu->DeleteMenu(3, MF_BYPOSITION); pSubMenu->DeleteMenu(3, MF_BYPOSITION); } } if(pSubMenu) pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, GetParent(), NULL); SetFocus(); *pResult = 0; } void CTKTreeCtrl::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult) { TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; m_bLock = TRUE; *pResult = 0; } void CTKTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) { if(m_bMerge) return; TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; CEdit* pEdit = GetEditControl(); CString csNew, csOld; pEdit->GetWindowText(csNew); HTREEITEM htree; htree = GetSelectedItem(); CString csCurTKName, csCurType; GetNodeAllPath(htree, csCurTKName, csOld); if(csNew == _T("")) { *pResult = FALSE; m_bLock = TRUE; SetFocus(); EditLabel(htree); //继续改名 return; } if(csNew == csOld || csOld == _T("")) { m_bLock = FALSE; *pResult = 0; return; } // 如果没有变化,则退出 if(csNew.Find(_T('\\')) != -1){ m_bLock = FALSE; AfxMessageBox(_T("节点名称中不可包括字符'\\'!")); *pResult = FALSE; return ; } XStringList lstKind, lstFilter; CString csKind, csFilter; csFilter = csOld; CString sKind; //类别 CodeBase db; XDbfTable *pTable = db.Open(csCurTKName); if(!pTable) { AfxMessageBox(XString(_T("%s文件只读或损坏!"), (const TCHAR *)csCurTKName)); m_bLock = FALSE; return; } SplitStr((const TCHAR*)csFilter, lstFilter); for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) { 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()) 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, (const TCHAR*)csNew); SET_FIELD(pTable, _T("kind"), (LPCTSTR)sKind); } } SetItemText(htree, csNew); m_bLock = FALSE; *pResult = 0; return ; } void CTKTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) { if(m_bNodeIsDragging == TRUE){ // 类别拖动 CImageList::DragLeave(this); CImageList::EndDrag(); ReleaseCapture(); SelectDropTarget(NULL); HTREEITEM hOldSelItem = GetSelectedItem(); HTREEITEM hParent = GetParentItem(m_dragTarget); m_bNodeIsDragging = FALSE; if((m_dragTarget != NULL) && (m_dragTarget != hOldSelItem) && (GetParentItem(m_dragItem) != m_dragTarget) && (m_dragTarget != GetRootItem())) { BOOL bIsChild = FALSE; HTREEITEM hItem = hParent; while(hItem != NULL){ if(hItem == m_dragItem){ bIsChild = TRUE; MessageBox(_T("对不起,不能将父类别移动至其子类别下!")); break; } hItem = GetParentItem(hItem); } if(!bIsChild){ CString csTKName, csType, csOldTKName, csOldType; GetNodeAllPath(m_dragTarget, csTKName, csType); GetNodeAllPath(hOldSelItem, csOldTKName, csOldType); if(csTKName == csOldTKName) MoveNodeInThisTK(csTKName, csType, csOldType); else{ if(m_bIsJpgShow) CopyJpgNodeInOtherTK(csTKName, csOldTKName, csType, csOldType); else CopyNodeInOtherTK(csTKName, csOldTKName, csType, csOldType); } if(csType == _T("")) m_csCurKind = GetItemText(hOldSelItem); //移动至根 else{ m_csCurKind = _T("\\") + GetItemText(hOldSelItem); m_csCurKind = csType + m_csCurKind; } SetDataSource(m_csTKWFile); Expand(GetSelectedItem(), TVE_EXPAND); } } Invalidate(); UpdateWindow();// 刷新 m_dragTarget=NULL; } CTreeCtrl::OnLButtonUp(nFlags, point); } BOOL CTKTreeCtrl::DoDragBlk(XStringList &lstBlk) { BOOL bRet = TRUE; HTREEITEM hOldSelItem; HTREEITEM hParent = GetParentItem(m_dragTarget); hOldSelItem = GetSelectedItem(); if((m_dragTarget != NULL) && (m_dragTarget != hOldSelItem) && (GetParentItem(m_dragItem) != m_dragTarget) && (m_dragTarget != GetRootItem())) { CString csTKName, csType, csOldTKName, csOldType; GetNodeAllPath(m_dragTarget, csTKName, csType); GetNodeAllPath(hOldSelItem, csOldTKName, csOldType); if(csTKName == csOldTKName){ bRet = MoveBlkInThisTK(csTKName, csType, csOldType, lstBlk); m_bCopyAndDel = TRUE; } else{ if(m_bIsJpgShow) bRet = CopyJpgBlkInOtherTK(csTKName, csOldTKName, csType, csOldType, lstBlk); else bRet = CopyBlkInOtherTK(csTKName, csOldTKName, csType, csOldType, lstBlk); // SelectItem(m_dragTarget); //TK间拷贝图块(更改当前树结点),TK内移动图块(不更改当前树结点) } } else return FALSE; return bRet; } BOOL CTKTreeCtrl::MoveBlkInThisTK(const TCHAR* szTKRes, const TCHAR* szType, const TCHAR* szOldType, XStringList &lstBlk) { CString csTKRes, csType, csOldType; csTKRes = szTKRes; csType = szType; csOldType = szOldType; CodeBase db; XDbfTable *pTable = db.Open(csTKRes); if(!pTable) { AfxMessageBox(_T("TK文件只读或损坏!")); return FALSE; } for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) { CString sKind, sItem, sDrawing; GET_FIELD(pTable, _T("kind"), sKind); GET_FIELD(pTable, _T("item"), sItem); GET_FIELD(pTable, _T("Drawing"), sDrawing); for(int i=0;iGetPosition(); pTable->Delete(); pTable->AppendBegin(); SET_FIELD(pTable, _T("kind"), (const TCHAR*)csType); SET_FIELD(pTable, _T("item"), (LPCTSTR)sItem); SET_FIELD(pTable, _T("Drawing"), (LPCTSTR)sDrawing); pTable->AppendEnd(); pTable->MoveTo(pos); break; } } } return TRUE; } BOOL CTKTreeCtrl::CopyBlkInOtherTK(const TCHAR* szTKTarget, const TCHAR* szTKRes, const TCHAR* szTarType, const TCHAR* szResType, XStringList &lstBlk) { CString csTKTarget, csTKRes, csTarType, csResType; csTKTarget = szTKTarget; csTKRes = szTKRes; csTarType = szTarType; csResType = szResType; SHORT nStateShift = GetKeyState(VK_SHIFT); BOOL bShift = (nStateShift&256)!=0; m_bCopyAndDel = bShift; //打开SLB, DWB文件 CString csResDwbFile, csResSlbFile, csTargetDwb, csTargetSlb; csResDwbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".DWB"); csResSlbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".SLB"); csTargetDwb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".DWB"); csTargetSlb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".SLB"); XSlideLib SlbLibTarget(csTargetSlb);// 拷贝目标 XSlideLib SlbLibRes(csResSlbFile, _ios::in | _ios::binary); // 拷贝源 if(!SlbLibTarget) { AfxMessageBox(_T("目标SLB文件打不开!")); return FALSE; } if(!SlbLibRes) { AfxMessageBox(_T("源SLB文件打不开!")); return FALSE; } XDrawingLib DwbLibTarget(csTargetDwb); XDrawingLib DwbLibRes(csResDwbFile, _ios::in | _ios::binary); if(!DwbLibTarget) { AfxMessageBox(_T("目标DWB文件打不开!")); return FALSE; } if(!DwbLibRes) { AfxMessageBox(_T("源DWB文件打不开!")); return FALSE; } { // db CodeBase db; XDbfTable *pTableRes = db.Open(csTKRes); if(!pTableRes) { AfxMessageBox(_T("源TK文件只读或损坏!")); return FALSE; } XDbfTable *pTableTarget = db.Open(csTKTarget); if(!pTableTarget) { AfxMessageBox(_T("目标TK文件只读或损坏!")); return FALSE; } TCHAR dwgPrefix[1024]=_T(""); TCHAR sldPrefix[1024]=_T(""); TCHAR tempPrefix[1024]=_T(""); GetTempPath(255, tempPrefix); XStringList lstSlbLib,lstDwbLib; lstSlbLib.Reset(); lstDwbLib.Reset(); SlbLibRes.GetAll(lstSlbLib); DwbLibRes.GetAll(lstDwbLib); int nNum = lstBlk.Length(); acedSetStatusBarProgressMeter(XString(_T("拷贝%d个图块"), nNum), 0, nNum); int idx = 0; for(pTableRes->MoveFirst(); !pTableRes->IsEOF(); pTableRes->MoveNext()) { CString xsKind, xsDrawing, xsItem; GET_FIELD(pTableRes, _T("kind"), xsKind); GET_FIELD(pTableRes, _T("item"), xsItem); GET_FIELD(pTableRes, _T("Drawing"), xsDrawing); CString csNewKind; if(xsDrawing == _T("")) continue; BOOL bFlag = FALSE; for(int i=0;i -1){ SlbLibRes.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){ DwbLibRes.Copy(index, dwgPrefix); DwbLibTarget.Append(dwgPrefix, xsResStr); _tremove(dwgPrefix); } else { AfxMessageBox(_T("Dwb文件中无法找到该图块!")); continue; } pTableTarget->AppendBegin(); SET_FIELD(pTableTarget, _T("kind"), (const TCHAR*)csTarType); SET_FIELD(pTableTarget, _T("Item"), (LPCTSTR)xsItem); SET_FIELD(pTableTarget, _T("Drawing"), (LPCTSTR)xsResStr); pTableTarget->AppendEnd(); } } // end db if(bShift){ for(int i=0;iMoveFirst(); !pTableRes->IsEOF(); pTableRes->MoveNext()) { CString xsKind, xsDrawing, xsItem; GET_FIELD(pTableRes, _T("kind"), xsKind); GET_FIELD(pTableRes, _T("item"), xsItem); GET_FIELD(pTableRes, _T("Drawing"), xsDrawing); CString csNewKind; if(xsDrawing == _T("")) continue; BOOL bFlag = FALSE; for(int i=0;i -1){ JpbLibRes.Copy(indexJpb, jpgPrefix); JpbLibTarget.Append(jpgPrefix, xsResStr); _tremove(jpgPrefix); } else { AfxMessageBox(_T("Jpb文件中无法找到该图片!")); continue; } _tcscat(dwg2dPrefix, xsDrawing); _tcscat(dwg2dPrefix, _T("_2d.dwg")); index2d = lst2dDwbLib.Index(xsDrawing, FALSE); if(index2d > -1){ DwbLibRes2d.Copy(index2d, dwg2dPrefix); DwbLibTarget2d.Append(dwg2dPrefix, xsResStr); _tremove(dwg2dPrefix); } else { AfxMessageBox(_T("2dDwb文件中无法找到该图块!")); continue; } _tcscat(dwg3dPrefix, xsDrawing); _tcscat(dwg3dPrefix, _T("_3d.dwg")); index3d = lst3dDwbLib.Index(xsDrawing, FALSE); if(index3d > -1){ DwbLibRes3d.Copy(index3d, dwg3dPrefix); DwbLibTarget3d.Append(dwg3dPrefix, xsResStr); _tremove(dwg3dPrefix); } else { AfxMessageBox(_T("3dDwb文件中无法找到该图块!")); continue; } pTableTarget->AppendBegin(); SET_FIELD(pTableTarget, _T("kind"), (const TCHAR*)csTarType); SET_FIELD(pTableTarget, _T("Item"), (LPCTSTR)xsItem); SET_FIELD(pTableTarget, _T("Drawing"), (LPCTSTR)xsResStr); pTableTarget->AppendEnd(); } if(bShift){ for(int i=0;iLoadCursor(IDC_CUR_CELLMOVE); SetCursor(hIcon); if(m_bNodeIsDragging){ CPoint ptTree(point); MapWindowPoints(this, &ptTree, 1); CImageList::DragMove(ptTree); UINT uHitTest = TVHT_ONITEM; m_dragTarget = HitTest(ptTree, &uHitTest); if(m_dragTarget != NULL) SelectDropTarget(m_dragTarget); } CTreeCtrl::OnMouseMove(nFlags, point); } void CTKTreeCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; if(m_bMerge) return; m_dragItem = pNMTreeView->itemNew.hItem; if(GetParentItem( m_dragItem ) != NULL ) { CImageList* pDragImage; pDragImage = CreateDragImage( m_dragItem ); SelectItem( m_dragItem ); pDragImage->BeginDrag( 0, CPoint(0,0) ); pDragImage->DragEnter( this, pNMTreeView->ptDrag ); SetCapture(); m_bNodeIsDragging = TRUE; delete pDragImage; //必须 } *pResult = 0; } BOOL CTKTreeCtrl::MoveNodeInThisTK(const TCHAR* szTKName, const TCHAR* szDragTarget, const TCHAR* szResType) { CString csTKName, csDragTarget, csResType; csTKName = szTKName; csDragTarget = szDragTarget; csResType = szResType; CString xsKind; CString csNewKind; CodeBase db; XDbfTable *pTable = db.Open(csTKName); if(!pTable) { AfxMessageBox(_T("TK文件只读或损坏!")); return FALSE; } for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()){ BOOL flag = TRUE; GET_FIELD(pTable, _T("kind"), xsKind); if(IsKindInKind((const TCHAR*)xsKind, csResType, csNewKind)){ //确认此图块属于删除类别下 if(csDragTarget != _T("")){ if(csNewKind != _T("")) csNewKind = _T("\\") + csNewKind; csNewKind = csDragTarget + csNewKind; } SET_FIELD(pTable, _T("kind"), (const TCHAR*)csNewKind); } } return TRUE; } BOOL CTKTreeCtrl::CopyNodeInOtherTK(const TCHAR* szTKTarget, const TCHAR* szTKRes, const TCHAR* szDragTarget, const TCHAR* szResType) { CString csTKTarget, csTKRes, csDragTarget, csResType; csTKTarget = szTKTarget; csTKRes = szTKRes; csDragTarget = szDragTarget; csResType = szResType; int nNum = GetKindBlkCount(csTKRes, csResType); if(nNum < 1) return FALSE; SHORT nStateShift = GetKeyState(VK_SHIFT); BOOL bShift = (nStateShift&256)!=0; m_bCopyAndDel = bShift; //打开SLB, DWB文件 CString csResDwbFile, csResSlbFile, csTargetDwb, csTargetSlb; csResDwbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".DWB"); csResSlbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".SLB"); csTargetDwb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".DWB"); csTargetSlb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".SLB"); XSlideLib SlbLibTarget(csTargetSlb);// 拷贝目标 XSlideLib SlbLibRes(csResSlbFile, _ios::in | _ios::binary); // 拷贝源 if(!SlbLibTarget) { AfxMessageBox(_T("目标SLB文件打不开!")); return FALSE; } if(!SlbLibRes) { AfxMessageBox(_T("源SLB文件打不开!")); return FALSE; } XDrawingLib DwbLibTarget(csTargetDwb); XDrawingLib DwbLibRes(csResDwbFile, _ios::in | _ios::binary); if(!DwbLibTarget) { AfxMessageBox(_T("目标DWB文件打不开!")); return FALSE; } if(!DwbLibRes) { AfxMessageBox(_T("源DWB文件打不开!")); return FALSE; } CodeBase db; XDbfTable *pTableRes = db.Open(csTKRes); if(!pTableRes) { AfxMessageBox(_T("源TK文件只读或损坏!")); return FALSE; } XDbfTable *pTableTarget = db.Open(csTKTarget); if(!pTableTarget) { AfxMessageBox(_T("目标TK文件只读或损坏!")); return FALSE; } TCHAR dwgPrefix[256]=_T(""); TCHAR sldPrefix[256]=_T(""); TCHAR tempPrefix[256]=_T(""); GetTempPath(255, tempPrefix); XStringList lstSlbLib,lstDwbLib; lstSlbLib.Reset(); lstDwbLib.Reset(); SlbLibRes.GetAll(lstSlbLib); DwbLibRes.GetAll(lstDwbLib); acedSetStatusBarProgressMeter(XString(_T("拷贝%d个图块"), nNum), 0, nNum); int idx = 0; XStringList lstDelBlk; for(pTableRes->MoveFirst(); !pTableRes->IsEOF(); pTableRes->MoveNext()) { CString xsKind, xsDrawing, xsItem; GET_FIELD(pTableRes, _T("kind"), xsKind); GET_FIELD(pTableRes, _T("item"), xsItem); GET_FIELD(pTableRes, _T("Drawing"), xsDrawing); CString csNewKind; if(IsKindInKind((const TCHAR*)xsKind, csResType, csNewKind)){ //确认此图块属于删除类别下 idx++; acedSetStatusBarProgressMeterPos(idx); if(csDragTarget != _T("")){ if(csNewKind != _T("")) csNewKind = _T("\\") + csNewKind; csNewKind = csDragTarget + csNewKind; } //modified by whl 070511 //XString xsResStr; TCHAR xsResStr[1024]=_T("00000001"); if(xsDrawing != _T("")){ //否则是类别记录 if(GetNextDrawing(szTKTarget, xsResStr)!=RTNORM) {//modified by cwk on 061204 AfxMessageBox(_T("Dwb文件中无法添加该图块!")); return FALSE; } _tcscpy(sldPrefix, tempPrefix); _tcscpy(dwgPrefix, tempPrefix); _tcscat(sldPrefix, xsDrawing); _tcscat(sldPrefix, _T(".sld")); int index = -1; index = lstSlbLib.Index(xsDrawing, FALSE); lstDelBlk.Append(tstrnew(xsDrawing)); if(index > -1){ SlbLibRes.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){ DwbLibRes.Copy(index, dwgPrefix); DwbLibTarget.Append(dwgPrefix, xsResStr); _tremove(dwgPrefix); } else { AfxMessageBox(_T("Dwb文件中无法找到该图块!")); continue; } } else if(bShift){//类别 pTableRes->Delete(); } pTableTarget->AppendBegin(); SET_FIELD(pTableTarget, _T("kind"), (const TCHAR*)csNewKind); SET_FIELD(pTableTarget, _T("Item"), (LPCTSTR)xsItem); SET_FIELD(pTableTarget, _T("Drawing"), (LPCTSTR)xsResStr); pTableTarget->AppendEnd(); } } if(bShift){ for(int i=0;iMoveFirst(); !pTableRes->IsEOF(); pTableRes->MoveNext()) { CString xsKind, xsDrawing, xsItem; GET_FIELD(pTableRes, _T("kind"), xsKind); GET_FIELD(pTableRes, _T("item"), xsItem); GET_FIELD(pTableRes, _T("Drawing"), xsDrawing); CString csNewKind; if(IsKindInKind((const TCHAR*)xsKind, csResType, csNewKind)){ //确认此图块属于删除类别下 idx++; acedSetStatusBarProgressMeterPos(idx); if(csDragTarget != _T("")){ if(csNewKind != _T("")) csNewKind = _T("\\") + csNewKind; csNewKind = csDragTarget + csNewKind; } XString xsResStr = _T(""); if(xsDrawing != _T("")){ //否则是类别记录 if(GetNextDrawing(szTKTarget, xsResStr)!=RTNORM) {//modified by cwk on 061204 AfxMessageBox(_T("Dwb文件中无法添加该图块!")); return FALSE; } _tcscpy(jpgPrefix, tempPrefix); _tcscpy(dwgPrefix2d, tempPrefix); _tcscpy(dwgPrefix3d, tempPrefix); _tcscat(jpgPrefix, xsDrawing); _tcscat(jpgPrefix, _T(".Jpg")); int index = -1; lstDelBlk.Append(tstrnew(xsDrawing)); index = lstJpbLib.Index(xsDrawing, FALSE); if(index > -1){ JpbLibRes.Copy(index, jpgPrefix); JpbLibTarget.Append(jpgPrefix, xsResStr); _tremove(jpgPrefix); } else { AfxMessageBox(_T("JPB文件中无法找到该幻灯!")); continue; } _tcscat(dwgPrefix2d, xsDrawing); _tcscat(dwgPrefix2d, _T("_2d.dwg")); index = -1; index = lstDwbLib2d.Index(xsDrawing, FALSE); if(index > -1){ DwbLibRes2d.Copy(index, dwgPrefix2d); DwbLibTarget2d.Append(dwgPrefix2d, xsResStr); _tremove(dwgPrefix2d); } else { AfxMessageBox(_T("2dDwb文件中无法找到该图块!")); continue; } _tcscat(dwgPrefix3d, xsDrawing); _tcscat(dwgPrefix3d, _T("_3d.dwg")); index = -1; index = lstDwbLib3d.Index(xsDrawing, FALSE); if(index > -1){ DwbLibRes3d.Copy(index, dwgPrefix3d); DwbLibTarget3d.Append(dwgPrefix3d, xsResStr); _tremove(dwgPrefix3d); } else { AfxMessageBox(_T("Dwb文件中无法找到该图块!")); continue; } } else if(bShift){//类别 pTableRes->Delete(); } pTableTarget->AppendBegin(); SET_FIELD(pTableTarget, _T("kind"), (const TCHAR*)csNewKind); SET_FIELD(pTableTarget, _T("Item"), (LPCTSTR)xsItem); SET_FIELD(pTableTarget, _T("Drawing"), (LPCTSTR)xsResStr); pTableTarget->AppendEnd(); } } if(bShift){ for(int i=0;iMoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) { GET_FIELD(pTable, _T("Drawing"), xsDrawing); GET_FIELD(pTable, _T("Kind"), xsKind); CString sss; if(IsKindInKind((const TCHAR*)xsKind, csFilter, sss)){ //确认此图块属于删除类别下 pTable->Delete(); XString xsDwb(256), xsDwb2d(256), xsSlb(256), xsJpb(256); if(m_bIsJpgShow){ xsDwb << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_3d.DWB"); xsDwb2d << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_2d.DWB"); XDrawingLib dwb2d(xsDwb2d); if(!(!dwb2d)) dwb2d.Remove(xsDrawing); } else xsDwb << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".DWB"); xsSlb << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".SLB"); xsJpb << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".JPB"); XDrawingLib dwb(xsDwb); if(!(!dwb)) dwb.Remove(xsDrawing); if(m_bIsJpgShow){ XJpegLib jpb(xsJpb); if(!(!jpb)) jpb.Remove(xsDrawing); } else{ XSlideLib slb(xsSlb); if(!(!slb)) slb.Remove(xsDrawing); } wndProgress.StepIt(); wndProgress.PeekAndPump(); if (wndProgress.Cancelled()) return FALSE; if(ads_usrbrk() == 1) return FALSE; //用户中断 } } return TRUE; } int CTKTreeCtrl::GetKindBlkCount(const TCHAR* szTKName, const TCHAR* szFilter) { CString csTKName, csFilter; csTKName = szTKName; csFilter = szFilter; int nNumDel = 0; CString xsKind; //类别 CodeBase db; XDbfTable *pTable = db.Open(csTKName); if(!pTable) { AfxMessageBox(_T("TK文件只读或损坏!")); return -1; } for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) { GET_FIELD(pTable, _T("kind"), xsKind); CString sss; if(IsKindInKind((const TCHAR*)xsKind, csFilter, sss)) nNumDel ++;; } return nNumDel; } int CTKTreeCtrl::GetKindAllBlk(const TCHAR* szTKName, const TCHAR* szFilter, DList &lstBlk) { CString csTKName, csFilter; csTKName = szTKName; csFilter = szFilter; int nNumDel = 0; lstBlk.Reset(); CString xsKind, xsItem, xsDrawing; //类别 XStringList lstKind, lstFilter; CString csKind; int nPos = 0; CodeBase db; XDbfTable *pTable = db.Open(csTKName); if(!pTable) { AfxMessageBox(_T("TK文件只读或损坏!")); return 0; } SplitStr(csFilter, lstFilter); for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) { BOOL flag = TRUE; GET_FIELD(pTable, _T("kind"), xsKind); GET_FIELD(pTable, _T("item"), xsItem); GET_FIELD(pTable, _T("Drawing"), xsDrawing); csKind = (const TCHAR *)xsKind; // ZJQ add here SplitStr(csKind, lstKind); if(lstKind.Length() < lstFilter.Length()) continue; CString csHeadType; for(int i=0; i sKind cs2 = (const TCHAR *)lstFilter[i]; // lstFilter链表 :当前树接点 if(cs1 != cs2) { flag = FALSE; break; } else if(i != (lstFilter.Length() - 1)){ csHeadType += cs1; csHeadType += _T("\\"); } } if(flag) { csKind = csKind.Right(csKind.GetLength() - csHeadType.GetLength()); lstBlk.Append(new TKStruct(csTKName, csKind, xsItem, xsDrawing)); nNumDel ++; } } return nNumDel; } BOOL CTKTreeCtrl::DelCurKind() { HTREEITEM htree(NULL), hParent(NULL); htree = GetSelectedItem(); CString csCurTKName, csCurType; GetNodeAllPath(htree, csCurTKName, csCurType); if(csCurType == _T("") || htree == GetRootItem())//选中根结点或TK结点 return FALSE; if(MessageBox(_T("注意:该类型所属的所有的图块都将删除!\n\n您是否真的删除此类型?"),_T("警告"),MB_OKCANCEL|MB_ICONQUESTION) != IDOK) return FALSE; if(DoDelKind(csCurTKName, csCurType)) { // 删除类别 hParent = GetParentItem(htree); // 用户没有中断 DeleteItem(htree); if(hParent) SelectItem(hParent); return TRUE; } return FALSE; } ////////////////////////////////////////////////////////////////////// // CGJKTreeCtrl Class ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGJKTreeCtrl::CGJKTreeCtrl() { m_bFlag = FALSE; } CGJKTreeCtrl::~CGJKTreeCtrl() { } BEGIN_MESSAGE_MAP(CGJKTreeCtrl,CTKTreeCtrl) //{{AFX_MSG_MAP(CTKTreeCtrl) ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CGJKTreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) { POINT pt, ptClient;; TV_HITTESTINFO tvhti; ::GetCursorPos((LPPOINT)&pt); ptClient = pt; ScreenToClient(&ptClient); MapWindowPoints(this, &ptClient, 1); tvhti.pt = ptClient; HitTest(&tvhti); if(tvhti.hItem) { SelectItem(tvhti.hItem); } HTREEITEM hCur = GetSelectedItem(); if(!hCur || m_bMerge) { *pResult = 0; return; } CMenu Menu; Menu.LoadMenu(IDR_MENU_TREEGJK); CMenu *pSubMenu = NULL; if(hCur == GetRootItem()) return ; else if(GetParentItem(hCur) == GetRootItem()) { if (m_bFlag) { pSubMenu = Menu.GetSubMenu(0); } else { pSubMenu = Menu.GetSubMenu(2); } } else { if (m_bFlag) { pSubMenu = Menu.GetSubMenu(1); } else { pSubMenu = Menu.GetSubMenu(3); } } if(pSubMenu) pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, GetParent(), NULL); SetFocus(); *pResult = 0; }