CAD_vba开发手册

更新时间:2024-07-05 11:07:01 阅读量: 综合文库 文档下载

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

V B A 开 发 人 员 手 册

姓名:高化奎

深圳爱华勘测工程有限公司

第一章:VBA入门

本章将为你介绍AutoCAD VBA工程及VBA交互开发环境(VBA IDE)。尽管大部分VBA环境在行为上都是相似的,但AutoCAD VBA IDE还是有些独有的特性。在AutoCAD中还有些相关的命令可以用于装载工程、运行工程,或打开VBA IDE环境。本章将概要介绍VBA工程、VBA命令和VBA IDE的使用。

本章具体内容如下:了解嵌入和全局VBA工程、用VBA管理器组织工程、处理宏、用VBA IDE编辑工程、更多的信息、回顾AutoCAD VBA 工程术语、回顾AutoCAD VBA 命令

第一节:了解嵌入和全局VBA工程

AutoCAD VBA 工程是代码模块、类模块和窗体的集合,它们组合起来以执行给予的功能。工程可保存在AutoCAD图形中,或作为独立的文件保存。

嵌入工程是保存在AutoCAD图形中。当包含有这些工程的图形中AutoCAD打开时,他们可以自动地装载,这种方法可以很方便地分发工程给用户。嵌入工程也有它的极限,它不能打开或关闭AutoCAD图形,那是由于他们的函数只存在于工程所在的文档中。使用嵌入工程不需要在运行程序之前查找并装载工程文件。举个含有嵌入工程的图形的例子,当图形打开时,一个时间日志被触发。通过这样一个宏的应用可以登记并记录用户在该图形上所花费的时间。这时用户不必去记住在打开图形之前装载工程,这就是自动操作的一个很好的例子。

全局工程保存在独立的文件中,它更加通用,因为他们能在AutoCAD图形中运行,也能打开、关闭AutoCAD图形,但它在图形打开时不能自动装载。用户必须知道他们所需要的宏包含在哪个工程文件中。然而,全局工程非常容易与其它使用者共享,它可以将通用的宏做为很好的库而存在。举个例子,你保存在一个工程文件中的宏是有关多个图形的材料清单。这个宏可以在工作周期的末期由管理员运行,这样就可以收集到所有图形的信息。

在特定的时间,用户可以在同个AutoCAD进程中同时装载嵌入工程和全局工程。

AutoCAD VBA 工程与Visual Basic 工程在二进制结构上是不兼容的。然而,其中的窗体、模块和类可以通过在VBA IDE环境中使用输入和输出VBA命令来在工程之间进行转换。关于VBA IDE的更多信息,可以查看“用VBA IDE编辑工程”

第二节:用VBA管理器组织工程

你可以使用VBA管理器查看装载在当前AutoCAD进程的所有VBA工程。VBA管理器一个AutoCAD工具,它允许你装载、卸载、保存、创建、嵌入和分离VBA工程。 打开VBA管理器的步骤:

1.在工具菜单中选择宏-VBA管理器。 2.或者,在AutoCAD中调用VBAMAN命令。

本节的内容:装载现存的工程、卸载工程、嵌入工程到图形中、从图形中分离工程、创建新的工程、保存嵌入工程。

装载现存的工程

当你装载工程到AutoCAD中,所有的公用的子程序(也称为宏)都可以使用。 嵌入于图形中的工程在图形打开时就被装载。保存在DVB文件中的工程必须单独装载。 装载现存的VBA工程文件

1.在VBA管理器中,使用装载项可弹出打开VBA工程对话框。

2.在打开VBA工程对话框中,选择打开的工程文件。该VBA工程对话框允许你打开有效的DVB文件。如果你尝试打开不同类型的文件,你将会得到出错信息。

3.选择打开。

你也可以使用VBALOAD命令直接出现打开VBA工程对话框以装载工程文件。另外,当工程装载后,该工程所引用的其它工程将会自动地装载。还有,AutoCAD在启动时将自动装载名称为acad.dvb的工程文件。

相关主题:病毒警告

每次当你装载工程时,你会看到启用或禁用工程中的代码以阻止宏病毒的警告框。如果你选用启用代码,如果工程中含有宏病毒时病毒可能会发作。如果你禁用代码,工程同样会装载,但工程中的所有代码将不能运行。想查看更多关于病毒保护的信息,请参考“设置工程选项”。

卸载工程

卸载工程以释放内存并保持装载的工程列表的长度以方便管理。你不能卸载嵌入工程或由其它已装载工程所引用的工程。卸载VBA工程的操作

1.在VBA管理器中,选择要卸载的工程。 2.选择卸载。

或者,使用VBAUNLOAD命令,它将提示你所要卸载的工程。

嵌入工程到图形中

当你嵌入一个工程时,你是将工程的一个副本置于图形数据库中。无论何时,当所包含工程的图形打开或关闭时,工程会同时被装载和被卸载。一个图形只有在同一时间包含一个嵌入工程。如果图形已经包含有一个嵌入工程,你必须在同样地入其它工程之前将该嵌入工程分离出。嵌入工程到AutoCAD图形中的操作 。

1.打开VBA管理器并选择你所要嵌入的工程。 2.选择嵌入。

从图形中分离工程

当你分离工程时,其实是将工程从图形数据库中删除,同时会提示你将工程保存为外部的工程文件。如果你没有将其保存为外部工程文件,该工程的数据将会删除。 从AutoCAD图形中分离工程的操作

1.打开VBA管理器并选择要从图形中分离的工程。 2.选择分离。

3.如果你想保存工程信息为外部工程文件,可以在“你是否想在删除VBA工程前将其输出?”的提示下选择“是”,此时会显示另存为对话框,允许你保存文件。

如果你不想保存该工程信息到外部文件,可以在“你是否想在删除VBA工程前将其输出?”的提

示下选择“否”,此时工程信息将在没有保存的情况下从图形中删除。

创建新的工程

新的工程将作为未保存的全局工程被创建。当工程创建时,你可以将工程嵌入图形中,或将其保存为工程文件。创建新的VBA工程的操作

1.打开VBA管理器。 2.选择新建。

新创建的工程将使用默认的工程名称ACADproject。你必须到VBA IDE中才可以更改工程名称。查看更多关于命名工程的信息,请参考“命名工程”。

保存嵌入工程

嵌入工程是在图形保存时同时保存的。全局工程必须使用VBA管理器或VBA IDE进行保存。使用VBA管理器保存工程的操作

1.打开VBA管理器并选择要保存的工程。 2.选择另存为,此时另存为对话框打开。 3.选择用于保存工程的文件。 4.选择保存

第三节:处理宏

与设置VBA工程选项一样,宏对话框允许你运行、编辑、删除和创建宏。宏是公用(可执行)的子程序。每一工程通常至少一个宏。 打开宏对话框的操作

1.从工具菜单中选择宏-宏。

2.或在AutoCAD中调用VBARUN命令。

在对话框中显示的是所有在有效范围内的宏名称。你可通过下拉列表来改变有效范围。该列表指定所要显示的宏所在的工程或图形。你可在以下列表内容选择所要显示宏范围 所有图形和工程 所有图形 所有工程

在当前所打开的单独图形 在当前所装载的单独工程

通过限制有效范围你可控制显示在列表中的宏名称的数量。它可帮助你注意到当前有多少宏装载到图形中或指定工程中有多少宏。

本节内容: 运行宏 编辑宏 逐语句运行宏 创建新的宏 删除宏 设置工程选项

运行宏

运行宏就是在当前AutoCAD进程中执行宏代码。当前活动图形指的是当宏执行开始时处于打开并处理激活状态。所有在全局工程的宏中所涉及的ThisDrawing对象将指向当前活动图形。在嵌入工程中,ThisDrawing对象通常指向嵌入该宏的图形。

运行宏的操作

1.打开宏对话框并选择要运行的宏。 2.选择运行。

编辑宏

编辑宏将打开VBA IDE并打开所选定宏的代码窗口。详细的介绍请参考“用VBA IDE编辑工程”。

编辑宏的操作

1.打开宏对话框并选择要编辑的宏。 2.选择编辑。

逐语句运行宏

逐语句运行宏指的是开始运行宏并在第一行代码时暂停。VBA IDE也随之打开所选定的宏的代码窗口并高亮显示所执行宏所在的行。

你在VBA管理器中选择了另存为项

在VBA工程没有保存的情况下结束或退出AutoCAD进程

注意:当你保存工程时,它将分配一默认的文件名称project.dvb。尤其重要的是在你保存工程时你应该为工程文件分配一新的名称。如果你使用默认的文件名称project.dvb保存工程,你将不能再创建新的空工程了。每一次你创建新的工程,你将得到的是装入已经存为project.dvb文件名称的工程。 引用其它VBA工程

从其它工程中引用VBA工程可开发者容易分享代码。开发者可使用宏来创建公用的库,然后在需要时引用库中的内容。这样可将共享代码公开并让众多的开发利用该代码。

引用其它VBA工程的操作

1. 在VBA IDE的工程窗口中,选择你要增加引用的工程。 2. 从工具菜单中,选择引用项以打开引用对话框。 3. 从引用对话框中,按浏览按钮打开添加引用对话框。

4. 从添加引用对话框中,选择你要引用的工程文件,然后按打开按钮。 5. 从添加引用对话框中,选择确定按钮完成引用的添加。

当另外的工程被成功以引用,你将会注意到在VBA IDE的工程窗口中有一新的文件夹。该新的文件夹是引用的标题,它包含着引用工程的名称。

当你引用了一个工程,你可使用工程中公用的代码或部件。

当引用了其它工程的工程被装载到AutoCAD中,被引用的工程也自动地装载到AutoCAD中。该被引用工程在引用它的工程没有关闭之前是不能关闭的。

你不能进行循环引用。也就是说,你不能引用包含第一个工程的工程。如果你不小心创建了一个循环引用,你将会得到VBA的一个警告提示。

注意:你不能引用嵌入工程或从其它应用程序中的VBA工程。

设置VBA IDE选项

你可使用选项对话框更改VBA IDE的特征。可使用工具菜单并选择选项来打开选项对话框。

选项对话框包含四个选项卡:编辑器、编辑器格式、通用和可连接。 编辑器

编辑器选项卡指定代码窗口和工程窗口的设置。

代码设置包括 自动语法检测 要求变量声明 自动列出成员 自动显示快速信息 自动显示数据提示

自动缩进 Tab宽度 窗口设置包括 编辑时可拖放文本 缺省为查看所有模块 过程分隔符显示

编辑器格式

编辑器格式选项卡指定Visual Basic代码的外观。 你可以

更改代码的颜色 更改文本列出项 更改前景 更改背景 更改边界标识条 更改文本字体和大小 显示或隐藏边界标识条 显示或隐藏你设置的示例文本

通用

通用选项卡指定当前Visual Basic工程的设置、出错处理和编译设置。 你可以

更改窗体栅格的栅格设置 显示或隐藏工具提示

设定工程折叠收起时自动隐藏窗口 在丢失当前状态前通知 决定出错时的处理方法

设定工程编译时为需要时编译或进行后台编译。 可连接的

可连接的选项卡允许你选择要进行泊留在主窗口上的窗口(也就是非浮动状态)。

进行介绍性练习

现在你可能已经学习了在AutoCAD VBA中进行编程的基础知识,那就试试创建一个简单的“Hello World”的练习示例。在本练习中你将创建一个新的AutoCAD图形,在图形中增加一行文本,然后保存图形,所有的这些操作都在VBA中完成。

创建“Hello World”文本对象

1 打开从AutoCAD的命令行中输入以下命令打开VBA IDE: 命令:VBAIDE

2 在VBA IDE的视图菜单中选择代码项打开代码窗口。

3 通过从VBA IDE的插入菜单中选择过程项在工程中创建一个新的过程。

4 当提示需要过程信息时,输入如Hello World这样的名称。确定类型选定的是Sub,而范围选定的是Public。

5 选择确定。

6 在行Public Sub Hello World()和行End Sub之间输入以下代码(功能是打开新的图形): ThisDrawing.Application.Documents.Add

7 紧接着第6步输入以下代码(它创建文本字符并定义它的插入位置)。

Dim insPoint(0 To 2) As Double '定义插入点 Dim textHeight As Double '定义文本高度 Dim textStr As String '定义文本字符 Dim textObj As AcadText '定义文本对象

insPoint(0) = 2 '设定插入点X坐标 insPoint(1) = 4 '设定插入点Y坐标 insPoint(2) = 0 '设定插入点Z坐标

textHeight = 1 '设定文本高度为1.0 textStr = \设定文本字符

'创建文本对象

Set textObj = ThisDrawing.ModelSpace.AddText _ (textStr, insPoint, textHeight)

8 紧接着第7步输入以下代码(保存图形) ThisDrawing.SaveAs(\

9 通过从VBA IDE的运行菜单中选择运行过程/用户窗体项运行你的程序。

当程序运行完成后,回到AutoCAD应用程序中,你可看到在图形中出现有“Hello World!”的文本。该图形名称为Hello.dwg。

第五节:更多的信息

关于VBA IDE及Visual Basic编程语言的更多信息可在微软提供的帮助文件中找到。 访问微软VBA IDE帮助文件的操作

从VBA IDE的帮助菜单中,选择Microsoft Visual Basic帮助。

第六节:回顾AutoCAD VBA 工程术语

常规工程

保存在.dvb文件的VBA工程。 嵌入工程

保存在AutoCAD图形中的VBA工程。 正常文档

没有包含VBA嵌入工程的AutoCAD图形。 活跃文档

包含VBA嵌入工程的AutoCAD图形。 当前工程

在VBA IDE中当前选定的工程。 ThisDrawing

ThisDrawing是用于声称当前图形的VBA编程项目。在常规工程中,ThisDrawing通常指向AutoCAD的活动文档。在嵌入的工程中,ThisDrawing通过指向包含该工程的文档。 VBA IDE

指的是VBA交互开发环境。该应用程序允许你编辑工程中的代码和窗体,或从其它工程中复制代码和窗体。它也允许你设定引用其它应用程序的对象模块。 VBA 管理器

VBA管理器允许你管理工程。你可以创建、删除、嵌入或分离工程。你也可以查看工程是否嵌入于打开的图形中。 宏对话框

宏对话框允许你运行、删除和创建新的宏,也提供访问VBA工程选项。

第七节:回顾AutoCAD VBA 命令

VBAIDE

打开VBA IDE。

该VBA IDE允许你交互式地编辑、运行及调试程序。尽管VBA IDE只能在AutoCAD运行时才能调用,但它可独立于AutoCAD应用程序窗口进行最小化、打开和关闭。 VBALOAD

在当前AutoCAD进程中装载VBA工程。 VBARUN

从宏对话框中或从AutoCAD命令行中运行VBA宏。 VBAUNLOAD

从当前AutoCAD进程中卸载VBA工程。

如果VBA工程已被修改但还没有保存,系统会弹出保存工程对话框(或在命令行)提示是否保存。

VBAMAN

显示VBA管理器,允许你查看、创建、装载、关闭、嵌入和分离工程。 VBASTMT

从AutoCAD命令行中执行VBA语句。

第二章:理解ActiveX自动操作基础

如果想有效地使用AutoCAD ActiveX自动操作,你必须熟悉AutoCAD图元、对象和与你用于开发的应用程序类型相关联的特性。对于对象的图形和非图形属性认识越深,通过AutoCAD ActiveX自动操作对其进行操作就越容易。

记住你随时都可以调出AutoCAD ActiveX自动操作的帮助文件-只要按一下F1键就行。如果你对对象、方法或属性的细节有何不清楚之处,可在VBA IDE中选中相应对象、方法或属性并按F1键。

本章具体内容如下:理解AutoCAD对象模型,访问对象层次,通过集合对象操作,理解属性和方法,理解父对象,定位类型库,在数据库中返回第一个图元,在方法和属性中使用变体,使用其它程序语言

第一节:理解AutoCAD对象模型

一个对象就是AutoCAD ActiveX界面的一个主要组成块。每一暴露的对象描绘了AutoCAD的精确部分。在AutoCAD ActiveX界面中有许多不同类型的对象。例如

图形对象,如线、弧、文本和标注都是对象 样式设置,如线型和标注样式均为对象 组织结构,如图层、组合和图块也是对象 图形显示,如视图和视口都是对象

甚至图形和AutoCAD应用程序本身也是对象

对象是通过分层方式来组织的,应用程序对象为根对象。这种分层结构的视图被归结为对象模型。对象模型提供了你访问下一层对象的途径。

本节内容:

简要介绍Application(应用程序)对象 简要介绍Document(文档)对象 简要介绍Collection(集合)对象 简要介绍图形和非图形对象

简要介绍Preferences(参数选择)、Plot(打印出图)和Utility(实用工具)对象

简要介绍Application(应用程序)对象

应用程序对象是AutoCAD ActiveX自动操作对象模型的根对象。通过应用程序对象,你可访问其它的对象,或指派对象的属性和方法。

例如,应用程序对象具有Preferences(参数选择)属性,它返回Preferences(参数选择)对象。该对象提供访问在选项对话框中设定的注册信息。(图形信息设定包含在DatabasePreferences对象,它在后面会介绍到。) 应用程序对象的其它属性提供你访问应用程序指定数据,如应用程序的名称和版本、还有AutoCAD的窗口大小、位置和可见性等。应用程序对象的方法执行应用程序指定的动作,如列出、装载、卸载ADS和ARX应用程序,还有退出AutoCAD。

应用程序对象也提供通过Documents(文档)集合链接到AutoCAD图形、通过MenuBar和MenuGroups集合链接到AutoCAD菜单和工具栏,还有通过称为VBE属性链接到VBA IDE。

应用程序对象也是ActiveX界面的全局对象。也就是说应用程序对象的所有方法和属性在全局名称空间都是有效的。

简要介绍Document(文档)对象

文档对象,实际上就是AutoCAD图形,它可在Documents(文档)集合中找到,它提供访问所有图形还有大部分非图形的AutoCAD对象。通过提供的ModelSpace(模型空间)和PaperSpace(图纸空间)访问图形对象(线、圆、弧等),通过提供的如Layers(图层)、Linetypes(线型)和TextStyles(字型)这样名称的集合访问非图形对象(图层、线型、字型等)。Document(文档)对象也提供访问Plot(打印出图)和Utility(实用工具)对象。

简要介绍Collection(集合)对象

AutoCAD组合大部分的对象在集合中。尽管这些集合包含不同类型的数据,但它们是通过相似的技术进行处理。每一集合都有添加对象到集合中的方法。大多数集合使用Add(添加)方法以达到目的。不同的是,图元对象通常使用标头为Add<图元名称>这样的方法来进行添加。例如,添加一条直线你必须使用AddLine方法。

集合也拥有共用的一些其它方法和属性。Count(记数)属性可用于获取集合中对象的数目。Item(项目)方法可用于获取集合中的对象。

简要介绍图形和非图形对象

图形对象,也称为图元,它是构成图形的可见对象(如直线、圆、光栅图像等)。创建这些对象,可用近似于Add<图元名称>方法。修改或查询这些对象,可使用对象自身的方法和属性。每一图形对象都有方法允许应用程序执行大部分的AutoCAD编辑命令,如复制、删除、移动、镜像还有其它。这些对象也有相应方法可以设定及返回扩展数据(xdata)、高亮和更新、返回对象的边框范围等。图形对象具有如图层、线型、颜色和句柄这样典型的属性。它们也有其特殊的依赖于这些对象类型的属性,如圆心、半径和面积等。

非图形对象为不可见(指示性)对象,它们是图形的一部分,就如Layers(图层)、Linetypes(线型)、DimStypes(标注样式)、SelectionSets(选择集)等。创建这些对象,可在父集合对象中使用Add(添加)方法。而修改或查询这些对象,可使用对象自身的方法和属性。每一非图形对象均有其特殊的方法及属性以达到其目的;所有对象都有方法可以设定及返回扩展数据。

简要介绍Preferences(参数选择)、Plot(打印出图)和Utility(实用工具)对象

在参数选择(Preferences)对象下边为对象集,每一对象集都与选项对话框的一个选项卡相关。它们共同提供访问在选项对话框中所有的注册设置。图形设置包含在数据库参数选择(DatabasePreferences)对象中。你也可通过SetVariable和GetVariable方法来设定和修改选项(系统变量不是选项对话框的一部分)。设置选项的详细内容请参考“设定AutoCAD参数”。

打印出图(Plot)对象提供访问在打印对话框的设定,并且让其它程序可以使用不同的方法打印图形。图形打印的相关内容请参考“打印图形”。

实用工具(Utility)对象提供用户输入和转换功能。用户输入功能是在AutoCAD命令行中提示用户输入不同类型数据的方法,如输入字符串、整数、实数、点等。转换功能是操作AutoCAD特有数据类型的方法,如点和角度,另外还有字符串和数字的处理。用户输入功能的相关内容请参考“提示用户输入”。

第二节:访问对象层次

在VBA内部访问对象层次是非常容易的。这是因为VBA是运行在AutoCAD进程的内部,所以不必通过附加的步骤与应用程序进行连接。

VBA通过ThisDrawing对象链接到当前AutoCAD进程的活动图形。通过使用ThisDrawing直接获得访问当前文档对象和所有相关的方法和属性以及所有在该层次中的其它对象。

当使用全局工程,ThisDrawing通常指向AutoCAD中的活动文档。当用的是嵌入工程,ThisDrawing通常指向包含该工程的文档。例如,以下在全局工程中的代码行将保存当前AutoCAD中活动的图形:

thisDrawing.Save

在对象层次中引用对象

你可直接可通过用户定义变量引用对象。直接引用对象,应包括对象的层次。例如,以下语句增加一条直线到模型空间。注意到层次状态为ThisDrawing,然后是ModelSpace(模型空间)对象,最后才是AddLine方法:

Dim startPoint(0 To 2) As Double, endPoint(0 To 2) As Double Dim LineObj as AcadLine

startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0 endPoint(0) = 30: endPoint(1) = 20: endPoint(2) = 0

Set LineObj = ThisDrawing.ModelSpace.AddLine(startPoint,endPoint)

通过用户定义变量引用对象,首先定义变量的类型,然后设定变量为适当的对象。例如,以下代码定义了一个类型为AcadModelSpace的变量(moSpace)并设定变量等于当前模型空间:

Dim moSpace As AcadModelSpace Set moSpace = ThisDrawing.ModelSpace

以下语句使用用户定义变量增加一条直线到模型空间:

Dim startPoint(0 To 2) As Double, endPoint(0 To 2) As Double Dim LineObj as AcadLine

startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0 endPoint(0) = 30: endPoint(1) = 20: endPoint(2) = 0 Set LineObj = moSpace.AddLine(startPoint,endPoint)

访问应用程序对象

因为ThisDrawing对象提供与文档对象的链接,你可能会觉得奇怪,在文档对象之上对象层次的根对象(应用程序对象)是怎样访问的。其实文档对象中有一称为应用程序的属性可提供与应用程序对象的链接。 例如,以下代码行更新应用程序:

ThisDrawing.Application.Update

第三节:通过集合对象操作

集合对象是预先定义的对象,它包含所有相似对象的实例(即这些对象的父对象)。集合对象有以下的对象:

文档(Documents)集合

包含所有在当前AutoCAD进程打开的文档。 模型空间(ModelSpace)集合

包含在模型空间中的所有图形对象(图元)。 图纸空间(PaperSpace)集合

包含在活动图纸空间布局中的所有图形对象(图元)。 图块(Block)对象

包含在指定图块定义中的所有图元。 图块(Blocks)集合

包含在图形中的所有图块。 字典(Dictionaries)集合

包含在图形中的所有字典。 标注样式(DimStyles)集合

包含在图形中的所有标注样式。 组合(Groups)集合

包含在图形中的所有组合。 超级链接(Hyperlinks)集合

包含提供图元的所有超级链接。 图层(Layers)集合

包含在图形中的所有图层。 布局(Layouts)集合

包含在图形中的所有布局。 线型(Linetypes)集合

包含在图形中的所有线型。 菜单条(MenuBar)集合

包含当前显示于AutoCAD的所有菜单。 菜单组(MenuGroups)集合

包含当前装载到AutoCAD中的所有菜单和工具栏。 注册应用程序(RegisteredApplications)集合

包含在图形中的所有注册的应用程序。 选择集(SelectionSets)集合

包含在图形中所有的选择集。

字型(TextStyles)集合

包含在图形中所有的文字样式。 UCSs 集合

包含在图形中所有的用户坐标系统(UCS)。 视图(Views)集合

包含在图形中所有的视图。 视口(Viewports)集合

包含在图形中所有的视口。 本节内容: 访问集合

添加新成员到集合对象 在集合对象中循环 删除集合对象中的成员 访问集合

大多数集合对象是通过文档对象来访问的。文档对象包含每个集合对象的属性。例如,以下代码定义一个变量并将其设定到当前图形的图层集合中:

Dim layerCollection as AcadLayers Set layerCollection = ThisDrawing.Layers

文档集合、菜单条集合和菜单组集合是通过应用程序对象进行访问。应用程序对象为这些集合的每一个集合包含一个属性。例如,以下代码定义了一个变量并且设定该变量为应用程序中的菜单组集合:

Dim MenuGroupsCollection as AcadMenuGroups

Set MenuGroupsCollection = ThisDrawing.Application.MenuGroups

添加新成员到集合对象

添加新成员到集合中使用的是Add方法。例如,以下代码创建一个新的图层并且将其添加到图层集合中:

Dim newLayer as AcadLayer

Set newLayer = ThisDrawing.Layers.Add(\

在集合对象中循环

选择集合对象中的一个指定成员,使用的是Item(项目)方法。Item方法需要一个标识符。该标识符可以是指定集合内部项目位置的索引号或者描述项目名称的字符串。 以下例子在集合中循环并显示集合中所有图层的名称: 在图层集合中循环

Sub Ch2_IterateLayer() ' 在图层集合中循环 On Error Resume Next

Dim I As Integer Dim msg As String msg = \

For I = 0 To ThisDrawing.Layers.count - 1

msg = msg + ThisDrawing.Layers.Item(I).Name + vbCrLf Next MsgBox msg End Sub

以下例子使用Item方法查找名称为“ABC”的图层: 查找名称为“ABC”的图层

Sub Ch2_FindLayerABC()

' 使用Item方法查找名称为“ABC”的图层 On Error Resume Next

Dim ABCLayer As AcadLayer

Set ABCLayer = ThisDrawing.Layers.Item(\If Err <> 0 Then

MsgBox \图层“ABC”并不存在。\End If End Sub

注意:当使用For Each机制同时在集合循环时,不要在对象上使用图元编辑方法(复制、阵列、镜像等),你只能在完成循环之后才可试着去编辑对象,或者先创建一个临时的数组并且设定其与集合相等,然后才可以在该复制的阵列中循环并执行你的操作。 删除集合对象中的成员

删除指定的成员,可使用所找到成员对象的Delete(删除)方法。例如,以下代码删除图层ABC: Dim ABCLayer as AcadLayer

Set ABCLayer = ThisDrawing.Layers.Item(\ABCLayer.Delete

当对象被删除后,你再也不能试图用程序去访问该对象了。

第四节:理解属性和方法

每一对象都关联着属性和方法。属性描述着单个对象的外观,而方法是一种可在单个对象上执行的行为。当对象创建后,你就可通过属性和方法查询和编辑对象。

例如,一个圆对象有圆心属性。该属性以三维世界坐标系统的坐标描述了圆的圆心。更改圆的圆心,你只要简单地将该属性设定为新的坐标。圆对象也有称为偏移(Offset)的方法。该方法可在相对于现存圆的指定偏移距离创建一个新的对象。关于圆对象所有属性和方法的列表,请参考AutoCAD ActiveX和VBA参考中的圆对象。

第五节:理解父对象

每一个对象都有其永远不变的父对象。所有对象都源于称为根对象的单个父对象。你可以通过从根对象链接到子对象的方法访问所有在界面中的对象。还有,所有对象都有称为应用程序的属性以直接链接回根对象。

AutoCAD界面的根对象为AutoCAD应用程序。

第六节:定位类型库

通过自动操作对象暴露的对象、属性和方法都包含在类型库中。类型库是一个文件或一个文件的一部分,它描述一个或多个对象的类型。类型库并不保存对象;它们只保存信息。通过访问类型库,应用程序和浏览器可确定对象的特征,如对象支持的界面和每一界面成员的名称和地址。

在使用通过应用程序暴露出来的自动操作对象,你必须引用其类型库。该引用已由AutoCAD VBA自动设定好。而在其它的交互开发环境中你必须创建这个引用。

你可以在没有引用应用程序类型库的情况下使用应用程序对象。然而,由于以下理由,可考虑增加类型库引用:

全局可访问函数可无条件直接访问。

调用函数、属性和方法可在编译时检查其正确性,这样可以在运行时有更快的速度。 有可能的话可声明定义在库中的变量类型,这样可增加运行时的可靠性和可读性。

第七节:在数据库中返回第一个图元

以下例子返回模型空间中的第一个图元对象。对于图纸空间中的图元,代码略有不同: 返回模型空间中的第一个图元

Sub Ch2_FindFirstEntity()

' 这个例子返回模型空间中的第一个图元 On Error Resume Next

Dim entity As AcadEntity

If ThisDrawing.ModelSpace.count <> 0 Then Set entity = ThisDrawing.ModelSpace.Item(0) MsgBox entity.ObjectName + _ \是在模型空间中的第一个图元。\Else

MsgBox \在模型空间中没有对象存在。\End If End Sub

第八节:在方法和属性中使用变体

AutoCAD ActiveX自动操作是使用变体传递数组数据。尽管这对于初学者来说有点弄不懂,但只要你有点基础知识就不会觉得困难。另外,AutoCAD ActiveX自动操作提供了帮助你转换数据类型的工具。 本节内容: 什么是变体?

在数组数据中使用变体 转换数组为变体 解释变体数组 什么是变体?

变体是一种特殊的数据类型,它可包含除固定长度字符串数据和用户定义类型外的其它任何类型的数据。变体也可包含特殊的值,如Empty、Error、Nothing和NULL。你可通过VarType或TypeName这样的Visual Basic函数来确定变体中数据。

你可使用变体数据类型来放置大多数的任何数据类型,来使工作途径更灵活。 在数组数据中使用变体

变体是用于传递数组数据进和出AutoCAD ActiveX自动操作。也就是说你的数组必须为变体以由AutoCAD ActiveX自动操作的方法和属性所接受。另外,从AutoCAD ActiveX自动操作中输出的数组数据必须处理为变体。

注意:在AutoCAD,VBA中输入数组会自动转换为变体。也就是说你在VBA中使用的数组不必将其转换为变体数组后才输入ActiveX自动操作的方法和属性。然而,所有输出的数组将是变体的形式,所以请记住要进行适当的处理。 转换数组为变体

AutoCAD ActiveX自动操作提供了实用方法以转换数组中的数据为变体。该方法为CreatTypedArray方法,它创建包含整数、浮点数、双精数等数组的变体。你可传递这些结果的变体到任何接受作为变体的数据数值的AutoCAD方法或属性。

CreatTypedArray方法接受在数组中输入的数值类型,和转换的数组数据。它返回数组数值为变体。以下代码使用CreateTypedArray转换有三个数组:样条曲线的拟合点坐标、样条曲线的起点切点和终点切点。然后传递这些变体到AddSpline方法以创建样条曲线。 使用CreateTypedArray方法创建样条曲线 Sub Ch2_CreateSplineUsingTypedArray()

' 这个例子在模型空间中利用CreateTypedArray方法 ' 创建样条曲线。

Dim splineObj As AcadSpline Dim startTan As Variant Dim endTan As Variant Dim fitPoints As Variant Dim noOfPoints As Integer

Dim utilObj As Object ' 然后绑定在实用工具对象 Set utilObj = ThisDrawing.Utility

' Define the Spline Object 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 noOfPoints = 3

Set splineObj = ThisDrawing.ModelSpace.AddSpline _ (fitPoints, startTan, endTan)

' 缩放查看该新创建的样条曲线 ZoomAll End Sub 解释变体数组

从AutoCAD ActiveX自动操作传递回的数组信息是以变体的方式传递回。如果你知道数组中的数据类型,你可以简单地将变体作为数组访问。如果你不知道包含在变体中的数据类型,可使用VBA函数VarType或Typename来处理。这两个函数返回在变体中的数据类型。如果你需要在数组中循环,你可使用VBA的For Each语句。

以下代码示范了计算由用户输入的两点的距离。在该例中,数据类型已经知道,因为所有坐标均为双精度。三维坐标是双精度的三元素数组,而二维坐标是双精度的二元素数组。 计算两点之间的距离

Sub Ch2_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 \两点之间的距离为: \& dist, , \个计算单位\End Sub

第九节:使用其它程序语言

本指南和AutoCAD ActiveX及VBA参考是为VBA编程语言所编写的。所以程序中的例子和示例应用程序都在VBA中编写。如果要将这些代码用于其它编辑环境,你必须将其更新到所选择的环境中。 本节内容:

转换VBA代码到VB中

转换VBA代码到VB中

更新代码示例以用于VB中,你必须首先引用AutoCAD类型库。在VB中,可从工程菜单中选择引用项弹出引用对话框。从引用对话框中,选择AutoCAD Release 15类型库并按确定。

下一步,在代码示例中使用引用活动文档的用户指定变量替换所有引用的ThisDrawing。要做到这一点,可定义AutoCAD应用程序变量(acadApp)和当前文档变量(acadDoc)。然后,设定应用程序变量到当前AutoCAD应用程序。

如果AutoCAD正在运行,用GetObject方法返回AutoCAD应用程序对象。如果AutoCAD没有运行,则会捕获到一个错误发生(对于本例),然后清除它。接下来用CreateObject方法试图创建AutoCAD应用程序对象。如果成功,则会启动AutoCAD;如果失败,则会弹出一信息框显示出错的内容。以下代码示例使用了Err的Clear和Description属性。如果你的代码环境不支持这些属性,你需要适当修改示例。 从Visual Basic中连接到AutoCAD Sub Ch2_ConnectToAcad() Dim acadApp As 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 \现在运行 \\版本号 \End Sub

下一步,设定文档变量到AutoCAD应用程序中的文档对象。文档对象是由应用程序对象的ActiveDocument属性返回的。 Dim acadDoc as AcadDocument

Set acadDoc = acadApp.ActiveDocument

通过以上操作,使acadDoc变量引用当前AutoCAD图形。

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

Top