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

1684 lines
48 KiB
C++

// 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<lstFilterKind.Length(); i++)
{// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
CString cs1,cs2;
cs1 = (const TCHAR *)lstKind[i]; // lstKind链表 :当前记录 -> 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;i<lstTKFiles.Length();i++){
CodeBase db;
db.read_only = 1;
XDbfTable *pTable = db.Open(lstTKFiles[i]);
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);
}
//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;i<m_lstTKFiles.Length();i++){
if(csAllTk == m_lstTKFiles[i]){
csTKName = m_lstTKFiles[i];
csAllType = _T("");
return;
}
}
}
while(hTmp && hTmp != hRoot) { // 得到该节点的全路径
csCur = GetItemText(hTmp);
if(GetParentItem(hTmp) == hRoot){
DWORD_PTR dwAllTk = GetItemData(hTmp);
if(dwAllTk){
TCHAR szAlltk[1024];
_tcscpy(szAlltk, (const TCHAR*)dwAllTk);
csCur = szAlltk;
}
}
for(int i=0;i<m_lstTKFiles.Length();i++){
if(csCur == m_lstTKFiles[i] && GetParentItem(hTmp) == hRoot){
csTKName = m_lstTKFiles[i];
csAllType = csNodeName;
return;
}
}
csNodeName = csCur + _T("\\") + csNodeName;
hTmp = GetParentItem(hTmp);
}
if(m_bMerge){
csAllType = csNodeName;
}
}
void CTKTreeCtrl::GetNodeAllPath(HTREEITEM htree, 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();
if(hRoot == htree){
csAllType = _T("");
return;
}
hTmp = GetParentItem(htree);
while(hTmp && hTmp != hRoot) { // 得到该节点的全路径
csCur = GetItemText(hTmp);
csNodeName = csCur + _T("\\") + csNodeName;
hTmp = GetParentItem(hTmp);
}
csAllType = csNodeName;
}
void CTKTreeCtrl::SetupTreeData()
{
HTREEITEM hCul=NULL, hTemp=NULL, hRoot=NULL, hFilter=NULL;
DeleteAllItems();
HTREEITEM hHead = InsertItem(GetFileNameByAllName(m_csTKWFile), 3, 3);
if(!m_bMerge){
//*********************************** 不归类 ************************************************
for(int i=0;i<m_lstTKFiles.Length();i++){
HTREEITEM hTKNode = InsertItem(GetFileNameByAllName(m_lstTKFiles[i]), 0, 0, hHead);
SetItemData(hTKNode, (DWORD_PTR)m_lstTKFiles[i]);
hRoot = hTKNode;
if(_tcsicmp(m_csLastTK, m_lstTKFiles[i]) == 0 && m_csCurKind == _T("*"))
hFilter = hTKNode;
XStringList lstKindName;
GetTKFilterList(m_lstTKFiles[i], lstKindName);
for(int j=0;j<lstKindName.Length();j++){
XStringList lstKind;
CString csKindName = lstKindName[j];
if(csKindName.IsEmpty())
continue;
SplitStr(csKindName, lstKind);
CString csNode, csAllNode;
int kindlen = lstKind.Length();
if(kindlen == 1) { // 一级目录
HTREEITEM hTemp = InsertItem(lstKindName[j], 1, 2, hTKNode);
if(csKindName == m_csCurKind && _tcsicmp(m_csLastTK, m_lstTKFiles[i]) == 0)
hFilter = hTemp; // !!! 记住默认树节点句柄
}
else // 多级目录
for(int m=0; m< kindlen; m++)
{
csNode = lstKind[m];
csAllNode = csAllNode + csNode + _T("\\"); // 记住该树节点全路径(注意:最后一次多加一个“\\”)
hCul = FindTreeNode(hRoot, csNode);
if(!hCul) {
hRoot = InsertItem(csNode, 1, 2, hRoot);
//if(csKindName == m_csCurKind || csAllNode == (m_csCurKind + _T("\\"))) // 比较时也多加一个“\\”
if((csKindName == m_csCurKind || csAllNode == (m_csCurKind + _T("\\"))) && _tcsicmp(m_csLastTK, m_lstTKFiles[i]) == 0) // 比较时也多加一个“\\”
hFilter = hRoot; // !!! 记住默认树节点句柄
}
else //已存在此节点
hRoot = hCul;
}
hRoot = hTKNode;
}
}
} //不归类 结束
else{
//*********************************** 归类 ************************************************
XStringList lstKindName;
GetTKWFilterList(m_csTKWFile, lstKindName);
hRoot = hHead;
for(int j=0;j<lstKindName.Length();j++){
XStringList lstKind;
CString csKindName = lstKindName[j];
if(csKindName.IsEmpty())
continue;
SplitStr(csKindName, lstKind);
CString csNode, csAllNode;
int kindlen = lstKind.Length();
if(kindlen == 1) { // 一级目录
HTREEITEM hTemp = InsertItem(lstKindName[j], 1, 2, hHead);
if(csKindName == m_csCurKind)
hFilter = hTemp; // !!! 记住默认树节点句柄
}
else // 多级目录
for(int m=0; m< kindlen; m++)
{
csNode = lstKind[m];
csAllNode = csAllNode + csNode + _T("\\"); // 记住该树节点全路径(注意:最后一次多加一个“\\”)
hCul = FindTreeNode(hRoot, csNode);
if(!hCul) {
hRoot = InsertItem(csNode, 1, 2, hRoot);
if(csKindName == m_csCurKind || csAllNode == (m_csCurKind + _T("\\"))) // 比较时也多加一个“\\”
hFilter = hRoot; // !!! 记住默认树节点句柄
}
else //已存在此节点
hRoot = hCul;
}
hRoot = hHead;
}
}//归类 结束
SelectItem(hFilter);
}
/////////////////////////////////////////////////////////////////////////////
// CTKTreeCtrl message handlers
void CTKTreeCtrl::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_TREE);
CMenu *pSubMenu = NULL;
if(hCur == GetRootItem()) //根结点 TKW结点
pSubMenu = Menu.GetSubMenu(1);
else if(GetParentItem(hCur) == GetRootItem()){// TK结点
pSubMenu = Menu.GetSubMenu(2);
if(!m_bNeedMenu){
pSubMenu->DeleteMenu(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<lstFilter.Length(); i++) {
// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
CString str1,str2;
str1 = lstKind[i]; // lstKind 链表 :当前记录 -> sKind
str2 = lstFilter[i]; // lstFilter链表 :当前树接点
if(str1 != str2) {
flag = FALSE;
break;
}
}
if(flag) {
sKind = ConnectStr(lstKind,lstFilter.Length()-1, (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;i<lstBlk.Length();i++){
if(_tcscmp(sDrawing, lstBlk[i]) == 0 && _tcscmp(sKind, csOldType) == 0 ){
long pos = pTable->GetPosition();
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<lstBlk.Length();i++){
if(_tcscmp(xsDrawing, lstBlk[i]) == 0){
bFlag = TRUE;
break;
}
}
if(!bFlag)
continue;
//modified by whl 070511
//XString xsResStr;
TCHAR xsResStr[1024]=_T("00000001");
idx++;
acedSetStatusBarProgressMeterPos(idx);
if(GetNextDrawing(csTKTarget, xsResStr)!=RTNORM) {//modified by cwk on 061207
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);
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;
}
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;i<lstBlk.Length();i++){
SlbLibRes.Remove(lstBlk[i]); // SR ADD
DwbLibRes.Remove(lstBlk[i]); // SR ADD
/*
DbfAccess db(csTKRes, FLAG_DELETE, 1, 0);
db.keyFieldName[0] = strdup("drawing");
db.keyinfo[0]=strdup(_AS(lstBlk[i]));
if(DBFFUN(db))
break;
*/
NewDbfTool::DeleteRecordByTKStruct(csTKRes, _T("drawing"), lstBlk[i]);
}
}
acedRestoreStatusBar();
return TRUE;
}
BOOL CTKTreeCtrl::CopyJpgBlkInOtherTK(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;
//打开JPB, DWB文件
SHORT nStateShift = GetKeyState(VK_SHIFT);
BOOL bShift = (nStateShift&256)!=0;
m_bCopyAndDel = bShift;
CString csResDwb2dFile, csResDwb3dFile, csResJpbFile, csTarget2dDwb, csTarget3dDwb, csTargetJpb;
csResDwb2dFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T("_2d.DWB");
csResDwb3dFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T("_3d.DWB");
csResJpbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".JPB");
csTarget2dDwb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T("_2d.DWB");
csTarget3dDwb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T("_3d.DWB");
csTargetJpb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".JPB");
XJpegLib JpbLibTarget(csTargetJpb); // 拷贝目标
XJpegLib JpbLibRes(csResJpbFile, _ios::in | _ios::binary); // 拷贝源
if(!JpbLibTarget) {
AfxMessageBox(_T("目标Jpb文件打不开!"));
return FALSE;
}
if(!JpbLibRes) {
AfxMessageBox(_T("源Jpb文件打不开!"));
return FALSE;
}
XDrawingLib DwbLibTarget2d(csTarget2dDwb);
XDrawingLib DwbLibRes2d(csResDwb2dFile, _ios::in | _ios::binary);
if(!DwbLibTarget2d) {
AfxMessageBox(_T("目标2dDWB文件打不开!"));
return FALSE;
}
if(!DwbLibRes2d) {
AfxMessageBox(_T("源2dDWB文件打不开!"));
return FALSE;
}
XDrawingLib DwbLibTarget3d(csTarget3dDwb);
XDrawingLib DwbLibRes3d(csResDwb3dFile, _ios::in | _ios::binary);
if(!DwbLibTarget3d) {
AfxMessageBox(_T("目标3dDWB文件打不开!"));
return FALSE;
}
if(!DwbLibRes3d) {
AfxMessageBox(_T("源3dDWB文件打不开!"));
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 dwg2dPrefix[256]=_T("");
TCHAR dwg3dPrefix[256]=_T("");
TCHAR jpgPrefix[256]=_T("");
TCHAR tempPrefix[256]=_T("");
GetTempPath(255, tempPrefix);
XStringList lstJpbLib, lst2dDwbLib, lst3dDwbLib;
lstJpbLib.Reset();
lst2dDwbLib.Reset();
lst3dDwbLib.Reset();
JpbLibRes.GetAll(lstJpbLib);
DwbLibRes2d.GetAll(lst2dDwbLib);
DwbLibRes3d.GetAll(lst3dDwbLib);
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<lstBlk.Length();i++){
if(_tcscmp(xsDrawing, lstBlk[i]) == 0){
bFlag = TRUE;
break;
}
}
if(!bFlag)
continue;
//modified by whl 070511
//XString xsResStr;
TCHAR xsResStr[1024]=_T("00000001");
idx++;
acedSetStatusBarProgressMeterPos(idx);
if(GetNextDrawing(csTKTarget, xsResStr)!=RTNORM) //modified by cwk on 061207
{
AfxMessageBox(_T("Dwb文件中无法添加该图块!"));
return FALSE;
}
_tcscpy(jpgPrefix, tempPrefix);
_tcscpy(dwg2dPrefix, tempPrefix);
_tcscpy(dwg3dPrefix, tempPrefix);
_tcscat(jpgPrefix, xsDrawing);
_tcscat(jpgPrefix, _T(".jpg"));
int indexJpb(-1), index2d(-1), index3d(-1);
indexJpb = lstJpbLib.Index(xsDrawing, FALSE);
if(indexJpb > -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;i<lstBlk.Length();i++){
JpbLibRes.Remove(lstBlk[i]); // SR ADD
DwbLibRes2d.Remove(lstBlk[i]); // SR ADD
DwbLibRes3d.Remove(lstBlk[i]); // SR ADD
/*
DbfAccess db(csTKRes, FLAG_DELETE, 1, 0);
db.keyFieldName[0] = strdup("drawing");
db.keyinfo[0]=strdup(_AS(lstBlk[i]));
if(DBFFUN(db))
break;
*/
NewDbfTool::DeleteRecordByTKStruct(csTKRes, _T("drawing"), lstBlk[i]);
}
}
acedRestoreStatusBar();
return TRUE;
}
void CTKTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
if(!(nFlags & MK_LBUTTON) ) {
CTreeCtrl::OnMouseMove(nFlags, point);
return;
}
if(!m_bCellIsDragging && !m_bNodeIsDragging) {
CTreeCtrl::OnMouseMove(nFlags, point);
return;
}
HICON hIcon;
CTemporaryResourceOverride vTemp;
CWinApp* pApp = AfxGetApp();
hIcon = pApp->LoadCursor(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;i<lstDelBlk.Length();i++){
SlbLibRes.Remove(lstDelBlk[i]); // SR ADD
DwbLibRes.Remove(lstDelBlk[i]); // SR ADD
/*
DbfAccess db(csTKRes, FLAG_DELETE, 1, 0);
db.keyFieldName[0] = strdup("drawing");
db.keyinfo[0]=strdup(_AS(lstDelBlk[i]));
if(DBFFUN(db))
break;
*/
NewDbfTool::DeleteRecordByTKStruct(csTKRes, _T("drawing"), lstDelBlk[i]);
}
}
acedRestoreStatusBar();
return TRUE;
}
BOOL CTKTreeCtrl::CopyJpgNodeInOtherTK(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;
//打开JPB, DWB文件
CString csResDwbFile2d, csResDwbFile3d, csResJpbFile, csTargetDwb2d, csTargetDwb3d, csTargetJpb;
csResDwbFile2d = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T("_2d.DWB");
csResDwbFile3d = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T("_3d.DWB");
csResJpbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".JPB");
csTargetDwb2d = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T("_2d.DWB");
csTargetDwb3d = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T("_3d.DWB");
csTargetJpb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".JPB");
XJpegLib JpbLibTarget(csTargetJpb); // 拷贝目标
XJpegLib JpbLibRes(csResJpbFile, _ios::in | _ios::binary); // 拷贝源
if(!JpbLibTarget) {
AfxMessageBox(_T("目标JPB文件打不开!"));
return FALSE;
}
if(!JpbLibRes) {
AfxMessageBox(_T("源JPB文件打不开!"));
return FALSE;
}
XDrawingLib DwbLibTarget2d(csTargetDwb2d);
XDrawingLib DwbLibRes2d(csResDwbFile2d, _ios::in | _ios::binary);
if(!DwbLibTarget2d) {
AfxMessageBox(_T("目标2dDWB文件打不开!"));
return FALSE;
}
if(!DwbLibRes2d) {
AfxMessageBox(_T("源2dDWB文件打不开!"));
return FALSE;
}
XDrawingLib DwbLibTarget3d(csTargetDwb3d);
XDrawingLib DwbLibRes3d(csResDwbFile3d, _ios::in | _ios::binary);
if(!DwbLibTarget3d) {
AfxMessageBox(_T("目标3dDWB文件打不开!"));
return FALSE;
}
if(!DwbLibRes3d) {
AfxMessageBox(_T("源3dDWB文件打不开!"));
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 dwgPrefix2d[256]=_T("");
TCHAR dwgPrefix3d[256]=_T("");
TCHAR jpgPrefix[256]=_T("");
TCHAR tempPrefix[256]=_T("");
GetTempPath(255, tempPrefix);
XStringList lstJpbLib, lstDwbLib2d, lstDwbLib3d;
lstJpbLib.Reset();
lstDwbLib2d.Reset();
lstDwbLib3d.Reset();
JpbLibRes.GetAll(lstJpbLib);
DwbLibRes2d.GetAll(lstDwbLib2d);
DwbLibRes3d.GetAll(lstDwbLib3d);
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;
}
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;i<lstDelBlk.Length();i++){
JpbLibRes.Remove(lstDelBlk[i]); // SR ADD
DwbLibRes2d.Remove(lstDelBlk[i]); // SR ADD
DwbLibRes3d.Remove(lstDelBlk[i]); // SR ADD
/*
DbfAccess db(csTKRes, FLAG_DELETE, 1, 0);
db.keyFieldName[0] = strdup("drawing");
db.keyinfo[0]=strdup(_AS(lstDelBlk[i]));
if(DBFFUN(db))
break;
*/
NewDbfTool::DeleteRecordByTKStruct(csTKRes, _T("drawing"), lstDelBlk[i]);
}
}
acedRestoreStatusBar();
return TRUE;
}
BOOL CTKTreeCtrl::DoDelKind(const TCHAR* szTKName, const TCHAR* szFilter)
{
CString csTKName, csFilter;
csTKName = szTKName;
csFilter = szFilter;
int nNum = GetKindBlkCount(csTKName, csFilter);
if(nNum < 1) return FALSE;
CString xsKind, xsDrawing; //类别
XStringList lstKind, lstFilter;
CString csKind;
int nPos = 0;
CodeBase db;
XDbfTable *pTable = db.Open(csTKName);
if(!pTable) {
AfxMessageBox(_T("TK文件只读或损坏!"));
return FALSE;
}
CProgressWnd wndProgress(GetParent(), _T("Progress"), TRUE);
wndProgress.SetRange(0, nNum);
wndProgress.SetText(_T("正在删除图块...\n")
_T("按取消键中断此次操作!"));
for(pTable->MoveFirst(); !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<TKStruct> &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<lstFilter.Length(); i++)
{// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
CString cs1,cs2;
cs1 = (const TCHAR *)lstKind[i]; // lstKind链表 :当前记录 -> sKind
cs2 = (const TCHAR *)lstFilter[i]; // lstFilter链表 :当前树接点
if(cs1 != cs2) {
flag = FALSE;
break;
}
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;
}