1、 VBA 开发 AUTOCAD 实现参数化绘图王若慧Realizing The Parameter-Drawing taking the VBA and AUTOCAD(.山西大学工程学院,山西省 太原,030013)Wang Ruo HuiEngineering Colledge of SHANXI University, Taiyuan 030013)摘要: 介绍了采用 VBA(Visual Basic for Application)进行 AutoCAD2005 的二次开发,应用 AutoCAD ActiveX Automation接口技术访问 AutoCAD 对象,采用 ADO 实现
2、AUTOCAD 与Microsoft Access2000 的数据通信,实现程序参数化绘图的基本思路及程序设计流程. 关键词:VBA AutoCAD ActiveX Automation ADO 参数化绘图Abstract: Taking the ActiveX Automation of VBA and AutoCAD2005 to access the AutoCAD drawings, and the ADO to make the data communication between the AUTOCAD and ACCESS , the parameter-drawing can
3、be well realized in the way what is described in the article .Key words:VBA AutoCAD ActiveX Automation ADOthe parameter-drawing引言:传统的人机交互式绘图一般需要用精确的尺寸值定义几何元素,输入的每一条线都必须有确定的位置,图形一旦建立,即使结构相似但想改变图形大小尺寸,只能对图形进行编辑。而在工程设计中,一方面,进行新产品设计时不可避免地需要多次反复修改,需要进行多方面的综合协调和优化;另一方面,许多的专业图纸设计中,很多图形结构具有一定的相似性,往往只是尺寸的大小不
4、同,其图形随尺寸参数的变化而相应变化。因此,希望有一种比交互式绘图更方便、更高效、更适合结构相似图形绘制的方法.为了解决这个问题,我们可研制出一种绘图软件,图中尺寸参数通过交互方式输入,随后通过运行有关程序,确定所有的绘图信息,自动绘出图形,这种工作方式通常称为程序参数化绘图.这就是参数化绘图要解决的问题,同时它也是 CAD 系统很重要的一个环节.1. 程序参数化绘图的实质程序参数化绘图主要适用于图形结构形式基本固定而结构尺寸参数变化的图形。程序参数化绘图的实质,就是将图形信息记录在程序中。图形的描述通常可分为:图形的拓扑关系、图形的几何参数以及这些几何参数与图形结构参数之间的联系。通常用一组
5、变量记录图形的几何参数,用一系列的赋值语句表达几何参数与结构参数之间的关系,然后用一系列的调用语句来描述图形的拓扑关系。如图 1 所示图形的几何参数是四个点的坐标(x1,y1) , (x2,y2) ,(x3,y3)和(x4,y4) ,结构参数是两个尺寸 a 和 b。这些参数之间的关系为:x1=x4; y1=y2;x2=x3;y3=y4 ;x2=x1+a ;y3=y1+b 。(x4,y4) (x3,y3)b (x1,y1) a (x2,y2) 图 1 图形的描述2. 程序参数化绘图的实现途径为了实现参数化绘图,需要建立一个计算机图形软件系统应用这个系统可以简化图形设计应用程序的编制,并能方便地应
6、用计算机程序实现图形地输入和输出建立一个图形系统可以有三种方式:(1)设计专用图形语言(2)修改高级程序设计语言,使其具有图形处理的功能(3)建立图形设计程序包前两种方式都需要用低级或高级语言重写一个编译器一般来说,修改或者重写一个编译器的工作量比较大,而且图形设计过程并非简单的数据处理过程,还包括许多文件结构和存贮结构的问题,从而使上述工作的复杂性大大增加有些绘图软件配有内部专用绘图语言,如 AutoCAD 配有 AutoLISP 编程语言,DDM/DIMENSION3 图形软件配有 DAL 绘图语言等,利用这些语言用户可以开发参数化绘图软件但是这些语言的数组,循环,函数,逻辑关系等功能一般
7、较差,不宜作大量的计算工作,编程也不太方便第三种方式即建立图形设计程序包,其基本思想是选择一种合适的高级程序设计语言作为主语言,在此语言中扩展一系列的过程调用,以实现图形设计工作在这种情况下,用户编写的图形描述程序由两部分组成:一是主语言语句,另一个是主语言中扩展了的过程调用语句在扩充某种高级语言使其具有图形处理功能时,最好能利用已有的较成熟的图形软件3. 程序参数化绘图的技术路线要实现程序参数化绘图程序的编制, 本文采用 AutoCAD2005 为绘图支撑软件,采用 VBA(Visual Basic for Application)进行 AutoCAD2005的二次开发,运用 AutoCAD
8、实现参数化绘制工程图纸.3.1 AUTOCAD2005 简介1. AutoCAD 是当今最流行的二维绘图软件, AutoCAD 有强大的二维功能,如绘图、编辑、剖面线和图案绘制、尺寸标注以及二次开发等功能,同时有部分三维功能。2. 尽管 AutoCAD 是一个非常好的通用计算机辅助绘图和设计软件系统,但每一行业和专业都有自的行业和专业标准,许多单位也有自己的技术规格和企业标准,每个设计工程师和绘图员更有各自独特的工作方式和习惯。因而 AutoCAD 不可能完全满足每个用户的具体而特定的要求。对 AutoCAD 进行定制和二次开发,能使 AutoCAD 可以更加符合用户的需求,更方便、更规范、更
9、专业的实现设计和绘图中的应用。AutoCAD 提供的开放式体系结构正是为使用户可以根据各自的需求来改进和扩充 AutoCAD 的许多功能而着想的3. AutoCAD 提供 AutoLISP、ADS 、ARX、VBA 作为二次开发的工具。在许多实际应用领域(如机械、建筑、电子)中,一些软件开发商在 AutoCAD 的基础上已开发出许多符合实际应用的软件,很好的实现了参数化绘制工程图纸.3.2 VBA 开发 AutoCAD2005采用面向对象的程序设计方法, 使用 Visual Basic 在 AutoCAD2005 上用 VBA 技术进行二次开发, 能够较好地实现系统程序参数化绘图。VBA 是通
10、过 AutoCAD ActiveX Automation 接口来建立和 AutoCAD 对象间的联系。ActiveX 是建立在 COM 对象模型之上的一个标准通信协议,它允许对象之间通过一定的接口相互通信。而 AutoCAD ActiveX 提供在 AutoCAD外控制编程的机制,通过使用 AutoCAD 对象,实现控制 AutoCAD。在 AutoCAD 中实现 ActiveX 接口有两大优点: 更多的编程环境可以编程访问 AutoCAD 图形。在 ActiveX Automation 出现以前,开发人员只能使用 AutoLISP 或 C+ 接口。 与其他 Windows 应用程序(如 Mi
11、crosoft Excel 和 ACCESS)共享数据变得更加容易。对象是所有 ActiveX 应用程序的主要构造块。每一个显示的对象均精确代表一个 AutoCAD 组件。AutoCAD ActiveX 接口中有许多不同类型的对象。例如: 直线、圆弧、文字和标注等图形对象都是对象。 线型与标注样式等样式设置都是对象。 图层、编组和块等组织结构都是对象。 视图与视口等图形显示都是对象。 甚至图形、AutoCAD 应用程序本身也是对象。AutoCAD 对象是通过分层方式来组织的,应用程序对象为根对象。这种分层结构的视图被归结为对象模型。对象模型提供了用户访问下一层对象的途径,如图 2 所示。Doc
12、umentsApplicationPreferencesDocument 3DFaceBlocks BlockDatabaseModelSpacePaperSpacePViewportDictionaries DictionaryXRecordDimStyless DimStyleFileDependenciess FileDependencyGroups GroupLayers LayerLayouts LayoutLineTypes LineTypesPlotConfigurations PlotConfigurationRegisteredApplicationsRegisteredAp
13、plicationSelectionSets SelectionSetTextStyles TextStyleUCSs UCSViews ViewViewports ViewportsDatabasePreferences3DSolidAttributeBlockRefCircleDim3PointAngDimAngularLeaderEllipseExternalRefLineMInsertBlockMLinePointPolyfaceMeshDimOrdinateDimRadialPolygonMeshhRayHyperlinksHyperlink 集合对象图 2 AutoCAD 的对象模
14、型用户可直接通过用户定义变量引用对象。直接引用对象,应包括对象的层次。举一个最简单的例子,以下语句是增加一条直线到模型空间。Sub Drawline( )定义两个三维的数组 startPoint 和 endPointDim startPoint(0 to 2) As Double Dim endPoint(0 to 2) As Double 定义 LineObj 为直线对象Dim LineObj As AcadLine定义起点startPoint(0) = 0startPoint(1) = 0startPoint(2) = 0PlotSummaryInfoUtilityMenuBarPopup
15、MenuMenuGroupsMenuGroupPopupMenusPopupMenuPopupMenuItemToolbarsToolbarToolbarItemRegionSolidSplineTableTextTraceXline定义终点endPoint(0)=30endPoint(1)=20endPoint(2)=10调用 AddLine 方法绘制直线Set LineObj = ThisDrawing.ModelSpace.AddLine(startPoint,endPoint)End sub4. 参数化绘制图形程序的编制4.1 创建基准函数在实际工程中设计良好的底层库能够节省很多的编码
16、量,并且有助于团体协作的实现底层库最好在工程编码开始之前就已经完全确定. 在以上创建二维对象方法的基础上,采用对系统提供的方法进行封装,创建底层函数库,即由对象的基准函数构成.,其中还包含一些常用的计算函数基准函数就是与系统提供的方法参数一致的函数,其他的函数均调用基准函数创建对象.如.创建直线基准函数的具体步骤如下:1.在 AUTOCAD2004 中,选择工具/宏/VBA 管理器菜单项,在弹出的VBA 管理器对话框中单击新建按钮,创建一个新的工程,然后选择该工程,单击另存为按钮,将其保存在适当的位置。2.在VBA 管理器对话框中单击Visual Basic 编辑器按钮,进入 VBA 集成开发
17、环境,选择插入/模块菜单项,向工程中添加一个标准模块。3.选择插入/过程菜单项,选择类型为函数,范围为公有的,在名称文本框中输入 Addline,单击确定按钮,就在当前的模块中添加了 AddLine函数。提示: 在 VB 中,子程序和函数的主要区别就在于,子程序没有返回值,但函数可以有返回值,而在 VBA 中,宏的定义通过子程序来实现.因此我们创建底层函数均使用函数。4.创建直线的基准函数代码为:Public Function AddLine(ByVal ptSt As Variant, ByVal ptEn As Variant) As AcadLineSet AddLine = This
18、Drawing .Model Space .AddLine (ptSt, ptEn)End Function需要注意的是,基准函数名称与 VBA 中对应的方法保持一致.函数的返回值为 AcadLine,输入参数为两个 Variant 类型的变量,分别用于表示起点和终点的位置。Set 是 VBA 的一个关键字,用于对象变量的赋值(数值变量的赋值形如 a=b),而函数的返回值使用形如”函数名称=表达式”的形式来实现。4.2 参数化绘制基本二维对象使用 AutoCAD VBA 开发的软件,大部分仍属于交互式的软件,必须考虑和用户进行交互的问题AutoCAD 本身提供了两种人机交互的方式,一种是在命令
19、中进行操作,另一种则是通过对话框输入参数在 VBA 中要利用圆心和半径创建圆:1.首先在 AUTOCAD2004 中,选择工具/宏/VBA 管理器菜单项,在弹出的VBA 管理器对话框中单击新建按钮,将其保存在适当的位置。2。在VBA 管理器对话框中单击Visual Basic 编辑器按钮,进入 VBA 集成开发环境,选择插入/用户窗体菜单项,向工程中添加一个用户窗体.3.在用户窗体上插入如图 4.2.1 所示的相关控件,并把 相对应的文本框名称分别修改为 text1,text2,text3.4.在文本框 2 后面添加一个拾取按钮,并把拾取按钮的 Caption 属性修改为空,单击 PICTUR
20、E 属性后的.按钮,从弹出的加载图片对话框中,选择配套光盘中的 PICKSET 图片,设置 PICTUREPOSITION 属性为参数 12,就得到了如图4.2.1 中的拾取点按钮效果.5.双击确定按钮,在该按钮的 CLICK 事件中添加下面的代码:Private Sub CommandButton1_Click() 图 4.2.1Dim pt1(2) As DoubleDim radius As DoubleDim addcircle As AcadCirclept1(0) = Text1.Text:pt1(1) = Text2.Textradius = Text3.TextUserForm
21、1.HideThisDrawing.ModelSpace.addcircle pt1, radiusEnd Sub6.双击窗体上的取消按钮,进入代码窗口,在该按钮的 CLICK 事件中添加下面的代码:Private Sub CommandButton2_Click()EndEnd Sub7.双击窗体上的拾取按钮,进入代码窗口,在该按钮的 CLICK 事件中添加下面的代码:在 VBA 中建立圆心的拾取点代码如下:Private Sub CommandButton3_Click()Dim PtPick As VariantUserForm1.HidePtPick = ThisDrawing.Uti
22、lity.GetPoint(, “请在屏幕上选择起点:“)Text1.Text = PtPick(0): Text2.Text = PtPick(1)UserForm1.ShowEnd Sub在这段代码中,获取点的位置实现方法为 GETPOINT,其返回值必须为VARIANT 类型的变量,用来存储点的位置.在此过程中,还要在适当的时候隐藏和显示窗体,不然 AUTOCAD 无法获得控制权,程序就会出错.4.3 餐厅用具(冰箱)二维参数化绘图实例如图 3 所示为餐厅用具(冰箱)的参数化过程图 3此过程主要体现的是由图形的几何参数和结构参数来进行图形的参数化绘制(基点坐标和尺寸长度) 。拾取基点后:
23、输入长度和宽度。即可绘制出其二维图形.5. 参数化绘制三维图形AUTOCAD VBA 二次开发具有强大的平面图形绘制功能。使用它编制的程序可以得到复杂的二维图形。但二维图形存在一定的局限性和缺陷,因为无法实现尺寸关联,不能直观观察产品的设计效果,虽然可以通过轴测视图的方式来解决,但操作麻烦,效果不佳,而如果使用三维图形,就可以弥补二维图形的在表现上的不足。以下介绍 VBA 中关于三维建模部分的功能。采用的和二维操作一样的界面风格,从窗体中输入参数得到图形。5. 1 三维弹簧模型(1) 实例说明该例提供了简洁的对话框界面,用户只要输入参数:中心点,旋转圈数,起始半径,水平增长,垂直增长和每圈分段
24、数就可得到按要求的三维螺旋线如图 4图 4(2) 编程思路:1计算机使用多边形来模拟圆形,这里的程序同样使用这个原理,每一个螺旋线都是由许多小线段直线组成,当直线足够多时,就呈现出螺旋线的效果。2如果能够得到各个点的坐标,就能够利用多段线建立一条螺旋线,但是二维多段线无法获得 Z 方向的坐标,因此只能使用三维多段线3用柱坐标表示螺旋线的控制点的坐标比较方便,因此在程序中有一个重要的问题就是柱坐标和平面直角坐标的转换。4由于是用多段线来表示圆,固 圆形的分段数的设定时竟可能多,少了就的到多段线螺旋。所以初值我们定为 30。如绘制多段线调用内置函数Dim ObjPline As Acad3DPol
25、ylineSet ObjPline = ThisDrawing.ModelSpace.Add3DPoly(PtControl)5.2.2 圆筒模型(1)实例说明:运行本实例,能够在图形窗口中创建一个圆筒模型,大小,半径,深度都可以改变。如图 5:图 5(2)编程思路1 我们知道圆筒有两种画法,一种是建立平面的图形,得到两个圆建立面域后拉伸得到,一种是直接建立两个圆柱体,但两个圆柱体是同心的,在进行差集计算得到挖空的模型。2 本程序就是建立两个同心但大小和半径不同的圆柱体,差集得到上图模型。如主要代码:Dim objCylinder As Acad3DSolidDim objCylinder1
26、As Acad3DSolidSet objCylinder1 = ThisDrawing.ModelSpace.AddCylinder(ptCen, radius1, height1)创建圆柱体Set objCylinder = ThisDrawing.ModelSpace.AddCylinder(ptCen, radius, height)布尔运算的第一步:圆柱体减去圆柱体objCylinder .Boolean acSubtraction, objCylinder16. 系统数据库管理程序参数化绘图过程中,有效的管理图形数据,特别对一些标准件,通用件,建立标准参数图库,是很重要的一个环节.
27、可以采用 Microsoft Access2000 进行数据库管理,连接方法采用 ADO,实现 AUTOCAD 与 ACCESS 的数据通信,其主要功能是对参数化生成的图形的几何参数和结构参数进行记录并管理这些数据。6.1 数据库连接方法 ADO数据库连接方法 ADO 是 Microsoft ActiveX Data Objects 的简称,ADO 作为一种更新的数据库访问技术, “扩展”了 DAO 和 RDO 所使用的对象模型,包含较少的对象和更多的属性、方法、事件。ADO 连接数据库的编程思路:在使用 ADO 对象之前,需要在 VBA 集成开发环境中,选择工程引用菜单项,从弹出的对话框中选
28、中microsoft ActiveX Data Objects 2.5 Library选项,引用 ADO 的对象模型如图 7图 7 在编程过程中使用 ADO 的一个典型的存取数据的步骤为:(1 连接数据源。可以使用连接对象的 Open 方法打开数据库对象,例如:adoCon.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ “(2 打开记录集对象。可以使用记录集对象的 Open 方法打开记录集对象,例如:adoRs.Open“bingxiangData2“,adoCon,adOpenDynamic,adLockOptimistic(3 使
29、用记录集。在各个记录集之间切换一般可以使用记录集对象的Move、 MoveFirst、MoveNext 、MovePrevious 和 MoveLast 方法,添加新的记录可以使用记录集对象的 AddNew 方法,修改当前记录的内容只需对数据库记录集中的对象重新赋值即可,删除当前的记录可以使用记录集的 Delete 方法。其中,记录集在进行添加的操作之后,必须使用 Update 方法更新数据库。(4 断开连接。使用 Close 方法能够关闭记录集和数据库连接对象,在退出程序之后,必须用 Close 方法关闭这两个对象。6.2 餐厅用具(冰箱)的数据库连接过程如图 8 所示为餐厅用具(冰箱)的数
30、据库连接部分。图 8 餐厅用具(冰箱)的数据库连接部分此连接有添加、修改和删除的功能,通过添加按钮可以向数据库中添加新的记录,修改按钮可以修改库中已有的数据,而删除按钮可以删除旧的记录。另外用户可以通过导向按钮查看库中的数据记录情况,并调出需要的数据进行绘图。如图 9 所示为餐厅用具(冰箱)的数据库表。图 9 餐厅用具(冰箱)的数据库表此表记录了餐厅用具(冰箱)的结构参数,通过此表用户就可以对和冰箱有关的所有参数进行管理。4. 结束语:程序参数化绘图以可视化编程为基础,得到一个非常简洁的人机对话界面,依托的强大图形功能为工具,用对AUTO进行二次开发。程序设计人员事先编制好实现图形的程序用户只
31、需在对话框内输入参数便可以得到图形,根据参数的不同和程序不同得到不同工程图CAD 已广泛应用于设计与制造的各个领域如飞机、汽车、机械、模具、建筑、集成电路中,程序参数化绘图作为 CAD 系统设计的重要环节,也在得到更全面,更专业的应用,以上介绍的参数化绘图基本思路,有很大的实用价值,可以作更进一步的专业开发与设计,极大满足工程设计的需要.1 李长勋 . AutoCAD VBA 程序开发技术 . 国防工业出版社,2004.12 张帆,郑立楷,王华杰 Autocad VBA 开发精彩实例教程. 北京:清华大学出版社,20043 龚沛曾,陆慰民,杨志强 VB 程序设计教程. 北京:高等教育出版社,20004 东岳创作室 . AutoCAD 2000 与产品设计 . 人民邮电出版社,1999.105 肖刚等 . 机械 CAD 原理与实践 . 清华大学出版社,1999