1、第 14 章 VBA 开发在采矿 CAD 绘图中的应用AutoCAD 在不但提供了强大的绘图功能,同时也提供了一个功能强大的集成开以工具Microsoft Visual Basic for Applications(VBA) 。VBA 是一个 AutoCAD 应用集成开发环境,它提供了高质量的用户化编程能力,能够使 AutoCAD 数据与其它 VBA 应用程序,VBA 的加入扩展了 AutoCAD 集成用户化工具的能力,它集成了 AutoLISP,Visual LISP和 ObjectARX API 等工具。这样,就为用户访问 AutoCAD 软件的多种技术框架提供了新的选择和新的开放机会,可
2、以按用户所需求的工作方式开发应用程序。VBA 开发环境是一个可视化开发环境。使用 VBA 可以通过拖拽图标的方法,简单而可视化地建立用户界面。可以使用 AutoCAD 工具栏,也可以使用标准 VBA 界面工具创建新的工具栏。AutoCAD 软件中的 ActiveX Automation 对象模型十分有用。 Autodesk 开放了每一个 AutoCAD 对象模型,这些对象模型显示了每一个对象的方法和属性,并能够依用户的愿望去编程或用户化 AutoCAD 软件。学习本章内容最好具有 Visual Basic6.0 基础(主要是相关控件的使用方法与 Basic 语言语法结构知识) ,如没有相关基础
3、知识,可在学习本章之前参考相关书籍或在学习本章内容过程中同步使用相关参考书。通过本章的学习,应了解和掌握以下内容: 了解 VBA。 了解 AutoCAD 对象模型。 掌握绘制 AutoCAD 图形对象方法。 掌握编辑图形对象方法。 掌握绘制文字方法。 掌握标注方法。 掌握创建块与插入块。14.1 VBA 基础14.1.1VBA 管理器在当前 AutoCAD 进程中加载的所有 VBA 工程都可以用“VBA 管理器”对话框来管理。这是一个 AutoCAD 的管理工具,可以使用它来加载、卸载、保存、新建、嵌入和提取VBA 工程。 “VBA 管理器” 对话框如图 141 所示。图 141 “VBA 管
4、理器”对话框可以在 AutoCAD 的菜单栏中选择菜单【工具】【宏】【VBA 管理器】来启动“VBA 管理器;也可以在 AutoCAD 命令提示中输入“vbrun”命令来启动。14.1.2 加载已有的工程当把工程加载到 AutoCAD 图形中时,所有的公用子程序也都成为可用的。内嵌在图形中的工程当图形打开时也被加载,而保存在*.dvb 文件中的工程则必须另外单独加载。加载已有的 VBA 工程文件步骤如下:(1)在“VBA 管理器”对话框中单击【加载】按钮,弹出“ 打开 VBA 工程”对话框,如图 142 所示。图 142 “打开 VBA 工程”对话框(2)在“打开 VBA 工程”对话框中选择想
5、要加载的工程文件。在 VBA 管理器中只允许要开有效的 dvb 文件。也可以在命令提示行输入“vbaload” 命令来加载工程文件,该命令同样弹出 “打开 VBA工程”对话框。一个工程加载后,此工程要引用的其他所有工程也都会被自动加载。另外,AutoCAD 再次启动时,会自动加载名称为 acad.dvb 的工程文件。 每次加载工程时,都会显示启用或者禁用工程内程序代码的选项提示,作为防范病毒的措施,如图 143 所示。如果启用了带病毒的宏,程序中的病毒就会开始运行;如果禁用了该宏,工程仍然会被调入,但是该工程中的所有程序均不能执行。图 143 工程加载提示14.1.3 创建新工程新工程可以在任
6、何时候创建,这时它是一个独立、完整的工程。用户可以将它保存到工程文件中,也可以将它嵌入到图形中。建立新的工程步骤如下:(1) “VBA 管理器 ”对话框;(2)单击【新建】按钮,建立新工程。由于篇幅有限卸载工程、嵌入工程、提取工程以及宏的相关知识自行学习。14.2 VBA IDE 开发环境在 AutoCAD 中加载了工程,就可以使用 VBA 交互式开发环境 VBA IDE 来编辑宏工程的程序代码、窗体和部件引用等元素,也可以在 VBA IDE 中删除错误、调试和运行工程。14.2.1 打开 VBA IDE可以使用下面的二种方法之一打开 VBA IDE 开发环境:(1)在命令提示行中输入“vba
7、ide” 命令;(2)从 AutoCAD 的【工具】菜单中选择菜单【宏】“Visual Basic 编辑器” ;打开的 VBA IDE 编辑环境如图 144 所示,在 VBA IDE 中可以对所有已加载的工程进行编辑。图 144 VBA IDE 编辑环境14.2.2 工程元素每个工程都由许多不同的元素构成的。一个工程可以包含的元素有对象、窗体、标准模块、类模块和引用等。 对象。对象元素是指 VBA 工程的程序代码将要存取的对象或者文件,例如,对AutoCAD VBA 工程而言,ThisDrawing 对象代表的是当前的 AutoCAD 图形; 窗体。窗体元素是放置其他对象的容器,它常常用于创建
8、工程的自定义对话框; 标准模块。标准模块也称为程序代码模块,或者简称模块。程序代码模块中包含程序代码行和函数等; 类模块。类模块元素是指所有包含本身的对象,这些对象被定义为类别; 引用。引用元素是指对其他工程或者程序的使用参考。在 VBA IDE 编辑环境可以进行添加新元素、导入元素和编辑元素,具体操作方法及步骤请自行学习。14.3 ActiveX 基础基于 AutoCAD 的 VBA 应用程序就是高级程序语言的计算功能与 AutoCAD 的绘图功能结合,使有 VBA 程序语句来控制对 AutoCAD 图形的操作。要很好地使用 VBA 开发AutoCAD 应用程序,就必须熟悉与要开发的应用程序
9、类型相关的 AutoCAD 实体和对象集合、它们的属性和操作方法,以及都有哪些资源可以使用。引外还需要了解 ActiveX 相关语法知识。在本节学习过程中要注意理解 ActiveX 对象模型。14.3.1AutoCAD 对象模型对象是 AutoCAD ActiveX 接口的主要单位,每一个开放的对象均代表一个 AutoCAD的明确组件,VBA 应用程序就是通过 AutoCAD 的这些对象来控制 AutoCAD 图形的。AutoCAD ActiveX 接口有以下五种类型的对象:代码窗口工程窗口 AutoCAD 图形实体。例如直线、椭圆、圆弧、文字与标注等; AutoCAD 非图形实体。如线型、标
10、注样式、文字样式、表格样式等; AutoCAD 结构实体。如图层与图块等实体; AutoCAD 视图实体。如视图和视口等; 图形和 AutoCAD VBA 应用程序本身。AutoCAD 的对象是分层的,这个分层结构就是应用程序能够操作的对象模型,其中根对象是 Application 对象,对对象的操作是依对象模型的分层关系进行逐级操作的,对象分层结构如图 145 所示。图 145 对象分层结构14.3.1.1Application 对象Application 对象是 AutoCAD ActiveX Automation 对象模型的根对象,在 Application 对象中可以存取任何其他的对象
11、,也可以设置对象的属性和使用方法。此外,Application 对象还可以通过 Documents 集合来访问 AutoCAD 图形,通过 MenuBar 和 MenuGroups 集合来访问 AutoCAD 菜单和工具条,以及通过 VBA 的属性来访问 VBA IDE。对象的结构如图146 所示。图 146 Application 对象14.3.1.2Document 对象Document 对象也就是 AutoCAD 图形,用户可以通过它来引用 AutoCAD 的图形对象和非图形对象。所有 Document 对象都属于Documents 集合。用户通过 Documents 集合可以存取所有图
12、形对象,例如直线、圆和圆弧等,图形对象的存取是通过 Documents 集合下的ModelSpace 和 PaperSpace 集合来实现的。用户通过 Documents 集合也可以存取大部分的非图形对象,例如图层、线型和文字样式等,这些非图形对象的存取是通过 Documents 集合下的Layers、 Linetypes 和 TextStyles 等集合来实现的。Documents 集合的结构如图 147 所示。14.3.1.3 图形对象与非图形对象图形对象也就是图形实体,是组成AutoCAD 图形的主要元素,它在 AutoCAD 中是可以看到的对象,如直线、圆、圆弧文字等。在 VBA 应用
13、程序中创建这些图形对象,需要使用 Add 方法对象,例如创建一个新的直线对象,需要使用 AddLine 方法,创建一个圆弧对象,需要使用 AddArc 方法;在 VBA 应用程序中编辑这些图形对象,可以使用对象本身的方法和属性,每一个图形对象都有方法可以让应用程序执行大部分的 AutoCAD 编辑命令,例如 Move、Erase 和 Mirror 方法等。非图形对象属于 AutoCAD 图形的一部分,但是在绘图窗口中是不可见的,例如Layers、 Linetypes 和 SelectionSets 对象等。在 VBA 应用程序中要创建这些非图形对象,需要使用上一级的 Collection 对象
14、的 Add方法。另外,每一个非图形对象均有特殊用途的方法和属性,都有可以设置及存取扩展实体数据和删除自己的方法。14.3.1.3Preferences、Plot 和 Utility 对象Preferences 集合是 AutoCAD 对象模型下的一个重要对象集合,它的层结构如图 148所示。图 14 7 Documents 集合图 148 Preferences 集合Plot 对象提供对 AutoCAD 中 “页面设置”对话框设置值的存取,应用程序还能够通过该对象以不同的方法来打印图形。Utility 对象提供应用程序中使用的输入函数和转换函数,它在对象模型的层次结构如图 149 所示。如图
15、149 Preference、Plot 和 Utility 对象14.3.2 引用对象引用对象是开发程序必需的工作。可以直接引用对象,也可以先定义一个变量,然后通过变量来引用对象。如果是直接引用对象,需要把对象引入到方法调用语句中。例如,在模型空间中生成一条直线,需要首先定义直线的起点和终点坐标,然后调用 AddLine 方法来创建直线对象。Dim Spoint(0 To 2) As DoubleDim Epoint(0 To 2) As DoubleDim LineObj As AcadLineSpoint(0) = 0Spoint(1) = 0Spoint(2) = 0Epoint(0)
16、= 100Epoint(1) = 100Epoint(2) = 0Set LineObj = ThisDrawing.ModelSpace.AddLine(Spoint, Epoint)如果是通过变量来引用对象,需要把变量定义为所需的对象类型,然后将变量设置为适当的对象。它的格式一般为:Dim Variablename As ObjectTypeSet Variablename = Thisdrawing.14.3.3 存取 Application 对象Thisdrawing 对象提供了连接 Document 对象的功能,而根对象(Application 对象)在对象模型结构层次中是位于 Do
17、cument 对象之上的,因此如何存取根对象就成了一个主要问题。这时需要用 Document 对象的一个名为 Application 的属性,可以用该属性引用Application 对象。14.3.4 使用集合对象集合对象是事先已经定义好的对象,它包含类似于对象的所有引用,也就是对象的所有引用的上一级对象,具有 Collection 对象的集合如表 141 所示。表 141 具有 Collection 对象的集合集合名称 描述Documents 当前 AutoCAD 中打开的全部图形ModelSpace 模型空间中的全部图形对象PaperSpace 当前图纸空间布局中的全部图形对象Block
18、特殊块内的全部实体Blocks 图形中的全部块对象Dictionaries 图形中的全部字典DimStyles 图形中的全部标注样式Groups 图形中的全部对象组Hyperlinks 指定实体的全部超级链接Layers 图形中的全部图层Layouts 图形中的全部布局MenuBar 当前显示在 AutoCAD 中的全部菜单MenuGroups 当前已加载的全部菜单和工具栏RegisteredApplications 图形中全部已注册的应用程序SelectionSets 图形中的全部选择集TextStyles 图形中的全部文字样式UCSs 图形中的全部用户坐标系Views 图形中的全部视图Vi
19、ewports 图形中的全部视口14.3.4.1 存取集合几乎所有的集合对象都是通过 Document 对象来存取的。Document 对象包含每一个集合对象的属性,用户可以对这些属性进行编辑和使用。例如,在下面的程序中定义了一个变量,然后将变量设置为当前图形的 Layers 集合,将来对该变量的使用,就是对AutoCAD 当前图形所有图层的使用。Dim LayerCollection As AcadLayersSet LayerCollection = ThisDrawing.Layers例外的是,Documents 、MenuBar、MenuGroups 这几个集合对象是经过 Applic
20、ation 对象来存取的,Application 对象同样包含了每一个集合的属性。14.3.4.2 向集合对象中添加新成员要在集合对象中添加新成员,需要使用 Add 方法。例如,在下面的程序中创建一个新图层并将它添加到 Layers 集合中。Dim NewLayer As AcadLayerSet NewLayer = ThisDrawing.Layers.Add(“新图层“)14.3.4.3 删除集合对象中成员要在集合对象中删除成员,需要使用 Delete 方法。例如,在下面的程序中删除图层集合中的“新图层 ”。Dim NewLayer As AcadLayerSet NewLayer =
21、ThisDrawing.Layers.Add(“新图层“)NewLayer.Delete14.4 编写程序要想能够快速、顺利地编写应用程序,需要自学掌握以下内容: 属性、方法和事件的概念; 掌握引用对象的方法(通过父对象依次引用) ; 数据类型的概念、创建方法及使用方法; 数组的定义与使用; If.Then.Else 语句; For.Next 语句; Val()函数;具备了上述基本知识就可以在 VBA IDE 环境中轻松编写应用程序了,在编写采矿应用程序时,要对图形进行分析,在 AutoCAD 二次开发过程中,针对固定式图形往往能够取得较好的效果,比如编写“巷道断面”应用程序,编写“ 采煤工作
22、面布置图 ”应用程序等。14.4.1 新建图形新建图形需要用到 Documents 对象的 Add 方法。下面的程序使用 Add 方法,以默认的模板文件建立一个新的图形。Dim NewObject As AcadDocumentSet NewObject = ThisDrawing.Application.Documents.Add14.4.2 打开图形要对已有的图形进行操作,必须先打开它。需要使用到 Documents 对象的 Open 方法。下面的程序使用 Open 方法来打开一个已有的图形文件“Mine.dwg” ,其中 Visual Basic 的Dir 函数用来在打开图形之前检查图形
23、文件是否存在,如果不存在则显示警告信息。使用此例子时应该改变图形文件的名称和路径,指定此图形文件在自己系统中存在的实际位置。Dim FileNameStr As StringFileNameStr = “c:MyDocumentMine.dwg“If Dir(FileNameStr) “ ThenThisDrawing.Application.Documents.Open FileNameStrElseMsgBox “文件“ & FileNameStr & “不存在“End If14.4.2 改变 AutoCAD 窗口的位置和尺寸在 VBA 程序中,可以使用 Application 对象的 W
24、indowTop、WindowLeft 、Width 和Height 属性来定位 AutoCAD 窗口在屏幕左上角的位置和宽度以及高度。下面的程序将AutoCAD 窗口定位在距屏幕左边和顶边均为 10 个像素的位置,并将窗口的宽度与高度均设置为 500 个像素。ThisDrawing.Application.WindowTop = 10ThisDrawing.Application.WindowLeft = 10ThisDrawing.Application.Width = 500ThisDrawing.Application.Height = 50014.4.3 最大化和最小化 AutoCA
25、D 窗口可以通过设置 Application 对象的 WindowState 属性来最大化或者最小化 AutoCAD 窗口。该属性有三个可选值:acMax、acMin、acNorm ,分别对应 AutoCAD 窗口的最大状态、最小状态和正常状态。ThisDrawing.Application.WindowState = acMaxThisDrawing.Application.WindowState = acMinThisDrawing.Application.WindowState = acNorm14.4.4 计算和信息查询使用 Utility 对象所提供的方法,可以快速地解决一些数学计算问题,或者计算出图形上的点。使用 Utility 对象所提供的方法,可以进行如下工作: AngleFromXAxis 方法:找出线与 X 轴的夹角; AngleToString 方法:将字符串表示的角度转换为实数值;