找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 621|回复: 0

[精彩文萃] AutoCAD ActiveX对象

[复制链接]

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-10-17 20:17:14 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

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:包含图形中的所有文字样式。
(10)Dictionaries :包含图形中的所有词典。
(11)Groups :包含图形中的所有编组。
(12)Hyperlinks :包含给定图元的所有超链接。
(13)Layouts :包含图形中的所有布局。
(14)MenuBar :包含 AutoCAD 中当前显示的所有菜单。
(15)MenuGroups :包含 AutoCAD 当前加载的所有菜单和工具栏。
(16)RegisteredApplications:包含图形中所有注册的应用程序。
(17)SelectionSets:包含图形中的所有选择集。
(18)UCSs:包含图形中的所有用户坐标系。
(19)Views 集合:包含图形中的所有视图。
(20)Viewports:包含图形中的所有视口。

3.2.5 Plot 对象和 Utility 对象

Plot 对象提供对“打印”对话框中设置的访问,并为应用过程提供了打印图形的各种方法。
Utility 对象提供用户输入和转换函数。用户输入函数是一些方法,用来提示用户在 AutoCAD 命令行中输入各种类型的数据,例如字符串、整数、实数、点等。转换函数是操作 AutoCAD 特有的数据类型(例如点和角度)以及处理字符串和数值的方法。

3.3 根据对象模型访问对象

3.3.1访问AutoCAD对象时的切入点

1. 从外部访问

如利用VB编写的外部客户程序访问,其切入点必须是根对象。即必须用VB本身的语句或函数,先“引用”应用程序对象(详细内容参见<3.4创建对AutoCAD 部件对象的引用>一节),然后再按照对象模型从上级到下级逐级进行访问。除根对象外,都有一个永久性连接的上一级对象——父对象(只能有一个父对象)。要引用某对象,只能通过它的唯一父对象依次引用之。在对象模型结构中,所有的对象(最末梢的对象)都有一个名为Application的属性,通过它,可直接回到根对象。
例:访问打开的当前文档内模型空间的图形对象——圆。(假设该圆是第一个实体)
Dim MyCircle As AcadCircle
Set MyCircle=AutoCAD.Application.ActiveDocument. _
ModelSpace.Item(0)

2. 从AutoCAD内部用VBA开发的应用程序访问

VBA提供了一个特殊对象ThisDrawing。当用于全局工程时,它代表AutoCAD 中的当前(活动)图形;用于内嵌工程时,它代表包含该工程的图形。对于上例,可写为:
Dim MyCircle As AcadCircle
Set MyCircle=ThisDrawing. ModelSpace.Item(0)
当需要访问在对象层次结构中位于 Document 对象之上的Application对象或不在Document对象之下的对象时,要使用Document对象的Application属性,先返回Application对象。例如若要访问Preferences对象,可按以下语句:
Dim MyPreferences As AcadPreferences
Set MyPreferences =ThisDrawing.Application.Preferences

3.3.2定义中间变量引用常用对象

设有语句:
Dim LineObj As AcadLine
Set LineObj=AutoCAD.Application.ActiveDocument. _
ModelSpace.AddLine(startP,endP)
若设置中间变量:
Dim moSpace As AcadModelSpace
Set moSpace= AutoCAD.Application.ActiveDocument.ModelSpace
则有:
Set LineObj = moSpace. AddLine(startP,endP)

3.4 创建对AutoCAD 部件对象的引用

要利用VB编写的外部客户程序操纵AutoCAD,首先要创建对AutoCAD部件对象的引用。
要创建对AutoCAD 部件对象的引用,一般需要以下三个步骤:
(1)引用AutoCAD类型库。
(2)声明对象变量。
(3)将对象引用赋予变量。

3.4.1AutoCAD类型库

在使用应用程序提供的ActiveX 对象之前,必须先引用(References)其类型库。AutoCAD 2000/2002 的类型库文件名为ACAD.TLB,AutoCAD 2004/2005/2006 的类型库文件名为acax16enu.tlb。默认情况下该类型库位于 c:\program files\common files\autodesk shared 目录下(只要在操作系统中安装了AutoCAD,就可在VB的菜单“工程”中选择“引用...”项)。
现以AutoCAD 2004为例,说明“引用AutoCAD类型库”的步骤:

(1)从菜单“工程”中选择“引用...”命令。
(2)在“引用”对话框中,选择要添加的类型库“AutoCAD2004 Type Library”。然后单击“确定”钮,即添加了对“AutoCAD2004 Type Library”的引用。如图3-2所示。
图3-2 VB的“引用”对话框
在“引用”(References)对话框中添加了引用的ActiveX部件后,就可在菜单“查看”(View)中选择“对象浏览器”(Object Browser)查看它的类型库。可从“工程/库”下拉列表中查到“AutoCAD”,并在相应的“类”(Classes)列表中查找所需要的类名及其成员。如图3-3所示。
图3-3在对象浏览器中查看类名及其成员

3.4.2声明对象变量

添加部件类型库的引用后,即可声明对象变量。
语法: Dim 变量名 As [New] 类名 (Class 参数)
Class 参数由两部分组成,其格式为:Component.Class
其中:
“Component”——提供ActiveX对象的部件名,对应到“对象浏览器”中,就是“对象/库”列表中显示的内容,即“AutoCAD”;
“Class”——(对象的)“类名”,即“类”列表中显示的内容”AcadApplication”。
例:Dim AcadApp As AutoCAD.AcadApplication
注:也可写为 Dim AcadApp As AcadApplication
如使用关键字“New”声明一个对象变量,VB将自动创建一个对象,并在第一次使用该变量时赋值对象引用(省略Set)。

3.4.3将对象引用赋予变量

一般有三种方式赋值一个新的AutoCAD部件对象引用:

1.用New关键字赋值对象引用

如果ActiveX部件提供一个类型库,就可以在变量声明或Set语句中用New关键字创建一个新对象,并将对象引用赋予对象变量。
例: Set AcadApp=New AutoCAD.AcadApplication
使用New关键字仅适用于特定类型的新对象引用。

2. 用CreateObject 函数赋值对象引用

用该函数创建一个新对象,并将对象引用赋予一个对象变量(想要访问的对象必须是外部可创建的)。
语法:Set对象变量= CreateObject(“progID”)
通常,progID参数是正在创建对象的“完全限定类名”。
例:Set AcadApp = CreateObject (“AutoCAD.Application”)

3. 用GetObject函数赋值对象引用

一般用于赋值对已经存在的对象的引用。
语法:Set对象变量= GetObject([pathname][,progID])
参数pathname可以是现存文件的路径,也可完全省略或为空字符串。
例:Set AcadApp = GetObject(,“AutoCAD.Application”)
若运行该语句时AutoCAD尚未启动,上句程序将返回一个错误。
若pathname为空字符串,则功能与CreateObject函数一样。
例:Set AcadApp = GetObject(“”,“AutoCAD.Application”)
注:
1)当对AutoCAD引用后,要使用Application对象的Visible属性让应用程序窗口可见。
2)当对AutoCAD引用后,要将文档对象变量设置为 AutoCAD 应用程序中的 Document 对象。Document 对象由 Application 对象的 ActiveDocument 属性返回。
例:Dim acadDoc as AcadDocument
Set acadDoc = acadApp.ActiveDocument
自此就可使用变量acadDoc引用当前的 AutoCAD 图形。
注:
1)自AutoCAD 2004版起, 对 VBA/VB所使用的 ActiveX Automation接口进行了更改。AutoCAD 2004的COM应用程序访问的注册表项为"AutoCAD.Application.16"。若要将使用AutoCAD 2000/2002版开发的COM应用程序(.vbp)适用于 AutoCAD 2004版,应按以下的步骤进行修改:
(1)在 VB中打开工程文件,然后选菜单“工程”|“引用...”。
(2)在“引用”对话框中,删除对名为 acad.tlb 的类型库(其默认位置是 c:\program files\AutoCAD2002)的引用;改添加对名为 acax16enu.tlb 的类型库(其默认位置是 c:\program files\common files\autodesk shared)的引用,然后单击“确定”。
(3)如果程序中 CreateObject 或 GetObject 函数使用的是独立于版本的 ProgID,则将函数更改为使用依赖于版本的 ProgID。 例如,应将CreateObject("AutoCAD.Application") 替换为 :
CreateObject("AutoCAD.Application.16")。
此外,如果 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 & "First point: ")
point2 = ThisDrawing.Utility.GetPoint _
(point1, vbCrLf & "Second point: ")
'计算 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 "两点间距离为: " & dist, , "计算两点间距离例"
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(,"AutoCAD.Application.16")
If Err Then
Err.Clear
Set AcadApp = CreateObject("AutoCAD.Application.16")
If Err Then
MsgBox Err.Description
Exit Sub
End If
End If
MsgBox "现在运行: " + AcadApp.Name + " Version " + AcadApp.Version
AcadApp.WindowTop = 0
AcadApp.WindowLeft = 500
AcadApp.Width = 500
AcadApp.Height = 700
AcadApp.Visible = True
End Sub
注:上述源代码仅适用于AutoCAD2004/05/06版。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 08:24 , Processed in 0.398132 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表