基本信息
源码名称:c++ 不打开图档可替换字符串源码
源码大小:2.38M
文件格式:.rar
开发语言:C/C++
更新时间:2018-02-05
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 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;
}