// 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 #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; icsDrawing) { 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; icsItem); } len = m_ImageBox.m_lstSelected.Length(); for(i = 0;iGetWindowRect(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:"); 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:"); 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:"), 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 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 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.xrect.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 && idxcsDrawing; } } 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=g_nMaxRecentBlb) m_lstBlbNames.Remove(0); m_lstBlbNames.Append(tstrnew(m_csCurTKWFile)); nLen=m_lstBlbNames.Length(); for(i=0; iiItem; 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;icsDrawing)); } 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 lstSelected; //选中的项 for(int m=0;m 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;icsDrawing; 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;iAppendMenu(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;iSendMessage(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 osmode(_T("OSMODE"), 0); XPushVar attreq(_T("ATTREQ"), 0); SHads_command(RTSTR, _T(".INSERT"), RTSTR, (const TCHAR *)xfpn, RTSTR, _T("0,0,0"), RTREAL, 1.0, RTREAL, 1.0, RTREAL, 0.0, RTNONE); Entity ent; ent.GetLast(); SHads_command(RTSTR, _T(".ZOOM"),RTSTR, _T("extent"), RTNONE); if(AyrDlg.m_bNeedHide) SHads_command(RTSTR, _T("HIDE"), RTNONE); XString xsTempSld=GetTempFileName(_T(".SLD")); SHads_command(RTSTR, _T(".MSLIDE"), RTSTR, (const TCHAR *)xsTempSld, RTNONE); XSlideLib slb(xsSlbPath); slb.Append(xsTempSld, xsRet); ent.Delete(); _tremove(xsTempSld); } else { XSlideLib slb(xsSlbPath); slb.Append(csSldName, xsRet); } wndProgress.StepIt(); wndProgress.PeekAndPump(); if (wndProgress.Cancelled()) break; if(ads_usrbrk() == 1) break; //用户中断 } MakeVisible(ss, true); 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 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=_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("(")<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;icsDrawing; 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;iAppendBegin(); 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 <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; jiItem; 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;jiItem = i; m_listCtrl.GetItem (lvi.plvi); strItem=lvi.plvi->pszText; for(int j=0;jCreate(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 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 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;jcsItem; 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(icsKind) == 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;iDestroyMenu(); 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;iAppendMenu(MF_SEPARATOR); else m_pOpenMenu->AppendMenu(MF_STRING, MenuID + i, csTkwItem); } } } //--------------------------------------------- namespace { void getFilesInFolder(LPCTSTR sPath , LPCTSTR filter , std::vector &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 blks; bool operator < (const STKind &k) { return kindName < k.kindName; } }; struct STTk { STTk(): tkName(_T("")) {} STTk(LPCTSTR name): tkName(name) {} CString tkName; std::vector 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 tkws; getFilesInFolder(dwbPath, _T("*.tkw"), tkws, false, false); if (tkws.empty()) return 0; std::vector 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; }