// GJKWorkspace.cpp : implementation file // #include "stdafx.h" #include "GJKWorkspace.h" #include "GJKReplaceOption.h" #include "TKWorkspace.h" #include "Progresswnd.h" #include "Ayrdlg.h" #include "TkwFile.h" #include "XFilePathName.h" #include "BlkManReplaceOption.h" #include "NewTKWDlg.h" #include "NewDbfAccessTools.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //add by xlc on 070906 typedef struct { LVITEM* plvi; CString sCol2; } lvItem, *plvItem; #include ///////////////////////////////////////////////////////////////////////////// // CGJKWorkspace dialog 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 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 GetTchgjkAllItem(XStringList &lstTkwItem); extern BOOL GetGjkwFileByMenu(const TCHAR* szMenuName, CString &csTkwFileName); extern TCHAR g_szDirName[]; //申请自己的16K缓冲区 extern void GetRectBmpFromBmp( CWnd *pWnd ,CRect rectClient, CBitmap &bitmap); extern BOOL SetLayerLocked(const TCHAR* szLayerName, BOOL bLock); extern void GetAShadePickSet(PickSet &ssMat, PickSet &ssSel); //GEOAPI BOOL arxWBlock(PickSet &ss, const TCHAR* szFileName, XPoint ptIns); int GetNextDrawing(const TCHAR *tkName, TCHAR *dwg); //extern GEOAPI int GetPickSetByGroup(const TCHAR *szGroup, PickSet &ss); //modified by whl on 050926 // Status: ? // 限制在DWG目录下 // slb不能携带路径和后缀 // Bug: 只考虑最大999 const UINT OpenMenuID = 9110; const int g_nMaxRecentBlb = 5; //add by cwk void GetNameByTkwName(const TCHAR *pTkwName,CString &sName) { CString csName = pTkwName; XString xsTchtkwFile(1024); if(!FindFile(_T("shsgjk.idx"), xsTchtkwFile)) { AfxMessageBox(_T("SYS目录下没有发行shsgjk.idx文件!")); return ; } FILE *fp=_tfopen(xsTchtkwFile, _T("r")); if(!fp) return ; CString csBuf,csTmp,csTkwTmp; while(!feof(fp)) { TCHAR sBuf[1024]=_T(""); _fgetts(sBuf, 1023, fp); csBuf = sBuf; csBuf.TrimLeft(); csBuf.TrimRight(); if(csBuf == _T("")) continue; if(csBuf.Find(_T(':')) < 0 || csBuf.Find(_T('*')) < 0) continue; csTmp = csBuf.Mid(csBuf.Find(_T(':')) + 1, csBuf.Find(_T('*')) - csBuf.Find(_T(':')) - 1); csTkwTmp = csBuf.Right(csBuf.GetLength() -csBuf.Find(_T('*')) - 1); if (csTkwTmp == csName) { sName = csTmp; break; } } fclose(fp); } int GJKW() { CGJKWorkspace dlg(acedGetAcadFrame()); CTemporaryResourceOverride vTmp; dlg.DoModal(); return RTNORM; } CString GetTypeByRecord(const TCHAR * szTKFile, const TCHAR * csRecord); ///////////////////////////////////////////////////////////////////////////// // CGJKWorkspace dialog IMPLEMENT_DYNAMIC(CGJKWorkspace, CAcUiDialog) CGJKWorkspace::CGJKWorkspace(CWnd* pParent /*=NULL*/) : CAcUiDialog(CGJKWorkspace::IDD, pParent) { //{{AFX_DATA_INIT(CGJKWorkspace) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_nOpenMode = 0; m_bInitSize = FALSE; m_nPageRow = 3; // 行数 m_nPageColumn = 2; // 列数 m_bLock = FALSE; m_pOpenMenu = NULL; m_csCurTKWFile = _T(""); m_csRet = _T(""); m_bEditLabel = FALSE; //m_iWorkType=0;//add by whl XString xsRoot, xsKey; xsKey = _T("GJKMAN"); _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; //add by xlc on 070906 } CGJKWorkspace::CGJKWorkspace(const TCHAR* szTKWName, const TCHAR* szTKName, const TCHAR* szRecord,int nOpenMode,CWnd* pParent /*=NULL*/) : CAcUiDialog(CGJKWorkspace::IDD, pParent) { //{{AFX_DATA_INIT(CGJKWorkspace) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT CString csTKWName , csTKName, csRecord; csTKWName = szTKWName; csTKName = szTKName; csRecord = szRecord; m_bEditLabel = FALSE; //m_iWorkType = 0;//add by whl m_nOpenMode = nOpenMode; m_bInitSize = FALSE; m_nPageRow = 3; // 行数 m_nPageColumn = 2; // 列数 m_bLock = FALSE; m_pOpenMenu = NULL; XString fullFile(1024); 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("GJKMAN"); _tcscat(xsRoot, GetRegLocation()); //modify by xlc on 080519 { _tcscat(xsRoot, _T("\\BLKMAN")); TCHAR szDrive[1024]=_T(""), szDir[1024]=_T(""), szFile[1024]=_T(""), szExt[1024]=_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); // 列数 m_bDragging = FALSE; //add by xlc on 070906 } CGJKWorkspace::~CGJKWorkspace() { if(m_pOpenMenu) { m_pOpenMenu->DestroyMenu(); delete m_pOpenMenu; } m_cMenu.DestroyMenu(); } void CGJKWorkspace::DoDataExchange(CDataExchange* pDX) { CAcUiDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CGJKWorkspace) 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(CGJKWorkspace, CAcUiDialog) //{{AFX_MSG_MAP(CGJKWorkspace) 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_NOTIFY(TBN_DROPDOWN, IDR_TOOLBAR_GJKW, OnToolbarDropDown) ON_NOTIFY(TBN_DROPDOWN, IDR_TOOLBAR_GJKW2, 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_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_NEWDWG, OnBlkNewdwg) ON_WM_LBUTTONDBLCLK() ON_COMMAND(ID_BLK_REPLACE, OnBlkReplace) ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_CLOSE() ON_COMMAND(ID_BLK_REBUILD, OnBlkRebuild) //}}AFX_MSG_MAP ON_COMMAND_RANGE(ID_LAYOUT1X1, ID_LAYOUT5X4, OnLayout) //add by xlc on 070906 ON_WM_QUERYDRAGICON() ON_NOTIFY(LVN_BEGINDRAG, IDC_TK_LIST, OnBegindragList) ON_NOTIFY(NM_RCLICK, IDC_TK_LIST, OnRclickList) ON_COMMAND_RANGE(ID_MENU_SSORT, ID_MENU_SSAVE, OnSort) ON_COMMAND(ID_MENUITEM_OPENING, OnSelectOpeningLib) ON_COMMAND(ID_MENUITEM_COL, OnSelectColLib) ON_COMMAND(ID_MENUITEM_STAIR, OnSelectStairLib) ON_COMMAND(ID_MENUITEM_BAL, OnSelectBalLib) ON_COMMAND(ID_MENUITEM_STEP, OnSelectStepLib) ON_COMMAND(ID_MENUITEM_SHEET, OnSelectSheetLib) ON_COMMAND(ID_MENUITEM_OTHER, OnSelectOtherLib) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGJKWorkspace message handlers BOOL CGJKWorkspace::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); } void CGJKWorkspace::OnClose() { SaveStatus(); CAcUiDialog::OnClose(); } BOOL CGJKWorkspace::OnInitDialog() { CAcUiDialog::OnInitDialog(); m_ToolBar.m_pGjk = this; m_ToolBar.m_bIsGJK = TRUE; InitToolBar(); //add by xlc on 080829 if(m_nOpenMode == 1) { m_menu.LoadMenu(IDR_MENU_GJK2); } else { m_menu.LoadMenu(IDR_MENU_GJK); } SetMenu(&m_menu); if(m_nOpenMode != 1) { XStringList lstTkwItem; GetTchgjkAllItem(lstTkwItem); int nLenArray = lstTkwItem.Length(); for(int i=0;iAddString(LPCTSTR(csTkwItem)); } } 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); 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) { LoadStatus(); } 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; } } if(m_nOpenMode != 1) { CString str = GetFileNameByAllName(m_csCurTKWFile); CString sName; GetNameByTkwName(LPCTSTR(str),sName); m_ToolBar.m_pComboxCtrl->SetCurSel(m_ToolBar.m_pComboxCtrl->FindStringExact(-1,LPCTSTR(sName))); m_ToolBar.m_sCurSelect = sName; //add by xlc on 090728 添加图库动态菜单 AddDynMenu(TRUE); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } BOOL CGJKWorkspace::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); GetGjkwFileByMenu(csCommand, csTKWFullName); if(!csTKWFullName.IsEmpty() && FindFile(csTKWFullName)) { if (!m_pOpenMenu) { m_ToolBar.m_pComboxCtrl->SetCurSel(m_ToolBar.m_pComboxCtrl->FindStringExact(-1,LPCTSTR(csCommand))); m_ToolBar.m_sCurSelect = csCommand; } 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("打开gjk图库组文件")); SaveStatus(); LoadStatus(); return TRUE; } else if(!FindFile(csTKWFullName) && !csTKWFullName.IsEmpty()) MessageBox(_T("没有找到库文件!请确认安装是否完全。")); return CAcUiDialog::OnCommand(wParam, lParam); } void CGJKWorkspace::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 CGJKWorkspace::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 CGJKWorkspace::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 CGJKWorkspace::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 CGJKWorkspace::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 CGJKWorkspace::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 CGJKWorkspace::AddImage2Dwb(const TCHAR* szTKName, const TCHAR* szDrawing, BOOL bIsRebuild) { CString csTKName, csDrawing; csTKName = szTKName; csDrawing = szDrawing; PickSet ss(SS_FREE); Entity ent; CString sName = GetFileNameByAllName(szTKName); int rc; CTkwFile tkw(m_csCurTKWFile); if (sName == _T("Other")) { rc = SelectEntities(_T("\n选择组成构件的图元:"), ss,RBList(RTDXF0, _T("*"), NULL)); if(rc != RTNORM && !bIsRebuild) return RTERROR; else if(rc != RTNORM && bIsRebuild) { return RebuildSld(csTKName); } } else { while(1) { rc = SelectEntity(_T("\n选择组成构件的图元:"), ent, RBList(RTDXF0, LPCTSTR(tkw.m_csDxfCode),NULL)); if (rc == RTREJ) return RTERROR; if(rc != RTNORM && rc != RTCAN ) continue; if(rc != RTNORM && !bIsRebuild) return RTERROR; else if (rc == RTCAN) return RTCAN; else if(rc != RTNORM && bIsRebuild) { return RebuildSld(csTKName); } ss += ent; if (ss.Length() == 1) break; } } 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(1024), xsFullDwg(1024); BOOL bHide = FALSE; TCHAR dwgPrefix[1024]=_T(""); GetTempPath(1023, 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(1024); 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(1024); xsDwbFile << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".DWB"); XDrawingLib dwbMan(xsDwbFile); if(!dwbMan) { } else { dwbMan.Append(xsFullDwg); nRetCode=RTNORM; } _tremove(xsFullDwg); } MakeVisible(ssAll, true); } else { return RTERROR; } return RTNORM; } // 布局 void CGJKWorkspace::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 070919 void CGJKWorkspace::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 CGJKWorkspace::OnContextMenu(CWnd* pWnd, CPoint point) { if(m_ImageBox.m_bRMouseDown) { CMenu menu; menu.LoadMenu(IDR_MENU_IMAGELAYOUT1); if((m_nOpenMode == 0 || m_nOpenMode == 2) && 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 CGJKWorkspace::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 CGJKWorkspace::SaveStatus() { //modified by yujie 070511 //XString xsRoot, xsKey; //xsKey = _T("GJKMAN"); TCHAR xsKey[1024]=_T("GJKMAN"); XString xsRoot; _tcscat(xsRoot, GetRegLocation()); if(m_nOpenMode == 1) { _tcscat(xsRoot, _T("\\BLKMAN")); TCHAR szDrive[1024]=_T(""), szDir[1024]=_T(""), szFile[1024]=_T(""), szExt[1024]=_T(""); _tsplitpath(m_csCurTKWFile, szDrive, szDir, szFile, szExt); _tcscpy(xsKey, szFile); } CRegProperty regProp(xsRoot, xsKey); regProp.SetTopRootKey(HKEY_CURRENT_USER); regProp.SetValue(_T("GJKName"), m_csCurTKWFile); m_treeCtrl.GetNodeAllPath(m_treeCtrl.GetSelectedItem(), m_csLastTKName, m_csLastType); regProp.SetValue(_T("CurGJKName"), 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); // 列数 XStringList lstTkwItem; GetTchgjkAllItem(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 CGJKWorkspace::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 070919 void CGJKWorkspace::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 CGJKWorkspace::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 CGJKWorkspace::OnMouseMove(UINT nFlags, CPoint point) { //add by xlc on 070906 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 CGJKWorkspace::OnLButtonUp(UINT nFlags, CPoint point) { //modify by xlc on 070906 if (m_bDragging) { ReleaseCapture (); m_pDragImage->DragLeave (GetDesktopWindow ()); //结束拖拽 m_pDragImage->EndDrag (); delete m_pDragImage; CPoint pt (point); //当前鼠标坐标 ClientToScreen (&pt); CWnd* pDropWnd = WindowFromPoint (pt); ASSERT (pDropWnd); 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); 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 CGJKWorkspace::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 CGJKWorkspace::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 CGJKWorkspace::OnBeginlabeleditTkList(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; m_bLock = TRUE; *pResult = 0; } void CGJKWorkspace::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 CGJKWorkspace::ResetImage(BOOL bReservePage) { 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 CGJKWorkspace::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 CGJKWorkspace::IsLock() { if(m_bLock || m_treeCtrl.m_bLock || m_treeCtrl.m_bMerge) return TRUE; else return FALSE; } //**********************************TOOLBAR 命令*********************************************** // 弹出布局菜单 void CGJKWorkspace::OnToolbarDropDown(NMHDR * pnmtb0, LRESULT *plr) { NMTOOLBAR* pnmtb= (NMTOOLBAR *)pnmtb0; CTemporaryResourceOverride vTemp;//加载菜单 switch (pnmtb->iItem) { case ID_BLK_LAYOUT: OnBlkLayout(); break; //add by xlc on 070919 case ID_BLK_SORT: OnBlkSort(); break; default: return; } } //图块改名 void CGJKWorkspace::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 CGJKWorkspace::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_DESCRIPTZION, _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 CGJKWorkspace::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 0) { m_ImageBox.m_lstSelected.Append(new int(0)); m_ImageBox.SelectIndex(0); len = m_ImageBox.m_lstSelected.Length(); for(i=0;iSendMessage(TB_GETRECT, ID_BLK_LAYOUT, (LPARAM)&rc); pWnd->ClientToScreen(&rc); { CTemporaryResourceOverride vTemp;//加载菜单 menu.LoadMenu(IDR_MENU_IMAGELAYOUT1); } pPopup = menu.GetSubMenu(0); pPopupLayout = pPopup->GetSubMenu(8); pPopupLayout->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, rc.left, rc.bottom, this, &rc); } // 下一页 void CGJKWorkspace::OnBlkPagedown() { m_ImageBox.GoPage(m_ImageBox.CurPage() + 1); UINT nEndPos = m_vsBar.GetScrollPos(); nEndPos += m_nPageRow; m_vsBar.SetScrollPos(nEndPos); ResetStateText(); } // 上一页 void CGJKWorkspace::OnBlkPageup() { m_ImageBox.GoPage(m_ImageBox.CurPage() - 1); UINT nEndPos = m_vsBar.GetScrollPos(); nEndPos -= m_nPageRow; m_vsBar.SetScrollPos(nEndPos); ResetStateText(); } // 新图入库 void CGJKWorkspace::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; } XString xsDwbPath(1024); if(!m_ImageBox.m_bIsJpgShow) xsDwbPath << GetPathNameByAllName(csCurTKName) << GetFileNameByAllName(csCurTKName) << _T(".DWB"); TCHAR xsRet[1024]=_T(""); if(GetNextDrawing(csCurTKName, xsRet)!=RTNORM) { return; } HideDialog(TRUE); int num = m_ImageBox.CurImage(),num2 = 0; if(AddImage2Dwb(csCurTKName, CString((const TCHAR*)xsRet)) == RTNORM) { CodeBase db; XDbfTable *pTable = db.Open(csCurTKName); if(!pTable) { AfxMessageBox(_T("TK文件只读或损坏!")); return; } for (pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()) { CString sTemp; GET_FIELD(pTable,_T("kind"),sTemp); if (sTemp == csCurType) num2++; } pTable->AppendBegin(); SET_FIELD(pTable, _T("kind"), (const TCHAR*)csCurType); // modify bt xlc on 080819 新入库的图块名为XX*YY格式 double width(0),high(0); XString xsBlockName(1024); xsBlockName << GetPathNameByAllName(csCurTKName) << GetFileNameByAllName(csCurTKName) << _T("(")<AppendEnd(); } HideDialog(FALSE); ResetImage(); if (num2 > 0) { if (m_treeCtrl.GetParentItem(m_treeCtrl.GetSelectedItem()) == m_treeCtrl.GetRootItem()) { m_ImageBox.m_lstSelected.Append(new int(num2)); m_ImageBox.SelectIndex(num2); } else { m_ImageBox.m_lstSelected.Append(new int(num2 - 1)); m_ImageBox.SelectIndex(num2 - 1); } } else { m_ImageBox.m_lstSelected.Append(new int(num)); m_ImageBox.SelectIndex(num); } int len = m_ImageBox.m_lstSelected.Length(); for(int i=0;icsDrawing; XString xsFullSld(1024), xsFullDwg(1024); BOOL bHide = FALSE; TCHAR dwgPrefix[1024]=_T(""); GetTempPath(1023, dwgPrefix); if(dwgPrefix[_tcslen(dwgPrefix)-1]!=_T('\\')) _tcscat(dwgPrefix, _T("\\")); _tcscat(dwgPrefix, _T("SRTEMP\\")); MakeDir(dwgPrefix); { xsFullSld << dwgPrefix << xsDrawing << _T(".sld"); xsFullDwg << dwgPrefix << xsDrawing << _T(".dwg"); while(1) { const TCHAR *szPrompt=_T("\n制作幻灯片(请用zoom调整合适)或 [消隐(H)/不制作返回(X)]<制作>:"); XString sKeyword; int nRet = 0; INITGET_BEG(0, _T("H X")); nRet = ads_getkword(szPrompt, sKeyword); INITGET_END(); if(nRet == RTNONE) break; if(sKeyword[0]==_T('H')) { bHide = TRUE; } else { return RTERROR; } } if(bHide) { 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(1024); xsSlbFile << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".SLB"); XSlideLib slbMan(xsSlbFile); if(!slbMan) return RTERROR; slbMan.Append(xsFullSld); _tremove(xsFullSld); } return RTNONE; } int CGJKWorkspace::AddImage2DwbForBlkRebuild(const TCHAR* szTKName,const TCHAR* szDrawing,BOOL bIsRebuild) { CString csTKName, csDrawing; csTKName = szTKName; csDrawing = szDrawing; PickSet ss(SS_FREE); Entity ent; CString sName = GetFileNameByAllName(szTKName); int rc; CTkwFile tkw(m_csCurTKWFile); if (sName == _T("Other")) { rc = SelectEntities(_T("\n选择构成构件的图元<只重制幻灯片>:"), ss,RBList(RTDXF0, _T("*"), NULL)); if(rc != RTNORM && !bIsRebuild) return RTERROR; else if(rc != RTNORM && bIsRebuild) { return RebuildSld(csTKName); } } else { while(1) { rc = SelectEntity(_T("\n选择构成构件的图元<只重制幻灯片>:"), ent, RBList(RTDXF0, _T("*"),NULL)); if (rc == RTCAN) return RTCAN; else if(rc == RTNORM && ent.name[0] && ent.name[1]) { if (ent.MatchBase(RBList(RTDXF0, LPCTSTR(tkw.m_csDxfCode),NULL))) { ss += ent; break; } else { acutPrintf(_T("已过滤")); continue; } } 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(1024), xsFullDwg(1024); BOOL bHide = FALSE; BOOL bDelete = TRUE; TCHAR dwgPrefix[1024]=_T(""); GetTempPath(1023, 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(1024); 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(1024); 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(1024); 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; } void CGJKWorkspace::OnBlkRebuild() { if(IsLock()) return; if(m_ImageBox.m_lstSelected.Length() != 1) { MessageBox(_T("请选中某一构件,再进行重新制作!")); return; } int num = m_ImageBox.CurImage(); //add by xlc on 090514 点击类型新图入库ESC退出后重置时崩溃 if(num<0) { MessageBox(_T("请选中某一构件,再进行重新制作!")); return; } 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); AddImage2DwbForBlkRebuild(csCurTKName, LPCTSTR(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 CGJKWorkspace::OnTkPopupDel() //删除类别 { OnBlkDelkind(); } /////////////////////////////////// 右键菜单 命令结束 ////////////////////////////////////////////////// void CGJKWorkspace::OnOK() { if(m_nOpenMode == 0 || m_nOpenMode == 2) { SaveStatus(); if(m_ImageBox.m_lstSelected.Length() != 1) { AfxMessageBox(_T("请选择一构件!")); return; } int sel = *m_ImageBox.m_lstSelected[0]; TKStruct *cur = m_ImageBox.m_lstBlk[sel]; HideDialog(TRUE); 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[1024]=_T(""), szDir[1024]=_T(""), szFile[1024]=_T(""), szExt[1024]=_T(""); _tsplitpath(m_csLastTKName, szDrive, szDir, szFile, szExt); m_csRet = CString(szFile) + _T("(") + cur.csDrawing+ _T(")"); } } CAcUiDialog::OnOK(); } void CGJKWorkspace::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 ReplaceBlk(cur->csTKFile, cur->csDrawing); } AcDbObjectId GetBlkRecordIdByName(const TCHAR* szBlkName); //TARCH_IMPEXP AcDbObjectId MakeBlockInsert(const TCHAR *pszBlock, XPoint ptInsert, // double sx, double sy, double sz, double rot); //add by cwk int LoadDwbEntity(const TCHAR *sDwbFile,const TCHAR *csDrawing,TCHAR *sBlockName, AcDbVoidPtrArray &allEntites) { if(LoadDwbBlock(sDwbFile, csDrawing, sBlockName) == RTNORM) { AcDbDatabase *pDatabase = acdbHostApplicationServices()->workingDatabase(); AcDbBlockTable *pBlkTable = NULL; pDatabase->getBlockTable(pBlkTable,AcDb::kForRead); if(pBlkTable!=NULL) { AcDbBlockTableRecord *pBlkTableRec = NULL; pBlkTable->getAt(sBlockName,pBlkTableRec,AcDb::kForRead); pBlkTable->close(); if(pBlkTableRec!=NULL) { AcDbBlockTableRecordIterator *pBlkTableRecIte = NULL; pBlkTableRec->newIterator(pBlkTableRecIte); if(pBlkTableRecIte!=NULL) { for (pBlkTableRecIte->start();!pBlkTableRecIte->done();pBlkTableRecIte->step()) { AcDbEntity *pEnt = NULL; pBlkTableRecIte->getEntity(pEnt,AcDb::kForRead); if(pEnt != NULL) { AcDbObject *pNew=(AcDbObject*)pEnt->clone(); pEnt->close(); allEntites.append(pNew); TEntityBase *pTEnt=TEntityBase::Cast(pNew); if(pTEnt!=NULL) pTEnt->SetPScale(DocGetPScale());//设为当前比例,071024 } } delete pBlkTableRecIte; } //删除块记录 if (pBlkTableRec->upgradeOpen() == Acad::eOk) pBlkTableRec->erase(); pBlkTableRec->close(); } } } else { return RTERROR; } return RTNORM; } //extern GEOAPI int DragPickSet(PickSet &ss, XPoint &ptBase); extern TARCH_IMPEXP int DragMovePickSet(PickSet &ss, const char *pszPrompt, const XPoint &ptBase, XPoint &ptFinal); BOOL CGJKWorkspace::InsertBlock(const TCHAR* szTKName, const TCHAR* szDrawing) { CString csTKName, csDrawing; csTKName = szTKName; csDrawing = szDrawing; XString xsDwbPath(1024), blkName(1024), xsDwbPath2d, blkName2d(1024); AcDbObjectId id2d(NULL), id3d(NULL); TCHAR drive[1024]=_T(""), dir[1024]=_T(""), file[1024], ext[1024]; _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"); } AcDbVoidPtrArray allEntites; if(!XSymbolTable(_T("BLOCK"), blkName)) { LAB: if(LoadDwbEntity(xsDwbPath, LPCTSTR(csDrawing), blkName,allEntites) != 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; { XPoint pt; PickSet ss(SS_FREE); ss.IncludeBegin(); for (int i = 0;i < allEntites.length();i++) { AcDbEntity *pEnt = (AcDbEntity*)(allEntites[i]); AddToModelSpace(pEnt,Adesk::kTrue); } ss.IncludeEnd(); nRet = DragPickSet(ss,pt); if (nRet == RTNORM) { ss.Redraw(1); goto LAB; } else ss.Erase(); } return (nRet==IBF_RESEL)? TRUE : FALSE; } extern AcDbObjectId GetRepBlkId(const TCHAR* szTKName, const TCHAR* szDrawing, BOOL m_bIsJpgShow); BOOL CGJKWorkspace::ReplaceBlk(const TCHAR* szTKName, const TCHAR* szDrawing) { CString csTKName, csDrawing; csTKName = szTKName; csDrawing = szDrawing; TCHAR drive[1024]=_T(""), dir[1024]=_T(""), file[1024], ext[1024]; _tsplitpath(csTKName, drive, dir, file, ext); XString xsDwbPath(1024), blkName(1024); _stprintf(blkName, _T("$%s$%s"), file, (const TCHAR *)csDrawing); xsDwbPath << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".DWB"); AcDbVoidPtrArray allEntites; if(LoadDwbEntity(xsDwbPath, LPCTSTR(csDrawing), blkName,allEntites) != RTNORM) { ads_printf(_T("\n内部错误:无法找到并提取构件%s!"),blkName); return FALSE; } CGJKReplaceOption dlg(acedGetAcadFrame()); const TCHAR *szFormat= _T("%s(%s)"); dlg.m_sSldFile <SetFocus(); CTkwFile tkw(m_csCurTKWFile); CString str = tkw.m_csDxfCode; RBList mask(RTDXF0, LPCTSTR(str), NULL); PickSet ss(SS_FREE); adsout << _T("\n选择图中将要被替换的构件!"); int nRetCode=ss.Get(NULL, NULL, NULL, mask); if(nRetCode==RTNORM) { if (dlg.m_bModify) { CString csTKName, csDrawing; csTKName = dlg.m_sTKName; csDrawing = dlg.m_sDrawing; TCHAR drive[1024]=_T(""), dir[1024]=_T(""), file[1024], ext[1024]; _tsplitpath(csTKName, drive, dir, file, ext); XString xsDwbPath, blkName(1024); _stprintf(blkName, _T("$%s$%s"), file, (const TCHAR *)csDrawing); xsDwbPath << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".DWB"); allEntites.removeSubArray(0,allEntites.length() -1); if(LoadDwbEntity(xsDwbPath, LPCTSTR(csDrawing), blkName,allEntites) != RTNORM) { ads_printf(_T("\n内部错误:无法找到并提取构件%s!"),blkName); return FALSE; } } long lCount=ss.Length(); for(long j=0L; j= 1) pEnt = (AcDbEntity*)(allEntites[0]); XDbObject obj(ent1.name, AcDb::kForWrite); AcDbEntity *pEnt2 = (AcDbEntity*)obj.m_pObject; TEntityBase* pTchEnt = TEntityBase::Cast(pEnt); TEntityBase* pTchEnt2 = TEntityBase::Cast(pEnt2); if (pTchEnt != NULL && pTchEnt2 != NULL && pEnt->isA()==pEnt2->isA()) pTchEnt2->CopyPropertiesFrom(pEnt,256); obj.Close(); } } dlg.DestroyWindow(); return TRUE; } // add by xlc on 070906 HCURSOR CGJKWorkspace::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } // add by xlc on 070906 void CGJKWorkspace::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[1024]; LVITEM lviT; ZeroMemory(&lviT, sizeof (LVITEM)); lviT.mask = LVIF_TEXT; lviT.pszText = szLabel; lviT.cchTextMax = 1023; lvItem lvi; lvi.plvi = &lviT; lvi.plvi->mask = LVIF_TEXT; lvi.plvi->pszText = szLabel; lvi.plvi->cchTextMax = 1023; 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 070906 void CGJKWorkspace::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList) { if(pDragList == NULL|| pDropList==NULL) return; pDropList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED); TCHAR szLabel[1024]; LVITEM lviT; LVITEM* plvitem; ZeroMemory(&lviT, sizeof (LVITEM)); lviT.iItem = m_nDragIndex; lviT.mask = LVIF_TEXT; lviT.pszText = szLabel; lviT.cchTextMax = 1023; lvItem* pItem; lvItem lvi; lvi.plvi = &lviT; lvi.plvi->iItem = m_nDragIndex; lvi.plvi->mask = LVIF_TEXT; lvi.plvi->pszText = szLabel; lvi.plvi->cchTextMax = 1023; 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 //多行 { CList listItems; POSITION listPos; 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[1024]; pItem->plvi->cchTextMax = 1023; 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--; } } listPos = listItems.GetHeadPosition(); while(listPos) { pItem = listItems.GetNext(listPos); 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 070906 void CGJKWorkspace::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[1024]; LVITEM lviT; ZeroMemory(&lviT, sizeof (LVITEM)); //allocate and clear memory space for LV_ITEM lviT.mask = LVIF_TEXT; lviT.pszText = szLabel; lviT.cchTextMax = 1023; lvItem lvi; lvi.plvi = &lviT; lvi.plvi->mask = LVIF_TEXT; lvi.plvi->pszText = szLabel; lvi.plvi->cchTextMax = 1023; 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 CGJKWorkspace::ModifyDatabaseFile() { //将改动写入数据库 CString sKind, sItem, sDrawing; //类别,名称,内部图名 CodeBase db; db.read_only = 0; 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 080827 void CGJKWorkspace::OpenFileByMenu(CString csCommand) { CString csTKWFullName; GetGjkwFileByMenu(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 CGJKWorkspace::OnSelectOpeningLib() { m_ToolBar.m_pComboxCtrl->SetCurSel(0); OpenFileByMenu(CString(_T("门窗"))); } void CGJKWorkspace::OnSelectColLib() { m_ToolBar.m_pComboxCtrl->SetCurSel(1); OpenFileByMenu(CString(_T("柱子"))); } void CGJKWorkspace::OnSelectStairLib() { m_ToolBar.m_pComboxCtrl->SetCurSel(2); OpenFileByMenu(CString(_T("楼梯"))); } void CGJKWorkspace::OnSelectBalLib() { m_ToolBar.m_pComboxCtrl->SetCurSel(3); OpenFileByMenu(CString(_T("阳台"))); } void CGJKWorkspace::OnSelectStepLib() { m_ToolBar.m_pComboxCtrl->SetCurSel(4); OpenFileByMenu(CString(_T("台阶"))); } void CGJKWorkspace::OnSelectSheetLib() { m_ToolBar.m_pComboxCtrl->SetCurSel(5); OpenFileByMenu(CString(_T("表格"))); } void CGJKWorkspace::OnSelectOtherLib() { m_ToolBar.m_pComboxCtrl->SetCurSel(6); OpenFileByMenu(CString(_T("其它"))); } void CGJKWorkspace::AddDynMenu(BOOL bCreate//[in]是否创建 ) { if(bCreate) { m_cMenu.CreatePopupMenu(); GetMenu()->InsertMenu(0,MF_BYPOSITION | MF_POPUP,(UINT_PTR)m_cMenu.m_hMenu,_T("图库")); } else { m_cMenu.DestroyMenu(); m_cMenu.CreatePopupMenu(); GetMenu()->ModifyMenu(0,MF_BYPOSITION | MF_POPUP,(UINT_PTR)m_cMenu.m_hMenu,_T("图库")); } int i, nLenArray; UINT MenuID; XStringList lstTkwItem; MenuID = OpenMenuID; GetTchgjkAllItem(lstTkwItem); nLenArray = lstTkwItem.Length(); for(i=0;i