目录
-
(图片来源网络,侵删)- 什么是 VBA?
- 为什么在 AutoCAD 中使用 VBA?
- 如何启用 AutoCAD 中的 VBA?
-
- 打开 VBA 编辑器
- 熟悉 VBA 编辑器界面
- 创建你的第一个 VBA 宏
-
- 理解对象模型
- 常用 AutoCAD 对象介绍
- 操作图形对象
- 用户交互:输入和输出
-
- 实例 1:绘制一个简单的矩形
- 实例 2:创建带属性的块
- 实例 3:批量修改图层和颜色
- 实例 4:创建自定义的绘图工具栏按钮
-
(图片来源网络,侵删)- 错误处理
- 调试技巧
- 代码优化与注释
- 宏病毒警告与安全设置
-
- 官方文档
- 在线社区
- 推荐书籍
第一部分:VBA 与 AutoCAD 的基础
什么是 VBA?
VBA 的全称是 Visual Basic for Applications(应用程序的 Visual Basic),它是一种内嵌在 Microsoft Office(如 Word, Excel)以及 AutoCAD 等众多应用程序中的编程语言,你可以把它理解为一种“胶水”语言,专门用来定制和扩展这些软件的功能,实现自动化任务。
为什么在 AutoCAD 中使用 VBA?
作为一名设计师或工程师,你可能会遇到大量重复性的工作,
- 绘制标准化的零件(如螺栓、螺母)。
- 创建带特定属性的标题栏。
- 批量修改图纸中某个图层的所有对象。
- 自动生成材料清单。
使用 VBA,你可以编写一段代码,让 AutoCAD 自动完成这些工作,从而:

- 极大提高效率:将几小时的工作缩短到几秒钟。
- 减少人为错误:代码的执行是精确和可重复的。
- 实现标准化:确保所有图纸都遵循统一的标准。
- 扩展功能:实现 AutoCAD 本身没有的特定功能。
如何启用 AutoCAD 中的 VBA?
默认情况下,VBA 可能并未在 AutoCAD 中完全启用。
- 打开 AutoCAD。
- 输入命令
APPLOAD并回车。 - 在弹出的对话框中,浏览并找到
acadr14.lsp(对于较新版本,可能是acad.vlx或类似名称,具体取决于版本) 文件,通常它位于 AutoCAD 的安装目录下的Support文件夹中。 - 选中该文件,点击“加载”。
- 关闭对话框,你就可以在 AutoCAD 中使用 VBA 了。
更现代的启用方法(推荐): 在 AutoCAD 的“选项”对话框中,可以找到 VBA 的加载项。
- 输入命令
OPTIONS并回车。 - 切换到“加载点”或“文件”选项卡(不同版本名称可能略有差异)。
- 找到并勾选 "Visual Basic for Applications Support" 相关的选项。
- 重启 AutoCAD。
第二部分:VBA 开发环境入门
打开 VBA 编辑器
在 AutoCAD 中,你可以通过以下几种方式打开 VBA 编辑器:
- 命令行:直接输入
VBAMAN并回车,在弹出的管理器中点击“Visual Basic 编辑器”。 - 工具栏:通过
TOOLS > Macro > Visual Basic Editor菜单。 - 快捷键:
Alt + F11。
打开后,你会看到一个熟悉的 Visual Studio 风格的集成开发环境。
熟悉 VBA 编辑器界面
主要区域包括:
- 菜单栏:包含文件、编辑、视图、插入、运行等标准菜单。
- 工具栏:提供常用操作的快捷按钮(如运行、停止、保存等)。
- 工程资源管理器:显示当前所有打开的 VBA 工程,每个工程可以包含多个模块(
.bas,存放通用代码)、窗体(.frm,用于创建用户界面)和类模块(.cls,用于定义对象)。 - 属性窗口:显示和设置选中对象(如窗体、模块)的属性。
- 代码窗口:这是你编写和编辑代码的地方。
创建你的第一个 VBA 宏
-
在 VBA 编辑器中,点击菜单
Insert > Module,一个新的模块(通常命名为 "Module1")会出现在工程资源管理器中。 -
在代码窗口中,输入以下代码:
Sub HelloAutoCAD() ' 这是一个注释,用于解释代码 MsgBox "你好,AutoCAD VBA 世界!", vbInformation, "欢迎" End Sub -
点击工具栏上的 "▶" 按钮(或按
F5)来运行这段代码。 -
切换回 AutoCAD 界面,你会看到一个弹出的消息框。
如何运行宏?
在 AutoCAD 中,输入 VBAMAN,点击“宏...”,选择你刚刚创建的 HelloAutoCAD,然后点击“运行”。
第三部分:AutoCAD VBA 编程核心
VBA 的强大之处在于它能够操作 AutoCAD 的“对象模型”,想象一下 AutoCAD 是一个由无数个“对象”组成的层级结构。
理解对象模型
- Application 对象:代表 AutoCAD 应用程序本身,它是整个模型的根。
- Document 对象:代表一个打开的图形文件(
.dwg),一个 Application 对象可以包含多个 Document 对象。 - ModelSpace / PaperSpace 对象:代表模型空间或图纸空间,它们是容器,用于存放所有的图形实体。
- 图形实体对象:代表具体的图形元素,如
Line(直线)、Circle(圆)、BlockReference(块参照)等。
常用 AutoCAD 对象介绍
| 对象 | 描述 |
|---|---|
ThisDrawing |
一个全局变量,代表当前活动的文档,这是最常用的入口。 |
ThisDrawing.ModelSpace |
访问当前图形的模型空间。 |
ThisDrawing.PaperSpace |
访问当前图形的图纸空间。 |
ThisDrawing.Layers |
管理图形中的所有图层。 |
ThisDrawing.Blocks |
管理图形中的所有块定义。 |
Utility 对象 |
提供用户交互功能,如获取点、输入文字、选择对象等。 |
操作图形对象
核心思想:使用 Add 方法在 ModelSpace 或 PaperSpace 中创建新对象,或遍历现有对象进行修改。
示例:绘制一条直线
Sub DrawALine()
' 声明变量
Dim startPoint(0 To 2) As Double
Dim endPoint(0 To 2) As Double
' 定义直线的起点和终点坐标
startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0
endPoint(0) = 100: endPoint(1) = 100: endPoint(2) = 0
' 在模型空间中添加一条直线
ThisDrawing.ModelSpace.AddLine startPoint, endPoint
' 更新屏幕,使新绘制的直线可见
ThisDrawing.Regen acAllViewports
End Sub
代码解释:
Dim ... As Double:声明一个包含3个元素的数组,用于存储3D坐标。ThisDrawing.ModelSpace.AddLine ...:调用ModelSpace对象的AddLine方法,传入起点和终点数组,创建一条直线。ThisDrawing.Regen ...:强制重生成视图,确保新图形显示出来。
用户交互:输入和输出
Utility 对象是进行用户交互的关键。
示例:让用户输入一个点来画圆
Sub DrawCircleAtUserPoint()
Dim centerPoint(0 To 2) As Double
Dim radius As Double
' 使用 Utility.GetPoint 方法获取一个点
centerPoint = ThisDrawing.Utility.GetPoint(, "请指定圆心: ")
' 使用 Utility.GetReal 方法获取一个实数(半径)
radius = ThisDrawing.Utility.GetReal("请输入圆的半径: ")
' 如果用户成功输入了半径,则画圆
If Not IsEmpty(radius) Then
ThisDrawing.ModelSpace.AddCircle centerPoint, radius
ThisDrawing.Regen acAllViewports
End If
End Sub
代码解释:
ThisDrawing.Utility.GetPoint(...):暂停程序,等待用户在屏幕上拾取一个点,第一个参数是基点,这里用空表示没有基点;第二个参数是提示文字。ThisDrawing.Utility.GetReal(...):暂停程序,等待用户输入一个实数。IsEmpty(radius):检查用户是否按了 ESC 键取消输入,如果取消,GetReal会返回空值。
第四部分:实战演练 - 从简单到复杂
实例 1:绘制一个简单的矩形
Sub DrawRectangle()
Dim pt1(0 To 2) As Double, pt2(0 To 2) As Double
Dim width As Double, height As Double
' 获取矩形宽度和高度
width = ThisDrawing.Utility.GetReal("请输入矩形宽度: ")
height = ThisDrawing.Utility.GetReal("请输入矩形高度: ")
If IsEmpty(width) Or IsEmpty(height) Then Exit Sub
' 定义角点
pt1(0) = 0: pt1(1) = 0: pt1(2) = 0
pt2(0) = width: pt2(1) = height: pt2(2) = 0
' 绘制四条边
ThisDrawing.ModelSpace.AddLine pt1, Array(pt1(0), pt2(1), 0)
ThisDrawing.ModelSpace.AddLine Array(pt1(0), pt2(1), 0), pt2
ThisDrawing.ModelSpace.AddLine pt2, Array(pt2(0), pt1(1), 0)
ThisDrawing.ModelSpace.AddLine Array(pt2(0), pt1(1), 0), pt1
ThisDrawing.Regen acAllViewports
End Sub
实例 2:创建带属性的块
这个例子稍微复杂,需要几个步骤:
- 绘制块的几何图形(一个矩形)。
- 创建属性定义(Attribute Definition)。
- 将几何图形和属性定义组合成一个块定义。
Sub CreateBlockWithAttribute()
Dim blockName As String
Dim insertionPoint(0 To 2) As Double
Dim obj As Object
blockName = "MyTitleBlock"
insertionPoint(0) = 0: insertionPoint(1) = 0: insertionPoint(2) = 0
' 1. 检查块是否已存在,若存在则删除
On Error Resume Next ' 忽略错误
ThisDrawing.Blocks.Item(blockName).Delete
On Error GoTo 0 ' 恢复错误处理
' 2. 创建新的块定义
Dim blockObj As AcadBlock
Set blockObj = ThisDrawing.Blocks.Add(insertionPoint, blockName)
' 3. 在块中绘制几何图形(一个矩形)
Dim rectPts(0 To 2) As Double
rectPts(0) = 100: rectPts(1) = 50: rectPts(2) = 0
blockObj.AddLine insertionPoint, rectPts
blockObj.AddLine rectPts, Array(100, 0, 0)
blockObj.AddLine Array(100, 0, 0), Array(0, 0, 0)
blockObj.AddLine Array(0, 0, 0), insertionPoint
' 4. 在块中创建属性定义
Dim attribObj As AcadAttributeDefinition
Set attribObj = blockObj.AddAttributeDefinition(10, 10, 0, "图纸名称", "Title", "默认图纸名")
' 5. 插入这个块到模型空间
Dim blockRefObj As AcadBlockReference
Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPoint, blockName, 1, 1, 1, 0)
ThisDrawing.Regen acAllViewports
MsgBox "块 '" & blockName & "' 创建成功!"
End Sub
实例 3:批量修改图层和颜色
这个例子展示了如何遍历对象集合。
Sub ChangeLayerAndColor()
Dim selSet As AcadSelectionSet
Dim entity As Object
Dim color As Integer
' 创建一个选择集对象
On Error Resume Next
ThisDrawing.SelectionSets("MySelSet").Delete
On Error GoTo 0
Set selSet = ThisDrawing.SelectionSets.Add("MySelSet")
' 让用户选择要修改的对象
selSelectOnScreen ' 让用户在屏幕上选择对象
If selSet.Count = 0 Then
MsgBox "没有选择任何对象。"
Exit Sub
End If
' 获取目标颜色(红色)
color = acRed ' acRed 是一个预定义的颜色常量
' 遍历选择集中的每一个对象
For Each entity In selSet
' 修改对象的颜色
entity.Color = color
' 修改对象所在的图层(假设图层名为 "NEW_LAYER")
entity.Layer = "NEW_LAYER"
Next entity
' 清理选择集
selSet.Delete
ThisDrawing.Regen acAllViewports
MsgBox "已成功修改 " & selSet.Count & " 个对象的图层和颜色。"
End Sub
实例 4:创建自定义的绘图工具栏按钮
这是将你的宏集成到 AutoCAD 界面的终极方法。
- 创建宏:像前面一样,写一个你想要绑定的宏,
Sub DrawMyRectangle()。 - 创建按钮图像:创建一个 BMP 图像文件(16x16 或 32x32 像素)。
- 加载 CUI 文件:
- 在 AutoCAD 中,输入
CUSTUMIZE命令。 - 在“自定义用户界面”编辑器中,展开“工具栏”。
- 右键点击“所有 CUI 文件中的自定义”下的“工具栏”,选择“新建工具栏”。
- 给你的新工具栏命名,"My Tools"。
- 在右侧的“命令列表”中,找到“宏”类别。
- 将你的宏(
DrawMyRectangle)拖拽到左侧新建的 "My Tools" 工具栏上。 - 右键点击新添加的按钮,可以修改其名称、说明,并点击“浏览”加载你创建的 BMP 图像。
- 点击“确定”保存。
- 在 AutoCAD 中,输入
- 你的自定义工具栏就会出现在 AutoCAD 界面上,点击按钮即可运行你的宏。
第五部分:高级主题与最佳实践
错误处理
使用 On Error 语句来处理程序运行时可能发生的错误,避免程序意外崩溃。
Sub SafeOperation()
On Error GoTo ErrorHandler ' 如果发生错误,跳转到 ErrorHandler 标签
' 这里是可能出错的代码
ThisDrawing.Utility.GetPoint(, "请拾取一个点: ")
' 如果一切顺利,在这里退出
Exit Sub
ErrorHandler:
' 错误处理代码
MsgBox "发生了一个错误: " & Err.Description, vbCritical, "错误"
' 可以选择记录日志或恢复程序状态
End Sub
调试技巧
- 断点:在代码行号前单击,设置断点,程序运行到此处会暂停。
- 逐语句执行:按
F8,一行一行地执行代码,观察变量变化。 - 即时窗口:在 VBA 编辑器中,点击
View > Immediate Window,可以在其中输入? 变量名来查看变量的当前值。
代码优化与注释
- 注释:使用 或
REM来写注释,解释代码的意图。 - 变量命名:使用有意义的变量名,如
blockName而不是bn。 - 代码缩进:使用
Tab键对代码进行缩进,使其结构清晰,易于阅读。
宏病毒警告与安全设置
VBA 宏可能被恶意利用,AutoCAD 默认会警告宏的启用。
- 安全级别:在
OPTIONS > 文件 > 安全性中,可以设置宏的安全级别。 - 信任特定位置:如果你经常使用自己写的宏,可以将存放宏的文件夹添加到“信任的位置”中,这样该文件夹下的宏就不会被警告。
第六部分:学习资源与进阶
官方文档
- AutoCAD VBA Developer's Guide:这是最权威的文档,详细介绍了所有对象、方法和属性,在 AutoCAD 的帮助文档中可以找到。
- AutoCAD ActiveX and VBA Reference:一个快速参考手册,列出了所有可用的 API。
在线社区
- The Swamp (theswamp.org):一个非常活跃的 AutoCAD LISP 和 VBA 开发者论坛,高手云集,问题总能得到解答。
- CAD Tutor (cadtutor.net):提供大量优秀的 AutoCAD 编程教程和实例。
- Stack Overflow:搜索 "autocad vba" 或 "autocad vba addline",你会发现海量的问答。
推荐书籍
- 《AutoCAD VBA 编程基础与应用》:国内经典入门书籍。
- 《Mastering AutoCAD VBA》:国外经典,内容更深入。
学习 AutoCAD VBA 是一个循序渐进的过程,从 Hello World 开始,理解对象模型,然后通过一个个小实例(画线、画圆、改图层)来巩固知识点,最终挑战更复杂的功能(创建块、创建界面、集成到工具栏),遇到问题时,善用搜索引擎和开发者社区,你会发现一个全新的、充满可能性的 AutoCAD 世界,祝你学习愉快!
