基本信息
源码名称: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;
}