第3章 AutoCAD ActiveX对象

更新时间:2024-04-04 20:58:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第3章 AutoCAD ActiveX对象 第3章 AutoCAD ActiveX对象 3.1 使用对象变量 3.1.1对象变量

变量除了可以存储值以外,还可以引用对象,引用就是将对象指定给变量。每个AutoCAD ActiveX 对象均精确代表一个 AutoCAD 组件。 1. 声明对象变量

语法: {Dim│ ReDim│Static│Private│Public} 变量名As [New] 类名

对象变量可分为一般的对象类型和特定的对象类型。AutoCAD R14.01版以后支持早期绑定,则可用其特定的类型声明,也可按一般的对象类型Object声明。 2. 用Set语句将对象赋予变量 语法: Set变量=对象 3. 释放对对象的引用

当不再使用某对象时,应及时释放这些资源。 语法:Set对象=Nothing

注意,当从属对象使用结束后,也要将其设为Nothing。 3.1.2对象的属性和方法 1. 属性的设置和查询 (1)属性的设置

语法: 对象表达式.属性=设置值

例:LineObj.Color=acRed ’设置LineObj为红色 (2)属性的查询

语法: 返回值=对象表达式.属性 例: Dim WhatColor As Integer WhatColor= LineObj.Color 2.使用方法

方法的语法格式取决于该方法要求的参数及是否要求有返回值。 如果方法不要求参数,则用以下格式: 语法:对象表达式.方法 例:用Save方法保存当前文件。 ThisDrawing.Save

如果方法要求有参数,就在后面加空格再写入参数;若方法要求有多个参数,要用逗号将各参数隔开。

如果要用对象变量引用上述对象,就必须用括号把该方法需要的参数括起来。 例:用AddCircle方法在模型空间创建一个圆。

(其中的参数:圆心Center和半径Radium已经声明和赋值。) ThisDrawing.ModelSpace.AddCircle Center,Radium

如果要用按特定类声明的对象变量引用上述对象,上例应写为: Dim CircleObj As AcadCircle

Set CircleObj= ThisDrawing.ModelSpace.AddCircle (Center,Radium) 3.1.3使用事件 1. AutoCAD中的事件

对于窗体和控件等界面对象,大多有相同的事件,如单击鼠标(Click)、双击鼠标(Dbclick)等。用户可以针对不同的事件,编写相应的处理程序。AutoCAD的事件有三个级别:

(1)应用程序层事件

当AutoCAD应用程序或运行环境发生变化时,便触发应用程序层事件。这些事件包括:与文件操作有关的事件(新建、打开、保存、关闭和打印文件等);与发出AutoCAD命令有关的事件;与加载和卸载ARX或LISP应用程序有关的事件;以及与改变系统变量、改变应用程序窗口有关的事件等。例如,打开图形时会触发 BeginOpen 事件,该事件中包含打开的 AutoCAD 图形的名称。而关闭图形时则会触发另一个事件。 (2)文档层事件

当改变特定的图形文件及其内容时,便触发文档层事件。这类事件包括:对象的添加、修改或删除;激活快捷菜单;改变选择集;改变图形窗口;图形的重新生成;以及从图形加载或卸载 ARX 和 LISP 应用程序等。 (3)对象层事件

当某一个图形对象被修改时,便触发对象层事件。AutoCAD只有一个对象层事件Modified。 2.事件处理程序的特点

响应事件的程序代码称作事件处理程序。当触发一个事件时,会自动执行这些程序,与事件有关的AutoCAD的状态或行为发生变化的信息作为参数由系统传递给事件过程。用户可以利用这些参数或不利用这些参数。注意,并不是所有的事件都传递参数。虽然事件处理程序可以响应事件,但触发事件处理程序时,AutoCAD 通常都是正处在处理命令的执行过程中。因此,如果要使事件处理程序在涉及 AutoCAD 和它的数据库时能安全运行,就要使事件处理程序符合一定的规范,主要的注意事项是: (1)不要过分依赖事件发生的顺序。 (2)不要过分依赖操作的顺序。

(3)不要在事件处理程序中使用交互式函数。 (4)不要在事件处理程序中启动对话框。

(5)除了发出事件的对象外,可以向数据库中的任何对象写入数据。 (6)在事件处理程序中不能有可能会触发相同事件的操作。 (7)当 AutoCAD 显示模式对话框时,不会触发任何事件。

3.2 AutoCAD 的对象模型

对象按照分层结构来组织,这种层次结构的图称为“对象模型”。对象模型给出了上级对象与下级对象之间的访问关系。AutoCAD 2000/2002与AutoCAD 2004/2005/2006的类型库互不兼容。AutoCAD 2006的对象模型如图3-1所示。 图3-1 AutoCAD 2006的对象模型 3.2.1 Application 对象和Document对象 1.Application 对象

Application是对象模型的基础,是所有对象的“根”,称为“根对象”。 通过 Application 对象,用户可以访问任何其他的对象或任何对象指定的属性或方法。Application 对象还是 ActiveX 接口的全局对象,也就是AutoCAD应用程序自己,Application 对象的所有方法和属性都可以用于全局名称空间。

Application 对象通过Documents集合访问AutoCAD图形;通过MenuBar集合访问AutoCAD菜单;通过MenuGroups集合访问AutoCAD工具条;通过Preferences 对象可以访问存放在注册表中的AutoCAD“选项”对话框中的设置值。 2.Document对象

属于Documents集合的Document对象就是AutoCAD图形。它提供对所有图形对象和大多数非图形对象的访问。

Document对象之下有一个DatabasePreferences 对象,它包含存储在图形中的所有选项。这个对象指定当前AutoCAD 图形特有的设置值,而无须事先启动 AutoCAD 应用程序(ObjectDBXTM 应用程序)。

此外,Document 对象还提供对 Plot 和 Utility 对象的访问。 3.2.2 Preferences对象

在 Preferences 对象下有一组对象,分别对应“选项”对话框中的一个选项卡。这些对象提供对“选项”对话框中所有存储在注册表中的设置的访问。用户也可以利用SetVariable 和GetVariable系统变量设定和修改。

注:关于设置选项的详细信息,请参见 <4.7设置 AutoCAD 系统配置>一节。 3.2.3图形对象和非图形对象

1. 图形对象

图形对象(也称“图元”) 是组成图形的可见对象。它构成AutoCAD图形的各种几何实体,如Line、Circle、Text及Table等。要创建图形对象需使用相应的Add方法,而编辑这些对象则应使用对象本身的方法和属性。例如应用Color属性改变该图形对象的颜色。 2.非图形对象

非图形对象包含了图形中不可见的数据信息。如Layer、LineType、DimStyle等。创建这些对象可使用各自集合的Add 方法,要修改或查询这些对象,要使用对象本身的方法或属性。每一个非图形对象都有设置和检索扩展数据以及删除自身的方法。 3.2.4 Collection对象

AutoCAD 将大部分对象进行编组,组成集合。虽然这些集合包含了不同类型的数据,但是可以使用相似的技术来处理它们。每一个集合都提供了向其中添加对象的方法,大多数集合使用的是 Add 方法。

集合还有一些其他的常用方法和属性。 Count 属性用于获取集合中的对象个数(从零开始), Item 方法用于访问集合中的任何对象。 集合对象有:

(1)Documents:其成员为AutoCAD当前任务中打开的全部图形文件。 (2)ModelSpace: 包括模型空间中所有的图形对象。 (3)PaperSpace:包括图纸空间所有图形对象。

(4)Blocks:包括图形文件中定义的所有块、外部引用和布局对象。 (5)Block:包括构成这一个块的所有图形对象。 (6)LineTypes:包含图形中的所有线型。 (7)DimStyles:包含图形中的所有标注样式。 (8)Layers:包含图形中的所有图层。 (9)TextStyles:包含图形中的所有文字样式。

(2)在“引用”对话框中,删除对名为 acad.tlb 的类型库(其默认位置是 c:\\program files\\AutoCAD2002)的引用;改添加对名为 acax16enu.tlb 的类型库(其默认位置是 c:\\program files\\common files\\autodesk shared)的引用,然后单击“确定”。 (3)如果程序中 CreateObject 或 GetObject 函数使用的是独立于版本的 ProgID,则将函数更改为使用依赖于版本的 ProgID。 例如,应将CreateObject(\替换为 :

CreateObject(\。

此外,如果 GetInterfaceObject 方法使用的是独立于版本的 ProgID,则必须将该方法更改为使用依赖于版本的 ProgID。 (4)保存工程文件并重新编译。

2)自AutoCAD 2005版起,增加了接口对象的新功能。如果 ActiveX自动化工程使用了以前版本中没有的 AutoCAD 2005 新功能,则需要明确声明工程中正在使用 AutoCAD 2005 扩展接口。 以下接口包含 AutoCAD 2005 中新的属性或方法: ●IAcadBlock2 ●IAcadLayer2 ●IAcadLayers2 ●IAcadModelSpace2 ●IAcadMText2 ●IAcadPaperSpace2 ●IAcadPreferencesFiles2 ●IAcadPViewport2 ●IAcadText2 ●IAcadView2

3) AutoCAD 2007版对扩展接口进行了更改,以下 COM 扩展接口已被合并到下面指明的主接口中:

旧接口 合并到 IAcadAttribute2 IAcadAttribute IAcadAttributeReference2

IAcadAttributeReference IAcadBlock2、IAcadBlock3 IAcadBlock IAcadBlockReference2 IAcadBlockReference IAcadExternalReference2 IAcadExternalReference IAcadHatch2 IAcadHatch IAcadLayer2 IAcadLayer IAcadLayers2 IAcadLayers IAcadMInsertBlock2 IAcadMInsertBlock IAcadMLine2 IAcadMLine IAcadModelSpace2、IAcadModelSpace3 IAcadModelSpace IAcadMText2 IAcadMText IAcadPaperSpace2、IAcadPaperSpace3 IAcadPaperSpace IAcadPreferencesFiles2 IAcadPreferencesFiles

IAcadPreferencesOutput2 IAcadPreferencesOutput IAcadPViewport2 IAcadPViewport IAcadTable2 IAcadTable IAcadText2 IAcadText IAcadUtility2 IAcadUtility IAcadView2 IAcadView 3.5 使用变体传递数组

AutoCAD ActiveX Automation使用变体类型数据Variant来传递数组。这表示数组必须是变体,才能被 AutoCAD ActiveX Automation的方法和属性接受。同样,从 AutoCAD ActiveX Automation输出的数组数据也必须是以变体类型来处理。特别需要注意的是,VBA/VB的输入数组会自动被转换为变体。也就是说,应用 VBA/VB编程,遇到使用 ActiveX Automation的方法和属性时,不必一定要输入变体类数据的数组。但所有的输出数组都将会是变体的形式,所以需要进行相应的处理。 3.5.1创建变体类型的数组

在编程过程中,有时需要将数据转换成变体类型。AutoCAD ActiveX Automation提供了将数组转换为变体类型数据的实用方法。应用 CreateTypedArray 方法,可以创建包含整数数组、浮点数数组、双精度数组等的变体。只要方法或属性接受变体数组,用户就可以将产生的变体传递给任何 AutoCAD 的方法或属性。

CreateTypedArray 方法需要输入数组中值的类型,将数组数据进行转换,以变体返回数组。 例3-1:使用 CreateTypedArray 方法创建样条曲线 。

以下代码使用 CreateTypedArray 转换的三个数组:样条曲线拟合点的坐标矩阵及其起始点和结束点相切点的矩阵。然后将变体传递给 AddSpline 方法,创建样条曲线。 Sub Ch3_CreateSplineUsingTypedArray() '本例使用 CreateTypedArray 方法 '在模型空间中创建样条曲线对象 Dim splineObj As AcadSpline

Dim startTan As Variant Dim endTan As Variant Dim fitPoints As Variant

Dim utilObj As Object '后期绑定 Utility 对象 Set utilObj = ThisDrawing.Utility '定义 Spline 对象

utilObj.CreateTypedArray startTan, vbDouble, 0.5, 0.5, 0 utilObj.CreateTypedArray endTan, vbDouble, 0.5, 0.5, 0 utilObj.CreateTypedArray _

fitPoints, vbDouble, 0, 0, 0, 5, 5, 0, 10, 0, 0 Set splineObj = ThisDrawing.ModelSpace.AddSpline _ (fitPoints, startTan, endTan) '放大新创建的样条曲线 ZoomAll End Sub

3.5.2使用变体类型的数组

从 AutoCAD ActiveX Automation传回的数组信息是变体类型。如果知道数组的数据类型,就可以使用数组方式存取变体数据。如果不知道变体中包含的数据类型,可以使用 VB/VBA 的函数 VarType 或 Typename,这些函数的作用是返回变体中数据的类型。 例3-2:计算两点之间的距离。

在本例中,因为所有的坐标值均为双精度数,即数据类型是已知的。三维坐标值是一个包含三个元素的双精度浮点数组,而二维坐标值是一个包含两个元素的双精度浮点数组。

Sub Ch3_CalculateDistance( ) Dim point1 As Variant Dim point2 As Variant '获取用户输入的点

point1 = ThisDrawing.Utility.GetPoint (, vbCrLf & \point2 = ThisDrawing.Utility.GetPoint _ (point1, vbCrLf & \'计算 point1 和 point2 之间的距离 Dim x As Double, y As Double, z As Double Dim dist As Double x = point1(0) - point2(0) y = point1(1) - point2(1) z = point1(2) - point2(2)

dist = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2)) '显示计算出来的距离

MsgBox \两点间距离为: \计算两点间距离例\End Sub

3.6 创建对AutoCAD部件引用的综合示例

3.6.1创建对AutoCAD部件引用综合示例的用户界面 综合示例的窗体如图3-4所示。

图3-4创建对AutoCAD部件引用综合示例的窗体

3.6.2创建对AutoCAD部件引用综合示例的源程序

该综合示例的源程序全部收录在本书附带的光盘中,下面仅介绍其中的一部分。 1.利用New创建对AutoCAD部件的引用

例3-3:利用New创建对AutoCAD部件的引用,设定AutoCAD窗口的状态及使其可见。 Sub Ch3_ConnectToAcad1( )

Dim AcadApp As AutoCAD.AcadApplication Set AcadApp = New AutoCAD.AcadApplication AcadApp.WindowState = acMax AcadApp.Visible = True End Sub

2. 利用GetObject和 CreateObject函数创建对AutoCAD部件的引用

例3-4: 利用GetObject和 CreateObject函数创建对AutoCAD部件的引用,设定AutoCAD窗口的位置和大小及使其可见。 Sub Ch3_ConnectToAcad2( )

Dim AcadApp As AutoCAD.AcadApplication On Error Resume Next

Set AcadApp = GetObject(,\If Err Then Err.Clear

Set AcadApp = CreateObject(\If Err Then

MsgBox Err.Description

Exit Sub End If End If

MsgBox \现在运行: \AcadApp.WindowTop = 0 AcadApp.WindowLeft = 500 AcadApp.Width = 500 AcadApp.Height = 700 AcadApp.Visible = True End Sub

注:上述源代码仅适用于AutoCAD2004/05/06版。

Exit Sub End If End If

MsgBox \现在运行: \AcadApp.WindowTop = 0 AcadApp.WindowLeft = 500 AcadApp.Width = 500 AcadApp.Height = 700 AcadApp.Visible = True End Sub

注:上述源代码仅适用于AutoCAD2004/05/06版。

本文来源:https://www.bwwdw.com/article/m05r.html

Top