AutoCAD VBA 实现批量文字提取
做电气,拿别人的图纸做接线表,需要在dwg图纸中提取大量的信息.
找到别人写的代码,如下
1 Sub AcadGetText备份() 2 3 Dim sset As AcadSelectionSet '声明定义选择集 4 Dim ent As AcadEntity '声明实体 5 Dim fso, f 6 Dim filename As String '声明文件字符串 7 Dim str As String 8 9 filename = "C:/Users/jichao/Documents/CAD_VBA/output.txt" 10 11 Do While ThisDrawing.SelectionSets.Count > 0 12 ThisDrawing.SelectionSets.Item(0).Delete 13 Loop 14 15 Set sset = ThisDrawing.SelectionSets.Add("sst") '添加选择集 16 sset.SelectOnScreen '在屏幕上选择对象 17 18 19 20 21 Set fso = CreateObject("Scripting.FileSystemObject") 22 Set f = fso.OpenTextFile(filename, 8, True) 23 24 ' 可能选取到非文本,所以。。。 25 On Error Resume Next 26 For Each ent In sset 27 str = "" 28 str = ent.TextString 29 30 If str <> "" Then 31 f.Write str 32 f.Write Chr(9) 33 End If 34 35 Next 36 f.Write Chr(13) + Chr(10) 37 f.Close 38 39 End Sub
使用过程中,发现,只能逐一拾取文字,如果圈选,则会得到随机顺序的文字.
我需要拾取的文字,都是竖向,一列一列的.于是改写了这部分代码,让圈选的文字,自动按坐标排序.
1 Public Sub AcadGetText() 2 Dim sset As AcadSelectionSet '声明定义选择集 3 Dim ent As AcadEntity '声明实体 4 Dim minP, maxP As Variant 5 Dim 字符串数量, i, 比较失败数量 As Integer 6 Dim mystr As String 7 Dim fso, f 8 Dim filename As String '声明文件字符串 9 10 filename = "C:/Users/jichao/Documents/CAD_VBA/output.txt" 11 12 '清空选择集 13 Do While ThisDrawing.SelectionSets.Count > 0 14 ThisDrawing.SelectionSets.Item(0).Delete 15 Loop 16 17 Set sset = ThisDrawing.SelectionSets.Add("sst") '添加选择集 18 sset.SelectOnScreen '在屏幕上选择对象 19 20 '获得选择集元素数量 21 字符串数量 = 0 22 For Each ent In sset 23 字符串数量 = 字符串数量 + 1 24 Next 25 '重定义一个数组,用于保存数据,其中(0,*)用于排序时作为缓存 26 ReDim 选择集数组(字符串数量 + 1, 2) As Variant 27 '遍历选择集,收集数据,因为我要竖直方向上排序,只收集Y坐标 28 i = 1 29 On Error Resume Next 30 For Each ent In sset 31 选择集数组(i, 1) = ent.TextString 32 ent.GetBoundingBox minP, maxP 33 选择集数组(i, 2) = minP(1) 34 i = i + 1 35 Next 36 '对数据排序, 37 比较失败数量 = 8 38 Do While 比较失败数量 > 0 39 比较失败数量 = 0 40 For i = 1 To 字符串数量 41 If 选择集数组(i, 2) < 选择集数组(i + 1, 2) Then 42 选择集数组(0, 1) = 选择集数组(i, 1) 43 选择集数组(0, 2) = 选择集数组(i, 2) 44 选择集数组(i, 1) = 选择集数组(i + 1, 1) 45 选择集数组(i, 2) = 选择集数组(i + 1, 2) 46 选择集数组(i + 1, 1) = 选择集数组(0, 1) 47 选择集数组(i + 1, 2) = 选择集数组(0, 2) 48 比较失败数量 = 比较失败数量 + 1 49 End If 50 Next 51 Loop 52 '文件操作 53 Set fso = CreateObject("Scripting.FileSystemObject") 54 Set f = fso.OpenTextFile(filename, 8, True) 55 On Error Resume Next 56 For i = 1 To 字符串数量 + 1 57 mystr = "" 58 mystr = 选择集数组(i, 1) 59 60 If mystr <> "" Then 61 f.Write mystr 62 f.Write Chr(9) 63 End If 64 65 Next 66 f.Write Chr(13) + Chr(10) 67 f.Close 68 69 End Sub
另外,配合autoLisp代码,实现在命令行直接调用
(defun c:dd() (command "-vbarun" "AcadGetText") (prin1) )
在CAD中,先打开图纸,再加载以上2个工程,即可用"dd"命令调用VBA程序.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了