VBA开发AUTOCAD实现参数化绘图王若慧RealizingTheParameter-DrawingtakingtheVBAandAUTOCAD(.山西大学工程学院,山西省太原,030013)WangRuoHuiEngineeringColledgeofSHANXIUniversity,Taiyuan030013)摘要:介绍了采用VBA(VisualBasicforApplication)进行AutoCAD2005的二次开发,应用AutoCADActiveXAutomation接口技术访问AutoCAD对象,采用ADO实现AUTOCAD与MicrosoftAccess2000的数据通信,实现程序参数化绘图的基本思路及程序设计流程.关键词:VBAAutoCADActiveXAutomationADO参数化绘图Abstract:TakingtheActiveXAutomationofVBAandAutoCAD2005toaccesstheAutoCADdrawings,andtheADOtomakethedatacommunicationbetweentheAUTOCADandACCESS,theparameter-drawingcanbewellrealizedinthewaywhatisdescribedinthearticle.Keywords:VBAAutoCADActiveXAutomationADOtheparameter-drawing引言:传统的人机交互式绘图一般需要用精确的尺寸值定义几何元素,输入的每一条线都必须有确定的位置,图形一旦建立,即使结构相似但想改变图形大小尺寸,只能对图形进行编辑。而在工程设计中,一方面,进行新产品设计时不可避免地需要多次反复修改,需要进行多方面的综合协调和优化;另一方面,许多的专业图纸设计中,很多图形结构具有一定的相似性,往往只是尺寸的大小不同,其图形随尺寸参数的变化而相应变化。因此,希望有一种比交互式绘图更方便、更高效、更适合结构相似图形绘制的方法.为了解决这个问题,我们可研制出一种绘图软件,图中尺寸参数通过交互方式输入,随后通过运行有关程序,确定所有的绘图信息,自动绘出图形,这种工作方式通常称为程序参数化绘图.这就是参数化绘图要解决的问题,同时它也是CAD系统很重要的一个环节.1.程序参数化绘图的实质程序参数化绘图主要适用于图形结构形式基本固定而结构尺寸参数变化的图形。程序参数化绘图的实质,就是将图形信息记录在程序中。图形的描述通常可分为:图形的拓扑关系、图形的几何参数以及这些几何参数与图形结构参数之间的联系。通常用一组变量记录图形的几何参数,用一系列的赋值语句表达几何参数与结构参数之间的关系,然后用一系列的调用语句来描述图形的拓扑关系。如图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.程序参数化绘图的实现途径为了实现参数化绘图,需要建立一个计算机图形软件系统.应用这个系统可以简化图形设计应用程序的编制,并能方便地应用计算机程序实现图形地输入和输出.建立一个图形系统可以有三种方式:(1)设计专用图形语言.(2)修改高级程序设计语言,使其具有图形处理的功能.(3)建立图形设计程序包.前两种方式都需要用低级或高级语言重写一个编译器.一般来说,修改或者重写一个编译器的工作量比较大,而且图形设计过程并非简单的数据处理过程,还包括许多文件结构和存贮结构的问题,从而使上述工作的复杂性大大增加.有些绘图软件配有内部专用绘图语言,如AutoCAD配有AutoLISP编程语言,DDM/DIMENSION3图形软件配有DAL绘图语言等,利用这些语言用户可以开发参数化绘图软件.但是这些语言的数组,循环,函数,逻辑关系等功能一般较差,不宜作大量的计算工作,编程也不太方便.第三种方式即建立图形设计程序包,其基本思想是选择一种合适的高级程序设计语言作为主语言,在此语言中扩展一系列的过程调用,以实现图形设计工作.在这种情况下,用户编写的图形描述程序由两部分组成:一是主语言语句,另一个是主语言中扩展了的过程调用语句.在扩充某种高级语言使其具有图形处理功能时,最好能利用已有的较成熟的图形软件.3.程序参数化绘图的技术路线要实现程序参数化绘图程序的编制,本文采用AutoCAD2005为绘图支撑软件,采用VBA(VisualBasicforApplication)进行AutoCAD2005的二次开发,运用AutoCADVBA实现参数化绘制工程图纸.3.1AUTOCAD2005简介1.AutoCAD是当今最流行的二维绘图软件,AutoCAD有强大的二维功能,如绘图、编辑、剖面线和图案绘制、尺寸标注以及二次开发等功能,同时有部分三维功能。2.尽管AutoCAD是一个非常好的通用计算机辅助绘图和设计软件系统,但每一行业和专业都有自的行业和专业标准,许多单位也有自己的技术规格和企业标准,每个设计工程师和绘图员更有各自独特的工作方式和习惯。因而AutoCAD不可能完全满足每个用户的具体而特定的要求。对AutoCAD进行定制和二次开发,能使AutoCAD可以更加符合用户的需求,更方便、更规范、更专业的实现设计和绘图中的应用。AutoCAD提供的开放式体系结构正是为使用户可以根据各自的需求来改进和扩充AutoCAD的许多功能而着想的3.AutoCAD提供AutoLISP、ADS、ARX、VBA作为二次开发的工具。在许多实际应用领域(如机械、建筑、电子)中,一些软件开发商在AutoCAD的基础上已开发出许多符合实际应用的软件,很好的实现了参数化绘制工程图纸.3.2VBA开发AutoCAD2005采用面向对象的程序设计方法,使用VisualBasic在AutoCAD2005上用VBA技术进行二次开发,能够较好地实现系统程序参数化绘图。VBA是通过AutoCADActiveXAutomation接口来建立和AutoCAD对象间的联系。ActiveX是建立在COM对象模型之上的一个标准通信协议,它允许对象之间通过一定的接口相互通信。而AutoCADActiveX提供在AutoCAD外控制编程的机制,通过使用AutoCAD对象,实现控制AutoCAD。在AutoCAD中实现ActiveX接口有两大优点:更多的编程环境可以编程访问AutoCAD图形。在ActiveXAutomation出现以前,开发人员只能使用AutoLISP或C++接口。与其他Windows应用程序(如MicrosoftExcel和ACCESS)共享数据变得更加容易。对象是所有ActiveX应用程序的主要构造块。每一个显示的对象均精确代表一个AutoCAD组件。AutoCADActiveX接口中有许多不同类型的对象。例如:直线、圆弧、文字和标注等图形对象都是对象。线型与标注样式等样式设置都是对象。图层、编组和块等组织结构都是对象。视图与视口等图形显示都是对象。甚至图形、AutoCAD应用程序本身也是对象。AutoCAD对象是通过分层方式来组织的,应用程序对象为根对象。这种分层结构的视图被归结为对象模型。对象模型提供了用户访问下一层对象的途径,如图2所示。DocumentsApplicationPreferencesDocumentBlocksBlock3DFace3DSolidDatabaseModelSpacePaperSpacePViewportDictionariesDictionaryXRecordDimStylessDimStyleFileDependenciessFileDependencyGroupsGroupLayersLayerLayoutsLayoutLineTypesLineTypesPlotConfigurationsPlotConfigurationRegisteredApplicationsRegisteredApplicationSelectionSetsSelectionSetTextStylesTextStyleUCSsUCSViewsViewViewportsViewportsDatabasePreferencesPlotAttributeBlockRefCircleDim3PointAngDimAngularLeaderEllipseExternalRefLineMInsertBlockMLinePointPolyfaceMeshDimOrdinateDimRadialPolygonMeshhRayRegionHyperlinksHyperlink集合对象图2AutoCAD的对象模型用户可直接通过用户定义变量引用对象。直接引用对象,应包括对象的层次。举一个最简单的例子,以下语句是增加一条直线到模型空间。SubDrawline()’定义两个三维的数组startPoint和endPointDimstartPoint(0to2)AsDoubleDimendPoint(0to2)AsDouble’定义LineObj为直线对象DimLineObjAsAcadLine’定义起点startPoint(0)=0startPoint(1)=0startPoint(2)=0’定义终点endPoint(0)=30SummaryInfoUtilityMenuBarPopupMenuMenuGroupsMenuGroupPopupMenusPopupMenuPopupMenuItemToolbarsToolbarToolbarItemSolidSplineTableTextTraceXlineendPoint(1)=20endPoint(2)=10’调用AddLine方法绘制直线SetLineObj=ThisDrawing.ModelSpace.AddLine(startPoint,endPoint)Endsub4.参数化绘制图形程序的编制4.1创建基准函数在实际工程中设计良好的底层库能够节省很多的编码量,并且有助于团体协作的实现.底层库最好在工程编码开始之前就已经完全确定.在以上创建二维对象方法的基础上,采用对系统提供的方法进行封装,创建底层函数库,即由对象的基准函数构成.,其中还包含一些常用的计算函数基准函数就是与系统提供的方法参数一致的函数,其他的函数均调用基准函数创建对象..如.创建直线基准函数的具体步骤如下:1.在AUTOCAD2004中,选择[工具/宏/VBA管理器]菜单项,在弹出的[VBA管理器]对话框中单击[新建]按钮,创建一个新的工程,然后选择该工程,单击[另存为]按钮,将其保存在适当的位置。2.在[VBA管理器]对话框中单击[VisualBasic编辑器]按钮,进入VBA集成开发环境,选择[插入/模块]菜单项,向工程中添加一个标准模块。3.选择[插入/过程]菜单项,选择[类型]为[函数],[范围]为[公有的],在[名称]文本框中输入Addline,单击[确定]按钮,就在当前的模块中添加了AddLine函数。提示:在VB中,子程序和函数的主要区别就在于,子程序没有返回值,但函数可以有返回值,而在VBA中,宏的定义通过子程序来实现.因此我们创建底层函数均使用函数。4.创建直线的基准函数代码为:PublicFunctionAddLine(ByValptStAsVariant,ByValptEnAsVariant)AsAcadLineSetAddLine=ThisDrawing.ModelSpace.AddLine(ptSt,ptEn)EndFunction需要注意的是,基准函数名称与VBA中对应的方法保持一致.函数的返回值为AcadLine,输入参数为两个Variant类型的变量,分别用于表示起点和终点的位置。Set是VBA的一个关键字,用于对象变量的赋值(数值