实例介绍
【实例截图】
【核心代码】
#include "StdAfx.h" #include "resource.h" #include "EditTextDlg.h" //----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC (CEditTextDlg, CAcUiDialog) BEGIN_MESSAGE_MAP(CEditTextDlg, CAcUiDialog) ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus) ON_WM_CLOSE() ON_BN_CLICKED(IDCANCEL, &CEditTextDlg::OnBnClickedCancel) ON_BN_CLICKED(IDC_SelFileBtn, &CEditTextDlg::OnBnClickedSelfilebtn) ON_BN_CLICKED(IDC_AddFileBtn, &CEditTextDlg::OnBnClickedAddfilebtn) ON_BN_CLICKED(IDC_AddDwgBtn, &CEditTextDlg::OnBnClickedAdddwgbtn) ON_BN_CLICKED(IDC_DelDwgBtn, &CEditTextDlg::OnBnClickedDeldwgbtn) ON_BN_CLICKED(IDOK, &CEditTextDlg::OnBnClickedOk) END_MESSAGE_MAP() //----------------------------------------------------------------------------- CEditTextDlg::CEditTextDlg (CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAcUiDialog (CEditTextDlg::IDD, pParent, hInstance) { } //----------------------------------------------------------------------------- void CEditTextDlg::DoDataExchange (CDataExchange *pDX) { CAcUiDialog::DoDataExchange (pDX) ; DDX_Control(pDX, IDC_EDIT_Path, m_PathEdit); DDX_Control(pDX, IDC_EDIT_OLDSTR, m_oldStr); DDX_Control(pDX, IDC_EDIT_NEWSTR, m_newStr); DDX_Control(pDX, IDC_LIST1, m_FileList); DDX_Control(pDX, IDC_CHECK_CASE, m_caseCheck); DDX_Control(pDX, IDC_CHECK_WCMATCH, m_wcmatchCheck); } //----------------------------------------------------------------------------- //----- Needed for modeless dialogs to keep focus. //----- Return FALSE to not keep the focus, return TRUE to keep the focus LRESULT CEditTextDlg::OnAcadKeepFocus (WPARAM, LPARAM) { return (TRUE) ; } BOOL CEditTextDlg::OnInitDialog() { CAcUiDialog::OnInitDialog(); // TODO: 在此添加额外的初始化 m_wcmatchCheck.SetCheck(1); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CEditTextDlg::OnClose() { CAcUiDialog::OnClose(); } void CEditTextDlg::OnBnClickedCancel() { CAdUiBaseDialog::OnCancel(); } void CEditTextDlg::OnBnClickedSelfilebtn() { CString ReturnPach; CEditTextDlg::Getbrowse(ReturnPach); m_PathEdit.SetWindowText(ReturnPach); if (_tcscmp(ReturnPach, TEXT("")) == 1) { std::vector<CString> lstFiles; CEditTextDlg::GetbrowseFiles(ReturnPach, lstFiles); if (lstFiles.size() > 1) { for (int i = 0; i < lstFiles.size(); i ) { CString typ = lstFiles[i]; AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse); if (pDb->readDwgFile(typ) != Acad::eOk) { AfxMessageBox(_T("\n文件已经被打开,无法添加到列表")); } else { m_FileList.AddString(typ); } delete pDb; } } else { acutPrintf(TEXT("\n所选文件夹内无dwg文件!")); } } } void CEditTextDlg::OnBnClickedAddfilebtn() { CEditTextDlg::OnBnClickedSelfilebtn(); } void CEditTextDlg::OnBnClickedAdddwgbtn() { CString title = TEXT("选择DWG图形文件"); CString path = TEXT("C:\\"); struct resbuf *fileName = acutNewRb(RTSTR); if (acedGetFileD(title, path, TEXT("dwg;dxf"), 0, fileName) == RTNORM) { CString typ; typ.Format(_T("%s"), fileName->resval.rstring); AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse); if (pDb->readDwgFile(typ) != Acad::eOk) { AfxMessageBox(_T("\n文件已经被打开,无法添加到列表")); } else { m_FileList.AddString(typ); } delete pDb; } acutRelRb(fileName); } void CEditTextDlg::OnBnClickedDeldwgbtn() { int iCount = m_FileList.GetCurSel(); m_FileList.DeleteString(iCount); } void CEditTextDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 BeginEditorCommand(); int iCount = m_FileList.GetCount(); CString oldStr, newStr; m_oldStr.GetWindowText(oldStr); m_newStr.GetWindowText(newStr); acedSetStatusBarProgressMeter(_T("正在批量替换文字,等稍等!"), 0, iCount); for (int i = 0; i < iCount; i ) { acedSetStatusBarProgressMeterPos(i); CString fileName; m_FileList.GetText(i, fileName); // 使用已有的图形 AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse); if (pDb->readDwgFile(fileName) == Acad::eOk) { AcDbObjectIdArray TextIds = CEditTextDlg::GetAllTextIds(NULL, pDb); for (int j = 0; j < TextIds.length(); j ) { AcDbText *pText = NULL; AcDbMText *pMText = NULL; if (acdbOpenObject(pText, TextIds[j], AcDb::kForWrite) == Acad::eOk) { CString strName = pText->textString(); if (m_caseCheck.GetCheck() == 0) { if (strName.CompareNoCase(oldStr) == 0) // CompareNoCase不区分大小字符 { pText->setTextString(newStr); } } if (m_caseCheck.GetCheck() == 1) { if (strName.Compare(oldStr) == 0) // Compare区分大小字符 { pText->setTextString(newStr); } } pText->close(); } if (acdbOpenObject(pMText, TextIds[j], AcDb::kForWrite) == Acad::eOk) { TCHAR *chaName; chaName = pMText->contents(); CString strName(chaName); int n = strName.ReverseFind(';'); strName = strName.Right(strName.GetLength() - n - 1); acutDelString(chaName); if (m_caseCheck.GetCheck() == 0) { if (strName.CompareNoCase(oldStr) == 0) { pMText->setContents(newStr); } } if (m_caseCheck.GetCheck() == 1) { if (strName.Compare(oldStr) == 0) { pMText->setContents(newStr); } } pMText->close(); } } } pDb->saveAs(fileName); delete pDb; } acedRestoreStatusBar(); CancelEditorCommand(); } CString CEditTextDlg::Getbrowse(CString &ReturnPach) { TCHAR szPath[_MAX_PATH]; // 保存路径变量 BROWSEINFO bi; // BROWSEINFO结构变量 bi.hwndOwner = NULL; // HWND句柄 bi.pidlRoot = NULL; // 默认值为NULL bi.lpszTitle = _T("文件浏览对话框"); // 对话框标题 bi.pszDisplayName = szPath; // 选择文件夹路径 bi.ulFlags = BIF_RETURNONLYFSDIRS; // 标记 bi.lpfn = NULL; // 默认值为NULL bi.lParam = NULL; // 回调消息 LPITEMIDLIST pItemIDList = SHBrowseForFolder(&bi); // 显示文件浏览对话框 if(pItemIDList) { if(SHGetPathFromIDList(pItemIDList,szPath)) // 判断是否获得文件夹路径 { ReturnPach = szPath; } } else { ReturnPach = _T(""); //文件夹路径为空 } return ReturnPach; } void CEditTextDlg::GetbrowseFiles(const TCHAR* ReturnPach, std::vector<CString> &lstFiles) { CFileFind ff; CString strPath = ReturnPach; if (strPath.Right(1) != _T("\\")) { strPath = "\\"; } strPath = "*.*"; BOOL res = ff.FindFile(strPath); while (res) { res = ff.FindNextFile(); if (ff.IsDirectory() && !ff.IsDots()) // 如果是一个子目录,进行递归查找 { CEditTextDlg::GetbrowseFiles(ff.GetFilePath(), lstFiles); } else { if (!ff.IsDirectory() && !ff.IsDots()) { CString strFileName = ff.GetFileName(); if (strFileName.Right(3) == "dwg") { strFileName = TEXT("\\") strFileName; strFileName = ReturnPach strFileName; lstFiles.push_back(strFileName); } } } } ff.Close(); } AcDbObjectIdArray CEditTextDlg::GetAllTextIds(const TCHAR* layerName, AcDbDatabase *pDb) { AcDbObjectIdArray entIds; // 满足条件的实体集合 bool bFilterLayer = false; // 是否需要过滤图层 AcDbObjectId layerId; // 获得指定图层的对象ID if (layerName != NULL) { AcDbLayerTable *pLayerTbl = NULL; acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTbl, AcDb::kForRead); if (!pLayerTbl->has(layerName)) { pLayerTbl->close(); return entIds; } pLayerTbl->getAt(layerName, layerId); pLayerTbl->close(); bFilterLayer = true; } // 获得块表 AcDbBlockTable *pBlkTbl = NULL; pDb->getBlockTable(pBlkTbl, AcDb::kForRead); // 获得模型空间的块表记录 AcDbBlockTableRecord *pBlkTblRcd = NULL; pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForRead); pBlkTbl->close(); // 创建遍历器,依次访问模型空间的每一个实体 AcDbBlockTableRecordIterator *it = NULL; pBlkTblRcd->newIterator(it); for (it->start(); !it->done(); it->step()) { AcDbEntity *pEnt = NULL; Acad::ErrorStatus es = it->getEntity(pEnt, AcDb::kForRead); if (es == Acad::eOk) { if (pEnt->isKindOf(AcDbText::desc())) { entIds.append(pEnt->objectId()); } if (pEnt->isKindOf(AcDbMText::desc())) { entIds.append(pEnt->objectId()); } pEnt->close(); } else { acutPrintf(TEXT("\n打开实体失败(错误代码:%d)."), (int)es); } } delete it; pBlkTblRcd->close(); return entIds; }
标签: 不打开图档可替换字符串源码
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论