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

1309 lines
34 KiB
C++

#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; nLen<sBlockArr.GetSize(); nLen++)
{
if (pDesdTbl->getAt(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; nLen<GetListCtrl().GetItemCount(); nLen++)
{
int nIndex = -1;
CString strBlockName;
GetListCtrl().GetItemText(nLen, 0, strBlockName.GetBufferSetLength(256), 256);
strBlockName.ReleaseBuffer();
if (BaseFuncs::FindStringInArr(sBlockArr, strBlockName, nIndex))
{
GetListCtrl().DeleteItem(nLen);
nLen--;
}
}
AcDb::AcDbDwgVersion dwgVer = pDb->originalFileVersion();
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; nLen<mListCtrl.GetItemCount(); nLen++)
{
mListCtrl.SetItemState(nLen, LVNI_FOCUSED | LVNI_SELECTED, LVNI_FOCUSED | LVNI_SELECTED);
}
}
void CMyListView::OnRenameblock()
{
POSITION pos = GetListCtrl().GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0(_T("No items were selected!\n"));
int nItem = GetListCtrl().GetNextSelectedItem(pos);
// TODO: Add your command handler code here
CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->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; nLen<sOrgPathArr.GetSize(); nLen++)
{
Acad::ErrorStatus es;
CString sPathName = sOrgPathArr.GetAt(nLen);
CString sBlocName = sPathName;
int nFind = -1;
nFind = sBlocName.ReverseFind(_T('\\'));
if (nFind<0)
continue;
sBlocName = sBlocName.Right(sBlocName.GetLength()-nFind-1);
sBlocName.TrimRight(_T(".dwg"));
sBlocName.TrimRight(_T(".DWG"));
AcDbDatabase *pOrgDb = new AcDbDatabase(Adesk::kFalse);
#if ARX < 19
es = pOrgDb->readDwgFile(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; nLen<nCount; nLen++)
{
strRcdNames.Add(GetListCtrl().GetItemText(nLen, 0));
}
}
void CMyListView::OnBlocfile()
{
// TODO: Add your command handler code here
CString str1 = _T("DWG文件(*DWG)|*.DWG|");
TCHAR sBuffer[6000];
sBuffer[0] = 0;
CFileDialog fileDia(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, str1);
fileDia.m_ofn.lpstrFile = sBuffer;
fileDia.m_ofn.nMaxFile = 6000;
CString sPathName;
CString sFileName;
CStringArray strPathArr;
if (fileDia.DoModal()!=IDOK)
return;
{
POSITION pos = fileDia.GetStartPosition();
while (pos!=0)
{
sPathName = fileDia.GetNextPathName(pos);
sFileName = fileDia.GetFileName();
strPathArr.Add(sPathName);
// if(m_ListBoxDwgAll.FindString(0,sPathName)<0)
// m_ListBoxDwgAll.AddString(sPathName);
}
}
CDockDialog *pDlg1 = (CDockDialog *)GetParent()->GetParent()->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);
}
}
}
}