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

4241 lines
113 KiB
C++

// TKWorkspace.cpp : implementation file
//
#include "stdafx.h"
#include "TKWorkspace.h"
#include "Progresswnd.h"
#include "Ayrdlg.h"
#include "TkwFile.h"
#include "XFilePathName.h"
#include "BlkManReplaceOption.h"
#include "TKAboutDlg.h"
#include "NewTKWDlg.h"
#include "ximage.h"
#include "NewDbfAccessTools.h"
//add by xlc on 070816
typedef struct {
LVITEM* plvi;
CString sCol2;
} lvItem, *plvItem;
#include <afxtempl.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern TARCH_IMPEXP BOOL MoveMaterial2MSpace(AcDbObjectId idBlock);
extern BOOL DoReplaceBlock(int nControlFlag, Entity &ent, AcDbObjectId &idBlock);
extern CString GetFileNameByAllName(const TCHAR* szAllFileName);
extern CString GetPathNameByAllName(const TCHAR* szAllFileName);
extern BOOL CreateTKFile(const TCHAR *pszFile);
extern void SplitStr(const TCHAR *szInput, XStringList& lstKind);
//extern void MakeVisible(PickSet &ss, bool bTrue);
//extern TARCH_IMPEXP int DragInsertBlock1(const TCHAR *szBlock, int nFlag, const AcGeScale3d &scales);
extern TARCH_IMPEXP int g_nRunMode;
extern TARCH_IMPEXP int g_nProductId;
extern BOOL GetTchtkwAllItem(XStringList &lstTkwItem);
extern BOOL GetTkwFileByMenu(const TCHAR* szMenuName, CString &csTkwFileName);
extern TCHAR g_szDirName[]; //申请自己的16K缓冲区
extern CRect GetVPRect(int cvport);
extern void GetRectBmpFromBmp( CWnd *pWnd ,CRect rectClient, CBitmap &bitmap);
extern BOOL SetLayerLocked(const TCHAR* szLayerName, BOOL bLock);
extern void GetAShadePickSet(PickSet &ssMat, PickSet &ssSel);
extern void TWBlock(PickSet &ss, const TCHAR* szFileName, XPoint ptIns);
//GEOAPI BOOL arxWBlock(PickSet &ss, const TCHAR* szFileName, XPoint ptIns);
//extern int WriteJpeg( FILE * input_file, FILE * output_file);
int GetNextDrawing(const TCHAR *tkName, TCHAR *dwg);
const UINT OpenMenuID = 9110;
const int g_nMaxRecentBlb = 5;
//extern GEOAPI int GetPickSetByGroup(const TCHAR *szGroup, PickSet &ss);
int TKW()
{
CTKWorkspace dlg(acedGetAcadFrame());
CTemporaryResourceOverride vTmp;
dlg.DoModal();
return RTNORM;
}
CString GetTypeByRecord(const TCHAR * szTKFile, const TCHAR * csRecord)
{
CodeBase db;
XDbfTable *pTable = db.Open(szTKFile);
if(!pTable) {
AfxMessageBox(_T("TK文件只读或损坏!"));
return CString();
}
CString csKind, csItem, csDrawing;
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) {
GET_FIELD(pTable, _T("kind"), csKind);
GET_FIELD(pTable, _T("item"), csItem);
GET_FIELD(pTable, _T("Drawing"), csDrawing);
if(_tcsicmp(csRecord, csDrawing)==0) {
if(csKind.IsEmpty())
csKind=_T("*");
return csKind;
}
}
return CString();
}
/////////////////////////////////////////////////////////////////////////////
// CTKWorkspace dialog
IMPLEMENT_DYNAMIC(CTKWorkspace, CAcUiDialog)
CTKWorkspace::CTKWorkspace(CWnd* pParent /*=NULL*/)
: CAcUiDialog(CTKWorkspace::IDD, pParent)
{
//{{AFX_DATA_INIT(CTKWorkspace)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_nOpenMode = 0;
m_bEditLabel = FALSE;
m_bMultiSel = TRUE; // 多选
m_bInitSize = FALSE;
m_nPageRow = 3; // 行数
m_nPageColumn = 2; // 列数
m_bLock = FALSE;
m_pOpenMenu = NULL;
m_csCurTKWFile = _T("");
m_csRet = _T("");
m_iWorkType=0;//add by whl
XString xsRoot, xsKey;
xsKey = _T("BLKMAN");
_tcscat(xsRoot, GetRegLocation());
CRegProperty regProp(xsRoot, xsKey);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.GetValue(_T("PageRow"), m_nPageRow); // 行数
regProp.GetValue(_T("PageColumn"), m_nPageColumn); // 列数
m_bDragging = FALSE;
}
CTKWorkspace::CTKWorkspace(const TCHAR* szTKWName, const TCHAR* szTKName, const TCHAR* szRecord, BOOL bSingleSel, CWnd* pParent /*=NULL*/)
: CAcUiDialog(CTKWorkspace::IDD, pParent)
{
//{{AFX_DATA_INIT(CTKWorkspace)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
CString csTKWName , csTKName, csRecord;
csTKWName = szTKWName;
csTKName = szTKName;
csRecord = szRecord;
m_iWorkType=0;//add by whl
m_nOpenMode = 1;
m_bMultiSel = bSingleSel;
m_ImageBox.m_bMultiSel = bSingleSel;
m_bInitSize = FALSE;
m_bEditLabel = FALSE;
m_nPageRow = 3; // 行数
m_nPageColumn = 2; // 列数
m_bLock = FALSE;
m_pOpenMenu = NULL;
XString fullFile;
XPathParser parser1(szTKWName), parser2(szTKName);
if(!parser2.m_sDir)
parser2.m_sDir=parser1.m_sDir;
if(!parser2.m_sDrive)
parser2.m_sDrive=parser1.m_sDrive;
fullFile << parser2.m_sDrive << parser2.m_sDir << parser2.m_sFileName << _T(".tk");
if(!FindFile(fullFile))
{
fullFile=_T("");
csRecord=_T("");
}
m_csCurTKWFile = csTKWName;
m_csLastTKName = (const TCHAR*)fullFile;
m_csCurRecord = csRecord;
if(!m_csCurRecord.IsEmpty() && !m_csLastTKName.IsEmpty())
m_csLastType = GetTypeByRecord((const TCHAR*)m_csLastTKName, csRecord);
m_csRet = _T("");
XString xsRoot, xsKey;
xsKey = _T("BLKMAN");
_tcscat(xsRoot, GetRegLocation());
//modify by xlc on 080519
if(m_nOpenMode == 1)
{
_tcscat(xsRoot, _T("\\BLKMAN"));
TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
_tsplitpath(m_csCurTKWFile, szDrive, szDir, szFile, szExt);
//modify by xlc on 090116 插入图框崩溃
//_tcscpy(xsKey, szFile);
xsKey = szFile;
}
CRegProperty regProp(xsRoot, xsKey);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.GetValue(_T("PageRow"), m_nPageRow); // 行数
regProp.GetValue(_T("PageColumn"), m_nPageColumn); // 列数
if(!m_bMultiSel)
m_treeCtrl.m_bNeedMenu = FALSE;
m_bDragging = FALSE;
}
CTKWorkspace::~CTKWorkspace()
{
if(m_pOpenMenu)
{
m_pOpenMenu->DestroyMenu();
delete m_pOpenMenu;
}
m_cMenu.DestroyMenu();
}
void CTKWorkspace::DoDataExchange(CDataExchange* pDX)
{
CAcUiDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTKWorkspace)
DDX_Control(pDX, IDC_VSBAR, m_vsBar);
DDX_Control(pDX, IDC_S_DESCRIPTION, m_ctrlDescription);
DDX_Control(pDX, IDC_PIC_IMAGE , m_ImageBox);
DDX_Control(pDX, IDC_TK_TREE, m_treeCtrl);
DDX_Control(pDX, IDC_TK_LIST, m_listCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTKWorkspace, CAcUiDialog)
//{{AFX_MSG_MAP(CTKWorkspace)
ON_WM_SIZE()
ON_WM_CREATE()
ON_WM_VSCROLL()
ON_WM_CONTEXTMENU()
ON_NOTIFY(LVN_ITEMCHANGED, IDC_TK_LIST, OnItemchangedTkList)
ON_NOTIFY(NM_CLICK, IDC_TK_LIST, OnClickTkList)
ON_WM_LBUTTONUP()
ON_NOTIFY(TVN_SELCHANGED, IDC_TK_TREE, OnSelchangedTkTree)
ON_COMMAND(ID_BLK_REVERT, OnBlkRevert)
ON_COMMAND(ID_BLK_MERGE, OnBlkMerge)
ON_NOTIFY(TBN_DROPDOWN, IDR_TOOLBAR_TKW, OnToolbarDropDown)
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_TK_LIST, OnEndlabeleditTkList)
ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_TK_LIST, OnBeginlabeleditTkList)
ON_COMMAND(ID_BLK_RENAME, OnBlkRename)
ON_COMMAND(ID_BLK_SORT, OnBlkSort)
ON_COMMAND(ID_BLK_DEL, OnBlkDel)
ON_COMMAND(ID_BLK_LAYOUT, OnBlkLayout)
ON_COMMAND(ID_BLK_NEWLIB, OnBlkNewlib)
ON_COMMAND(ID_BLK_OPENLIB, OnBlkOpenlib)
ON_COMMAND(ID_TK_POPUP_INSERTTK, OnTkPopupInserttk)
ON_COMMAND(ID_TK_POPUP_NEWTK, OnTkPopupNewtk)
ON_COMMAND(ID_TK_POPUP_TREETYPE, OnTkPopupTreetype)
ON_COMMAND(ID_TK_POPUP_REMOVETK, OnTkPopupRemovetk)
ON_COMMAND(ID_TK_POPUP_RENAMEKIND, OnTkPopupRenamekind)
ON_COMMAND(ID_TK_POPUP_NEW, OnTkPopupNew)
ON_COMMAND(ID_TK_POPUP_DEL, OnTkPopupDel)
ON_COMMAND(ID_BLK_DELKIND, OnBlkDelkind)
ON_COMMAND(ID_BLK_PAGEDOWN, OnBlkPagedown)
ON_COMMAND(ID_BLK_PAGEUP, OnBlkPageup)
ON_COMMAND(ID_BLK_UPGRADE, OnBlkUpgrade)
ON_COMMAND(ID_BLK_NEWDWG, OnBlkNewdwg)
//ON_COMMAND(ID_BLK_ABOUT, OnBlkAbout)
ON_WM_LBUTTONDBLCLK()
ON_COMMAND(ID_BLK_REPLACE, OnBlkReplace)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_CLOSE()
ON_COMMAND(ID_BLK_REBUILD, OnBlkRebuild)
//add by xlc on 070816
ON_WM_QUERYDRAGICON()
ON_NOTIFY(LVN_BEGINDRAG, IDC_TK_LIST, OnBegindragList)
ON_NOTIFY(NM_RCLICK, IDC_TK_LIST, OnRclickList)
ON_NOTIFY(TBN_DROPDOWN, IDR_TOOLBAR_TKW1, OnToolbarDropDown)
ON_NOTIFY(TBN_DROPDOWN, IDR_TOOLBAR_TKW2, OnToolbarDropDown)
ON_COMMAND(ID_MENUITEM_2DTK, OnSelect2DTKLib)
ON_COMMAND(ID_MENUITEM_EULIB, OnSelectEuroLib)
ON_COMMAND(ID_MENUITEM_MVLIB, OnSelectMViewLib)
ON_COMMAND(ID_MENUITEM_EBALLIB, OnSelectEBalLib)
ON_COMMAND(ID_MENUITEM_EWDLIB, OnSelectEWDLib)
ON_COMMAND(ID_MENUITEM_POLYSLIB, OnSelectPolyShapeLib)
ON_COMMAND(ID_MENUITEM_LINEPLIB, OnSelectLinePatLib)
ON_COMMAND(ID_MENUITEM_TITLEFLIB, OnSelectTitleFrameLib)
ON_COMMAND(ID_MENUITEM_DORLIB2D, OnSelectDorLib2D)
ON_COMMAND(ID_MENUITEM_WINLIB2D, OnSelectWinLib2D)
ON_COMMAND(ID_MENUITEM_WDLIB3D, OnSelectWDLib3D)
ON_COMMAND(ID_MENUITEM_RAILLID, OnSelectRailLib)
ON_UPDATE_COMMAND_UI(ID_BLK_REVERT, OnUpdateRevert)
ON_UPDATE_COMMAND_UI(ID_BLK_MERGE, OnUpdateMerge)
ON_UPDATE_COMMAND_UI(ID_MENU_SSORT, OnUpdateSort)
ON_UPDATE_COMMAND_UI(ID_MENU_SSAVE, OnUpdateSave)
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(ID_MENU_SSORT, ID_MENU_SSAVE, OnSort)
ON_COMMAND_RANGE(ID_LAYOUT1X1, ID_LAYOUT5X4, OnLayout)
ON_COMMAND_EX(OpenMenuID, OnSelectRecentBlb)
ON_COMMAND_EX(OpenMenuID + 1, OnSelectRecentBlb)
ON_COMMAND_EX(OpenMenuID + 2, OnSelectRecentBlb)
ON_COMMAND_EX(OpenMenuID + 3, OnSelectRecentBlb)
ON_COMMAND_EX(OpenMenuID + 4, OnSelectRecentBlb)
ON_COMMAND_EX(OpenMenuID + 5, OnSelectRecentBlb)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTKWorkspace message handlers
void CTKWorkspace::OnClose()
{
SaveStatus();
CAcUiDialog::OnClose();
}
BOOL CTKWorkspace::PreTranslateMessage(MSG* pMsg)
{
if (pMsg ->message == WM_KEYDOWN)
{
if (m_bEditLabel && (pMsg ->wParam == VK_RETURN || pMsg ->wParam == VK_DELETE
|| pMsg ->wParam == VK_ESCAPE || GetKeyState(VK_CONTROL)))
{
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
return TRUE;
}
}
return CAcUiDialog::PreTranslateMessage(pMsg);
}
BOOL CTKWorkspace::OnInitDialog()
{
CAcUiDialog::OnInitDialog();
InitToolBar();
CTemporaryResourceOverride vTmp;
m_imageTree.Create( IDB_TREE1, 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);
//add by xlc on 080828
if(m_nOpenMode == 0)
{
m_menu.LoadMenu(IDR_MENU_TKMAN);
}
else if(m_nOpenMode == 1)
{
if(m_bMultiSel)
{
m_menu.LoadMenu(IDR_MENU_TKW2);
}
else
{
m_menu.LoadMenu(IDR_MENU_TKW1);
}
}
m_menu.CheckMenuItem(ID_BLK_MERGE,m_treeCtrl.m_bMerge?MF_CHECKED:MF_UNCHECKED);
m_menu.CheckMenuItem(ID_BLK_REVERT,m_treeCtrl.m_bMerge?MF_UNCHECKED:MF_CHECKED);
m_menu.EnableMenuItem(ID_TK_POPUP_INSERTTK,IsLock()?MF_GRAYED:MF_ENABLED);
m_menu.EnableMenuItem(ID_TK_POPUP_REMOVETK,IsLock()?MF_GRAYED:MF_ENABLED);
m_menu.EnableMenuItem(ID_TK_POPUP_RENAMEKIND,IsLock()?MF_GRAYED:MF_ENABLED);
SetMenu(&m_menu);
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
}
m_listCtrl.ModifyStyle(LVS_SMALLICON, 0);
m_listCtrl.ModifyStyle(0, LVS_REPORT);
m_listCtrl.InsertColumn ( 0, _T("图块名称"), LVCFMT_LEFT, 400);
CRect rectDlg;
GetClientRect(rectDlg);
m_sizeDlg.cx = rectDlg.Width();
m_sizeDlg.cy = rectDlg.Height();
long nIncY = m_sizeDlg.cy - m_nOldSizeY; // 对话框绝对尺寸
long nIncX = m_sizeDlg.cx - m_nOldSizeX;
m_bInitSize = TRUE;
ResetSize(nIncX, nIncY);
m_ySplitter.BindWithControl(this, IDC_YBAR);
m_ySplitter.AttachAsAbovePane(IDC_TK_TREE);
m_ySplitter.AttachAsBelowPane(IDC_TK_LIST);
m_ySplitter.RecalcLayout();
m_ySplitter.SetMinHeight(50, 50);
m_xSplitter.BindWithControl(this, IDC_XBAR);
m_xSplitter.AttachAsLeftPane(IDC_TK_TREE);
m_xSplitter.AttachAsLeftPane(IDC_YBAR);
m_xSplitter.AttachAsLeftPane(IDC_TK_LIST);
m_xSplitter.AttachAsRightPane(IDC_PIC_IMAGE);
m_xSplitter.RecalcLayout();
m_xSplitter.SetMinWidth(20, 320);
m_ImageBox.ModifyStyle(0, SS_NOTIFY);
if(m_nOpenMode == 0 || m_bMultiSel)
{ //主功能对话框从注册表读取TKW信息,调用对话框通过参数传递
LoadStatus();
if(m_treeCtrl.m_bMerge)
m_ToolBar.CheckButton(ID_BLK_MERGE, 1);
else
m_ToolBar.CheckButton(ID_BLK_REVERT, 1);
//add by xlc on 080829
m_menu.CheckMenuItem(ID_BLK_MERGE,m_treeCtrl.m_bMerge?MF_CHECKED:MF_UNCHECKED);
m_menu.CheckMenuItem(ID_BLK_REVERT,m_treeCtrl.m_bMerge?MF_UNCHECKED:MF_CHECKED);
m_menu.EnableMenuItem(ID_TK_POPUP_INSERTTK,IsLock()?MF_GRAYED:MF_ENABLED);
m_menu.EnableMenuItem(ID_TK_POPUP_REMOVETK,IsLock()?MF_GRAYED:MF_ENABLED);
m_menu.EnableMenuItem(ID_TK_POPUP_RENAMEKIND,IsLock()?MF_GRAYED:MF_ENABLED);
}
m_ImageBox.SetPageSize(m_nPageRow, m_nPageColumn);
if(m_csCurTKWFile != _T(""))
{
m_treeCtrl.m_csLastTK = m_csLastTKName;
m_treeCtrl.m_csCurKind = m_csLastType;
m_treeCtrl.SetDataSource(m_csCurTKWFile);
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
}
int len = m_ImageBox.m_lstBlk.Length();
for(int i=0; i<len ; i++)
{
if(m_csCurRecord == m_ImageBox.m_lstBlk[i]->csDrawing)
{
m_ImageBox.m_lstSelected.Append(new int(i));
m_listCtrl.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
m_ImageBox.SelectIndex(i);
m_listCtrl.EnsureVisible(m_ImageBox.m_nIndex, TRUE);
m_vsBar.SetScrollPos(m_ImageBox.CurPage() * m_nPageRow);// 使滚动条跟着发生变化
ResetStateText();
break;
}
}
//add by xlc on 090728 添加图库动态菜单
if(m_nOpenMode==0)
{
AddDynMenu(TRUE);
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CTKWorkspace::OnCommand(WPARAM wParam, LPARAM lParam)
{
CString csCommand, csTKWFullName;
// if(!m_pOpenMenu)
// return CAcUiDialog::OnCommand(wParam, lParam);
if(m_pOpenMenu)
m_pOpenMenu->GetMenuString(wParam, csCommand, MF_BYCOMMAND); //判断用户是否点的是弹出菜单
else
m_cMenu.GetMenuString(wParam, csCommand, MF_BYCOMMAND); //判断用户是否点的是弹出菜单
if(csCommand.IsEmpty())
return CAcUiDialog::OnCommand(wParam, lParam);
GetTkwFileByMenu(csCommand, csTKWFullName);
if(!csTKWFullName.IsEmpty() && FindFile(csTKWFullName))
{
m_csCurTKWFile = csTKWFullName;
m_treeCtrl.SetDataSource(m_csCurTKWFile);
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
m_treeCtrl.SelectItem(m_treeCtrl.GetRootItem());
SetDlgItemText(IDC_S_DESCRIPTION, _T("打开tkw图库组文件"));
SaveStatus();
LoadStatus();
return TRUE;
}
else if(!FindFile(csTKWFullName) && !csTKWFullName.IsEmpty())
MessageBox(_T("没有找到库文件!请确认安装是否完全。"));
return CAcUiDialog::OnCommand(wParam, lParam);
}
void CTKWorkspace::ResetListData()
{
m_listCtrl.DeleteAllItems();
int len = m_ImageBox.m_lstBlk.Length();
m_bLock = TRUE;
for(int i=0; i<len ; i++)
{
m_listCtrl.InsertItem(i, m_ImageBox.m_lstBlk[i]->csItem);
}
len = m_ImageBox.m_lstSelected.Length();
for(i = 0;i<len;i++)
{
int sel = *m_ImageBox.m_lstSelected[i];
m_listCtrl.SetItemState(sel, LVIS_SELECTED, LVIS_SELECTED);
}
m_listCtrl.EnsureVisible(m_ImageBox.m_nIndex, TRUE);
m_listCtrl.SetFocus();
m_bLock = FALSE;
}
void CTKWorkspace::InitToolBar()
{
CTemporaryResourceOverride vTmp;
if(m_nOpenMode == 0)
{
//int ButtonID[]={ ID_BLK_NEWLIB, ID_BLK_OPENLIB ,0,
// ID_BLK_REVERT,ID_BLK_MERGE,0, ID_BLK_UPGRADE,
// ID_BLK_NEWDWG, ID_BLK_REBUILD, 0, ID_BLK_DELKIND,
// ID_BLK_DEL, 0, ID_BLK_LAYOUT, ID_BLK_PAGEUP,
// ID_BLK_PAGEDOWN, ID_BLK_SORT, 0, ID_BLK_ABOUT, ID_BLK_REPLACE, IDOK,};
int ButtonID[]={ ID_BLK_NEWLIB, ID_BLK_OPENLIB/* ,0,
ID_BLK_REVERT,ID_BLK_MERGE,0, ID_BLK_UPGRADE,
ID_BLK_NEWDWG, ID_BLK_REBUILD, 0, ID_BLK_DELKIND,
ID_BLK_DEL, 0, ID_BLK_LAYOUT, ID_BLK_PAGEUP,
ID_BLK_PAGEDOWN, ID_BLK_SORT, 0, ID_BLK_ABOUT, ID_BLK_REPLACE, IDOK,*/};
//m_ToolBar.InitToolBar(ButtonID, 21, IDR_TOOLBAR_TKW, this);
m_ToolBar.InitToolBar(ButtonID, 2, IDR_TOOLBAR_TKW, this);
m_ToolBar.SetStyle(ID_BLK_OPENLIB, TBSTYLE_DROPDOWN);
m_ToolBar.SetStyle(ID_BLK_REVERT, TBSTYLE_CHECKGROUP);
m_ToolBar.SetStyle(ID_BLK_MERGE, TBSTYLE_CHECKGROUP);
m_ToolBar.CheckButton(ID_BLK_REVERT, 1);
for (int i = 2; i < 21; i++)
m_ToolBar.DeleteButton(i);
}
else if(m_nOpenMode == 1)
{
if(m_bMultiSel)
{
int ButtonID[]={ ID_BLK_REVERT,ID_BLK_MERGE,0, ID_BLK_UPGRADE,
ID_BLK_NEWDWG, ID_BLK_REBUILD, 0, ID_BLK_DELKIND,
ID_BLK_DEL, 0, ID_BLK_LAYOUT, ID_BLK_PAGEUP,
ID_BLK_PAGEDOWN, ID_BLK_SORT, 0, ID_BLK_REPLACE, IDOK,};
m_ToolBar.InitToolBar(ButtonID, 17, IDR_TOOLBAR_TKW2, this);
for (int i = 2; i < 17; i++)
m_ToolBar.DeleteButton(i);
}
else
{
int ButtonID[]={ ID_BLK_REVERT, ID_BLK_MERGE, 0,
ID_BLK_DELKIND, ID_BLK_DEL, 0,
ID_BLK_LAYOUT, ID_BLK_PAGEUP, ID_BLK_PAGEDOWN,
ID_BLK_SORT, 0, IDOK, };
m_ToolBar.InitToolBar(ButtonID, 12, IDR_TOOLBAR_TKW1, this);
for (int i = 2; i < 12; i++)
m_ToolBar.DeleteButton(i);
}
//add by cwk on 060912
m_ToolBar.SetStyle(ID_BLK_REVERT, TBSTYLE_CHECKGROUP);
m_ToolBar.SetStyle(ID_BLK_MERGE, TBSTYLE_CHECKGROUP);
m_ToolBar.CheckButton(ID_BLK_REVERT, 1);
}
//modify by xlc on 070919
//m_ToolBar.SetStyle(ID_BLK_SORT, TBSTYLE_CHECK);
m_ToolBar.SetStyle(ID_BLK_SORT, TBSTYLE_DROPDOWN);
m_ToolBar.SetStyle(ID_BLK_LAYOUT, TBSTYLE_DROPDOWN);
}
// 当对话框大小改变时:
void CTKWorkspace::ResetSize(long nIncX, long nIncY)
{
CRect rectImage;
m_ImageBox.GetWindowRect(rectImage);
ScreenToClient(rectImage);
CRect rectDescription, rectScroll, rectList, rectXbar;
m_ctrlDescription.GetWindowRect(rectDescription);
ScreenToClient(rectDescription);
m_vsBar.GetWindowRect(rectScroll);
ScreenToClient(rectScroll);
m_listCtrl.GetWindowRect(rectList);
ScreenToClient(rectList);
CWnd *pWnd = GetDlgItem(IDC_XBAR);
ASSERT(pWnd);
pWnd->GetWindowRect(rectXbar);
ScreenToClient(rectXbar);
m_ImageBox.MoveWindow(rectImage.left, rectImage.top,
rectImage.Width() + nIncX, rectImage.Height() + nIncY);
m_ctrlDescription.MoveWindow(rectDescription.left, rectDescription.top + nIncY,
rectDescription.Width() + nIncX, rectDescription.Height());
m_vsBar.MoveWindow(rectScroll.left + nIncX, rectScroll.top,
rectScroll.Width(), rectScroll.Height() + nIncY);
m_listCtrl.MoveWindow(rectList.left, rectList.top,
rectList.Width(), rectList.Height() + nIncY);
pWnd->MoveWindow(rectXbar.left, rectXbar.top,
rectXbar.Width(), rectXbar.Height() + nIncY);
}
void CTKWorkspace::OnSize(UINT nType, int cx, int cy)
{
if(m_bInitSize && (!nType || nType==SIZE_MAXIMIZED))
{
CSize sizeOld = m_sizeDlg;
m_sizeDlg.cx = cx;
m_sizeDlg.cy = cy;
long nIncY = m_sizeDlg.cy - sizeOld.cy;
long nIncX = m_sizeDlg.cx - sizeOld.cx;
ResetSize(nIncX, nIncY);
m_ImageBox.Wash();// 刷新显示slide 之间的间隔
}
}
int CTKWorkspace::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CAcUiDialog::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect;
GetClientRect(rect);
m_nOldSizeX=rect.Width();
m_nOldSizeY=rect.Height();
return 0;
}
// 改变树、布局、初始 时调用
BOOL CTKWorkspace::InitVSBar()
{
int totalRec, pageSize, imageRowNum, imageColNum;
imageRowNum = m_nPageRow;
imageColNum = m_nPageColumn;
pageSize = imageRowNum * imageColNum;
totalRec = m_ImageBox.GetTotalRecords();
if(totalRec <= pageSize || totalRec == 0)
{
m_vsBar.ShowScrollBar(FALSE);
return FALSE;
}
else
m_vsBar.ShowScrollBar(TRUE);
SCROLLINFO scrollInfo;
scrollInfo.cbSize = sizeof(SCROLLINFO);
scrollInfo.fMask = SIF_ALL;
scrollInfo.nMin = 0;
scrollInfo.nMax = ((totalRec-1) / pageSize+1) * imageRowNum-1;
scrollInfo.nPage = imageRowNum;
scrollInfo.nPos = m_ImageBox.CurPage() * imageRowNum;
m_vsBar.SetScrollInfo(&scrollInfo, TRUE);
return TRUE;
}
void CTKWorkspace::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if(pScrollBar != &m_vsBar)
{
CAcUiDialog::OnVScroll(nSBCode, nPos, pScrollBar);
return;
}
UINT nEndPos=pScrollBar->GetScrollPos();
switch(nSBCode)
{
case SB_THUMBPOSITION: //拖动滑块
m_ImageBox.GoPage(nPos/m_nPageRow);
nEndPos = nPos;
break;
case SB_LINEDOWN:
m_ImageBox.GoPage(m_ImageBox.CurPage() + 1);
nEndPos += m_nPageRow;
break;
case SB_PAGEDOWN:
m_ImageBox.GoPage(m_ImageBox.CurPage() + 1);
nEndPos += m_nPageRow;
break;
case SB_LINEUP:
m_ImageBox.GoPage(m_ImageBox.CurPage() - 1);
nEndPos -= m_nPageRow;
break;
case SB_PAGEUP:
m_ImageBox.GoPage(m_ImageBox.CurPage() - 1);
nEndPos -= m_nPageRow;
break;
}
pScrollBar->SetScrollPos(nEndPos);
ResetStateText();
CAcUiDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CTKWorkspace::HideDialog(BOOL Flag)
{
if (Flag)
{
GetParent()->EnableWindow(TRUE);
GetParent()->SetFocus();
GetParent()->SetActiveWindow();
ShowWindow(SW_HIDE);
}
else
{
GetParent()->EnableWindow(FALSE);
EnableWindow(TRUE);
SetActiveWindow();
ShowWindow(SW_SHOW);
}
}
int CTKWorkspace::Add3DImage2Dwb(const TCHAR* szTKName, const TCHAR* szDrawing, BOOL bIsRebuild)
{
CString csTKName, csDrawing;
csTKName = szTKName;
csDrawing = szDrawing;
PickSet ss(SS_FREE);
int rc=SelectEntities(_T("\n选择构成图块的图元:"), ss, RBList(8,_T("2D,3D"), NULL));
if(rc!=RTNORM && !bIsRebuild)
return RTERROR;
else if(bIsRebuild)
{
return RebuildJpg(csTKName);
}
PickSet ssMat(SS_FREE);
GetAShadePickSet(ssMat, ss);
PickSet ss3d(SS_FREE), ss2d(SS_FREE);
long len = ss.Length();
for(long i=0;i<len;i++)
{
Entity ent = ss[i];
TCHAR szLayer[256];
ent.GetData(8, szLayer);
if(_tcsicmp(szLayer, _T("2D")) == 0)
{
ent.SetData(0, _T("0"));
ent.Modify();
ss2d += ent;
}
if(_tcsicmp(szLayer, _T("3D")) == 0)
{
ent.SetData(0, _T("0"));
ent.Modify();
ss3d += ent;
}
}
XPoint basePt0;
resbuf rb;
ads_getvar(_T("INSBASE"), &rb);
basePt0[0] = rb.resval.rpoint[0];
basePt0[1] = rb.resval.rpoint[1];
basePt0[2] = rb.resval.rpoint[2];
XPoint basePt=Ucs2Wcs(basePt0);
adsout << _T("\n图块基点<") << basePt0 << _T(">:");
rc=ads_getpoint(XPoint(basePt0), _T(""), basePt0);
if(rc==RTNORM)
basePt = Ucs2Wcs(basePt0);
if(rc==RTNORM || rc==RTNONE)
{
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);
MakeVisible(ss2d, false);
int cvport = 0;
xg_getvar(_T("CVPORT"), &cvport);
SHads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("OFF"),RTNONE);
CRect rectVP = GetVPRect(cvport);
CBitmap bitmap;
GetRectBmpFromBmp(acedGetAcadDwgView(), rectVP, bitmap);
HBITMAP hBitmap = (HBITMAP) bitmap.GetSafeHandle();
TCHAR tempPrefix[256], bmpPrefix[256], jpgPrefix[256];
GetTempPath(255, tempPrefix);
if(tempPrefix[_tcslen(tempPrefix)-1]!=_T('\\'))
_tcscat(tempPrefix, _T("\\"));
_tcscat(tempPrefix, csDrawing);
_tcscpy(bmpPrefix, tempPrefix);
_tcscpy(jpgPrefix, tempPrefix);
_tcscat(bmpPrefix, _T(".bmp"));
_tcscat(jpgPrefix, _T(".jpg"));
SaveBitmapToFile(hBitmap, bmpPrefix);
SHads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("ON"),RTNONE);
FILE *fpIn = _tfopen(bmpPrefix, _T("rb"));
if(!fpIn)
{
MakeVisible(ssAll, true);
MakeVisible(ss2d, true);
return RTERROR;
}
FILE *fpOut = _tfopen(jpgPrefix, _T("wb"));
if(!fpOut)
{
MakeVisible(ssAll, true);
MakeVisible(ss2d, true);
fclose(fpIn);
return RTERROR;
}
// int bOk = WriteJpeg(fpIn, fpOut);
int bOk = CTangentImage::WriteJpeg(bmpPrefix, jpgPrefix, CXIMAGE_FORMAT_BMP);
fclose(fpIn);
fclose(fpOut);
_tremove(bmpPrefix);
//以上是制作JPG文件,放到上面是因为Selectentity之后所有图元都变虚
MakeVisible(ss2d, true);
MakeVisible(ssAll, true);
XString xsFullDwg2d, xsFullDwg3d;
BOOL bHide = FALSE;
TCHAR dwgPrefix[256]=_T("");
TCHAR dwgPrefix2d[256]=_T("");
TCHAR dwgPrefix3d[256]=_T("");
GetTempPath(255, dwgPrefix);
if(dwgPrefix[_tcslen(dwgPrefix)-1]!=_T('\\'))
_tcscat(dwgPrefix, _T("\\"));
_tcscpy(dwgPrefix2d, dwgPrefix);
_tcscpy(dwgPrefix3d, dwgPrefix);
_tcscat(dwgPrefix2d, _T("SRTEMP2d\\"));
_tcscat(dwgPrefix3d, _T("SRTEMP3d\\"));
MakeDir(dwgPrefix2d);
MakeDir(dwgPrefix3d);
xsFullDwg2d << dwgPrefix2d << csDrawing << _T(".dwg");
xsFullDwg3d << dwgPrefix3d << csDrawing << _T(".dwg");
if(!ss)
{
return RTERROR;
}
SetLayerLocked(_T("ASHADE"), false); // ASHADE层解锁
ss3d += ssMat;
TWBlock(ss2d, xsFullDwg2d, XPoint(basePt.x, basePt.y)); //二维部分基点z坐标总为0
TWBlock(ss3d, xsFullDwg3d, basePt);
SetLayerLocked(_T("ASHADE"), true); // ASHADE层锁定
long len3d = ss3d.Length();
for(long m=0;m<len3d;m++)
{
Entity ent3d = ss3d[m];
ent3d.SetData(8, _T("3D"));
ent3d.Modify();
}
long len2d = ss2d.Length();
for(long n=0;n<len2d;n++)
{
Entity ent2d = ss2d[n];
ent2d.SetData(8, _T("2D"));
ent2d.Modify();
}
XString xsDwbFile2d(256), xsDwbFile3d(256), xsJpgLib(256);
xsDwbFile2d << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_2d.DWB");
xsDwbFile3d << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_3d.DWB");
xsJpgLib << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".JPB");
XDrawingLib dwbMan2d(xsDwbFile2d);
if(!dwbMan2d)
return RTERROR;
int ret = dwbMan2d.Append(xsFullDwg2d);
_tremove(xsFullDwg2d);
XDrawingLib dwbMan3d(xsDwbFile3d);
if(!dwbMan3d)
return RTERROR;
ret = dwbMan3d.Append(xsFullDwg3d);
_tremove(xsFullDwg3d);
XJpegLib JpbMan(xsJpgLib);
JpbMan.Append(jpgPrefix);
_tremove(jpgPrefix);
}
return RTNORM;
}
//add by cwk on 060922
int CTKWorkspace::Add3DImage2DwbForBlkRebuild(const TCHAR* szTKName,const TCHAR* szDrawing,
BOOL bIsRebuild)
{
CString csTKName, csDrawing;
csTKName = szTKName;
csDrawing = szDrawing;
PickSet ss(SS_FREE);
int rc=SelectEntities(_T("\n选择构成图块的图元:"), ss, RBList(8,_T("2D,3D"), NULL));
if(rc!=RTNORM && !bIsRebuild)
return RTERROR;
else if(bIsRebuild)
{
return RebuildJpg(csTKName);
}
PickSet ssMat(SS_FREE);
GetAShadePickSet(ssMat, ss);
PickSet ss3d(SS_FREE), ss2d(SS_FREE);
long len = ss.Length();
for(long i=0;i<len;i++)
{
Entity ent = ss[i];
TCHAR szLayer[256];
ent.GetData(8, szLayer);
if(_tcsicmp(szLayer, _T("2D")) == 0)
{
ent.SetData(0, _T("0"));
ent.Modify();
ss2d += ent;
}
if(_tcsicmp(szLayer, _T("3D")) == 0)
{
ent.SetData(0, _T("0"));
ent.Modify();
ss3d += ent;
}
}
XPoint basePt0;
resbuf rb;
ads_getvar(_T("INSBASE"), &rb);
basePt0[0] = rb.resval.rpoint[0];
basePt0[1] = rb.resval.rpoint[1];
basePt0[2] = rb.resval.rpoint[2];
XPoint basePt=Ucs2Wcs(basePt0);
adsout << _T("\n图块基点<") << basePt0 << _T(">:");
rc=ads_getpoint(XPoint(basePt0), _T(""), basePt0);
if(rc==RTNORM)
basePt = Ucs2Wcs(basePt0);
if(rc==RTNORM || rc==RTNONE)
{
XString xsDwbPath;
if(!m_ImageBox.m_bIsJpgShow)
xsDwbPath << GetPathNameByAllName(szTKName) << GetFileNameByAllName(szTKName) << _T(".DWB");
else
xsDwbPath << GetPathNameByAllName(szTKName) << GetFileNameByAllName(szTKName) << _T("_3d.DWB");
{
XDrawingLib dwb(xsDwbPath);
CString sSlb((const TCHAR*)xsDwbPath);
sSlb.Replace(_T(".DWB"),_T(".SLB"));
XSlideLib slb(sSlb);
if(!(!dwb)) dwb.Remove(szDrawing);
if(!(!slb)) slb.Remove(szDrawing);
}
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);
MakeVisible(ss2d, false);
int cvport = 0;
xg_getvar(_T("CVPORT"), &cvport);
SHads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("OFF"),RTNONE);
CRect rectVP = GetVPRect(cvport);
CBitmap bitmap;
GetRectBmpFromBmp(acedGetAcadDwgView(), rectVP, bitmap);
HBITMAP hBitmap = (HBITMAP) bitmap.GetSafeHandle();
TCHAR tempPrefix[256], bmpPrefix[256], jpgPrefix[256];
GetTempPath(255, tempPrefix);
if(tempPrefix[_tcslen(tempPrefix)-1]!=_T('\\'))
_tcscat(tempPrefix, _T("\\"));
_tcscat(tempPrefix, csDrawing);
_tcscpy(bmpPrefix, tempPrefix);
_tcscpy(jpgPrefix, tempPrefix);
_tcscat(bmpPrefix, _T(".bmp"));
_tcscat(jpgPrefix, _T(".jpg"));
SaveBitmapToFile(hBitmap, bmpPrefix);
SHads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("ON"),RTNONE);
FILE *fpIn = _tfopen(bmpPrefix, _T("rb"));
if(!fpIn)
{
MakeVisible(ssAll, true);
MakeVisible(ss2d, true);
return RTERROR;
}
FILE *fpOut = _tfopen(jpgPrefix, _T("wb"));
if(!fpOut)
{
MakeVisible(ssAll, true);
MakeVisible(ss2d, true);
fclose(fpIn);
return RTERROR;
}
// int bOk = WriteJpeg(fpIn, fpOut);
int bOk = CTangentImage::WriteJpeg(bmpPrefix, jpgPrefix, 1);
fclose(fpIn);
fclose(fpOut);
_tremove(bmpPrefix);
//以上是制作JPG文件,放到上面是因为Selectentity之后所有图元都变虚
MakeVisible(ss2d, true);
MakeVisible(ssAll, true);
XString xsFullDwg2d, xsFullDwg3d;
BOOL bHide = FALSE;
TCHAR dwgPrefix[256]=_T("");
TCHAR dwgPrefix2d[256]=_T("");
TCHAR dwgPrefix3d[256]=_T("");
GetTempPath(255, dwgPrefix);
if(dwgPrefix[_tcslen(dwgPrefix)-1]!=_T('\\'))
_tcscat(dwgPrefix, _T("\\"));
_tcscpy(dwgPrefix2d, dwgPrefix);
_tcscpy(dwgPrefix3d, dwgPrefix);
_tcscat(dwgPrefix2d, _T("SRTEMP2d\\"));
_tcscat(dwgPrefix3d, _T("SRTEMP3d\\"));
MakeDir(dwgPrefix2d);
MakeDir(dwgPrefix3d);
xsFullDwg2d << dwgPrefix2d << csDrawing << _T(".dwg");
xsFullDwg3d << dwgPrefix3d << csDrawing << _T(".dwg");
if(!ss)
{
return RTERROR;
}
SetLayerLocked(_T("ASHADE"), false); // ASHADE层解锁
ss3d += ssMat;
TWBlock(ss2d, xsFullDwg2d, XPoint(basePt.x, basePt.y)); //二维部分基点z坐标总为0
TWBlock(ss3d, xsFullDwg3d, basePt);
SetLayerLocked(_T("ASHADE"), true); // ASHADE层锁定
long len3d = ss3d.Length();
for(long m=0;m<len3d;m++)
{
Entity ent3d = ss3d[m];
ent3d.SetData(8, _T("3D"));
ent3d.Modify();
}
long len2d = ss2d.Length();
for(long n=0;n<len2d;n++)
{
Entity ent2d = ss2d[n];
ent2d.SetData(8, _T("2D"));
ent2d.Modify();
}
XString xsDwbFile2d(256), xsDwbFile3d(256), xsJpgLib(256);
xsDwbFile2d << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_2d.DWB");
xsDwbFile3d << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_3d.DWB");
xsJpgLib << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".JPB");
XDrawingLib dwbMan2d(xsDwbFile2d);
if(!dwbMan2d)
return RTERROR;
int ret = dwbMan2d.Append(xsFullDwg2d);
_tremove(xsFullDwg2d);
XDrawingLib dwbMan3d(xsDwbFile3d);
if(!dwbMan3d)
return RTERROR;
ret = dwbMan3d.Append(xsFullDwg3d);
_tremove(xsFullDwg3d);
XJpegLib JpbMan(xsJpgLib);
JpbMan.Append(jpgPrefix);
_tremove(jpgPrefix);
}
return RTNORM;
}
int CTKWorkspace::AddImage2DwbForBlkRebuild(const TCHAR* szTKName,const TCHAR* szDrawing,BOOL bIsRebuild)
{
CString csTKName, csDrawing;
csTKName = szTKName;
csDrawing = szDrawing;
if(m_ImageBox.m_bIsJpgShow)
return Add3DImage2DwbForBlkRebuild(csTKName,csDrawing, bIsRebuild);
PickSet ss(SS_FREE);
int rc=SelectEntities(_T("\n选择构成图块的图元<只重制幻灯片>:"), ss, RBList(RTDXF0, _T("*"), NULL));
if(rc!=RTNORM && !bIsRebuild)
return RTERROR;
else if(rc!=RTNORM&&bIsRebuild)
{
return RebuildSld(csTKName);
}
int nRetCode=RTERROR;
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);
XString xsFullSld, xsFullDwg;
BOOL bHide = FALSE;
BOOL bDelete = TRUE;
TCHAR dwgPrefix[256]=_T("");
GetTempPath(255, dwgPrefix);
if(dwgPrefix[_tcslen(dwgPrefix)-1]!=_T('\\'))
_tcscat(dwgPrefix, _T("\\"));
_tcscat(dwgPrefix, _T("SRTEMP\\"));
MakeDir(dwgPrefix);
xsFullSld << dwgPrefix << csDrawing << _T(".sld");
xsFullDwg << dwgPrefix << csDrawing << _T(".dwg");
while(1)
{
const TCHAR *szPrompt=_T("\n制作幻灯片(请用zoom调整合适)或 [消隐(H)/不制作(N)/返回(X)]<制作>:");
XString sKeyword;
int nRet = 0;
INITGET_BEG(0, _T("H X N"));
nRet = ads_getkword(szPrompt, sKeyword);
INITGET_END();
if(nRet == RTNONE)
break;
if(sKeyword[0]==_T('H'))
{
bHide = TRUE;
}
else if(sKeyword[0]==_T('N'))
{
bDelete = FALSE;
break;
}
else
{
MakeVisible(ssAll, true);
return RTERROR;
}
}
if(bHide)
{
XPushVar<int> splframe(_T("SPLFRAME"), 0);
SHads_command(RTSTR, _T("HIDE"), RTNONE);
SHads_command(RTSTR, _T("MSLIDE"), RTSTR, (TCHAR *)xsFullSld, RTNONE);
SHads_command(RTSTR, _T("REGEN"), RTNONE);
}
else
{
SHads_command(RTSTR, _T("MSLIDE"), RTSTR, (TCHAR *)xsFullSld, RTNONE);
}
XString xsDwbPath;
if(!m_ImageBox.m_bIsJpgShow)
xsDwbPath << GetPathNameByAllName(szTKName) << GetFileNameByAllName(szTKName) << _T(".DWB");
else
xsDwbPath << GetPathNameByAllName(szTKName) << GetFileNameByAllName(szTKName) << _T("_3d.DWB");
{
XDrawingLib dwb(xsDwbPath);
if(!(!dwb)) dwb.Remove(szDrawing);
if (bDelete)
{
CString sSlb((const TCHAR*)xsDwbPath);
sSlb.Replace(_T(".DWB"),_T(".SLB"));
XSlideLib slb(sSlb);
if(!(!slb)) slb.Remove(szDrawing);
}
}
if (bDelete)
{
XString xsSlbFile(256);
xsSlbFile << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".SLB");
XSlideLib slbMan(xsSlbFile);
if(!slbMan)
{
MakeVisible(ssAll, true);
return RTERROR;
}
slbMan.Append(xsFullSld);
_tremove(xsFullSld);
}
if(!ss)
{
MakeVisible(ssAll, true);
return RTERROR;
}
if(arxWBlock(ss, xsFullDwg, Ucs2Wcs(basePt)))
{
XString xsDwbFile(256);
xsDwbFile << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".DWB");
XDrawingLib dwbMan(xsDwbFile);
if(!dwbMan){
}
else
{
dwbMan.Append(xsFullDwg);
nRetCode=RTNORM;
}
_tremove(xsFullDwg);
}
MakeVisible(ssAll, true);
}
return RTNORM;
}
int CTKWorkspace::AddImage2Dwb(const TCHAR* szTKName, const TCHAR* szDrawing, BOOL bIsRebuild)
{
CString csTKName, csDrawing;
csTKName = szTKName;
csDrawing = szDrawing;
if(m_ImageBox.m_bIsJpgShow)
return Add3DImage2Dwb(csTKName, csDrawing, bIsRebuild);
PickSet ss(SS_FREE);
int rc=SelectEntities(_T("\n选择构成图块的图元:"), ss, RBList(RTDXF0, _T("*"), NULL));
if(rc!=RTNORM && !bIsRebuild)
return RTERROR;
else if(rc!=RTNORM&&bIsRebuild)
{
return RebuildSld(csTKName);
}
int nRetCode=RTERROR;
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);
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 << csDrawing << _T(".sld");
xsFullDwg << dwgPrefix << csDrawing << _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
{
MakeVisible(ssAll, true);
return RTERROR;
}
}
if(bHide)
{
XPushVar<int> splframe(_T("SPLFRAME"), 0);
SHads_command(RTSTR, _T("HIDE"), RTNONE);
SHads_command(RTSTR, _T("MSLIDE"), RTSTR, (TCHAR *)xsFullSld, RTNONE);
SHads_command(RTSTR, _T("REGEN"), RTNONE);
}
else
{
SHads_command(RTSTR, _T("MSLIDE"), RTSTR, (TCHAR *)xsFullSld, RTNONE);
}
XString xsSlbFile(256);
xsSlbFile << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".SLB");
XSlideLib slbMan(xsSlbFile);
if(!slbMan)
{
MakeVisible(ssAll, true);
return RTERROR;
}
slbMan.Append(xsFullSld);
_tremove(xsFullSld);
if(!ss)
{
MakeVisible(ssAll, true);
return RTERROR;
}
if(arxWBlock(ss, xsFullDwg, Ucs2Wcs(basePt)))
{
XString xsDwbFile(256);
xsDwbFile << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".DWB");
XDrawingLib dwbMan(xsDwbFile);
if(!dwbMan){
}
else
{
dwbMan.Append(xsFullDwg);
nRetCode=RTNORM;
}
_tremove(xsFullDwg);
}
MakeVisible(ssAll, true);
}
//add by xlc on 080812
else
return RTERROR;
return RTNORM;
}
// 布局
void CTKWorkspace::OnLayout(UINT nID)
{
switch (nID)
{
case ID_LAYOUT1X1:
m_ImageBox.SetPageSize(1,1);
m_nPageRow = 1;
m_nPageColumn = 1;
break;
case ID_LAYOUT2X1:
m_ImageBox.SetPageSize(2,1);
m_nPageRow = 2;
m_nPageColumn = 1;
break;
case ID_LAYOUT2X2:
m_ImageBox.SetPageSize(2,2);
m_nPageRow = 2;
m_nPageColumn = 2;
break;
case ID_LAYOUT3X2:
m_ImageBox.SetPageSize(3,2);
m_nPageRow = 3;
m_nPageColumn = 2;
break;
case ID_LAYOUT3X3:
m_ImageBox.SetPageSize(3,3);
m_nPageRow = 3;
m_nPageColumn = 3;
break;
case ID_LAYOUT4X3:
m_ImageBox.SetPageSize(4,3);
m_nPageRow = 4;
m_nPageColumn = 3;
break;
case ID_LAYOUT4X4:
m_ImageBox.SetPageSize(4,4);
m_nPageRow = 4;
m_nPageColumn = 4;
break;
case ID_LAYOUT5X4:
m_ImageBox.SetPageSize(5,4);
m_nPageRow = 5;
m_nPageColumn = 4;
break;
}
m_ImageBox.Wash();
m_ImageBox.SetupImage(TRUE);
InitVSBar();
}
//add by xlc on 070918
void CTKWorkspace::OnSort(UINT nID)
{
switch (nID)
{
case ID_MENU_SSORT:
{
m_ImageBox.m_bSort = !m_ImageBox.m_bSort;
if(m_ImageBox.m_bSort)
{
m_ImageBox.SetSort();
SetDlgItemText(IDC_S_DESCRIPTION, _T("按排序图块名次序显示"));
}
else
{
SetDlgItemText(IDC_S_DESCRIPTION, _T("按图块入库次序显示"));
ResetImage();
}
InitVSBar();
ResetListData();
}
break;
case ID_MENU_SSAVE:
if(MessageBox(_T("您确定要保存当前的排序吗?"),_T("保存排序"),MB_OKCANCEL|MB_ICONQUESTION) != IDOK)
return;
if(m_ImageBox.m_bSort)
{
ModifyDatabaseFile();
m_ImageBox.m_bSort = FALSE;
}
break;
}
}
void CTKWorkspace::OnContextMenu(CWnd* pWnd, CPoint point)
{
if(m_ImageBox.m_bRMouseDown)
{
CMenu menu;
menu.LoadMenu(IDR_MENU_IMAGELAYOUT);
if((m_nOpenMode == 0 || m_bMultiSel) && IsInRect(IDC_PIC_IMAGE, point))
{
CMenu *pSubMenu = menu.GetSubMenu(0);
if(pSubMenu)
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this, NULL);
}
m_ImageBox.m_bRMouseDown=FALSE;
}
}
BOOL CTKWorkspace::IsInRect(UINT CtrlID, CPoint point)
{
CRect rect;
CWnd *pWnd=GetDlgItem(CtrlID);
ASSERT(pWnd);
pWnd->GetWindowRect(rect);
if(point.x<rect.BottomRight().x && point.y<rect.BottomRight().y && point.x >rect.TopLeft().x && point.y >rect.TopLeft().y)
return TRUE;
return FALSE;
}
//存储状态
void CTKWorkspace::SaveStatus()
{
//modified by yujie 070511
//XString xsRoot, xsKey;
//xsKey = _T("BLKMAN");
XString xsRoot;
TCHAR xsKey[1024]=_T("BLKMAN");
_tcscat(xsRoot, GetRegLocation());
if(m_nOpenMode == 1)
{
_tcscat(xsRoot, _T("\\BLKMAN"));
TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
_tsplitpath(m_csCurTKWFile, szDrive, szDir, szFile, szExt);
_tcscpy(xsKey, szFile);
}
CRegProperty regProp(xsRoot, xsKey);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.SetValue(_T("TKWName"), m_csCurTKWFile);
m_treeCtrl.GetNodeAllPath(m_treeCtrl.GetSelectedItem(), m_csLastTKName, m_csLastType);
regProp.SetValue(_T("CurTKName"), m_csLastTKName);
if(m_csLastType == _T(""))
regProp.SetValue(_T("CurType"), _T("*"));
else
regProp.SetValue(_T("CurType"), m_csLastType);
if(m_ImageBox.m_lstSelected.Length() == 1)
{
int idx = *m_ImageBox.m_lstSelected[0];
if(idx>=0 && idx<m_ImageBox.m_lstBlk.Length()) //add by yujie 070523
{
m_csCurRecord = m_ImageBox.m_lstBlk[idx]->csDrawing;
}
}
regProp.SetValue(_T("CurRecord"), m_csCurRecord);
regProp.SetValue(_T("PageRow"), m_nPageRow); // 行数
regProp.SetValue(_T("PageColumn"), m_nPageColumn); // 列数
regProp.SetValue(_T("IsMerge"), m_treeCtrl.m_bMerge); // 合并状态
XStringList lstTkwItem;
GetTchtkwAllItem(lstTkwItem);
int nLenArray = lstTkwItem.Length();
BOOL bFlag = FALSE;
for(int i=0;i<nLenArray;i++)
{
if(lstTkwItem[i] != _T("#"))
{
CString csTKWFullName;
GetTkwFileByMenu(lstTkwItem[i], csTKWFullName);
if(_tcsicmp(csTKWFullName, m_csCurTKWFile) == 0)
{
bFlag = TRUE;
break;
}
}
}
if(!bFlag)
{
int nLen=m_lstBlbNames.Length();
for(int i=0; i<nLen; i++)
{
if(_tcsicmp((const TCHAR*)m_csCurTKWFile, (const TCHAR*)m_lstBlbNames[i]) == 0)
{
m_lstBlbNames.Remove(i);
nLen--;
break;
}
}
if(nLen>=g_nMaxRecentBlb) m_lstBlbNames.Remove(0);
m_lstBlbNames.Append(tstrnew(m_csCurTKWFile));
nLen=m_lstBlbNames.Length();
for(i=0; i<nLen; i++)
{
if(i<g_nMaxRecentBlb)
{
XString sKey(256), sValue(256);
sKey << _T("The recent TKW") << (i + 1);
sValue << m_lstBlbNames[i];
regProp.SetValue(sKey, sValue);
}
else break;
}
}
}
//读取状态
void CTKWorkspace::LoadStatus()
{
//modified by yujie 070511
//XString xsRoot, xsKey;
//xsKey = _T("BLKMAN");
XString xsRoot;
TCHAR xsKey[1024]=_T("BLKMAN");
_tcscat(xsRoot, GetRegLocation());
if(m_nOpenMode == 1)
{
_tcscat(xsRoot, _T("\\BLKMAN"));
TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
_tsplitpath(m_csCurTKWFile, szDrive, szDir, szFile, szExt);
_tcscpy(xsKey, szFile);
}
CRegProperty regProp(xsRoot, xsKey);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.GetValue(_T("TKWName"), m_csCurTKWFile);
regProp.GetValue(_T("CurTKName"), m_csLastTKName);
regProp.GetValue(_T("CurType"), m_csLastType);
regProp.GetValue(_T("CurRecord"), m_csCurRecord);
regProp.GetValue(_T("PageRow"), m_nPageRow); // 行数
regProp.GetValue(_T("PageColumn"), m_nPageColumn); // 列数
regProp.GetValue(_T("IsMerge"), m_treeCtrl.m_bMerge); // 合并状态
for(int i=0; i<=g_nMaxRecentBlb; i++)
{
XString sKey(256);
CString csValue;
sKey << _T("The recent TKW") << (i + 1);
regProp.GetValue(sKey, csValue);
if(csValue.IsEmpty()) continue;
if(!FindFile(csValue)) //目录已经不存在
continue;
BOOL bAppend=TRUE;
for(int j=0; j<m_lstBlbNames.Length(); j++)
{
if(m_lstBlbNames[j]==csValue)
{
bAppend=FALSE;
break;
}
}
if(bAppend) m_lstBlbNames.Append(tstrnew(csValue));
}
}
void CTKWorkspace::OnItemchangedTkList(NMHDR* pNMHDR, LRESULT* pResult)
{
if(m_bLock)
{
return;
}
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int nSel = pNMListView->iItem;
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
m_ImageBox.m_lstSelected.Reset();
while (pos)
{
int nItem = m_listCtrl.GetNextSelectedItem(pos);
m_ImageBox.m_lstSelected.Append(new int(nItem));
}
m_ImageBox.SelectIndex(nSel);
m_vsBar.SetScrollPos(m_ImageBox.CurPage() * m_nPageRow);// 使滚动条跟着发生变化
ResetStateText();
*pResult = 0;
}
void CTKWorkspace::OnClickTkList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int nSel = pNMListView->iItem;
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
if(nSel < 0 && !pos)
{ //取消选中
m_ImageBox.m_lstSelected.Reset();
m_ImageBox.ClearBkColor();
*pResult = 0;
ResetStateText();
return;
}
*pResult = 0;
}
//add by xlc on 070918
void CTKWorkspace::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
if(!m_bDragging)
{
POINT ptClient;
::GetCursorPos((LPPOINT)&ptClient);
CMenu menu;
menu.LoadMenu(IDR_MENU_IMAGELAYOUT);
CMenu *pSubMenu = menu.GetSubMenu(0);
if(pSubMenu)
{
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
ptClient.x, ptClient.y, this, NULL);
}
}
*pResult = 0;
}
void CTKWorkspace::OnLButtonDown(UINT nFlags, CPoint point)
{
if(point.x == -1 && point.y == -1 && !IsLock())
{ //鼠标拖拽
SetCapture();
m_treeCtrl.m_bCellIsDragging = TRUE;
m_treeCtrl.m_dragTarget = NULL;
}
CAcUiDialog::OnLButtonDown(nFlags, point);
}
void CTKWorkspace::OnMouseMove(UINT nFlags, CPoint point)
{
//add by xlc on 070828
if (m_bDragging)
{
CPoint pt(point); //当前鼠标位置
RECT lpRect;
m_listCtrl.GetItemRect(0,&lpRect,LVIR_BOUNDS);
int height = lpRect.bottom - lpRect.top;
int dist = point.y - lpRect.top;
int n = dist / height+1;
pt.y = lpRect.top + n * height;
pt.x = 0;
ClientToScreen(&pt);
m_pDragImage->DragMove(pt);
m_pDragImage->DragShowNolock(false);
pt.y = point.y;//lpRect.top + n * height;
pt.x = 20;
ClientToScreen(&pt);
CWnd* pDropWnd = WindowFromPoint (pt);
if(pDropWnd == NULL)
return;
if (pDropWnd != m_pDropWnd)
{
if (m_nDropIndex != -1)
{
TRACE("m_nDropIndex is -1\n");
CListCtrl* pList = (CListCtrl*)m_pDropWnd;
if(pList == NULL)
return;
pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED);
pList->RedrawItems (m_nDropIndex, m_nDropIndex);
pList->UpdateWindow ();
m_nDropIndex = -1;
}
else
{
TRACE("m_nDropIndex is not -1\n");
CListCtrl* pList = (CListCtrl*)m_pDropWnd;
if(pList == NULL)
return;
int i = 0;
int nCount = pList->GetItemCount();
for(i = 0; i < nCount; i++)
{
pList->SetItemState(i, 0, LVIS_DROPHILITED);
}
pList->RedrawItems(0, nCount);
pList->UpdateWindow();
}
}
m_pDropWnd = pDropWnd;
pDropWnd->ScreenToClient(&pt);
CRect rcList;
m_listCtrl.GetWindowRect(&rcList);
CPoint pntScreen(point);
ClientToScreen(&pntScreen);
if(rcList.PtInRect(pntScreen))
{
m_bLock = TRUE;
SetCursor(LoadCursor(NULL, IDC_ARROW));
UINT uFlags;
CListCtrl* pList = (CListCtrl*)pDropWnd;
if(pList == NULL)
return;
pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED);
pList->RedrawItems (m_nDropIndex, m_nDropIndex);
m_nDropIndex = ((CListCtrl*)pDropWnd)->HitTest(pt, &uFlags);
if(pList->RedrawItems(m_nDropIndex, m_nDropIndex))//;
pList->UpdateWindow();
m_bLock = FALSE;
m_pDragImage->DragShowNolock(true);
}
else
{
SetCursor(LoadCursor(NULL, IDC_NO));
}
}
else
{
if(m_treeCtrl.m_bCellIsDragging)
{
HICON hIcon;
CPoint pntScreen(point);
ClientToScreen(&pntScreen);
CRect rcTree;
m_treeCtrl.GetWindowRect(rcTree);
CWinApp* pApp = AfxGetApp();
{
CTemporaryResourceOverride vTemp;
if( rcTree.PtInRect( pntScreen ) == TRUE )
{ // 鼠标落在TREE中换光标
hIcon = pApp->LoadCursor(IDC_CUR_MULTMOVE);
SetCursor(hIcon);
}
else
{
HICON hIcon = ::LoadCursor( NULL,IDC_NO );
SetCursor(hIcon);
}
}
CPoint ptTree( point );
MapWindowPoints( &m_treeCtrl, &ptTree, 1);
UINT uHitTest = TVHT_ONITEM;
m_treeCtrl.m_dragTarget = m_treeCtrl.HitTest(ptTree, &uHitTest);
if(m_treeCtrl.m_dragTarget != NULL)
m_treeCtrl.SelectDropTarget(m_treeCtrl.m_dragTarget);
}
}
CAcUiDialog::OnMouseMove(nFlags, point);
}
void CTKWorkspace::OnLButtonUp(UINT nFlags, CPoint point)
{
//modify by xlc on 070828
if (m_bDragging)
{
ReleaseCapture ();
m_pDragImage->DragLeave (GetDesktopWindow ()); //结束拖拽
m_pDragImage->EndDrag ();
delete m_pDragImage;
CPoint pt (point); //当前鼠标坐标
ClientToScreen (&pt);
CWnd* pDropWnd = WindowFromPoint (pt);
if (pDropWnd->IsKindOf (RUNTIME_CLASS (CListCtrl)))
{
m_pDropList = (CListCtrl*)pDropWnd;
DropItemOnList(m_pDragList, m_pDropList);
}
m_bDragging = FALSE;
}
else
{
if(point.x == -1 && point.y == -1)
{
m_bLock = TRUE;
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
while (pos)
{
int nItem = m_listCtrl.GetNextSelectedItem(pos);
TRACE("Item %d was selected!\n", nItem);
m_listCtrl.SetItemState(nItem, 0, LVIS_SELECTED);
}
int len = m_ImageBox.m_lstSelected.Length();
for(int i=0;i<len;i++)
{
int sel = *m_ImageBox.m_lstSelected[i];
m_listCtrl.SetItemState(sel, LVIS_SELECTED, LVIS_SELECTED);
}
m_listCtrl.EnsureVisible(m_ImageBox.m_nIndex, TRUE);
m_listCtrl.SetFocus();
ResetStateText();
m_bLock = FALSE;
}
if(m_treeCtrl.m_bCellIsDragging)
{
ReleaseCapture();
XStringList lstSelBlk;
for(int i=0;i<m_ImageBox.m_lstSelected.Length();i++)
{
int sel = *m_ImageBox.m_lstSelected[i];
lstSelBlk.Append(tstrnew(m_ImageBox.m_lstBlk[sel]->csDrawing));
}
m_treeCtrl.m_bCellIsDragging = FALSE;
m_treeCtrl.SelectDropTarget(NULL);
if(m_treeCtrl.DoDragBlk(lstSelBlk))
{
if(m_treeCtrl.m_bCopyAndDel)
{
m_treeCtrl.m_bCopyAndDel = FALSE;
m_ImageBox.m_lstSelected.Reset();
}
ResetImage(TRUE);
}
m_treeCtrl.m_dragTarget = NULL;
}
}
CAcUiDialog::OnLButtonUp(nFlags, point);
}
void CTKWorkspace::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if(point.x == -1 && point.y == -1 && (!m_bLock))
{
if(GetCapture()==this)
{
ReleaseCapture();
m_treeCtrl.SelectDropTarget(NULL);
}
OnOK();
}
else
{
CAcUiDialog::OnLButtonDblClk(nFlags, point);
}
}
void CTKWorkspace::OnSelchangedTkTree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
BOOL bFlag = TRUE;
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
if(!m_treeCtrl.m_bMerge)
{
CString csCurTKName, csCurType;
m_treeCtrl.GetNodeAllPath(m_treeCtrl.GetSelectedItem(), csCurTKName, csCurType);
m_treeCtrl.m_csCurKind = csCurType;
if(csCurTKName != _T("") && csCurType == _T(""))
{
bFlag = FALSE;
SetDlgItemText(IDC_S_DESCRIPTION, XString(_T("当前图库文件:%s"), (const TCHAR*)csCurTKName));
}
else if(csCurTKName == _T(""))
{
bFlag = FALSE;
SetDlgItemText(IDC_S_DESCRIPTION, XString(_T("当前图库组文件:%s"), (const TCHAR*)m_csCurTKWFile));
}
}
ResetImage();
if(bFlag)
ResetStateText();
*pResult = 0;
}
void CTKWorkspace::OnBeginlabeleditTkList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
m_bLock = TRUE;
*pResult = 0;
}
void CTKWorkspace::OnEndlabeleditTkList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
int sel = pDispInfo->item.iItem;
if((pDispInfo->item.pszText != NULL)&&(sel != -1))
{
CString csTKName = m_ImageBox.m_lstBlk[sel]->csTKFile;
CString sKind, sItem, sText; //类别,名称
CodeBase db;
XDbfTable *pTable = db.Open(csTKName);
if(!pTable)
{
MessageBox(XString(_T("%s文件只读或损坏"), (const TCHAR *)csTKName));
m_bLock = FALSE;
return;
}
sText = m_ImageBox.m_lstBlk[sel]->csDrawing;
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext())
{
GET_FIELD(pTable, _T("kind"), sKind);
GET_FIELD(pTable, _T("drawing"), sItem);
if(sItem == sText)
{
SET_FIELD(pTable, _T("item"), pDispInfo->item.pszText);
m_ImageBox.m_lstBlk[sel]->csItem = pDispInfo->item.pszText;
//ResetListData();
break;
}
}
}
m_bLock = FALSE;
*pResult = 1;
}
void CTKWorkspace::ResetImage(BOOL bReservePage)
{
/*
if(m_bDragging)
{
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
m_ImageBox.m_lstSelected.Reset();
while (pos)
{
int nItem = m_listCtrl.GetNextSelectedItem(pos);
m_ImageBox.m_lstSelected.Append(new int(nItem));
}
}*/
int iPage = m_ImageBox.CurPage();
DList<int> lstSelected; //选中的项
for(int m=0;m<m_ImageBox.m_lstSelected.Length();m++)
{
int nItem = *m_ImageBox.m_lstSelected[m];
lstSelected.Append(new int(nItem/**m_ImageBox.m_lstSelected[m]*/));
}
CString csCurTKName, csCurType;
HTREEITEM htree = NULL;
htree = m_treeCtrl.GetSelectedItem();
if(htree)
{
if(m_treeCtrl.m_bMerge)
{
m_treeCtrl.GetNodeAllPath(htree, csCurType);
m_ImageBox.SetTKWInfo(m_csCurTKWFile, csCurType);
}
else
{
m_treeCtrl.GetNodeAllPath(htree, csCurTKName, csCurType);
m_ImageBox.SetTKInfo(csCurTKName, csCurType);
}
}
if(bReservePage)
{
for(int n=0;n<lstSelected.Length();n++)
{
m_ImageBox.m_lstSelected.Append(new int(*lstSelected[n]));
}
}
if((iPage+1) > m_ImageBox.TotalPages())
iPage--;
if(bReservePage && iPage != m_ImageBox.CurPage() && iPage > -1)
m_ImageBox.GoPage(iPage);
else
m_ImageBox.SetupImage(TRUE);
InitVSBar();
ResetListData();
}
void CTKWorkspace::ResetStateText()
{
CString csMsg, csRecord;
int len = m_ImageBox.m_lstSelected.Length();
if(len < 1)
csRecord = _T("无选中图块!");
for(int i=0;i<len;i++)
{
int sel = *m_ImageBox.m_lstSelected[i];
csRecord += m_ImageBox.m_lstBlk[sel]->csDrawing;
csRecord += _T(" ");
}
csMsg.Format(_T("当前选中记录号:%s 页号:%d/%d 总记录: %d"), (const TCHAR *)csRecord,
m_ImageBox.CurPage() + 1, m_ImageBox.TotalPages(), m_ImageBox.GetTotalRecords());
SetDlgItemText(IDC_S_DESCRIPTION, csMsg);
}
BOOL CTKWorkspace::IsLock()
{
if(m_bLock || m_treeCtrl.m_bLock || m_treeCtrl.m_bMerge)
return TRUE;
else
return FALSE;
}
//选最近库
BOOL CTKWorkspace::OnSelectRecentBlb(UINT nID)
{
if(m_bLock || m_treeCtrl.m_bLock)
return FALSE;
int nLen = m_lstBlbNames.Length();
int nIndex = nID - OpenMenuID;
if(nIndex >= nLen)
return FALSE;
ASSERT(nIndex < nLen && nIndex>=0);
XString szName = m_lstBlbNames[nIndex];
if(!FindFile(szName))
{
return FALSE;
}
m_csCurTKWFile = szName;
m_treeCtrl.SetDataSource(m_csCurTKWFile);
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
m_treeCtrl.SelectItem(m_treeCtrl.GetRootItem());
SetDlgItemText(IDC_S_DESCRIPTION, _T("打开tkw图库组文件"));
SaveStatus();
LoadStatus();
return TRUE;
}
//**********************************TOOLBAR 命令***********************************************
// 弹出布局菜单
void CTKWorkspace::OnToolbarDropDown(NMHDR * pnmtb0, LRESULT *plr)
{
NMTOOLBAR* pnmtb= (NMTOOLBAR *)pnmtb0;
CRect rc;
m_ToolBar.SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc);
m_ToolBar.ClientToScreen(&rc);
int i, nLenArray;
UINT MenuID;
XStringList lstTkwItem;
CTemporaryResourceOverride vTemp;//加载菜单
switch (pnmtb->iItem)
{
case ID_BLK_LAYOUT:
OnBlkLayout();
break;
case ID_BLK_OPENLIB:
if(m_pOpenMenu)
{
m_pOpenMenu->DestroyMenu();
m_pOpenMenu->CreatePopupMenu();
}
else
{
m_pOpenMenu = new CMenu;
m_pOpenMenu->CreatePopupMenu();
}
for(i=0; i< m_lstBlbNames.Length(); i++) // 将最近使用过的库加入菜单
m_pOpenMenu->AppendMenu(MF_STRING, OpenMenuID + i, m_lstBlbNames[i]);
m_pOpenMenu->AppendMenu(MF_SEPARATOR);
MenuID = OpenMenuID + m_lstBlbNames.Length();
GetTchtkwAllItem(lstTkwItem);
nLenArray = lstTkwItem.Length();
for(i=0;i<nLenArray;i++)
{
CString csTkwItem = (const TCHAR*)lstTkwItem[i];
if(csTkwItem == _T("#"))
m_pOpenMenu->AppendMenu(MF_SEPARATOR);
else
m_pOpenMenu->AppendMenu(MF_STRING, MenuID + i, csTkwItem);
}
m_pOpenMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
rc.left, rc.bottom, this, &rc);
break;
case ID_BLK_SORT:
OnBlkSort();
break;
default:
return;
}
}
//还原tk
void CTKWorkspace::OnBlkRevert()
{
m_treeCtrl.m_bMerge = FALSE;
//add by xlc on 080829
m_menu.CheckMenuItem(ID_BLK_MERGE,MF_UNCHECKED);
m_menu.CheckMenuItem(ID_BLK_REVERT,MF_CHECKED);
m_menu.EnableMenuItem(ID_TK_POPUP_INSERTTK,IsLock()?MF_GRAYED:MF_ENABLED);
m_menu.EnableMenuItem(ID_TK_POPUP_REMOVETK,IsLock()?MF_GRAYED:MF_ENABLED);
m_menu.EnableMenuItem(ID_TK_POPUP_RENAMEKIND,IsLock()?MF_GRAYED:MF_ENABLED);
m_treeCtrl.SetupTreeData();
HTREEITEM hRoot = m_treeCtrl.GetRootItem();
m_treeCtrl.Expand(hRoot, TVE_EXPAND);
ResetImage();
SetDlgItemText(IDC_S_DESCRIPTION, _T("还原TK显示"));
}
//合并tk
void CTKWorkspace::OnBlkMerge()
{
m_treeCtrl.m_bMerge = TRUE;
//add by xlc on 080829
m_menu.CheckMenuItem(ID_BLK_MERGE,MF_CHECKED);
m_menu.CheckMenuItem(ID_BLK_REVERT,MF_UNCHECKED);
m_menu.EnableMenuItem(ID_TK_POPUP_INSERTTK,IsLock()?MF_GRAYED:MF_ENABLED);
m_menu.EnableMenuItem(ID_TK_POPUP_REMOVETK,IsLock()?MF_GRAYED:MF_ENABLED);
m_menu.EnableMenuItem(ID_TK_POPUP_RENAMEKIND,IsLock()?MF_GRAYED:MF_ENABLED);
m_treeCtrl.SetupTreeData();
HTREEITEM hRoot = m_treeCtrl.GetRootItem();
m_treeCtrl.Expand(hRoot, TVE_EXPAND);
ResetImage();
SetDlgItemText(IDC_S_DESCRIPTION, _T("合并TK显示"));
}
//图块改名
void CTKWorkspace::OnBlkRename()
{
m_listCtrl.SetFocus();
if(m_ImageBox.m_lstSelected.Length() < 1)
{
AfxMessageBox(_T("请选择一图块!"));
return;
}
ASSERT(m_ImageBox.m_nIndex>=0);
//modify by xlc on 070917
// m_bEditLabel = TRUE;
// m_listCtrl.EditLabel(m_ImageBox.m_nIndex);
if(m_ImageBox.m_lstSelected.Length() == 1)
{
m_bEditLabel = TRUE;
m_listCtrl.EditLabel(m_ImageBox.m_nIndex);
}
else
{
CTemporaryResourceOverride res;
CRenameDlg dlg;
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
int index = m_listCtrl.GetNextSelectedItem(pos);
CString name = m_ImageBox.m_lstBlk[index]->csItem;
dlg.m_strName = name;
if(dlg.DoModal() != IDOK)
return;
BOOL bCheck = dlg.m_bCheck; //是否有序号
name = dlg.m_strName; //名称
int nNum = dlg.m_nNum; //起始编号
int count = m_listCtrl.GetSelectedCount(); //修改项个数
CString csTKName = m_ImageBox.m_lstBlk[index]->csTKFile;
CString sKind, sDrawing, sText; //类别,名称
CodeBase db;
XDbfTable *pTable = db.Open(csTKName);
if(!pTable)
{
MessageBox(XString(_T("%s文件只读或损坏"), (const TCHAR *)csTKName));
return;
}
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext())
{
if(count >= 1)
{
GET_FIELD(pTable, _T("drawing"), sDrawing);
int i=0;
pos = m_listCtrl.GetFirstSelectedItemPosition();
while(pos)
{
int sel = m_listCtrl.GetNextSelectedItem(pos);
sText = m_ImageBox.m_lstBlk[sel]->csDrawing;
if(sDrawing == sText)
{
CString strName = name;
if(bCheck)
{
strName.Format( _T("%s%d"),name,(nNum+i));
}
SET_FIELD(pTable, _T("item"), (const TCHAR *)strName);
m_ImageBox.m_lstBlk[sel]->csItem = strName;
m_listCtrl.SetItemText(sel,0,strName);
count --;
if(count == 0)
return;
break;
}
i++;
}
}
else
{
break;
}
}
}
}
//排序
void CTKWorkspace::OnBlkSort()
{
//modify by xlc on 070919
/* m_ImageBox.m_bSort = !m_ImageBox.m_bSort;
m_ImageBox.SetSort();
InitVSBar();
ResetListData();
if(m_ImageBox.m_bSort)
SetDlgItemText(IDC_S_DESCRIPTION, _T("按排序图块名次序显示"));
else
SetDlgItemText(IDC_S_DESCRIPTION, _T("按图块入库次序显示"));
*/
CWnd *pWnd = &m_ToolBar;
CMenu menu;
CMenu* pPopup;
CRect rc;
pWnd->SendMessage(TB_GETRECT, ID_BLK_SORT, (LPARAM)&rc);
pWnd->ClientToScreen(&rc);
{
CTemporaryResourceOverride vTemp;//加载菜单
menu.LoadMenu(IDR_MENU_SORT);
}
if(m_ImageBox.m_bSort)
{
menu.CheckMenuItem(ID_MENU_SSORT,MF_CHECKED);
}
else
{
menu.CheckMenuItem(ID_MENU_SSORT,MF_UNCHECKED);
}
pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
rc.left, rc.bottom, this, &rc);
}
//删除所有选中图块
void CTKWorkspace::OnBlkDel()
{
int len = m_ImageBox.m_lstSelected.Length();
if(len < 1)
{
AfxMessageBox(_T("请选择一图块!"));
return;
}
if(MessageBox(_T("您是否真的确定要删除此图块(无法恢复)?"),_T("警告"),MB_OKCANCEL|MB_ICONQUESTION) != IDOK)
return;
for(int i=0;i<len;i++)
{
int sel = *m_ImageBox.m_lstSelected[i];
TKStruct &cur = *(m_ImageBox.m_lstBlk[sel]);
/*
DbfAccess db(cur.csTKFile, FLAG_DELETE, 1, 0);
db.keyFieldName[0] = strdup("drawing");
db.keyinfo[0]=strdup(_AS(cur.csDrawing));
if(DBFFUN(db))
return;
*/
NewDbfTool::DeleteRecordByTKStruct(cur.csTKFile, _T("drawing"), cur.csDrawing);
XString xsDwb(256), xsDwb2d(256), xsSlb(256), xsJpb(256);
if(m_treeCtrl.m_bIsJpgShow)
{
xsDwb << GetPathNameByAllName(cur.csTKFile) << GetFileNameByAllName(cur.csTKFile) << _T("_3d.DWB");
xsDwb2d << GetPathNameByAllName(cur.csTKFile) << GetFileNameByAllName(cur.csTKFile) << _T("_2d.DWB");
XDrawingLib dwb2d(xsDwb2d);
if(!(!dwb2d))
dwb2d.Remove(cur.csDrawing);
}
else
xsDwb << GetPathNameByAllName(cur.csTKFile) << GetFileNameByAllName(cur.csTKFile) << _T(".DWB");
xsSlb << GetPathNameByAllName(cur.csTKFile) << GetFileNameByAllName(cur.csTKFile) << _T(".SLB");
xsJpb << GetPathNameByAllName(cur.csTKFile) << GetFileNameByAllName(cur.csTKFile) << _T(".JPB");
XDrawingLib dwb(xsDwb);
if(!(!dwb))
{
dwb.Remove(cur.csDrawing);
}
if(m_treeCtrl.m_bIsJpgShow)
{
XJpegLib jpb(xsJpb);
if(!(!jpb)) jpb.Remove(cur.csDrawing);
}
else
{
XSlideLib slb(xsSlb);
if(!(!slb)) slb.Remove(cur.csDrawing);
}
}
m_ImageBox.m_lstSelected.Reset();
ResetImage(TRUE);
if (m_ImageBox.TotalPages() <= 0)
return;
m_ImageBox.m_lstSelected.Append(new int(0));
m_ImageBox.SelectIndex(0);
len = m_ImageBox.m_lstSelected.Length();
for(i=0;i<len;i++)
{
int sel = *m_ImageBox.m_lstSelected[i];
m_listCtrl.SetItemState(sel, LVIS_SELECTED, LVIS_SELECTED);
}
SetDlgItemText(IDC_S_DESCRIPTION, _T("删除所有选中图块"));
}
//删除当前类别及图块
void CTKWorkspace::OnBlkDelkind()
{
if(IsLock()) return;
if(m_treeCtrl.DelCurKind())
{
ResetImage();
SetDlgItemText(IDC_S_DESCRIPTION, _T("删除选中类别下所有图块"));
}
}
// 弹出布局菜单
void CTKWorkspace::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);
}
// 新建tkw图库组文件
void CTKWorkspace::OnBlkNewlib()
{
if(m_bLock || m_treeCtrl.m_bLock) return;
if(g_nArchType==4)
{
AfxMessageBox(_T("学习版不支持,欢迎购买正版!"));
return;
}
CTemporaryResourceOverride vTemp;
CNewTKWDlg dlg(_T("新建"), _T("上华图库组文件 (*.TKW) |*.tkw||"));
if(dlg.DoModal()!=IDOK)
return;
TCHAR szShortPath[256]=_T("");
_tcscpy(szShortPath, dlg.GetPathName());
if(FindFile(szShortPath))
{
AfxMessageBox(_T("已存在此文件!请换一文件。"));
return;
}
m_csCurTKWFile = szShortPath;
CTkwFile tkw;
tkw.m_csVersion = _T("1.0");
tkw.m_bIsJpg = !dlg.m_iTKType;
tkw.m_csDescription = _T("");
tkw.WriteFile(m_csCurTKWFile);
m_ToolBar.CheckButton(ID_BLK_REVERT, 1);
m_treeCtrl.m_bMerge = FALSE;
m_treeCtrl.SetDataSource(m_csCurTKWFile);
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
m_treeCtrl.SelectItem(m_treeCtrl.GetRootItem());
SaveStatus();
LoadStatus();
//add by xlc on 090728 更新图库动态菜单
if(m_nOpenMode==0)
{
AddDynMenu(FALSE);
}
SetDlgItemText(IDC_S_DESCRIPTION, _T("新建tkw图库组文件"));
}
// 打开tkw图库组文件
void CTKWorkspace::OnBlkOpenlib()
{
if(m_bLock || m_treeCtrl.m_bLock) return;
CTemporaryResourceOverride vTemp;
CNewTKWDlg dlg(_T("打开"), _T("上华图库组文件 (*.TKW) |*.TKW|上华图库文件 (*.TK) |*.tk||"));
if(dlg.DoModal()!=IDOK)
return;
if(!FindFile(dlg.GetPathName()))
{
AfxMessageBox(_T("不存在此文件!请换一文件。"));
return;
}
CString csTKWname = dlg.GetPathName();
if(dlg.GetFileExt() == _T("tk") || dlg.GetFileExt() == _T("TK"))
{
csTKWname = dlg.GetPathName() + _T("w");
if(dlg.GetFileExt() == _T("TK"))
csTKWname = dlg.GetPathName() + _T("W");
if(!FindFile(csTKWname))
{
CTkwFile tkw;
tkw.m_csVersion = _T("1.0");
if(dlg.m_iTKType == 1)
tkw.m_bIsJpg = FALSE; // 普通图库
else
tkw.m_bIsJpg = TRUE; // 多视图图库
tkw.m_csDescription = _T("");
XStringList lstTK;
lstTK.Append(tstrnew(dlg.GetFileName()));
tkw.SetTKList(lstTK);
tkw.WriteFile(csTKWname);
}
}
m_ToolBar.CheckButton(ID_BLK_REVERT, 1);
m_treeCtrl.m_bMerge = FALSE;
m_csCurTKWFile = csTKWname;
m_treeCtrl.SetDataSource(csTKWname);
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
m_treeCtrl.SelectItem(m_treeCtrl.GetRootItem());
SetDlgItemText(IDC_S_DESCRIPTION, _T("打开tkw图库组文件"));
SaveStatus();
LoadStatus();
//add by xlc on 090728 更新图库动态菜单
if(m_nOpenMode==0)
{
AddDynMenu(FALSE);
}
}
void CTKWorkspace::OnBlkAbout()
{
return;
CTemporaryResourceOverride vTmp;
CTKAboutDlg dlg;
dlg.m_csDes = m_treeCtrl.m_csDescrption;
dlg.DoModal();
}
// 下一页
void CTKWorkspace::OnBlkPagedown()
{
m_ImageBox.GoPage(m_ImageBox.CurPage() + 1);
UINT nEndPos = m_vsBar.GetScrollPos();
nEndPos += m_nPageRow;
m_vsBar.SetScrollPos(nEndPos);
ResetStateText();
}
// 上一页
void CTKWorkspace::OnBlkPageup()
{
m_ImageBox.GoPage(m_ImageBox.CurPage() - 1);
UINT nEndPos = m_vsBar.GetScrollPos();
nEndPos -= m_nPageRow;
m_vsBar.SetScrollPos(nEndPos);
ResetStateText();
}
// 批量入库
void CTKWorkspace::OnBlkUpgrade()
{
if(g_nArchType==4)
{
AfxMessageBox(_T("学习版不支持,欢迎购买正版!"));
return;
}
if(m_ImageBox.m_bIsJpgShow)
return;
HTREEITEM htree = m_treeCtrl.GetSelectedItem();
CString csCurTKName, csCurType;
m_treeCtrl.GetNodeAllPath(htree, csCurTKName, csCurType);
if(csCurTKName == _T(""))
{
AfxMessageBox(_T("您还没有选择图库tk文件,无法入库!"));
return;
}
if(IsLock()) return;
SetDlgItemText(IDC_S_DESCRIPTION, _T("批量入库"));
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[20000] = _T(""); //申请自己的16K缓冲区
int maxChar = 19999;
TCHAR szDlgTitle[] = _T("选择需入库的DWG文件");
dlg.m_ofn.lpstrFile = strFileName;
dlg.m_ofn.nMaxFile = maxChar;
dlg.m_ofn.lpstrTitle = szDlgTitle;
dlg.m_ofn.lpstrInitialDir = g_szDirName;
if(dlg.DoModal() !=IDOK )
return;
_tcscpy(g_szDirName, dlg.GetPathName());
HideDialog(TRUE);
CProgressWnd wndProgress(acedGetAcadFrame(), _T("Progress"), TRUE);
CRect rect;
wndProgress.GetWindowRect(&rect);
wndProgress.MoveWindow(0,0,rect.Width(),rect.Height());
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)
{
//add by xlc on 080812 解决对局部隐藏对象的影响
PickSet ssHide(SS_FREE);
GetPickSetByGroup(_T("_TCH_HIDE_GROUP"), ssHide);
ss -= ssHide;
MakeVisible(ss, false);
}
CodeBase db;
CString csIndex;
XDbfTable *pTable = db.Open(csCurTKName);
if(!pTable)
{
AfxMessageBox(_T("TK文件只读或损坏!"));
MakeVisible(ss, true);
return;
}
XString xsDwbPath(256), xsSlbPath(256);
XString sDrive1, sDir1(256), sFname1,sKind, sExt1, sSldName;
_tsplitpath(csCurTKName, sDrive1, sDir1, sFname1, sExt1); //分割!
xsDwbPath << sDrive1 << sDir1 << sFname1 << _T(".DWB");
xsSlbPath << sDrive1 << sDir1 << sFname1 << _T(".SLB");
while(pos!=NULL)
{
XFilePathName xfpn = (LPCTSTR)dlg.GetNextPathName(pos);
csIndex = xfpn.getFileName();
XString xsRet;
if(GetNextDrawing(csCurTKName, xsRet)!=RTNORM)
{
MakeVisible(ss, true);
return;
}
pTable->AppendBegin();
SET_FIELD(pTable, _T("kind"), (const TCHAR *)csCurType);
SET_FIELD(pTable, _T("item"), (const TCHAR *)csIndex);
SET_FIELD(pTable, _T("drawing"), (const TCHAR *)xsRet);
pTable->AppendEnd();
// Add DWB
XDrawingLib dwb(xsDwbPath);
dwb.Append(xfpn, xsRet);
CString csSldName = xfpn.getDriver()+xfpn.getDir()+xfpn.getFileName()+_T(".SLD");//源路径
if(!FindFile(csSldName))
{
XPushVar<int> osmode(_T("OSMODE"), 0);
XPushVar<int> attreq(_T("ATTREQ"), 0);
SHads_command(RTSTR, _T(".INSERT"), RTSTR, (const TCHAR *)xfpn, RTSTR, _T("0,0,0"),
RTREAL, 1.0, RTREAL, 1.0, RTREAL, 0.0, RTNONE);
Entity ent;
ent.GetLast();
SHads_command(RTSTR, _T(".ZOOM"),RTSTR, _T("extent"), RTNONE);
if(AyrDlg.m_bNeedHide)
SHads_command(RTSTR, _T("HIDE"), RTNONE);
XString xsTempSld=GetTempFileName(_T(".SLD"));
SHads_command(RTSTR, _T(".MSLIDE"), RTSTR, (const TCHAR *)xsTempSld, RTNONE);
XSlideLib slb(xsSlbPath);
slb.Append(xsTempSld, xsRet);
ent.Delete();
_tremove(xsTempSld);
}
else
{
XSlideLib slb(xsSlbPath);
slb.Append(csSldName, xsRet);
}
wndProgress.StepIt();
wndProgress.PeekAndPump();
if (wndProgress.Cancelled()) break;
if(ads_usrbrk() == 1) break; //用户中断
}
MakeVisible(ss, true);
HideDialog(FALSE);
ResetImage();
SetDlgItemText(IDC_S_DESCRIPTION, _T("批量入库完毕!"));
}
//add by cwk on 060912
//extern BOOL IsDigital(const TCHAR *pStr);
extern XString Int2Char8(unsigned i);
//最大支持999999
int GetNextDrawing(const TCHAR *tkName, TCHAR *dwg)
{
CodeBase db;
XDbfTable *pTable = db.Open(tkName);
if(!pTable)
{
AfxMessageBox(_T("TK文件只读或损坏!"));
return RTERROR;
}
Array<CString> recs;
CString str;
CString sTemp;
for (pTable->MoveFirst(0);!pTable->IsEOF();pTable->MoveNext(0))
{
GET_FIELD(pTable,_T("Drawing"),sTemp);
str = sTemp;
if (IsDigital(str)&&_tcslen(str)==8)
recs.AddTail(LPCTSTR(str));
}
if (recs.GetLength() >= 1)
{
CString maxStr = recs[0];
int i = 1;
while (i < recs.GetLength())
{
if (maxStr<recs[i])
maxStr = recs[i];
i++;
}
if(maxStr && IsDigital(maxStr))
{
int slen=(int)_tcslen(maxStr);
TCHAR a1=maxStr[slen-1], a2=maxStr[slen-2], a3=maxStr[slen-3],a4 = maxStr[slen-4],a5 = maxStr[slen-5],a6 = maxStr[slen-6];
if(a1>=_T('0') && a1<_T('9')) a1++;
else if(a1==_T('9') && a2>=_T('0') && a2<_T('9'))
{ a1=_T('0'); a2++; }
else if(a1==_T('9') && a2==_T('9') && a3>=_T('0') && a3<_T('9'))
{ a1=a2=_T('0'); a3++; }
else if(a1==_T('9') && a2==_T('9') && a3==_T('9') && a4>=_T('0') &&a4<_T('9'))
{ a1=a2=a3=_T('0'); a4++; }
else if(a1==_T('9') && a2==_T('9') && a3==_T('9') && a4==_T('9') && a5>=_T('0')&&a5<_T('9'))
{ a1=a2=a3=a4=_T('0'); a5++; }
else if(a1==_T('9') && a2==_T('9') && a3==_T('9') && a4==_T('9') && a5==_T('9')&&a6>=_T('0')&&a6<_T('9'))
{a1=a2=a3=a4=a5=_T('0'); a6++; }
maxStr.Delete(slen-6,6);
maxStr = maxStr + a6;
maxStr = maxStr + a5;
maxStr = maxStr + a4;
maxStr = maxStr + a3;
maxStr = maxStr + a2;
maxStr = maxStr + a1;
_tcscpy(dwg, maxStr);
}
}
else
{
_tcscpy(dwg, _T("00000001"));
return RTNORM;
}
return RTNORM;
}
// 新图入库
void CTKWorkspace::OnBlkNewdwg()
{
if(g_nArchType==4)
{
AfxMessageBox(_T("学习版不支持,欢迎购买正版!"));
return;
}
if(IsLock()) return;
HTREEITEM htree = m_treeCtrl.GetSelectedItem();
CString csCurTKName, csCurType;
m_treeCtrl.GetNodeAllPath(htree, csCurTKName, csCurType);
if(csCurTKName == _T(""))
{
AfxMessageBox(_T("您还没有选择图库tk文件,无法入库!"));
return;
}
TCHAR xsRet[256];
if(GetNextDrawing(csCurTKName, xsRet)!=RTNORM)
return;
HideDialog(TRUE);
if(AddImage2Dwb(csCurTKName, CString((const TCHAR*)xsRet)) == RTNORM)
{
CodeBase db;
XDbfTable *pTable = db.Open(csCurTKName);
if(!pTable)
{
AfxMessageBox(_T("TK文件只读或损坏!"));
return;
}
pTable->AppendBegin();
SET_FIELD(pTable, _T("kind"), (const TCHAR*)csCurType);
// modify bt xlc on 080818 新入库的图块名为XX*YY格式
double width(0),high(0);
XString xsBlockName(256);
xsBlockName << GetPathNameByAllName(csCurTKName) << GetFileNameByAllName(csCurTKName) << _T("(")<<xsRet<<_T(")");
if(GetBlockSize(xsBlockName, width, high))
{
SET_FIELD(pTable, _T("Item"), XString(_T("%dX%d"),(int)width,(int)high));
}
else
{
SET_FIELD(pTable, _T("Item"), _T("新图块"));
}
SET_FIELD(pTable, _T("Drawing"), xsRet);
pTable->AppendEnd();
}
HideDialog(FALSE);
ResetImage();
int num = m_ImageBox.GetTotalRecords();
if(num>0)
{
m_ImageBox.m_lstSelected.Append(new int(num - 1));
m_ImageBox.SelectIndex(num);
}
int len = m_ImageBox.m_lstSelected.Length();
for(int i = 0;i<len;i++)
{
int sel = *m_ImageBox.m_lstSelected[i];
m_listCtrl.SetItemState(sel, LVIS_SELECTED, LVIS_SELECTED);
}
SetDlgItemText(IDC_S_DESCRIPTION, _T("新图入库完毕!"));
}
// add by xlc on 080818
// 获得块尺寸
BOOL CTKWorkspace::GetBlockSize(XString sBlockName, double &width, double &high)
{
if(sBlockName==_T(""))
return FALSE;
AcDbObjectId BlockId;
XString sBlock(256);
if (LoadDwbBlock(sBlockName, sBlock)!=RTNORM)
return FALSE;
BlockId = InitBlock(sBlock,NULL);
AcDbExtents ext;
AcDbBlockReference blockRef;
blockRef.setBlockTableRecord(BlockId);
blockRef.geomExtentsBestFit(ext);
AcGePoint3d maxPt, minPt;
maxPt = ext.maxPoint();
minPt = ext.minPoint();
width = maxPt.x - minPt.x;
high = maxPt.y - minPt.y;
return TRUE;
}
int CTKWorkspace::RebuildJpg(const TCHAR* szTKName)
{
CString csTKName = szTKName;
XString xsDrawing = m_ImageBox.m_lstBlk[*m_ImageBox.m_lstSelected[0]]->csDrawing;
const TCHAR *szPrompt=_T("\n制作三维照片(请用zoom调整合适)或 [不制作返回(X)]<制作>:");
XString sKeyword;
int nRet = 0;
INITGET_BEG(0, _T("X"));
nRet = ads_getkword(szPrompt, sKeyword);
INITGET_END();
if(nRet != RTNONE)
return RTERROR;
int cvport = 0;
xg_getvar(_T("CVPORT"), &cvport);
SHads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("OFF"),RTNONE);
CRect rectVP = GetVPRect(cvport);
CBitmap bitmap;
GetRectBmpFromBmp(acedGetAcadDwgView(), rectVP, bitmap);
HBITMAP hBitmap = (HBITMAP) bitmap.GetSafeHandle();
TCHAR tempPrefix[256], bmpPrefix[256], jpgPrefix[256];
GetTempPath(255, tempPrefix);
if(tempPrefix[_tcslen(tempPrefix)-1]!=_T('\\'))
_tcscat(tempPrefix, _T("\\"));
_tcscat(tempPrefix, xsDrawing);
_tcscpy(bmpPrefix, tempPrefix);
_tcscpy(jpgPrefix, tempPrefix);
_tcscat(bmpPrefix, _T(".bmp"));
_tcscat(jpgPrefix, _T(".jpg"));
SaveBitmapToFile(hBitmap, bmpPrefix);
SHads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("ON"),RTNONE);
FILE *fpIn = _tfopen(bmpPrefix, _T("rb"));
if(!fpIn)
{
return RTERROR;
}
FILE *fpOut = _tfopen(jpgPrefix, _T("wb"));
if(!fpOut)
{
fclose(fpIn);
return RTERROR;
}
// WriteJpeg(fpIn, fpOut);
CTangentImage::WriteJpeg(bmpPrefix, jpgPrefix, 1);
fclose(fpIn);
fclose(fpOut);
_tremove(bmpPrefix);
XString xsJpgLib(256);
xsJpgLib << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".JPB");
XJpegLib JpbMan(xsJpgLib);
JpbMan.Append(jpgPrefix);
_tremove(jpgPrefix);
return RTNONE;
}
int CTKWorkspace::RebuildSld(const TCHAR* szTKName)
{
CString csTKName = szTKName;
XString xsDrawing = m_ImageBox.m_lstBlk[*m_ImageBox.m_lstSelected[0]]->csDrawing;
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);
{
XString xsDwbPath;
TCHAR *szDrawing = xsDrawing;
xsFullSld << dwgPrefix << xsDrawing << _T(".sld");
xsFullDwg << dwgPrefix << xsDrawing << _T(".dwg");
while(1)
{
const TCHAR *szPrompt=_T("\n制作幻灯片(请用zoom调整合适)或 [消隐(H)]<制作>:");
XString sKeyword;
int nRet = 0;
INITGET_BEG(0, _T("H"));
nRet = ads_getkword(szPrompt, sKeyword);
INITGET_END();
if(nRet == RTNONE)
break;
if(sKeyword[0]==_T('H'))
{
bHide = TRUE;
}
else
return RTERROR;
}
if(!m_ImageBox.m_bIsJpgShow)
xsDwbPath << GetPathNameByAllName(szTKName) << GetFileNameByAllName(szTKName) << _T(".DWB");
else
xsDwbPath << GetPathNameByAllName(szTKName) << GetFileNameByAllName(szTKName) << _T("_3d.DWB");
{
CString sSlb((const TCHAR*)xsDwbPath);
sSlb.Replace(_T(".DWB"),_T(".SLB"));
XSlideLib slb(sSlb);
if(!(!slb)) slb.Remove(szDrawing);
}
if(bHide)
{
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 << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".SLB");
XSlideLib slbMan(xsSlbFile);
if(!slbMan) return RTERROR;
slbMan.Append(xsFullSld);
_tremove(xsFullSld);
}
return RTNONE;
}
void CTKWorkspace::OnBlkRebuild()
{
if(IsLock())
return;
if(m_ImageBox.m_lstSelected.Length() != 1)
{
MessageBox(_T("请选中某一图块,再进行重新制作!"));
return;
}
int num = *m_ImageBox.m_lstSelected[0];
//m_ImageBox.CurPage() * m_ImageBox.m;
CString csCurDrawing = m_ImageBox.m_lstBlk[*m_ImageBox.m_lstSelected[0]]->csDrawing;
HTREEITEM htree = m_treeCtrl.GetSelectedItem();
CString csCurTKName, csCurType;
m_treeCtrl.GetNodeAllPath(htree, csCurTKName, csCurType);
HideDialog(TRUE);
// 注意 : 此处有bug. 新图形进入图库后,并没有把dwg内文件内插入的块一并置换
AddImage2DwbForBlkRebuild(csCurTKName,csCurDrawing, TRUE);
HideDialog(FALSE);
ResetImage();
m_ImageBox.m_lstSelected.Append(new int(num));
m_ImageBox.SelectIndex(num);
int len = m_ImageBox.m_lstSelected.Length();
for(int i=0;i<len;i++)
{
int sel = *m_ImageBox.m_lstSelected[i];
m_listCtrl.SetItemState(sel, LVIS_SELECTED, LVIS_SELECTED);
}
SetDlgItemText(IDC_S_DESCRIPTION, _T("重制图块完毕!"));
}
/////////////////////////////////// TOOLBAR 命令结束 ///////////////////////////////
//******************************* 右键菜单命令 **********************************************
void CTKWorkspace::OnTkPopupInserttk() // 插入一TK
{
if(IsLock()) return;
CFileDialog dlg(TRUE,_T("*.tk"),_T(""),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("上华图库文件 (*.TK) |*.TK||"), this);
if(dlg.DoModal()!=IDOK)
return;
if(!FindFile(dlg.GetPathName()))
{
AfxMessageBox(_T("不存在此文件!请换一文件。"));
return;
}
XStringList lstFiles;
BOOL bShow;
CString csVersion, csDescription;
CTkwFile tkw(m_csCurTKWFile);
tkw.GetTKList(lstFiles);
bShow = tkw.m_bIsJpg;
csVersion = tkw.m_csVersion;
csDescription = tkw.m_csDescription;
BOOL bFlag = FALSE;
for(int i=0;i<lstFiles.Length();i++)
{
XString fullFile;
if(FindFile(lstFiles[i], fullFile))
{ // 检查该TK是否在TKW中
if(_tcscmp(fullFile, dlg.GetPathName()) == 0)
{
bFlag = TRUE;
break;
}
}
}
if(!bFlag)
lstFiles.Append(tstrnew(dlg.GetPathName()));
else
{
AfxMessageBox(_T("图库组中已存在此TK文件!"));
return;
}
tkw.SetTKList(lstFiles);
tkw.WriteFile(m_csCurTKWFile);
m_treeCtrl.SetDataSource(m_csCurTKWFile); // 重新刷新
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
SetDlgItemText(IDC_S_DESCRIPTION, _T("插入一TK至当前图库组"));
}
void CTKWorkspace::OnTkPopupNewtk() // 新建一TK
{
if(IsLock()) return;
CFileDialog dlg(TRUE,_T("*.tk"),_T(""),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("上华图库文件 (*.TK) |*.TK||"), this);
XFilePathName XFilePath2(m_csCurTKWFile);
CString csPath = XFilePath2.getDriver() + XFilePath2.getDir();
TCHAR szDlgTitle[] = _T("输入需要新建的TK文件名");
int maxChar = 256;
dlg.m_ofn.nMaxFile = maxChar;
dlg.m_ofn.lpstrTitle = szDlgTitle;
dlg.m_ofn.lpstrInitialDir = csPath;
if(dlg.DoModal()!=IDOK)
return;
if(FindFile(dlg.GetPathName()))
{
AfxMessageBox(_T("已存在此文件!请换一文件。"));
return;
}
if(!CreateTKFile(dlg.GetPathName()))
return;
XStringList lstFiles;
BOOL bShow;
CString csVersion, csDescription;
CTkwFile tkw(m_csCurTKWFile);
tkw.GetTKList(lstFiles);
bShow = tkw.m_bIsJpg;
csVersion = tkw.m_csVersion;
csDescription = tkw.m_csDescription;
BOOL bFlag = FALSE;
for(int i=0;i<lstFiles.Length();i++)
{
XString fullFile;
if(FindFile(lstFiles[i], fullFile))
{ // 检查该TK是否在TKW中
if(_tcscmp(fullFile, dlg.GetPathName()) == 0)
{
bFlag = TRUE;
break;
}
}
}
if(!bFlag)
lstFiles.Append(tstrnew(dlg.GetPathName()));
else
{
AfxMessageBox(_T("图库组中已存在此TK文件!"));
return;
}
tkw.SetTKList(lstFiles);
tkw.WriteFile(m_csCurTKWFile);
m_treeCtrl.SetDataSource(m_csCurTKWFile); // 重新刷新
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
SetDlgItemText(IDC_S_DESCRIPTION, _T("新建一TK至当前图库组"));
}
void CTKWorkspace::OnTkPopupTreetype() // 合并TKW
{
OnBlkMerge();
//add by xlc on 080829
m_ToolBar.CheckButton(ID_BLK_MERGE, 1);
}
void CTKWorkspace::OnTkPopupRemovetk() //从TKW组中移出TK
{
if(IsLock()) return;
HTREEITEM htree = NULL;
htree = m_treeCtrl.GetSelectedItem();
if(!htree)
return;
CString csCurTKName, csCurType, csVersion, csDescription;
m_treeCtrl.GetNodeAllPath(htree, csCurTKName, csCurType);
XStringList lstFiles;
BOOL bShow;
CTkwFile tkw(m_csCurTKWFile);
tkw.GetTKList(lstFiles);
bShow = tkw.m_bIsJpg;
csVersion = tkw.m_csVersion;
csDescription = tkw.m_csDescription;
for(int i=0;i<lstFiles.Length();i++)
{
XString fullFile;
if(FindFile(lstFiles[i], fullFile))
{ // 检查该TK是否在TKW中, 保证不管是全路径,还是文件名
if(_tcscmp(fullFile, csCurTKName) == 0)
{
lstFiles.Remove(i);
break;
}
}
}
tkw.SetTKList(lstFiles);
tkw.WriteFile(m_csCurTKWFile);
m_treeCtrl.SetDataSource(m_csCurTKWFile); // 重新刷新
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
SetDlgItemText(IDC_S_DESCRIPTION, _T("从当前图库组移出一TK"));
}
void CTKWorkspace::OnTkPopupRenamekind() //类别重命名
{
if(IsLock()) return;
HTREEITEM hTreeItem = NULL;
hTreeItem = m_treeCtrl.GetSelectedItem();
m_treeCtrl.SetFocus();
if(hTreeItem && hTreeItem != m_treeCtrl.GetRootItem());
{
m_bEditLabel = TRUE;
m_treeCtrl.EditLabel(hTreeItem);
}
}
void CTKWorkspace::OnTkPopupNew() //新建类别
{
if(IsLock()) return;
HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
HTREEITEM hSubItem = NULL;
if(hItem == NULL)
return;
CString csCurTKName, csCurType;
m_treeCtrl.GetNodeAllPath(hItem, csCurTKName, csCurType);
CodeBase db;
XDbfTable *pTable = db.Open(csCurTKName);
if(!pTable)
{
AfxMessageBox(_T("TK文件只读或损坏!"));
return;
}
hSubItem = m_treeCtrl.InsertItem(_T("新类别"), 1, 2, hItem );
m_treeCtrl.SelectItem(hSubItem);
if(csCurType == _T(""))
csCurType = _T("新类别");
else
csCurType = csCurType + _T("\\新类别");
pTable->AppendBegin();
SET_FIELD(pTable, _T("kind"), (const TCHAR*)csCurType);
pTable->AppendEnd();
m_treeCtrl.SetFocus();
m_bEditLabel = TRUE;
m_treeCtrl.EditLabel(hSubItem);
SetDlgItemText(IDC_S_DESCRIPTION, _T("新建类别"));
}
void CTKWorkspace::OnTkPopupDel() //删除类别
{
OnBlkDelkind();
}
/////////////////////////////////// 右键菜单 命令结束 //////////////////////////////////////////////////
void CTKWorkspace::OnOK()
{
if(m_nOpenMode == 0 || m_bMultiSel)
{
SaveStatus();
if(m_ImageBox.m_lstSelected.Length() != 1)
{
CAcUiDialog::OnOK();
return;
}
int sel = *m_ImageBox.m_lstSelected[0];
TKStruct *cur = m_ImageBox.m_lstBlk[sel];
HideDialog(TRUE);
//add by xlc on 090505 06以下平台资源冲突
CTemporaryResourceOverride resOverride(acedGetAcadResourceInstance());
BOOL bRet = InsertBlock(cur->csTKFile, cur->csDrawing);
if(bRet)
{
HideDialog(FALSE);
return;
}
}
else
{
if(m_ImageBox.m_lstSelected.Length() == 1)
{
//modify by xlc on 080602
SaveStatus();
int sel = *m_ImageBox.m_lstSelected[0];
TKStruct &cur = *(m_ImageBox.m_lstBlk[sel]);
m_csLastTKName = cur.csTKFile;
TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
_tsplitpath(m_csLastTKName, szDrive, szDir, szFile, szExt);
m_csRet = CString(szFile) + _T("(") + cur.csDrawing+ _T(")");
}
}
CAcUiDialog::OnOK();
}
void CTKWorkspace::OnBlkReplace()
{
if(m_ImageBox.m_lstSelected.Length() != 1)
{
AfxMessageBox(_T("请选择某一构件!"));
return;
}
SaveStatus();
CAcUiDialog::OnOK();
int sel = *m_ImageBox.m_lstSelected[0];
TKStruct *cur = m_ImageBox.m_lstBlk[sel];
//modified by whl
if(m_iWorkType==0)
ReplaceBlk(cur->csTKFile, cur->csDrawing);
else
ReplaceBlk1(cur->csTKFile, cur->csDrawing);
}
AcDbObjectId GetBlkRecordIdByName(const TCHAR* szBlkName)
{
AcDbObjectId id = NULL;
AcDbBlockTableRecord *pRecord = NULL;
AcDbBlockTable* pBlockTable = NULL;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
if(!pBlockTable)
return id;
if(Acad::eOk != pBlockTable->getAt(szBlkName, pRecord, AcDb::kForRead))
{
pBlockTable->close();
return id;
}
pBlockTable->close();
if(!pRecord)
return id;
id = pRecord->objectId();
pRecord->close();
return id;
}
int DragInsertBlock(const TCHAR *szBlock, int nFlag, const AcGeScale3d &scales);
//TARCH_IMPEXP AcDbObjectId MakeBlockInsert(const TCHAR *pszBlock, XPoint ptInsert,
// double sx, double sy, double sz, double rot);
BOOL CTKWorkspace::InsertBlock(const TCHAR* szTKName, const TCHAR* szDrawing)
{
CString csTKName, csDrawing;
csTKName = szTKName;
csDrawing = szDrawing;
XString xsDwbPath, blkName(256), xsDwbPath2d, blkName2d(256);
AcDbObjectId id2d(NULL), id3d(NULL);
TCHAR drive[_MAX_DRIVE]=_T(""), dir[_MAX_DIR]=_T(""), file[_MAX_FNAME], ext[_MAX_EXT];
_tsplitpath(csTKName, drive, dir, file, ext);
if(m_treeCtrl.m_bIsJpgShow)
{
_stprintf(blkName, _T("$%s_3d$%s"), file, (const TCHAR *)csDrawing);
xsDwbPath << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_3d.DWB");
xsDwbPath2d << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_2d.DWB");
if(LoadDwbBlock(xsDwbPath2d, csDrawing, blkName2d)!=RTNORM)//如果不存在图块,直接返回
{
ads_printf(_T("\n内部错误:无法找到并提取图块%s!"), blkName2d);
return FALSE;
}
id2d = GetBlkRecordIdByName(blkName2d);
}
else
{
_stprintf(blkName, _T("$%s$%s"), file, (const TCHAR *)csDrawing);
xsDwbPath << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".DWB");
}
if(!XSymbolTable(_T("BLOCK"), blkName))
{
if(LoadDwbBlock(xsDwbPath, csDrawing, blkName)!=RTNORM)//如果不存在图块,直接返回
{
ads_printf(_T("\n内部错误:无法找到并提取图块%s!"),blkName);
return FALSE;
}
if(m_treeCtrl.m_bIsJpgShow)
{
id3d = GetBlkRecordIdByName(blkName);
// 把材质从图块移动到模型空间
#if ADS<17
MoveMaterial2MSpace(id3d);
#endif
OPENOBJ_BEGIN(id3d, AcDb::kForWrite, AcDbBlockTableRecord, pBlock);
if(pBlock)
{
AcDbHandle handle = id2d.handle();
TCHAR szHandle[17]=_T("");
handle.getIntoAsciiBuffer(szHandle);
resbuf *pXData = ads_buildlist(1001, TCHXD, 1005, szHandle, NULL);
if(!XSymbolTable(_T("APPID"), TCHXD))
ads_regapp(TCHXD);
pBlock->setXData(pXData);
ads_relrb(pXData);
}
OPENOBJ_END();
SHads_command(RTSTR, _T(".REDRAW"), RTNONE);
}
XDbBlockTableRec rec(blkName, AcDb::kForWrite);
if(!!rec)
{
XString sComments(1024); // tkw, tk, block
sComments << XPathParser(m_csCurTKWFile).m_sFileName << _T(",")
<< XPathParser(csTKName).m_sFileName << _T(",")<< (const TCHAR *)csDrawing;
rec.m_pBlockTableRec->setComments(sComments);
}
}
int nInsFlag=IBF_MINSERT|IBF_ROT90|IBF_MIRLR|IBF_MIRUD|IBF_ALIGN
|IBF_FRAME|IBF_ROTATE|IBF_BASEPT|IBF_RESEL;
int nRet;
//LH 2013-3-25 根据2014年加密需要水关键字8--14 暖6--15 电3--16
//if(!g_nRunMode && g_nProductId != 3 && g_nProductId != 8)
if(!g_nRunMode && g_nProductId != kTELEC && g_nProductId != kTWT)
{
nInsFlag |= IBF_TINSERT;
if(m_treeCtrl.m_bIsJpgShow)
nInsFlag |= IBF_MULTVIEW;
nRet=DragInsertBlock(blkName, nInsFlag, AcGeScale3d(1,1,1));
}
//LH 2013-3-25 根据2014年加密需要水关键字8--14 暖6--15 电3--16
//else if(g_nProductId==3 || g_nProductId==8)
else if(g_nProductId==kTELEC || g_nProductId==kTWT)
{ // 电气/给排水,modified by SR
double nBlkLength(1);
int nInsFlag2=IBF_MINSERT|IBF_ROT90|IBF_MIRLR|IBF_MIRUD|IBF_SCALE
|IBF_ROTATE|IBF_BASEPT|IBF_RESEL;
if(_tcsicmp(file, _T("equip")) == 0 || _tcsicmp(file, _T("equip_U")) == 0)
{
CRegProperty regProp(GetRegLocation(), _T("TElecConfig"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.GetValue(_T("EqBlkLength"), nBlkLength);
}
else if(_tcsicmp(file, _T("element")) == 0 || _tcsicmp(file, _T("element_U")) == 0)
nBlkLength = 1500;
nRet=DragInsertBlock1(blkName, nInsFlag2, AcGeScale3d(nBlkLength, nBlkLength, nBlkLength));
}
else
{ // 上华3
nRet=DragInsertBlock1(blkName, nInsFlag, AcGeScale3d(1,1,1));
}
return (nRet==IBF_RESEL)? TRUE : FALSE;
}
AcDbObjectId GetRepBlkId(const TCHAR* szTKName, const TCHAR* szDrawing, BOOL m_bIsJpgShow)
{
CString csTKName, csDrawing;
csTKName = szTKName;
csDrawing = szDrawing;
XString xsDwbPath, blkName(256), xsDwbPath2d, blkName2d(256);
AcDbObjectId id2d(NULL), id3d(NULL);
TCHAR drive[_MAX_DRIVE]=_T(""), dir[_MAX_DIR]=_T(""), file[_MAX_FNAME], ext[_MAX_EXT];
_tsplitpath(csTKName, drive, dir, file, ext);
if(m_bIsJpgShow)
{
_stprintf(blkName, _T("$%s_3d$%s"), file, (const TCHAR *)csDrawing);
xsDwbPath << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_3d.DWB");
xsDwbPath2d << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_2d.DWB");
if(LoadDwbBlock(xsDwbPath2d, csDrawing, blkName2d)!=RTNORM)//如果不存在图块,直接返回
{
ads_printf(_T("\n内部错误:无法找到并提取图块%s!"), blkName2d);
return FALSE;
}
id2d = GetBlkRecordIdByName(blkName2d);
}
else
{
_stprintf(blkName, _T("$%s$%s"), file, (const TCHAR *)csDrawing);
xsDwbPath << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".DWB");
}
if(!XSymbolTable(_T("BLOCK"), blkName))
{
if(LoadDwbBlock(xsDwbPath, csDrawing, blkName)!=RTNORM)//如果不存在图块,直接返回
{
ads_printf(_T("\n内部错误:无法找到并提取图块%s!"),blkName);
return FALSE;
}
if(m_bIsJpgShow)
{
id3d = GetBlkRecordIdByName(blkName);
//AcDbObjectIdArray idMaters;
// 把材质从图块移动到模型空间
#if ADS<17
MoveMaterial2MSpace(id3d);
#endif
OPENOBJ_BEGIN(id3d, AcDb::kForWrite, AcDbBlockTableRecord, pBlock);
if(pBlock){
AcDbHandle handle = id2d.handle();
TCHAR szHandle[17]=_T("");
handle.getIntoAsciiBuffer(szHandle);
resbuf *pXData = ads_buildlist(1001, TCHXD, 1005, szHandle, NULL);
if(!XSymbolTable(_T("APPID"), TCHXD))
ads_regapp(TCHXD);
pBlock->setXData(pXData);
ads_relrb(pXData);
}
OPENOBJ_END();
SHads_command(RTSTR, _T(".REDRAW"), RTNONE);
}
}
AcDbObjectId idBlock=GetBlockIdFromString(blkName);
return idBlock;
}
BOOL CTKWorkspace::ReplaceBlk(const TCHAR* szTKName, const TCHAR* szDrawing)
{
CString csTKName, csDrawing;
csTKName = szTKName;
csDrawing = szDrawing;
CBlkManReplaceOption dlg(m_csCurTKWFile,szTKName,m_csCurRecord,acedGetAcadFrame());
dlg.m_idBlock = GetRepBlkId(csTKName, csDrawing, m_treeCtrl.m_bIsJpgShow);
const TCHAR *szFormat= _T("%s(%s)");
if(m_treeCtrl.m_bIsJpgShow)
dlg.m_bUseJpg=TRUE;
dlg.m_sSldFile <<GetPathNameByAllName(csTKName)
<< XString(szFormat, (const TCHAR *)GetFileNameByAllName(csTKName), (const TCHAR *)csDrawing);
{
CTemporaryResourceOverride vTemp1;
dlg.Create(dlg.IDD,acedGetAcadFrame());
}
dlg.ShowWindow(SW_SHOW);
acedGetAcadFrame()->SetFocus();
RBList mask(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"), 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('*'))
{
// 无名块, 不能通过块名过滤
if(DoReplaceBlock(nControlFlag, ent, dlg.m_idBlock)==FALSE)
{
adsout << _T("\n无法替换,请正确选择!");
}
goto lab_SelectInsert;
}
else
{
RBList rb=ads_buildlist(RTDXF0,_T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"),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];
if(DoReplaceBlock(nControlFlag, ent1,dlg.m_idBlock)==FALSE)
adsout << _T("\n无法替换,请正确选择!");
}
goto lab_SelectInsert;
}
else
{
ads_printf(_T("\n内部错误!不能取得同类的图块."));
ASSERT(0);
}
}
}
}
else
{
PickSet ss(SS_FREE);
adsout << _T("\n选择图中将要被替换的图块!");
int nRetCode=ss.Get(NULL, NULL, NULL, mask);
dlg.GetStatus();
nControlFlag=dlg.GetControlFlag();
if((nControlFlag & LO_ALLINSERT_R)) //替换方式发生变化
goto lab_SelectInsert;
if(nRetCode==RTNORM)
{
long lCount=ss.Length();
for(long j=0L; j<ss.Length(); j++)
{
Entity ent1=ss[j];
if(DoReplaceBlock(nControlFlag, ent1,dlg.m_idBlock)==FALSE)
adsout << _T("\n无法替换,请正确选择!");
}
goto lab_SelectInsert;
}
}
int dlgTemp=dlg.m_nUseOtherBlkToRepl;
dlg.DestroyWindow();
return dlgTemp;
}
//add by whl,控制点对齐替换
BOOL CTKWorkspace::ReplaceBlk1(const TCHAR* szTKName, const TCHAR* szDrawing)
{
CString csTKName, csDrawing;
csTKName = szTKName;
csDrawing = szDrawing;
AcDbObjectId idBlock = GetRepBlkId(csTKName, csDrawing, m_treeCtrl.m_bIsJpgShow);
RBList mask(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"), NULL);
PickSet ss(SS_FREE);
adsout << _T("\n选择图中将要被替换的图块!");
int nRetCode=ss.Get(NULL, NULL, NULL, mask);
if(nRetCode==RTNORM)
{
long lCount=ss.Length();
for(long j=0L; j<ss.Length(); j++)
{
Entity ent1=ss[j];
if(DoReplaceBlock(LO_FIX_POINT, ent1,idBlock)==FALSE)
adsout << _T("\n无法替换,请正确选择!");
}
}
return TRUE;
}
// add by xlc on 070828
HCURSOR CTKWorkspace::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
// add by xlc on 070828
void CTKWorkspace::OnBegindragList(NMHDR* pNMHDR, LRESULT* pResult)
{
if(!m_ImageBox.m_bSort)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
m_nDragIndex = pNMListView->iItem;
POINT pt;
int nOffset = 15;
if(m_listCtrl.GetSelectedCount() > 1)
pt.x = nOffset;
pt.y = nOffset;
TCHAR szLabel[256];
LVITEM lviT;
ZeroMemory(&lviT, sizeof (LVITEM));
lviT.mask = LVIF_TEXT;
lviT.pszText = szLabel;
lviT.cchTextMax = 255;
lvItem lvi;
lvi.plvi = &lviT;
lvi.plvi->mask = LVIF_TEXT;
lvi.plvi->pszText = szLabel;
lvi.plvi->cchTextMax = 255;
int nCount = m_listCtrl.GetSelectedCount();
CStringArray strArry; //选中项不同名的的字符串数组
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
if (pos != NULL)
{
CString strItem;
while (pos)
{
int nItem = m_listCtrl.GetNextSelectedItem(pos);
lvi.plvi->iItem = nItem;
m_listCtrl.GetItem (lvi.plvi);
strItem=lvi.plvi->pszText;
BOOL bFind = FALSE;
for(int j=0;j<strArry.GetSize();j++)
{
if(_tcsicmp(strArry[j],strItem) == 0)
{
bFind = TRUE;
break;
}
}
if(!bFind)
{
strArry.Add(strItem);
}
}
}
//选中列表中与选中项名字相同的项
for(int i = 0; i < m_listCtrl.GetItemCount();i++)
{
if(m_listCtrl.GetItemState(i,LVIS_SELECTED))
continue;
CString strItem;
lvi.plvi->iItem = i;
m_listCtrl.GetItem (lvi.plvi);
strItem=lvi.plvi->pszText;
for(int j=0;j<strArry.GetSize();j++)
{
if(_tcsicmp(strArry[j],strItem) == 0)
{
m_listCtrl.SetItemState(i,LVIS_SELECTED,LVIS_SELECTED);
break;
}
}
}
RECT rect;
m_listCtrl.GetWindowRect(&rect);
m_pDragImage = new CImageList;
m_pDragImage->Create(IDB_BITMAP_BOX,rect.right-rect.left,1,ILC_COLOR32);
ASSERT(m_pDragImage);
m_pDragImage->BeginDrag(0, CPoint(0, nOffset));
m_pDragImage->DragEnter(GetDesktopWindow(), pNMListView->ptAction);
m_bDragging = TRUE;
m_nDropIndex = -1;
m_pDragList = &m_listCtrl;
m_pDropWnd = &m_listCtrl;
SetCapture ();
}
*pResult = 0;
}
// add by xlc on 070828
void CTKWorkspace::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList)
{
if(pDragList == NULL|| pDropList==NULL)
return;
pDropList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED);
TCHAR szLabel[256];
LVITEM lviT;
LVITEM* plvitem;
ZeroMemory(&lviT, sizeof (LVITEM));
lviT.iItem = m_nDragIndex;
lviT.mask = LVIF_TEXT;
lviT.pszText = szLabel;
lviT.cchTextMax = 255;
lvItem* pItem;
lvItem lvi;
lvi.plvi = &lviT;
lvi.plvi->iItem = m_nDragIndex;
lvi.plvi->mask = LVIF_TEXT;
lvi.plvi->pszText = szLabel;
lvi.plvi->cchTextMax = 255;
if(pDragList->GetSelectedCount() == 1)
{
if (m_nDropIndex !=m_nDragIndex)
{
pDragList->GetItem (lvi.plvi); //拖拽项
lvi.sCol2 = pDragList->GetItemText(lvi.plvi->iItem, 1);
if(pDragList == pDropList)
{
pDragList->DeleteItem (m_nDragIndex);
if(m_nDragIndex < m_nDropIndex)
m_nDropIndex--;
}
//插入项
lvi.plvi->iItem = (m_nDropIndex == -1) ? pDropList->GetItemCount () : m_nDropIndex;
pDropList->InsertItem (lvi.plvi);
pDropList->SetItemState (lvi.plvi->iItem, LVIS_SELECTED, LVIS_SELECTED);
}
}
else //多行
{
DualList<lvItem*> listItems;
POSITION pos = pDragList->GetFirstSelectedItemPosition();
while(pos)
{
plvitem = new LVITEM;
ZeroMemory(plvitem, sizeof(LVITEM));
pItem = new lvItem;
pItem->plvi = plvitem;
pItem->plvi->iItem = m_nDragIndex;
pItem->plvi->mask = LVIF_TEXT;
pItem->plvi->pszText = new TCHAR[256];
pItem->plvi->cchTextMax = 255;
m_nDragIndex = pDragList->GetNextSelectedItem(pos);
pItem->plvi->iItem = m_nDragIndex;
pDragList->GetItem(pItem->plvi);
listItems.AddTail(pItem);
}
if(pDragList == pDropList)
{
pos = pDragList->GetFirstSelectedItemPosition();
while(pos)
{
pos = pDragList->GetFirstSelectedItemPosition();
m_nDragIndex = pDragList->GetNextSelectedItem(pos);
pDragList->DeleteItem(m_nDragIndex);
if(m_nDragIndex < m_nDropIndex)
m_nDropIndex--;
}
}
for(int i = 0; i < listItems.GetLength();i++)
{
pItem = listItems.GetAt(i);
m_nDropIndex = (m_nDropIndex == -1) ? pDropList->GetItemCount() : m_nDropIndex;
pItem->plvi->iItem = m_nDropIndex;
pDropList->InsertItem(pItem->plvi);
pDropList->SetItemState(pItem->plvi->iItem, LVIS_SELECTED, LVIS_SELECTED);
m_nDropIndex++;
}
}
AdjustImage(); //调整图片位置
}
// add by xlc on 070828
void CTKWorkspace::AdjustImage()
{
//modify by xlc on 090413解决向后拖拽一行时
// if(m_nDropIndex == m_nDragIndex || m_nDragIndex == m_nDropIndex-1)
// return;
DList<TKStruct> lstOld;
for(int i = 0; i < m_ImageBox.m_lstBlk.Length(); i++)
{
lstOld.Append(new TKStruct(*m_ImageBox.m_lstBlk[i]));
}
TCHAR szLabel[256];
LVITEM lviT;
ZeroMemory(&lviT, sizeof (LVITEM)); //allocate and clear memory space for LV_ITEM
lviT.mask = LVIF_TEXT;
lviT.pszText = szLabel;
lviT.cchTextMax = 255;
lvItem lvi;
lvi.plvi = &lviT;
lvi.plvi->mask = LVIF_TEXT;
lvi.plvi->pszText = szLabel;
lvi.plvi->cchTextMax = 255;
for(i = 0; i < m_listCtrl. GetItemCount( ); i++)
{
CString strItem;
lvi.plvi->iItem = i;
m_listCtrl.GetItem (lvi.plvi);
strItem=lvi.plvi->pszText;
for(int j=0;j<lstOld.Length();j++)
{
CString str=lstOld[j]->csItem;
if(_tcsicmp(strItem,lstOld[j]->csItem) == 0)
{
m_ImageBox.m_lstBlk.Replace(new TKStruct(*lstOld[j]),i);
lstOld.Remove(j);
break;
}
}
}
if (ModifyDatabaseFile())
{
ResetImage(TRUE);
}
}
//add by xlc on 070919
BOOL CTKWorkspace::ModifyDatabaseFile()
{
//将改动写入数据库
CString sKind, sItem, sDrawing; //类别,名称,内部图名
CodeBase db;
db.read_only = 0;
//add by xlc on 080821
if(m_ImageBox.m_lstBlk.Length()<1)
return FALSE;
XDbfTable *pTable = db.Open(m_ImageBox.m_lstBlk[0]->csTKFile);
if(!pTable)
return FALSE;
int i=0;
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext())
{
GET_FIELD(pTable, _T("kind"), sKind);
GET_FIELD(pTable, _T("item"), sItem);
GET_FIELD(pTable, _T("drawing"), sDrawing);
if(i<m_ImageBox.m_lstBlk.Length())
{
if(sItem.IsEmpty() || sDrawing.IsEmpty())
continue;
if(_tcsicmp(sKind,m_ImageBox.m_lstBlk[i]->csKind) == 0)
{
SET_FIELD(pTable, _T("item"), (const TCHAR *)m_ImageBox.m_lstBlk[i]->csItem);
SET_FIELD(pTable, _T("drawing"), (const TCHAR *)m_ImageBox.m_lstBlk[i]->csDrawing);
i++;
}
}
else
{
break;
}
}
db.read_only = 1;
return TRUE;
}
//---------------------------------------------
//add by xlc on 080826
void CTKWorkspace::OpenFileByMenu(CString csCommand)
{
CString csTKWFullName;
GetTkwFileByMenu(csCommand, csTKWFullName);
if(!csTKWFullName.IsEmpty() && FindFile(csTKWFullName))
{
m_csCurTKWFile = csTKWFullName;
m_treeCtrl.SetDataSource(m_csCurTKWFile);
m_ImageBox.m_bIsJpgShow = m_treeCtrl.m_bIsJpgShow;
m_treeCtrl.SelectItem(m_treeCtrl.GetRootItem());
SetDlgItemText(IDC_S_DESCRIPTION, _T("打开tkw图库组文件"));
SaveStatus();
LoadStatus();
}
else if(!FindFile(csTKWFullName) && !csTKWFullName.IsEmpty())
MessageBox(_T("没有找到库文件!请确认安装是否完全。"));
}
void CTKWorkspace::OnSelect2DTKLib()
{
OpenFileByMenu(CString(_T("二维图库")));
}
void CTKWorkspace::OnSelectEuroLib()
{
OpenFileByMenu(CString(_T("欧式图库")));
}
void CTKWorkspace::OnSelectMViewLib()
{
OpenFileByMenu(CString(_T("多视图库")));
}
void CTKWorkspace::OnSelectEBalLib()
{
OpenFileByMenu(CString(_T("立面阳台库")));
}
void CTKWorkspace::OnSelectEWDLib()
{
OpenFileByMenu(CString(_T("立面门窗库")));
}
void CTKWorkspace::OnSelectPolyShapeLib()
{
OpenFileByMenu(CString(_T("路径曲面截面库")));
}
void CTKWorkspace::OnSelectLinePatLib()
{
OpenFileByMenu(CString(_T("线图案库")));
}
void CTKWorkspace::OnSelectTitleFrameLib()
{
OpenFileByMenu(CString(_T("图框库")));
}
void CTKWorkspace::OnSelectDorLib2D()
{
OpenFileByMenu(CString(_T("二维门库")));
}
void CTKWorkspace::OnSelectWinLib2D()
{
OpenFileByMenu(CString(_T("二维窗库")));
}
void CTKWorkspace::OnSelectWDLib3D()
{
OpenFileByMenu(CString(_T("三维门窗库")));
}
void CTKWorkspace::OnSelectRailLib()
{
OpenFileByMenu(CString(_T("栏杆库")));
}
void CTKWorkspace::OnUpdateRevert(CCmdUI* pCmdUI)
{
m_ToolBar.CheckButton(ID_BLK_REVERT, 1);
m_menu.CheckMenuItem(ID_BLK_MERGE,MF_UNCHECKED);
m_menu.CheckMenuItem(ID_BLK_REVERT,MF_CHECKED);
}
void CTKWorkspace::OnUpdateMerge(CCmdUI* pCmdUI)
{
m_ToolBar.CheckButton(ID_BLK_MERGE, 1);
m_menu.CheckMenuItem(ID_BLK_MERGE,MF_CHECKED);
m_menu.CheckMenuItem(ID_BLK_REVERT,MF_UNCHECKED);
}
void CTKWorkspace::OnUpdateSort(CCmdUI* pCmdUI)
{
if (m_ImageBox.m_bSort)
{
m_menu.CheckMenuItem(ID_MENU_SSORT,MF_UNCHECKED);
}
else
{
m_menu.CheckMenuItem(ID_MENU_SSORT,MF_CHECKED);
}
}
void CTKWorkspace::OnUpdateSave(CCmdUI* pCmdUI)
{
m_menu.CheckMenuItem(ID_MENU_SSORT,MF_UNCHECKED);
}
void CTKWorkspace::AddDynMenu(BOOL bCreate//[in]是否创建
)
{
if(bCreate)
{
m_cMenu.CreatePopupMenu();
GetMenu()->InsertMenu(1,MF_BYPOSITION | MF_POPUP,(UINT_PTR)m_cMenu.m_hMenu,_T("图库"));
}
else
{
m_cMenu.DestroyMenu();
m_cMenu.CreatePopupMenu();
GetMenu()->ModifyMenu(1,MF_BYPOSITION | MF_POPUP,(UINT_PTR)m_cMenu.m_hMenu,_T("图库"));
}
int i, nLenArray;
UINT MenuID;
XStringList lstTkwItem;
MenuID = OpenMenuID + m_lstBlbNames.Length();
GetTchtkwAllItem(lstTkwItem);
nLenArray = lstTkwItem.Length();
for(i=0;i<nLenArray;i++)
{
CString csTkwItem = (const TCHAR*)lstTkwItem[i];
if(csTkwItem == _T("#"))
m_cMenu.AppendMenu(MF_SEPARATOR);
else
m_cMenu.AppendMenu(MF_STRING, MenuID + i, csTkwItem);
}
//更新工具条菜单
if (m_pOpenMenu)
{
m_pOpenMenu->DestroyMenu();
m_pOpenMenu->CreatePopupMenu();
for(i=0; i< m_lstBlbNames.Length(); i++) // 将最近使用过的库加入菜单
m_pOpenMenu->AppendMenu(MF_STRING, OpenMenuID + i, m_lstBlbNames[i]);
m_pOpenMenu->AppendMenu(MF_SEPARATOR);
MenuID = OpenMenuID + m_lstBlbNames.Length();
for(i=0;i<nLenArray;i++)
{
CString csTkwItem = (const TCHAR*)lstTkwItem[i];
if(csTkwItem == _T("#"))
m_pOpenMenu->AppendMenu(MF_SEPARATOR);
else
m_pOpenMenu->AppendMenu(MF_STRING, MenuID + i, csTkwItem);
}
}
}
//---------------------------------------------
namespace
{
void getFilesInFolder(LPCTSTR sPath
, LPCTSTR filter
, std::vector<CString> &vs
, const bool &bOnlyName
, const bool &bRecursive)
{
if (!sPath) return;
CString filename(_T(""));
CFileFind finder;
BOOL isNotEmpty = finder.FindFile(CString(sPath) + _T("\\") + filter);
while (isNotEmpty)
{
isNotEmpty = finder.FindNextFile();
filename = bOnlyName ? finder.GetFileTitle() : finder.GetFilePath();
if (!finder.IsDirectory() && !finder.IsHidden())
{
vs.push_back(filename);
}
else
{
if (!finder.IsDots() && bRecursive)
{
getFilesInFolder(filename + _T("\\"), filter, vs, bOnlyName, bRecursive);
}
}
}
finder.Close();
}
CString getFileName(LPCTSTR psz)
{
CString path(psz);
int idx1 = path.ReverseFind(_T('.'));
int idx2 = path.ReverseFind(_T('\\'));
return path.Mid(idx2 + 1, idx1 - idx2 - 1);
}
// 删除文件(第二个参数bDelete表示是否删除至回收站,默认删除到回收站)
BOOL RecycleFileOrFolder(CString strPath, BOOL bDelete = TRUE)
{
strPath += '\0';
SHFILEOPSTRUCT shDelFile;
memset(&shDelFile, 0, sizeof(SHFILEOPSTRUCT));
shDelFile.fFlags |= FOF_SILENT; // 不显示进度
shDelFile.fFlags |= FOF_NOERRORUI; // 不报告错误信息
shDelFile.fFlags |= FOF_NOCONFIRMATION; // 直接删除,不进行确认
// 设置SHFILEOPSTRUCT的参数为删除做准备
shDelFile.wFunc = FO_DELETE; // 执行的操作
shDelFile.pFrom = strPath; // 操作的对象,也就是目录(注意:以“\0\0”结尾)
shDelFile.pTo = NULL; // 必须设置为NULL
if (bDelete) //根据传递的bDelete参数确定是否删除到回收站
{
shDelFile.fFlags &= ~FOF_ALLOWUNDO; //直接删除,不进入回收站
}
else
{
shDelFile.fFlags |= FOF_ALLOWUNDO; //删除到回收站
}
BOOL bres = SHFileOperation(&shDelFile); //删除
return !bres;
}
int LoadDwbBlock(LPCTSTR sDwbFile, LPCTSTR sDwgName, LPCTSTR sBlockName, AcDbDatabase *pDb)
{
//TCHAR drive[_MAX_DRIVE] = _T(""), dir[_MAX_DIR] = _T(""), file[_MAX_FNAME], ext[_MAX_EXT];
//_tsplitpath(sDwbFile, drive, dir, file, ext);
//_stprintf(sBlockName, _T("$%s$%s"), file, sDwgName);
if (!TAcDbBlockTableRecPtr(sBlockName, AcDb::kForRead, pDb))
{
;
}
else
{
return RTNORM;
}
TCString sDwbFileExt, sFullDwbFile;
sDwbFileExt << sDwbFile;
if (!tstrchr_new(sDwbFile, _T('.')))
{
sDwbFileExt << _T(".DWB");
}
if (ads_findfile(sDwbFileExt, sFullDwbFile) != RTNORM)
{
return RTERROR;
}
TGGiDrawingStorage dwb(sFullDwbFile, _ios::binary|_ios::in);
int nIndex = 0;
if (!dwb.IsExist(sDwgName, &nIndex))
{
return RTERROR;
}
TCString sTempFile(256);
sTempFile = TchExport::GetTempFileName(_T(".dwg"));
if (!dwb.Copy(nIndex, sTempFile))
{
return RTERROR;
}
int nRet = RTNORM;
AcDbDatabase db(false, true);
AcDbObjectId _id;
#if ADS >= 21
if (db.readDwgFile(sTempFile, AcDbDatabase::kForReadAndAllShare, false) == Acad::eOk &&
pDb->insert(_id, sBlockName, &db, false) == Acad::eOk)
#else
if (db.readDwgFile(sTempFile, _SH_DENYNO, false) == Acad::eOk &&
pDb->insert(_id, sBlockName, &db, false) == Acad::eOk)
#endif
{
nRet = RTNORM;
}
else
{
nRet = RTERROR;
}
_tremove(sTempFile);
return nRet;
}
struct STKind
{
STKind(LPCTSTR name): kindName(name) {}
STKind(): kindName(_T("")) {}
CString kindName;
std::vector<TKStruct> blks;
bool operator < (const STKind &k)
{
return kindName < k.kindName;
}
};
struct STTk
{
STTk(): tkName(_T("")) {}
STTk(LPCTSTR name): tkName(name) {}
CString tkName;
std::vector<STKind> kinds;
bool operator < (const STTk &k) const
{
return tkName < k.tkName;
}
};
}
extern void GetTKFilterList(const TCHAR *szTKName, XStringList &lstKindName);
int exportTK()
{
TCHAR psz[133] = {};
if (acedGetString(1, _T("输入tkw文件所在目录:"), psz) != RTNORM) return 0;
CString dwbPath(psz);
if (_taccess(dwbPath, 0x0) != 0x0) return 0;
std::vector<CString> tkws;
getFilesInFolder(dwbPath, _T("*.tkw"), tkws, false, false);
if (tkws.empty()) return 0;
std::vector<STTk> blks;
XStringList lstTkFiles, lstKindName;
XString tkFile;
CString sKind, sItem, sDrawing; //类别,名称,内部图名
for (size_t i = 0; i < tkws.size(); ++i)
{
CTkwFile tkw(tkws[i]);
tkw.GetTKList(lstTkFiles);
for (int j = 0; j < lstTkFiles.Length(); ++j)
{
LPCTSTR pszTk(lstTkFiles[j]);
lstKindName.Reset();
GetTKFilterList(pszTk, lstKindName);
blks.push_back(STTk(getFileName(pszTk)));
for (int k = 0; k < lstKindName.Length(); ++k)
{
LPCTSTR pszKind(lstKindName[k]);
if (CString(pszKind).IsEmpty())
blks.rbegin()->kinds.push_back(STKind(_T("_other_")));
else
blks.rbegin()->kinds.push_back(STKind(pszKind));
CodeBase db;
db.read_only = 1;
XDbfTable *pTable = db.Open(pszTk);
if (!pTable) continue;
for (pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext())
{
GET_FIELD(pTable, _T("kind"), sKind);
GET_FIELD(pTable, _T("item"), sItem);
GET_FIELD(pTable, _T("drawing"), sDrawing);
if (sKind == pszKind && sDrawing != _T(""))
{
blks.rbegin()->kinds.rbegin()->blks.push_back(TKStruct(pszTk, sKind, sItem, sDrawing));
}
}
}
}
}
::memset(psz, 0, sizeof(TCHAR) * 133);
if (acedGetString(1, _T("输入导出文件所在目录:"), psz) != RTNORM) return 0;
CString allPath(psz), subPath(_T(""));
::memset(psz, 0, sizeof(TCHAR) * 133);
if (acedGetString(1, _T("输入块明前缀:"), psz) != RTNORM) return 0;
CString sPrefix(psz);
if (_taccess(allPath, 0x00) != 0x00)
{
if (!::CreateDirectory(allPath, NULL)) return 0;
}
CString dwbFile(_T("")), blkName(_T(""));
for (size_t i = 0; i < blks.size(); ++i)
{// 一个tk一个目录
STTk &tk(blks[i]);
subPath = allPath + _T("\\") + tk.tkName;
if (_taccess(subPath, 0x00) == 0x00)
RecycleFileOrFolder(subPath);
if (!::CreateDirectory(subPath, NULL)) continue;
for (size_t j = 0; j < tk.kinds.size(); ++j) //
{// 一个kinds一个dwg
STKind &kind(tk.kinds[j]);
if (kind.blks.empty()) continue;
AcDbDatabase *pDb = new AcDbDatabase(true, true);
for (size_t k = 0; k < kind.blks.size(); ++k)
{// 一个 blk 一个块
TKStruct &blk(kind.blks[k]);
dwbFile = blk.csTKFile;
dwbFile = dwbFile.Left(dwbFile.ReverseFind(_T('.'))) + _T(".dwb");
if (_taccess(dwbFile, 0x00) != 0x00) continue;
blkName.Format(_T("%d%s%s"), k, sPrefix, blk.csItem);
LoadDwbBlock(dwbFile, blk.csDrawing, blkName, pDb);
}
MakeDir(subPath + _T("\\") + kind.kindName + _T(".dwg"));
pDb->saveAs(subPath + _T("\\") + kind.kindName + _T(".dwg"));
delete pDb;
}
}
return 0;
}