2023年11月30日发(作者:)

VBAutoCAD进行二次开发|VBAutoCAD进行二次开发

A utoCAD一直是CAD市场中的主流产品。随着AutoCAD的日益普及,在其上进行二次开

发的工具也不断更新。从早期的Auto LispADS DCL到现在流行的 Object ARXActiveX

AutomationVisual Lisp,均可十分方便地对AutoCAD进行二次开发。本文主要讨论

关于运用Visual BasicAutoCAD基于ActiveX Automation的二次开发技术。选用

ActiveX有两个原因,一是因为Visual Basic的普及性与易用性,二是采用这种方法进

行二次开发可方便地实现与其它图形软件的接口,如与Solid Works实现实体造型与二

维绘图的结合,以及根据用户的特殊需要开发出一定功能的软件。

二、ActiveX Automation技术

AutoCAD中的ActiveX Automation是微软公司ActiveX规范的具体应用。它通过基

ActiveX的自动化对象,为其他应用程序提供了访问AutoCAD内部功能的方法,是

AutoCAD最新的开发接口。在运行时,AutoCAD与其他应用程序之间的关系是服务器与

客户的关系,开发人员使用支持ActiveX规范的编程语言(VBDephi)能通过访问

AutoCAD的对象模型,AutoCAD的强大功能集成到应用程序中.AutoCAD的对象模型是

一种树型结构模型,根为"AutoCAD Application"AutoCAD中的所有对象都是AutoCAD

Application的子对象。图1所示为AutoCAD对象模型的层次结构树,其中父对象与子

对象之间的关系并不是对象继承关系,而是包含关系。

1 AutoCADActiveX对象的总结构图

三、ActiveX Automation的使用方法

1. Application对象

如果在计算机系统上安装了AutoCAD,则Windows会自动将其所有的信息注册到系

统注册表里。那么在启动Visual Basic后,用户可以象调用VB自己的对象一样调用

AutoCAD所提供的ActiveX

在编程、调试或运行时至少应该有一个AutoCAD副本在运行。可以通过以下的代码

创建AutoCAD对象。

Dim AcadApp as Object ’定义一个对象

On Error Resume Next

Set AcadApp =GetObject(,"ation")

If Err Then ’如果没有一个AutoCAD副本在运行

Set AcadApp =CreateObject("ation")

e =True ’启动一个AutoCAD副本并设为可见

If Err Then

MsgBox ption ’如果失败,给出错误提示

Exit Sub

End If

End If

2. PreferencesDocument对象

AutoCAD中的Preferences对话框的作用相同,通过Preferences对象可以读取

或设置AutoCAD的一些基本设置。Preferences对象通过ApplicationPreferences

属性返回。

Dim AcadPref as Object

Set AcadPref = ences

比如,用户可通过Preferences对象进行如下的设置

size =100

yScreenMenu =acTrue

yScrollBars =

Document对象表示AutoCAD中中当前打开的文档,AutoCAD中的任何其它操作都

需用到Document对象,该对象可以通过ActiveDocument属性返回。

Dim AcadDoc as Object

Set AcadDoc = Document

AutoDesk公司使用了集合的概念。在Document对象中有14个集合,具体如图1

所示。与VB中的集合一样,这些集合都支持AddItem方法与Count属性。例如Add

方法可以向该集合中添加一个对象,Item(X)可以的得到该集合中的第X个对象,Count

属性可以得到该集合中的对象的个数。

在一个AutoCAD副本运行时,只能同时打开一个 Document可以调用Document

NewSave方法以及Saved属性来打开或保存一个AutoCAD文档。

If Not Then

Else

Set AcadDoc =("acad")

End If

3. 创建、查询与修改AutoCAD图形对象

在创建AutoCAD图形对象之前,首先必须定义并创建ModelSpacePaperSpace

合对象。这两个对象可通过Document对象的ModelSpace属性与PaperSpace属性返回。

Dim moSpace as Object,paSpace as Object

Set moSpace = pace

Set paSpace = pace

所有关于图形对象操作的方法与属性都包含在这两个对象中。

创建文本对象:

Dim moSpace as Object

Set moSpace =pace

Dim Pnt(0 to 2) as Double ’定义一个AutoCAD三维点

Dim TextH as Double ’定义字符高度

Dim Textstr 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=t(TextStr,Pnt,TextH) ’创建文本对象

查询与修改图形对象

有时用户不但要创建图形对象,更多的情况是修改或控制已存在的

对象,这就需要对已创建的对象进行查询,从而得到所要操作的对象。

可以通过属性来得到图形对象的个数。

Dim noMSOBJ as String,noPSOBJ as String

NoMSOBJ=Str()

NoPSOBJ=Str()

MsgBox "Object:Mspace="& noMSOBJ & ";Pspace="& noPSOBJ

用户也可以通过For..Loop语句来遍历所有的图形对象或是通过方法来得到某个具

体的对象。

下面的代码说明了如何来修改当前中的对象,如果对象为一直线,则修改其颜色为

红色,否则不做任何改动。

Dim ent as object

For each ent in mospace

If name= "acdline" then

=acred

End If

Next

需要注意:如果对图形对象做了改动,则需要调用 Update方法在AutoCAD窗口中

重画该对象。

同样,可以得到Model Space中最后生成的图形对象。

Dim ent as object

Set ent = (-1)

4. 非图形对象

除了ModelSpacePaperSpace集合,Document对象中另外12个集合中的对象都

是非图形对象,如Layers集合包含了AutoCAD当前文档中所有的层,而Linetypes

TextStyles则分别为线型对象与字符型对象的集合。

创建层

可以调用Layers集合的Add方法创建层。以下代码创建一个名称为LAYER1,颜色

为洋红色的层。

Dim layerobj as object

Set layerobj =("LAYER1")

=acMagenta

视口

以下的代码使用ActiveSpace属性设置一个活动的Space,然后调用Viewports

合的Add方法创建一个名为"NEW_VIEWPORT"的视口。当视口建立后,Split方法可使原

视口与新视口呈上下排列,最后,ActiveViewport属性使新视口成为活动视口。

Dim vport as object

Space=acModelSpace

Set vport=("NEW_VIEWPORT")

acViewport2Vertical

Set Viewport=vport

5. 用户输入

Document对象中还包含有一个很重要的子对象UtilityUtility对象提供了一些

其它的实用功能,如用户输入控制(user-input)user-input方法可以在AutoCAD的命

令提示行中提示用户输入,并显示相应的输入数据类型。这种类型的输入对于屏幕坐标

系,实体选择,短字符与数字的输入有着极为重要的应用。

以下的代码定义了Utility对象。

Dim AcadUtil as object

Set AcadUtil =y

每个user-input方法都在AutoCAD的命令行里给出了适当的输入提示并返回相应

的数据类型。如:GetString返回一个字符串,GetPoint返回一个点(三个双精度数值)

也可以调用InitializeUserInput方法进行更高级的输入设置。

用户可以定义一个变量:NL=Chr(13)+Chr(10)将这个变量用于输入提示的开始处。

四、结束语

AutoCAD ActiveX Automation技术的出现,标志着AutoCAD 的二次开发技术取得

了历史性转折。首先,它首次完全实现了OLE Automation,使得其他软件可以方便地访问

AutoCAD;其次,AutoCAD 首次实现了面向对象的开发技术,用户可以操纵它提供所有的

AutoCAD 对象;最后,基于ActiveX Automation开发技术的开发工具得到空前的膨胀,

不再局限于CC++系列语言,Visual Basic, Delphi等工具都可以进行开发。ActiveX

Automation技术大大地提高了系统开发的效率、健壮性及易维护性