#include "StdAfx.h" #include "stdarx.h" #include "resource.h" #include "MyListView.h" #include"blockdrag.h" #include"dbsymtb.h " #include"dropTarget.h" #include "AddBlockDlg.h" #include "dockDialog.h" #include "ChildFrame.h" #include "RnameBlkDlg.h" #include "dbents.h " #include "dbidmap.h" #include "geassign.h" #include "DockPane.h" #include"inserttypedlg.h" extern CDockPane *g_pDockPane; extern CString g_sDwgPathName; CString g_strInsertDwgPath; CString g_strInsertBlockName; AcDbObjectId g_BlockId; double g_dBlockScale; double g_dAngle; CString g_sLayerName; BOOL acedStartOverrideDropTarget(COleDropTarget *pTarget); BOOL acedEndOverrideDropTarget(COleDropTarget *pTarget); BOOL acedAddDropTarget(COleDropTarget *pTarget); BOOL acedRemoveDropTarget(COleDropTarget *pTarget); IMPLEMENT_DYNCREATE(CMyListView, CListView) CMyListView::CMyListView() { CString sBmpPath = FilePath::GetRootDir() + _T("\\BMP\\SHHY.bmp"); HBITMAP hBit = (HBITMAP)LoadImage(NULL, sBmpPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE); if (hBit != NULL) m_bitmap.Attach(hBit); m_bDown = FALSE; m_bMove = FALSE; m_sRcdName = _T(""); m_nMenuType = 0; m_bColor = FALSE; m_nSelected = -1; m_nRcolor = 237; m_nGcolor = 26; m_nBcolor = 59; m_bTracking = FALSE; m_dBlockScale = 1; m_Listdrag = NULL; } CMyListView::~CMyListView() { m_Bitmap.DeleteObject(); } BEGIN_MESSAGE_MAP(CMyListView, CListView) //{{AFX_MSG_MAP(CMyListView) ON_WM_ERASEBKGND() ON_COMMAND(ID_INSERT, OnInSertBlock) ON_COMMAND(ID_ACADINSERT, OnAcadInSertBlock) ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBegindrag) ON_WM_DROPFILES() ON_WM_LBUTTONDBLCLK() ON_WM_MOUSEMOVE() ON_COMMAND(IDC_DELETEBLOCK, OnDeleteblock) ON_COMMAND(ID_ADDBLOCKMENU, OnAddblockmenu) ON_COMMAND(ID_BLOCKCOMMAND, OnBlockcommand) ON_WM_NCMOUSEMOVE() ON_COMMAND(ID_PREVIEW, OnPreview) ON_COMMAND(ID_MENUITEMFIRST, OnMenuitemfirst) ON_COMMAND(ID_MENUITEMFOUR, OnMenuitemfour) ON_COMMAND(ID_MENUITEMSECOND, OnMenuitemsecond) ON_COMMAND(ID_MENUITEMTREE, OnMenuitemtree) ON_UPDATE_COMMAND_UI(ID_MENUITEMFIRST, OnUpdateMenuitemfirst) ON_UPDATE_COMMAND_UI(ID_MENUITEMSECOND, OnUpdateMenuitemsecond) ON_UPDATE_COMMAND_UI(ID_MENUITEMTREE, OnUpdateMenuitemtree) ON_UPDATE_COMMAND_UI(ID_MENUITEMFOUR, OnUpdateMenuitemfour) ON_UPDATE_COMMAND_UI(ID_BIGICON, OnUpdateMenuitemfirst) ON_UPDATE_COMMAND_UI(ID_SMALLICON, OnUpdateMenuitemsecond) ON_UPDATE_COMMAND_UI(ID_LISTICON, OnUpdateMenuitemtree) ON_UPDATE_COMMAND_UI(ID_REPORTICON, OnUpdateMenuitemfour) ON_COMMAND(ID_BIGICON, OnMenuitemfirst) ON_COMMAND(ID_SMALLICON, OnMenuitemsecond) ON_COMMAND(ID_LISTICON, OnMenuitemtree) ON_COMMAND(ID_REPORTICON, OnMenuitemfour) ON_WM_VSCROLL() ON_COMMAND(IDM_RENAMEBLOCK, OnRenameblock) ON_COMMAND(ID_SELECTALL, OnSelectAll) ON_COMMAND(IDM_STEAD, OnInstead) ON_COMMAND(ID_BLOCFILE, OnBlocfile) ON_COMMAND(ID_BLOCKBYCURDB, OnBlockbycurdb) ON_COMMAND(ID_IMPORTCUR, OnImportCur) ON_COMMAND(ID_UPDATETB, OnUpdatetb) ON_WM_RBUTTONDOWN() ON_WM_CONTEXTMENU() ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) ON_NOTIFY_REFLECT(NM_CLICK, OnClick) ON_WM_INITMENUPOPUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() void CMyListView::OnDraw(CDC *pDC) { CDocument *pDoc = GetDocument(); } #ifdef _DEBUG void CMyListView::AssertValid() const { CListView::AssertValid(); } void CMyListView::Dump(CDumpContext &dc) const { CListView::Dump(dc); } #endif BOOL CMyListView::OnEraseBkgnd(CDC *pDC) { return CListView::OnEraseBkgnd(pDC); CRect rect; GetClientRect(&rect); CBrush brush(RGB(255, 255, 255)); CBrush *pOldBrush = pDC->SelectObject(&brush); pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); pDC->SelectObject(pOldBrush); brush.DeleteObject(); return TRUE; CDC dcimage; if (!dcimage.CreateCompatibleDC(pDC)) return TRUE; BITMAP bm; m_bitmap.GetBitmap(&bm); CBitmap *pOldBitmap = dcimage.SelectObject(&m_bitmap); pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcimage, 0, 0, SRCCOPY); dcimage.SelectObject(pOldBitmap); return TRUE; } BOOL CMyListView::PreCreateWindow(CREATESTRUCT &cs) { if (!CListView::PreCreateWindow(cs)) return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; cs.style |= LVS_SHOWSELALWAYS|LVS_AUTOARRANGE;//LVS_SHOWSELALWAYS return TRUE; } void CMyListView::OnInitialUpdate() { CListView::OnInitialUpdate(); } void CMyListView::InSertBlock() { if (acedGetAcadDwgView()!=NULL) acedGetAcadDwgView()->SetFocus(); //设置CAD焦点 AcDbObjectId BlockId; CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); g_strInsertDwgPath = pDlg1->m_sDwgPath; g_strInsertBlockName = m_sRcdName; // pDlg1->getPreviewCtrl().ViewBlock(pDlg1->m_sDwgPath,m_sRcdName); BaseFuncs::ClearAcadCmdLine(); // BlockId=pDlg1->getPreviewCtrl().m_RcdId; double dAngle = 0; g_BlockId = BlockId; g_dBlockScale = 1; g_dAngle = dAngle; //acedGetAcadFrame()->ShowControlBar(g_pDockPane,FALSE,FALSE); Showtkcsdlg(TRUE); BaseFuncs::CAD_SendStringToExecute(_T("tk_draw"), TRUE); // SetBlockScale(pDlg1->m_sDwgPath,m_sRcdName,m_dBlockScale); } void CMyListView::OnInSertBlock() //自己的方式插块 { InSertBlock(); } void CMyListView::OnAcadInSertBlock() //CAD方式插块 { CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); AcDbObjectId BlockId; acDocManagerPtr()->lockDocument(curDoc()); BaseFuncs::InSertBlockFromDwgToCurDb(pDlg1->m_sDwgPath, m_sRcdName, BlockId); acDocManagerPtr()->unlockDocument(curDoc()); // acedGetAcadDwgView()->SetFocus(); // 获得CAD焦点 CString sCommand = _T("-insert ")+m_sRcdName+_T(" "); BaseFuncs::CAD_SendStringToExecute(sCommand, TRUE); } void GetRecordContents(AcDbObjectId RcdId, char *scontent) { } void CMyListView::OnPreview() //设置图块预览 { } void CMyListView::OnBegindrag(NMHDR *pNMHDR, LRESULT *pResult) { CString sCurParentText; CString sCurSltText; if (acedGetAcadDwgView()==NULL) return; CString sRcdName; NM_LISTVIEW *pNMListView = (NM_LISTVIEW *)pNMHDR; // TODO: Add your control notification handler code here m_nSelected = pNMListView->iItem; int nIndexClr = 256; if (m_nSelected>=0) { CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); int nType = 0; sRcdName = GetListCtrl().GetItemText(m_nSelected, 0); sCurParentText = pDlg1->getTreeCtrl().m_sCurParentText; sCurSltText = pDlg1->getTreeCtrl().m_sCurSltText; if (_tcscmp(sCurParentText, _T("填充库"))==0) { if (_tcscmp(sCurSltText, _T("真彩填充"))==0) { m_bColor = TRUE; CString sTreePath; BaseFuncs::GetPathName(sTreePath); sTreePath += _T("\\tk\\Customer\\图库中心\\填充库\\颜色索引.txt"); BaseFuncs::GetColorIndex(sTreePath, sRcdName, m_nRcolor, m_nGcolor, m_nBcolor); AcCmColor color; color.setRGB(m_nRcolor, m_nGcolor, m_nBcolor); nIndexClr = color.colorIndex(); nType = 1; } else { nType = 2; } } CString sCommand; if (BaseFuncs::GetBlockCommand(pDlg1->m_sDwgPath, sRcdName, sCommand)) { sCommand.TrimLeft(); sCommand.TrimRight(); BaseFuncs::CAD_SendStringToExecute(sCommand, TRUE); *pResult = 0; return; } double dScale = 1; AcDbObjectId BlockId;//=pDlg1->pBlockView->mPreviewCtrl.m_RcdId; if (nType==0) { // GetBlockScale(pDlg1->m_sDwgPath,sRcdName,dScale); BaseFuncs::InSertBlockFromDwgToCurDb(pDlg1->m_sDwgPath, sRcdName, BlockId); } TCHAR cValue[256]; CString sDefautStr; CString strPathName; BaseFuncs::GetPathName(strPathName); strPathName += _T("\\tk\\Customer\\图库中心"); CString strSubPath = pDlg1->m_sDwgPath; CString subPath(strSubPath), pathName(strPathName); subPath.MakeUpper(); pathName.MakeUpper(); if (subPath.Find(pathName, 0)>=0) subPath = subPath.Right(subPath.GetLength()-pathName.GetLength()); GetPrivateProfileString(subPath, sRcdName, sDefautStr, cValue, 256, pathName+_T("\\dwglib.ini")); CStringArray strArr; BaseFuncs::JxString(cValue, _T(","), strArr); BOOL bAutoScale = FALSE; BOOL bAutoExplode = FALSE; BOOL bMM = FALSE; if (strArr.GetSize()==3) { bMM = _ttoi(strArr[0]); bAutoScale = _ttoi(strArr[1]); bAutoExplode = _ttoi(strArr[2]); } if (!bMM) //图块的原始单位是米 { if (BaseFuncs::IsMMUnitForDwg()) //毫米 dScale = 1000.0; } else { if (!BaseFuncs::IsMMUnitForDwg())//米 dScale = 0.001; } if (bAutoScale) { if (!BaseFuncs::IsMMUnitForDwg())//米 { dScale = dScale; } else { dScale = dScale/1000.0; } } COleDataSource *pSource = new COleDataSource;//generateDataSource(objType, CRect(CPoint(0,0), CSize(m_sliderVal, m_sliderVal ))); CMyOverrideDropTarget myDT(nType, BlockId, nIndexClr, m_sRcdName, dScale, bAutoExplode); COleDropSource myDS; if (!acedStartOverrideDropTarget(&myDT)) TRACE("Error in overriding Custom drop target!\n"); //DROPEFFECT dwEffect = pSource->DoDragDrop( DROPEFFECT_MOVE , NULL, &myDS); DROPEFFECT dwEffect = pSource->DoDragDrop(DROPEFFECT_NONE |DROPEFFECT_MOVE | DROPEFFECT_COPY, NULL, &myDS); if (!acedEndOverrideDropTarget(&myDT)) TRACE("Error in end1 0 0 1 1ing override drop target\n"); delete pSource; /// m_bMove=TRUE; // m_bDown=FALSE; } *pResult = 0; } void CMyListView::OnDropFiles(HDROP hDropInfo) { // TODO: Add your message handler code here and/or call default CListView::OnDropFiles(hDropInfo); } void CMyListView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default // CListView::OnLButtonDblClk(nFlags,point); if (acedGetAcadDwgView()==NULL) { // CListView::OnLButtonDblClk(nFlags,point); return; } CString sCurParentText; CString sCurSltText; m_bDown = FALSE; AcDbObjectId BlockId; CString sRcdName; AcDbBlockTableRecord *pRcd = NULL; CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); sCurParentText = pDlg1->getTreeCtrl().m_sCurParentText; sCurSltText = pDlg1->getTreeCtrl().m_sCurSltText; int nSelected = GetListCtrl().HitTest(point, &nFlags); if (nSelected<0) { CListView::OnLButtonDblClk(nFlags, point); return; } BaseFuncs::ClearAcadCmdLine(); acedGetAcadDwgView()->SetFocus(); // acedGetAcadFrame()->ShowControlBar(g_pDockPane,FALSE,TRUE); sRcdName = GetListCtrl().GetItemText(nSelected, 0); ///modify by hrp CString sCommand; g_sLayerName = sCurParentText; //if(!GetBlockCommand(pDlg1->m_sDwgPath,sRcdName,sCommand)) { g_strInsertDwgPath = pDlg1->m_sDwgPath; g_strInsertBlockName = sRcdName; m_dBlockScale = 1; double dAngle = 0; g_BlockId = BlockId; g_dBlockScale = m_dBlockScale; g_dAngle = dAngle; Showtkcsdlg(TRUE); BaseFuncs::CAD_SendStringToExecute(_T("tk_draw"), TRUE); } /*else { sCommand.TrimLeft(); sCommand.TrimRight(); CAD_SendStringToExecute(sCommand,TRUE); }*/ CListView::OnLButtonDblClk(nFlags, point); } void CMyListView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if (!m_bTracking) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE | TME_HOVER; tme.dwHoverTime = 1; m_bTracking = _TrackMouseEvent(&tme); } CListView::OnMouseMove(nFlags, point); } LRESULT CMyListView::OnMouseLeave(WPARAM wParam, LPARAM lParam) { m_bTracking = FALSE; if (acedGetAcadDwgView()!=NULL) acedGetAcadDwgView()->SetFocus(); return 0; } BOOL CMyListView::DestroyWindow() { return CListView::DestroyWindow(); } void CMyListView::DeleteBlockArryBtwDwg(CStringArray &sBlockArr) { // 清除所有的图形 CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); int nLength = GetListCtrl().GetItemCount()-(int)sBlockArr.GetSize(); // GetListCtrl().DeleteAllItems(); // m_ListImageDesc.DeleteImageList(); Acad::ErrorStatus es; // m_ListImageDesc.Create(32, 32, ILC_MASK, nLength, 0); acDocManagerPtr()->lockDocument(curDoc()); AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse); #if ARX < 19 pDb->readDwgFile(pDlg1->m_sDwgPath, SH_DENYNO); #else pDb->readDwgFile(pDlg1->m_sDwgPath, AcDbDatabase::kForReadAndAllShare); #endif CStringArray strNameArray; AcDbBlockTableRecord *pDescTblRcd = NULL; AcDbBlockTableIterator *pBlkItr = NULL; AcDbBlockTable *pDesdTbl; if ((es = pDb->getBlockTable(pDesdTbl, AcDb::kForRead))!=Acad::eOk) { delete pDb; acDocManagerPtr()->unlockDocument(curDoc()); return; } int nLen = 0; for (nLen = 0; nLengetAt(sBlockArr.GetAt(nLen), pDescTblRcd, AcDb::kForWrite)==Acad::eOk) { Acad::ErrorStatus es = pDescTblRcd->erase(); pDescTblRcd->close(); pDescTblRcd = NULL; } } pDesdTbl->newIterator(pBlkItr); pDesdTbl->close(); pDesdTbl = NULL; acDocManagerPtr()->unlockDocument(curDoc()); for (int nLen = 0; nLenoriginalFileVersion(); es = pDb->saveAs(pDlg1->m_sDwgPath, false, dwgVer); delete pDb; } void CMyListView::DeleteBlock() { BaseFuncs::ClearAcadCmdLine(); if (AfxMessageBox(_T("确定要删除该块吗"), MB_OK|MB_OKCANCEL)==IDCANCEL) return; CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); CString sBlockName; POSITION pos = GetListCtrl().GetFirstSelectedItemPosition(); if (pos == NULL) TRACE0(_T("No items were selected!\n")); else { CStringArray sBlockArr; while (pos) { int nItem = GetListCtrl().GetNextSelectedItem(pos); sBlockName = GetListCtrl().GetItemText(nItem, 0); sBlockArr.Add(sBlockName); } pDlg1->getPreviewCtrl().ReleaseDb();//modify by hrp 2010 9-30 DeleteBlockArryBtwDwg(sBlockArr); } } void CMyListView::OnDeleteblock() { DeleteBlock(); } void CMyListView::OnAddblockmenu() { // TODO: Add your command handler code here AcDbObjectId BlfId; acedInitGet(0, _T("D")); CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); CString sOrgDwg; CString sDescDwg; sDescDwg = pDlg1->m_sDwgPath; CFileFind filefind; if (!filefind.FindFile(sDescDwg)) { AfxMessageBox(_T("未指定当前Dwg文件")); filefind.Close(); return; } filefind.Close(); // TODO: Add your command handler code here CFileDialog fileDia(TRUE, NULL, _T(""), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("dwg文件(*dwg)|*.dwg|")); if (fileDia.DoModal()!=IDOK) return; sOrgDwg = fileDia.GetPathName(); CAddBlockDlg AddDlg; AddDlg.SetOrgPath(sOrgDwg); AddDlg.SetDescPath(sDescDwg); if (AddDlg.DoModal()!=IDOK) return; //return ; GetListCtrl().DeleteAllItems(); pDlg1->getPreviewCtrl().ReleaseDb(); pDlg1->AddItemToListCtrl(sDescDwg); GetListCtrl().RedrawWindow(); BaseFuncs::ClearAcadCmdLine(); } CString g_sDescDwg; AcDbObjectIdArray g_BlockIds; void CMyListView::OnImportCur() { AcDbObjectId BlfId; acedInitGet(0, _T("D")); CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); CString sOrgDwg; CString sDescDwg; sDescDwg = pDlg1->m_sDwgPath; CFileFind filefind; if (!filefind.FindFile(sDescDwg)) { AfxMessageBox(_T("未指定当前Dwg文件")); return; } // TODO: Add your command handler code here /* CAddBlockDlg AddDlg; AddDlg.SetOrgPath(sOrgDwg); AddDlg.m_bAddCur=TRUE; AddDlg.SetDescPath(sDescDwg); if(AddDlg.DoModal()!=IDOK) return;*/ AcDbObjectIdArray BlfIds; TCHAR selPrompt[] = _T("\n选择图中块对象:"); TCHAR selError[] = _T("选择错误,请重新选择!"); TCHAR *prompt[2]; prompt[0] = selPrompt; prompt[1] = selError; ads_name ssName; acedGetAcadDwgView()->SetFocus(); //acedGetAcadFrame()->ShowControlBar(g_pDockPane, FALSE, FALSE); resbuf *pRb = acutBuildList(RTDXF0, _T("INSERT"), 0); if (acedSSGet(_T(":$"), prompt, NULL, pRb, ssName) != RTNORM) { // acedGetAcadFrame()->ShowControlBar(g_pDockPane, TRUE, FALSE); acutRelRb(pRb); return; } BaseFuncs::SSToIds(ssName, BlfIds); acedSSFree(ssName); acutRelRb(pRb); AcDbObjectIdArray BlockIds; CStringArray strArr; BaseFuncs::dist_blkrcd_getbyRef(BlfIds, BlockIds, strArr); // acedGetAcadFrame()->ShowControlBar(g_pDockPane, TRUE, FALSE); if (BlockIds.logicalLength()<1)return; pDlg1->getPreviewCtrl().ReleaseDb(); /* if(curDoc()!=NULL) acDocManager->sendStringToExecute(curDoc(),_T("blockIcon *\r\n")); ::SendMessage(acedGetAcadTextCmdLine()->m_hWnd, WM_CHAR, VK_RETURN, 0);*/ g_sDescDwg = sDescDwg; g_BlockIds.setLogicalLength(0); g_BlockIds.append(BlockIds); BaseFuncs::CAD_SendStringToExecute(_T("tk_shup"), TRUE); } void CMyListView::OnBlockcommand() { SetBlockCommand(); } void CMyListView::SetBlockCommand() { CAcModuleResourceOverride myResources; CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); CString strSubPath = pDlg1->m_strSubPath; CInsertTypeDlg dlg; CString strPathName; BaseFuncs::GetPathName(strPathName); strPathName = strPathName+_T("\\tk\\Customer\\图库中心\\dwglib.ini"); if (dlg.DoModal()==IDOK) { CListCtrl &mListCtrl = GetListCtrl(); POSITION pos = mListCtrl.GetFirstSelectedItemPosition(); while (pos!=0) { CString strFormat; CString strRcdName; int nSelect = mListCtrl.GetNextSelectedItem(pos); strRcdName = mListCtrl.GetItemText(nSelect, 0); strFormat.Format(_T("%d,%d,%d"), dlg.m_nUnit, dlg.m_bAutoScale, dlg.m_bAutoExplode); WritePrivateProfileString(strSubPath, strRcdName, strFormat, strPathName); } } } void CMyListView::OnUpdateMenuitemfirst(CCmdUI *pCmdUI) { DWORD dwStyle = GetStyle() & LVS_TYPEMASK; pCmdUI->SetCheck(dwStyle==LVS_ICON); } void CMyListView::OnUpdateMenuitemsecond(CCmdUI *pCmdUI) { DWORD dwStyle = GetStyle() & LVS_TYPEMASK; pCmdUI->SetCheck(dwStyle==LVS_SMALLICON); } void CMyListView::OnUpdateMenuitemtree(CCmdUI *pCmdUI) { DWORD dwStyle = GetStyle() & LVS_TYPEMASK; pCmdUI->SetCheck(dwStyle==LVS_LIST); } void CMyListView::OnUpdateMenuitemfour(CCmdUI *pCmdUI) { DWORD dwStyle = GetStyle() & LVS_TYPEMASK; pCmdUI->SetCheck(dwStyle==LVS_REPORT); } void CMyListView::OnMenuitemfirst() { ModifyStyle(LVS_TYPEMASK, LVS_ICON); } void CMyListView::OnMenuitemfour() { // TODO: Add your command handler code here ModifyStyle(LVS_TYPEMASK, LVS_REPORT); } void CMyListView::OnMenuitemsecond() { // TODO: Add your command handler code here ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); } void CMyListView::OnMenuitemtree() { // TODO: Add your command handler code here ModifyStyle(LVS_TYPEMASK, LVS_LIST); } void CMyListView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar) { // 确保在移动滚动条时更新 //Invalidate(); CListView::OnVScroll(nSBCode, nPos, pScrollBar); } void CMyListView::OnInstead() { BlockInstead(); } void CMyListView::BlockInstead() { //if (acedGetAcadDwgView()!=NULL) // acedGetAcadDwgView()->SetFocus(); //设置CAD焦点 //BaseFuncs::ClearAcadCmdLine(); //AcDbObjectId BlockId; //CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); //g_SysSet.m_strThDwgName = pDlg1->m_sDwgPath; //g_SysSet.m_strThtkName = m_sRcdName; //BaseFuncs::CAD_SendStringToExecute(_T("t91_tkth1")); } void CMyListView::OnSelectAll() { SelectAll(); } void CMyListView::SelectAll() { CListCtrl &mListCtrl = GetListCtrl(); for (int nLen = 0; nLenGetParent()->GetParent()->GetParent()->GetParent(); CString sDescDwg; sDescDwg = pDlg1->m_sDwgPath; CFileFind filefind; if (!filefind.FindFile(sDescDwg)) { AfxMessageBox(_T("未指定当前Dwg文件")); filefind.Close(); return; } filefind.Close(); CStringArray strRcdNames; getAllListItem(strRcdNames); CRnameBlkDlg dlg; dlg.m_strRcdNames.Append(strRcdNames); dlg.m_sOldBlkName = m_sRcdName; if (dlg.DoModal()!=IDOK) return; CString sNewBlkName = dlg.m_sNewBlockName; sNewBlkName.TrimLeft(); sNewBlkName.TrimRight(); if (m_sRcdName==sNewBlkName) return; pDlg1->getPreviewCtrl().ReleaseDb(); if (BaseFuncs::RenameBlock(sDescDwg, m_sRcdName, sNewBlkName)) GetListCtrl().SetItemText(m_nSelected, 0, sNewBlkName); pDlg1->getPreviewCtrl().ViewBlock(sDescDwg, sNewBlkName); } void dist_blk_insert(const CStringArray &sOrgPathArr, CString sDescPath) { if (sOrgPathArr.GetSize()<1) return; Acad::ErrorStatus es; acDocManagerPtr()->lockDocument(curDoc()); AcDbObjectId BlockId; AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse); #if ARX < 19 es = pDb->readDwgFile(sDescPath, SH_DENYNO); #else es = pDb->readDwgFile(sDescPath, AcDbDatabase::kForReadAndAllShare); #endif acDocManagerPtr()->unlockDocument(curDoc()); if (es!=Acad::eOk) { AfxMessageBox(_T("无法打开,该DWG已破坏或为高版本DWG")); delete pDb; return; } acDocManagerPtr()->lockDocument(curDoc()); for (int nLen = 0; nLenreadDwgFile(sPathName, SH_DENYNO); #else es = pOrgDb->readDwgFile(sPathName, AcDbDatabase::kForReadAndAllShare); #endif if (es!=Acad::eOk) continue; es = pDb->insert(BlockId, sBlocName, pOrgDb); delete pOrgDb; } acDocManagerPtr()->unlockDocument(curDoc()); AcDb::AcDbDwgVersion dwgVer = pDb->originalFileVersion(); es = pDb->saveAs(sDescPath, false, dwgVer); if (es != Acad::eOk) acutPrintf(_T("\n保存失败。")); delete pDb; } void CMyListView::getAllListItem(CStringArray &strRcdNames) { int nCount = GetListCtrl().GetItemCount(); for (int nLen = 0; nLenGetParent()->GetParent()->GetParent()->GetParent(); CString sDescDwg; sDescDwg = pDlg1->m_sDwgPath; pDlg1->getPreviewCtrl().ReleaseDb(); dist_blk_insert(strPathArr, sDescDwg); GetListCtrl().DeleteAllItems(); pDlg1->AddItemToListCtrl(sDescDwg); } Acad::ErrorStatus DeepCloneObject(AcDbObject*& pObjDest, // 返回目标对象 AcDbObject* pObjSrc, // 被拷贝对象 AcDbObjectId idOwner) // 目标对象的属主 { ASSERT(pObjDest == NULL && pObjSrc != NULL); AcDbObjectId id = pObjSrc->objectId(); if (!id.isValid()) return Acad::eNotInDatabase; AcDbDatabase* pDb = pObjSrc->database(); ASSERT(pDb != NULL); BOOL bWrite = pObjSrc->isWriteEnabled(); if (bWrite) pObjSrc->downgradeOpen(); if (!idOwner.isValid()) idOwner = pObjSrc->ownerId(); AcDbIdMapping idMap; AcDbObjectIdArray arid; arid.append(id); Acad::ErrorStatus es = pDb->deepCloneObjects(arid, idOwner, idMap, false); if (bWrite) pObjSrc->upgradeOpen(); if (es != Acad::eOk) return es; AcDbIdPair pair; pair.setKey(id); idMap.compute(pair); ASSERT(pair.value().isValid()); return acdbOpenObject(pObjDest, pair.value(), AcDb::kForWrite); } AcDbObjectId CreateBlockTableRecord(AcDbObjectIdArray& arid, const AcGePoint3d& ptOrigin, LPCTSTR pszBlk, AcDbDatabase* pDb, BOOL bDeleteSrc) { AcDbObjectId id; if (pDb == NULL) { pDb = acdbHostApplicationServices()->workingDatabase(); } ASSERT(pDb != NULL); AcDbBlockTable* pBT = NULL; pDb->getBlockTable(pBT, AcDb::kForWrite); if (pBT == NULL) return id; BOOL bAnonymous = (pszBlk == NULL || _tcslen(pszBlk) <= 0); if (!bAnonymous && pBT->has(pszBlk)) { pBT->close(); return id; } AcDbBlockTableRecord* pBTR = new AcDbBlockTableRecord; pBT->add(id, pBTR); if (!id.isValid()) { delete pBTR; pBT->close(); return id; } pBT->close(); if (bAnonymous) pBTR->setName(_T("*U")); else pBTR->setName(pszBlk); pBTR->setOrigin(ptOrigin); pBTR->close(); AcDbEntity* pEnt; AcDbEntity* pCpyEnt; int iLen = arid.length(); for (int i = iLen - 1; i >= 0; i--) { ASSERT(arid[i].isValid()); if (acdbOpenObject(pEnt, arid[i], AcDb::kForRead) != Acad::eOk) continue; ASSERT(pEnt != NULL && pEnt->isKindOf(AcDbEntity::desc())); pCpyEnt = NULL; DeepCloneObject((AcDbObject*&)pCpyEnt, pEnt, id); pCpyEnt->close(); if (bDeleteSrc && pEnt->upgradeOpen() == Acad::eOk) pEnt->erase(); pEnt->close(); arid.removeAt(i); } return id; } void CMyListView::OnBlockbycurdb() { // TODO: Add your command handler code here CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); CString sDescDwg; sDescDwg = pDlg1->m_sDwgPath; AcDbBlockTable *pBlockTable; ads_name ssName; AcGePoint3d ptBlk; AcDbObjectId RcdId; AcDbObjectIdArray Ids; AcDbIdMapping idmap; Acad::ErrorStatus es; // acedGetAcadFrame()->ShowControlBar(g_pDockPane, FALSE, FALSE); acedSSGet(NULL, NULL, NULL, NULL, ssName); BaseFuncs::dist_ss_ToIds(ssName, Ids); acedSSFree(ssName); if (Ids.logicalLength() < 1) { // acedGetAcadFrame()->ShowControlBar(g_pDockPane, TRUE, FALSE); BaseFuncs::ClearAcadCmdLine(); return; } TCHAR kw[256]; CString sBlockName = kw; while (1) { if (acedGetString(0, _T("\n图块名称:"), kw) != RTNORM) { // acedGetAcadFrame()->ShowControlBar(g_pDockPane, TRUE, FALSE); BaseFuncs::ClearAcadCmdLine(); return; } sBlockName = kw; sBlockName.TrimLeft(); sBlockName.TrimRight(); if (sBlockName == _T("")) { acutPrintf(_T("\n块名不能为空")); continue; } break; } AcGePoint3d ptMax, ptMin; BaseFuncs::dist_ent_getminmaxpt(Ids, ptMin, ptMax); ptBlk = ptMin + (ptMax - ptMin) / 2.0; if (acedGetPoint(asDblArray(ptBlk), _T("\n指定插入点:"), asDblArray(ptBlk)) == RTCAN) { // acedGetAcadFrame()->ShowControlBar(g_pDockPane, TRUE, FALSE); BaseFuncs::ClearAcadCmdLine(); return; } acDocManagerPtr()->lockDocument(curDoc()); CString strFormat; AcDbDatabase *pDb = new AcDbDatabase(Adesk::kTrue, Adesk::kTrue); #if ARX < 19 es = pDb->readDwgFile(sDescDwg, SH_DENYNO); #else es = pDb->readDwgFile(sDescDwg, AcDbDatabase::kForReadAndAllShare); #endif AcDbBlockTableRecord *pRcd = new AcDbBlockTableRecord; pRcd->setOrigin(ptBlk); pRcd->setName(sBlockName); es = pDb->getBlockTable(pBlockTable, AcDb::kForWrite); if (!pBlockTable) { DELETE_PTR(pDb); DELETE_PTR(pRcd); return; } es = pBlockTable->add(RcdId, pRcd); pBlockTable->close(); pRcd->close(); es = acdbHostApplicationServices()->workingDatabase()->wblockCloneObjects(Ids, RcdId, idmap, AcDb::kDrcReplace); pDlg1->getPreviewCtrl().ReleaseDb(); AcDb::AcDbDwgVersion dwgVer = pDb->originalFileVersion(); es = pDb->saveAs(sDescDwg, false, dwgVer); if (es!=Acad::eOk) acutPrintf(_T("\n保存失败")); delete pDb; acDocManagerPtr()->unlockDocument(curDoc()); GetListCtrl().DeleteAllItems(); pDlg1->AddItemToListCtrl(sDescDwg); // acedGetAcadFrame()->ShowControlBar(g_pDockPane, TRUE, FALSE); BaseFuncs::ClearAcadCmdLine(); pDlg1->getPreviewCtrl().ViewBlock(sDescDwg, sBlockName); } void CMyListView::OnUpdatetb() { // TODO: Add your command handler code here CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); g_sDwgPathName = pDlg1->m_sDwgPath; pDlg1->getPreviewCtrl().ReleaseDb(); CString sFormat; sFormat.Format(_T("save %s\r\n"), g_sDwgPathName); // pDlg1->getPreviewCtrl().erasePreview();//modify by hrp 2010 4-10 acedGetAcadFrame()->ShowControlBar(g_pDockPane, FALSE, FALSE); if (acedGetAcadDwgView()!=NULL) acedGetAcadDwgView()->SetFocus(); BaseFuncs::CAD_SendStringToExecute(_T("tk_open"), TRUE); // GetListCtrl().DeleteAllItems(); // pDlg1->AddItemToListCtrl(sDescDwg); // CAD_SendStringToExecute("blockIcon *\r\n",TRUE); // acedCommand(RTSTR,"blockIcon",RTSTR,"*",RTSTR,"",0); //acutPrintf("\ndkdkdkdk"); } void CMyListView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default UINT uFlags; if (acedGetAcadDwgView()!=NULL) ; // acedGetAcadDwgView()->SetFocus(); //很奇怪一定要先让CAD视图获得焦点 else return; CString sRcdName; CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); int nSelected = GetListCtrl().HitTest(point, &uFlags); if (nSelected<0) m_nMenuType = 0; m_nSelected = nSelected; // GetListCtrl().SetItemState(m_nSelected, LVNI_FOCUSED | LVNI_SELECTED, LVNI_FOCUSED | LVNI_SELECTED); sRcdName = GetListCtrl().GetItemText(nSelected, 0);//m_sRcdName= if (nSelected>=0) { m_nMenuType = 1; GetListCtrl().SetSelectionMark(nSelected); GetListCtrl().SetCheck(nSelected); if (sRcdName!=m_sRcdName) { m_sRcdName = sRcdName; BeginWaitCursor(); pDlg1->getPreviewCtrl().ViewBlock(pDlg1->m_sDwgPath, sRcdName); EndWaitCursor(); } CString sContent = pDlg1->getPreviewCtrl().m_sContent; pDlg1->getExPlainBar().m_staticCtrl.SetWindowText(sContent); CListView::OnRButtonDown(nFlags, point); } ClientToScreen(&point); CString sParentText = pDlg1->getTreeCtrl().m_sCurParentText; if (sParentText==_T("填充库")&&m_nMenuType==1) return; CMenu menu; if (m_nMenuType==0) { CMenu *pSub; menu.LoadMenu(IDR_MENU1); pSub = menu.GetSubMenu(0); if (GetListCtrl().GetSelectedCount()<1) { pSub->RemoveMenu(ID_BLOCKCOMMAND, MF_REMOVE|MF_BYCOMMAND); } } else menu.LoadMenu(IDR_MENU2); m_nMenuType = 0; menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); // if(nSelected>=0) // CListView::OnRButtonDown(nFlags, point); } void CMyListView::OnClick(NMHDR *pNMHDR, LRESULT *pResult) { if (acDocManagerPtr()->documentCount()<1) { *pResult = 0; return; } // TODO: Add your control notification handler code here CString sCurParentText; CString sCurSltText; CString sRcdName; AcDbObjectId BlockId; AcDbBlockTableRecord *pRcd = NULL; CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->GetParent()->GetParent()->GetParent(); sCurParentText = pDlg1->getTreeCtrl().m_sCurParentText; sCurSltText = pDlg1->getTreeCtrl().m_sCurSltText; // pDlg1->getPreviewCtrl().setBkGroundColor(); NM_LISTVIEW *pNMListView = (NM_LISTVIEW *)pNMHDR; // TODO: Add your control notification handler code here int nSelected = pNMListView->iItem; // int nSelected = GetListCtrl().HitTest(point, &uFlags); if (nSelected<0) { m_nMenuType = 0; // CListView::OnLButtonDown(nFlags, point); return; } m_nSelected = nSelected; sRcdName = GetListCtrl().GetItemText(nSelected, 0); if (nSelected>=0) { if (_tcscmp(sCurParentText, _T("填充库"))==0&&wcscmp(sCurSltText, _T("真彩填充"))==0) { // CListView::OnLButtonDown(nFlags, point); return; } m_dBlockScale = 1; // GetBlockScale(pDlg1->m_sDwgPath,sRcdName,m_dBlockScale); m_nMenuType = 1; if (sRcdName!=m_sRcdName) { BeginWaitCursor(); pDlg1->getPreviewCtrl().ViewBlock(pDlg1->m_sDwgPath, sRcdName); EndWaitCursor(); m_sRcdName = sRcdName; } CString sContent = pDlg1->getPreviewCtrl().m_sContent; pDlg1->getExPlainBar().m_staticCtrl.SetWindowText(sContent); } // *pResult = 0; } #define IsCTRLpressed() ( (GetKeyState(VK_CONTROL) & (1 << (sizeof(SHORT)*8-1))) != 0 ) BOOL CMyListView::PreTranslateMessage(MSG *pMsg) { if (pMsg->message==WM_KEYDOWN) { UINT nChar = (TCHAR)pMsg->wParam&0xff; if (IsCTRLpressed()&&nChar == 'A') { OnSelectAll(); return TRUE; } } return CListView::PreTranslateMessage(pMsg); } // 更新下拉菜单 void CMyListView::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex, BOOL bSysMenu) { if (!bSysMenu) { ASSERT(pPopupMenu != NULL); // check the enabled state of various menu items CCmdUI state; state.m_pMenu = pPopupMenu; ASSERT(state.m_pOther == NULL); state.m_nIndexMax = pPopupMenu->GetMenuItemCount(); for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++) { state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex); if (state.m_nID == 0) continue; // menu separator or invalid cmd - ignore it ASSERT(state.m_pOther == NULL); ASSERT(state.m_pMenu != NULL); if (state.m_nID == (UINT)-1) { // possibly a popup menu, route to first item of that popup state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex); if (state.m_pSubMenu == NULL || (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 || state.m_nID == (UINT)-1) { continue; // first item of popup can't be routed to } state.DoUpdate(this, FALSE); // popups are never auto disabled } else { // normal menu item // Auto enable/disable if command is _not_ a system command state.m_pSubMenu = NULL; state.DoUpdate(this, state.m_nID < 0xF000); } } } }