AutoCAD VBA二次开发.doc
第11章 AutoCAD VBA二次开发 自从1986年AutoLISP作为第一个用于AutoCAD二次开发的编程语言被引入到AutoCAD中,从此许多计算机软件开发商和用户用AutoLISP编写了数以万计的实用系统和应用程序。还有大量的程序是利用AutoCAD的外部文件(Script)对AutoCAD进行二次开发。对AutoCAD来说这无疑是一笔巨大的资源和财富,也是其赖以发展的基础之一。 11.1 概述 11.1.1 AutoCAD中实现ActiveX AutoCAD ActiveX使用户能够从AutoCAD的内部或外部以编程方式来操作AutoCAD,它是通过将AutoCAD对象显示到“外部世界”来做到这一点的。一旦这些对象被显示,许多不同的编程语言和环境以及其他应用程序(例如Microsoft Office中的Word VBA或Excel VBA)就可以访问它们。 在AutoCAD中实现ActiveX接口有两大优点 1 更多的编程环境可以编程访问AutoCAD图形。在ActiveX Automation出现以前,开发人员只能使用AutoLISP或C接口。 2 与其他Windows应用程序(例如Microsoft Office中的Excel和Word)共享数据变得更加容易。 对象是所有ActiveX应用程序的主要构造块,每一个显示的对象均精确代表一个AutoCAD组件,AutoCAD ActiveX接口中有许多不同类型的对象。例如,直线、圆弧、文字和标注等图形对象是对象;线型与标注样式等样式设置是对象;图层、编组和块等组织结构是对象;视图与视口等图形显示是对象;甚至图形、AutoCAD应用程序本身也是对象。 11.1.2 AutoCAD中的VBA VBA为Visual Basic for Application的缩写。AutoCAD中的VBA是指必须依赖于已有的AutoCAD应用程序才能运行的Visual Basic程序。 Microsoft VBA是一个面向对象的编程环境,可提供类似Visual BasicVB的丰富开发功能。VBA和VB的主要差别是VBA和AutoCAD在同一进程空间中运行,提供的是具有AutoCAD智能的、非常快速的编程环境。VBA也向其他支持VBA的应用程序提供应用程序集成,这就意味着AutoCAD(使用其他应用程序对象库)可以是如Microsoft Word或Excel之类的其他应用程序的Automation控制程序。 在AutoCAD中实现VBA有四大优点 1 Visual Basic编程环境易于学习和使用。 2 VBA可与AutoCAD在同一进程空间中运行,这使程序执行得非常快。 3 对话框的构造快速而有效。这使开发人员可以构造原型应用程序并迅速收到设计的反馈。 4 工程可以是独立的,也可以嵌入到图形中。这样就为开发人员提供了非常灵活的方式来发布他们的应用程序。 新工程会被创建为未保存的全局工程。创建完成后,可以将它嵌入到图形中或保存到工程文件中。 11.2 VBA基础 11.2.1 VBA工程 AutoCAD VBA工程是由许多程序模块、类模块和窗体组成的集合,他们同时运行即可完成指定的功能。VBA工程可以保存于AutoCAD图形文件内部,称为内嵌VBA工程;亦可保存为独立的工程,称为全局VBA工程,以*.dvb文件格式保存。 对于内嵌VBA工程,当打开包含该工程的AutoCAD图形文件时,它将被自动加载。因此,在运行内嵌VBA工程程序之前,其用户不须在文件夹中去寻找工程文件并加载该工程,使得工程管理更加方便。 全局VBA工程的功能较多。全局工程可在任何AutoCAD图形中运行,亦可在工程中打开或关闭AutoCAD图形。全局工程容易与其他用户共享,且可制作成共享的宏 宏是一个可执行的应用子程序,每个VBA工程至少包含一个宏。 资源库,因此应用VBA开发通用应用程序时,应将其保存为全局工程。但全局工程也有一些缺点,它不会随AutoCAD图形文件的打开而自动加载。所以,用户在运行全局工程程序之前须要知道哪个工程文件中包含了所需的宏,然后加载该工程文件,最后才能执行相应的宏。 11.2.2 VBA管理器 在当前AutoCAD进程中加载的所有VBA工程均可用VBA管理器来管理,亦可用它来新建、保存、加载、卸载、嵌入或提取工程。“VBA管理器”对话框如图11.1所示。 启动“VBA管理器”对话框的命令调用方法为 命令行VBARUN 菜单栏【工具】→【宏】→【VBA管理器】 与VBA应用程序开发、管理相关的下拉菜单如图11.2所示。 图11.1 “VBA管理器”对话框 图11.2 与VBA应用程序开发、管理相关的下拉菜单 1. 创建新VBA工程 创建新VBA工程的步骤如下 1 打开“VBA管理器”对话框。 2 选择“新建”。 新工程将以默认的名称“ACADProject”创建。如要更改工程名称,必须进入“Visual Basic编辑器”中,在“工程属性”窗口中更名。其操作方法步骤如下 1 单击“VBA管理器”中的“Visual Basic编辑器”按钮(如图11.1所示)或用菜单选择“Visual Basic编辑器”(如图11.2所示),打开“Microsoft Visual Basic”,如图11.3所示。 2 在VB的“工程资源管理器”选中“ACADProjectGlobal1”,单击右键,在弹出菜单中选择“ACADProject属性”选项,打开“工程属性”对话框,在“工程名称”中输入用户欲更改的名称,如图11.4所示。 图11.3 Visual Basic编辑器 图11.4 “工程属性”对话框 2. 保存新VBA工程 每次保存图形文件时,都将保存其内嵌工程。而全局工程必须使用VBA管理器或VB编辑器来保存。使用VBA管理器保存工程的步骤 1 打开VBA管理器,并选择要保存的工程。 2 选择“另存为”,将会打开“另存为”对话框。 3 选择用于保存该工程的文件的名称。 4 单击“保存”按钮。 3. 加载VBA工程 将工程加载到AutoCAD图形中时,所有的公用子程序(也称为宏)均为可用程序。每次打开图形时,内嵌在图形中的工程就会被自动加载,而以*.dvb文件格式保存的全局工程必须明确加载方能运行。 每次加载工程时,都将自动加载此工程引用的任何其他工程。此外,AutoCAD在启动时会自动加载任何名为acad.dvb的工程文件。 加载已有VBA工程文件的步骤如下 1 在“VBA管理器”对话框中单击“加载”按钮,弹出“打开VBA工程”对话框,如图11.5所示。 图11.5 “打开VBA工程”对话框 2 在“打开VBA工程”对话框中选择欲加载的工程文件。 3 单击“打开”按钮,再单击“启用宏”按钮。打开VB编辑器即可查看、编辑或运行该程序。 注意用户在加载工程时,均会显示“禁用宏”或“启用宏”的选项提示,作为防范病毒的提示,如图11.6所示。若启用了带病毒的宏,程序中的病毒会一并运行;若禁用该宏,工程仍可被调用,但不能运行该工程中的任何程序。 图11.6 工程加载防范病毒提示提示 4. 卸载VBA工程 卸载工程可释放内存,并使已加载工程的列表保持在易于管理的长度。但不能卸载内嵌工程或被其他已加载工程所引用的工程。 卸载VBA的步骤如下 1 在“VBA管理器”对话框中选择欲卸载的工程。 2 单击“卸载”按钮。 11.2.3 VBA IDE IDE为Integrated development environment的缩写,即集成开发环境。 在AutoCAD中加载VBA工程后,即可使用VBA交互式开发环境IDE来运行、调试程序或删除错误,亦可在IDE中继续编辑该工程的程序代码、窗体和部件引用等元素。 1. 打开VBA IDE 可用以下两种方法打开VBA IDE 命令行VBAIDE 菜单栏【工具】→【宏】→【Visual Basic编辑器】 VBA IDE界面如图11.7所示,在其中可对所有已加载的工程进行编辑。 图11.7 VBA IDE界面 2. 工程信息 在VBA IDE中,“工程”窗口显示的内容包括所有已加载的VBA工程,这些工程所包含的程序代码、类别、窗体、与工程相关的文件,本工程所引用的其他VBA工程,这些工程所在的位置(路径)等,如图11.8所示。 “工程”窗口的顶部为包含3个按钮的工具条,通过切换按钮可显示不同的工程元素。选中工程模块中的“窗体”后,单击“查看代码”按钮可显示该工程模块的程序代码;单击“查看对象”按钮可显示该工程元素对象的外观,如窗体界面。 “工程”窗口在默认状态下是打开的。若不可见,可在IDE中用菜单操作“【视图】→【工程资源管理器】”来打开。 查看代码 切换文件夹 查看对象 图11.8 “工程”窗口 3. 工程元素 每个工程均由若干不同的元素构成,包含对象、窗体、标准模块、类模块和引用等。 1 对象 对象是工程中的基本运行实体。VBA中的对象可分为两类,一类是由系统设计好,可直接使用或对其进行操作的对象;另一类是用户定义,可用程序建立用户自己的对象。对象是具有特殊属性(数据)和行为方式(方法)的实体,它由属性、事件和方法这3个重要方面构成。 2 窗体模块 窗体模块分为两部分,一部分是作为用户界面的窗体,另一部分是执行具体操作的代码。窗体是放置其他对象的容器,常用于创建工程的自定义交互式对话框。 3 标准模块 又叫程序代码模块,简称模块。该模块完全由代码组成,这些代码不与具体的窗体或控件相关联。 4 类模块 类模块既包含代码又包含数据,每个类模块定义一个类。可在窗体模块中定义类的对象,调用类模块中的过程。 4. 添加新元素 用户可在工程中添加新元素,比如插入新的窗体、模块或类模块等。添加新元素后,用户可修改元素的性质(例如元素名称)和编写程序代码。 用户命名新元素时,应遵循规范的命名惯例,即“见名知义”,提高程序的可读性。 在工程中添加新元素的步骤如下 1 在VBA IDE的“工程”窗口中选择要添加元素的工程。 2 从“插入”菜单中选择“添加用户窗体”、“添加模块”或“添加类模块”选项,将新元素添加到该工程中。 新的元素加入到工程后,会以默认的属性出现在“工程”窗口中。 5. 编辑元素 元素的编辑包括对属性、代码和对象的编辑等。 1 元素属性编辑 在“工程”窗口中选取被编辑的元素,“属性”窗口中将显示其属性,如图11.9所示。将光标定位于“属性”窗口右边的属性值栏,即可修改为需要的属性值。 2 代码编辑 在“工程”窗口中选取被编辑的元素(窗体、模块或类模块),再单击窗口顶部的“查看代码”按钮,即可打开程序代码窗口并编辑程序代码,如图11.10所示。 图11.9 “属性”窗口 图11.10 “程序代码”窗口 3 窗体编辑 在“工程”窗口中选取被编辑的窗体模块,再单击窗口顶部的“查看对象”按钮,即可打开窗体窗口和控件工具箱,如图11.11所示。用户可在该窗口中增删对象、编辑对象的属性或编辑与窗体关联的程序代码。双击窗体窗口中的控件,可在程序代码窗口中显示与该控件相关的程序代码。 图11.11 “窗体”窗口 11.3 VBA二次开发实例 在学习了AutoCAD VBA基础知识后,接下来介绍一个简单实例。通过该实例的学习,我们可以初步掌握开发VBA应用程序的一般过程。 训练11.1 应用VBA编写输入起点和终点坐标绘制直线的参数化程序。 应用VBA程序绘制直线的方法为AddLineStartPoint, EndPoint,其中StartPoint, EndPoint为起点、终点坐标,必须为3元素列表(即数组)。 操作步骤如下 1 打开VBA管理器,单击“新建”按钮,添加名称为“ACADProject”、位置为“Global2”的新工程,如图11.12所示。选中该工程后,再单击“另存为”将之保存于D盘,名称为“DrawLine.dvb”。 图11.12 VBA管理器 2 打开VBA IDE,在“插入”菜单中选择“用户窗体”插入新窗体。 3 打开“工具箱”(如图11.13所示),点击“框架”按钮,在窗体中建立两个框架,分别用于起点和终点坐标的输入;再点击“标签”和“文字框”按钮,在两个框架中分别建立用于输入起点和终点坐标的标签和对话框;再点击“命令按钮”按钮,在用户窗体中建立“确定”和“结束”按钮。 图11.13 “用户窗体”编辑窗口 4 打开“属性窗口”(如图11.14所示),在“用户窗体”中依次点击控件,在其“属性窗口”中设置相应属性。按表11.1所示设置窗体及控件的相应属性。 图11.14 “属性”设置窗口 表11.1 绘制直线的窗体及控件属性设置 窗体及控件名称 属性 设置值 作用 窗体 Name frmLine Caption 参数化绘直线练习 框架 Name fraSP,fraEP Caption 起点坐标,终点坐标 标签 Name lblXS,lblYS,lblZS, lblXE,lblYE,lblZE Caption x_start,y_start,z_start, x_end,y_end,z_end 提示输入直线起点、终点坐标值 文本框 Name txtXS,txtYS,txtZS, txtXE,txtYE,txtZE Text 10,10,0,40,40,40 输入直线起点、终点坐标值 命令按钮 Name OK_Click,End_Click Caption 确定,结束 点击按钮 5 双击“确定”按钮打开“代码窗口”,在行Private Sub OK_Click 和行End Sub之间输入以下代码 ThisDrawing.Application.Documents.Add ’ 打开新图形 Dim StartPoint0 To 2 As Double ’ 定义起点坐标 Dim EndPoint0 To 2 As Double ’ 定义终点坐标 StartPoint0 txtXS ’ 提取起点x坐标 StartPoint1 txtYS ’ 提取起点y坐标 StartPoint2 txtZS ’ 提取起点z坐标 EndPoint0 txtXE ’ 提取终点x坐标 EndPoint1 txtYE ’ 提取终点y坐标 EndPoint2 txtZE ’ 提取终点z坐标 Dim LineObj As AcadLine ’ 定义Line对象 ’ 设置Line对象 Set LineObj ThisDrawing.ModelSpace.AddLine StartPoint, EndPoint ThisDrawing.SaveAs“D\Line_Ex.dwg“ ’ 保存图形 6 双击“结束”按钮打开“代码窗口”,在行Private Sub End_Click 和行End Sub之间输入代码“End”,用于结束程序。 步骤5、6输入的代码如图11.15所示。 7 从VBA IDE的“运行”菜单中选择“运行子程序/用户窗体”选项或按F5键来运行程序。 8 当程序运行完时,AutoCAD应用程序将置于最前。此时可在图形中看到直线,且图形的文件名称为Line_Ex.dwg。 图11.15 实例的代码窗口 注VBA中的出错处理方法 在VB和VBA中,使用On Error语句来捕获运行时错误。此语句为系统设置精确的捕获。当错误发生时,此语句会自动转到专门编写的错误处理程序,系统的默认错误处理则被略过。 On Error 语句有三种形式 1 On Error Resume Next 2 On Error GoTo Label 3 On Error GoTo 0 当希望忽略错误时,可以使用On Error Resume Next语句。此语句捕获错误但是不会显示错误信息或者终止程序,而是移到下一行代码继续执行。例如,如果希望创建子例程来遍历模型空间并修改每个图元的颜色,则在试图对锁定图层上的图元着色时AutoCAD将会抛出错误。这时不需要终止过程,而只需要跳过锁定图层上的图元并继续处理其余的图元。On Error Resume Next语句就可以完成这个过程。 当希望编写明确的处理程序时,可以使用On Error GoTo Flag语句(Flag为标记)。此语句捕获错误但不会显示错误信息或者终止程序,而是跳到代码中的特定位置。然后代码可以使用适当的方式来响应错误。例如,可以扩充上一个样例,以显示包含锁定图层上每个图元句柄的消息。 训练11.2 应用VBA编写输入圆心、半径、起始角和终止角绘制圆弧的参数化程序。 应用VBA程序绘制样条曲线的方法为AddArcCenter, Radius, StartAngle, EndAngle,其中,Center为圆心坐标3元素列表,Radius为圆弧半径,StartAngle, EndAngle为圆弧起始、终止角(弧度)。 按训练11.1的方法和步骤设计参数化绘制圆弧的VBA程序,其步骤依次为打开VBA IDE、插入用户窗体并设置属性、插入控件并设置属性、编写代码、调试运行程序、保存工程。参数化绘制圆弧的窗体如图11.16所示,并按表11.2所示设置窗体及控件的相应属性。 图11.16 绘制圆弧的窗体 表11.2 绘制圆弧的窗体及控件属性设置 窗体及控件名称 属性 设置值 作用 窗体 Name frmArc Caption 参数化绘圆弧练习 标签 Name lblXCen,lblYCen,lblZCen, lblArcR,lblStaAng,lblEndAng, lblSAUnit,lblEAUnit Caption x_CenPoint,y_CenPoint,z_CenPoint, ArcR,StaAng,EndAng, (角度单位), 提示输入圆心坐标、半径、角度值及角度单位 文本框 Name txtXCen,txtYCen,txtZCen, txtRadius,txtStaAng,txtEndAng Text 50,70,0,30,20,160 输入圆心坐标、圆弧半径及圆弧起始、终止角度值 命令按钮 Name OK_Click,End_Click Caption 确定,结束 点击按钮 参数化绘制圆弧的主要代码如下 Private Sub OK_Click Dim pi As Double pi 4 * Atn1 ’ 定义常数π ThisDrawing.Application.Documents.Add ’ 打开新图形 Dim ArcCenter0 To 2 As Double ’ 定义圆弧中心 Dim ArcRadius As Double ’ 定义圆弧半径 Dim StartAngle As Double ’ 定义圆弧起始角 Dim EndAngle As Double ’ 定义圆弧终止角 ArcCenter0 txtXCen.Text ’ 提取圆弧中心X坐标 ArcCenter1 txtYCen.Text ’ 提取圆弧中心Y坐标 ArcCenter2 txtZCen.Text ’ 提取圆弧中心Z坐标 ArcRadius txtRadius.Text ’ 提取圆弧半径 StartAngle txtStaAng.Text * pi / 180 ’ 提取圆弧起始角并转换为弧度 EndAngle txtEndAng.Text * pi / 180 ’ 提取圆弧终止角并转换为弧度 Dim ArcObj As AcadArc ’ 定义Arc对象 ’ 设置Arc对象 Set ArcObj ThisDrawing.ModelSpace.AddArcArcCenter, ArcRadius, StartAngle, EndAngle ThisDrawing.SaveAs “D\Arc_Ex.dwg” ’ 保存图形 End Sub 训练11.3 应用VBA编写输入基圆半径和展角上限绘制渐开线的参数化程序。 渐开线为常用工程曲线,在机械设计基础或机械原理教材中有详细介绍。在VBA中,可采用样条曲线拟合的方法绘制渐开线。 在如图11.17所示的直角坐标系Oxy中,渐开线上点K的坐标为[7]187 11.1 式中,形成渐开线的基圆半径; 用弧度表示的渐开线上K点对应的展角,且。 渐开线的切线方向可用其斜率(导数)表示,即 11.2 图11.17 直角坐标系下的渐开线 应用VBA程序绘制样条曲线的方法为AddSplinePointsArray, StartTangent, EndTangent,其中,PointsArray为样条曲线(渐开线)拟合点的3维坐标组成的列表(即数组,必须为3的倍数),StartTangent,EndTangent为样条曲线的起点和终点切向向量(必需为3元素列表,切向必需与曲线的走向一致)[8]。起点的切向竖直向上[7]181-183,可取0, 1, 0;根据式11.2可知终点的切向为。 可根据精度要求将所绘渐开线的展角上限等分为J个区间(程序中取J10),应用ForNext循环计算拟合点的坐标。首先按下式计算展角 , j0, 1, 2, , J 11.3 再用式11.1计算点K的坐标xKj, yKj。 图11.18 绘制渐开线的窗体 绘制渐开线及基圆的窗体如图11.18所示,程序如下 Private Sub OK_Click ThisDrawing.Application.Documents.Add pi 4 * Atn1 ’ 定义常数π Dim rb As Double ’ 定义基圆半径 Dim theta0 As Double ’ 定义渐开线展角 Dim InvPoint0 To 32 As Double ’ 定义拟合点坐标 Dim SPtan0 To 2 As Double ’ 定义起点切线方向 Dim EPtan0 To 2 As Double ’ 定义终点切线方向 Dim InvObj As AcadSpline ’ 定义Spline对象 rb txtRb.Text theta0 txtTheta0.Text * pi / 180 ’ 将角度转换为弧度 delta_theta theta0 / 10 For j 0 To 10 theta j * delta_theta InvPointj * 3 rb * Sintheta - theta * Costheta InvPointj * 3 1 rb * Costheta theta * Sintheta InvPointj * 3 2 0 Next j SPtan0 0 SPtan1 1 SPtan2 0 EPtan0 1 EPtan1 1 / Tantheta0 EPtan2 0 ’ 设置Spline对象 Set InvObj ThisDrawing.ModelSpace.AddSplineInvPoint, SPtan, EPtan ’ 绘制基圆 Dim CirObj As AcadCircle ’ 定义Circle对象 Dim CenPoint0 To 2 As Double ’ 定义圆心坐标 CenPoint0 0 CenPoint1 0 CenPoint2 0 ’ 设置Circle对象 Set CirObj ThisDrawing.ModelSpace.AddCircleCenPoint, rb ThisDrawing.SaveAs “D\Draw_Inv.dwg” End Sub 16 参考文献 [1] 宋宪一. 计算机辅助工程绘图[M]. 北京 机械工业出版社, 2002. [2] 姜勇. AutoCAD中文版机械制图基础培训教程[M]. 北京 人民邮电出版社, 2005. [3] 谢泽学, 吴京霞, 谢婧. AutoCAD2004简明教程[M]. 北京 科学出版社, 2006. [4] 刘力, 王冰. 机械制图[M]. 北京 高等教育出版社, 2000. [5] 刘小年, 刘振魁. 机械制图[M]. 北京 高等教育出版社, 2000. [6] 李凤华. AutoCAD 2002/2000 VBA开发指南[M]. 北京 清华大学出版社, 2001. [7] 孙桓, 傅则绍. 机械原理[M]. 第4版. 北京 高等教育出版社, 1993. [8] 车林仙, 何兵. 基于AutoCAD的摆线型转子泵实体参数化造型[J]. 现代制造工程, 20058 94-96. 17