基本信息
源码名称:c++ 不打开图档可替换字符串源码
源码大小:2.38M
文件格式:.rar
开发语言:C/C++
更新时间:2018-02-05
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#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; }