在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例图形和图像处理 → c++ 不打开图档可替换字符串源码

c++ 不打开图档可替换字符串源码

图形和图像处理

下载此实例
  • 开发语言:C/C++
  • 实例大小:2.38M
  • 下载次数:16
  • 浏览次数:237
  • 发布时间:2018-02-05
  • 实例类别:图形和图像处理
  • 发 布 人:ke0596
  • 文件格式:.rar
  • 所需积分: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;
}

实例下载地址

c++ 不打开图档可替换字符串源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警