用VB对AutoCAD进行二次开发.pdf
用 VB 对 AutoCAD 进行二次开发|用 VB 对 AutoCAD进行二次开发 A utoCAD一直是 CAD 市场中的主流产品。随着AutoCAD 的日益普及,在其上进行二次开发的工具也不断更新。从早期的Auto Lisp、ADS、DCL 到现在流行的 object ARX、ActiveX Automation、Visual Lisp,均可十分方便地对AutoCAD 进行二次开发。本文主要讨论关于运用Visual Basic对 AutoCAD 基于 ActiveX Automation的二次开发技术。选用ActiveX 有两个原因,一是因为 Visual Basic的普及性与易用性,二是采用这种方法进行二次开发可方便地实现与其它图形软件的接口,如与 Solid Works实现实体造型与二维绘图的结合,以及根据用户的特殊需要开发出一定功能的软件。二、ActiveX Automation技术 AutoCAD 中的 ActiveX Automation是微软公司 ActiveX 规范的具体应用。它通过基于 ActiveX 的自动化对象,为其他应用程序提供了访问AutoCAD 内部功能的方法,是 AutoCAD 最新的开发接口。在运行时,AutoCAD与其他应用程序之间的关系是服务器与客户的关系,开发人员使用支持ActiveX 规范的编程语言(如 VB、Dephi等)能通过访问 AutoCAD 的对象模型,把 AutoCAD 的强大功能集成到应用程序中.AutoCAD的对象模型是一种树型结构模型,根为AutoCAD Application,AutoCAD中的所有对象都是AutoCAD Application的子对象。图 1所示为 AutoCAD 对象模型的层次结构树,其中父对象与子对象之间的关系并不是对象继承关系,而是包含关系。图 1 AutoCAD中 ActiveX 对象的总结构图 三、ActiveX Automation的使用方法 1.Application对象 如果在计算机系统上安装了 AutoCAD,则 Windows 会自动将其所有的信息注册到系统注册表里。那么在启动 Visual Basic 后,用户可以象调用 VB 自己的对象一样调用 AutoCAD 所提供的 ActiveX。在编程、调试或运行时至少应该有一个 AutoCAD 副本在运行。可以通过以下的代码创建 AutoCAD 对象。Dim AcadApp as Object 定义一个对象 On Error Resume Next Set AcadApp=Getobject(,AutoCAD.Application)If Err Then 如果没有一个 AutoCAD 副本在运行 Err.Clear Set AcadApp=CreateObject(AutoCAD.Application)AcadApp.Visable=True 启动一个 AutoCAD 副本并设为可见 If Err Then MsgBox Err.Description 如果失败,给出错误提示 Exit Sub End If End If 2.Preferences 与 Document 对象 与 AutoCAD 中的 Preferences 对话框的作用相同,通过 Preferences 对象可以读取或设置 AutoCAD 的一些基本设置。Preferences 对象通过 Application 的Preferences 属性返回。Dim AcadPref as Object Set AcadPref=AcadApp.Preferences 比如,用户可通过 Preferences 对象进行如下的设置 AcadPref.Cursorsize=100 AcadPref.DisplayScreenMenu=acTrue AcadPref.DisplayScrollBars=Check1.value Document 对象表示 AutoCAD 中中当前打开的文档,对 AutoCAD 中的任何其它操作都需用到 Document 对象,该对象可以通过 ActiveDocument 属性返回。Dim AcadDoc as object Set AcadDoc=AcadApp.ActiveDocument AutoDesk 公司使用了集合的概念。在 Document 对象中有 14 个集合,具体如图 1 所示。与 VB 中的集合一样,这些集合都支持 Add、Item 方法与 Count 属性。例如 Add 方法可以向该集合中添加一个对象,Item(X)可以的得到该集合中的第 X 个对象,Count 属性可以得到该集合中的对象的个数。在一个 AutoCAD 副本运行时,只能同时打开一个 Document。可以调用Document 的 New、Save 方法以及 Saved 属性来打开或保存一个 AutoCAD 文档。If Not AcadDoc.Saved Then AcadDoc.Save Else Set AcadDoc=AcadDoc.New(acad)End If 3.创建、查询与修改 AutoCAD 图形对象 在创建 AutoCAD 图形对象之前,首先必须定义并创建 ModelSpace 与PaperSpace 集合对象。这两个对象可通过 Document 对象的 ModelSpace 属性与PaperSpace 属性返回。Dim moSpace as Object,paSpace as Object Set moSpace=AcadDoc.ModelSpace Set paSpace=AcadDoc.PaperSpace 所有关于图形对象操作的方法与属性都包含在这两个对象中。创建文本对象:Dim moSpace as Object Set moSpace=AcadDoc.ModelSpace Dim Pnt(0 to 2)as Double 定义一个 AutoCAD 三维点 Dim TextH as Double 定义字符高度 Dim Te xtstr as String 定义字符变量 Dim TextObj as Object 定义一个 AutoCAD 文本对象 Pnt(0)=2:Pnt(1)=4:Pnt(2)=0 初始化坐标 TextH=1 TexrStr=“This is a test”Set TextObj=moSpace.AddText(TextStr,Pnt,TextH)创建文本对象 查询与修改图形对象 有时用户不但要创建图形对象,更多的情况是修改或控制已存在的 对象,这就需要对已创建的对象进行查询,从而得到所要操作的对象。可以通过属性来得到图形对象的个数。Dim noMSOBJ as String,noPSOBJ as String NoMSOBJ=Str(moSpace.Count)NoPSOBJ=Str(paSpace.Count)MsgBox object:Mspace=&noMSOBJ&Pspace=&noPSOBJ 用户也可以通过 For.Loop 语句来遍历所有的图形对象或是通过方法来得到某个具体的对象。下面的代码说明了如何来修改当前中的对象,如果对象为一直线,则修改其颜色为红色,否则不做任何改动。Dim ent as Object For each ent in mospace If ent.entityname=acdline then Ent.color=acred Ent.update End If Next 需要注意:如果对图形对象做了改动,则需要调用 Update 方法在 AutoCAD 窗口中重画该对象。同样,可以得到 Model Space 中最后生成的图形对象。Dim ent as object Set ent=moSpace.Item(moSpace.Count-1)4.非图形对象 除了 ModelSpace 与 PaperSpace 集合,Document 对象中另外 12 个集合中的对象都是非图形对象,如 Layers 集合包含了 AutoCAD 当前文档中所有的层,而Linetypes 和 TextStyles 则分别为线型对象与字符型对象的集合。创建层 可以调用 Layers 集合的 Add 方法创建层。以下代码创建一个名称为 LAYER1,颜色为洋红色的层。Dim layerobj as object Set layerobj=acadDoc.Layers.Add(LAYER1)Layerobj.Colors=acMagenta 视口 以下的代码使用 ActiveSpace 属性设置一个活动的 Space,然后调用Viewports 集合的 Add 方法创建一个名为NEW_VIEWPORT的视口。当视口建立后,Split 方法可使原视口与新视口呈上下排列,最后,ActiveViewport 属性使新视口成为活动视口。Dim vport as object AcadDoc.ActiveSpace=acModelSpace Set vport=AcadDoc.Viewports.Add(NEW_VIEWPORT)Vport.Split acViewport2Vertical Set AcadDoc.ActiveViewport=vport 5.用户输入 Document 对象中还包含有一个很重要的子对象 Utility,Utility 对象提供了一些其它的实用功能,如用户输入控制(user-input)。user-input 方法可以在AutoCAD 的命令提示行中提示用户输入,并显示相应的输入数据类型。这种类型的输入对于屏幕坐标系,实体选择,短字符与数字的输入有着极为重要的应用。以下的代码定义了 Utility 对象。Dim AcadUtil as object Set AcadUtil=AcadDoc.Utility 每个 user-input 方法都在 AutoCAD 的命令行里给出了适当的输入提示并返回相应的数据类型。如:GetString 返回一个字符串,GetPoint 返回一个点(三个双精度数值)。也可以调用 InitializeUserInput 方法进行更高级的输入设置。用户可以定义一个变量:NL=Chr(13)+Chr(10),将这个变量用于输入提示的开始处。四、结束语 AutoCAD 的 ActiveX Automation 技术的出现,标志着 AutoCAD 的二次开发技术取得了历史性转折。首先,它首次完全实现了 OLE Automation,使得其他软件可以方便地访问 AutoCAD;其次,AutoCAD 首次实现了面向对象的开发技术,用户可以操纵它提供所有的 AutoCAD 对象;最后,基于 ActiveX Automation 开发技术的开发工具得到空前的膨胀,已不再局限于 C 及 C+系列语言,用 Visual Basic,Delphi等工具都可以进行开发。ActiveX Automation 技术大大地提高了系统开发的效率、健壮性及易维护性