![12d8b523229724c1c089d0da63ebe2bb.png](https://i-blog.csdnimg.cn/blog_migrate/a90054570e31f99b2e25a98fef0015d8.png)
喜欢就点击蓝字关注我
0. 引言
![6dfa14675aa9423bd3a35e537abaa382.gif](https://i-blog.csdnimg.cn/blog_migrate/2358246976ef2690dafa6d8651317667.gif)
虽然在CAD中进行文本替换已经存在一个find命令了,但是只能进行一对一的文本替换
如果遇到一个图形文件中有很多个文本需要替换时,你不可能一个一个的去find替换吧,当然你也可以尝试一个一个替换,效率就不得而知了。
这个是之前接触的一个工作内容,也可能是我走上CAD二次开发这条不归路的一个起点,因为确实是让我体会到代码所带来的效率提升有多大!
废话不说!Let's do it !!
1. CAD多个文本批量查找替换程序
![6dfa14675aa9423bd3a35e537abaa382.gif](https://i-blog.csdnimg.cn/blog_migrate/2358246976ef2690dafa6d8651317667.gif)
大致逻辑就是:遍历文件图元对象,如果是文本对象,通过键值对的方式建立替换前文本和替换后文本的索引关系,进行查找替换。
老样子,打开图形数据库开启事务处理,打开块表和块表记录
![569454f6120ebd0c8fa8da5181867da8.png](https://i-blog.csdnimg.cn/blog_migrate/5a570a0b0e8762d79182f40cba4f80e2.png)
遍历图元对象
![8a41c702e3b293b9019ce045d776b7ae.png](https://i-blog.csdnimg.cn/blog_migrate/53142138ca434696d98ad18494021c1d.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