VBA对AutoCAD二次开发
开发背景
因为公司电脑的layout设计部门人员不能将元器件转换为3D,故而每次需要结构工程师自行将元器件的2D图处理后导入三位软件进行3D绘制,在处理二维工程图时,出现很多小圆弧,小圆弧处于不同的层,依次删除小圆弧很繁琐造成工作效率低下。
故而通过创建一个菜单栏,将删除小圆弧的程序全部放入一个菜单之下,实现自动化操作
操作的流程如下:
连接AutoCAD→获取AutoCAD的菜单组链接→创建菜单→创建菜单项→将菜单显示到AutoCAD中→编辑圆弧删除程序。
详尽代码
一、在VB中连接AutoCAD的。在VBA中则可以跳过此步
Application 对象是VB 应用程序与AutoCAD 之间链接的关键。将Application 对象与 AutoCAD 链接是为AutoCAD 二次开发应用程序的第一步工作。
当AutoCAD 运行时,GetObject 函数返回Application 对象,否则发生一个错误,这时Err对象的基础属性就会被赋值为一个非零值,可以利用一个错误陷井进行处理。
如果AutoCAD 没有运行,可以使用CreateObject 函数强迫AutoCAD 启动。
Dim myapp As Object
On Error Resume Next
如果已有CAD程序打开,则 Set myapp = GetObject(, \直接获得CAD的控制句柄 myapp.Visible = True
If Err <> 0 Then 如果没有CAD程序打开,则Set myapp = CreateObject(\通过开启cad软件获得CAD myapp.Visible = True 的控制句柄 End If
注意: GetObject(, \里面的那个逗号的来源请仔细阅读VB程序帮助里
面的解释
二、创建菜单(在VBA环境下)
代码如下:
取得AutoCAD的菜单组的 Public Sub menu()
链接 Dim my_菜单组 As AcadMenuGroup
Set my_菜单组 = ThisDrawing.Application.MenuGroups.Item(0) Dim my_弹出式菜单 As AcadPopupMenu
Set my_弹出式菜单 = my_菜单组.Menus.Add(\乾康工具集\
Dim my_弹出式菜单项 As AcadPopupMenuItem Dim openMacro As String
创建一个名为乾康工具集的新菜单
Set my_弹出式菜单项 = my_弹出式菜单.AddMenuItem(0, \删除圆及圆弧\-VBARUN DEL_ACR + chr(13) \
my_菜单组.Menus.InsertMenuInMenuBar \乾康工具集\
注:无论是使用InsertMenuInMenuBar方法还是
InsertInMenuBar方法来加载菜单,被加载菜单都必须要有菜单
End Sub
创建一个名为删除圆及圆弧的下拉菜单项
-VBARUN DEL_ACR + chr(13)在宏名称之前添加 -VBARUN是因为从AutoCAD 工具栏或菜 单运行 VBA 宏。Macro 特性必须设置为等于 -VBARUN filename.dvb!modulename.macroname
其中,filename 是工程文件的名称,modulename 是包含要运行的宏的模块名称,而macroname 是要运行的宏的名称。只有在当前 AutoCAD 任务中未加载文件时,才需要文件 名。如果提供了文件名,将会加载该文件。
注:图示解释相关名称
菜单组,个人认为AutoCAD中就只有一个菜单中
菜单,需要使用PopupMenus里面的Add方法来创建新的菜单
菜单项,需要使用PopupMenu新的菜单 这些都是工具条
里面的
AddMenuItem方法来创建
下图中的“文件”“编辑”“视图”??“帮助”这些合起来就是菜单组(MenuGroup) 而“文件”“编辑”“视图”这些单独描述就是弹出式菜单(PopupMenu)
再则,标注底下的“快速标注”“线性”“对齐”等,就是特定菜单里面的菜单项(PopupMenuItem)
三、自动加载VBA工程文件(在VBA环境下)
此处不需要用代码来实现,仅仅需要进入Autocad进行一次设置即可,操作参见下图 A、 点击 “工具” 选项
B、选择工具下拉菜单中的”加载应用程序”选项,在弹出的对话框中点击”内容”选项
C、在接下来的对话框中点击”添加”,来添加需要自动加载的VBA工程文件
四、自动运行VBA工程文件中自己设置的宏文件(在VBA环境下),本例中的宏名称menu
首先介绍一下Autocad帮助文件中关于自动运行宏文件的说明
用户可以自动运行VBA工程文件中的任何宏,方法是从 AutoCAD 启动功能(如 acad.lsp)中使用 VBARUN 的命令行版本调用。例如,要自动运行名为 drawline 的宏,请先将 drawline 宏保存在VBA工程文件中。然后调用记事本程序新建一个txt文档 并在 文档中中创建(或附加)下面几行:
(defun S::STARTUP()
(command \)
然后将text文档的文件名(包含后缀名)改为acad.lsp
将宏命名为 AcadStartup,这样在加载 VBA 时就会自动运行该宏。当加载 VBA 时,将自动执行 acad.dvb 文件中所有名为 AcadStartup 的宏。
依据以上信息,结合本例,本文要自动运行的宏名称问menu。 操作如下:
A、在电脑桌面上,新建一个文本文档,名称为acad.lsp。 B、双击文件,在文档中写入如下代码,然后保存 (defun S::STARTUP()
(command \)
C、将acad.lsp放入Autocad安装目录下的Support文件夹内即可
五、编写删除圆弧的宏程序(在VBA环境下),本例中的宏名称DEL_ACR()
初略思路为程序运行过程中,弹出窗体文件,由用户输入需要删除的圆弧的半径范围 然后创建一个选集,将符合条件的圆弧加入选集,然后执行选集里面的元素删除代码即可
A、首先创建一个窗体对象,其中textbox1和textbox2的文本控件用于传递圆弧的半径范围
Textbox1文本输入框 Textbox2文本输入
Private Sub CommandButton1_Click()
窗体的名称定为”删除元和窗体” 删除圆弧窗体.Hide
在设定号圆弧半径值后,调用hideEnd Sub
命令隐藏窗体
Private Sub UserForm_Initialize() TextBox1.Text = 0.01 TextBox2.Text = 0.25 End Sub
B、编写删除圆弧的代码,依次创建选择集名称,设置过滤器规则。给选集增加对象,遍历选集对象执行删除命令。 Public Sub DEL_ACR()
窗体显示,用于设置圆弧半径
删除圆弧窗体.Show On Error Resume Next
创建圆弧选择集。
Dim my_圆弧选择集 As AcadSelectionSet
VBA对象浏览器
Set my_圆弧选择集 = ThisDrawing.SelectionSets.Item(\圆弧集\
中有Item和Add的详细说明。 使用时注意Auotcad对象的层级关系
my_圆弧选择集.Delete Set my_圆弧选择集 = ThisDrawing.SelectionSets.Add(\圆弧集\ Dim FilterType(6) As Integer Dim FilterData(6) As Variant FilterType(0) = -4 FilterData(0) = \ FilterType(1) = 0
1、过滤器参数FilterType和 FilterData(1) = \
FilterData必须设置成数组形式, FilterType(2) = -4
成对出现,数组元素一一对应, FilterData(2) = \
即FilterType(2) 对应 FilterType(3) = 40
FilterData(2) 。 FilterData(3) = Val(删除圆弧窗体.TextBox1.Text)
2、过滤器参数需要引用《DXF 参 FilterType(4) = -4
考手册》里面的组码值 FilterData(4) = \
FilterType(5) = 40
FilterData(5) = Val(删除圆弧窗体.TextBox2.Text)
过滤器列表中的逻辑运算符也由
FilterType(6) = -4
-4 组代码表示,运算符以小于号
FilterData(6) = \
开始 (<),以大于号结束 (>)。
my_圆弧选择集.SelectOnScreen FilterType, FilterData Dim i As Integer For i = 0 To my_圆弧选择集.Count - 1 使用for循环函数遍历选择 my_圆弧选择集.Item(i).Delete 集里面的对象进行删除 Next my_圆弧选择集.Delete End Sub
注:在Autocad中选择集删除的方式对比
RemoveItems 方法从选择集中删除一个或多个项。删除的项仍然存在于图形中,但不再包含在选择集中。
Clear 方法将清空选择集。选择集仍然存在,但不再包含任何项。原来包含在选择集中的项仍然存在于图形中,但不再包含在选择集中。
Erase 方法删除选择集中的所有项。选择集仍然存在,但不再包含任何项。原来包含在选择集中的项也不再存在。
Delete 方法删除选择集和其中的所有项。调用 Delete 方法之后,选择集和原来包含在选择集中的项都将不再存在。
此为本案例的dvb工程文件
案例文件.zip