cad二次开发加载cad自动调用_CAD二次开发实例:批量文本查找替换

12d8b523229724c1c089d0da63ebe2bb.png

喜欢就点击蓝字关注我

0. 引言

6dfa14675aa9423bd3a35e537abaa382.gif

虽然在CAD中进行文本替换已经存在一个find命令了,但是只能进行一对一的文本替换

如果遇到一个图形文件中有很多个文本需要替换时,你不可能一个一个的去find替换吧,当然你也可以尝试一个一个替换,效率就不得而知了。

这个是之前接触的一个工作内容,也可能是我走上CAD二次开发这条不归路的一个起点,因为确实是让我体会到代码所带来的效率提升有多大!

废话不说!Let's do it !!

1. CAD多个文本批量查找替换程序

6dfa14675aa9423bd3a35e537abaa382.gif

大致逻辑就是:遍历文件图元对象,如果是文本对象,通过键值对的方式建立替换前文本和替换后文本的索引关系,进行查找替换。

老样子,打开图形数据库开启事务处理,打开块表和块表记录

569454f6120ebd0c8fa8da5181867da8.png

遍历图元对象

8a41c702e3b293b9019ce045d776b7ae.png

完整代码:

using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Runtime;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace TextBatchReplace{    public class Tools    {        [CommandMethod("TBR")]        public void TextBatchReplace()        {                        Liststring,             // 添加需要替换和替换后的文本             liststring.Add(new KeyValuePair<string, string>("需要替换的文本", "替换后文本"));            // 打开图形数据库            Database db = HostApplicationServices.WorkingDatabase;            // 打开事务处理            using (Transaction trans = db.TransactionManager.StartTransaction())            {                // 以只读方式打开块表                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);                // 以写的方式打开块表记录                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);                // 在块表记录中遍历对象                foreach (ObjectId id in btr)                {                    DBObject ent = trans.GetObject(id, OpenMode.ForWrite);                    // 判断是否是单行文字                    if(ent is DBText)                    {                        DBText dbText = ent as DBText;                                                int newstring = ReplaceString(dbText.TextString.Trim(), liststring);                        // 如果正确索引到该文本字符串                        if(newstring >= 0)                        {                            // 执行替换                            dbText.TextString = dbText.TextString.Replace(liststring[newstring].Key.Trim(), liststring[newstring].Value.Trim());                        }                    }                    // 如果是多行文本                    else if (ent is MText)                    {                        MText mText = ent as MText;                        int newstring = ReplaceString(mText.Contents.Trim(), liststring);                        if (newstring >= 0)                        {                            mText.Contents = mText.Contents.Replace(liststring[newstring].Key.Trim(), liststring[newstring].Value.Trim());                        }                    }                }                trans.Commit();            }        }        // IndexOf() 查找字串中指定字符或字串首次出现的位置,返首索引值        // Trim()    用于删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一个非空格的字符为止        ///         /// 字符串查找        ///         /// 输入字符串        ///         ///         private int ReplaceString(string inputstring, Liststring, string>> allgetstring)        {            int returnvalues = -1;            for (int i = 0; i < allgetstring.Count; i++)            {                if (inputstring.Trim().IndexOf(allgetstring[i].Key.Trim()) >= 0)                 {                    returnvalues = i;                    break;                }            }            return returnvalues;        }    }}

“Talk is cheap. Show me the code”

完整代码下载:

https://gitee.com/yuzhaokai/CADExampleDemo.git

1f86e0ed93e1e34e1eed873697f031e2.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值