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程序.

 

posted @   急先锋小米  阅读(1092)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示