简介

AutoCAD ActiveX 技术概述
ActiveX/VBA 开发人员手册 >
简介

本简介介绍了通过 ActiveX Automation 接口显示 AutoCAD 对象以及使用 Visual Basic for Applications 编程环境对这些对象进行编程的相关概念。

本节内容

  • AutoCAD ActiveX 技术概述
  • AutoCAD Visual Basic for Applications (VBA) 接口概述
  • AutoCAD ActiveX 和 VBA 一起运行
  • 本书的结构
  • 关于更多信息
  • 代码样例
  • 移植 Automation 工程
请将关于此页的评论发送给我们


AutoCAD ActiveX 技术概述

简介
简介
AutoCAD Visual Basic for Applications (VBA) 接口概述
ActiveX/VBA 开发人员手册 > 简介 >
AutoCAD ActiveX 技术概述

AutoCAD® ActiveX® 使用户能够从 AutoCAD 的内部或外部以编程方式来操作 AutoCAD。它是通过使 AutoCAD 对象暴露于“外部世界”来实现这一功能的。暴露这些对象后，可以通过多种不同的编程语言和环境以及其他应用程序（例如 Microsoft® Word VBA 或 Excel VBA）对其进行访问。

ADD AX_INTRO 图形

在 AutoCAD 中实现 ActiveX 接口有两大优点：

  • 更多的编程环境可以编程访问 AutoCAD 图形。在 ActiveX Automation 出现之前，开发人员只能用 AutoLISP® 或 C++ 接口访问 AutoCAD 图形。
  • 与其他 Windows® 应用程序（例如 Microsoft Excel 和 Word）共享数据比以前要方便得多。

对象是所有 ActiveX 应用程序的主要构造块。每一个显示的对象均精确代表一个 AutoCAD 组件。AutoCAD ActiveX 接口中有许多不同类型的对象。例如：

  • 直线、圆弧、文字和标注等图形对象都是对象。
  • 线型与标注样式等样式设置都是对象。
  • 图层、编组和块等组织结构都是对象。
  • 视图与视口等图形显示都是对象。
  • 甚至图形、AutoCAD 应用程序本身也是对象。


AutoCAD Visual Basic for Applications (VBA) 接口概述

AutoCAD ActiveX 技术概述
简介
VBA 在 AutoCAD 中的实现方式
ActiveX/VBA 开发人员手册 > 简介 >
AutoCAD Visual Basic for Applications (VBA) 接口概述

Microsoft VBA 是一个面向对象的编程环境，可提供类似 Visual Basic 6 (VB) 的丰富开发功能。VBA 和 VB 的主要差别是 VBA 和 AutoCAD 在同一进程空间中运行，提供的是具有 AutoCAD 智能的、非常快速的编程环境。

VBA 也向其他支持 VBA 的应用程序提供应用程序集成。这就意味着 AutoCAD（使用其他应用程序对象库）可以是如 Microsoft Word 或 Excel 之类的其他应用程序的 Automation 控制程序。

可以单独购买独立开发版的 Visual Basic 6，为 AutoCAD VBA 提供额外的组件，例如外部的数据库引擎和报表编写功能。

在 AutoCAD 中实现 VBA 有四大优点：

  • VBA 及其环境易于学习和使用。
  • VBA 可与 AutoCAD 在同一进程空间中运行。这使程序执行得非常快。
  • 对话框的构造快速而有效。这使开发人员可以构造原型应用程序并迅速收到设计的反馈。
  • 工程可以是独立的，也可以嵌入到图形中。这样就为开发人员提供了非常灵活的方式来发布他们的应用程序。
注意Microsoft 未承诺提供 64 位 VBA SDK 库 (.dll)。因此，64 位 AutoCAD 无法再将 VBA 作为进程中组件运行；现在 VBA 组件作为 32 位进程外 COM 组件运行，并为 64 位 AutoCAD VBA 用户提供权宜安排。此安排可能需要对现有 VBA 代码做些更改。此权宜安排将在 AutoCAD 的后续版本中取消，建议用户将现有 VBA 代码转换为 VB. NET。

本节内容

  • VBA 在 AutoCAD 中的实现方式


VBA 在 AutoCAD 中的实现方式

AutoCAD Visual Basic for Applications (VBA) 接口概述
AutoCAD Visual Basic for Applications (VBA) 接口概述
使用 Microsoft .NET Framework
ActiveX/VBA 开发人员手册 > 简介 > AutoCAD Visual Basic for Applications (VBA) 接口概述 >
VBA 在 AutoCAD 中的实现方式

VBA 通过 AutoCAD ActiveX Automation 接口将消息发送到 AutoCAD。AutoCAD VBA 允许 VBA 环境与 AutoCAD 同时运行，并通过 ActiveX Automation 接口对 AutoCAD 进行编程控制。AutoCAD、ActiveX Automation 和 VBA 的这种结合方式不仅为操作 AutoCAD 对象，而且为向其他应用程序发送或检索数据提供了功能极为强大的接口。

在 AutoCAD 中有三个定义 AcitveX 和 VBA 编程的基本元素。第一个是 AutoCAD 本身，它拥有一个丰富的对象集，其中封装了 AutoCAD 图元、数据和命令。因为 AutoCAD 是一个设计为具有多层接口的开放架构应用程序，因此熟悉 AutoCAD 编程功能对于有效使用 VBA 来说是非常必要的。如果以前使用过 AutoLISP 编程来控制 AutoCAD，就应该对 AutoCAD 工具有一定的了解。然而，VBA 的基于对象的处理方式和 AutoLISP 的方式却很不一样。

第二个元素是 AutoCAD ActiveX Automation 接口，它建立与 AutoCAD 对象的消息传递（通讯）。在 VBA 中编程需要对 ActiveX Automation 有基本的了解。《ActiveX and VBA Reference》中介绍了 AutoCAD ActiveX Automation 接口。即使是有经验的 VB 编程人员也会发现要理解和开发 AutoCAD VBA 应用程序，AutoCAD ActiveX Automation 接口是非常重要的。

第三个元素是 VBA 编程环境，它具有自己的对象集、关键字和常量等，能提供程序流、控制、调试和执行等功能。AutoCAD VBA 帮助包含 Microsoft VBA 扩展帮助，可以通过以下方法从 VBA IDE 中对其进行访问：

  • 按键盘上的 F1 键
  • 从 VBA IDE 菜单栏中选择“帮助”
  • 单击 VBA IDE 工具栏上的“?”图标

本节内容

  • 使用 Microsoft .NET Framework
  • 依赖性和限制


使用 Microsoft .NET Framework

VBA 在 AutoCAD 中的实现方式
VBA 在 AutoCAD 中的实现方式
依赖性和限制
ActiveX/VBA 开发人员手册 > 简介 > AutoCAD Visual Basic for Applications (VBA) 接口概述 > VBA 在 AutoCAD 中的实现方式 >
使用 Microsoft .NET Framework

要通过 Microsoft Visual Studio® .NET 完全访问 AutoCAD Automation 对象，请创建以下文件的引用：

  • AutoCAD 2008 类型库“acax17enu.tlb”，位于“C:\Program Files\Common Files\Autodesk Shared”目录中。
  • AutoCAD/ObjectDBX Common 17.0 类型库“axdb17enu.tlb”，位于“C:\Program Files\Common Files\Autodesk Shared”目录中。

这些引用将提供以下主要交互操作部件：Autodesk.AutoCAD.Interop.dll（用于 AutoCAD 专用类型）和 Autodesk.AutoCAD.Interop.Common.dll（用于 ObjectDBXTM 宿主应用程序共享的类型）。Interop 程序集位于全局程序集缓存中，它们会将 Automation 对象映射到 .NET 的对等对象。

引用了类型库之后，可以在 Microsoft Visual Studio .NET 中声明基于 AutoCAD 的变量，如下例所示：

Dim objAcad As Autodesk.AutoCAD.Interop.AcadApplication
Dim objLine As Autodesk.AutoCAD.Interop.Common.AcadLine

可以在 AutoCAD 中使用 NETLOAD 命令加载 .NET 应用程序。

关于与 AutoCAD 配合使用的 .NET 应用程序的详细信息，请访问 Autodesk 网站的 Developer Center 专区


依赖性和限制

使用 Microsoft .NET Framework
VBA 在 AutoCAD 中的实现方式
AutoCAD ActiveX 和 VBA 一起运行
ActiveX/VBA 开发人员手册 > 简介 > AutoCAD Visual Basic for Applications (VBA) 接口概述 > VBA 在 AutoCAD 中的实现方式 >
依赖性和限制

如果在安装 AutoCAD 之后安装了、重新安装了或卸载了 Microsoft Office 或其他 VBA 应用程序，则需要重新安装 AutoCAD 并重新启动系统。


AutoCAD ActiveX 和 VBA 一起运行

依赖性和限制
简介
本书的结构
ActiveX/VBA 开发人员手册 > 简介 >
AutoCAD ActiveX 和 VBA 一起运行

AutoCAD ActiveX/VBA 接口表现出超出其他 AutoCAD API 环境的许多优点：

  • 速度。通过用 VBA 在进程内运行，ActiveX 应用程序比 AutoLISP 应用程序运行速度要更快。
  • 易用。其编程语言和开发环境易于使用，而且随 AutoCAD 安装。
  • Windows 互操作性。ActiveX 和 VBA 是为与其他 Windows 应用程序一起使用而设计的，为应用程序之间的信息交流提供了绝佳的途径。
  • 快速建立原型。VBA 可以快速开发界面，为建立应用程序原型提供了一个完善的环境，即使这些应用程序最终将用其他语言开发。
  • 程序员基础。AutoCAD ActiveX 和 VBA 技术可以使 Visual Basic 6 程序员能够自定义 AutoCAD 并为其开发应用程序。


本书的结构

AutoCAD ActiveX 和 VBA 一起运行
简介
关于更多信息
ActiveX/VBA 开发人员手册 > 简介 >
本书的结构

本手册提供关于用于 AutoCAD 的 ActiveX 和 VBA 应用程序开发的信息。“Getting Started with VBA”和“Develop Applications with VBA”中介绍了使用 VBA 开发应用程序的相关信息。从 VBA 以外的开发环境中使用 ActiveX 的程序员可以跳过这两章。不过，请注意本手册中的所有样例代码均用 VBA 表示。


关于更多信息

本书的结构
简介
代码样例
ActiveX/VBA 开发人员手册 > 简介 >
关于更多信息

本手册假定用户具有使用 Visual Basic 6 编程语言的应用知识，因此不是简单地重复或取代有关 Visual Basic 6 的大量文档。如果用户需要有关 Visual Basic 6 语言或开发环境用法的详细信息，请参见由 Micorsoft 开发的 Visual Basic for Application 帮助文件。用户可以在交互式开发环境 (IDE) 中的“帮助”菜单中找到该文件。


代码样例

关于更多信息
简介
移植 Automation 工程
ActiveX/VBA 开发人员手册 > 简介 >
代码样例

本手册和 ActiveX and VBA Reference总共包含了超过 800 个的 VBA 子例程样例，这些样例示范了 ActiveX 方法、特性和事件的用法。

AutoCAD Sample 目录中还提供了许多样例应用程序。这些样例应用程序显示了大量的功能，从将 AutoCAD 图形数据提取到 Microsoft Excel 电子表格中进行绘制，到在电力传输塔中执行压力分析等等。

这些样例还显示了如何组合 Visual Basic for Applications 编程环境的多样性和 AutoCAD ActiveX 接口的功能来创建自定义应用程序。

另外，ActiveX and VBA Developer's Guide 和 ActiveX and VBA Reference 中的样例代码可以从帮助文件中复制，再直接粘贴到 AutoCAD VBA 环境中。然后只要满足以下条件即可执行：AutoCAD 中当前活动的图形必须是在模型空间中打开的空白图形。

运行帮助文件中样例的步骤

  1. 将帮助文件中的样例复制到空的 VBA 代码模块中。
  2. 验证 AutoCAD 具有打开模型空间的空白图形。
  3. 通过输入命令 VBARUN 来打开“宏”对话框。
  4. 选择宏，然后按“运行”。

    主题“运行宏”中详细介绍了如何运行宏以及“宏”对话框。


移植 Automation 工程

代码样例
简介
新对象
ActiveX/VBA 开发人员手册 > 简介 >
移植 Automation 工程

用户可以通过使用添加到 ActiveX Automation 接口的对象和方法，来使用 AutoCAD 的功能。本节包含适用于使用 Visual Basic for Applications (VBA)、Visual Basic 6 (VB) 和其他 Automation 兼容的环境创建的 Automation 工程的更改。

有关使用 AutoCAD 中的功能的详细信息，请参见“使用 AutoCAD 功能”。

本节内容

  • 新对象
  • 已更改项
  • 移植工程的方法


新对象

移植 Automation 工程
移植 Automation 工程
已更改项
ActiveX/VBA 开发人员手册 > 简介 > 移植 Automation 工程 >
新对象

以下是 AutoCAD 2008 中的新对象。有关这些对象的详细信息，请参见《ActiveX and VBA Reference》和 VBA IDE 中的对象浏览器。

  • SortentsTable。包含和控制绘图次序信息。
  • Table。添加和修改图形中的表。
  • TableStyle。添加和修改表的格式，例如栅格的可见性、线宽和颜色。

此外，AutoCAD 2008 包含图纸集管理器的 Automation 对象。关于这些对象的详细信息，请参见《Sheet Set Objects Reference》。


已更改项

新对象
移植 Automation 工程
移植工程的方法
ActiveX/VBA 开发人员手册 > 简介 > 移植 Automation 工程 >
已更改项

本节介绍已更改的现有项。

已更改项 |  |
AutoCAD 2004 项 | AutoCAD 2008 项 | 更改说明
BeginClose 事件 | BeginDocClose 事件 | 可以使用 BeginDocClose 事件防止关闭图形。
Layer 对象 | Layer 对象 | 添加 Description 特性和 Used 特性
Layers 集合 | Layers 集合 | 添加 GenerateUsageData 方法
ModelSpace 集合 PaperSpace 集合 Block 对象 | ModelSpace 集合 PaperSpace 集合 Block 对象 | 将 AddTable 方法添加到所有集合和对象；将 Path 特性添加到 Block 对象。
MText 对象，Text 对象 | MText 对象，Text 对象 | 将 BackgroundFill 特性添加到 MText 对象；将 FieldCode 方法添加到 MText 对象和 Text 对象
Plot 对象 | Plot 对象 | BatchPlotProgress 特性和 StartBatchMode 特性已废弃。建议将 Microsoft .NET 应用程序用于批处理打印。DisplayPlotPreview 方法不再支持局部预览
PreferencesFiles 对象 | PreferencesFiles 对象 | 添加 PlotLogFilePath 特性、PageSetupOverridesTemplateFile 特性和 QNewTemplateFile 特性
PreferencesOutput 对象 | PreferencesOutput 对象 | 添加 AutomaticPlotLog 特性、DefaultPlotToFilePath 特性和 ContinuousPlotLog 特性
Viewport 对象 | Viewport 对象 | 添加 ModelView 特性、SheetView 特性、LabelBlockId 特性、HasSheetView 特性和 SyncModelView 方法
View 对象 | View 对象 | 添加 CategoryName 特性、LayoutId 特性、LayerState 特性和 HasVpAssociation 特性


移植工程的方法

已更改项
移植 Automation 工程
VBA 入门
ActiveX/VBA 开发人员手册 > 简介 > 移植 Automation 工程 >
移植工程的方法

一般情况下，在 VBA IDE 中或使用 Visual Basic 6 创建的 AutoCAD Automation 工程应与 AutoCAD 2008 一起使用。

AutoCAD 2008 Automation 工程与 AutoCAD Automation 工程使用同一类型库：“acax17enu.tlb”。类型库位于“C:\Program Files\Common Files\Autodesk Shared”目录中。

AutoCAD 2008 Automation 工程对于 CreateObject、GetObject 和 GetInterfaceObject 方法也使用依赖于版本的相同 ProgID。例如，如果要在 AutoCAD Automation 工程中使用 CreateObject 函数，则使用 CreateObject（“AutoCAD.Application.17”）。如果 Automation 工程使用独立于版本的 ProgID，请将工程更改为使用依赖于版本的 ProgID。


VBA 入门

移植工程的方法
了解内嵌与全局 VBA 工程
ActiveX/VBA 开发人员手册 >
VBA 入门

本章介绍 AutoCAD Visual Basic for Applications (VBA) 工程和 VBA 交互式开发环境 (IDE)。尽管大多数 VBA 环境的行为都很类似，但 AutoCAD VBA IDE 有一些独有的特征。还有一些 AutoCAD 命令可以用来加载工程、运行工程或打开 VBA IDE。本章简要介绍 VBA 工程、VBA 命令和 VBA IDE 的使用。

本节内容

  • 了解内嵌与全局 VBA 工程
  • 使用 VBA 管理器组织工程
  • 处理宏
  • 使用 VBA IDE 编辑工程
  • 进行初步练习
  • 更多信息
  • AutoCAD VBA 工程术语
  • AutoCAD VBA 命令


了解内嵌与全局 VBA 工程

VBA 入门
VBA 入门
使用 VBA 管理器组织工程
ActiveX/VBA 开发人员手册 > VBA 入门 >
了解内嵌与全局 VBA 工程

AutoCAD® VBA 工程是代码模块、类模块和窗体的集合，这些模块和窗体共同运行以执行给定的功能。工程可以存储在 AutoCAD 图形中，也可以作为独立的文件存储。

内嵌工程存储在 AutoCAD 图形中。在 AutoCAD 中打开包含这类工程的图形时，会自动加载它们，这使工程分发变得非常简便。由于内嵌工程只能在所在的文档中运行，因此其使用受到一些限制，而且不能打开或关闭 AutoCAD 图形。内嵌工程的用户不再需要在运行程序之前查找和加载工程文件。打开图形时触发的时间日志即是工程内嵌在图形中的一个例子。使用这个宏，用户可以登录并记录处理该图形的时间长度。用户不需要记着在打开图形之前加载工程，加载会自动完成。

全局工程存储在独立的文件中，由于这类工程可以在任何 AutoCAD 图形中运行并能打开和关闭所有 AutoCAD 图形，因此用途更广，但在打开图形时它不会被自动加载。用户必须知道哪一个工程文件包含自己需要的宏，然后要先加载该工程文件才能运行宏。然而，全局工程比较容易与其他用户共享，而且它们还是常用宏的理想库。用户可能会将用于从许多图形中收集明细表的宏存储在工程文件中，这个宏就是全局工程的一个例子。它可以由管理员在工作结束时运行，并从许多图形中收集信息。

用户可以随时将内嵌工程和全局工程加载到它们的 AutoCAD 任务中。

AutoCAD VBA 工程与独立的 Visual Basic 6 工程二进制不兼容。但是，可以在 VBA IDE 中使用 IMPORT 和 EXPORT VBA 命令在工程之间交换窗体、模块和类。关于 VBA IDE 的详细信息，请参见使用 VBA IDE 编辑工程。

支持使用 Visual Studio .NET，通过 COM Automation 来驱动和自定义 AutoCAD。


使用 VBA 管理器组织工程

了解内嵌与全局 VBA 工程
VBA 入门
加载现有的工程
ActiveX/VBA 开发人员手册 > VBA 入门 >
使用 VBA 管理器组织工程

使用 VBA 管理器可以查看当前 AutoCAD 任务中加载的所有 VBA 工程。它是一种 AutoCAD 工具，可让用户加载、卸载、保存、创建、内嵌和提取 VBA 工程。

打开 VBA 管理器的步骤

可以从“工具”菜单或在 AutoCAD 中通过调用 VBAMAN 命令打开 VBA 管理器。

本节内容

  • 加载现有的工程
  • 卸载工程
  • 将工程嵌入到图形中
  • 从图形中提取工程
  • 创建新工程
  • 保存工程


加载现有的工程

使用 VBA 管理器组织工程
使用 VBA 管理器组织工程
病毒警告
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA 管理器组织工程 >
加载现有的工程

将工程加载到 AutoCAD 后，就可以使用所有的公用子例程（也称为宏）。每次打开图形时，内嵌在图形中的工程就会被自动加载，而存储在 DVB 文件中的工程必须明确加载。

每次加载工程时，都将自动加载此工程引用的任何其他工程。此外，AutoCAD 在启动时会自动加载任何名为 acad.dvb 的工程文件。

加载现有 VBA 工程文件的步骤

  1. 在“VBA 管理器”中，使用“加载”选项打开“打开 VBA 工程”对话框。
  2. 在“打开 VBA 工程”对话框中，选择要打开的工程文件。“VBA 工程”对话框只能打开有效的 DVB 文件。如果用户试图打开其他类型的文件，则会收到一条错误信息。
  3. 选择“打开”。

用户还可以使用以下任意方法来加载工程文件：

  • 输入 VBALOAD 命令，该命令会打开“打开 VBA 工程”对话框。
  • 将 DVB 文件从 Windows 资源管理器拖动到 AutoCAD 窗口中打开的图形中。

本节内容

  • 病毒警告


病毒警告

加载现有的工程
加载现有的工程
卸载工程
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA 管理器组织工程 > 加载现有的工程 >
病毒警告

每当用户加载工程时，都要选择是启用还是禁用工程中的代码，以此作为防范病毒的保护措施。如果用户启用了代码，则代码中的病毒就可以开始执行。如果用户禁用代码，则仍会加载工程，但是该工程中的所有代码均不能运行。通过将 DVB 文件从 Windows 资源管理器拖动到 AutoCAD 窗口打开的图形中来加载工程时，将不会显示病毒警告。

关于病毒防护的详细信息，请参见设置工程选项。


卸载工程

病毒警告
使用 VBA 管理器组织工程
将工程嵌入到图形中
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA 管理器组织工程 >
卸载工程

卸载工程可释放内存，并使已加载工程的列表保持在易于管理的长度。

不能卸载内嵌工程或被其他已加载的工程引用的工程。

卸载 VBA 工程的步骤

通过选择要卸载的工程并选择“卸载”可以卸载 VBA 工程，或使用 VBAUNLOAD 命令，该命令会提示您提供要卸载的工程。


将工程嵌入到图形中

卸载工程
使用 VBA 管理器组织工程
从图形中提取工程
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA 管理器组织工程 >
将工程嵌入到图形中

嵌入工程时，是将工程的副本放到图形数据库中。此工程会随着包含它的图形的打开和关闭而被加载和卸载。

一个图形一次只能包含一个内嵌工程。如果图形中已经包含内嵌工程，必须先提取该工程，然后才能将其他工程嵌入到图形中。

将工程嵌入到 AutoCAD 图形中的步骤

  1. 打开 VBA 管理器，并选择要嵌入的工程。
  2. 选择“嵌入”。


从图形中提取工程

将工程嵌入到图形中
使用 VBA 管理器组织工程
创建新工程
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA 管理器组织工程 >
从图形中提取工程

当提取工程时，即表示从图形数据库中删除该工程，但可以将这个工程保存到外部的工程文件中。如果未将文件保存到外部的工程文件中，工程数据将会被删除。

从 AutoCAD 图形中提取工程的步骤

  1. 打开 VBA 管理器，并选择要从中提取工程的图形。
  2. 选择“提取”。
  3. 如果要在外部工程文件中保存工程信息，请在显示“是否要在删除 VBA 工程之前将其输出？”提示时选择“是”。将显示“另存为”对话框，以使用户可以保存该文件。

    如果不希望在外部文件中保存工程信息，请在显示“是否要在删除 VBA 工程之前将其输出？”提示时选择“否”。将从图形中删除工程信息，并且将不对其进行保存。


创建新工程

从图形中提取工程
使用 VBA 管理器组织工程
保存工程
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA 管理器组织工程 >
创建新工程

新工程会被创建为未保存的全局工程。创建完成后，可以将它嵌入到图形中或保存到工程文件中。

创建新 VBA 工程的步骤

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

    新工程将用默认的名称 ACADProject 创建。要更改工程名，必须进入 VBA IDE 中。关于在 VBA IDE 中命名工程的详细信息，请参见命名工程。


保存工程

创建新工程
使用 VBA 管理器组织工程
处理宏
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA 管理器组织工程 >
保存工程

每次保存图形，都将保存其内嵌工程。而全局工程必须使用 VBA 管理器或 VBA IDE 来保存。

使用 VBA 管理器保存工程的步骤

  1. 打开 VBA 管理器，并选择要保存的工程。
  2. 选择“另存为”。将会打开“另存为”对话框。
  3. 选择用于保存该工程的文件的名称。
  4. 选择“保存”。


处理宏

保存工程
VBA 入门
使用“宏”对话框
ActiveX/VBA 开发人员手册 > VBA 入门 >
处理宏

宏是一个公用的（可执行）子例程。通常每个工程都至少包含一个宏。

本节内容

  • 使用“宏”对话框
  • 运行宏
  • 编辑宏
  • 单步执行宏
  • 设置工程选项


使用“宏”对话框

处理宏
处理宏
运行宏
ActiveX/VBA 开发人员手册 > VBA 入门 > 处理宏 >
使用“宏”对话框

通过“宏”对话框，用户可以运行、编辑、删除和创建宏，以及设置 VBA 工程选项。通过从 AutoCAD“工具”菜单中依次选择“宏” [image] “宏”来打开“宏”对话框，或在 AutoCAD 命令提示中执行 VBARUN。

此对话框显示了有效范围中所有宏的名称。使用“宏位置”的下拉列表可以更改有效范围。此列表指定的是显示了宏的工程或图形。可选择显示以下范围中的宏：

  • 所有图形和工程
  • 所有图形
  • 所有工程
  • AutoCAD 中当前打开的任意单个图形
  • AutoCAD 中当前加载的任意单个工程

通过限制有效范围，可以控制列表中显示的宏名称的数目。如果加载的图形和工程中有很多的宏，就可以使用以上方式控制显示。

创建新宏的步骤

  1. 打开“宏”对话框，然后输入新宏的名称。
  2. 在“宏位置”下拉列表中，选择将创建新宏的工程。
  3. 选择“创建”。

如果指定名称的宏已经存在，将会询问是否要替换现有的宏。

如果在提示时选择“是”，现有宏的代码将会被删除，并且以指定的名称创建新的空白宏。

如果选择“否”，将会返回到“宏”对话框，要求为此宏输入新的名称。

如果选择“取消”，“宏”对话框消失，而且不会创建任何新宏。

删除宏的步骤

  1. 打开“宏”对话框并选择要删除的宏。
  2. 选择“删除”。将提示用户确认删除操作。
  3. 出现提示时，选择“是”删除宏，或者选择“否”取消删除。


运行宏

使用“宏”对话框
处理宏
编辑宏
ActiveX/VBA 开发人员手册 > VBA 入门 > 处理宏 >
运行宏

运行宏将在当前 AutoCAD 任务上下文中执行宏代码。当前活动图形被认为是宏开始执行时焦点所在的打开图形。对于全局工程中的宏，ThisDrawing 对象的所有 VBA 引用都将指向当前的活动图形。对于内嵌工程中的宏，ThisDrawing 对象总是指向内嵌了宏的图形。

从“宏”对话框运行宏的步骤

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

从 VBA IDE 运行宏的步骤

  • 从“运行”菜单中选择“运行宏”菜单选项。

    如果没有任何现成的宏或窗体，将会显示一个对话框供用户选择要运行的宏。

    如果当前存在某个给定的宏（光标位于其过程中），则会执行该宏。


编辑宏

运行宏
处理宏
单步执行宏
ActiveX/VBA 开发人员手册 > VBA 入门 > 处理宏 >
编辑宏

编辑宏会打开 VBA IDE，并在“代码”窗口中打开选中的宏。关于在 VBA IDE 中编辑宏的详细信息，请参见使用 VBA IDE 编辑工程。

编辑宏的步骤

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


单步执行宏

编辑宏
处理宏
设置工程选项
ActiveX/VBA 开发人员手册 > VBA 入门 > 处理宏 >
单步执行宏

单步执行宏会开始执行宏，然后在第一行代码处中止执行。此时，VBA IDE 打开，并在“代码”窗口中显示所选宏中要执行的行。

单步执行宏的步骤

  1. 在“宏”对话框中，选择要单步运行进入的宏。
  2. 选择“单步执行”。


设置工程选项

单步执行宏
处理宏
使用 VBA IDE 编辑工程
ActiveX/VBA 开发人员手册 > VBA 入门 > 处理宏 >
设置工程选项

AutoCAD VBA 工程有三个选项可以设置：

  • 启用自动嵌入
  • 允许出错时中断
  • 启用宏病毒防护

启用自动嵌入

自动嵌入功能在打开图形时自动为所有图形创建内嵌 VBA 工程。

允许出错时中断

发生错误时，此选项允许 VBA 进入“中断”模式。“中断”模式会在交互式开发环境中临时终止程序的执行。在“中断”模式中，用户可以检查、调试、重置、单步执行或继续执行程序。

如果启用此选项，执行 VBA 宏期间出现无法处理的错误将会暂停宏的执行，并在 VBA IDE 中显示宏中发生错误的位置。

禁用此选项时，如果执行 VBA 宏期间出现未捕获的错误，则会显示一个消息框，警告用户发生错误，然后结束宏的执行。

启用宏病毒防护

每当用户打开可能包含宏病毒的图形时，病毒防护机制都将显示内置警告信息。

设置 AutoCAD VBA 工程选项的步骤

  1. 从“工具”菜单中，依次选择“宏” [image] “宏”以打开“VBA 宏”对话框。
  2. 在“VBA 宏”对话框中，选择“选项”打开“选项”对话框。
  3. 在“选项”对话框中，选择要启用的选项。
  4. 选择“确定”。


使用 VBA IDE 编辑工程

设置工程选项
VBA 入门
查看工程信息
ActiveX/VBA 开发人员手册 > VBA 入门 >
使用 VBA IDE 编辑工程

将工程加载到 AutoCAD 中后，用户就可以使用 VBA 交互式开发环境来编辑该工程的代码、窗体和引用。而且还可以在 VBA IDE 中调试和运行工程。打开之后，使用 VBA IDE 可以访问所有已加载的工程。

按需打开 VBA IDE 的步骤

用户可以从命令行或菜单栏打开 VBA IDE。

  • 在命令行中输入 VBAIDE，或从“工具”菜单中依次选择“宏” [image] “Visual Basic 编辑器”。

本节内容

  • 查看工程信息
  • 定义工程中的组件
  • 输入现有组件
  • 编辑组件
  • 命名工程
  • 保存工程
  • 引用其他 VBA 工程
  • 设置 VBA IDE 选项


查看工程信息

使用 VBA IDE 编辑工程
使用 VBA IDE 编辑工程
定义工程中的组件
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 >
查看工程信息

VBA IDE 包含了“工程”窗口，其中显示了所有已加载的 VBA 工程列表。这个窗口还显示工程中包含的代码、类和窗体模块，与工程关联的文档，从工程引用的所有其他 VBA 工程，以及工程的实际位置（路径）。

“工程”窗口有自己的工具栏，可用来打开工程的各个组件进行编辑。使用“查看代码”按钮可打开选定模块的代码。使用“查看对象”按钮可显示选定的对象，例如窗体。

默认情况下，“工程”窗口是可见的。如果此窗口不可见，请从“视图”菜单中选择“工程”窗口，或按 CTRL+R 组合键。


定义工程中的组件

查看工程信息
使用 VBA IDE 编辑工程
对象
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 >
定义工程中的组件

每个工程可以包含许多不同的组件。工程可以包含的组件有对象、窗体、标准模块、类模块和引用。

本节内容

  • 对象
  • 窗体
  • 标准模块
  • 类模块
  • 引用
  • 添加新组件


对象

定义工程中的组件
定义工程中的组件
窗体
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 定义工程中的组件 >
对象

对象组件代表 VBA 代码将访问的对象或文档的类型。对于 AutoCAD VBA 项目，此对象表示当前 AutoCAD 图形。


窗体

对象
定义工程中的组件
标准模块
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 定义工程中的组件 >
窗体

窗体组件包含由用户构造的、用于工程的自定义对话框。


标准模块

窗体
定义工程中的组件
类模块
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 定义工程中的组件 >
标准模块

代码模块组件包含用户的常用过程和函数。标准模块也称为代码模块，或简称为模块。


类模块

标准模块
定义工程中的组件
引用
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 定义工程中的组件 >
类模块

类模块组件包含用户自己定义的所有对象（定义为类）。


引用

类模块
定义工程中的组件
添加新组件
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 定义工程中的组件 >
引用

引用组件包含对其他工程或库的所有引用。


添加新组件

引用
定义工程中的组件
输入现有组件
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 定义工程中的组件 >
添加新组件

添加新组件将在工程中创建空白组件。用户可以将新的模块、窗体和类模块添加到自己的工程中。用户需要自己更新所有的组件特性（例如组件名称），并填入适当的代码。在命名新组件时，请注意其他开发人员在未来的应用程序中可能会使用您的组件。请遵循开发团队的命名惯例。

向工程中添加新组件的步骤

  1. 在 VBA IDE 的“工程”窗口中，选择要向其中添加组件的工程。
  2. 从“插入”菜单中选择“用户窗体”、“模块”或“类模块”来向工程中添加新组件。

    新组件将会被添加到工程中并显示在“工程”窗口中。


输入现有组件

添加新组件
使用 VBA IDE 编辑工程
编辑组件
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 >
输入现有组件

输入功能使用户可以向工程中添加现有的组件。用户可以输入窗体、模块或类模块。窗体输入为 FRM 文件，模块输入为 BAS 文档，类模块输入为 CLS 文件。

在输入组件文件时，会将输入的文件的副本添加到工程中，原始文件保持不变。用户对输入组件所做的更改不会改变原始的组件文件。

如果输入的组件与现有组件同名，则组件添加到工程中时会在其名称后附加编号。

输入的组件将添加到工程中并显示在“工程”窗口中。要编辑组件的特性，请在“工程”窗口选择该组件。选定组件的特性将会列在“特性”窗口中并可以对其进行编辑。

向工程中输入现有组件的步骤

  1. 在 VBA IDE 的“工程”窗口中，选择要向其中添加组件的工程。
  2. 从“文档”菜单中选择“输入文件”来打开“输入文件”对话框。
  3. 在“输入文件”对话框中，选择要输入的文件后按“打开”。


编辑组件

输入现有组件
使用 VBA IDE 编辑工程
使用“代码”窗口
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 >
编辑组件

在 VBA IDE 中，可以编辑标准模块、类模块和窗体。标准模块和类模块均在“代码”窗口中编辑；窗体则在“用户窗体”窗口中使用特殊的的工具箱进行编辑。

由于可以打开的“代码”窗口与拥有的模块数目一致，因此可以很容易地查看不同窗体或模块中的代码，并在它们之间互相复制和粘贴。

编辑工程组件的步骤

  1. 在 VBA IDE 的“工程”窗口中，选择要编辑的组件。
  2. 在“工程”窗口中，选择“查看代码”按钮打开“代码”窗口。
  3. 在“工程”窗口中，选择“查看对象”按钮打开“用户窗体”窗口和关联的工具箱。

访问与窗体关联的代码的步骤

  • 要访问与某个控件关联的代码，请双击“窗体”窗口中的任意控件。“代码”窗口中将打开与该控件关联的代码。

本节内容

  • 使用“代码”窗口
  • 使用“用户窗体”窗口


使用“代码”窗口

编辑组件
编辑组件
使用“用户窗体”窗口
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 编辑组件 >
使用“代码”窗口

“代码”窗口包含两个下拉列表、一个拆分栏、一个边界指示器栏、一个“完全视图”图标和一个“过程视图”图标。

“代码”窗口顶部的两个下拉列表显示当前的对象和过程。更改这些下拉列表中的对象或过程，就可以在工程中来回移动。

“代码”窗口右侧的拆分栏可以水平拆分窗口，只要向下拖动此栏即可创建另一个窗格。使用此功能，可以同时查看同一个模块的两个不同部分。要关闭窗格，只需将拆分栏拖回初始位置即可。

边界指示器栏位于“代码”窗口的左下方，用于显示编辑和调试代码期间用到的边界指示器。

“完全视图”和“过程视图”图标位于“代码”窗口的左下角，使用它们可以在一次仅显示一个过程与一次查看整个模块之间来回切换。


使用“用户窗体”窗口

使用“代码”窗口
编辑组件
命名工程
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 编辑组件 >
使用“用户窗体”窗口

通过“用户窗体”窗口，可以在工程中创建自定义对话框。

要添加控件，只需从工具箱中将所需的控件拖放到窗体上即可。从“选项”对话框的“常规”选项卡中，可以将控件设置成与窗体栅格对齐。从“选项”对话框的“常规”选项卡中，还可以查看窗体栅格，以及确定栅格线的大小。（关于“选项”对话框的详细信息，请参见设置 VBA IDE 选项。）

设计好的每个窗体都自动拥有“最大化”、“最小化”和“关闭”按钮，这些按钮是预先设计好的。

要向控件中添加代码，只需双击已放置在窗体上的控件即可。这将会打开控件的“代码”窗口。


命名工程

使用“用户窗体”窗口
使用 VBA IDE 编辑工程
保存工程
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 >
命名工程

工程名称与存储该工程的 .dvb 文件名称是不同的。存储该工程的 .dvb 文件的名称在保存工程时创建，而工程名称则在 VBA IDE 的“特性”窗口中设置。

如果用户没有设置工程名和文件名，AutoCAD 会自动指定以下默认名称：

工程名：ACADProject

文件名：Project.dvb

更改工程名称的步骤

  1. 在 VBA IDE 的“工程”窗口中，选择要更改的工程。
  2. 在“特性”窗口中编辑工程的 Name 特性。

更改工程的文件名的步骤

  1. 在 VBA IDE 中，从“文件”菜单中选择“保存”选项。
  2. 在“另存为”对话框中输入工程文件的新名称和位置。


保存工程

命名工程
使用 VBA IDE 编辑工程
引用其他 VBA 工程
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 >
保存工程

在 AutoCAD 中，没有为 VBA 工程提供显式 SAVE 命令。SAVE 命令位于 VBA IDE 的“文件”菜单和 VBA 管理器中。当发生以下任何情况时，对 VBA 工程进行任何更改，都将出现标准的“保存 VBA 工程”对话框：

  • 从 VBA IDE 中选择 SAVE 命令。
  • 选择了 VBA 管理器中的“另存为”选项。
  • AutoCAD 任务即将结束或退出而且未保存 VBA 工程。
注意在保存工程之前，已为工程指定了默认的文件名 project.dvb。保存工程时，为工程文件指定一个新的名称非常重要。如果以默认文件名 project.dvb 保存工程，则再也不能创建新的空工程。因为每次创建新工程时，实际上都将加载名为 project.dvb 的已保存的工程。


引用其他 VBA 工程

保存工程
使用 VBA IDE 编辑工程
设置 VBA IDE 选项
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 >
引用其他 VBA 工程

在 VBA 工程之间引用，使开发人员可以更容易地共享代码。开发人员可以创建常用宏的库，然后在需要时引用该库。这样可以集中放置和支持共享代码，让许多开发人员使用该代码。

成功引用另一个工程后，VBA IDE 的“工程”窗口中将显示一个新文件夹。这个新文件夹的标题为“引用”，其中包含引用的工程名称。

引用某个工程后，就可以使用该工程中的任何公用代码或窗体组件。

当引用了其他工程的工程被加载到 AutoCAD 中时，被引用的工程也将自动加载到 AutoCAD 中。被引用的工程不能先行关闭，必须先关闭引用它的所有工程。

用户不能创建循环引用。也就是说，引用的工程不能包含对此工程的引用。如果用户意外地创建了循环引用，VBA 将会通知用户。

工程引用是 Microsoft VBA 的标准功能，AutoCAD 中并没有额外扩充此功能。可以在 Microsoft VBA 帮助文件中找到引用工程的更多信息。可以从 VBA IDE 中的“帮助”菜单打开 Microsoft VBA 帮助。

注意不能从其他应用程序引用内嵌工程或 VBA 工程。

引用其他 VBA 工程的步骤

  1. 在 VBA IDE 的“工程”窗口中，选择要向其中添加引用的工程。
  2. 从“工具”菜单中选择“引用”选项打开“引用”对话框。
  3. 在“引用”对话框中，按“浏览”按钮打开“添加引用”对话框。
  4. 在“添加引用”对话框中，选择要引用的工程文件，然后按“打开”按钮。
  5. 在“添加引用”对话框中选择“确定”按钮完成引用的添加。


设置 VBA IDE 选项

引用其他 VBA 工程
使用 VBA IDE 编辑工程
编辑器
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 >
设置 VBA IDE 选项

可以使用“选项”对话框来更改 VBA IDE 的特征。要打开“选项”对话框，请使用“工具”菜单然后选择“选项”。

“选项”对话框包含四个选项卡：“编辑器”、“编辑器格式”、“基本”和“固定”。

本节内容

  • 编辑器
  • 编辑器格式
  • 基本
  • 固定


编辑器

设置 VBA IDE 选项
设置 VBA IDE 选项
编辑器格式
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 设置 VBA IDE 选项 >
编辑器

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

代码设置包括：

  • 自动语法检查
  • 需要变量声明
  • 自动列表成员
  • 自动快速信息
  • 自动数据提示
  • 自动缩进
  • 制表符宽度

窗口设置包括：

  • 可使用拖放方式进行编辑
  • 默认为完全模块视图
  • 过程分隔符显示


编辑器格式

编辑器
设置 VBA IDE 选项
基本
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 设置 VBA IDE 选项 >
编辑器格式

“编辑器格式”选项卡指定代码的外观。

可以：

  • 改变代码的颜色
  • 改变文字列表项
  • 改变前景
  • 改变背景
  • 改变边界指示器
  • 改变文字字体和大小
  • 显示或隐藏边界指示器
  • 显示或隐藏设置的文字样例


基本

编辑器格式
设置 VBA IDE 选项
固定
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 设置 VBA IDE 选项 >
基本

“基本”选项卡指定当前 VBA 工程的设置、错误处理和编译设置。

可以：

  • 改变窗体栅格的栅格设置
  • 显示或隐藏工具栏提示
  • 设置自动收拢窗口
  • 选择接收状态丢失通知
  • 确定处理错误的方法
  • 将工程设置为根据需要编译或执行后台编译


固定

基本
设置 VBA IDE 选项
进行初步练习
ActiveX/VBA 开发人员手册 > VBA 入门 > 使用 VBA IDE 编辑工程 > 设置 VBA IDE 选项 >
固定

通过“固定”选项卡，可以选择需要固定的窗口。


进行初步练习

固定
VBA 入门
更多信息
ActiveX/VBA 开发人员手册 > VBA 入门 >
进行初步练习

现在，您已经学习了 AutoCAD VBA 编程的基本知识，接下来，让我们进行一个创建简单的“你好，世界”的练习。在此练习中，将会创建新的 AutoCAD 图形，并向该图形中添加一行文字，然后保存图形，全部操作均通过 VBA 来完成。

创建“你好，世界”文字对象的步骤

  1. 从 AutoCAD 命令行输入以下命令来打开 VBA IDE：

    命令：VBAIDE

  2. 从 VBA IDE 的“查看”菜单中选择“代码”选项打开“代码”窗口。
  3. 从 VBA IDE 的“插入”菜单中选择“过程”选项，在工程中创建新过程。
  4. 当提示输入过程信息时，输入名称，例如 HelloWorld。请确保选定的“类型”是 Sub，选定的“作用域”是 Public。
  5. 选择“确定”。
  6. 在行 Public Sub HelloWorld() 和行 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 = "你好，世界！"' 设置字符串
    ' 创建 Text 对象
    Set textObj = ThisDrawing.ModelSpace.AddText _
                            (textStr, insPoint, textHeight)
  8. 紧接在步骤 7 中的输入代码之后输入以下代码（用于保存图形）。
    ThisDrawing.SaveAs("Hello.dwg")
  9. 从 VBA IDE 的“运行”菜单中选择“运行子程序或用户窗体”选项来运行程序。
    当程序运行完时，AutoCAD 应用程序将置于最前。您应该能够看到图形中显示的文字“你好，世界！”。图形的名称应为“Hello.dwg”。


更多信息

进行初步练习
VBA 入门
AutoCAD VBA 工程术语
ActiveX/VBA 开发人员手册 > VBA 入门 >
更多信息

关于 VBA IDE 和 VBA 编程语言的详细信息，请参见 Microsoft 提供的帮助文件。要访问 Microsoft 帮助文件，请从 VBA IDE 的“帮助”菜单中选择“Microsoft Visual Basic 帮助”。


AutoCAD VBA 工程术语

更多信息
VBA 入门
AutoCAD VBA 命令
ActiveX/VBA 开发人员手册 > VBA 入门 >
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 命令

AutoCAD VBA 工程术语
VBA 入门
ActiveX Automation 基础知识
ActiveX/VBA 开发人员手册 > VBA 入门 >
AutoCAD VBA 命令
VBAIDE

激活 VBA IDE。

VBA IDE 可以用来以交互方式编辑、运行和调试程序。虽然 VBA IDE 只能在 AutoCAD 运行时被调用，但是可以独立于 AutoCAD 应用程序窗口对它进行最小化、打开和关闭操作。

VBALOAD

将 VBA 工程加载到当前的 AutoCAD 任务中。

VBARUN

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

VBAUNLOAD

从当前 AutoCAD 任务中卸载 VBA 工程。

如果 VBA 工程被修改过且尚未保存，将会出现“保存工程”对话框（或对等的命令行）询问用户是否要保存该工程。

VBAMAN

显示 VBA 管理器，供用户查看、创建、加载、关闭、内嵌和提取工程。

VBASTMT

从 AutoCAD 命令行执行 VBA 语句。


ActiveX Automation 基础知识

AutoCAD VBA 命令
了解 AutoCAD 对象模型
ActiveX/VBA 开发人员手册 >
ActiveX Automation 基础知识

要想有效地使用 AutoCAD ActiveX Automation，应该熟悉与要开发的应用程序类型相关的 AutoCAD 图元、对象和功能。对对象的图形和非图形特性了解得越多，通过 AutoCAD ActiveX Automation 来操作这些特性就越简单。

请记住，只需按 F1 键即可访问 AutoCAD ActiveX Automation 帮助文件。如果在使用某个特定对象、方法或特性时遇到问题，请在 VBA IDE 中亮显该对象、方法或特性，然后按 F1 键。

本节内容

  • 了解 AutoCAD 对象模型
  • 访问对象层次结构
  • 集合对象
  • 了解特性和方法
  • 了解上级对象
  • 定位类型库
  • 在方法和特性中使用变量
  • 使用其他编程语言


了解 AutoCAD 对象模型

ActiveX Automation 基础知识
ActiveX Automation 基础知识
Application 对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 >
了解 AutoCAD 对象模型

对象为 AutoCAD® ActiveX® 接口的主要构件。每一个显露的对象均精确代表一个 AutoCAD 组件。AutoCAD ActiveX 接口中有许多不同类型的对象。例如：

  • 直线、圆弧、文字和标注等图形对象都是对象。
  • 线型与标注样式等样式设置都是对象。
  • 图层、编组和块等组织结构都是对象。
  • 视图与视口等图形显示都是对象。
  • 甚至图形和 AutoCAD 应用程序本身也是对象。

对象按照分层结构来组织，其根是 Application 对象。这种层次结构的视图称为“对象模型”。对象模型给出了上级对象与下级对象之间的访问关系。

本节内容

  • Application 对象
  • Document 对象
  • 集合对象
  • 图形对象和非图形对象
  • Preferences、Plot 和 Utility 对象
  • 使用新增 AutoCAD 功能


Application 对象

了解 AutoCAD 对象模型
了解 AutoCAD 对象模型
Document 对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 了解 AutoCAD 对象模型 >
Application 对象

Application 对象是 AutoCAD ActiveX Automation 对象模型的根对象。通过 Application 对象，用户可以访问任何其他的对象或任何对象指定的特性或方法。

例如，Application 对象具有 Preferences 特性，该特性可以返回 Preferences 对象。通过此对象可以访问“选项”对话框中存储在注册表中的设置。（DatabasePreferences 对象包含存储在图形中的设置，稍后将会讨论这些内容。）通过 Application 对象的其他特性，用户可以访问与应用程序相关的数据，例如应用程序的名称和版本，以及 AutoCAD 大小、位置和可见性。Application 对象的方法可以执行与应用程序相关的操作，例如列表显示、加载和卸载 ADS 与 ARX 应用程序，以及退出 AutoCAD。

Application 对象还提供指向 AutoCAD 图形（通过 Documents 集合）、AutoCAD 菜单和工具栏（通过 MenuBar 和 MenuGroups 集合）以及 VBA IDE（通过 VBE 特性）的链接。

Application 对象还是 ActiveX 接口的全局对象，这表示 Application 对象的所有方法和特性都可以用于全局名称空间。


Document 对象

Application 对象
了解 AutoCAD 对象模型
集合对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 了解 AutoCAD 对象模型 >
Document 对象

Document 对象（实际上就是 AutoCAD 图形）可以在 Documents 集合中找到，通过它，可以访问所有图形和大部分非图形 AutoCAD 对象。通过 ModelSpace 和 PaperSpace 集合可以访问图形对象（直线、圆、圆弧等），而通过具有类似名称的集合（例如 Layers、Linetypes 和 TextStyles）则可以访问非图形对象（图层、线型、文本样式等）。通过 Document 对象还可以访问 Plot 和 Utility 对象。

要访问图形特性，请使用 Document 对象的 SummaryInfo 特性。


集合对象

Document 对象
了解 AutoCAD 对象模型
图形对象和非图形对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 了解 AutoCAD 对象模型 >
集合对象

AutoCAD 将大部分对象进行编组，组成集合。虽然这些集合包含了不同类型的数据，但是可以使用相似的技术来处理它们。每一个集合都提供了向其中添加对象的方法。大多数集合是通过 Add 方法完成的。但添加图元对象通常使用名为 Add<图元名> 的方法。例如，要添加直线，请使用 AddLine 方法。

集合还有一些其他的常用方法和特性。Count 特性用于获取集合中的对象个数（从零开始）。Item 方法用于获取集合中的任何对象。


图形对象和非图形对象

集合对象
了解 AutoCAD 对象模型
Preferences、Plot 和 Utility 对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 了解 AutoCAD 对象模型 >
图形对象和非图形对象

图形对象（也称为图元）是组成图形的可见对象（例如直线、圆、光栅图像等）。要创建这些对象，请使用相应的 Add<Entityname> 方法。要修改或查询这些对象，请使用对象本身的方法或特性。每一个图形对象都拥有允许应用程序执行大部分 AutoCAD 编辑命令（例如复制、删除、移动、镜像等）的方法。这些对象还提供了一些方法，用来设置和检索对象的扩展数据，亮显和更新对象，以及检索对象边框。图形对象具有诸如 Layer、Linetype、Color 和 Handle 之类的典型特性。还具有一些特有的特性，它们因对象类型不同而有所不同，例如 Center、Radius 和 Area。

非图形对象是指属于图形的一部分但不可见的（提示性的）对象，例如 Layers、Linetypes、DimStyles、SelectionSets 等。要创建这些对象，请使用其上级集合对象的 Add 方法。要修改或查询这些对象，请使用对象本身的方法或特性。每一个非图形对象都有用于特定目的的方法和特性，都有设置和检索扩展数据以及删除自己的方法。


Preferences、Plot 和 Utility 对象

图形对象和非图形对象
了解 AutoCAD 对象模型
使用新增 AutoCAD 功能
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 了解 AutoCAD 对象模型 >
Preferences、Plot 和 Utility 对象

在 Preferences 对象下有一组对象，分别对应“选项”对话框中的一个选项卡。这些对象提供对“选项”对话框中所有存储在注册表中的设置的访问。DatabasePreferences 对象包含存储在图形中的设置。还可以利用 SetVariable 和 GetVariable 方法设置和修改选项（以及不属于“选项”对话框的系统变量）。关于设置选项的详细信息，请参见设置 AutoCAD 系统配置。

可以通过 Plot 对象访问“打印”对话框中的设置，而且应用程序可以通过此对象使用各种方法打印图形。关于打印的详细信息，请参见打印图形。

Utility 对象提供用户输入和转换函数。用户输入函数是提示用户在 AutoCAD 命令行中输入各种类型的数据（例如字符串、整数、实数、点等）的方法。转换函数是操作 AutoCAD 特有的数据类型（例如点和角度）以及处理字符串和数值的方法。关于用户输入函数的详细信息，请参见提示用户输入。


使用新增 AutoCAD 功能

Preferences、Plot 和 Utility 对象
了解 AutoCAD 对象模型
访问对象层次结构
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 了解 AutoCAD 对象模型 >
使用新增 AutoCAD 功能

如果 Automation 工程使用了早期 AutoCAD 版本不具有的功能，则必须明确地声明要在工程中使用的 AutoCAD 接口。

如果 Automation 工程包含接口的明确声明，并且这些接口是 AutoCAD 特定版本中的新增接口，请勿在 AutoCAD 的较早版本中使用该工程。


访问对象层次结构

使用新增 AutoCAD 功能
ActiveX Automation 基础知识
引用对象层次结构中的对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 >
访问对象层次结构

从 VBA 内访问对象层次结构比较容易，因为 VBA 与当前的 AutoCAD 任务在同一个进程内运行，所以不需要使用额外的步骤将其连接到应用程序。

VBA 通过 ThisDrawing 对象提供指向当前 AutoCAD 任务中活动图形的链接。使用 ThisDrawing，用户可以快速访问当前的 Document 对象及其所有方法和特性，还可以访问层次结构中的所有其他对象。

ThisDrawing 用于全局工程时，通常是指 AutoCAD 中的活动文档。ThisDrawing 用于内嵌工程时，通常是指包含该工程的文档。例如，全局工程中的以下代码行将保存 AutoCAD 中当前活动的所有图形：

ThisDrawing.Save

本节内容

  • 引用对象层次结构中的对象
  • 访问 Application 对象


引用对象层次结构中的对象

访问对象层次结构
访问对象层次结构
访问 Application 对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 访问对象层次结构 >
引用对象层次结构中的对象

用户可以直接或通过自己定义的变量来引用对象。要直接引用对象，请将对象包含在调用层次结构中。例如，下列语句在模型空间中添加一条直线。请注意，层次结构从 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)

检索模型空间中的第一个图元

本例返回模型空间中的第一个图元对象，类似的代码还可以用来检索图纸空间中的第一个图元。注意：可以将所有的图形对象定义为 AcadEntity 对象：

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 + _
            " is the first entity in model space."
    否则
        MsgBox "There are no objects in model space."
    End If
End Sub


访问 Application 对象

引用对象层次结构中的对象
访问对象层次结构
集合对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 访问对象层次结构 >
访问 Application 对象

通过 Document 对象的 Application 特性可以访问 Application 对象。在对象层次结构中，Application 对象位于 Document 对象的上方。

通过 ThisDrawing 对象可以访问 Document 对象。例如，以下代码行可以更新应用程序：

ThisDrawing.Application.Update


集合对象

访问 Application 对象
ActiveX Automation 基础知识
访问集合
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 >
集合对象

集合对象是一种预定义的对象，包含相似对象的所有实例（即它是相似对象所有实例的上级对象）。以下是集合对象列表：

集合

包含当前 AutoCAD 任务中打开的所有文档。

ModelSpace 集合

包含模型空间中的所有图形对象（图元）。

PaperSpace 集合

包含活动图纸空间布局中的所有图形对象（图元）。

Block 对象

包含特定块定义中的所有图元。

Blocks 集合

包含图形中的所有块。

Dictionaries 集合

包含图形中的所有词典。

DimStyles 集合

包含图形中的所有标注样式。

FileDependencies 集合

包含“文件依赖性”列表中的所有项。

Groups 集合

包含图形中的所有编组。

Hyperlinks 集合

包含给定图元的所有超链接。

Layers 集合

包含图形中的所有图层。

Layouts 集合

包含图形中的所有布局。

Linetypes 集合

包含图形中的所有线型。

MenuBar 集合

包含 AutoCAD 中当前显示的所有菜单。

MenuGroups 集合

包含 AutoCAD 当前加载的所有菜单和工具栏。

PlotConfigurations 集合

包含图形中的命名打印设置。

RegisteredApplications 集合

包含图形中所有注册的应用程序。

SelectionSets 集合

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

TextStyles 集合

包含图形中的所有文字样式。

UCSs 集合

包含图形中的所有用户坐标系 (UCS)。

Views 集合

包含图形中的所有视图。

Viewports 集合

包含图形中的所有视口。

本节内容

  • 访问集合
  • 向集合对象中添加新的成员
  • 遍历集合对象
  • 删除集合对象的成员


访问集合

集合对象
集合对象
向集合对象中添加新的成员
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 集合对象 >
访问集合

大部分的集合对象都是通过 Document 对象访问的。对于每一个集合对象，Document 对象都包含一个相应的特性。例如，以下代码定义一个变量，并将其设置为当前图形的 Layers 集合：

Dim layerCollection as AcadLayers
Set layerCollection = ThisDrawing.Layers

Documents、MenuBar 和 MenuGroups 集合都可以通过 Application 对象来访问。对于这些集合，Application 对象都包含相应的特性。例如，以下代码定义一个变量，并将其设置为应用程序的 MenuGroups 集合：

Dim MenuGroupsCollection as AcadMenuGroups
Set MenuGroupsCollection = ThisDrawing.Application.MenuGroups


向集合对象中添加新的成员

访问集合
集合对象
遍历集合对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 集合对象 >
向集合对象中添加新的成员

要向集合中添加新的成员，请使用 Add 方法。例如，以下代码创建一个新图层，并将其添加到 Layers 集合中：

Dim newLayer as AcadLayer
Set newLayer = ThisDrawing.Layers.Add("MyNewLayer")


遍历集合对象

向集合对象中添加新的成员
集合对象
删除集合对象的成员
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 集合对象 >
遍历集合对象

要选择集合对象的特定成员，请使用 Item 方法。Item 方法需要一个标识符，该标识符既可以是指定集合内项目位置的索引号，也可以是代表项目名称的字符串。

Item 方法是集合的默认方法。如果引用集合时未指定方法名称，将使用 Item 方法。以下语句作用相同：

ThisDrawing.Layers.Item("ABC")
ThisDrawing.Layers("ABC")
注意请勿在使用 For Each 机制遍历集合的同时对任意对象使用图元编辑方法（例如复制、阵列、镜像等）。请在遍历完成后再尝试编辑集合中的对象，或者创建临时数组并将其设置为等于该集合，然后遍历复制的数组并执行所需的编辑操作。

遍历 Layers 集合

本例遍历集合，并显示集合中所有图层的名称：

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
查找名为 MyLayer 的图层
本例引用名为 MyLayer 的图层，如果图层不存在，则发出消息：
Sub Ch2_FindLayer()
    ' 使用 Item 方法查找名为 MyLayer 的图层
    On Error Resume Next
    Dim ABCLayer As AcadLayer
    Set ABCLayer = ThisDrawing.Layers("MyLayer")
    If Err <> 0 Then
        MsgBox "The layer 'MyLayer' does not exist."
    End If
End Sub


删除集合对象的成员

遍历集合对象
集合对象
了解特性和方法
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 集合对象 >
删除集合对象的成员

要删除特定的标注样式，请使用成员对象的 Delete 方法。例如，以下代码删除图层 ABC：

Dim ABCLayer as AcadLayer
Set ABCLayer = ThisDrawing.Layers.Item("ABC")
ABCLayer.Delete

删除某个对象后，不能在程序中再试图访问该对象。


了解特性和方法

删除集合对象的成员
ActiveX Automation 基础知识
了解上级对象
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 >
了解特性和方法

每个对象都具有关联的特性和方法。特性描述一个对象的各个方面，方法指可以在对象上执行的操作。创建对象之后，用户可以通过其特性和方法来查询和编辑该对象。

例如，Circle 对象具有 Center 特性。此特性代表圆心处的三维世界坐标系坐标。要更改圆心，只需将此特性设置为新坐标即可。Circle 对象还具有 Offset 方法。使用此方法可以在距离现有圆的指定偏移距离处创建一个新对象。要查看 Circle 对象的所有特性和方法列表，请参见 AutoCAD《ActiveX and VBA Reference》中的 Circle 对象。


了解上级对象

了解特性和方法
ActiveX Automation 基础知识
定位类型库
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 >
了解上级对象

每一个对象都有一个永久链接的上级对象。所有的对象都是从一个称为根对象的上级对象中产生的。沿着从根对象到子对象的链接，用户可以访问接口中的所有对象。另外，这些对象具有称为 Application 的特性，该特性直接链接回根对象。

AutoCAD 接口的根对象为 AutoCAD 应用程序。


定位类型库

了解上级对象
ActiveX Automation 基础知识
在方法和特性中使用变量
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 >
定位类型库

类型库包含通过 Automation 对象显示的对象、特性和方法。类型库是一个文件或是文件的一部分，用于描述一个或多个对象的类型。

类型库不存储对象，只存储信息。通过访问类型库，应用程序和浏览器可以确定对象的特征，例如对象支持的接口以及每个接口成员的名称和地址。

在使用由应用程序显示的 Automation 对象之前，必须先引用其类型库。VBA IDE 中自动设置了此引用。对于其他交互式开发环境，则必须创建 AutoCAD 类型库文件“acax17enu.tlb”的引用，该文件位于“C:\Program Files\Common Files\Autodesk Shared”目录中。要在 VBA IDE 或其他环境中访问图纸集管理器对象，则必须创建 AcSmComponents17 1.0 类型库文件“AcSmComponents17.tlb”的引用，该文件位于“C:\Program Files\Common Files\Autodesk Shared”目录中。

可以在未引用应用程序的类型库的情况下使用应用程序的对象。不过，最好还是添加类型库引用，原因如下：

  • 可以直接访问全局访问函数而无需验证。
  • 可以在编译时检查函数、特性和方法调用的正确性，从而在运行时更快地执行。
  • 可以声明库中已定义类型的变量，提高运行时可靠性和可读性。


在方法和特性中使用变量

定位类型库
ActiveX Automation 基础知识
什么是变量？
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 >
在方法和特性中使用变量

ActiveX Automation 使用变量来传递数组数据。这可能会使初学者感到困惑，但在了解基础知识之后，应该变得容易一些。另外，AutoCAD ActiveX Automation 还提供了帮助用户转换数据类型的实用程序。

本节内容

  • 什么是变量？
  • 使用变量作为数组数据
  • 将数组转换为变量
  • 解释变量数组


什么是变量？

在方法和特性中使用变量
在方法和特性中使用变量
使用变量作为数组数据
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 在方法和特性中使用变量 >
什么是变量？

变量是一种特殊的数据类型，可以包含任何类型的数据，固定长度的字符串数据和用户定义的类型除外。变量还可以包含特殊值 Empty、Error、Nothing 和 NULL。可以使用 VarType 或 TypeName VBA 函数来确定如何处理变量中的数据。

使用变量数据类型替换大部分的数据类型，可以更加灵活地处理数据。


使用变量作为数组数据

什么是变量？
在方法和特性中使用变量
将数组转换为变量
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 在方法和特性中使用变量 >
使用变量作为数组数据

变量用于和 AutoCAD ActiveX Automation 传递数组数据。这表示数组必须是变量，才能被 AutoCAD ActiveX Automation 方法和特性接受。此外，从 AutoCAD ActiveX Automation 输出的数组数据也必须作为变量处理。

注意在 AutoCAD 中，VBA 输入数组会自动被转换为变量。也就是说，在 VBA 中使用 ActiveX Automation 方法和特性时，不必向其输入变量数组。但所有的输出数组都将采用变量的形式，所以请记得进行相应的处理。


将数组转换为变量

使用变量作为数组数据
在方法和特性中使用变量
解释变量数组
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 在方法和特性中使用变量 >
将数组转换为变量

AutoCAD ActiveX Automation 提供了将数组数据转换为变量的实用程序方法。这个方法是 CreateTypedArray 方法，它可以创建包含整数数组、浮点数数组、双精度数组等的变量。用户可以将产生的变量传递给任何 AutoCAD 方法或特性，只要这些方法或特性接受数值数组作为变量。

CreateTypedArray 方法需要输入数组中值的类型，并将数组数据进行转换。以变量返回值的数组。

使用 CreateTypedArray 方法创建样条曲线

以下代码使用 CreateTypedArray 转换三个数组：样条曲线的拟合点坐标及样条曲线的起点切向和端点切向。然后将变量传递给 AddSpline 方法，创建样条曲线。

Sub Ch2_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


解释变量数组

将数组转换为变量
在方法和特性中使用变量
使用其他编程语言
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 在方法和特性中使用变量 >
解释变量数组

从 AutoCAD ActiveX Automation 传回的数组信息是以变量传回的。如果知道数组的数据类型，可以使用数组方式访问变量。如果不知道变量中包含的数据类型，请使用 VBA 函数 VarType 或 Typename。这些函数返回变量中数据的类型。如果需要遍历数组，可以使用 VBA 的 For Each 语句。

计算两点之间的距离

以下代码示范如何计算用户输入的两点之间的距离。在本例中，数据类型是已知的，因为所有的坐标值均为双精度数。三维坐标值是一个包含三个元素的双精度数组，而二维坐标值是一个包含两个元素的双精度数组。

Sub Ch2_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 "The distance between the points is: " _
                  & dist, , "Calculate Distance"
End Sub


使用其他编程语言

解释变量数组
ActiveX Automation 基础知识
将 VBA 代码转换为 VB
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 >
使用其他编程语言

本手册是专为 VBA 编程语言编写的。编程样例和示例应用程序均以 VBA 编写。如果要在其他编程环境中使用这些代码，用户必须更新代码以适合选择的环境。

可以使用开发环境的文档来帮助转换代码样例。

注意AutoCAD 2008 的 COM 应用程序访问注册表键为“AutoCAD.Application.17”。

本节内容

  • 将 VBA 代码转换为 VB


将 VBA 代码转换为 VB

使用其他编程语言
使用其他编程语言
控制 AutoCAD 环境
ActiveX/VBA 开发人员手册 > ActiveX Automation 基础知识 > 使用其他编程语言 >
将 VBA 代码转换为 VB

要更新代码样例以在 VB 中使用，必须先引用 AutoCAD 类型库。要在 VB 中完成此操作，请从“工程”菜单中选择“引用”选项，启动“引用”对话框。在“引用”对话框中，选择 AutoCAD 类型库，然后单击“确定”。

然后在代码样例中，将所有对 ThisDrawing 的引用替换为引用活动文档、用户指定的变量。要完成这项操作，请为 AutoCAD 应用程序 (acadApp) 和当前的文档 (acadDoc) 定义变量。然后，将应用程序变量设置为当前的 AutoCAD 应用程序。

如果 AutoCAD 正在运行，指定 AutoCAD 版本号时，VB GetObject 函数将检索 AutoCAD Application 对象。如果 AutoCAD 没有运行，发生的错误（本例中）会被捕获然后清除。CreateObject 函数接着会试图创建一个 AutoCAD Application 对象。如果创建成功，会启动 AutoCAD；如果失败，则会显示一个消息框，说明发生的错误。

同时运行多个 AutoCAD 任务时，GetObject 函数会返回 Windows 运行对象表中的第一个 AutoCAD 实例。关于验证 GetObject 所返回任务的详细信息，请参见 Microsoft VBA 文档中的运行对象表 (ROT) 和 GetObject 函数。

要显示 AutoCAD 图形窗口，必须将 AutoCAD 应用程序的 Visible 特性设置为 TRUE。

如果 GetObject 创建了一个新的 AutoCAD 实例（即调用 GetObject 时 AutoCAD 没有运行），没有将 Visible 设置为 TRUE 会导致 AutoCAD 应用程序不可见，甚至 AutoCAD 不在 Windows 任务栏上显示。

注意使用依赖于版本的 ProgID。如果 CreateObject 或 GetObject 函数使用的是独立于版本的 ProgID，则将函数更改为使用依赖于版本的 ProgID。例如，如果使用的是 CreateObject，请将 CreateObject ("AutoCAD.Application") 更改为 CreateObject ("AutoCAD.Application.17")。此外，如果 GetInterfaceObject 方法使用的是独立于版本的 ProgID，则必须将该方法更改成使用依赖于版本的 ProgID。

通过 Visual Basic 6 连接至 AutoCAD

本例使用 Err 的 Clear 和 Description 特性。如果用户编码环境不支持这些特性，则需要适当修改样例：

Sub Ch2_ConnectToAcad()
    Dim acadApp As AcadApplication
    On Error Resume Next
    Set acadApp = GetObject(, "AutoCAD.Application.17")
    If Err Then
        Err.Clear
        Set acadApp = CreateObject("AutoCAD.Application.17")
        If Err Then
            MsgBox Err.Description
            Exit Sub
        End If
    End If
    MsgBox "Now running " + acadApp.Name + _
           " version " + acadApp.Version
End Sub
接着，将文档变量设置为 AutoCAD 应用程序中的 Document 对象。Document 对象由 Application 对象的 ActiveDocument 特性返回。
Dim acadDoc as AcadDocument
Set acadDoc = acadApp.ActiveDocument
从现在开始，使用 acadDoc 变量引用当前的 AutoCAD 图形。
VBA 与 VB 比较代码样例
本例示范在 VBA 和 VB 中创建直线。
使用 VBA 创建直线：
Sub Ch2_AddLineVBA()
    ' 本例在模型空间中
    ' 添加一条直线
    Dim lineObj As AcadLine
    Dim startPoint(0 To 2) As Double
    Dim endPoint(0 To 2) As Double
    ' 定义直线的起点
    ' 和端点
    startPoint(0) = 1
    startPoint(1) = 1
    startPoint(2) = 0
    endPoint(0) = 5
    endPoint(1) = 5
    endPoint(2) = 0
    ' 在模型空间中创建直线
    Set lineObj = ThisDrawing._
        ModelSpace.AddLine _
        (startPoint, endPoint)
    ' 放大新创建的直线
    ZoomAll
End Sub
使用 VB 创建直线：
Sub Ch2_AddLineVB()
    On Error Resume Next
    ' 连接至 AutoCAD 应用程序
    Dim acadApp As AcadApplication
    Set acadApp = GetObject _
                  (, "AutoCAD.Application.17")
    If Err Then
        Err.Clear
        Set acadApp = CreateObject _
                  ("AutoCAD.Application.17")
        If Err Then
            MsgBox Err.Description
            Exit Sub
        End If
    End If
    ' 连接至 AutoCAD 图形
    Dim acadDoc As AcadDocument
    Set acadDoc = acadApp.ActiveDocument
    ' 创建直线的端点
    Dim lineObj As AcadLine
    Dim startPoint(0 To 2) As Double
    Dim endPoint(0 To 2) As Double
    startPoint(0) = 1
    startPoint(1) = 1
    startPoint(2) = 0
    endPoint(0) = 5
    endPoint(1) = 5
    endPoint(2) = 0
    ' 在模型空间中创建 Line 对象
    Set lineObj = acadDoc.ModelSpace.AddLine _
                         (startPoint, endPoint)
    ZoomAll
    acadApp.visible = True
End Sub


控制 AutoCAD 环境

将 VBA 代码转换为 VB
打开、保存和关闭图形
ActiveX/VBA 开发人员手册 >
控制 AutoCAD 环境

本章介绍在 AutoCAD 中开发应用程序的基础知识。说明如何控制 AutoCAD 环境并在其中有效地工作。

本节内容

  • 打开、保存和关闭图形
  • 设置 AutoCAD 系统配置
  • 控制“应用程序”窗口
  • 控制“图形”窗口
  • 重置活动对象
  • 设置和返回系统变量
  • 精确绘图
  • 提示用户输入
  • 访问 AutoCAD 命令行
  • 在没有文档打开时使用
  • 输入其他文件格式
  • 输出到其他文件格式


打开、保存和关闭图形

控制 AutoCAD 环境
控制 AutoCAD 环境
设置 AutoCAD 系统配置
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
打开、保存和关闭图形

通过 Documents 集合和 Document 对象可以访问 AutoCAD® 文件功能。

要创建新图形或打开现有图形，请使用 Documents 集合中的方法。Add 方法用于创建新图形并将此图形添加到 Documents 集合中。Open 方法用于打开现有图形。Documents 集合中的 Close 方法用于关闭 AutoCAD 任务中所有打开的图形。

Save 和 SaveAs 方法用于保存图形。有时候用户希望检查活动图形中是否存在未保存的更改。在退出 AutoCAD 任务或创建新图形之前，应当进行这样的检查。使用 Saved 特性可以确保当前图形中不包含任何未保存的更改。

要输入和输出图形，请使用 Document 对象的 Import 和 Export 方法。

打开现有图形

本例使用 Open 方法打开一个现有图形。并使用 VBA 中的 Dir 函数在打开文件之前检查该文件是否存在。用户应当更改图形文件的名称或路径，以指定用户的系统中的现有 AutoCAD 图形文件。

Sub Ch3_OpenDrawing()
    Dim dwgName As String
    dwgName = "c:\campus.dwg"
    If Dir(dwgName) <> "" Then
        ThisDrawing.Application.Documents.Open dwgName
    否则
        MsgBox "File " & dwgName & " does not exist."
    End If
End Sub

创建新图形

本例使用 Add 方法根据默认模板创建新图形。

Sub Ch3_NewDrawing()
    Dim docObj As AcadDocument
    Set docObj = ThisDrawing.Application.Documents.Add
End Sub

保存活动的图形

本样例首先用其当前名称保存活动图形，然后再用新名称保存该图形。

Sub Ch3_SaveActiveDrawing()
    ' 用当前名称保存活动的图形
    ThisDrawing.Save
    ' 用新名称保存活动的图形
    ThisDrawing.SaveAs "MyDrawing.dwg"
End Sub
测试图形中是否存在未保存的更改
本例检查是否存在未保存的更改，并验证用户是否选择“确定”以保存图形（如果没有选择“确定”，跳至结尾处）。如果用户选择“确定”，将使用 Save 方法保存当前图形，如下所示：
Sub Ch3_TestIfSaved()
    If Not (ThisDrawing.Saved) Then
        If MsgBox("Do you wish to save this drawing?", _
                   vbYesNo) = vbYes Then
            ThisDrawing.Save
        End If
    End If
End Sub


设置 AutoCAD 系统配置

打开、保存和关闭图形
控制 AutoCAD 环境
数据库系统配置
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
设置 AutoCAD 系统配置

有九个与选项相关的对象，每个对象分别代表“选项”对话框中的一个选项卡。通过这些对象可以访问“选项”对话框中所有存储在注册表中的选项，可以使用这些对象的特性来自定义许多 AutoCAD 设置。这些对象包括

  • PreferencesDisplay
  • PreferencesDrafting
  • PreferencesFiles
  • PreferencesOpenSave
  • PreferencesOutput
  • PreferencesProfiles
  • PreferencesSelection
  • PreferencesSystem
  • PreferencesUser

可以通过 Preferences 对象访问这些对象。要访问 Preferences 对象，请使用 Application 对象的 Preferences 特性：

Dim acadPref as AcadPreferences
Set acadPref = ThisDrawing.Application.Preferences

然后可以使用 Display、Drafting、Files、OpenSave、Output、Profile、Selection、 System 和 User 特性来访问任何特定的 Preferences 对象。

将十字光标设置为全屏

Sub Ch2_PrefsSetCursor()
    ' 本例设置 AutoCAD 图形光标的十字光标
    ' 设置为全屏。
    ' 访问 Preferences 对象
    Dim acadPref As AcadPreferences
    Set acadPref = ThisDrawing.Application.Preferences
    ' 使用 CursorSize 特性设置十字光标的大小
    acadPref.Display.CursorSize = 100
End Sub
显示屏幕菜单和滚动条
Sub Ch2_PrefsSetDisplay()
    ' 本例使用 DisplayScreenMenu 和 DisplayScrollBars 特性
    ' 分别启用屏幕菜单和禁用
    ' 滚动条。
    ' 访问 Preferences 对象
    Dim acadPref As AcadPreferences
    Set acadPref = ThisDrawing.Application.Preferences
    ' 显示屏幕菜单并禁用滚动条
    acadPref.Display.DisplayScreenMenu = True
    acadPref.Display.DisplayScrollBars = False
End Sub
本节内容
  • 数据库系统配置


数据库系统配置

设置 AutoCAD 系统配置
设置 AutoCAD 系统配置
控制“应用程序”窗口
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 设置 AutoCAD 系统配置 >
数据库系统配置

除上述九个 Preferences 对象外，还有一个 DatabasePreferences 对象，它包含存储在图形中的所有选项。提供此单独对象后，不必首先启动 AutoCAD 应用程序（ObjectDBX 应用程序），即可使图形存储的选项对访问 AutoCAD 图形的应用程序可用。

DatabasePreferences 对象位于 Document 对象之下。


控制“应用程序”窗口

数据库系统配置
控制 AutoCAD 环境
控制“图形”窗口
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
控制“应用程序”窗口

控制“应用程序”窗口功能使开发人员可以灵活地创建既高效又智能的应用程序。有些时候，用户的应用程序有必要将 AutoCAD 窗口最小化，例如此时代码正在其他应用程序（如 Excel）中运行任务的时候。此外，用户通常希望在执行诸如提示用户输入之类的任务之前，验证 AutoCAD 窗口的状态。

使用 Application 对象的方法和特性可以更改“应用程序”窗口的位置、大小和可见性。另外，还可以使用 WindowState 特性来最小化、最大化“应用程序”窗口以及检查窗口的当前状态。

更改“应用程序”窗口的位置和大小

本例使用 WindowTop、WindowLeft、Width 和 Height 特性将 AutoCAD“应用程序”窗口放在屏幕的左上角，并将其大小调整为宽 400 像素、高 400 像素。

Sub Ch3_PositionApplicationWindow()
    ThisDrawing.Application.WindowTop = 0
    ThisDrawing.Application.WindowLeft = 0
    ThisDrawing.Application.width = 400
    ThisDrawing.Application.height = 400
End Sub

最大化“应用程序”窗口

Sub Ch3_MaximizeApplicationWindow()
    ThisDrawing.Application.WindowState = acMax
End Sub

最小化“应用程序”窗口

Sub Ch3_MinimizeApplicationWindow()
    ThisDrawing.Application.WindowState = acMin
End Sub

找出“应用程序”窗口的当前状态

本例查询“应用程序”窗口的状态，并将该状态以消息框的形式显示给用户。

Sub Ch3_CurrentWindowState()
    Dim CurrWindowState As Integer
    Dim msg As String
    CurrWindowState = ThisDrawing.Application.WindowState
    msg = Choose(CurrWindowState, "normal", _
                 "minimized", "maximized")
    MsgBox "The application window is " + msg
End Sub

使“应用程序”窗口不可见

下面的代码使用 Visible 特性使 AutoCAD 应用程序对最终用户不可见。

Sub Ch3_HideWindowState()
    ThisDrawing.Application.Visible = False
End Sub


控制“图形”窗口

控制“应用程序”窗口
控制 AutoCAD 环境
更改“文档”窗口的位置和大小
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
控制“图形”窗口

与 AutoCAD“应用程序”窗口类似，对于“文档”窗口，可以最小化、最大化、重新定位、调整大小以及查看其状态。除此之外，还可以使用视图、视口和缩放方法来更改图形在窗口中的显示方式。

AutoCAD ActiveX 提供了许多显示图形视图的方法。可以在跟踪更改的整体效果时，控制图形的显示以快速移动到图形的其他区域；可以通过缩放更改放大比例或通过平移调整视图在图形区中的位置；可以保存视图并在需要打印或参考特定细节时将其恢复；或者将屏幕拆分为多个平铺视口以同时显示多个视图。

本节内容

  • 更改“文档”窗口的位置和大小
  • 使用“缩放”
  • 使用命名视图
  • 使用平铺视口
  • 更新“文档”窗口中的几何图形


更改“文档”窗口的位置和大小

控制“图形”窗口
控制“图形”窗口
使用“缩放”
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 >
更改“文档”窗口的位置和大小

可以使用 Document 对象修改任何“文档”窗口的位置和大小。使用 WindowState 特性可以将“文档”窗口最小化或最大化，还可以查看“文档”窗口的当前状态。

放置“文档”窗口

本例使用 Width 和 Height 特性将活动“文档”窗口设置为宽 400 像素、高 400 像素。

Sub Ch3_SizeDocumentWindow()
ThisDrawing.Width = 400
ThisDrawing.Height = 400
End Sub

将活动“文档”窗口最大化

Sub Ch3_MaximizeDocumentWindow()
ThisDrawing.WindowState = acMax
End Sub

将活动“文档”窗口最小化

Sub Ch3_MinimizeDocumentWindow()
ThisDrawing.WindowState = acMin
End Sub

查看活动“文档”窗口的当前状态

Sub Ch3_CurrentWindowState()
    Dim CurrWindowState As Integer
    Dim msg As String
    CurrWindowState = ThisDrawing.WindowState
    msg = Choose(CurrWindowState, "normal", _
                 "minimized", "maximized")
    MsgBox "The document window is " + msg
End Sub


使用“缩放”

更改“文档”窗口的位置和大小
控制“图形”窗口
定义“缩放”窗口
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 >
使用“缩放”

视图显示的是具有特定放大比例、位置和方向的图形。更改视图最常用的方法是使用某个 AutoCAD“缩放”选项，以增加或减小图形区域中显示的图像大小。有关在 AutoCAD 中进行缩放的详细信息，请参见《用户手册》中的“放大视图（缩放）”。

本节内容

  • 定义“缩放”窗口
  • 缩放视图
  • 居中对齐对象
  • 显示图形界限和范围


定义“缩放”窗口

使用“缩放”
使用“缩放”
缩放视图
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 > 使用“缩放” >
定义“缩放”窗口

可以通过指定定义区域的角点快速放大该区域。要通过指定边界来放大某个区域，请使用 ZoomWindow 或 ZoomPickWindow 方法。ZoomWindow 方法使用户可以通过编程的方式定义代表“缩放”窗口的两个点；ZoomPickWindow 方法则要求用户拾取两个点。这两个拾取点将形成“缩放”窗口。

将活动图形缩放至两点定义的窗口

Sub Ch3_ZoomWindow()
    ' ZoomWindow
    MsgBox "Perform a ZoomWindow with:" & vbCrLf & _
           "1.3, 7.8, 0" & vbCrLf & _
           "13.7, -2.6, 0", , "ZoomWindow"
    Dim point1(0 To 2) As Double
    Dim point2(0 To 2) As Double
    point1(0) = 1.3: point1(1) = 7.8: point1(2) = 0
    point2(0) = 13.7: point2(1) = -2.6: point2(2) = 0
    ThisDrawing.Application.ZoomWindow point1, point2
    ' ZoomPickWindow
    MsgBox "Perform a ZoomPickWindow", , "ZoomPickWindow"
    ThisDrawing.Application.ZoomPickWindow
End Sub


缩放视图

定义“缩放”窗口
使用“缩放”
居中对齐对象
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 > 使用“缩放” >
缩放视图

如果需要按精确的比例缩放图像，可以用三种方法指定缩放比例：

  • 相对于图形界限
  • 相对于当前视图
  • 相对于图纸空间单位

要缩放视图，请使用 ZoomScaled 方法。该方法需要两个输入参数：缩放比例和缩放类型。缩放比例是一个数值，AutoCAD 对该数值的解释取决于用户选择的缩放类型。

缩放类型确定缩放值是相对于图形界限、当前视图还是相对于图纸空间单位创建的。相对于图形界限缩放时，使用常量 acZoomScaledAbsolute；相对于当前视图缩放时，使用常量 acZoomScaledRelative；相对于图纸空间单位缩放时，使用常量 acZoomScaledRelativePSpace。

使用指定的缩放比例放大活动图形

Sub Ch3_ZoomScaled()
    MsgBox "Perform a ZoomScaled using:" & vbCrLf & _
           "Scale Type: acZoomScaledRelative" & vbCrLf & _
           "Scale Factor: 2", , "ZoomScaled"
    Dim scalefactor As Double
    Dim scaletype As Integer
    scalefactor = 2
    scaletype = acZoomScaledRelative
    ThisDrawing.Application.ZoomScaled scalefactor, scaletype
End Sub


居中对齐对象

缩放视图
使用“缩放”
显示图形界限和范围
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 > 使用“缩放” >
居中对齐对象

将活动图形放大到指定的中心。用户可以将图形中的特定点移动到图形区域的中心。ZoomCenter 方法可用于调整对象大小并将其置于视口的中心。使用 ZoomCenter，可以通过输入相对于当前视图的放大比例来指定比例大小。

以指定点为中心放大活动图形

下面的样例显示了使用 ZoomCenter 以相同大小和两倍大小显示视图的效果：

Sub Ch3_ZoomCenter()
    MsgBox "Perform a ZoomCenter using:" & vbCrLf & _
           "Center 3, 3, 0" & vbCrLf & _
           "Magnification: 10", , "ZoomCenter"
    Dim Center(0 To 2) As Double
    Dim magnification As Double
    Center(0) = 3: Center(1) = 3: Center(2) = 0
    magnification = 10
    ThisDrawing.Application.ZoomCenter Center, magnification
End Sub


显示图形界限和范围

居中对齐对象
使用“缩放”
使用命名视图
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 > 使用“缩放” >
显示图形界限和范围

要根据图形边界或图形中对象的范围显示视图，请使用 ZoomAll、ZoomExtents 或 ZoomPrevious 方法。

ZoomAll 用于显示整个图形。如果对象超出界限，ZoomAll 将显示对象的范围。如果对象绘制在界限内，ZoomAll 将显示界限。

ZoomExtents 根据活动视口而不是当前视图的范围来计算缩放。活动视口通常是完全可见的，所以结果一目了然；但是，当在模型空间中使用 Zoom 方法而在图纸空间视口中进行操作时，如果放大到图纸空间视口的边框以外的区域，则部分放大区域可能不可见。

ZoomExtents 将更改视图以包含当前图形的图元范围，在某些情况下（对于 ZoomAll 和 ZoomExtents），这可能会导致重生成。重生成不会发生在冻结或关闭的图层上。如果图形中没有对象，ZoomExtents 将显示图形的界限。

对于三维视图，ZoomAll 和 ZoomExtents 的效果相同；无限长构造线和射线不受这些选项的影响。

ZoomPrevious 将当前视口缩放到前一个范围。

有关如何进行缩放的图解，请参见《用户手册》中的“放大视图（缩放）”。

将活动图形缩放至图形上的所有内容和图形范围

Sub Ch3_ZoomAll()
' ZoomAll
    MsgBox "Perform a ZoomAll", , "ZoomAll"
    ThisDrawing.Application.ZoomAll
' ZoomExtents
    MsgBox "Perform a ZoomExtents", , "ZoomExtents"
    ThisDrawing.Application.ZoomExtents
End Sub


使用命名视图

显示图形界限和范围
控制“图形”窗口
使用平铺视口
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 >
使用命名视图

可以命名和保存要重复使用的视图。如果不再需要该视图，可以删除它。

要创建新视图，请使用 Add 方法将新视图添加到 Views 集合中。保存图形时，会同时保存视图的查看位置和比例。

可以在创建视图时命名该视图。视图的名称最多可包含 255 个字符，包含字母、数字和特殊字符美元符号 ($)、连字符 (-) 和下划线 (_)。

要删除命名视图，只需使用 Delete 方法即可。View 对象的 Delete 方法位于 View 对象，而不是它的父对象。

添加 View 对象

下面的样例添加了 View 对象 (viewObj)。

Sub Ch3_AddView()
    ' 将命名视图添加到 Views 集合
    Dim viewObj As AcadView
    Set viewObj = ThisDrawing.Views.Add("View1")
End Sub

删除 View 对象

下面的样例删除了 View 对象 (viewObj)。

Sub Ch3_DeleteView()
    Dim viewObj As AcadView
    Set viewObj = ThisDrawing.Views("View1")
   ' 删除视图
    viewObj.Delete
End Sub

从 Views 集合中删除命名视图

本例从 Views 集合中删除命名视图。

Sub Ch3_DeleteViewFromCollection()
   ThisDrawing.Views("View1").Delete
End Sub


使用平铺视口

使用命名视图
控制“图形”窗口
拆分活动视口
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 >
使用平铺视口

AutoCAD 通常使用充满整个图形区域的单个视口来开始一个新图形。可以拆分图形区域以同时显示多个视口。例如，如果同时显示整个视图和详细资料视图，则可以在整个图形上查看细节更改的效果。在每个平铺视口中，都可以进行以下操作：

  • 在单个视口中缩放、设置捕捉、栅格和 UCS 图标模式，以及恢复命名视图
  • 执行命令时，从一个视口绘制到另一个视口
  • 命名视口的配置以便可以重复使用

可以使用不同的配置来显示平铺视口。视口的显示方式取决于所需的视图数量和大小。

有关描述视口的详细信息和图解，请参见《用户手册》中的“设置模型空间视口”。

本节内容

  • 拆分活动视口
  • 使另一个平铺视口成为当前视口


拆分活动视口

使用平铺视口
使用平铺视口
使另一个平铺视口成为当前视口
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 > 使用平铺视口 >
拆分活动视口

要拆分活动视口，请使用 Split 方法。此该方法接收一个参数，即要将视口拆分为哪种配置类型。要指定窗口配置，请使用以下一个对应于前面所示的默认配置的常量：acViewport2Horizontal、acViewport2Vertical、acViewport3Left、acViewport3Right、acViewport3Horizontal、acViewport3Vertical、acViewport3Above、acViewport3Below 或 acViewport4。

有关更改视口配置的详细信息，请参见《用户手册》中的“设置模型空间视口”。

将视口拆分为两个水平窗口

下面的样例创建一个新视口，然后将视口拆分为两个水平窗口。

Sub Ch3_SplitAViewport()
    ' 创建新视口
    Dim vportObj As AcadViewport
    Set vportObj = ThisDrawing.Viewports.Add("TEST_VIEWPORT")
    ' 将 vportObj 拆分为 2 个水平窗口
    vportObj.Split acViewport2Horizontal
    ' 现在将 vportObj 设置为活动视口
    ThisDrawing.ActiveViewport = vportObj
End Sub


使另一个平铺视口成为当前视口

拆分活动视口
使用平铺视口
更新“文档”窗口中的几何图形
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 > 使用平铺视口 >
使另一个平铺视口成为当前视口

输入点和选择对象操作是在当前视口中进行的。要将某个视口置为当前视口，请使用 ActiveViewport 特性。

可以遍历现有视口以查找特定视口。要执行此任务，首先使用 Name 特性标识所需视口所在的视口配置的名称。此外，如果视口配置已被拆分，则可以通过 LowerLeftCorner 和 UpperRightCorner 特性来标识配置中的每个单独视口。

LowerLeftCorner 和 UpperRightCorner 特性用于表示显示器上视口的图形位置，可以通过如下方式定义这些特性（以四向拆分为例）：

在本样例中：

  • Viewport 1-LowerLeftCorner = (0, .5), UpperRightCorner = (.5, 1)
  • Viewport 2-LowerLeftCorner = (.5, .5), UpperRightCorner = (1, 1)
  • Viewport 3-LowerLeftCorner = (0, 0), UpperRightCorner = (.5, .5)
  • Viewport 4-LowerLeftCorner = (.5, 0), UpperRightCorner = (1, .5)

拆分视口，然后遍历各个窗口

本例将视口拆分为四个窗口，然后遍历图形中的所有视口并显示视口名称以及每个视口的左下角点和右上角点。

Sub Ch3_IteratingViewportWindows()
    ' 创建新视口并将其置为活动视口
    Dim vportObj As AcadViewport
    Set vportObj = ThisDrawing.Viewports.Add("TEST_VIEWPORT")
    ThisDrawing.ActiveViewport = vportObj
    ' 将 vport 拆分为 4 个窗口
    vportObj.Split acViewport4
    ' 遍历视口，
    ' 亮显每个视口并显示
    ' 每个视口的右上角点和
    ' 左下角点。
    Dim vport As AcadViewport
    Dim LLCorner As Variant
    Dim URCorner As Variant
    For Each vport In ThisDrawing.Viewports
        ThisDrawing.ActiveViewport = vport
        LLCorner = vport.LowerLeftCorner
        URCorner = vport.UpperRightCorner
        MsgBox "Viewport: " & vport.Name & " is now active." & _
                vbCrLf & "Lower left corner: " & _
                LLCorner(0) & ", " & LLCorner(1) & vbCrLf & _
                "Upper right corner: " & _
                URCorner(0) & ", " & URCorner(1)
    Next vport
End Sub


更新“文档”窗口中的几何图形

使另一个平铺视口成为当前视口
控制“图形”窗口
重置活动对象
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 控制“图形”窗口 >
更新“文档”窗口中的几何图形

通过 AutoCAD ActiveX Automation 执行的许多操作都会修改 AutoCAD 图形中显示的内容。但并不是所有这些操作都会立即更新图形的显示。这样设计的目的是使用户可以进行多次图形更改，而无需在每次更改后都等待显示更新；相反，用户可以将更改操作捆绑在一起进行，并仅在完成时进行一次调用以更新显示。

更新显示的方法有 Update 和 Regen。

Update 方法只更新单个对象的显示。Regen 方法将重生成整个图形，并重新计算所有对象的屏幕坐标和视图分辨率，同时还可以重新生成图形数据库的索引，以优化显示和对象选择性能。

更新单个对象的显示

本例创建一个圆。然后使用 Update 方法更新该圆，这样该圆就在 AutoCAD 中可见。

Sub Ch3_UpdateDisplay()
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 1: center(1) = 1: center(2) = 0
    radius = 1
    ' 创建圆
    Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius)
    ' 更新圆
    circleObj.Update
End Sub


重置活动对象

更新“文档”窗口中的几何图形
控制 AutoCAD 环境
设置和返回系统变量
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
重置活动对象

对于大部分活动对象（例如活动图层和活动线型），对其所做的更改会立即显示。但有些活动对象必须要重置才能显示其更改。这些对象包括活动文字样式、活动用户坐标系 (UCS) 和活动视口。如果更改了任何这些对象，必须将其重置然后调用 Regen 方法才能显示更改。

要重置这些对象，只需使用更新的对象来设置 ActiveTextStyle、ActiveUCS 或 ActiveViewport 特性即可。

重置活动视口

下面的样例更改活动视口中的栅格显示，然后将视口重置为活动视口以显示更改。

Sub Ch3_ResetActiveViewport()
    ' 切换活动视口的栅格显示
    ' 设置
    ThisDrawing.ActiveViewport.GridOn = _
              Not (ThisDrawing.ActiveViewport.GridOn)
    ' 重置活动视口
    ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport
End Sub


设置和返回系统变量

重置活动对象
控制 AutoCAD 环境
精确绘图
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
设置和返回系统变量

Document 对象提供了 SetVariable 和 GetVariable 方法，分别用于设置和检索 AutoCAD 系统变量。例如，要将整数指定给 MAXSORT 系统变量，请使用以下代码：

ThisDrawing.SetVariable "MAXSORT", 100


精确绘图

设置和返回系统变量
控制 AutoCAD 环境
调整捕捉和栅格对齐方式
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
精确绘图

使用 AutoCAD 可以创建带有精确几何图形的图形，而无需执行冗长的计算。通常可以指定精确的点，而无需知道对应的坐标值；也可以不必离开图形屏幕即在图形上执行计算并显示各种类型的状态信息。

目前，AutoCAD ActiveX Automation 没有提供完成以下 AutoCAD 功能的方法：

  • 设置对象捕捉
  • 指定对象上的等分间距或将对象等分为多个区段

本节内容

  • 调整捕捉和栅格对齐方式
  • 使用“正交”模式
  • 绘制构造线
  • 计算点和值
  • 计算面积


调整捕捉和栅格对齐方式

精确绘图
精确绘图
使用“正交”模式
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 >
调整捕捉和栅格对齐方式

可以使用栅格作为直观的定位基准，并打开“捕捉”模式以限制光标的移动。除设置间距外，还可以调整捕捉和栅格的对齐方式。也可以旋转对齐方式，或者将其设置为用于等轴测图形。

如果需要沿特定对齐方向或角度绘图，可以旋转捕捉角度。捕捉角度旋转的中心点即是捕捉基点。如果需要对齐填充图案，可以更改此点（通常设置为 0,0）。

要旋转捕捉角度，请使用 SnapRotationAngle 特性。要更改捕捉角度旋转的基点，请使用 SnapBasePoint 特性。

注意这两个特性都需要调用 Update 方法来更新 AutoCAD 显示。

有关使用和设置捕捉和栅格的详细信息，请参见《用户手册》中的“调整栅格和栅格捕捉”。

更改捕捉基点和旋转角度

本例将捕捉基点更改为 (1,1)，并将捕捉旋转角更改为 30 度，同时打开栅格以显示这些更改。

Sub Ch3_ChangeSnapBasePoint()
    ' 打开活动视口的栅格
    ThisDrawing.ActiveViewport.GridOn = True
    ' 将捕捉基点更改为 1, 1
    Dim newBasePoint(0 To 1) As Double
    newBasePoint(0) = 1: newBasePoint(1) = 1
    ThisDrawing.ActiveViewport.SnapBasePoint = newBasePoint
    ' 将捕捉旋转角更改为 30 度（0.575 弧度）
    Dim rotationAngle As Double
    rotationAngle = 0.575
    ThisDrawing.ActiveViewport.SnapRotationAngle = rotationAngle
    ' 重置视口
    ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport
End Sub


使用“正交”模式

调整捕捉和栅格对齐方式
精确绘图
绘制构造线
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 >
使用“正交”模式

绘制直线或移动对象时，可以使用“正交”模式将光标限制在水平轴或垂直轴方向。（正交对齐取决于当前的捕捉角度或 UCS。）“正交”模式需要用户指定第二个点。使用“正交”模式，不仅可以建立垂直或水平对齐，还可以增强平行性或创建常规偏移。

通过允许 AutoCAD 施加正交约束，可以提高绘图速度。例如，通过在开始绘图之前打开“正交”模式，可以创建一系列垂直直线。由于直线被约束在水平轴和垂直轴方向，所以知道这些直线是垂直的，从而可以更快地绘图。

移动光标时，根据哪个轴离光标最近，定义位移的拖引线将显示为沿水平轴或垂直轴方向。在透视图中或在命令行输入坐标或指定对象捕捉时，AutoCAD 会忽略“正交”模式。

要打开或关闭“正交”模式，请使用 OrthoOn 特性。此特性需要输入一个布尔值。设置为 TRUE 将打开“正交”模式，设置为 FALSE 将关闭“正交”模式。例如，下面的语句将打开活动视口的“正交”模式：

ThisDrawing.ActiveViewport.OrthoOn = True


绘制构造线

使用“正交”模式
精确绘图
创建构造线
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 >
绘制构造线

可以创建在一个或两个方向无限延伸的构造线。在一个方向上延伸的构造线称为射线，在两个方向延伸的构造线称为构造线。这些构造线可以用作创建其他对象的参照。例如，可以用构造线查找三角形的中心、准备同一个项目的多个视图或创建对象捕捉使用的临时交点。

本节内容

  • 创建构造线
  • 查询构造线
  • 创建射线
  • 查询射线


创建构造线

绘制构造线
绘制构造线
查询构造线
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 > 绘制构造线 >
创建构造线

构造线可以放置在三维空间中的任意位置，并且可以在两个方向上无限延伸。要创建构造线，请使用 AddXLine 方法。该方法用两点法指定直线，即输入或选择两个点来定义方向；第一个点（即根）是构造线的中点。

添加构造线

下面的代码样例使用两个点 (5, 0, 0) 和 (1, 1, 0) 创建构造线对象。

Sub Ch3_AddXLine()
    Dim xlineObj As AcadXline
    Dim basePoint(0 To 2) As Double
    Dim directionVec(0 To 2) As Double
    ' 定义构造线
    basePoint(0) = 2#: basePoint(1) = 2#: basePoint(2) = 0#
    directionVec(0) = 1#: directionVec(1) = 1#: directionVec(2) = 0#
    ' 在模型空间中创建构造线
    Set xlineObj = ThisDrawing.ModelSpace.AddXLine _
                   (basePoint, directionVec)
    ThisDrawing.Application.ZoomAll
End Sub


查询构造线

创建构造线
绘制构造线
创建射线
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 > 绘制构造线 >
查询构造线

创建构造线后，可以使用 BasePoint 特性查询构造线的第一个点。用于创建构造线的第二个点并未存储在对象中。而使用 DirectionVector 特性来获得构造线的方向矢量。

查询构造线

本例查找在添加构造线中创建的构造线的基点和方向矢量。

Dim BPoint As Variant
Dim Vector As Variant
BPoint = xlineObj.basePoint
Vector = xlineObj.DirectionVector


创建射线

查询构造线
绘制构造线
查询射线
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 > 绘制构造线 >
创建射线

射线是三维空间中起始于指定点并无限延伸的直线。与在两个方向延伸的构造线不同，射线仅在一个方向延伸。因此，使用射线有助于减少由于构造线过多而造成的视觉混乱。

与构造线相同，显示图形范围的命令会忽略射线。


查询射线

创建射线
绘制构造线
计算点和值
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 > 绘制构造线 >
查询射线

创建射线后，可以使用 BasePoint 特性查询射线的第一个点。用于创建射线的第二个点并未存储在对象中，而使用 DirectionVector 特性来获取射线的方向矢量。

添加、查询和编辑 Ray 对象

下面的代码样例使用两点 (5, 0, 0) 和 (1, 1, 0) 创建一个 Ray 对象。然后查询当前的基点和方向矢量，并将结果显示在消息框中。最后更改方向矢量，并再次查询和显示基点及新的方向矢量。

Sub Ch3_EditRay()
    Dim rayObj As AcadRay
    Dim basePoint(0 To 2) As Double
    Dim secondPoint(0 To 2) As Double
    ' 定义射线
    basePoint(0) = 3#: basePoint(1) = 3#: basePoint(2) = 0#
    secondPoint(0) = 4#: secondPoint(1) = 4#: secondPoint(2) = 0#
    ' 在模型空间中创建 Ray 对象
    Set rayObj = ThisDrawing.ModelSpace.AddRay _
                 (basePoint, secondPoint)
    ThisDrawing.Application.ZoomAll
    ' 查找 Ray 的当前状态
    MsgBox "The base point of the ray is: " & _
            rayObj.basePoint(0) & ", " & _
            rayObj.basePoint(1) & ", " & _
            rayObj.basePoint(2) & vbCrLf & _
            "The directional vector for the ray is: " & _
           rayObj.DirectionVector(0) & ", " & _
           rayObj.DirectionVector(1) & ", " & _
           rayObj.DirectionVector(2), , "Edit Ray"
    ' 更改射线的方向矢量
    Dim newVector(0 To 2) As Double
    newVector(0) = -1
    newVector(1) = 1
    newVector(2) = 0
    rayObj.DirectionVector = newVector
    ThisDrawing.Regen False
    MsgBox "The base point of the ray is: " & _
            rayObj.basePoint(0) & ", " & _
            rayObj.basePoint(1) & ", " & _
            rayObj.basePoint(2) & vbCrLf & _
            "The directional vector for the ray is: " & _
           rayObj.DirectionVector(0) & ", " & _
           rayObj.DirectionVector(1) & ", " & _
           rayObj.DirectionVector(2), , "Edit Ray"
End Sub


计算点和值

查询射线
精确绘图
计算面积
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 >
计算点和值

使用 Utility 对象提供的方法，可以迅速解决数学问题或定位图形上的点。使用 Utility 对象的方法可以执行以下操作：

  • 使用 AngleFromXAxis 方法查看直线与 X 轴所成的角度
  • 使用 AngleToReal 方法将字符串表示的角度转换为实数（双精度）值
  • 使用 AngleToString 方法将角度从实数（双精度）值转换为字符串
  • 使用 DistanceToReal 方法将距离从字符串转换为实数（双精度）值
  • 使用 CreateTypedArray 方法创建包含整数数组、浮点数数组、双精度数数组等的变量
  • 使用 PolarPoint 方法找出与给定点成指定角度和指定距离的点
  • 使用 TranslateCoordinates 方法将某点从一个坐标系转换到另一个坐标系
  • 使用 GetDistance 方法找出用户输入的两点之间的距离

使用 GetDistance 方法找出两点间的距离

本例使用 GetDistance 方法获取点的坐标，并使用 MsgBox 函数显示计算出的距离。

Sub Ch3_GetDistanceBetweenTwoPoints()
    Dim returnDist As Double
    ' 返回用户输入的值，提供一个提示。
    returnDist = ThisDrawing.Utility.GetDistance _
                 (, "Pick two points.")
    MsgBox "The distance between the two points is: " & returnDist
End Sub


计算面积

计算点和值
精确绘图
计算已定义的面积
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 >
计算面积

计算用户输入的点定义的图形面积。使用 Area 特性可以计算圆弧、圆、椭圆、优化多段线、多段线、面域或平面闭合样条曲线的面积。

如果需要计算多个对象的组合面积，可以在添加时保存一个运行总数，或者在一系列面域上使用 Boolean 方法，以获得代表所需面积的单个面域。然后使用 Area 特性获取该单个面域的面积。

计算的面积根据用户查询的对象类型而有所不同。有关如何计算每个对象类型的面积的介绍，请参见《用户手册》中的“获取面积信息”。

本节内容

  • 计算已定义的面积


计算已定义的面积

计算面积
计算面积
提示用户输入
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 精确绘图 > 计算面积 >
计算已定义的面积

计算用户输入的点定义的图形面积。要获取用户输入的点指定的面积，可以测量由用户指定的二维或三维点定义的任意闭合面域。这些点必须共面。

获取由用户输入点指定的区域面积的步骤

  1. 在一个循环中使用 GetPoint 方法获取用户指定的点。
  2. 根据用户提供的点创建优化多段线。使用 AddLightweightPolyline 方法创建多段线。
  3. 使用 Area 特性获取新创建的多段线的面积。
  4. 使用 Erase 方法删除多段线。

计算用户输入的点定义的面积

本例提示用户输入五个点，然后根据输入的点创建多段线。该多段线是闭合的，所形成的面积显示在消息框中。

Sub Ch3_CalculateDefinedArea()
    Dim p1 As Variant
    Dim p2 As Variant
    Dim p3 As Variant
    Dim p4 As Variant
    Dim p5 As Variant
    ' 获取用户输入的点
    p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "First point: ")
    p2 = ThisDrawing.Utility.GetPoint(p1, vbCrLf & "Second point: ")
    p3 = ThisDrawing.Utility.GetPoint(p2, vbCrLf & "Third point: ")
    p4 = ThisDrawing.Utility.GetPoint(p3, vbCrLf & "Fourth point: ")
    p5 = ThisDrawing.Utility.GetPoint(p4, vbCrLf & "Fifth point: ")
    ' 根据这些点创建二维多段线
    Dim polyObj As AcadLWPolyline
    Dim vertices(0 To 9) As Double
    vertices(0) = p1(0): vertices(1) = p1(1)
    vertices(2) = p2(0): vertices(3) = p2(1)
    vertices(4) = p3(0): vertices(5) = p3(1)
    vertices(6) = p4(0): vertices(7) = p4(1)
    vertices(8) = p5(0): vertices(9) = p5(1)
    Set polyObj = ThisDrawing.ModelSpace.AddLightWeightPolyline _
                  (vertices)
    polyObj.Closed = True
    ThisDrawing.Application.ZoomAll
    ' 显示多段线的面积
    MsgBox "The area defined by the points is " & _
            polyObj.Area, , "Calculate Defined Area"
End Sub


提示用户输入

计算已定义的面积
控制 AutoCAD 环境
GetString 方法
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
提示用户输入

Utility 对象（Document 对象的子对象）定义了用户输入方法。用户输入方法会在 AutoCAD 命令行显示提示并要求提供不同的输入类型。这种用户输入对于交互式输入屏幕坐标、图元选择、短字符串或数值非常有用。如果应用程序要求输入多个选项或值，则使用对话框可能比使用单个提示更合适。

每个用户输入方法都在 AutoCAD 命令行显示提示，并返回特定于所请求的输入类型的值。例如，GetString 返回一个字符串、GetPoint 返回一个变量（包含一个三元素的双精度数数组）而 GetInteger 返回一个整数值。还可以使用 InitializeUserInput 方法进一步控制用户的输入。此方法使用户可以控制 NULL 输入（按 ENTER 键）、零或负数的输入以及任意文字值的输入等等。

要使提示单独显示在一行中，可以在提示字符串的开头使用回车符/换行常量字符 (vbCrLf)。

本节内容

  • GetString 方法
  • GetPoint 方法
  • GetKeyword 方法
  • 控制用户输入


GetString 方法

提示用户输入
提示用户输入
GetPoint 方法
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 提示用户输入 >
GetString 方法

GetString 方法提示用户在 AutoCAD 命令提示下输入字符串。该方法接收两个参数。第一个参数控制输入字符串中的空格输入。如果将其设置为 0（零），则不能输入空格，按空格键将终止输入；如果将其设置为 1，则字符串可以包含空格，必须使用 ENTER 键来终止输入。第二个参数是提示字符串。

从 AutoCAD 命令行获取用户输入的字符串值

以下样例显示了“输入名称”提示，并要求用户通过按 ENTER 键来终止输入（输入字符串中可以包含空格）。输入字符串值被存储在 retVal 变量中，并通过一个消息框显示出来。

Sub Ch3_GetStringFromUser()
    Dim retVal As String
    retVal = ThisDrawing.Utility.GetString _
             (1, vbCrLf & "Enter your name: ")
    MsgBox "The name entered was: " & retVal
End Sub

GetString 方法不会认可优先对 InitializeUserInput 方法的调用。


GetPoint 方法

GetString 方法
提示用户输入
GetKeyword 方法
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 提示用户输入 >
GetPoint 方法

GetPoint 方法提示用户在 AutoCAD 命令提示下给出点的定义。该方法接收两个参数：可选的起始点和提示字符串。如果提供了起始点，AutoCAD 将从该点绘制一条拖引线。要控制用户输入，可以在使用该方法之前先调用 InitializeUserInput 方法。

获取用户选定的点

下面的样例提示用户输入两个点，然后以这两个点为起点和端点绘制一条直线。

Sub Ch3_GetPointsFromUser()
    Dim startPnt As Variant
    Dim endPnt As Variant
    Dim prompt1 As String
    Dim prompt2 As String
    prompt1 = vbCrLf & "Enter the start point of the line: "
    prompt2 = vbCrLf & "Enter the end point of the line: "
    ' 在不输入基点的情况下获取第一点
    startPnt = ThisDrawing.Utility.GetPoint(, prompt1)
    ' 使用上面输入的点作为基点
    endPnt = ThisDrawing.Utility.GetPoint(startPnt, prompt2)
    ' 使用输入的两个点创建一条直线
    ThisDrawing.ModelSpace.AddLine startPnt, endPnt
    ThisDrawing.Application.ZoomAll
End Sub


GetKeyword 方法

GetPoint 方法
提示用户输入
控制用户输入
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 提示用户输入 >
GetKeyword 方法

GetKeyword 方法提示用户在 AutoCAD 命令提示下输入关键字。该方法只接收一个参数，即提示字符串。关键字和输入参数是通过调用 InitializeUserInput 方法来定义的。

从 AutoCAD 命令行获取用户输入的关键字

以下样例通过将 InitializeUserInput 的第一个参数设置为 1，来强制用户输入关键字，但不能使用 NULL 输入（按 ENTER 键）。第二个参数将建立有效关键字列表。

Sub Ch3_KeyWord()
    Dim keyWord As String
    ThisDrawing.Utility.InitializeUserInput 1, "Line Circle Arc"
    keyWord = ThisDrawing.Utility.GetKeyword _
              (vbCrLf & "Enter an option (Line/Circle/Arc): ")
    MsgBox keyWord, , "GetKeyword Example"
End Sub

更加易用的关键字提示可以在用户按 ENTER 键（NULL 输入）时提供默认值。请注意下面样例中的微小修改：

Sub Ch3_KeyWord2()
    Dim keyWord As String
    ThisDrawing.Utility.InitializeUserInput 0, "Line Circle Arc"
    keyWord = ThisDrawing.Utility.GetKeyword _
              (vbCrLf & "Enter an option (Line/Circle/<Arc>): ")
    If keyWord = "" Then keyWord = "Arc"
    MsgBox keyWord, , "GetKeyword Example"
End Sub


控制用户输入

GetKeyword 方法
提示用户输入
访问 AutoCAD 命令行
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 > 提示用户输入 >
控制用户输入

使用 InitializeUserInput 方法可以定义关键字或将输入类型限制为用户输入方法。其使用和参数值类似于 AutoLISP 的 initget 函数。InitializeUserInput 可与以下方法一起使用：GetAngle、GetCorner、GetDistance、GetInteger、GetKeyword、GetOrientation、GetPoint 和 GetReal。InitializeUserInput 不能与 GetString 方法一起使用。当用户输入方法没有返回字符串值时，可以使用 GetInput 方法检索字符串值（关键字或任意输入）。

InitializeUserInput 方法接收两个参数。第一个参数是按位编码的整数值，用于确定用户输入方法的输入选项；第二个参数是定义有效关键字的字符串。

从 AutoCAD 命令行获取用户输入的整数值或关键字

下面的样例提示用户输入正数、非负整数值或关键字：

Sub Ch3_UserInput()
    ' InitializeUserInput (6) 的第一个参数
    ' 将输入限制为正数和非负数
    ' 值，第二个参数是有效
    ' 关键字的列表。
    ThisDrawing.Utility.InitializeUserInput 6, "Big Small Regular"
    ' 设置提示字符串变量
    Dim promptStr As String
    promptStr = vbCrLf & "Enter the size or (Big/Small/<Regular>):"
    ' 在 GetInteger 提示下，输入关键字
    ' 或按 ENTER 键而没有输入值将产生错误。为允许
    ' 应用程序继续并且检查错误
    ' 信息，必须将错误处理程序设置为在错误发生后恢复执行。
    On Error Resume Next
    ' 获取用户输入的值
    Dim returnInteger As Integer
    returnInteger = ThisDrawing.Utility.GetInteger(promptStr)
    ' 检查错误。如果错误编号与下面显示的
    ' 编号之一匹配，则使用 GetInput 获取返回的
    ' 字符串；否则，使用 returnInteger 的值。
    If Err.Number = -2145320928 Then
        Dim returnString As String
        Debug.Print Err.Description
        returnString = ThisDrawing.Utility.GetInput()
        If returnString = "" Then ' 按 ENTER 键返回空字符串
            returnString = "Regular" ' 设置为默认
        End If
        Err.Clear
    Else ' 否则，
        returnString = returnInteger ' 使用输入的值
    End If
    ' 显示结果
    MsgBox returnString, , "InitializeUserInput Example"
End Sub


访问 AutoCAD 命令行

控制用户输入
控制 AutoCAD 环境
在没有文档打开时使用
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
访问 AutoCAD 命令行

使用 SendCommand 方法可以直接将命令发送到 AutoCAD 命令行。SendCommand 方法将单个字符串发送到命令行。该字符串必须包含提供给所执行命令的参数，并依照该命令的提示顺序所要求的次序排列这些参数。在字符串中加入回车符的 ASCII 等效值或空格等同于在键盘上按 ENTER 键。与 AutoLISP 环境不同，调用 SendCommand 方法时没有参数是无效的。

将命令发送到 AutoCAD 命令行

下面的样例创建一个圆心为 (2, 2, 0)、半径为 4 的圆，然后将图形缩放至图形中的所有几何图形都可见。注意，在字符串的结尾处有一个空格，表示最后一次按 ENTER 键将开始执行命令。

Sub Ch3_SendACommandToAutoCAD()
   ThisDrawing.SendCommand "_Circle 2,2,0 4 "
   ThisDrawing.SendCommand "_zoom a "
End Sub


在没有文档打开时使用

访问 AutoCAD 命令行
控制 AutoCAD 环境
输入其他文件格式
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
在没有文档打开时使用

AutoCAD 通常在启动时会打开一个新的或现有文档。但也可以关闭当前任务中的所有文档。

如果关闭 AutoCAD 用户界面中的所有文档，应用程序窗口将发生一些改变。可用的菜单只剩下“文件”、“视图”、“窗口”和“帮助”。并且这些菜单中的可用选项也相应减少。此外还会注意到没有显示命令行。

与此类似，ActiveX 接口在没有文档打开时只允许执行以下操作：

  • 打开文档
  • 创建新文档
  • 输入文档
  • 用户可以退出 AutoCAD。

这些操作都可以从 Documents 集合中找到。在没有文档打开时，除了 Application 对象的一些有限方法和特性外，Documents 集合的方法和特性是唯一有效的可用接口。如果执行任何其他操作（例如试图访问用户选项），都会导致错误。

使用 Documents 集合中的 Count 特性可以确定 AutoCAD 是否处于零文档状态。如果 Documents.Count = 0，则 AutoCAD 处于零文档状态。如果 Documents.Count > 0，则至少打开了一个图形。

此外还要特别注意，当 AutoCAD 处于零文档态时，VBA 中不会定义 ThisDrawing 对象。这种情况是合理的，因为 ThisDrawing 通常是指活动的图形，而在零文档状态下没有图形处于打开状态。如果试图执行使用了 ThisDrawing 的宏，将导致运行错误。为避免此类错误，在没有文档打开时，请使用 VBA 的 GetObject 函数并指定 AutoCAD 的版本来获取与 AutoCAD 的连接。


输入其他文件格式

在没有文档打开时使用
控制 AutoCAD 环境
输出到其他文件格式
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
输入其他文件格式

可以用指定格式打开并使用其他应用程序的图形或图像。AutoCAD 可以处理图形交换格式 (DXF)TM 、SAT 和 WMF 文件的某些转换格式。在所有版本中，都可以使用 Import 方法来输入文件。此方法需要输入三个值：要输入的文件的名称、图形中用于放置文件的插入点以及放置输入图形时使用的缩放比例。


输出到其他文件格式

输入其他文件格式
控制 AutoCAD 环境
创建和编辑 AutoCAD 图元
ActiveX/VBA 开发人员手册 > 控制 AutoCAD 环境 >
输出到其他文件格式

如果需要在其他应用程序中使用 AutoCAD 图形，可以使用 Export 方法将图形转换为特定格式。该方法可以将 AutoCAD 图形输出为 WMF、SAT、EPS、DXF 或 BMP 格式。Export 方法需要输入三个值：要创建的新文件的名称、新文件的扩展名和要输出的对象选择集。

输出为 WMF、SAT 或 BMP 格式时，必须提供非空的选择集，该选择集指定要从图形中输出的对象。如果没有指定选择集，则不会输出任何内容，并且会产生可捕获的无效参数错误。

输出为 EPS 和 DXF 格式时，Export 会忽略选择集参数，但仍需要提供该参数。对于这两种格式，会自动输出整个图形。

将图形输出为 DXF 文件，然后再将其输入

本例在当前图形中创建一个圆，然后将图形输出到名为 DXFExprt.DXF 的文件，最后打开一个新图形并输入该文件。注意，这里提供了一个空的选择集作为 Export 的参数。当输出 DXF 文件时，虽然 Export 方法会忽略选择集信息，但省略该参数将导致语法错误。

Sub Ch3_ImportingAndExporting()
    ' 创建圆用于直观显示
    Dim circleObj As AcadCircle
    Dim centerPt(0 To 2) As Double
    Dim radius As Double
    centerPt(0) = 2: centerPt(1) = 2: centerPt(2) = 0
    radius = 1
    Set circleObj = ThisDrawing.ModelSpace.AddCircle _
                    (centerPt, radius)
    ThisDrawing.Application.ZoomAll
    ' 创建空的选择集
    Dim sset As AcadSelectionSet
    Set sset = ThisDrawing.SelectionSets.Add("NEWSSET")
    ' 将当前图形输出到
    ' AutoCAD 临时文件目录下的 DXF 文件
    Dim tempPath As String
    Dim exportFile As String
    Const dxfname As String = "DXFExprt"
    tempPath = _
       ThisDrawing.Application.preferences.Files.TempFilePath
    exportFile = tempPath & dxfname
    ThisDrawing.Export exportFile, "DXF", sset
    ' 删除空的选择集
    ThisDrawing.SelectionSets.Item("NEWSSET").Delete
    ' 打开新图形
    ThisDrawing.Application.Documents.Add "acad.dwt"
    ' 定义输入
    Dim importFile As String
    Dim insertPoint(0 To 2) As Double
    Dim scalefactor As Double
    importFile = tempPath & dxfname & ".dxf"
    insertPoint(0) = 0: insertPoint(1) = 0: insertPoint(2) = 0
    scalefactor = 2#
    ' 输入文件
    ThisDrawing.Import importFile, insertPoint, scalefactor
    ThisDrawing.Application.ZoomAll
End Sub


创建和编辑 AutoCAD 图元

输出到其他文件格式
创建对象
ActiveX/VBA 开发人员手册 >
创建和编辑 AutoCAD 图元

用户可以创建各种各样的对象，范围从简单的直线、圆到复杂的样条曲线、椭圆和关联填充区域。通常，用户使用 Add 方法中的一种向模型空间添加对象，但也可以在图纸空间或在块中创建对象。

对象创建后，可以修改对象的图层、颜色和线型，还可以添加文字对图形加以注释。

本节内容

  • 创建对象
  • 使用选择集
  • 编辑对象
  • 使用图层、颜色和线型
  • 保存和恢复图层设置
  • 将文字添加到图形


创建对象

创建和编辑 AutoCAD 图元
创建和编辑 AutoCAD 图元
确定容器对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 >
创建对象

虽然在 AutoCAD® 中经常有多种不同的方法可以创建相同的图形对象，但是，ActiveX Automation 仅为每种对象提供一种创建方法。例如，在 AutoCAD 中创建圆有四种不同方法：(1) 通过指定圆心和半径、(2) 通过定义直径的两点、(3) 通过定义圆周的三点或 (4) 通过两个切点和一个半径。但是，ActiveX Automation 只提供了一种创建圆的方法：使用圆心和半径。

注意使用带有关键字 New 的 CreateObject 或 Dim 创建对象的 VB 和 VBA 方法只能用于创建 AutoCAD Application 对象。所有其他 AutoCAD 对象都必须使用 AutoCAD 接口中提供的 Add 或 Add<objectname> 方法创建。

本节内容

  • 确定容器对象
  • 创建直线
  • 创建曲线对象
  • 创建 Point 对象
  • 创建实体填充区域
  • 使用面域
  • 创建图案填充


确定容器对象

创建对象
创建对象
创建直线
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 >
确定容器对象

图形对象是在 ModelSpace 集合、PaperSpace 集合或 Block 对象中创建的。

ModelSpace 集合由 ModelSpace 特性返回，而 PaperSpace 集合由 PaperSpace 特性返回。

用户可以直接引用或通过用户定义的变量来引用这些对象。要直接引用对象，请将对象包含在调用层次结构中。例如，以下语句将在模型空间中添加一条直线：

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

要通过用户定义的变量来引用对象，请将变量定义为 AcadModelSpace 或 AcadPaperSpace 类型，然后将变量设置为活动文档的适当特性。下例定义两个变量，然后分别将其设置为等于当前模型空间和图纸空间：

Dim moSpace As AcadModelSpace
Dim paSpace As AcadPaperSpace
Set moSpace = ThisDrawing.ModelSpace
Set paSpace = ThisDrawing.PaperSpace

以下语句使用用户定义的变量在模型空间中添加一条直线：

Set lineObj = moSpace.AddLine(startPoint,endPoint)


创建直线

确定容器对象
创建对象
创建曲线对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 >
创建直线

直线是 AutoCAD 中最基本的对象。用户可以创建各种直线—单一直线、带圆弧和不带圆弧的多线段。通常，可以通过指定坐标点来绘制直线。默认线型是 CONTINUOUS（即连续的线），但还有许多线型使用点和短划。

要创建直线，请使用以下方法之一：

AddLine

通过两点创建直线。

AddLightweightPolyline

从顶点列表创建二维优化多段线。

AddMLine

创建多线。

AddPolyline

创建二维或三维多段线。

标准直线和多线都是在世界坐标系的 XY 平面上创建的，而多段线与优化多段线则是在对象坐标系 (OCS) 中创建的。关于转换 OCS 坐标的信息，请参见转换坐标。

创建多段线对象

本例使用 AddLightweightPolyline 方法创建一条分为两段的简单多段线，其端点坐标值分别是 (2,4)、(4,2) 和 (6,4)。

Sub Ch4_AddLightWeightPolyline()
    Dim plineObj As AcadLWPolyline
    Dim points(0 To 5) As Double
    ' 定义二维多段线的点
    points(0) = 2: points(1) = 4
    points(2) = 4: points(3) = 2
    points(4) = 6: points(5) = 4
    ' 在模型空间中创建一个优化多段线对象
    Set plineObj = ThisDrawing.ModelSpace. _
                   AddLightWeightPolyline(points)
    ThisDrawing.Application.ZoomAll
End Sub


创建曲线对象

创建直线
创建对象
创建 Point 对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 >
创建曲线对象

用户可以使用 AutoCAD 创建各种曲线对象，包括样条曲线、圆、圆弧和椭圆。所有的曲线都在当前 WCS 的 XY 平面上创建。

要创建曲线，请使用以下方法之一：

AddArc

给定圆心、半径、起点角度和端点角度来创建圆弧。

AddCircle

给定中心点和半径来创建圆。

AddEllipse

给定中心点、长轴上的一点和半径比例来创建椭圆。

AddSpline

创建二次或三次 NURBS（非一致有理 B 样条曲线）曲线。

创建 Spline 对象

本例使用三点 (0,0,0)、(5,5,0) 和 (10,0,0) 在模型空间中创建样条曲线。该样条曲线的起点切向和端点切向为 (0.5,0.5,0.0)。

Sub Ch4_CreateSpline()
    ' 本例在模型空间中创建样条曲线对象。
    ' 声明所需的变量
    Dim splineObj As AcadSpline
    Dim startTan(0 To 2) As Double
    Dim endTan(0 To 2) As Double
    Dim fitPoints(0 To 8) As Double
    ' 定义变量
    startTan(0) = 0.5: startTan(1) = 0.5: startTan(2) = 0
    endTan(0) = 0.5: endTan(1) = 0.5: endTan(2) = 0
    fitPoints(0) = 1: fitPoints(1) = 1: fitPoints(2) = 0
    fitPoints(3) = 5: fitPoints(4) = 5: fitPoints(5) = 0
    fitPoints(6) = 10: fitPoints(7) = 0: fitPoints(8) = 0
    ' 创建样条曲线
    Set splineObj = ThisDrawing.ModelSpace.AddSpline _
                        (fitPoints, startTan, endTan)
    ZoomAll
End Sub
有关样条曲线的详细信息，请参见 AutoCAD《ActiveX and VBA Reference》中的 Spline 对象和 AddSpline 方法的文档。


创建 Point 对象

创建曲线对象
创建对象
创建实体填充区域
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 >
创建 Point 对象

Point 对象非常有用，例如，可将 Point 对象用作捕捉的节点或者偏移对象的参考点。可以相对于屏幕或采用绝对单位来设置点的样式和大小。

PDMODE 和 PDSIZE 系统变量控制 Point 对象的外观。PDMODE 值 0、2、3 和 4 指定要通过点绘制的图形。值为 1 时表示不显示任何图形。

在上述值上加上 32、64 或 96 表示除了绘制通过点的图形以外，还在点的周围绘制形状：

PDSIZE 控制点图形的尺寸（PDMODE 值为 0 和 1 时除外）。如果设置为 0，则点图形的高度是图形区高度的 5%。正的 PDSIZE 值指定点图形的绝对尺寸。负值将解释为视口大小的百分比。重生成图形时将重新计算所有点的大小。

更改 PDMODE 和 PDSIZE 后，现有点的外观将在下次重新生成图形时改变。

要设置 PDMODE 和 PDSIZE，请使用 SetVariable 方法。

创建 Point 对象并更改其外观

下例在模型空间中创建坐标为 (5,5,0) 的 Point 对象，随后将更新 PDMODE 和 PDSIZE 系统变量。

Sub Ch4_CreatePoint()
    Dim pointObj As AcadPoint
    Dim location(0 To 2) As Double
    ' 定义点的位置
    location(0) = 5#: location(1) = 5#: location(2) = 0#
    ' 创建点
    Set pointObj = ThisDrawing.ModelSpace.AddPoint(location)
    ThisDrawing.SetVariable "PDMODE", 34
    ThisDrawing.SetVariable "PDSIZE", 1
    ZoomAll
End Sub


创建实体填充区域

创建 Point 对象
创建对象
使用面域
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 >
创建实体填充区域

用户可以创建用某种颜色填充的三角形和四边形的区域。要更快地得到结果，请在关闭 FILLMODE 系统变量时创建这些区域，然后再打开 FILLMODE 以填充完成的区域。

创建四边形实体填充区域时，第三点和第四点的次序将决定其形状。请比较下面的图解：

前两点定义了多边形的一条边。第三点定义在第二点的对角处。如果第四点设置为等于第三点，则会创建一个填充三角形。

要创建实体填充区域，请使用 AddSolid 方法。

有关填充实体的详细信息，请参见《用户手册》中的“创建实体填充区域”。

创建实体填充对象

下例使用坐标 (0,0,0)、(5,0,0)、(5,8,0) 和 (0,8,0) 在模型空间中创建四边形实体。

Sub Ch4_CreateSolid()
    Dim solidObj As AcadSolid
    Dim point1(0 To 2) As Double
    Dim point2(0 To 2) As Double
    Dim point3(0 To 2) As Double
    Dim point4(0 To 2) As Double
    ' 定义实体
    point1(0) = 0#: point1(1) = 0#: point1(2) = 0#
    point2(0) = 5#: point2(1) = 0#: point2(2) = 0#
    point3(0) = 5#: point3(1) = 8#: point3(2) = 0#
    point4(0) = 0#: point4(1) = 8#: point4(2) = 0#
    ' 在模型空间中创建实体对象
    Set solidObj = ThisDrawing.ModelSpace.AddSolid _
                   (point1, point2, point3, point4)
    ZoomAll
End Sub


使用面域

创建实体填充区域
创建对象
创建面域
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 >
使用面域

面域是用户从闭合形状（称为环）创建的二维闭合区域。环可以是一条曲线或一系列相连的曲线，这些曲线用不自交的边界在平面上定义一个区域。环可以是直线、优化多段线、圆、圆弧、椭圆、椭圆弧、样条曲线、三维面、宽线和实体的组合。组成环的对象必须是闭合的，或者是通过与其他对象共享端点而形成闭合的区域。所有这些对象还必须共面（在同一个平面上）。组成面域的环必须定义为对象的数组。

有关操作面域的详细信息，请参见《用户手册》中的“创建和合并区域（面域）”。

本节内容

  • 创建面域
  • 创建组合面域
  • 并集面域
  • 查找两个面域的交集


创建面域

使用面域
使用面域
创建组合面域
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 > 使用面域 >
创建面域

要创建面域，请使用 AddRegion 方法。这个方法会根据输入的曲线数组形成的各个闭合环来创建面域。AutoCAD 将闭合的二维和平面三维多段线转换为独立的面域，然后转换形成闭合平面环的多段线、直线和曲线。如果有两条以上的曲线共用一个端点，得到的面域可能是不确定的。所以，在使用 AddRegion 方法时，实际可能会创建多个面域。请使用变量来保留新创建的面域数组。

要计算创建的 Region 对象的总数，请使用 VBA 函数 UBound 和 LBound，如下面的示例：

UBound(objRegions) - LBound(objRegions) + 1

其中，objRegions 是包含 AddRegion 返回值的变量。此语句将会计算创建的面域总数。

创建简单面域

下例从一个圆创建面域。

Sub Ch4_CreateRegion()
    ' 定义保存面域边界
    ' 的数组。
    Dim curves(0 To 0) As AcadCircle
    ' 创建圆，用作
    ' 面域的边界。
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 2
    center(1) = 2
    center(2) = 0
    radius = 5#
    Set curves(0) = ThisDrawing.ModelSpace.AddCircle _
                    (center, radius)
    ' 创建面域
    Dim regionObj As Variant
    regionObj = ThisDrawing.ModelSpace.AddRegion(curves)
    ZoomAll
End Sub


创建组合面域

创建面域
使用面域
并集面域
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 > 使用面域 >
创建组合面域

可以通过查找面域或三维实体的差集、并集或交集来创建组合面域。然后可以拉伸或旋转组合面域以创建复杂的实体。要创建组合面域，请使用 Boolean 方法。

当从某个面域减去另一个面域时，需要从第一个面域调用 Boolean 方法。这是要从中减去其他面域的的面域。例如，要计算地板需要铺多少地毯，需要从地板空间的外部边界调用 Boolean 方法，并将不需要铺地毯的区域（如柱子和柜台）作为 Boolean 参数列表中的对象。

创建组合面域

Sub Ch4_CreateCompositeRegions()
    ' 创建两个圆，一个代表房间，
    ' 另一个代表房间中的柱子
    Dim RoomObjects(0 To 1) As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 4
    center(1) = 4
    center(2) = 0
    radius = 2#
    Set RoomObjects(0) = ThisDrawing.ModelSpace. _
                         AddCircle(center, radius)
    radius = 1#
    Set RoomObjects(1) = ThisDrawing.ModelSpace. _
                         AddCircle(center, radius)
    ' 从这两个圆创建一个面域
    Dim regions As Variant
    regions = ThisDrawing.ModelSpace.AddRegion(RoomObjects)
    ' 将面域复制到面域变量中以便使用
    Dim RoundRoomObj As AcadRegion
    Dim PillarObj As AcadRegion
    If regions(0).Area > regions(1).Area Then
        ' 第一个面域是房间
        Set RoundRoomObj = regions(0)
        Set PillarObj = regions(1)
    否则
        ' 第一个面域是柱子
        Set PillarObj = regions(0)
        Set RoundRoomObj = regions(1)
    End If
' 从地板空间减去柱子空间，
    ' 以获得表示地毯总面积的面域。
    RoundRoomObj.Boolean acSubtraction, PillarObj
    ' 使用 Area 特性确定出地毯的总面积
    MsgBox "The carpet area is: " & RoundRoomObj.Area
End Sub
使用 Area 特性查找结果面域的面积。


并集面域

创建组合面域
使用面域
查找两个面域的交集
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 > 使用面域 >
并集面域

要获得并集面域，可以调用 Boolean 方法并在操作中输入常量 acUnion，而不是输入 acSubtraction。用户可以按任意次序组合面域来形成并集面域。


查找两个面域的交集

并集面域
使用面域
创建图案填充
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 > 使用面域 >
查找两个面域的交集

要查找两个面域的交集，请使用常量 acIntersection。可以按任意次序组合面域来计算这些面域的交集。


创建图案填充

查找两个面域的交集
创建对象
创建 Hatch 对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 >
创建图案填充

图案填充可以使用某种图案来填充图形中的指定区域。

在创建图案填充时，不是在开始的时候指定要填充的区域。首先必须创建 Hatch 对象。完成后，可以指定外部环，这是图案填充最外面的边界。然后继续指定图案填充中可能存在的所有内部环。

有关操作图案填充的详细信息，请参见《用户手册》中的“填充图案和填充概述”。

本节内容

  • 创建 Hatch 对象
  • 关联图案填充
  • 指定填充图案的类型和名称
  • 定义图案填充边界


创建 Hatch 对象

创建图案填充
创建图案填充
关联图案填充
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 > 创建图案填充 >
创建 Hatch 对象

创建 Hatch 对象时，需要指定填充图案类型、填充图案名和关联性。一旦创建 Hatch 对象，就无法再更改其关联性。

要创建 Hatch 对象，请使用 AddHatch 方法。


关联图案填充

创建 Hatch 对象
创建图案填充
指定填充图案的类型和名称
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 > 创建图案填充 >
关联图案填充

用户可以创建关联的或非关联的图案填充。关联的图案填充链接到它们的边界并且会在边界改变时自动更新，而非关联的图案填充则独立于它们的边界。

关联性只能在创建图案填充时设置。创建图案填充之后，用户可以解除关联，但是不能再次关联。

要使图案填充具有关联性，请将 AddHatch 方法的 Associativity 参数设置为 TRUE。要使图案填充成为非关联的，请将 AddHatch 方法的 Associativity 参数设置为 FALSE。


指定填充图案的类型和名称

关联图案填充
创建图案填充
定义图案填充边界
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 > 创建图案填充 >
指定填充图案的类型和名称

AutoCAD 提供了实体填充的五十多种行业标准填充图案。填充图案可用于亮显图形的特定特征或区域。例如，图案可以帮助区分三维对象的组成部分，或者表示组成对象的材质。

可以使用 AutoCAD 附带的图案或外部图案库中的图案。有关 AutoCAD 附带的填充图案表，请参见 AutoCAD《命令参考》。

要指定唯一的图案，用户必须在创建 Hatch 对象时输入图案的类型和名称。图案类型指定在何处查找图案名称。输入图案类型时，可以使用以下常量：

acHatchPatternTypePredefined

从 acad.pat 文件中定义的图案名中进行选择。

acHatchPatternTypeUserDefined

用当前线型定义直线图案。

acHatchPatternTypeCustomDefined

从 PAT（而不是 acad.pat）文件中选择图案名。

输入图案名称时，名称必须对由图案类型指定的文件有效。


定义图案填充边界

指定填充图案的类型和名称
创建图案填充
使用选择集
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 创建对象 > 创建图案填充 >
定义图案填充边界

创建 Hatch 对象之后，可以添加图案填充边界。边界可以是直线、圆弧、圆、二维多段线、椭圆、样条曲线和面域的任意组合。

添加的第一个边界必须是外边界，即用于定义图案填充最外面的边界。要添加外部边界，请使用 AppendOuterLoop 方法。

定义外边界后，可以继续添加内边界。使用 AppendInnerLoop 方法来添加内部边界。

内边界定义图案填充内的孤岛。Hatch 对象处理这些孤岛的方式取决于 HatchStyle 特性的设置。HatchStyle 特性可以设置为以下状态：

图案填充样式定义
HatchStyle | 状态 | 说明
 | Normal | 指定标准的样式，即普通。此选项从最外面的区域边界向内进行图案填充。如果 AutoCAD 遇到内部边界，将停止填充，直到遇到另一个内部边界。这是 HatchStyle 特性的默认设置。
 | Outer | 仅填充最外面的区域。此样式也是从最外面的区域边界向内进行图案填充，但是遇到内部边界时会关闭图案填充并且不再打开。
 | Ignore | 忽略内部结构。此选项使图案填充通过所有的内部对象。

定义完图案填充之后，必须先对其进行计算，然后才能显示。请使用 Evaluate 方法完成此任务。

创建 Hatch 对象

本例在模型空间中创建关联的图案填充。创建图案填充后，可以修改与图案填充关联的圆的大小。图案填充将自动改变以匹配圆的当前大小。

Sub Ch4_CreateHatch()
    Dim hatchObj As AcadHatch
    Dim patternName As String
    Dim PatternType As Long
    Dim bAssociativity As Boolean
    ' 定义图案填充
    patternName = "ANSI31"
    PatternType = 0
    bAssociativity = True
    ' 创建关联的 Hatch 对象
    Set hatchObj = ThisDrawing.ModelSpace.AddHatch _
                   (PatternType, patternName, bAssociativity)
    ' 创建图案填充的外边界。（一个圆）
    Dim outerLoop(0 To 0) As AcadEntity
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 3: center(1) = 3: center(2) = 0
    radius = 1
    Set outerLoop(0) = ThisDrawing.ModelSpace. _
                       AddCircle(center, radius)
    ' 向 Hatch 对象附加外边界，
    ' 并显示图案填充
    hatchObj.AppendOuterLoop (outerLoop)
    hatchObj.Evaluate
    ThisDrawing.Regen True
End Sub


使用选择集

定义图案填充边界
创建和编辑 AutoCAD 图元
创建选择集
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 >
使用选择集

选择集可以由单个对象组成，也可以是一个更复杂的编组：例如特定图层的对象集。

定义选择集分为两个步骤。首先，必须创建新的选择集并将其添加到 SelectionSets 集合。创建之后，接着把要处理的对象添加到选择集中。

本节内容

  • 创建选择集
  • 向选择集添加对象
  • 定义选择集的规则
  • 显示关于选择集的信息
  • 从选择集中删除对象


创建选择集

使用选择集
使用选择集
向选择集添加对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 >
创建选择集

要创建命名选择集，请使用 Add 方法。此方法仅需要一个参数—选择集的名称。

如果已存在同名的选择集，AutoCAD 将返回一条错误信息。删除不再需要的选择集是一种良好的编程习惯。使用 Delete 方法删除选择集，如下例所示：

ThisDrawing.SelectionSets.Item("NewSelectionSet").Delete

创建空的选择集

本例创建一个新的选择集。

Sub Ch4_CreateSelectionSet()
    Dim selectionSet1 As AcadSelectionSet
    Set selectionSet1 = ThisDrawing.SelectionSets. _
                        Add("NewSelectionSet")
End Sub


向选择集添加对象

创建选择集
使用选择集
定义选择集的规则
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 >
向选择集添加对象

用户可以使用以下任何一种方法向活动的选择集添加对象：

AddItems

向指定的选择集添加一个或多个对象。

Select

选择对象并将其放到活动的选择集中。用户可以选择所有对象、位于矩形区域内或与其相交的对象、位于多边形区域内或与其相交的对象、与选择栏相交的所有对象、最近创建的对象、上一个选择集中的对象、窗口内的对象，以及多边形窗口内的对象。

SelectAtPoint

选择穿过给定点的对象并将其放到活动的选择集中。

SelectByPolygon

选择位于选择栏内的对象并将其添加到活动的选择集中。

SelectOnScreen

提示用户在屏幕上拾取的对象并将其添加到活动的选择集中。

向选择集添加选定的对象

本例提示用户选择对象，然后将这些对象添加到选择集中。

Sub Ch4_AddToASelectionSet()
    ' 创建新的选择集
    Dim sset As AcadSelectionSet
    Set sset = ThisDrawing.SelectionSets.Add("SS1")
    ' 提示用户选择对象
    ' 并将其添加到选择集中。
    ' 要完成选择，请按回车键。
    sset.SelectOnScreen
End Sub


定义选择集的规则

向选择集添加对象
使用选择集
使用过滤器列表来定义选择集规则
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 >
定义选择集的规则

用户可以使用过滤器列表按照特性或对象类型来限制选择集，例如，可以只复制电路板图形上的蓝色对象，或只复制某个图层上的对象。还可以在过滤器列表中组合选择条件，例如，仅当对象为蓝色的圆且位于特定图层上时，才通知 AutoCAD 将其包含在选择集中。可以为 Select、SelectAtPoint、SelectByPolygon 和 SelectOnScreen 方法指定过滤器列表。

注意过滤功能只能识别明确指定给对象的线型，而不能识别从图层继承的线型。

本节内容

  • 使用过滤器列表来定义选择集规则
  • 在选择集过滤器列表中指定多个条件
  • 增加过滤器列表条件的复杂程度
  • 在选择集过滤器条件中使用通配符模式
  • 过滤外部数据


使用过滤器列表来定义选择集规则

定义选择集的规则
定义选择集的规则
在选择集过滤器列表中指定多个条件
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 > 定义选择集的规则 >
使用过滤器列表来定义选择集规则

过滤器列表由成对的参数组成。第一个参数标识过滤器的类型（例如对象），第二个参数指定要过滤的值（例如圆）。过滤器类型是指定使用哪种过滤器的 DXF 组码。下面列出了一些最常用的过滤器类型。

常用过滤器的 DXF 组码
DXF 组码 | 过滤器类型
0 | 对象类型（字符串） 例如“Line”、“Circle”、“Arc”等。
2 | 对象名（字符串） 命名对象的表（给定）名称。
8 | 图层名（字符串） 例如“Layer 0。”。
60 | 对象可见性（整数） 使用 0 = 可见，1 = 不可见。
62 | 颜色编号（整数） 范围 0 到 256 内的数字索引值。 零表示 BYBLOCK。256 表示 BYLAYER。负值表示图层被关闭。
67 | 模型/图纸空间标识符（整数） 使用 0 或省略 = 模型空间，1 = 图纸空间。

有关 DXF 组码的完整列表，请参见《DXF 参考手册》中的“组码值类型”。

过滤器参数声明为数组，过滤器类型声明为整数，过滤器值声明为变量。每个过滤器类型都必须与过滤器值成对出现。例如：

FilterType(0) = 0 ' 表示过滤器是对象类型
FilterData(0) = "Circle" ' 表示对象类型是“Circle”

为选择集指定单一选择条件

以下代码提示用户选择要包含在选择集中的对象，但仅当选择的对象是 Circle 时才将其添加到选择集中：

Sub Ch4_FilterMtext()
   Dim sstext As AcadSelectionSet
   Dim FilterType(0) As Integer
   Dim FilterData(0) As Variant
   Set sstext = ThisDrawing.SelectionSets.Add("SS2")
   FilterType(0) = 0
   FilterData(0) = "Circle"
   sstext.SelectOnScreen FilterType, FilterData
End Sub


在选择集过滤器列表中指定多个条件

使用过滤器列表来定义选择集规则
定义选择集的规则
增加过滤器列表条件的复杂程度
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 > 定义选择集的规则 >
在选择集过滤器列表中指定多个条件

要指定多个选择条件，声明的数组应该包含足够多的元素来表示每个条件，并且将每个条件指定给一个元素。

选择符合三个条件的对象

以下代码指定了两个标准：对象必须是圆，并且必须在图层 0 上。代码将 FilterType 和 FilterData 声明为两个元素的数组，并将每个条件指定给一个元素：

Sub Ch4_FilterBlueCircleOnLayer0()
   Dim sstext As AcadSelectionSet
   Dim FilterType(1) As Integer
   Dim FilterData(1) As Variant
   Set sstext = ThisDrawing.SelectionSets.Add("SS4")
   FilterType(0) = 0
   FilterData(0) = "Circle"
   FilterType(1) = 8
   FilterData(1) = "0"
   sstext.SelectOnScreen FilterType, FilterData
End Sub


增加过滤器列表条件的复杂程度

在选择集过滤器列表中指定多个条件
定义选择集的规则
在选择集过滤器条件中使用通配符模式
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 > 定义选择集的规则 >
增加过滤器列表条件的复杂程度

如果指定多个选择条件，AutoCAD 将假设选定对象必须符合所有条件。但用户可以按照其他方式来指定条件。对于数字项，用户可以指定关系运算（例如，圆的半径必须大于或等于 5.0）；对于所有项，用户可以指定逻辑运算（例如 Text 或 Mtext）。

使用 -4 DXF 组码来指示过滤器规格中的关系运算符。以字符串的形式来指定运算符。下表显示了可以使用的关系运算符：

选择集过滤器列表的关系运算符
运算符 | 说明
"*" | 任何情况（总为真）
"=" | 相等
"!=" | 不等于
"/=" | 不等于
"<>" | 不等于
"<" | 小于
"<=" | 小于或等于
">" | 大于
">=" | 大于或等于
"&" | 按位 AND（仅限于整数组）
"&=" | 按位屏蔽相等（仅限于整数组）

过滤器列表中的逻辑运算符也由 -4 组代码表示，运算符为字符串，但必须组对。运算符以小于号开始 (<)，以大于号结束 (>)。下表列出了可以在选择集过滤中使用的逻辑运算符。

选择集过滤器列表的逻辑编组运算符
开始 运算符 | 包含的内容 | 结束 运算符
"<AND" | 一个或多个运算对象 | "AND>"
"<OR" | 一个或多个运算对象 | "OR>"
"<XOR" | 两个运算对象 | "XOR>"
"<NOT" | 一个运算对象 | "NOT>"

选择半径大于或等于 5.0 的圆

以下代码指定选择半径大于或等于 5.0 的圆：

Sub Ch4_FilterRelational()
   Dim sstext As AcadSelectionSet
   Dim FilterType(2) As Integer
   Dim FilterData(2) As Variant
   Set sstext = ThisDrawing.SelectionSets.Add("SS5")
   FilterType(0) = 0
   FilterData(0) = "Circle"
   FilterType(1) = -4
   FilterData(1) = ">="
   FilterType(2) = 40
   FilterData(2) = 5#
   sstext.SelectOnScreen FilterType, FilterData
End Sub
选择 Text 或 Mtext
下例指定选择 Text 或 Mtext 对象：
Sub Ch4_FilterOrTest()
   Dim sstext As AcadSelectionSet
   Dim FilterType(3) As Integer
   Dim FilterData(3) As Variant
   Set sstext = ThisDrawing.SelectionSets.Add("SS6")
   FilterType(0) = -4
   FilterData(0) = "<or"
   FilterType(1) = 0
   FilterData(1) = "TEXT"
   FilterType(2) = 0
   FilterData(2) = "MTEXT"
   FilterType(3) = -4
   FilterData(3) = "or>"
   sstext.SelectOnScreen FilterType, FilterData
End Sub


在选择集过滤器条件中使用通配符模式

增加过滤器列表条件的复杂程度
定义选择集的规则
过滤外部数据
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 > 定义选择集的规则 >
在选择集过滤器条件中使用通配符模式

过滤器列表中的符号名称和字符串可以包含通配符模式。

下表显示了 AutoCAD 能够识别的通配符以及每个通配符在上下文字符串中的含义：

通配符
字符 | 定义
#（磅值符号） | 匹配任意一个数字
@（在符号） | 匹配任意一个字母
.（句点） | 匹配任意一个非字母数字的字符
*（星号） | 匹配任何字符顺序（包括空字符），可用于搜索模式中的任何位置：在开头、在中间或在结尾
?（问号） | 匹配任意一个字符
~（波浪号） | 如果它是模式中的的第一个字符，则匹配除此模式以外的任意内容
[...] | 匹配方括号中的任意一个字符
[~...] | 匹配不在方括号中的任意一个字符
-（连字符） | 用在方括号中，指定一个字符的取值范围
,（逗号） | 分隔两个模式
`（反引号） | 避开特殊的字符（直接读取下一个字符）

使用单引号 (`) 表示下一个字符不是通配符，而是普通字符。例如，要指定仅将命名为“*U2”的匿名块包含在选择集中，请使用以下过滤器参数：

FilterType(0) = 2
FilterData(0) = "`*U2"

选择包含指定词语的 Mtext

以下代码将选择条件定义为选择所有文字字符串中出现“The”的多行文字。本例还说明了 SelectByPolygon 选择方法的用法：

Sub Ch4_FilterPolygonWildcard()
   Dim sstext As AcadSelectionSet
   Dim FilterType(1) As Integer
   Dim FilterData(1) As Variant
   Dim pointsArray(0 To 11) As Double
   Dim mode As Integer
   mode = acSelectionSetWindowPolygon
   pointsArray(0) = -12#: pointsArray(1) = -7#: pointsArray(2) = 0
   pointsArray(3) = -12#: pointsArray(4) = 10#: pointsArray(5) = 0
   pointsArray(6) = 10#: pointsArray(7) = 10#: pointsArray(8) = 0
   pointsArray(9) = 10#: pointsArray(10) = -7#: pointsArray(11) = 0
   Set sstext = ThisDrawing.SelectionSets.Add("SS10")
   FilterType(0) = 0
   FilterData(0) = "MTEXT"
   FilterType(1) = 1
   FilterData(1) = "*The*"
   sstext.SelectByPolygon mode, pointsArray, FilterType, FilterData
End Sub


过滤外部数据

在选择集过滤器条件中使用通配符模式
定义选择集的规则
显示关于选择集的信息
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 > 定义选择集的规则 >
过滤外部数据

外部应用程序可以向 AutoCAD 对象附加数据，例如文字字符串、数值、三维点、距离和图层名。这种数据称为外部数据或外部数据。用户可以过滤包含指定的应用程序外部数据的图元。

关于外部数据的详细信息，请参见过滤外部数据。

选择包含外部数据的圆

下例将通过过滤查找出包含通过“MY_APP”应用程序添加的外部数据的圆：

Sub Ch4_FilterXdata()
   Dim sstext As AcadSelectionSet
   Dim mode As Integer
   Dim pointsArray(0 To 11) As Double
   mode = acSelectionSetWindowPolygon
   pointsArray(0) = -12#: pointsArray(1) = -7#: pointsArray(2) = 0
   pointsArray(3) = -12#: pointsArray(4) = 10#: pointsArray(5) = 0
   pointsArray(6) = 10#: pointsArray(7) = 10#: pointsArray(8) = 0
   pointsArray(9) = 10#: pointsArray(10) = -7#: pointsArray(11) = 0
   Dim FilterType(1) As Integer
   Dim FilterData(1) As Variant
   Set sstext = ThisDrawing.SelectionSets.Add("SS9")
   FilterType(0) = 0
   FilterData(0) = "Circle"
   FilterType(1) = 1001
   FilterData(1) = "MY_APP"
   sstext.SelectByPolygon mode, pointsArray, FilterType, FilterData
End Sub


显示关于选择集的信息

过滤外部数据
使用选择集
从选择集中删除对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 >
显示关于选择集的信息

请使用名称来引用已知的现有选择集。下例引用名为“SS10”的选择集：

Sub GetObjInSet()
  Dim selset As AcadSelectionSet
  Set selset = ThisDrawing.SelectionSets("SS10")
  MsgBox ("Selection set " & selset.Name & " contains " & _
    selset.Count & " items")
End Sub
图形中的每个选择集都是 SelectionSets 集合的成员。可以使用 For Each 语句遍历图形的 SelectionSets 集合，并收集有关每个选择集的信息。
显示图形中每个选择集的名称
以下代码显示图形中每个选择集的名称，同时列出其包含的对象的类型：
Sub ListSelectionSets()
  Dim selsetCollection As AcadSelectionSets
  Dim selset As AcadSelectionSet
  Dim ent As Object
  Dim i, j As Integer
  Set selsetCollection = ThisDrawing.SelectionSets
  ' 查找图形中的每个选择集
  i = 0
  For Each selset In selsetCollection
    MsgBox "Selection set " & CStr(i) & " is: " & selset.Name
    ' 现在查找选择集中的每个对象，同时显示其类型
    j = 0
    For Each ent In selset
       MsgBox "Item " & CStr(j + 1) & " in " & selset.Name _
         & "is: " & ent.EntityName
       j = j + 1
    Next
    i = i + 1
  Next
End Sub


从选择集中删除对象

显示关于选择集的信息
使用选择集
编辑对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用选择集 >
从选择集中删除对象

创建选择集之后，用户可以选择从中删除个别对象或所有对象。例如，可以先选择整组的紧密编组对象，然后删除组内的特定对象，只留下要保留在选择集中的对象。

使用以下方法从选择集中删除项：

RemoveItems

RemoveItems 方法从选择集中删除一个或多个项。删除的项仍然存在于图形中，但不再包含在选择集中。

Clear

Clear 方法将清空选择集。选择集仍然存在，但不再包含任何项。原来包含在选择集中的项仍然存在于图形中，但不再包含在选择集中。

Erase

Erase 方法删除选择集中的所有项。选择集仍然存在，但不再包含任何项。原来包含在选择集中的项也不再存在。

Delete

Delete 方法删除选择集和其中的所有项。调用 Delete 方法之后，选择集和原来包含在选择集中的项都将不再存在。


编辑对象

从选择集中删除对象
创建和编辑 AutoCAD 图元
使用命名对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 >
编辑对象

要修改现有的对象，可以使用与该对象关联的方法和特性。如果修改图形对象的可见特性，请使用 Update 方法来重画屏幕上的对象。

本节介绍如何编辑二维对象。

本节内容

  • 使用命名对象
  • 复制对象
  • 偏移对象
  • 镜像对象
  • 阵列对象
  • 移动对象
  • 旋转对象
  • 删除对象
  • 缩放对象
  • 变换对象
  • 延伸和修剪对象
  • 分解对象
  • 编辑多段线
  • 编辑样条曲线
  • 编辑图案填充


使用命名对象

编辑对象
编辑对象
清理命名对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
使用命名对象

除了 AutoCAD 所使用的图形对象之外，图形文件中还保存了几种非图形对象。这些对象都具有描述性的名称，例如块、图层、编组和标注样式。在大多数情况下，是在创建对象时命名对象，以后再重命名。名称存储在符号表中。在指定命名对象时，将引用符号表中该对象的名称和关联数据。

本节内容

  • 清理命名对象
  • 重命名对象


清理命名对象

使用命名对象
使用命名对象
重命名对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 > 使用命名对象 >
清理命名对象

在编辑任务期间，用户可以随时清理图形中无用的、未被引用的命名对象。清理可以缩小图形的大小。不能清理被其他对象引用的对象。例如，字体文件可能被文字样式引用，图层可能被图层上的对象引用。

要清理图形，请使用 PurgeAll 方法，如下所示：

ThisDrawing.PurgeAll


重命名对象

清理命名对象
使用命名对象
复制对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 > 使用命名对象 >
重命名对象

图形变得比较复杂时，用户可以重命名对象，使名称有针对性或者避免与用户插入主图形的其他图形中的名称相冲突。

用户可以重命名任何命名对象，但 AutoCAD 默认的命名对象（例如图层 0 或 CONTINUOUS 线型）除外。

名称最长可以包含 255 个字符。除了字母和数字之外，名称中还可以包含空格（虽然 AutoCAD 会删除名称前后的空格）以及 Microsoft Windows 或 AutoCAD 未用作其他用途的任何特殊字符。不能使用的特殊字符包括小于号和大于号 (< >)、正斜杠和反斜杠 (/ \)、引号 (")、冒号 (:)、分号 (;)、问号 (?)、逗号 (,) 星号 (*)、竖线 (|)、等号 (=) 和单引号 (')。也不能使用以 Unicode 字体创建的特殊字符。

要重命名对象，请使用该对象的 Name 特性。

重命名图层

本例创建称为“NewLayer”的图层，然后将该图层重命名为“MyLayer”。

Sub Ch4_RenamingLayer()
    ' 创建图层
    Dim layerObj As AcadLayer
    Set layerObj = ThisDrawing.Layers.Add("NewLayer")
    ' 更改图层的名称
    layerObj.Name = "MyLayer"
End Sub


复制对象

重命名对象
编辑对象
将对象复制到同一个位置
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
复制对象

用户可以在当前图形中复制一个或多个对象。偏移功能可以在距选定对象的指定距离处或通过指定点创建新对象；镜像功能可以在指定的镜像线处创建对象的镜像图像；阵列功能可以在矩形或圆形的图案中创建一组复制对象。

有关复制对象的详细信息，请参见《用户手册》中的“复制、偏移或镜像对象”。

注意在遍历集合时，不能执行任何一种复制方法。遍历将以只读方式打开工作空间，而这些复制方法则试图执行读写操作。在调用这些方法之前，请先完成所有的集合遍历。

本节内容

  • 将对象复制到同一个位置
  • 复制多个对象


将对象复制到同一个位置

复制对象
复制对象
复制多个对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 > 复制对象 >
将对象复制到同一个位置

要复制单个对象，请使用该对象的 Copy 方法。此方法可以创建一个与原始对象完全相同的新对象。新对象的位置与原始对象的位置相同，而且由该方法返回。


复制多个对象

将对象复制到同一个位置
复制对象
偏移对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 > 复制对象 >
复制多个对象

要复制多个对象，请使用 CopyObjects 方法，或者创建一组对象与 Copy 方法配合使用。（要复制选择集中的对象，请遍历选择集并将对象保存到数组中。）遍历数组，分别复制每个对象，然后将新创建的对象收集到第二个数组中。

要将多个对象复制到不同的图形，请使用 CopyObjects 方法并将 Owner 参数设置为图形的模型空间。

复制两个 Circle 对象

本例创建两个 Circle 对象并使用 CopyObjects 方法创建圆的副本。

Sub Ch4_CopyCircleObjects()
    Dim DOC1 As AcadDocument
    Dim circleObj1 As AcadCircle
    Dim circleObj2 As AcadCircle
    Dim circleObj1Copy As AcadCircle
    Dim circleObj2Copy As AcadCircle
    Dim centerPoint(0 To 2) As Double
    Dim radius1 As Double
    Dim radius2 As Double
    Dim radius1Copy As Double
    Dim radius2Copy As Double
    Dim objCollection(0 To 1) As Object
    Dim retObjects As Variant
    ' 定义 Circle 对象
    centerPoint(0) = 0: centerPoint(1) = 0: centerPoint(2) = 0
    radius1 = 5#: radius2 = 7#
    radius1Copy = 1#: radius2Copy = 2#
       ' 创建新图形
    Set DOC1 = ThisDrawing.Application.Documents.Add
    ' 向图形中添加两个圆
    Set circleObj1 = DOC1.ModelSpace.AddCircle _
                     (centerPoint, radius1)
    Set circleObj2 = DOC1.ModelSpace.AddCircle _
                     (centerPoint, radius2)
    ZoomAll
    ' 将要复制的对象设置成
    ' 与 CopyObjects 兼容的形式
    Set objCollection(0) = circleObj1
    Set objCollection(1) = circleObj2
    ' 复制对象并取回新对象（副本）
    ' 的集合
    retObjects = DOC1.CopyObjects(objCollection)
    ' 获取新创建的对象并
    ' 对副本应用新的特性
    Set circleObj1Copy = retObjects(0)
    Set circleObj2Copy = retObjects(1)
    circleObj1Copy.radius = radius1Copy
    circleObj1Copy.Color = acRed
    circleObj2Copy.radius = radius2Copy
    circleObj2Copy.Color = acRed
    ZoomAll
End Sub
将对象复制到另一个图形
本例创建 Circle 对象，然后使用 CopyObjects 方法将圆复制到新的图形中。
Sub Ch4_Copy_to_New_Drawing()
    Dim DOC0 As AcadDocument
    Dim circleObj1 As AcadCircle, circleObj2 As AcadCircle
    Dim centerPoint(0 To 2) As Double
    Dim radius1 As Double, radius2 As Double
    Dim radius1Copy As Double, radius2Copy As Double
    Dim objCollection(0 To 1) As Object
    Dim retObjects As Variant
    ' 定义 Circle 对象
    centerPoint(0) = 0: centerPoint(1) = 0: centerPoint(2) = 0
    radius1 = 5#: radius2 = 7#
    radius1Copy = 1#: radius2Copy = 2#
    ' 向当前图形中添加两个圆
    Set circleObj1 = ThisDrawing.ModelSpace.AddCircle _
                    (centerPoint, radius1)
    Set circleObj2 = ThisDrawing.ModelSpace.AddCircle _
                    (centerPoint, radius2)
    ThisDrawing.Application.ZoomAll
    ' 保存指向当前图形的指针
    Set DOC0 = ThisDrawing.Application.ActiveDocument
    ' 复制对象
    '
    ' 将要复制的对象设置为
    ' 与 CopyObjects 兼容的形式
    Set objCollection(0) = circleObj1
    Set objCollection(1) = circleObj2
    ' 创建新的图形并指向其模型空间
    Dim Doc1MSpace As AcadModelSpace
    Dim DOC1 As AcadDocument
    Set DOC1 = Documents.Add
    Set Doc1MSpace = DOC1.ModelSpace
    ' 将对象复制到新图形的模型空间。A
    ' 返回新（复制的）对象的集合。
    retObjects = DOC0.CopyObjects(objCollection, Doc1MSpace)
    Dim circleObj1Copy As AcadCircle, circleObj2Copy As AcadCircle
    ' 获取新创建的对象集合并
    ' 对副本应用新的特性
    Set circleObj1Copy = retObjects(0)
    Set circleObj2Copy = retObjects(1)
    circleObj1Copy.radius = radius1Copy
    circleObj1Copy.Color = acRed
    circleObj2Copy.radius = radius2Copy
    circleObj2Copy.Color = acRed
    ThisDrawing.Application.ZoomAll
    MsgBox "Circles copied."
End Sub


偏移对象

复制多个对象
编辑对象
镜像对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
偏移对象

偏移对象可以在距原始对象的指定偏移距离处创建新的对象。可以偏移圆弧、圆、椭圆、直线、优化多段线、多段线、样条曲线和构造线。

要偏移对象，请使用该对象的 Offset 方法。这个方法只需要输入一个值：偏移对象的距离。如果此距离为负，则 AutoCAD 会将其解释为一段用于生成“更小”曲线的偏移；即对于圆弧来说，将偏移到小于起始曲线的半径给定距离的半径。如果“更小”没有意义，则 AutoCAD 将在更小的 X,Y,Z WCS 坐标方向上偏移。如果偏移距离无效，将返回错误。

对于许多对象，此操作的结果是一条新的曲线（可能与原始曲线的类型不同）。例如，偏移椭圆会形成样条曲线，因为结果的确符合椭圆的表达式。在某些情况下，偏移结果可能会形成若干条曲线。因此，该方法会返回新的对象或对象数组（作为变量）。

有关偏移对象的详细信息，请参见《用户手册》中的“复制、偏移或镜像对象”。

偏移多段线

本例创建一条优化多段线，然后偏移该多段线。

Sub Ch4_OffsetPolyline()
    ' 创建多段线
    Dim plineObj As AcadLWPolyline
    Dim points(0 To 11) As Double
    points(0) = 1: points(1) = 1
    points(2) = 1: points(3) = 2
    points(4) = 2: points(5) = 2
    points(6) = 3: points(7) = 2
    points(8) = 4: points(9) = 4
    points(10) = 4: points(11) = 1
    Set plineObj = ThisDrawing.ModelSpace. _
                   AddLightWeightPolyline(points)
    plineObj.Closed = True
    ZoomAll
    ' 偏移多段线
    Dim offsetObj As Variant
    offsetObj = plineObj.Offset(0.25)
ZoomAll
End Sub


镜像对象

偏移对象
编辑对象
阵列对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
镜像对象

镜像可以绕着轴或镜像线创建对象的镜像图像副本。可以镜像所有图形对象。

要镜像对象，请使用该对象的 Mirror 方法。这个方法需要输入两个坐标值。这两个指定的坐标值成为镜像线的端点，然后绕这条线镜像基础对象。在三维中，这条线会形成垂直于 UCS 的 XY 平面的镜像平面并包含镜像线。

与 AutoCAD 中的 mirror 命令不同，此方法将反射的图像放置在图形中并保留原对象。（要删除原来的对象，请使用 Erase 方法。）

要管理 Text 对象的反射特性，请使用 MIRRTEXT 系统变量。MIRRTEXT 的默认设置为开 (1)，这将导致 Text 对象像其他对象一样也被镜像。当 MIRRTEXT 设置为关 (0) 时，不会镜像文字。使用 GetVariable 和 SetVariable 方法可以查询和设置 MIRRTEXT 设置。

用户可以在图纸空间中镜像 Viewport 对象，虽然这样做并不会影响其模型空间视图或模型空间对象。

有关镜像对象的详细信息，请参见《用户手册》中的“复制、偏移或镜像对象”。

绕轴镜像多段线

本例创建一条优化多段线，然后绕一个轴镜像该多段线。新创建的多段线会着上蓝色。

Sub Ch4_MirrorPolyline()
    ' 创建多段线
    Dim plineObj As AcadLWPolyline
    Dim points(0 To 11) As Double
    points(0) = 1: points(1) = 1
    points(2) = 1: points(3) = 2
    points(4) = 2: points(5) = 2
    points(6) = 3: points(7) = 2
    points(8) = 4: points(9) = 4
    points(10) = 4: points(11) = 1
    Set plineObj = ThisDrawing.ModelSpace. _
               AddLightWeightPolyline(points)
    plineObj.Closed = True
    ZoomAll
    ' 定义镜像轴
    Dim point1(0 To 2) As Double
    Dim point2(0 To 2) As Double
    point1(0) = 0: point1(1) = 4.25: point1(2) = 0
    point2(0) = 4: point2(1) = 4.25: point2(2) = 0
    ' 镜像多段线
    Dim mirrorObj As AcadLWPolyline
    Set mirrorObj = plineObj.Mirror(point1, point2)
    Dim col As New AcadAcCmColor
    Call col.SetRGB(125, 175, 235)
    mirrorObj.TrueColor = col
    ZoomAll
End Sub


阵列对象

镜像对象
编辑对象
创建环形阵列
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
阵列对象

用户可以按照环形阵列或矩形阵列来复制对象。对于环形阵列，可以控制对象的副本数目和填充阵列的角度；对于矩形阵列，可以控制行数和列数以及它们之间的距离。

有关阵列的详细信息，请参见《用户手册》中的“创建对象的阵列”。

本节内容

  • 创建环形阵列
  • 创建矩形阵列


创建环形阵列

阵列对象
阵列对象
创建矩形阵列
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 > 阵列对象 >
创建环形阵列

用户可以阵列所有图形对象。要创建环形阵列，请使用该对象的 ArrayPolar 方法。这个方法需要三个输入值：要创建的对象数目、填充角度和阵列的中心点。对象的数目必须是大于 1 的正整数。填充角度必须是弧度。正值指定逆时针旋转，负值指定顺时针旋转。如果角度等于 0 则返回错误。中心点是包含三个双精度数的变量阵列。这些双精度数用于指定环形阵列中心点的三维 WCS 坐标。

AutoCAD 确定从阵列中心点到原始对象上的参照点之间的距离。使用的参考点由对象类型决定。AutoCAD 使用圆或圆弧的圆心、块或形的插入点、文字的起点以及直线或宽线的一个端点作为参照点。

此方法不支持 AutoCAD ARRAY 命令的“复制时旋转”选项。

创建环形阵列

本例创建一个圆，然后对圆执行环形阵列操作。这个过程将围绕基点 (4,4,0)，在 180 度内创建四个圆。

Sub Ch4_ArrayingACircle()
    ' 创建圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 2#: center(1) = 2#: center(2) = 0#
    radius = 1
    Set circleObj = ThisDrawing.ModelSpace. _
                    AddCircle(center, radius)
    ZoomAll
    ' 定义环形阵列
    Dim noOfObjects As Integer
    Dim angleToFill As Double
    Dim basePnt(0 To 2) As Double
    noOfObjects = 4
    angleToFill = 3.14 ' 180 度
    basePnt(0) = 4#: basePnt(1) = 4#: basePnt(2) = 0#
    ' 下例通过绕点 (3,3,0) 旋转和
    ' 复制对象而创建四个
    ' 对象副本。
    Dim retObj As Variant
    retObj = circleObj.ArrayPolar _
             (noOfObjects, angleToFill, basePnt)
    ZoomAll
End Sub


创建矩形阵列

创建环形阵列
阵列对象
移动对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 > 阵列对象 >
创建矩形阵列

要创建二维或三维矩形阵列，请使用该对象的 ArrayRectangular 方法。这个方法需要输入四个值：行数、列数、行间距和列间距。在创建三维数组时，还需要指定层数以及层间距。

矩形阵列是通过将选择集中的对象复制适当的次数来构造的。如果行数为 1，则列数必须大于 1，反之亦然。

假设原始对象位于左下角，向右上生成阵列。如果行间距是负数，则会向下添加行。如果列间距是负数，则会向左添加列。

AutoCAD 沿当前捕捉旋转角度定义的基线生成矩形阵列。当前捕捉旋转角的默认值是 0，所以矩形阵列的行和列分别与 X 和 Y 图形轴正交。通过将捕捉旋转角设置为非零值，用户可以更改该角度并创建旋转的阵列。要完成此任务，请使用 SnapRotationAngle 特性。

创建矩形阵列

本例创建一个圆，然后对该圆执行矩形阵列操作，创建 5 行 5 列的圆。

Sub Ch4_ArrayRectangularExample()
    ' 创建圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 2#: center(1) = 2#: center(2) = 0#
    radius = 0.5
    Set circleObj = ThisDrawing.ModelSpace. _
                           AddCircle(center, radius)
    ZoomAll
    ' 定义矩形阵列
    Dim numberOfRows As Long
    Dim numberOfColumns As Long
    Dim numberOfLevels As Long
    Dim distanceBwtnRows As Double
    Dim distanceBwtnColumns As Double
    Dim distanceBwtnLevels As Double
    numberOfRows = 5
    numberOfColumns = 5
    numberOfLevels = 2
    distanceBwtnRows = 1
    distanceBwtnColumns = 1
    distanceBwtnLevels = 1
    ' 创建对象的阵列
    Dim retObj As Variant
    retObj = circleObj.ArrayRectangular _
        (numberOfRows, numberOfColumns, numberOfLevels, _
        distanceBwtnRows, distanceBwtnColumns, distanceBwtnLevels)
    ZoomAll
End Sub


移动对象

创建矩形阵列
编辑对象
沿矢量移动对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
移动对象

用户可以沿矢量移动对象而不改变对象的方向或大小，还可以绕基点旋转对象。

有关移动对象的详细信息，请参见《用户手册》中的“移动对象”。

本节内容

  • 沿矢量移动对象


沿矢量移动对象

移动对象
移动对象
旋转对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 > 移动对象 >
沿矢量移动对象

用户可以沿指定的矢量移动所有的图形对象和属性参考对象。

要移动对象，请使用该对象的 Move 方法。这个方法需要输入两个坐标值。这两个坐标值定义了位移矢量，指示给定对象移动的距离和方向。

沿矢量移动圆

本例创建一个圆，然后将此圆沿着 X 轴移动两个单位。

Sub Ch4_MoveCircle()
    ' 创建圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 2#: center(1) = 2#: center(2) = 0#
    radius = 0.5
    Set circleObj = ThisDrawing.ModelSpace. _
                    AddCircle(center, radius)
    ZoomAll
    ' 定义组成移动矢量的点。
    ' 移动矢量将圆沿 x 轴移动
    ' 两个单位。
    Dim point1(0 To 2) As Double
    Dim point2(0 To 2) As Double
    point1(0) = 0: point1(1) = 0: point1(2) = 0
    point2(0) = 2: point2(1) = 0: point2(2) = 0
    ' 移动圆
    circleObj.Move point1, point2
    circleObj.Update
End Sub


旋转对象

沿矢量移动对象
编辑对象
删除对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
旋转对象

用户可以旋转所有的图形对象和属性参考对象。

要旋转对象，请使用该对象的 Rotate 方法。这个方法需要输入一个基点和一个旋转角度。基点是由三个双精度数组成的变量数组。这些双精度数代表一个三维 WCS 坐标，用于指定旋转轴所通过的点。旋转角度则以弧度指定，此角度确定对象绕基点、相对于当前位置旋转的距离。

有关旋转对象的详细信息，请参见《用户手册》中的“旋转对象”。

绕基点旋转多段线

本例创建一条闭合的优化多段线，然后将该多段线绕基点 (4,4.25,0) 旋转 45 度。

Sub Ch4_RotatePolyline()
    ' 创建多段线
    Dim plineObj As AcadLWPolyline
    Dim points(0 To 11) As Double
    points(0) = 1: points(1) = 2
    points(2) = 1: points(3) = 3
    points(4) = 2: points(5) = 3
    points(6) = 3: points(7) = 3
    points(8) = 4: points(9) = 4
    points(10) = 4: points(11) = 2
    Set plineObj = ThisDrawing.ModelSpace. _
                   AddLightWeightPolyline(points)
    plineObj.Closed = True
    ZoomAll
    ' 定义绕点 (4,4.25,0) 旋转
    ' 45 度
    Dim basePoint(0 To 2) As Double
    Dim rotationAngle As Double
    basePoint(0) = 4: basePoint(1) = 4.25: basePoint(2) = 0
    rotationAngle = 0.7853981 ' 45 degrees
    ' 旋转多段线
    plineObj.Rotate basePoint, rotationAngle
    plineObj.Update
End Sub


删除对象

旋转对象
编辑对象
缩放对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
删除对象

用户可以使用 Delete 方法删除独立对象。

注意由于这些对象在类型库中的定义方式，ActiveX Automation 中的集合对象具有 Delete 方法。但是，不能删除集合对象（例如 ModelSpace 集合、Layers 集合和 Dictionaries 集合）。如果用户试图删除集合，会造成错误。

创建和删除多段线

本例创建一条优化多段线，然后将其删除。

Sub Ch4_DeletePolyline()
    ' 创建多段线
    Dim lwpolyObj As AcadLWPolyline
    Dim vertices(0 To 5) As Double
    vertices(0) = 2: vertices(1) = 4
    vertices(2) = 4: vertices(3) = 2
    vertices(4) = 6: vertices(5) = 4
    Set lwpolyObj = ThisDrawing.ModelSpace. _
                 AddLightWeightPolyline(vertices)
    ZoomAll
' 删除多段线
    lwpolyObj.Delete
    ThisDrawing.Regen acActiveViewport
End Sub


缩放对象

删除对象
编辑对象
变换对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
缩放对象

用户可以通过指定基点和长度（作为基于当前图形单位的缩放比例）来缩放对象。可以缩放所有的图形对象和属性参考对象。

要缩放对象，请使用该对象的 ScaleEntity 方法。这个方法在 X、Y 和 Z 方向等比缩放对象。它需要输入缩放的基点和缩放比例。基点是由三个双精度数组成的变量数组。这些双精度数代表开始缩放的点的三维 WCS 坐标。缩放比例是缩放对象时采用的系数，缩放时用对象的尺寸乘以缩放比例。缩放比例大于 1 时将放大对象，缩放比例大于 0 小于 1 时将缩小对象。

有关进行缩放的详细信息，请参见《用户手册》中的“调整对象的大小和形状”。

缩放多段线

本例创建一条闭合的优化多段线，然后以 0.5 的缩放比例调整该多段线。

Sub Ch4_ScalePolyline()
    ' 创建多段线
    Dim plineObj As AcadLWPolyline
    Dim points(0 To 11) As Double
    points(0) = 1: points(1) = 2
    points(2) = 1: points(3) = 3
    points(4) = 2: points(5) = 3
    points(6) = 3: points(7) = 3
    points(8) = 4: points(9) = 4
    points(10) = 4: points(11) = 2
    Set plineObj = ThisDrawing.ModelSpace. _
                      AddLightWeightPolyline(points)
    plineObj.Closed = True
    ZoomAll
    ' 定义缩放
    Dim basePoint(0 To 2) As Double
    Dim scalefactor As Double
    basePoint(0) = 4: basePoint(1) = 4.25: basePoint(2) = 0
    scalefactor = 0.5
    ' 缩放多段线
    plineObj.ScaleEntity basePoint, scalefactor
    plineObj.Update
End Sub


变换对象

缩放对象
编辑对象
延伸和修剪对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
变换对象

在给定 4 x 4 转换矩阵的情况下，可以使用 TransformBy 方法来移动、缩放或旋转对象。

下表说明了转换矩阵的配置，其中 R = 旋转，T = 平移：

转换矩阵配置
R00 | R01 | R02 | T0
R10 | R11 | R12 | T1
R20 | R21 | R22 | T2
0 | 0 | 0 | 1

要变换对象，首先需要初始化转换矩阵。下例显示了指定给变量 tMatrix 的转换矩阵，该矩阵将图元绕点 (0,0,0) 旋转 90 度：

tMatrix(0,0) = 0.0
tMatrix(0,1) = -1.0
tMatrix(0,2) = 0.0
tMatrix(0,3) = 0.0
tMatrix(1,0) = 1.0
tMatrix(1,1) = 0.0
tMatrix(1,2) = 0.0
tMatrix(1,3) = 0.0
tMatrix(2,0) = 0.0
tMatrix(2,1) = 0.0
tMatrix(2,2) = 1.0
tMatrix(2,3) = 0.0
tMatrix(3,0) = 0.0
tMatrix(3,1) = 0.0
tMatrix(3,2) = 0.0
tMatrix(3,3) = 1.0

完成转换矩阵之后，使用 TransformBy 方法将矩阵应用到对象。下面的代码行演示了如何将矩阵 (tMatrix) 应用到对象 (anObj)：

anObj.TransformBy tMatrix

使用转换矩阵旋转直线

本例创建一条直线，并使用转换矩阵将直线旋转 90 度。

Sub Ch4_TransformBy()
    ' 创建直线
    Dim lineObj As AcadLine
    Dim startPt(0 To 2) As Double
    Dim endPt(0 To 2) As Double
    startPt(0) = 2
    startPt(1) = 1
    startPt(2) = 0
    endPt(0) = 5
    endPt(1) = 1
    endPt(2) = 0
    Set lineObj = ThisDrawing.ModelSpace. _
                AddLine(startPt, endPt)
    ZoomAll
    ' 将 transMat 变量初始化为
    ' 转换矩阵，该矩阵将对象绕
    ' 点 (0,0,0) 旋转 90 度
    Dim transMat(0 To 3, 0 To 3) As Double
    transMat(0, 0) = 0#: transMat(0, 1) = -1#
    transMat(0, 2) = 0#: transMat(0, 3) = 0#
    transMat(1, 0) = 1#: transMat(1, 1) = 0#
    transMat(1, 2) = 0#: transMat(1, 3) = 0#
    transMat(2, 0) = 0#: transMat(2, 1) = 0#
    transMat(2, 2) = 1#: transMat(2, 3) = 0#
    transMat(3, 0) = 0#: transMat(3, 1) = 0#
    transMat(3, 2) = 0#: transMat(3, 3) = 1#
    ' 使用定义的转换矩阵来变换直线
    lineObj.TransformBy transMat
    lineObj.Update
End Sub
下面是转换矩阵的更多样例：
旋转矩阵：围绕点 (0, 0, 0) 旋转 90 度
0.0 | -1.0 | 0.0 | 0.0
1.0 | 0.0 | 0.0 | 0.0
0.0 | 0.0 | 1.0 | 0.0
0.0 | 0.0 | 0.0 | 1.0
旋转矩阵：围绕点 (5, 5, 0) 旋转 45 度
0.707107 | -0.707107 | 0.0 | 5.0
0.707107 | 0.707107 | 0.0 | -2.071068
0.0 | 0.0 | 1.0 | 0.0
0.0 | 0.0 | 0.0 | 1.0
转换矩阵：将图元移到 (10, 10, 0)
1.0 | 0.0 | 0.0 | 10.0
0.0 | 1.0 | 0.0 | 10.0
0.0 | 0.0 | 1.0 | 0.0
0.0 | 0.0 | 0.0 | 1.0
缩放矩阵：在点 (0, 0, 0) 上按 10,10 进行缩放
10.0 | 0.0 | 0.0 | 0.0
0.0 | 10.0 | 0.0 | 0.0
0.0 | 0.0 | 10.0 | 0.0
0.0 | 0.0 | 0.0 | 1.0
缩放矩阵：在点 (2, 2, 0) 上按 10,10 进行缩放
10.0 | 0.0 | 0.0 | -18.0
0.0 | 10.0 | 0.0 | -18.0
0.0 | 0.0 | 10.0 | 0.0
0.0 | 0.0 | 0.0 | 1.0


延伸和修剪对象

变换对象
编辑对象
分解对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
延伸和修剪对象

用户可以更改圆弧的角度，也可以改变开放直线、圆弧、开放多段线、椭圆弧和开放样条曲线的长度。结果类似于延伸和修剪对象。

用户可以通过编辑对象的特性来延伸或修剪对象。例如，要拉长直线，只需修改 StartPoint 或 EndPoint 特性的坐标即可。要改变圆弧的角度，请更改圆弧的 StartAngle 或 EndAngle 特性。改变对象的一个和多个特性后，请使用 Update 方法查看图形中的变化。

有关延伸和修剪对象的详细信息，请参见《用户手册》中的“调整对象的大小和形状”。

拉长直线

本例创建一条直线，然后修改其端点拉长该直线。

Sub Ch4_LengthenLine()
    ' 定义和创建直线
    Dim lineObj As AcadLine
    Dim startPoint(0 To 2) As Double
    Dim endPoint(0 To 2) As Double
    startPoint(0) = 0
    startPoint(1) = 0
    startPoint(2) = 0
    endPoint(0) = 1
    endPoint(1) = 1
    endPoint(2) = 1
    Set lineObj = ThisDrawing.ModelSpace. _
                  AddLine(startPoint, endPoint)
    lineObj.Update
    ' 将端点更改为 4,4,4
    ' 拉长直线
    endPoint(0) = 4
    endPoint(1) = 4
    endPoint(2) = 4
    lineObj.endPoint = endPoint
    lineObj.Update
End Sub


分解对象

延伸和修剪对象
编辑对象
编辑多段线
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
分解对象

分解对象将对象从单一对象转换为构成该对象的组件，但是不会有视觉上的影响。例如，分解可以将三维多边形、多段线、多边形网格和面域变成简单的直线和圆弧，将块参照替换为组成块的简单对象的副本。

有关分解对象的详细信息，请参见《用户手册》中的“解除复合对象的关联（分解）”。

分解多段线

本例创建一个优化多段线对象，然后将多段线分解成多个对象。接着遍历产生的对象，显示含有每个对象名称的消息框，并显示分解对象在列表中的索引。

Sub Ch4_ExplodePolyline()
    Dim plineObj As AcadLWPolyline
    Dim points(0 To 11) As Double
    ' 定义二维多段线的点
    points(0) = 1: points(1) = 1
    points(2) = 1: points(3) = 2
    points(4) = 2: points(5) = 2
    points(6) = 3: points(7) = 2
    points(8) = 4: points(9) = 4
    points(10) = 4: points(11) = 1
    ' 创建优化多段线对象
    Set plineObj = ThisDrawing.ModelSpace. _
                  AddLightWeightPolyline(points)
    ' 在某个线段上设置凸度以改变
    ' 多段线中的对象类型
    plineObj.SetBulge 3, -0.5
    plineObj.Update
    ' 分解多段线
    Dim explodedObjects As Variant
    explodedObjects = plineObj.Explode
    ' 遍历分解的对象
    ' 并以消息框来显示
    ' 每个对象的类型
    Dim I As Integer
    For I = 0 To UBound(explodedObjects)
    explodedObjects(I).Update
        MsgBox "Exploded Object " & I & ": " & _
                    explodedObjects(I).ObjectName
        explodedObjects(I).Update
    Next
End Sub


编辑多段线

分解对象
编辑对象
编辑样条曲线
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
编辑多段线

二维和三维多段线、矩形、多边形和三维多边形网格都是多段线的变化形式而且编辑方式都相同。

AutoCAD 可以识别拟合多段线和样条曲线拟合多段线。样条曲线拟合多段线使用曲线进行拟合，类似于 B 样条曲线。有两种样条曲线拟合多段线：二次和三次。这两种多段线均由 SPLINETYPE 系统变量控制。拟合多段线使用标准曲线来进行曲线拟合，并利用所有在给定顶点上设置的切线方向。

要编辑多段线，请使用 LightweightPolyline 或 Polyline 对象的特性和方法。请使用以下特性和方法开放或闭合多段线、修改多段线顶点的坐标或添加顶点：

Closed 特性

开放或闭合多段线。

Coordinates 特性

指定多段线中每个顶点的坐标值。

AddVertex 方法

向优化多段线添加顶点。

使用以下方法来更新多段线的凸度或宽度：

SetBulge

设置多段线的凸度（给定线段索引）。

SetWidth

设置多段线的起始宽度和终止宽度（给定线段索引）。

有关编辑多段线的详细信息，请参见《用户手册》中的“修改或合并多段线”。

编辑多段线

本例创建一条优化多段线，然后向多段线的第三段添加凸度，向多段线附加顶点，修改最后一段的宽度，最后闭合多段线。

Sub Ch4_EditPolyline()
    Dim plineObj As AcadLWPolyline
    Dim points(0 To 9) As Double
    ' 定义二维多段线的点
    points(0) = 1: points(1) = 1
    points(2) = 1: points(3) = 2
    points(4) = 2: points(5) = 2
    points(6) = 3: points(7) = 2
    points(8) = 4: points(9) = 4
    ' 创建优化多段线对象
    Set plineObj = ThisDrawing.ModelSpace. _
                   AddLightWeightPolyline(points)
    ' 向线段 3 添加凸度
    plineObj.SetBulge 3, -0.5
    ' 定义新的顶点
    Dim newVertex(0 To 1) As Double
    newVertex(0) = 4: newVertex(1) = 1
    ' 向多段线添加顶点
    plineObj.AddVertex 5, newVertex
    ' 设置新线段的宽度
    plineObj.SetWidth 4, 0.1, 0.5
    ' 闭合多段线
    plineObj.Closed = True
    plineObj.Update
End Sub


编辑样条曲线

编辑多段线
编辑对象
编辑图案填充
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
编辑样条曲线

使用以下可编辑特性来更改样条曲线：

ControlPoints

指定样条曲线的控制点。

EndTangent

指定样条曲线的端点切向作为方向矢量。

FitPoints

指定样条曲线的所有拟合点。

FitTolerance

使用新的公差值将样条曲线重新拟合至现有点。

Knots

指定样条曲线的节点矢量。

StartTangent

指定样条曲线的起点切向。

此外，用户还可以使用以下方法编辑样条曲线：

AddFitPoint

在给定的索引处向样条曲线添加一个拟合点。

DeleteFitPoint

在给定的索引处删除样条曲线的拟合点。

ElevateOrder

将样条曲线的阶数提高到给定的阶数。

GetFitPoint

在给定索引处获取样条曲线的拟合点。（仅获取一个拟合点。要查询样条曲线的所有拟合点，请使用 FitPoints 特性。）

Reverse

反转样条曲线的方向。

SetControlPoint

在给定的索引处设置样条曲线的控制点。

SetFitPoint

在给定的索引处设置样条曲线的拟合点。（仅设置一个拟合点。要更改样条曲线的所有拟合点，请使用 FitPoints 特性。）

SetWeight

在给定的索引处设置控制点的权值。

使用以下只读特性来查询样条曲线：

Area

获取样条曲线包围的面积。

Closed

指示此样条曲线为开放还是闭合。

阶数

获取样条曲线的多项式表示的阶数。

IsPeriodic

指定给定的样条曲线是否是周期性的。

IsPlanar

指定给定的样条曲线是否是平面的。

IsRational

指定给定的样条曲线是否是有理的。

NumberOfControlPoints

获取样条曲线的控制点数目。

NumberOfFitPoints

获取样条曲线的拟合点数目。

有关编辑样条曲线的详细信息，请参见《用户手册》中的“修改样条曲线”。

更改样条曲线上的控制点

本例创建一条样条曲线，然后更改该样条曲线的第一个控制点。

Sub Ch4_ChangeSplineControlPoint()
    ' 创建样条曲线
    Dim splineObj As AcadSpline
    Dim startTan(0 To 2) As Double
    Dim endTan(0 To 2) As Double
    Dim fitPoints(0 To 8) As Double
    startTan(0) = 0.5: startTan(1) = 0.5: startTan(2) = 0
    endTan(0) = 0.5: endTan(1) = 0.5: endTan(2) = 0
    fitPoints(0) = 1: fitPoints(1) = 1: fitPoints(2) = 0
    fitPoints(3) = 5: fitPoints(4) = 5: fitPoints(5) = 0
    fitPoints(6) = 10: fitPoints(7) = 0: fitPoints(8) = 0
    Set splineObj = ThisDrawing.ModelSpace. _
                   AddSpline(fitPoints, startTan, endTan)
    splineObj.Update
    ' 更改第一个拟合点的坐标
    Dim controlPoint(0 To 2) As Double
    controlPoint(0) = 0
    controlPoint(1) = 3
    controlPoint(2) = 0
    splineObj.SetControlPoint 0, controlPoint
    splineObj.Update
End Sub


编辑图案填充

编辑样条曲线
编辑对象
编辑图案填充边界
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 >
编辑图案填充

用户可以编辑图案填充边界和填充图案。如果编辑关联图案填充的边界，只要编辑的结果是有效的边界，图案就会被更新。即使关联图案填充位于已关闭的图层上，仍将对其进行更新。用户可以修改填充图案或为现有的图案填充选择新的图案，但是只能在创建图案填充时设置关联性。可以使用 AssociativeHatch 特性查看 Hatch 对象是否具有关联性。（有关创建图案填充的详细信息，请参见 AddHatch 方法。）

必须使用 Evaluate 方法重新计算图案填充才能看到图案填充的编辑效果。

有关编辑图案填充的详细信息，请参见《用户手册》中的“修改图案填充和实体填充区域”。

本节内容

  • 编辑图案填充边界
  • 编辑填充图案


编辑图案填充边界

编辑图案填充
编辑图案填充
编辑填充图案
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 > 编辑图案填充 >
编辑图案填充边界

可以向图案填充边界附加或插入环。关联图案填充随其边界的改变而更新，非关联图案填充则不会更新。

要编辑图案填充边界，可以使用以下方法之一：

AppendInnerLoop

将一个内部环附加到图案填充。

AppendOuterLoop

将一个外部环附加到图案填充。

InsertLoopAt

在图案填充的给定索引处插入环。

将内部环附加到图案填充

本例创建一个关联的图案填充，然后创建一个圆并将该圆作为内部环附加到图案填充。

Sub Ch4_AppendInnerLoopToHatch()
    Dim hatchObj As AcadHatch
    Dim patternName As String
    Dim PatternType As Long
    Dim bAssociativity As Boolean
    ' 定义和创建图案填充
    patternName = "ANSI31"
    PatternType = 0
    bAssociativity = True
    Set hatchObj = ThisDrawing.ModelSpace. _
        AddHatch(PatternType, patternName, bAssociativity)
    ' 创建图案填充的外部环
    Dim outerLoop(0 To 1) As AcadEntity
    Dim center(0 To 2) As Double
    Dim radius As Double
    Dim startAngle As Double
    Dim endAngle As Double
    center(0) = 5: center(1) = 3: center(2) = 0
    radius = 3
    startAngle = 0
    endAngle = 3.141592
    Set outerLoop(0) = ThisDrawing.ModelSpace. _
       AddArc(center, radius, startAngle, endAngle)
    Set outerLoop(1) = ThisDrawing.ModelSpace. _
       AddLine(outerLoop(0).startPoint, outerLoop(0).endPoint)
    ' 将外部环附加到 Hatch 对象
    hatchObj.AppendOuterLoop (outerLoop)
    ' 创建一个圆作为图案填充的内部环
    Dim innerLoop(0) As AcadEntity
    center(0) = 5: center(1) = 4.5: center(2) = 0
    radius = 1
    Set innerLoop(0) = ThisDrawing.ModelSpace. _
                                 AddCircle(center, radius)
    ' 将圆作为内部环附加到图案填充
    hatchObj.AppendInnerLoop (innerLoop)
    ' 计算并显示图案填充
    hatchObj.Evaluate
    ThisDrawing.Regen True
End Sub


编辑填充图案

编辑图案填充边界
编辑图案填充
使用图层、颜色和线型
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 编辑对象 > 编辑图案填充 >
编辑填充图案

用户可以修改现有填充图案的角度或间距，也可以将其替换为实体填充图案或 AutoCAD 提供的预定义图案。“边界图案填充”对话框中的“图案”选项显示了这些图案的列表。为了缩小文件的大小，图案填充在图形中被定义为单一的图形对象。

使用以下特性和方法来编辑填充图案：

PatternAngle

指定填充图案的角度。

PatternDouble

指定用户定义的图案填充是否双向填充。

PatternName

指定填充图案的名称（不改变图案类型）。

PatternScale

指定填充图案的比例。

PatternSpace

指定用户定义的填充图案间距。

SetPattern

设置图案填充的图案名称和图案类型。

更改图案填充的图案间距

本例创建一个图案填充，然后将该图案填充的当前图案间距增加 2。

Sub Ch4_ChangeHatchPatternSpace()
    Dim hatchObj As AcadHatch
    Dim patternName As String
    Dim PatternType As Long
    Dim bAssociativity As Boolean
    ' 定义图案填充
    patternName = "ANSI31"
    PatternType = 0
    bAssociativity = True
    ' 创建关联的 Hatch 对象
    Set hatchObj = ThisDrawing.ModelSpace. _
        AddHatch(PatternType, patternName, bAssociativity)
    ' 创建图案填充的外部环
    Dim outerLoop(0 To 0) As AcadEntity
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 5
    center(1) = 3
    center(2) = 0
    radius = 3
    Set outerLoop(0) = ThisDrawing.ModelSpace. _
                                AddCircle(center, radius)
    hatchObj.AppendOuterLoop (outerLoop)
    hatchObj.Evaluate
    ' 向当前间距加 2，以更改填充图案
    ' 的间距
    hatchObj.patternSpace = hatchObj.patternSpace + 2
    hatchObj.Evaluate
    ThisDrawing.Regen True
End Sub


使用图层、颜色和线型

编辑填充图案
创建和编辑 AutoCAD 图元
使用图层
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 >
使用图层、颜色和线型

图层就像透明的覆盖层，用户可以在上面组织和编组各种不同的图形信息。用户创建的对象具有各种特性，包括图层、颜色和线型。颜色可以帮助用户区分图形中类似的元素，而线型则可以帮助用户区分不同的绘图元素，例如中心线或隐藏线。组织图层以及图层上的对象可以更容易地管理图形中的信息。

有关本主题的详细信息，请参见《用户手册》中的“控制对象的特性”。

本节内容

  • 使用图层
  • 使用颜色
  • 使用线型
  • 将图层、颜色和线型指定给对象


使用图层

使用图层、颜色和线型
使用图层、颜色和线型
图层和线型排序
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 >
使用图层

用户总是在图层上绘制图形。可能是默认的图层，也可能是用户自己创建和命名的图层。每个图层都有关联的颜色和线型。例如，可以创建一个图层，在该图层上仅绘制中心线，并将图层颜色指定为蓝色，将图层线型指定为 CENTER。以后每次绘制中心线时，都可以切换到该图层再开始绘制。

所有图层和线型都保存在其上级集合对象中。图层保存在 Layers 集合中，线型保存在 Linetypes 集合中。

有关操作图层的详细信息，请参见《用户手册》中的“操作图层”。

本节内容

  • 图层和线型排序
  • 创建和命名图层
  • 将图层置为活动
  • 打开和关闭图层
  • 冻结和解冻图层
  • 锁定和解锁图层
  • 指定图层颜色
  • 指定图层线型
  • 删除图层


图层和线型排序

使用图层
使用图层
创建和命名图层
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用图层 >
图层和线型排序

用户可以遍历 Layers 和 Linetypes 集合来查找图形中的所有图层和线型。

遍历 Layers 集合

以下代码遍历 Layers 集合，以收集图形中所有图层的名称，然后将这些名称显示在消息框中。

Sub Ch4_IteratingLayers()
    Dim layerNames As String
    Dim entry As AcadLayer
    layerNames = ""
    For Each entry In ThisDrawing.Layers
        layerNames = layerNames + entry.Name + vbCrLf
    Next
    MsgBox "The layers in this drawing are: " + _
           vbCrLf + layerNames
End Sub


创建和命名图层

图层和线型排序
使用图层
将图层置为活动
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用图层 >
创建和命名图层

用户可以创建新的图层并指定这些图层的颜色和线型特性。所有图层都属于 Layers 集合。使用 Add 方法可创建新图层并将其添加到 Layers 集合。

用户可以在创建图层时指定图层名称。要在创建图层后更改图层名，请使用 Name 特性。图层名称最多可包含三十一个字符，名称中可以包含字母、数字以及特殊字符美元符号 ($)、连字符 (-) 和下划线 (_)，但不能包含空格。

有关创建图层的详细信息，请参见《用户手册》中的“创建和命名图层”。

创建新图层，指定为红色，然后向图层添加对象

以下代码创建一个圆和一个新图层。新的图层指定使用红色。圆被指定到该图层，然后其颜色也相应改变。

Sub Ch4_NewLayer()
    ' 创建圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 2: center(1) = 2: center(2) = 0
    radius = 1
    Set circleObj = ThisDrawing.ModelSpace. _
                        AddCircle(center, radius)
    ' 创建颜色对象
    Dim col As New AcadAcCmColor
    col.ColorMethod = AutoCAD.acColorMethodForeground
    ' 设置图层的颜色
    Dim layColor As AcadAcCmColor
    Set layColor =
      AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.17")
    Call layColor.SetRGB(122, 199, 25)
    ThisDrawing.ActiveLayer.TrueColor = layColor
    col.ColorMethod = AutoCAD.acColorMethodByLayer
    ' 将圆的颜色指定为“随层”
    ' 以便圆自动拾取所在图层的
    ' 颜色
    circleObj.Color = acByLayer
    circleObj.Update
End Sub


将图层置为活动

创建和命名图层
使用图层
打开和关闭图层
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用图层 >
将图层置为活动

用户总是在活动的图层上绘制图形。图层置为活动时，用户可以在该图层上创建新对象。如果将其他图层置为活动图层，所有新对象都将在新的活动图层上创建并且使用该图层的颜色和线型。如果图层被冻结，则不能将其置为活动。

要将图层置为活动，请使用 ActiveLayer 特性。此特性是设置在当前图形上的。例如：

Dim newlayer As AcadLayer
Set newlayer = ThisDrawing.Layers.Add("LAYER1")
ThisDrawing.ActiveLayer = newlayer


打开和关闭图层

将图层置为活动
使用图层
冻结和解冻图层
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用图层 >
打开和关闭图层

关闭的图层将和图形一起重生成，但不能显示或打印。通过关闭图层，可以避免每次解冻图层时都重生成图形。打开已关闭的图层时，AutoCAD 将重画该图层上的对象。

要打开和关闭图层，请使用 LayerOn 特性。如果为此特性输入 TRUE，将打开图层；如果输入 FALSE，将关闭图层。

关闭图层

本例创建一个新的图层并在该图层上添加一个圆，然后关闭图层使圆不可见。

Sub Ch4_LayerInvisible()
    ' 创建圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 2: center(1) = 2: center(2) = 0
    radius = 1
    Set circleObj = ThisDrawing.ModelSpace. _
                        AddCircle(center, radius)
    ' 创建新图层“ABC”
    Dim layerObj As AcadLayer
    Set layerObj = ThisDrawing.Layers.Add("ABC")
    ' 将圆指定到“ABC”图层
    circleObj.Layer = "ABC"
    circleObj.Update
    ' 关闭图层“ABC”
    layerObj.LayerOn = False
    ThisDrawing.Regen acActiveViewport
End Sub


冻结和解冻图层

打开和关闭图层
使用图层
锁定和解锁图层
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用图层 >
冻结和解冻图层

用户可以冻结图层以加快显示改变的速度，提高对象选择性能，以及减少复杂图形的重生成时间。AutoCAD 不会显示、打印或重生成冻结图层上的对象。可以冻结长时间不需要显示的图层。在“解冻”冻结的图层时，AutoCAD 将重新生成并显示该图层上的对象。

要冻结或解冻图层，请使用 Freeze 特性。如果为此特性输入 TRUE，将冻结图层；如果输入 FALSE，将解冻图层。

冻结图层

本例创建一个称为“ABC”的新图层，然后冻结该图层。

Sub Ch4_LayerFreeze()
    ' 创建新图层“ABC”
    Dim layerObj As AcadLayer
    Set layerObj = ThisDrawing.Layers.Add("ABC")
    ' 冻结图层“ABC”
    layerObj.Freeze = True
End Sub


锁定和解锁图层

冻结和解冻图层
使用图层
指定图层颜色
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用图层 >
锁定和解锁图层

用户不能编辑锁定图层上的对象，但如果图层是打开和解冻的，这些对象仍然可见。可以将锁定图层置为当前并在其上添加对象。可以冻结和关闭锁定图层，也可以更改其关联的颜色和线型。

要锁定或解锁图层，请使用 Lock 特性。如果为此特性输入 TRUE，将锁定图层；如果输入 FALSE，将解锁图层。

锁定图层

本例创建一个称为“ABC”的新图层，然后锁定该图层。

Sub Ch4_LayerLock()
    ' 创建新图层“ABC”
    Dim layerObj As AcadLayer
    Set layerObj = ThisDrawing.Layers.Add("ABC")
    ' 锁定图层“ABC”
    layerObj.Lock = True
End Sub


指定图层颜色

锁定和解锁图层
使用图层
指定图层线型
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用图层 >
指定图层颜色

用户可以指定图层的颜色。颜色由 AcCmColor 对象标识。此对象可以是 RGB 值、ACI 编号（从 1 到 255 的整数）或命名颜色。

要指定图层颜色，请使用 TrueColor 特性。

对于七种标准颜色以及 BYBLOCK 和 BYLAYER 标志，都为其提供了常量。

如果使用 acByBlock，AutoCAD 将使用默认颜色（白色或黑色，根据用户配置而定）绘制新对象，直到这些对象被编组到块为止。将块插入图形时，块中的对象继承当前设置。

如果用户使用 acByLayer，新对象会使用该对象所在图层的颜色。


指定图层线型

指定图层颜色
使用图层
删除图层
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用图层 >
指定图层线型

要定义图层时，也可以通过线型表达视觉信息。线型是一个由划、点和空格重复组成的图案，可以用来区分线条的用途。

线型名及其定义描述了特定的点划序列、划和空格的相对长度，以及任何包含的文字或形的特性。

要指定图层线型，请使用 Linetype 特性。此特性需要输入线型的名称。


删除图层

指定图层线型
使用图层
使用颜色
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用图层 >
删除图层

要删除图层，请使用 Delete 方法。

在图形任务期间，随时可以删除图层。但不能删除当前图层、图层 0、依赖于外部参照的图层和包含对象的图层。

注意对于被块定义参照的图层以及特殊的图层 DEFPOINTS，即使其中没有包含可见对象也不能被删除。


使用颜色

删除图层
使用图层、颜色和线型
使用线型
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 >
使用颜色

用户可以使用 AcCmColor 对象将真彩色指定给图形中的各个对象。使用 AcCmColor 对象中的 RGB 值，可以在设置直线、圆和其他对象的颜色时从上百万的颜色中进行选择。AcCmColor 对象包含的方法和特性还指定可以颜色名称、配色系统、颜色索引、颜色值和颜色方法。

用户可以指定图层的颜色。每个颜色均可由名称或 AutoCAD 颜色索引 (ACI) 编号（从 1 到 255 的整数）来标识。任意数量的对象和图层都可以具有同一颜色编号。尽管在屏幕上看不到颜色，用户还是可以指定笔式绘图仪上的各种笔使用不同的颜色编号，或者使用颜色编号来标识图形中的特定对象。

指定颜色时，可以输入颜色名称或是颜色的 ACI 编号。ACI 提供 255 个颜色编号。只有颜色编号 1 到 7 的颜色具有标准颜色名称。

颜色 1 到 7
颜色编号 | 颜色名
1 | 红色
2 | 黄色
3 | 绿色
4 | 青色
5 | 蓝色
6 | 品红
7 | 黑色/白色

编号 8 到 255 的颜色必须通过编号或在对话框中选择颜色来指定。默认颜色 (7) 为白色或黑色，根据用户的背景色而定。

有关操作颜色的详细信息，请参见《用户手册》中的“操作颜色”。


使用线型

使用颜色
使用图层、颜色和线型
将线型置为活动
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 >
使用线型

线型是重复的划、点和空格组成的图案。复杂线型则是重复符号的图案。要使用线型，必须先将其加载到图形中。加载之前，LIN 库文件中必须存在该线型的定义。要将线型加载到图形中，请使用 Load 方法。

有关操作线型的详细信息，请参见《用户手册》中的“线型概述”。

注意不要将 AutoCAD 内部使用的线型与某些打印机提供的硬件线型相混淆。这两种类型的虚线产生的效果相似。请勿同时使用这两种类型，否则将产生不可预知的结果。

将线型加载到 AutoCAD 中

本例试图从 acad.lin 文件中加载线型“CENTER”。如果该线型已存在或者文件不存在，则显示相关消息。

Sub Ch4_LoadLinetype()
    On Error GoTo ERRORHANDLER
    Dim linetypeName As String
    linetypeName = "CENTER"
    ' 从 acad.lin 文件加载“CENTER”线型
    ThisDrawing.Linetypes.Load linetypeName, "acad.lin"
    Exit Sub
ERRORHANDLER:
    MsgBox Err.Description
End Sub
本节内容
  • 将线型置为活动
  • 重命名线型
  • 删除线型
  • 更改线型说明
  • 指定线型比例


将线型置为活动

使用线型
使用线型
重命名线型
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用线型 >
将线型置为活动

要使用线型在当前图层上绘图，必须将其置为活动。所有新创建的对象都使用活动线型绘制。

注意依赖于外部参照的线型不能置为活动。

要将线型置为活动，请使用 ActiveLinetype 特性。此特性是设置在当前图形上的。例如：

ThisDrawing.ActiveLinetype = ThisDrawing._
Linetypes.Item("CONTINUOUS")

有关激活线型的详细信息，请参见《用户手册》中的“设置当前线型”。


重命名线型

将线型置为活动
使用线型
删除线型
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用线型 >
重命名线型

要重命名线型，请使用 Name 特性。重命名线型时，只能重命名图形中线型的定义。LIN 库文件中的名称并不会刷新以反映新的名称。


删除线型

重命名线型
使用线型
更改线型说明
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用线型 >
删除线型

要删除线型，请使用 Delete 方法。在执行绘图任务期间，可以随时删除线型，但不能删除随层线型、随块线型、CONTINUOUS 线型、当前线型和依赖于外部参照的线型。另外，被块定义参照的线型也不能删除，即使没有任何对象使用它们。

有关删除线型的详细信息，请参见《用户手册》中的“设置当前线型”。


更改线型说明

删除线型
使用线型
指定线型比例
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用线型 >
更改线型说明

线型可以具有与其关联的说明，用于提供线型的 ASCII 表示。用户可以使用 Description 特性来指定或修改线型的说明。

线型说明最多可以包含 47 个字符。说明可以是一个注释，也可以使用一系列下划线、点、划和空格简单地表示出线型图案。例如：

ThisDrawing.ActiveLinetype.Description = "Exterior Wall"


指定线型比例

更改线型说明
使用线型
将图层、颜色和线型指定给对象
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 使用线型 >
指定线型比例

用户可以指定创建对象的线型比例。比例越小，每个绘图单位中画出的重复图案就越多。默认情况下，AutoCAD 使用 1.0 的全局线型比例，即一个图形单位。用户可以更改所有图形对象、属性参考和编组的线型比例。

要修改线型比例，请使用 LinetypeScale 特性。

CELTSCALE 系统变量设置新创建对象的线型比例。LTSCALE 则全局更改现有对象以及新对象的线型比例。要使用 AutoCAD ActiveX Automation 来修改系统变量值，请使用 SetVariable 方法。

有关线型比例的详细信息，请参见《用户手册》中的“控制线型比例”。

更改一个圆的线型比例

Sub Ch4_ChangeLinetypeScale()
  ' 保存当前的线型
  Set currLineType = ThisDrawing.ActiveLinetype
  ' 将活动线型更改为 Border，使比例的更改
  ' 可见。
  ' 首先查看 Border 线型是否已加载
  On Error Resume Next ' 打开错误捕获
  ThisDrawing.ActiveLinetype = ThisDrawing.Linetypes.Item("BORDER")
  If Err.Number = -2145386476 Then
    ' 错误指出尚未加载线型，因此加载它。
    ThisDrawing.Linetypes.Load "BORDER", "acad.lin"
    ThisDrawing.ActiveLinetype = _
          ThisDrawing.Linetypes.Item("BORDER")
  End If
  On Error GoTo 0 ' 关闭错误捕获
  ' 在模型空间中创建 Circle 对象
  Dim center(0 To 2) As Double
  Dim radius As Double
  Dim circleObj As AcadCircle
  center(0) = 2
  center(1) = 2
  center(2) = 0
  radius = 4
  Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius)
  circleObj.Update
  MsgBox ("Here is the circle with the original linetype")
  ' 将圆的线型比例设为 3
  circleObj.LinetypeScale = 3#
  circleObj.Update
  MsgBox ("Here is the circle with the new linetype")
  ' 恢复原始活动线型
  ThisDrawing.ActiveLinetype = currLineType
End Sub


将图层、颜色和线型指定给对象

指定线型比例
使用图层、颜色和线型
更改对象的图层
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 >
将图层、颜色和线型指定给对象

定义图层、颜色和线型后，可以将其指定给图形中的对象。可以通过将对象指定到图层来编组图形中的关联组件。用户可以控制图层可见性、颜色和线型，以及指定图层上的对象是否可以编辑。可以将对象从一个图层移到另一个图层，并修改图层的名称。

图形中图层的数目和每个图层上对象的数目在理论上是没有限制的。用户可以指定每一个图层的名称，并选择显示任何的图层组合。

还可以通过原来绘制在其他图层上、使用其他颜色和线型的对象来定义块。可以保留块中对象的图层、颜色和线型信息。以后每次插入块时，都可以将对象绘制在原始图层上，并使用原始的颜色和线型。

本节内容

  • 更改对象的图层
  • 更改对象的颜色
  • 更改对象的线型


更改对象的图层

将图层、颜色和线型指定给对象
将图层、颜色和线型指定给对象
更改对象的颜色
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 将图层、颜色和线型指定给对象 >
更改对象的图层

创建对象并为其指定图层、颜色和线型特性后，可能希望更改对象的图层。如果意外地将对象创建在错误的图层上，或随后决定要更改图层组织，更改对象的图层非常有用。

要更改对象的图层，请使用为该对象提供的 Layer 特性。Layer 特性需要输入图层的名称。

将对象移动到不同图层

本例在活动图层上创建一个圆，然后创建一个称为“ABC”的新图层。接着将圆移动到新图层上。

Sub Ch4_MoveObjectNewLayer()
    ' 创建圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 2: center(1) = 2: center(2) = 0
    radius = 1
    Set circleObj = ThisDrawing.ModelSpace. _
                        AddCircle(center, radius)
    ' 创建新图层“ABC”
    Dim layerObj As AcadLayer
    Set layerObj = ThisDrawing.Layers.Add("ABC")
    ' 将圆指定到“ABC”图层
    circleObj.Layer = "ABC"
    circleObj.Update
End Sub


更改对象的颜色

更改对象的图层
将图层、颜色和线型指定给对象
更改对象的线型
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 将图层、颜色和线型指定给对象 >
更改对象的颜色

要更改对象的颜色，请使用为该对象提供的 TrueColor 特性。用户可以指定图形中各个对象的颜色。每种颜色均由一个 AcCmColor 对象标识。此对象可以是 RGB 值、ACI 编号（从 1 到 255 的整数）或命名颜色。使用 RGB 值，可以从上百万种颜色中选择。

设置对象的颜色会替代该对象所在图层的颜色设置。如果要将对象保留在特定图层上但不希望该对象保留该图层的颜色，可以更改对象的颜色。

更改圆的颜色

本例创建一个圆，然后将其着色为蓝色。

Sub Ch4_ColorCircle()
    Dim color As AcadAcCmColor
    Set color = _
    AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.17")
    Call color.SetRGB(80, 100, 244)
    Dim circleObj As AcadCircle
    Dim centerPoint(0 To 2) As Double
    Dim radius As Double
    centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0#
    radius = 5#
    Set circleObj = _
    ThisDrawing.ModelSpace.AddCircle(centerPoint, radius)
    circleObj.TrueColor = color
    ZoomAll
End Sub


更改对象的线型

更改对象的颜色
将图层、颜色和线型指定给对象
保存和恢复图层设置
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 使用图层、颜色和线型 > 将图层、颜色和线型指定给对象 >
更改对象的线型

默认情况下，对象将继承创建时所在图层的线型。要更改对象的线型，请使用为该对象提供的 Linetype 特性。Linetype 特性需要输入要指定给对象的线型名称。

注意在指定对象线型之前，必须先将该线型加载到当前图形中。要将线型加载到图形中，请使用 Load 方法。

有关线型的详细信息，请参见《用户手册》中的“线型概述”。

更改圆的线型

本例创建一个圆，然后，本例将试图从 acad.lin 文件中加载线型“CENTER”。如果该线型已存在或者文件不存在，则显示相关消息。最后，本例将圆的线型设置为“CENTER。”。

Sub Ch4_ChangeCircleLinetype()
    On Error Resume Next
    ' 创建圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 2: center(1) = 2: center(2) = 0
    radius = 1
    Set circleObj = ThisDrawing.ModelSpace. _
                        AddCircle(center, radius)
    Dim linetypeName As String
    linetypeName = "CENTER"
    ' 从 acad.lin 文件加载“CENTER”线型
    ThisDrawing.Linetypes.Load linetypeName, "acad.lin"
    If Err.Description <> "" Then MsgBox Err.Description
    ' 指定圆的线型为“CENTER”
    circleObj.Linetype = "CENTER"
    circleObj.Update
End Sub


保存和恢复图层设置

更改对象的线型
创建和编辑 AutoCAD 图元
了解 AutoCAD 如何保存图层设置
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 >
保存和恢复图层设置

用户可以在图形中保存图层设置，以后再将其恢复。这样可以很容易地返回到所有图层在绘制或打印期间不同阶段所作的特定设置。

图层设置包括图层是否打开、冻结、锁定、打印、是否在新视口中自动冻结，以及图层的颜色、线型、线宽和打印样式。用户可以指定要保存的设置，还可以保存同一图形中不同编组的设置。

特殊对象 LayerStateManager 提供了使用 ActiveX 处理图层设置的功能。

有关保存图层设置的详细信息，请参见《用户手册》中的“保存和恢复图层设置”。

本节内容

  • 了解 AutoCAD 如何保存图层设置
  • 使用 LayerStateManager 管理图层设置


了解 AutoCAD 如何保存图层设置

保存和恢复图层设置
保存和恢复图层设置
使用 LayerStateManager 管理图层设置
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 保存和恢复图层设置 >
了解 AutoCAD 如何保存图层设置

AutoCAD 将图层设置保存在图形的 Layers 集合的扩展词典中。用户首次保存图形中的图层设置时，AutoCAD 将执行以下操作：

  • 在 Layers 集合中创建扩展词典。
  • 在扩展词典中创建命名为 ACAD_LAYERSTATE 的 Dictionary 对象。
  • 将图形中每个图层的特性存储在 ACAD_LAYERSTATE 词典的 XRecord 对象中。AutoCAD 将所有图层设置存储在 XRecord 中，但会标明用户选择保存的特定设置。恢复图层设置时，AutoCAD 仅恢复用户选择保存的设置。

每次保存图形中另一图层设置时，AutoCAD 均将创建另一个描述保存设置的 XRecord 对象，并将 XRecord 存储在 ACAD_LAYERSTATE 词典中。下面的图表说明了这个过程。

用户使用 ActiveX 对图层设置进行操作时，不需要（也不应该）解释 XRecord，而应该使用 LayerStateManager 对象的功能访问保存的图层设置。

列出图形中保存的图层设置

如果图层设置已经保存在当前的图形中，则下面的代码列出所有已经保存的图层设置名称：

Sub Ch4_ListStates()
     On Error Resume Next
    Dim oLSMDict As AcadDictionary
    Dim XRec As Object
    Dim layerstateNames As String
    layerstateNames = ""
    ' 获取 ACAD_LAYERSTATES 词典，它保存在
    ' Layers 对象的扩展词典中
    Set oLSMDict = ThisDrawing.Layers. _
           GetExtensionDictionary.Item("ACAD_LAYERSTATES")
    ' 列出每个己保存的图层设置的名称。设置
    ' 保存为词典中的 XRecord。
    For Each XRec In oLSMDict
       layerstateNames = layerstateNames + XRec.Name + vbCrLf
    Next XRec
    MsgBox "The saved layer settings in this drawing are: " + _
            vbCrLf + layerstateNames
End Sub


使用 LayerStateManager 管理图层设置

了解 AutoCAD 如何保存图层设置
保存和恢复图层设置
保存图层设置
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 保存和恢复图层设置 >
使用 LayerStateManager 管理图层设置

LayerStateManager 对象类似于 AutoCAD Utility 对象，它提供一组操作数据的函数。这些函数提供处理保存的图层设置的方法。使用下面的 LayerStateManager 方法处理保存的图层设置：

Delete

删除已保存的图层设置。

Export

将指定的已保存图层设置输出到文件。

Import

从指定的文件输入保存的图层设置。

Rename

重命名保存的图层设置。

Restore

恢复当前图形中指定的图层设置。

Save

保存指定图层的状态和特性。

SetDataBase

将 AutoCAD 数据库与 LayerStateManager 相关联。

要访问 LayerStateManager 对象，请使用 GetInterfaceObject 方法。

Dim oLSM As AcadLayerStateManager
Set oLSM = ThisDrawing.Application. _
   GetInterfaceObject("AutoCAD.AcadLayerStateManager.17")

检索 LayerStateManager 对象后，必须将数据库与其关联，才能访问对象的方法。使用 SetDatabase 方法将 LayerStateManager 与数据库相关联。

oLSM.SetDatabase ThisDrawing.Database

本节内容

  • 保存图层设置
  • 恢复图层设置
  • 输出和输入保存的图层设置


保存图层设置

使用 LayerStateManager 管理图层设置
使用 LayerStateManager 管理图层设置
恢复图层设置
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 保存和恢复图层设置 > 使用 LayerStateManager 管理图层设置 >
保存图层设置

使用 Save 方法保存图形中的图层设置。Save 方法接受两个参数。第一个参数是字符串，指定保存的图层设置的名称；第二个参数标识要保存的图层特性。请使用下表中的常量来标识图层特性。

图层特性常量
常量名称 | Layer 特性
acLsAll | 所有图层设置
acLsColor | Color
acLsFrozen | 冻结或解冻
acLsLineType | Linetype
acLsLineWeight | 线宽
acLsLocked | 锁定或解锁
acLsNewViewport | 新建视口图层冻结或解冻
acLsNone | 无
acLsOn | 打开或关闭
acLsPlot | 打开或关闭打印
acLsPlotStyle | 打印样式

请使用这些常量的组合来指定多个特性。

如果使用已有的名称保存图层设置，将返回错误。必须先重命名或删除现有的保存的图层设置，才能重新使用该名称。

保存图层的颜色和线型设置

以下代码以 ColorLinetype 的名称保存当前图层的颜色和线型。

Sub Ch4_SaveLayerColorAndLinetype()
    Dim oLSM As AcadLayerStateManager
    ' 访问 LayerStateManager 对象
    Set oLSM = ThisDrawing.Application. _
       GetInterfaceObject("AutoCAD.AcadLayerStateManager.17")
    ' 将当前图形关联至 LayerStateManager
    oLSM.SetDatabase ThisDrawing.Database
    oLSM.Save "ColorLinetype", acLsColor + acLsLineType
End Sub

重命名保存的图层设置

以下代码将 ColorLinetype 图层设置重命名为 OldColorLinetype。

Sub Ch4_RenameLayerSettings()
    Dim oLSM As AcadLayerStateManager
    Set oLSM = ThisDrawing.Application. _
       GetInterfaceObject("AutoCAD.AcadLayerStateManager.17")
    oLSM.SetDatabase ThisDrawing.Database
    oLSM.Rename "ColorLinetype", "OldColorLinetype"
End Sub

删除保存的图层设置

以下代码删除以 ColorLinetype. 名称保存的图层设置。

Sub Ch4_DeleteColorAndLinetype()
    Dim oLSM As AcadLayerStateManager
    Set oLSM = ThisDrawing.Application. _
       GetInterfaceObject("AutoCAD.AcadLayerStateManager.17")
    oLSM.SetDatabase ThisDrawing.Database
    oLSM.Delete "ColorLinetype"
End Sub


恢复图层设置

保存图层设置
使用 LayerStateManager 管理图层设置
输出和输入保存的图层设置
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 保存和恢复图层设置 > 使用 LayerStateManager 管理图层设置 >
恢复图层设置

Restore 方法用于将当前图形的所有图层设置重置为以前保存的设置。例如，如果将图形的颜色和线型设置保存在名称“ColorLinetype”下，然后又更改了这些设置，则恢复“ColorLinetype”会将图层的颜色和线型重置为保存“ColorLinetype”时图层的颜色和线型。如果在保存“ColorLinetype”之后又将新图层添加到图形中，则在恢复“ColorLinetype”时，这些新图层将不受影响。”时将不会影响这些新图层。

恢复图形的图层的颜色和线型设置

假设当前图形中图层的颜色和线型设置先前被保存在名称“ColorLinetype”下，以下代码将把图形中每个图层的颜色和线型都重置为保存“ColorLinetype”时这些设置具有的值。

Sub Ch4_RestoreLayerSettings()
    Dim oLSM As AcadLayerStateManager
    Set oLSM = ThisDrawing.Application. _
       GetInterfaceObject("AutoCAD.AcadLayerStateManager.17")
    oLSM.SetDatabase ThisDrawing.Database
    oLSM.Restore "ColorLinetype"
End Sub


输出和输入保存的图层设置

恢复图层设置
使用 LayerStateManager 管理图层设置
将文字添加到图形
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 保存和恢复图层设置 > 使用 LayerStateManager 管理图层设置 >
输出和输入保存的图层设置

用户可以输出和输入图层的设置，以便在其他图形中使用这些设置。使用 LayerStateManager 的 Export 方法可以将图层设置保存到文件；使用 Import 方法可以将已保存的图层设置输入到图形中。

注意输入图层设置并不会恢复这些设置。必须使用 Restore 方法将图形中的图层设置为输入的设置。

Export 方法接受两个参数。第一个参数是一个字符串，标识用户输出的保存的图层设置；第二个参数是接受输出设置的文件名称。如果用户不指定文件的路径，文件将保存到 AutoCAD 的安装目录中。如果用户指定的文件名称已经存在，则现有的文件将被替换。命名文件时请使用 ..las 扩展名，这是 AutoCAD 能够识别的输出图层设置文件的扩展名。

Import 方法接受一个参数：一个字符串，用于命名包含用户输入的图层设置的文件。

在输入图层设置时，如果已保存设置中引用的任何特性不存在于要输入设置的图形中，将出现错误。但输入会使用默认的特性完成。例如，如果输出的图层设置为使用未在要输入该图层的图形中加载的线型，将产生错误，并将使用图形的默认线型对其进行替换。用户的代码应该记录这种错误条件，以便在产生错误时能够继续处理。

如果当前图形中不存在输入文件定义的图层设置，将在当前图形中创建这些图层。使用 Restore 方法时，在保存设置时指定的特性将被指定到新图层，而新图层的其他所有特性都使用默认设置。

输出保存的图层设置

以下代码将保存的图层设置输出到名为 Colortype.las 的文件中。

Sub Ch4_ExportLayerSettings()
    Dim oLSM As AcadLayerStateManager
    Set oLSM = ThisDrawing.Application. _
       GetInterfaceObject("AutoCAD.AcadLayerStateManager.17")
    oLSM.SetDatabase ThisDrawing.Database
    oLSM.Export "ColorLinetype", "c:\my documents\ColorLType.las"
End Sub

输入保存的图层设置

以下代码从名为 Colortype.las 文件输入图层设置。

Sub Ch4_ImportLayerSettings()
    Dim oLSM As AcadLayerStateManager
    Set oLSM = ThisDrawing.Application. _
       GetInterfaceObject("AutoCAD.AcadLayerStateManager.17")
    oLSM.SetDatabase ThisDrawing.Database
    ' 如果要输入的图形未包含
    ' 保存的设置中引用的所有线型，
    ' 将返回错误。虽然完成了输入，
    ' 但使用的是默认线型。
    On Error Resume Next
    oLSM.Import "c:\my documents\ColorLType.las"
    If Err.Number = -2145386359 Then
       ' 错误指出线型没有定义
       MsgBox ("One or more linetypes specified in the imported " + _
              "settings is not defined in your drawing")
    End If
    On Error GoTo 0
End Sub


将文字添加到图形

输出和输入保存的图层设置
创建和编辑 AutoCAD 图元
使用文字样式
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 >
将文字添加到图形

文字表达了图形中的重要信息。可以将文字用于标题栏、标注图形部件、提供规格说明或进行注释。

AutoCAD 提供多种创建文字的方法。对简短的输入项使用单行文字，对于较长而且有内部格式的输入，可以使用多行文字。虽然所有输入的文字都使用建立默认字体和格式设置的当前文字样式，但也可以使用其他的方法自定义文字外观。

有关操作文字的详细信息，请参见《用户手册》中的“创建文字”。

本节内容

  • 使用文字样式
  • 使用单行文字
  • 使用多行文字
  • 使用 Unicode 字符、控制代码和特殊字符
  • 替换字体
  • 拼写检查


使用文字样式

将文字添加到图形
将文字添加到图形
创建和修改文字样式
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 >
使用文字样式

AutoCAD 图形中的所有文字都有关联样式。输入文字时，AutoCAD 使用当前的文字样式，该样式设置了字体、字号、角度、方向和其他文字特征。用户可以使用或修改默认的样式，或者创建和加载新的样式。创建样式后，可以修改其属性，也可以在不再需要时将其删除。

本节内容

  • 创建和修改文字样式
  • 指定字体
  • 使用 TrueType 字体
  • 使用 Unicode 和大字体
  • 设置文字高度
  • 设置倾斜角度
  • 设置文字生成标志


创建和修改文字样式

使用文字样式
使用文字样式
指定字体
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用文字样式 >
创建和修改文字样式

新的文字会从当前的文字样式继承高度、宽度比例、倾斜角度和文字生成等特性。要创建文字样式，请使用 Add 方法创建新的 TextStyle 对象并将其添加到 TextStyles 集合。Add 方法需要输入 TextStyle 名称。用户创建文字样式之后，不能通过 AutoCAD ActiveX Automation 修改其的名称。

样式名称可以包含字母、数字和特殊字符美元符号 ($)、下划线 (_) 和连字符 (-)。AutoCAD 将字符转换为大写字符。如果不输入样式名称，则 AutoCAD 将自动将该样式命名为 Stylen，其中 n 为从 1 开始的数字。每个新样式会加 1 来显示。

用户可以通过修改 TextStyle 对象的特性来修改现有的样式，也可以更新该样式的现有文字以反映更改。请使用以下特性来修改 TextStyle 对象：

FontFile

指定与字体（字符样式）关联的文件。

BigFontFile

指定适用于非 ASCII 字符集的特殊形定义文件。

Height

指定字符高度。

Width

指定字符的扩展或压缩。

ObliqueAngle

指定字符的倾斜度。

TextGenerationFlag

指定反向文字、倒置文字或两者。

如果更改现有样式的字体或方向，则将更改所有使用此样式的文字，使其使用新的字体或方向。更改文字的高度、宽度比例和倾斜角不会改变现有的文字，但会应用到以后创建的文字对象上。

注意必须调用 Regen 或 Update 方法，才能看到对上述特性所作的更改。


指定字体

创建和修改文字样式
使用文字样式
使用 TrueType 字体
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用文字样式 >
指定字体

字体定义了构成每个字符集的文字字符的形状。一种字体可以被多个样式使用。要指定文字样式的字体，请使用 TextStyle 对象的 FontFile 特性。通过输入包含 AutoCAD 编译的 SHX 字体的字体文件，可以将该字体指定给文字样式。

设置文字字体

本例获取活动文字样式的当前字体值，并随后将该字体更改为“PlayBill”。然后，将使用 SetFont 方法设置新的字体。要查看字体更改的效果，请在运行样例之前，向当前图形中添加一些多行文字或文字。注意，如果系统上没有 PlayBill 字体，则需要将其替换为一种已有的字体以使本例有效。

Sub Ch4_UpdateTextFont()
    MsgBox ("Look at the text now...")
    Dim typeFace As String
    Dim SavetypeFace As String
    Dim Bold As Boolean
    Dim Italic As Boolean
    Dim charSet As Long
    Dim PitchandFamily As Long
    ' 获取当前设置，填充
    ' SetFont 方法的默认值
    ThisDrawing.ActiveTextStyle.GetFont typeFace, _
                 Bold, Italic, charSet, PitchandFamily
    ' 改变字体
    SavetypeFace = typeFace
    typeFace = "PlayBill"
    ThisDrawing.ActiveTextStyle.SetFont typeFace, _
                Bold, Italic, charSet, PitchandFamily
    ThisDrawing.Regen acActiveViewport
    MsgBox ("Now see how it looks after changing the font...")
    ' 恢复原始字体
    ThisDrawing.ActiveTextStyle.SetFont SavetypeFace, _
                Bold, Italic, charSet, PitchandFamily
    ThisDrawing.Regen acActiveViewport
End Sub


使用 TrueType 字体

指定字体
使用文字样式
使用 Unicode 和大字体
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用文字样式 >
使用 TrueType 字体

TrueType 字体在图形中始终显示为已填充；而在打印时，TEXTFILL 系统变量控制是否填充字体。默认情况下，TEXTFILL 设置为 1，从而打印以填充方式显示的字体。在使用 Export 方法将图形输出为 PostScript® 格式并在 PostScript 设备上对其进行打印时，将按照设计的样式打印字体。


使用 Unicode 和大字体

使用 TrueType 字体
使用文字样式
设置文字高度
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用文字样式 >
使用 Unicode 和大字体

AutoCAD 支持 Unicode 字符编码标准。Unicode 字体可以包含 65,535 个字符，拥有多种语言的文字。现在，AutoCAD 的所有 SHX 形字体都是 Unicode 字体。

某些字母表的文字文件包含数千个非 ASCII 字符。为了适应这些文字，AutoCAD 提供了一种特殊的形定义，称作大字体文件。用户可以将样式设置为同时使用常规文件和大字体文件。使用 FontFile 特性指定常规字体。使用 BigFontFile 特性指定大字体。

注意字体文件名称中不能包含逗号。

AutoCAD 提供了替换为其他字体或指定默认字体的方法。详细信息请参见替换字体。

更改字体文件

本例更改 FontFile 和 BigFontFile 特性。用户需要将本例中的路径信息替换为实际的系统路径和文件名。

Sub Ch4_ChangeFontFiles()
    ThisDrawing.ActiveTextStyle.BigFontFile = _
                     "C:/AutoCAD/Fonts/bigfont.shx"
    ThisDrawing.ActiveTextStyle.fontFile = _
                     "C:/AutoCAD/Fonts/italic.shx"
End Sub


设置文字高度

使用 Unicode 和大字体
使用文字样式
设置倾斜角度
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用文字样式 >
设置文字高度

文字高度确定使用字体的字母大小，以图形单位计。该值通常表示大写字母的大小，但 TrueType 字体除外。

对于 TrueType 字体，文字高度的值可能不代表大写字母的高度，而是代表大写字母的高度加上预留给重音标记和非英语语言中其他标记的重音区域的高度。指定给大写字母和重音字符区域的相对区域是由字体设计者在设计字体时确定的，因此会随着字体而变动。

除了大写字母和组成用户指定高度的重音字符之外，TrueType 字型还有用于部分字符的下降区域，扩展到文字的插入线之下。这些字符的例子有 y、j、p、g 和 q。

使用 Height 特性指定文字高度。此特性只接受正数。

修改 Text 对象的高度

本例创建一行文字，然后修改该文字的高度。

Sub Ch4_ChangeTextHeight()
    Dim textObj As AcadText
    Dim textString As String
    Dim insertionPoint(0 To 2) As Double
    Dim height As Double
    ' 定义 Text 对象
    textString = "Hello, World."
    insertionPoint(0) = 3
    insertionPoint(1) = 3
    insertionPoint(2) = 0
    height = 0.5
    ' 在模型空间中创建 Text 对象
    Set textObj = ThisDrawing.ModelSpace. _
                 AddText(textString, insertionPoint, height)
    ' 将 Height 值改为 1
    textObj.height = 1
    textObj.Update
End Sub


设置倾斜角度

设置文字高度
使用文字样式
设置文字生成标志
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用文字样式 >
设置倾斜角度

倾斜角度决定文字是向前还是向后倾斜。角度代表文字与其垂直轴（90 度）的偏移。要设置倾斜角度，请使用 ObliqueAngle 特性。倾斜角度必须是弧度，正的角度值表示向右倾斜，负值则加上 2*PI 以转换为正的等价值。

创建倾斜文字

本例创建一个 Text 对象，然后将文字倾斜 45 度。

Sub Ch4_ObliqueText()
    Dim textObj As AcadText
    Dim textString As String
    Dim insertionPoint(0 To 2) As Double
    Dim height As Double
    ' 定义 Text 对象
    textString = "Hello, World."
    insertionPoint(0) = 3
    insertionPoint(1) = 3
    insertionPoint(2) = 0
    height = 0.5
    ' 在模型空间中创建 Text 对象
    Set textObj = ThisDrawing.ModelSpace. _
               AddText(textString, insertionPoint, height)
    ' 将 ObliqueAngle 值改为
    ' 45 度（.707 弧度）
    textObj.ObliqueAngle = 0.707
    textObj.Update
End Sub


设置文字生成标志

设置倾斜角度
使用文字样式
使用单行文字
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用文字样式 >
设置文字生成标志

文字生成标志指定文字是否要反向或倒置显示。要设置文字生成标志，请使用 TextGenerationFlag 特性。要使文字反向显示，请为此特性输入 acTextFlagBackward。要使文字倒置显示，请为此特性输入 acTextFlagUpsideDown。要反向和倒置显示文字，请将两个常量相加，方法是为该特性输入 acTextFlagBackward+acTextFlagUpsidedown。

反向显示文字

本例创建一个文字行，然后使用 TextGenerationFlag 特性将其设置为反向显示。

Sub Ch4_ChangingTextGenerationFlag()
    Dim textObj As AcadText
    Dim textString As String
    Dim insertionPoint(0 To 2) As Double
    Dim height As Double
    ' 创建 Text 对象
    textString = "Hello, World."
    insertionPoint(0) = 3
    insertionPoint(1) = 3
    insertionPoint(2) = 0
    height = 0.5
    Set textObj = ThisDrawing.ModelSpace. _
                AddText(textString, insertionPoint, height)
    ' 修改 TextGenerationFlag 的值
    textObj.TextGenerationFlag = acTextFlagBackward
    textObj.Update
End Sub


使用单行文字

设置文字生成标志
将文字添加到图形
创建单行文字
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 >
使用单行文字

添加到图形中的文字可以表达各种信息，可以是复杂的技术要求、标题栏信息、标签，甚至是图形的一部分。对于不需要多种字体或多行文字的较短输入项，使用 Text 对象创建单行文字。单行文字可以方便地用于标签。

本节内容

  • 创建单行文字
  • 格式化单行文字
  • 对齐单行文字
  • 更改单行文字


创建单行文字

使用单行文字
使用单行文字
格式化单行文字
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用单行文字 >
创建单行文字

使用单行文字时，每个单行文字都是一个不同的对象。要创建单行文字对象，请使用 AddText 方法。此方法需要输入三个值：文字字符串、插入点和文字高度。

字符串是要显示的实际文字，可以是 Unicode、控制代码和特殊字符。插入点是包含三个双精度数的变量数组，这三个数代表图形中放置文字处的三维 WCS 坐标。文字高度是代表大写文字高度的正数，高度是以当前单位测量的。

要创建单行文字的步骤

本例在模型空间中的 (2,2,0) 坐标处创建一行文字。

Sub Ch4_CreateText()
    Dim textObj As AcadText
    Dim textString As String
    Dim insertionPoint(0 To 2) As Double
    Dim height As Double
    ' 创建 Text 对象
    textString = "Hello, World."
    insertionPoint(0) = 2
    insertionPoint(1) = 2
    insertionPoint(2) = 0
    height = 0.5
    Set textObj = ThisDrawing.ModelSpace. _
                AddText(textString, insertionPoint, height)
    textObj.Update
End Sub


格式化单行文字

创建单行文字
使用单行文字
对齐单行文字
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用单行文字 >
格式化单行文字

Text 对象是使用活动文字样式创建的。用户可以通过修改与对象关联的文字样式或是编辑 Text 对象的特性来修改 Text 对象的格式，但不能对单个单词和字符应用格式。

要修改单个 Text 对象的关联文字样式，请将 StyleName 特性设置为新的文字样式。修改文字样式之后，使用 Text 对象的 Update 方法查看图形中的变化。

除了图元的标准可编辑特性（颜色、图层、线型等），用户还可以更改 Text 对象的其他特性，包括：

Alignment

指定文字的水平和垂直对齐方式。

InsertionPoint

指定文字的插入点。

ObliqueAngle

指定一个文字对象的倾斜角度。

Rotation

指定文字的旋转角度（以弧度为单位）。

ScaleFactor

指定文字的缩放比例。

TextAlignmentPoint

指定文字的对齐点。

TextGenerationFlag

指定文字是否反向、倒置显示或两者同时。

TextString

指定显示的实际字符串。

修改特性之后，使用 Update 方法查看图形中的变化。

注意有关方法和特性的完整列表，请参见 AutoCAD《ActiveX and VBA Reference》中的“Text object”文档。


对齐单行文字

格式化单行文字
使用单行文字
更改单行文字
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用单行文字 >
对齐单行文字

可以在水平和垂直方向对齐单行文字。左对齐是默认选项。要设置水平和垂直对齐选项，请使用 Alignment 特性。

重新对齐文字

本例创建一个 Text 对象和一个 Point 对象。Point 对象被设置为文字对齐点，并变为红色的十字光标，使其可见。文字对齐将被修改，并显示消息框以终止宏的执行，这样用户就可以查看修改文字对齐的影响。

Sub Ch4_TextAlignment()
    Dim textObj As AcadText
    Dim textString As String
    Dim insertionPoint(0 To 2) As Double
    Dim height As Double
    ' 定义新的 Text 对象
    textString = "Hello, World."
    insertionPoint(0) = 3
    insertionPoint(1) = 3
    insertionPoint(2) = 0
    height = 0.5
    ' 在模型空间中创建 Text 对象
    Set textObj = ThisDrawing.ModelSpace. _
                    AddText(textString, insertionPoint, height)
    ' 在文字对齐点上创建一个点，
    ' 以便更清楚地看到对齐过程
    Dim pointObj As AcadPoint
    Dim alignmentPoint(0 To 2) As Double
    alignmentPoint(0) = 3
    alignmentPoint(1) = 3
    alignmentPoint(2) = 0
    Set pointObj = ThisDrawing.ModelSpace. _
                    AddPoint(alignmentPoint)
    pointObj.Color = acRed
    ' 将点样式设置为十字光标
    ThisDrawing.SetVariable "PDMODE", 2
   ' 左对齐文字
    textObj.Alignment = acAlignmentLeft
    ThisDrawing.Regen acActiveViewport
    MsgBox "The Text object is now aligned left"
    ' 居中对齐文字
    textObj.Alignment = acAlignmentCenter
    ' 将文字对齐点（所有文字，
    ' 左对齐的文字除外。）
    textObj.TextAlignmentPoint = alignmentPoint
    ThisDrawing.Regen acActiveViewport
    MsgBox "The Text object is now centered"
    ' 右对齐文字
    textObj.Alignment = acAlignmentRight
    ThisDrawing.Regen acActiveViewport
    MsgBox "The Text object is now aligned right"
End Sub


更改单行文字

对齐单行文字
使用单行文字
使用多行文字
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用单行文字 >
更改单行文字

与其他所有对象一样，也可以移动、旋转、删除和复制 Text 对象。还可以镜像文字。如果不希望在镜像文字将将其反转，可以将 MIRRTEXT 系统变量设置为 0（零）。

下表列出了编辑 Text 对象使用的一些方法。完整列表请参见 AutoCAD《ActiveX and VBA Reference》中的 Text 对象文档。

ArrayPolar

创建环形阵列。

ArrayRectangular

创建矩形阵列。

Copy

复制 Text 对象。

Erase

删除 Text 对象。

Mirror

镜像 Text 对象。

Move

移动 Text 对象。

Rotate

旋转 Text 对象。


使用多行文字

更改单行文字
将文字添加到图形
创建多行文字
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 >
使用多行文字

对于较长的、复杂的输入项，可以创建多行文字。多行文字将布满指定的宽度，而在垂直方向上可以无限延伸。用户可以格式化多行文字中的单个单词或字符。

本节内容

  • 创建多行文字
  • 格式化多行文字


创建多行文字

使用多行文字
使用多行文字
格式化多行文字
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用多行文字 >
创建多行文字

可以使用 AddMText 方法来创建多行文字对象（MText 对象）。此方法需要输入三个值：文字字符串、图形中用于放置文字的插入点和文字边框的宽度。

字符串是要显示的实际文字，可以是 Unicode、控制代码和特殊字符。插入点是包含三个双精度数的变量数组，这三个数代表图形中放置文字处的三维 WCS 坐标。文字宽度是代表文字边框宽度的正数，宽度是以当前单位测量的。

创建 MText 对象之后，用户可以将文字高度、对正、旋转角度和样式应用到 MText 对象，或将字符格式应用到选定字符。

有关应用于 MText 对象的方法和特性的列表，请参见《ActiveX and VBA Reference》中 MText 的相关条目。

创建多行文字的步骤

以下代码在模型空间中的 (2,2,0) 坐标处创建 MText 对象。

Sub Ch4_CreateMText()
    Dim mtextObj As AcadMText
    Dim insertPoint(0 To 2) As Double
    Dim width As Double
    Dim textString As String
    insertPoint(0) = 2
    insertPoint(1) = 2
    insertPoint(2) = 0
    width = 4
    textString = "This is a text string for the mtext object."
    ' 在模型空间中创建文字对象
    Set mtextObj = ThisDrawing.ModelSpace. _
               AddMText(insertPoint, width, textString)
    ZoomAll
End Sub


格式化多行文字

创建多行文字
使用多行文字
使用 Unicode 字符、控制代码和特殊字符
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 使用多行文字 >
格式化多行文字

新的文字将自动使用当前文字样式的特征。默认文字样式是 STANDARD。用户可以通过格式化个别字符和对 Text 对象应用特性来替代默认的文字样式，也可以使用本节介绍的方法指定格式或特殊字符。

方向选项（例如样式、对正、宽度和旋转）可以影响多行文字边框内的所有文字，而不是只影响特定的字或字符。使用 AttachmentPoint 特性修改多行文字的对正方式，使用 Rotation 特性控制文字边界的旋转角度。

使用 StyleName 特性设置新文字的默认字体和格式特征。创建文字时，可以从现有的样式列表中选择要使用的样式。用户修改某个部分应用了字符格式的 MText 对象的样式时，样式将应用到整个对象，但字符的某些格式可能无法保留。例如，如果一种 TrueType 样式更改为使用 SHX 字体或使用其他的 TrueType 字体，将导致整个对象的文字使用新字体，而所有的字符格式都会丢失。

格式选项（例如下划线、堆叠文字或字体）可以应用到段落中的个别单词或字符。用户可以修改颜色、字体和文字高度，还可以修改文字的字符间距或是增加字符的宽度。

使用大括号 ({ }) 可以仅对括号内的文字应用格式修改。用户最多可以设置八层深度的括号。

用户也可以在行或段落中输入控制代码的 ASCII 等价值来表示格式或特殊字符，例如公差和标注符号。

以下控制字符可用来创建图解中的文字。（关于此字符串的 ASCII 等价值，请参见以下图解。）

{{\H1.5x; Big text} \A2; over text\A1;/\A0; under text}

有关设置多行文字格式的详细信息，请参见《用户手册》中的“设置多行文字中字符的格式”。

使用控制字符格式化文字

本例创建并格式化 MText 对象。

Sub Ch4_FormatMText()
    Dim mtextObj As AcadMText
    Dim insertPoint(0 To 2) As Double
    Dim width As Double
    Dim textString As String
    insertPoint(0) = 2
    insertPoint(1) = 2
    insertPoint(2) = 0
    width = 4
    ' 定义控制字符的 ASCII 字符
    Dim OB As Long ' Open Bracket {
    Dim CB As Long ' Close Bracket }
    Dim BS As Long ' 反斜杠 \
    Dim FS As Long ' 正斜杠 /
    Dim SC As Long ' 分号 ;
    OB = Asc("{")
    CB = Asc("}")
    BS = Asc("\")
    FS = Asc("/")
    SC = Asc(";")
    ' 将以下控制字符和文字字符
    ' 指定给字符串：
    ' {{\H1.5x; Big text}\A2; over text\A1;/\A0; under text}
    textString = Chr(OB) + Chr(OB) + Chr(BS) + "H1.5x" _
    + Chr(SC) + "Big text" + Chr(CB) + Chr(BS) + "A2" _
    + Chr(SC) + "over text" + Chr(BS) + "A1" + Chr(SC) _
    + Chr(FS) + Chr(BS) + "A0" + Chr(SC) + "under text" _
    + Chr(CB)
    ' 在模型空间中创建文字对象
    Set mtextObj = ThisDrawing.ModelSpace. _
               AddMText(insertPoint, width, textString)
    ZoomAll
End Sub


使用 Unicode 字符、控制代码和特殊字符

格式化多行文字
将文字添加到图形
替换字体
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 >
使用 Unicode 字符、控制代码和特殊字符

用户可以在字符串中使用 Unicode 字符、控制代码和特殊字符来代表符号。（所有的非文字字符必须用其 ASCII 等价值输入。）

用户可以输入以下 Unicode 字符串来创建特殊字符：

Unicode 字符说明
Unicode 字符 | 说明
\U+00B0 | 度符号
\U+00B1 | 正/负公差符号
\U+2205 | 直径标注符号

除了可以使用 Unicode 字符作为特殊字符外，用户还可以通过在字符串中包括控制信息来指定特殊字符。使用两个百分数符号 (%%) 引入每个控制序列。例如，以下控制代码使用标准 AutoCAD 文字和 PostScript 字体描绘字符编号 nnn：

%%nnn

在 VB 或 VBA 文字字符串中，本样例应该输入为

Dim percent as Long
percent = ASC("%")
TextString = chr(percent) + chr(percent) + "nnn"

这些控制代码仅使用标准 AutoCAD 文字字体：

控制代码说明
控制代码 | 说明
%%o | 打开或关闭上划线模式
%%u | 打开或关闭下划线模式
%%d | 绘制度符号
%%p | 绘制正/负公差符号
%%c | 绘制直径标注符号
%%% | 绘制一个百分数符号


替换字体

使用 Unicode 字符、控制代码和特殊字符
将文字添加到图形
指定替换默认字体
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 >
替换字体

用户可以指定字体，该字体可以替代其他字体，或作为 AutoCAD 找不到图形中指定字体时的默认字体。

图形中文字的字体取决于文字样式，对于多行文字则取决于各部分文字应用的字体格式。

用户可以使用字体映射表确保图形中仅使用某种字体，或者将使用的字体转换为其他字体。可以使用这些字体映射表来强制共享字体标准或进行脱机打印。AutoCAD 附带一个默认字体映射表。可以使用任意 ASCII 文字编辑器编辑该文件。也可以使用 Preferences 对象的 FontFileMap 特性来指定其他字体映射表文件。

有关字体映射表和替换字体的详细信息，请参见《用户手册》中的“替换字体”。

本节内容

  • 指定替换默认字体


指定替换默认字体

替换字体
替换字体
拼写检查
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 > 替换字体 >
指定替换默认字体

如果用户图形指定了当前系统中不存在的字体，AutoCAD 将自动用指定的替换字体替换该字体。默认情况下，AutoCAD 使用 simplex.shx 文件。但用户也可以根据需要指定另一种字体。使用 Preferences 对象的 AltFontFile 特性来设置替换字体的文件名。

如果用户使用具有大字体的文字样式，可以使用 AltFontFile 特性映射其他字体，此系统变量使用默认的 txt.shx、bigfont.shx 字体文件对。

如果 AutoCAD 在打开图形时找不到字体文件，将应用默认的字体集替代规则。


拼写检查

指定替换默认字体
将文字添加到图形
标注和公差
ActiveX/VBA 开发人员手册 > 创建和编辑 AutoCAD 图元 > 将文字添加到图形 >
拼写检查

在拼写检查过程中，AutoCAD 将图形中的词语与当前主词典中的词语相匹配。所有新添加的词语都存储自定义词典中，该词典在执行拼写检查时是当前词典。例如，用户可以添加正确的名称，以便 AutoCAD 不再将其标识为拼错的单词。

要检查其他语言的拼写，可以切换到另一个主词典。

AutoCAD ActiveX Automation 没有提供拼写检查的方法。但是，用户可以使用 Preferences 对象的 MainDictionary 特性指定其他主词典，也可以使用 CustomDictionary 特性指定其他自定义词典。

有关拼写检查的详细信息，请参见《用户手册》中的“拼写检查”。


标注和公差

拼写检查
标注的概念
ActiveX/VBA 开发人员手册 >
标注和公差

标注用于将测量值添加到图形中。而公差用于指定标注的变化范围。通过 ActiveX Automation，可以使用标注样式和标注替代来管理标注。

本节内容

  • 标注的概念
  • 创建标注
  • 编辑标注
  • 使用标注样式
  • 模型空间和图纸空间中的标注
  • 创建引线和注释
  • 使用形位公差


标注的概念

标注和公差
标注和公差
标注的组成部分
ActiveX/VBA 开发人员手册 > 标注和公差 >
标注的概念

标注可以显示对象的形位测量值、对象之间的距离或角度，以及特征的 X 坐标和 Y 坐标。AutoCAD® 提供了三种基本类型的标注：线性标注、半径标注和角度标注。线性标注包括对齐标注、转角标注和坐标标注。

可以为直线、多线、圆弧、圆和多段线线段创建标注，也可以创建独立的标注。

AutoCAD 在当前图层上绘制标注。每个标注均与一个标注样式相关联，无论此标注是默认标注还是用户定义的标注。样式可以控制诸如颜色、文字样式和线型比例等标注特征，但不支持厚度信息。样式族可以针对不同类型的标注，对基本样式进行细微的修改；而替代可以对特定的标注进行样式修改。

有关标注的详细信息，请参见《用户手册》中的“更改现有对象”。

本节内容

  • 标注的组成部分
  • 定义标注系统变量
  • 设置标注文字样式
  • 了解引线
  • 了解关联标注


标注的组成部分

标注的概念
标注的概念
定义标注系统变量
ActiveX/VBA 开发人员手册 > 标注和公差 > 标注的概念 >
标注的组成部分

本节简要定义了标注的组成部分。

尺寸线是指示标注的方向和范围的线。对于角度标注，尺寸线是圆弧。尺寸界线（也称为投影线或证示线）从被标注的特征上延长至尺寸线。尺寸线的两端会添加箭头（也称为终止符号或终止）。通常，标注文字是指示实际测量值的字符串，它也可能会包含前缀、后缀和公差。引线是将注释连接到其参照的特征的实线。圆心标记是用于标记圆或圆弧的圆心的小十字线。中心线是标记圆或圆弧的圆心的打断线。

有关标注的组成部分的详细信息，请参见《用户手册》中的“标注的组成部分“。


定义标注系统变量

标注的组成部分
标注的概念
设置标注文字样式
ActiveX/VBA 开发人员手册 > 标注和公差 > 标注的概念 >
定义标注系统变量

标注系统变量可以控制标注的外观。标注系统变量包括 DIMAUNIT、DIMUPT、DIMTOFL、DIMFIT、DIMTIH、DIMTOH、DIMJUST 和 DIMTAD。使用 SetVariable 方法可以设置这些变量。例如，以下代码行将 DIMAUNIT 系统变量（角度标注的单位格式）设置为弧度 (3)：

ThisDrawing.SetVariable "DIMAUNIT", 3

有关标注系统变量的详细信息，请参见《用户手册》中的“使用标注样式”。


设置标注文字样式

定义标注系统变量
标注的概念
了解引线
ActiveX/VBA 开发人员手册 > 标注和公差 > 标注的概念 >
设置标注文字样式

标注文字是指与标注关联的任何种类的文字，包括单行或段落形式的测量值、尺寸公差、形位公差、前缀、后缀和文字注解。用户可以将 AutoCAD 计算出的默认测量值用作文字，也可以提供自己的标注文字，或者完全消去文字。标注文字可以用来添加信息，例如特殊的制造程序说明或组装说明。

单行标注文字使用由 ActiveTextStyle 特性指定的活动文字样式。段落文字也使用活动的文字样式，但还包含用户在字符串中所做的任何修改。

有关标注文字的详细信息，请参见《用户手册》中的“控制标注文字”。


了解引线

设置标注文字样式
标注的概念
了解关联标注
ActiveX/VBA 开发人员手册 > 标注和公差 > 标注的概念 >
了解引线

默认的引线是指向图形中某个特征的带箭头的直线。通常，引线的功能是连接注释和特征。这里的注释指段落文字、块或特征控制框。这种引线不同于 AutoCAD 为半径标注、直径标注和线性标注（其文字不能在尺寸界线之间自动调整）自动创建的简单引线。

引线对象与注释关联，所以在编辑注释时引线也会随着更新。用户可以复制图形中其他位置使用的注释并将其附加到引线上，也可以创建新的注释。还可以创建未附着注释的引线。

有关引线的详细信息，请参见《用户手册》中的“创建文字和引线概述”。


了解关联标注

了解引线
标注的概念
创建标注
ActiveX/VBA 开发人员手册 > 标注和公差 > 标注的概念 >
了解关联标注

当与关联标注相关联的几何对象被修改时，关联标注会自动调整其位置、方向和测量值。DIMASSOC 系统变量用于控制关联标注。将 DIMASSOC 设置为 2 以打开关联标注。

有关关联标注的详细信息，请参见《用户手册》中的“关联标注”。


创建标注

了解关联标注
标注和公差
创建线性标注
ActiveX/VBA 开发人员手册 > 标注和公差 >
创建标注

可以创建线性、半径、角度和坐标标注。

创建标注时，使用的是活动标注样式。创建之后，可以对尺寸界线原点、标注文字位置、标注文字内容以及与尺寸线的相对角度进行修改，也可以修改标注使用的标注样式。

有关创建标注的详细信息，请参见《用户手册》中的“更改现有对象”。

本节内容

  • 创建线性标注
  • 创建半径标注
  • 创建角度标注
  • 创建坐标标注


创建线性标注

创建标注
创建标注
创建半径标注
ActiveX/VBA 开发人员手册 > 标注和公差 > 创建标注 >
创建线性标注

线性标注可以是对齐标注或转角标注。对齐标注的尺寸线与尺寸界线原点所在的线平行；而转角标注的尺寸线与尺寸界线原点形成一定的角度。

要创建线性标注，请使用 AddDimAligned 或 AddDimRotated 方法。创建线性标注之后，可以修改文字、文字的角度或尺寸线的角度。在下面的图解中，明确指定了尺寸界线的原点。图解中还显示了产生的尺寸线位置：

要创建对齐标注，请使用 AddDimAligned 方法。这个方法需要输入三个坐标值：两条尺寸界线的原点和文字位置。

要创建转角标注，请使用 AddDimRotated 方法。这个方法需要输入三个坐标值和尺寸线的角度。三个坐标值分别是两条尺寸界线的原点和文字位置值。角度必须以弧度提供，代表尺寸线的旋转角度。

有关创建线性标注的详细信息，请参见《用户手册》中的“创建线性标注”。


创建半径标注

创建线性标注
创建标注
创建角度标注
ActiveX/VBA 开发人员手册 > 标注和公差 > 创建标注 >
创建半径标注

半径标注用于测量圆弧和圆的半径与直径。要创建半径标注，请使用 AddDimRadial 方法。

根据圆或圆弧的大小、TextPosition 特性以及 DIMUPT、DIMTOFL、DIMFIT、DIMTIH、DIMTOH、DIMJUST 和 DIMTAD 标注系统变量中的值，可以创建各种类型的半径标注。（系统变量可以使用 GetVariable 和 SetVariable 方法查询或设置。）

对于水平标注文字，如果尺寸线与水平线的角度大于 15 度，而且位于圆或圆弧的外面，则 AutoCAD 将绘制钩线，也称为引导线或弯钩。钩线为一个箭头的长度，放在标注文字的旁边，如以下图解所示：

要创建半径标注，请使用 AddDimRadial 或 AddDimDiametric 方法。这些方法均需要输入三个值：圆或圆弧的圆心坐标、引线附着点的坐标以及引线的长度。

这些方法使用 LeaderLength 参数的值作为从 ChordPoint 到标注为注释文字绘制水平钩线的起点的距离（如果不需要钩线则停止）。

有关创建半径标注的详细信息，请参见《用户手册》中的“创建半径标注”。

创建半径标注

本例在模型空间中创建半径标注。

Sub Ch5_CreateRadialDimension()
    Dim dimObj As AcadDimRadial
    Dim center(0 To 2) As Double
    Dim chordPoint(0 To 2) As Double
    Dim leaderLen As Integer
    ' 定义标注
    center(0) = 0
    center(1) = 0
    center(2) = 0
    chordPoint(0) = 5
    chordPoint(1) = 5
    chordPoint(2) = 0
    leaderLen = 5
    ' 在模型空间中创建半径标注
    Set dimObj = ThisDrawing.ModelSpace. _
           AddDimRadial(center, chordPoint, leaderLen)
    ZoomAll
End Sub
注意只有当标注设置为使用默认的文字位置值时，才会在创建标注时使用 LeaderLength 设置。在第一次关闭标注之后，修改 LeaderLength 的值不会影响标注的显示方式，但是新的设置会被存储并在 DXF、LISP 和 ADSRX 应用程序中表现出来。


创建角度标注

创建半径标注
创建标注
创建坐标标注
ActiveX/VBA 开发人员手册 > 标注和公差 > 创建标注 >
创建角度标注

角度标注用于测量两条线或三个点之间的角度。例如，用户可以使用它们来测量圆的两个半径之间的角度。尺寸线会形成一个圆弧。

要创建角度标注，请使用 AddDimAngular 方法。这个方法需要输入三个值：角度顶点、尺寸界线原点和文字位置。AngleVertex 是圆或圆弧的圆心，或是被标注的两条线之间的公共顶点。尺寸界线的原点是两条尺寸界线穿过的点。

AngleVertex 可以是其中的一个原点。如果用户需要尺寸界线，它们会被自动添加。

有关创建角度标注的详细信息，请参见《用户手册》中的“创建角度标注”。

创建角度标注

本例在模型空间中创建角度标注。

Sub Ch5_CreateAngularDimension()
    Dim dimObj As AcadDimAngular
    Dim angVert(0 To 2) As Double
    Dim FirstPoint(0 To 2) As Double
    Dim SecondPoint(0 To 2) As Double
    Dim TextPoint(0 To 2) As Double
    ' 定义标注
    angVert(0) = 0
    angVert(1) = 5
    angVert(2) = 0
    FirstPoint(0) = 1
    FirstPoint(1) = 7
    FirstPoint(2) = 0
    SecondPoint(0) = 1
    SecondPoint(1) = 3
    SecondPoint(2) = 0
    TextPoint(0) = 3
    TextPoint(1) = 5
    TextPoint(2) = 0
    ' 在模型空间中创建角度标注
    Set dimObj = ThisDrawing.ModelSpace. _
     AddDimAngular(angVert, FirstPoint, SecondPoint, TextPoint)
    ZoomAll
End Sub


创建坐标标注

创建角度标注
创建标注
编辑标注
ActiveX/VBA 开发人员手册 > 标注和公差 > 创建标注 >
创建坐标标注

坐标（或基准）标注用于测量从原点（称为基准点）到被标注的特征（例如部件上的孔）之间的垂直距离。这些标注通过保持特征与基准点之间的精确偏移量，来避免误差增大。

坐标标注由带引线的 X 或 Y 坐标组成。X 基准坐标标注沿 X 轴测量特征点与基准点的距离。Y 基准坐标标注沿着 Y 轴测量相同的距离。AutoCAD 使用当前用户坐标系 (UCS) 的原点确定测量的坐标。坐标使用绝对值。

文字将与坐标引线对齐，而不考虑当前标注样式定义的文字方向。用户可以接受默认文字，也可以提供自己的文字。

要创建坐标标注，请使用 AddDimOrdinate 方法。这个方法需要输入三个值：用于指定要标注的点的坐标 (A)、用于指定引线端点的坐标 (B) 以及用于指定标注是 X 基准坐标标注还是 Y 基准坐标标注的布尔标志。如果为布尔标志输入 TRUE，该方法将创建 X 基准坐标标注。如果输入 FALSE，则会创建 Y 基准坐标标注。

有关创建坐标标注的详细信息，请参见《用户手册》中的“创建坐标标注”。

创建坐标标注

本例在模型空间中创建坐标标注。

Sub Ch5_CreatingOrdinateDimension()
    Dim dimObj As AcadDimOrdinate
    Dim definingPoint(0 To 2) As Double
    Dim leaderEndPoint(0 To 2) As Double
    Dim useXAxis As Long
    ' 定义标注
    definingPoint(0) = 5
    definingPoint(1) = 5
    definingPoint(2) = 0
    leaderEndPoint(0) = 10
    leaderEndPoint(1) = 5
    leaderEndPoint(2) = 0
    useXAxis = 5
    ' 在模型空间中创建坐标标注
    Set dimObj = ThisDrawing.ModelSpace. _
               AddDimOrdinate(definingPoint, _
               leaderEndPoint, useXAxis)
    ZoomAll
End Sub


编辑标注

创建坐标标注
标注和公差
替代标注文字
ActiveX/VBA 开发人员手册 > 标注和公差 >
编辑标注

与对待 AutoCAD 中的其他图形对象一样，用户也可以使用为对象提供的标准方法和特性来编辑标注。

以下特性可用于大多数标注对象：

Rotation

指定尺寸线的旋转角度（以弧度为单位）。

StyleName

指定标注样式的名称。

TextOverride

为标注指定字符串。

TextPosition

指定标注文字的位置。

TextRotation

指定标注文字的旋转角度。

Measurement

指定标注的实际测量值。

此外，某些标注对象还提供一些特性，用于编辑尺寸界线原点和引线长度。

以下方法用于标注对象编辑：

ArrayPolar

创建环形阵列。

ArrayRectangular

创建矩形阵列。

Copy

复制标注对象。

Erase

删除标注对象。

Mirror

镜像标注对象。

Move

移动标注对象。

Rotate

旋转标注对象。

ScaleEntity

缩放标注对象。

有关编辑标注的详细信息，请参见《用户手册》中的“修改现有标注”。

本节内容

  • 替代标注文字


替代标注文字

编辑标注
编辑标注
使用标注样式
ActiveX/VBA 开发人员手册 > 标注和公差 > 编辑标注 >
替代标注文字

可以使用 TextOverride 特性来替换所显示的标注值。使用此特性可以完全替换所显示的标注值，也可以向该值附加文字。

修改标注文字

本例向标注值附加了文字，所以既显示字符串，又显示标注值。

Sub Ch5_OverrideDimensionText()
    Dim dimObj As AcadDimAligned
    Dim point1(0 To 2) As Double
    Dim point2(0 To 2) As Double
    Dim location(0 To 2) As Double
    ' 定义标注
    point1(0) = 5#: point1(1) = 3#: point1(2) = 0#
    point2(0) = 10#: point2(1) = 3#: point2(2) = 0#
    location(0) = 7.5: location(1) = 5#: location(2) = 0#
    ' 在模型空间中创建对齐标注对象
    Set dimObj = ThisDrawing.ModelSpace. _
                   AddDimAligned(point1, point2, location)
    ' 修改标注的字符串
    dimObj.TextOverride = "The value is <>"
    dimObj.Update
End Sub


使用标注样式

替代标注文字
标注和公差
创建、修改和复制标注样式
ActiveX/VBA 开发人员手册 > 标注和公差 >
使用标注样式

命名标注样式是一组用于确定标注外观的设置。使用命名标注样式，可以建立和实施图形的绘图标准。

所有标注都使用活动标注样式来创建。如果在创建标注之前未定义或应用样式，则 AutoCAD 将应用默认样式 STANDARD。要设置活动标注样式，请使用 ActiveDimStyle 特性。

要设置上级标注样式，请从命名和保存样式开始。新样式以当前样式为基础，并包括对标注组成部分的布局、文字位置以及注释外观的所有后续更改。这里的注释指主单位、换算单位、公差和文字。

有关标注样式的详细信息，请参见《用户手册》中的“使用标注样式”。

本节内容

  • 创建、修改和复制标注样式
  • 替代标注样式


创建、修改和复制标注样式

使用标注样式
使用标注样式
替代标注样式
ActiveX/VBA 开发人员手册 > 标注和公差 > 使用标注样式 >
创建、修改和复制标注样式

要创建新的标注样式，请使用 Add 方法。这个方法需要输入新标注样式的名称。

AutoCAD ActiveX Automation 允许添加新的标注样式和修改活动标注样式。也可以通过 StyleName 特性来修改与给定标注关联的标注样式。

用户也可以复制一种现有样式或一组替代。使用 CopyFrom 方法，将标注样式从源对象复制到新标注样式中。源对象可以是另一个 DimStyle 对象、标注、Tolerance 或 Leader 对象，甚至可以是 Document 对象。如果从另一个标注样式复制样式设置，则样式被精确复制。如果从标注、Tolerance 或 Leader 对象复制样式的设置，则当前设置（包括所有对象替代）会被复制到新样式中。如果复制 Document 对象的样式，则活动标注样式加上所有的图形替代，会被复制到新样式。

复制标注样式和标注替代

本样例创建三个新的标注样式，并将文档、给定标注样式和给定标注的当前设置分别复制到各个新的标注样式中。如果在运行此样例之前进行适当的设置，将发现创建的是不同的标注样式。

  1. 创建新的图形并使其成为活动的图形。
  2. 在新的图形中创建线性标注。此标注应该是图形中仅有的对象。
  3. 将标注线的颜色更改为黄色。
  4. 将 DIMCLRD 系统变量改为 5（蓝色）。
  5. 运行以下样例：
Sub Ch5_CopyDimStyles()
    Dim newStyle1 As AcadDimStyle
    Dim newStyle2 As AcadDimStyle
    Dim newStyle3 As AcadDimStyle
    Set newStyle1 = ThisDrawing.DimStyles.Add _
                    ("Style 1 copied from a dim")
    Call newStyle1.CopyFrom(ThisDrawing.ModelSpace(0))
    Set newStyle2 = ThisDrawing.DimStyles.Add _
                    ("Style 2 copied from Style 1")
    Call newStyle2.CopyFrom(ThisDrawing.DimStyles.Item _
                    ("Style 1 copied from a dim"))
    Set newStyle2 = ThisDrawing.DimStyles.Add _
                    ("Style 3 copied from the running drawing values")
    Call newStyle2.CopyFrom(ThisDrawing)
End Sub
打开 DIMSTYLE 对话框。现在应该列出了三种标注样式。样式 1 应该具有黄色的尺寸线，样式 2 应该与样式 1 相同，而样式 3 应该具有蓝色的尺寸线。


替代标注样式

创建、修改和复制标注样式
使用标注样式
模型空间和图纸空间中的标注
ActiveX/VBA 开发人员手册 > 标注和公差 > 使用标注样式 >
替代标注样式

每个标注都可以替代该标注的标注样式中的设置值。以下特性可用于大多数标注对象：

AltRoundDistance

指定换算单位的舍入。

AngleFormat

指定角度标注的单位格式。

Arrowhead1Block、Arrowhead2Block

指定用作尺寸线的自定义箭头的块。

Arrowhead1Type、Arrowhead2Type

指定尺寸线的箭头类型。

ArrowheadSize

指定尺寸线箭头、引线箭头和钩线的大小。

CenterMarkSize

指定半径标注和直径标注的中心标记大小。

CenterType

指定半径标注和直径标注的中心标记类型。

DecimalSeparator

指定在十进制标注和公差值中用作小数分隔符的字符。

DimensionLineColor

指定标注、引线或公差对象的尺寸线颜色。

DimensionLineWeight

指定尺寸线的线宽。

DimLine1Suppress、DimLine2Suppress

指定是否隐藏尺寸线。

DimLineInside

指定是否只在尺寸界线之内显示尺寸线。

ExtensionLineColor

指定标注的尺寸界线的颜色。

ExtensionLineExtend

指定尺寸界线超出尺寸线的距离。

ExtensionLineOffset

指定尺寸界线从原点偏移的距离。

ExtensionLineWeight

指定尺寸界线的线宽。

ExtLine1EndPoint、ExtLine2EndPoint

指定尺寸界线的端点。

ExtLine1StartPoint、ExtLine2StartPoint

指定尺寸界线的起点。

ExtLine1Suppress、ExtLine2Suppress

指定是否隐藏尺寸界线。

拟合

指定文字和箭头在尺寸界线的内部或外部。

ForceLineInside

指定当文字放在尺寸界线之外时是否仍要在尺寸界线之间画一条尺寸线。

FractionFormat

指定标注和公差中的分数值的格式。

HorizontalTextPosition

指定标注文字的水平对正方式。

LinearScaleFactor

指定线性标注测量值的全局缩放比例。

PrimaryUnitsPrecision

指定标注或公差的主单位的小数位数。

SuppressLeadingZeros、SuppressTrailingZeros

指定是否隐藏标注值中的前导零和后续零。

SuppressZeroFeet、SuppressZeroInches

指定是否隐藏标注值中的零英尺和零英寸测量值。

TextColor

指定标注和公差对象的文字颜色。

TextGap

指定当用户截断尺寸线以放置标注文字时，标注文字与尺寸线之间的距离。

TextHeight

指定标注或公差文字的高度。

TextInside

指定是否在尺寸界线之内绘制标注文字。

TextInsideAlign

指定所有标注类型（坐标标注除外）的标注文字是否位于尺寸界线之内。

TextMovement

指定当文字移动时标注文字的绘制方式。

TextOutsideAlign

指定所有标注类型（坐标标注除外）的标注文字在尺寸界线之外的位置。

TextPosition

指定标注文字的位置。

TextPrecision

指定角度标注文字的精度。

TextPrefix

指定标注值的前缀。

TextRotation

指定标注文字的旋转角度。

TextSuffix

指定标注值的后缀。

ToleranceDisplay

指定公差是否要与标注文字一起显示。

ToleranceHeightScale

指定公差值文字高度相对于标注文字高度的比例。

ToleranceJustification

指定公差值相对于标注文字的垂直对正方式。

ToleranceLowerLimit

指定标注文字公差的下限。

TolerancePrecision

指定主标注中公差值的精度。

ToleranceSuppressLeadingZeros

指定是否隐藏公差值中的前导零。

ToleranceSuppressTrailingZeros

指定是否隐藏标注值中的后续零。

ToleranceUpperLimit

指定标注文字公差的上限。

UnitsFormat

指定所有标注（角度标注除外）的单位格式。

VerticalTextPosition

指定文字相对于尺寸线的垂直位置。

为对齐标注输入用户定义的后缀

本例在模型空间中创建对齐标注，并使用 TextSuffix 特性让用户来修改标注的文字后缀。

Sub Ch5_AddTextSuffix()
    Dim dimObj As AcadDimAligned
    Dim point1(0 To 2) As Double
    Dim point2(0 To 2) As Double
    Dim location(0 To 2) As Double
    Dim suffix As String
    ' 定义标注
    point1(0) = 0: point1(1) = 5: point1(2) = 0
    point2(0) = 5: point2(1) = 5: point2(2) = 0
    location(0) = 5: location(1) = 7: location(2) = 0
    ' 在模型空间中创建对齐标注对象
    Set dimObj = ThisDrawing.ModelSpace. _
                 AddDimAligned(point1, point2, location)
    ThisDrawing.Application.ZoomAll
    ' 允许用户修改标注的文字后缀
    suffix = InputBox("Enter a new text suffix for the dimension" _
                      , "Set Dimension Suffix", ":SUFFIX")
    ' 将修改应用到标注
    dimObj.TextSuffix = suffix
    ThisDrawing.Regen acAllViewports
End Sub


模型空间和图纸空间中的标注

替代标注样式
标注和公差
创建引线和注释
ActiveX/VBA 开发人员手册 > 标注和公差 >
模型空间和图纸空间中的标注

可以在图纸空间和模型空间中绘制标注。但是，如果要标注的几何图形位于模型空间中，则最好在模型空间中绘制标注，因为 AutoCAD 会将定义点放在绘制几何图形的空间中。

如果用户在图纸空间中绘制标注，而此图纸空间用于描述模型空间中的几何图形，则当用户使用编辑命令或者修改模型空间视口中显示的放大比例时，图纸空间标注并不会改变。当用户将视图从图纸空间切换到模型空间时，图纸空间标注仍会停留在原处。

如果正在图纸空间进行标注，并且线性标注的全局缩放比例（DIMLFAC 系统变量）已设置为小于 0（零），则测量的距离将被乘以 DIMLFAC 的绝对值。如果正在模型空间进行标注，则即使 DIMLFAC 小于 0（零），仍将使用值 1.0。如果在“标注”提示下更改变量并选择“视口”选项，则 AutoCAD 将计算 DIMLFAC 的值。AutoCAD 将计算从模型空间到图纸空间的缩放比例，并将该值的负值指定给 DIMLFAC。


创建引线和注释

模型空间和图纸空间中的标注
标注和公差
创建引线
ActiveX/VBA 开发人员手册 > 标注和公差 >
创建引线和注释

引线是图形中将注释连接到特征的线。引线与其注释是关联的，也就是说，如果用户修改注释，引线也会随着更新。请勿混淆 Leader 对象和 AutoCAD 作为尺寸线的一部分而自动生成的引线。

有关引线的详细信息，请参见《用户手册》中的“创建带引线的文字”。

本节内容

  • 创建引线
  • 向引线添加注释
  • 引线关联性
  • 编辑引线关联性
  • 编辑引线


创建引线

创建引线和注释
创建引线和注释
向引线添加注释
ActiveX/VBA 开发人员手册 > 标注和公差 > 创建引线和注释 >
创建引线

可以从图形中的任意点或特征创建引线，并在绘制时控制其外观。引线可以是直线段或平滑的样条曲线。引线颜色由当前的尺寸线颜色控制。引线缩放比例由活动标注样式中设置的全局标注比例控制。箭头的类型和大小（如果有）由活动样式定义的第一个箭头控制。

注释通常由一条小线（称为钩线）连接到引线。如果最后一条引线段与水平线的夹角大于 15 度，则钩线会与多行文字和特征控制框一起显示。钩线具有一个箭头的长度。如果引线没有注释，它也就不会有钩线。

要创建引线，请使用 AddLeader 方法。这个方法需要输入三个值：指定创建引线所在的坐标数组，注释对象（或如果引线没有注释则为 NULL）以及要创建的引线类型。引线类型可用指定引线是直线还是光滑的样条曲线，还可以确定引线是否带箭头。使用以下一个常量来指定引线类型：acLineNoArrow、acLineWithArrow、acSplineNoArrow 或 acSplineWithArrow。这些常量是相互排斥的。

创建引线

本例在模型空间中创建引线。引线没有关联的注释。

Sub Ch5_CreateLeader()
    Dim leaderObj As AcadLeader
    Dim points(0 To 8) As Double
    Dim leaderType As Integer
    Dim annotationObject As AcadObject
    points(0) = 0: points(1) = 0: points(2) = 0
    points(3) = 4: points(4) = 4: points(5) = 0
    points(6) = 4: points(7) = 5: points(8) = 0
    leaderType = acLineWithArrow
    Set annotationObject = Nothing
    ' 在模型空间中创建引线对象
    Set leaderObj = ThisDrawing.ModelSpace. _
          AddLeader(points, annotationObject, leaderType)
    ZoomAll
End Sub


向引线添加注释

创建引线
创建引线和注释
引线关联性
ActiveX/VBA 开发人员手册 > 标注和公差 > 创建引线和注释 >
向引线添加注释

引线注释可以是 Tolerance、MText 或 BlockRef 对象。用户可以创建新注释，也可附加现有注释的副本。创建完注释后，才能将其添加到引线。

要在创建引线时添加注释，请将注释输入到 AddLeader 方法中。


引线关联性

向引线添加注释
创建引线和注释
编辑引线关联性
ActiveX/VBA 开发人员手册 > 标注和公差 > 创建引线和注释 >
引线关联性

引线与其注释是关联的，因此当注释移动时，引线的端点也会随着移动。在移动文字注释和特征控制框注释时，引线的最后一段会根据注释与引线的倒数第二个点之间的关系，决定是附加到注释的左侧还是右侧。如果注释的中点在引线的倒数第二个点的右侧，则引线将附着到右侧，否则将附着到左侧。

使用 Erase、Add（添加块）或 WBlock 方法从图形中删除对象将失去关联性。如果在一次操作中同时复制了引线及其注释，则新的副本也具有关联性。如果分别复制它们，则新的副本没有关联性。如果因为任何原因失去了关联性，例如，只复制了 Leader 对象或删除了注释，钩线都将从引线中删除。

将引线关联到注释

本例创建 MText 对象。接着使用 MText 对象作为其注释来创建引线。

Sub Ch5_AddAnnotation()
    Dim leaderObj As AcadLeader
    Dim mtextObj As AcadMText
    Dim points(0 To 8) As Double
    Dim insertionPoint(0 To 2) As Double
    Dim width As Double
    Dim leaderType As Integer
    Dim annotationObject As Object
    Dim textString As String, msg As String
    ' 在模型空间中创建 MText 对象
    textString = "Hello, World."
    insertionPoint(0) = 5
    insertionPoint(1) = 5
    insertionPoint(2) = 0
    width = 2
    Set mtextObj = ThisDrawing.ModelSpace. _
               AddMText(insertionPoint, width, textString)
    ' 引线的数据
    points(0) = 0: points(1) = 0: points(2) = 0
    points(3) = 4: points(4) = 4: points(5) = 0
    points(6) = 4: points(7) = 5: points(8) = 0
    leaderType = acLineWithArrow
    ' 在模型空间中创建引线对象，并将
    ' MText 对象与引线关联
    Set annotationObject = mtextObj
    Set leaderObj = ThisDrawing.ModelSpace. _
            AddLeader(points, annotationObject, leaderType)
    ZoomAll
End Sub


编辑引线关联性

引线关联性
创建引线和注释
编辑引线
ActiveX/VBA 开发人员手册 > 标注和公差 > 创建引线和注释 >
编辑引线关联性

除了引线和注释之间的关联性关系以外，引线与其注释在图形中是完全独立的两种对象。编辑引线不会影响注释，编辑注释也不会影响引线。

虽然可以使用 DIMCLRT、DIMTXT 和 DIMTXSTY 系统变量通过定义文字注释的颜色、高度和样式来创建文字注释，但是，不能通过这些系统变量对其进行更改，因为文字注释不是真正的标注对象。文字注释的编辑方式必须与任何其他 MText 对象的编辑方式相同。

使用 Evaluate 方法来评估引线及其关联注释的关系。这个方法在需要时会更新引线。


编辑引线

编辑引线关联性
创建引线和注释
使用形位公差
ActiveX/VBA 开发人员手册 > 标注和公差 > 创建引线和注释 >
编辑引线

任何会改变引线注释位置的修改都会影响到关联引线的端点位置。另外，旋转注释也会使引线钩线（如果有）随之旋转。

要调整引线的大小，可以将其缩放。缩放只更新选定对象的比例。例如，如果缩放引线，则注释将保持与引线端点的相对位置不变，而不会进行缩放。

除了缩放以外，还可以移动、镜像和旋转引线。使用 ScaleEntity、Move、Mirror 和 Rotate 方法来编辑引线。也可以使用 StyleName 特性来修改与注释关联的文字样式。


使用形位公差

编辑引线
标注和公差
创建形位公差
ActiveX/VBA 开发人员手册 > 标注和公差 >
使用形位公差

形位公差表示特征的形状、轮廓、方向、位置和跳动的极限偏差。可以通过特征控制框来添加形位公差，这些框会包含一个标注的所有公差信息。

有关使用形位公差符号和操作形位公差的详细信息，请参见《用户手册》中的“添加形位公差”。

本节内容

  • 创建形位公差
  • 编辑公差


创建形位公差

使用形位公差
使用形位公差
编辑公差
ActiveX/VBA 开发人员手册 > 标注和公差 > 使用形位公差 >
创建形位公差

要创建形位公差，请使用 AddTolerance 方法。这个方法需要输入三个值：构成公差符号的文字字符串、图形中放置公差的位置以及用于指定公差方向的方向矢量。用户可以复制、移动、删除、缩放和旋转公差。

创建形位公差

本例在模型空间中创建简单的形位公差。

Sub Ch5_CreateTolerance()
    Dim toleranceObj As AcadTolerance
    Dim textString As String
    Dim insertionPoint(0 To 2) As Double
    Dim direction(0 To 2) As Double
    ' 定义公差对象
    textString = "Here is the Feature Control Frame"
    insertionPoint(0) = 5
    insertionPoint(1) = 5
    insertionPoint(2) = 0
    direction(0) = 1
    direction(1) = 1
    direction(2) = 0
    ' 在模型空间中创建公差对象
    Set toleranceObj = ThisDrawing.ModelSpace. _
        AddTolerance(textString, insertionPoint, direction)
    ZoomAll
End Sub


编辑公差

创建形位公差
使用形位公差
自定义工具栏和菜单
ActiveX/VBA 开发人员手册 > 标注和公差 > 使用形位公差 >
编辑公差

公差受以下多个系统变量的影响：DIMCLRD 控制形位公差符号的颜色；DIMCLRT 控制公差文字的颜色；DIMGAP 控制形位公差符号和文字之间的间隙；DIMTXT 控制公差文字的尺寸；DIMTXTSTY 控制公差文字的样式。使用 SetVariable 方法来设置系统变量的值。


自定义工具栏和菜单

编辑公差
了解 MenuBar 和 MenuGroups 集合
ActiveX/VBA 开发人员手册 >
自定义工具栏和菜单

AutoCAD ActiveX Automation 提供了对当前 AutoCAD 任务中菜单和工具栏自定义的广泛控制。

使用 AutoCAD ActiveX/VBA，用户可以编辑或增加现有菜单的结构，或者完全替换当前的菜单结构。还可以管理工具栏和右键单击菜单。

菜单自定义可以只提供应用程序特有的任务，也可以在一个菜单项中综合多项任务，因此能够提高生产率。

关于自定义菜单和工具栏的详细信息（除了本节中的信息外），请参见《自定义手册》。

本节内容

  • 了解 MenuBar 和 MenuGroups 集合
  • 加载菜单组
  • 更改菜单栏
  • 创建和编辑下拉菜单和快捷菜单
  • 创建和编辑工具栏
  • 创建宏
  • 为菜单项和工具栏项创建状态行帮助
  • 向右键单击菜单添加条目


了解 MenuBar 和 MenuGroups 集合

自定义工具栏和菜单
自定义工具栏和菜单
加载菜单组
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 >
了解 MenuBar 和 MenuGroups 集合

AutoCAD® ActiveX® 提供了多个与菜单相关的对象。其中最重要的两个是 MenuBar 集合和 MenuGroups 集合。MenuBar 集合包含显示在 AutoCAD 菜单栏中的所有菜单。

MenuGroups 集合包含在当前 AutoCAD 任务中加载的菜单组。这些菜单组包含 AutoCAD 任务可用的所有菜单，其中部分或全部菜单可能会显示在 AutoCAD 菜单栏上。除了菜单以外，菜单组还包含当前 AutoCAD 任务可用的所有工具栏。菜单组也可以代表级联菜单、屏幕菜单或数字化仪菜单。

每个菜单组都包含一个 PopupMenus 集合和一个 Toolbars 集合。PopupMenus 集合包含菜单组内的所有菜单。同样，Toolbars 集合包含菜单组内的所有工具栏。

PopupMenu 实际上是显示在菜单上的各个菜单项对象的集合。同样，Toolbar 实际上是工具栏上的各个工具栏项对象的集合。


加载菜单组

了解 MenuBar 和 MenuGroups 集合
自定义工具栏和菜单
更改菜单栏
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 >
加载菜单组

菜单组可以使用 Load 方法加载到 AutoCAD 中。例如，以下代码将加载自定义文件 acad.cui：

ThisDrawing.Application.MenuGroups.Load "acad.cui"

在使用 Load 方法时，请将 BaseMenu 参数设置为 TRUE，以向菜单栏加载新的菜单组。这样设置将以与 AutoCAD 中 MENU 命令相同的方式将菜单组作为基准菜单加载。

要将新的菜单组作为局部菜单加载，请省略 BaseMenu 参数。这样设置将以与 AutoCAD 中 MENULOAD 命令相同的方式加载菜单组。加载到 MenuGroups 集合中后，可以使用 InsertMenuInMenuBar 方法或 InsertInMenuBar 方法将部分菜单插入到菜单栏中。

加载菜单组后，就可以使用由该菜单组定义的所有菜单和工具栏。可以：

  • 向菜单栏中添加新菜单
  • 从菜单栏中删除菜单
  • 重新排列菜单栏上的菜单
  • 向现有的菜单或工具栏中添加新的项
  • 从现有的菜单或工具栏中删除项
  • 创建新的菜单和工具栏
  • 浮动或固定工具栏
  • 启用或禁用菜单项和工具栏项
  • 复选或取消复选菜单项
  • 更改菜单项或工具栏项的标记、标签或帮助字符串
  • 重新指定关联到菜单项或工具栏项的宏
注意使用 ActiveX Automation 仅能编辑弹出菜单和工具栏。但是，可以使用 ActiveX Automation 加载和卸载其他菜单类型，例如图像平铺菜单项、屏幕菜单或数字化仪菜单。


更改菜单栏

加载菜单组
自定义工具栏和菜单
将菜单插入到菜单栏
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 >
更改菜单栏

我们已经看到，如果新的菜单组是作为基准菜单加载的，菜单栏就可以完全由该菜单组替换。此外，还可以添加、卸载或重新排列菜单栏上的单个菜单。

本节内容

  • 将菜单插入到菜单栏
  • 从菜单栏中删除菜单
  • 重新排列菜单栏上的菜单项


将菜单插入到菜单栏

更改菜单栏
更改菜单栏
从菜单栏中删除菜单
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 更改菜单栏 >
将菜单插入到菜单栏

要将现有菜单插入菜单栏，请使用 InsertMenuInMenuBar 或 InsertInMenuBar 方法。这两种方法均能达到同一目的—将现有菜单插入到菜单栏中。

两种方法之间的差异是调用它们的对象不同。InsertMenuInMenuBar 方法是从 PopupMenus 集合调用的。使用此方法可以将集合中的任意菜单插入菜单栏上的指定位置。此方法需要输入要插入的菜单名称和插入到菜单栏的位置。

InsertInMenuBar 方法是直接从要插入的 PopupMenu 对象调用的。此方法只需要输入菜单栏上的位置。不需要输入菜单的名称，因为用户是直接从要插入的对象调用该方法的。

用户应该使用适合自己的应用程序的方法。

将菜单插入到菜单栏

本例创建新的菜单 TestMenu，并在其中插入一个菜单项，并为此菜单项指定了 OPEN 命令。然后在菜单栏上显示该菜单。

Sub Ch6_InsertMenu()
    ' 定义当前菜单组的变量
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application. _
                                    MenuGroups.Item(0)
    ' 创建新菜单
    Dim newMenu As AcadPopupMenu
    Set newMenu = currMenuGroup.Menus.Add("TestMenu")
    ' 声明表示菜单项的变量
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    ' 指定宏字符串“ESC ESC _open”的 VB 等价值
    ' 并创建菜单项
    openMacro = Chr(3) + Chr(3) + "_open "
    Set newMenuItem = newMenu.AddMenuItem(newMenu.Count + 1, _
        "Open", openMacro)
    ' 在菜单栏上显示菜单
    currMenuGroup.Menus.InsertMenuInMenuBar "TestMenu", ""
End Sub


从菜单栏中删除菜单

将菜单插入到菜单栏
更改菜单栏
重新排列菜单栏上的菜单项
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 更改菜单栏 >
从菜单栏中删除菜单

要从菜单栏中删除菜单，请使用 RemoveMenuFromMenuBar 或 RemoveFromMenuBar 方法。这两种方法均能达到同一目的—从菜单栏中删除菜单。

两种方法之间的差异是调用它们的对象不同。RemoveMenuFromMenuBar 方法是从 PopupMenus 集合调用的。这个方法需要输入要删除的菜单名称，或者输入要删除的菜单在菜单栏上的位置。例如，以下语句删除在将菜单插入到菜单栏中添加的菜单：

currMenuGroup.Menus.RemoveMenuFromMenuBar ("TestMenu")

RemoveFromMenuBar 方法是直接从要删除的 PopupMenu 对象调用的。这个方法不需要任何输入。不需要输入菜单的名称，因为该方法是直接从要删除的对象调用的。

用户应该使用适合自己的应用程序的方法。

注意从菜单栏中删除的菜单仍然可以在指定它们的菜单组中使用，只是用户无法看到它们。


重新排列菜单栏上的菜单项

从菜单栏中删除菜单
更改菜单栏
创建和编辑下拉菜单和快捷菜单
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 更改菜单栏 >
重新排列菜单栏上的菜单项

要重新排列菜单栏上的菜单，请插入和删除菜单，使其达到所需的配置。

将第一个菜单移到菜单栏的末尾

本例删除菜单栏上的第一个菜单，然后将其作为最后一个菜单插入到菜单栏中。

Sub Ch6_MoveMenu()
    ' 定义一个变量来保存要移动的菜单
    Dim moveMenu As AcadPopupMenu
    Dim MyMenuBar As AcadMenuBar
    Set MyMenuBar = ThisDrawing.Application.menuBar
    ' 将 moveMenu 设置为等于菜单栏上
    ' 显示的第一个菜单
    Set moveMenu = MyMenuBar.Item(0)
    ' 从菜单栏中删除第一个菜单
    MyMenuBar.Item(0).RemoveFromMenuBar
    ' 将菜单添加回菜单栏上的
    ' 最后一个位置
    moveMenu.InsertInMenuBar (MyMenuBar.count)
End Sub


创建和编辑下拉菜单和快捷菜单

重新排列菜单栏上的菜单项
自定义工具栏和菜单
创建新菜单
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 >
创建和编辑下拉菜单和快捷菜单

AutoCAD ActiveX/VBA 能够自定义两类 AutoCAD 菜单：下拉菜单和快捷菜单（有时也称为光标菜单）。下拉菜单和快捷菜单均显示为级联菜单。使用快捷菜单可以快速访问常用的菜单项，例如“对象捕捉”模式。

下拉菜单最多可以包含 999 个菜单项。快捷菜单最多可以包含 499 个菜单项。这两个限制都是指层次结构中的所有菜单项。如果菜单中的菜单项数目超出了此限制，AutoCAD 将忽略超出的项。如果下拉菜单或快捷菜单过长，超出了图形屏幕上的可用空间，它们将被截断以适合屏幕显示。

下拉菜单是从菜单栏拉下，而快捷菜单则显示在图形屏幕上的十字光标位置处或其附近。处理这两种菜单类型的方式相同，但菜单栏上不包括快捷菜单标题。快捷菜单的标题根本不显示。访问快捷菜单是通过基准菜单组中的单个菜单。快捷菜单可以用 ShortcutMenu 特性标识。如果 ShortcutMenu 特性返回 TRUE，则所查询的菜单就是菜单组的快捷菜单。

本节内容

  • 创建新菜单
  • 向菜单添加新的菜单项
  • 向菜单添加分隔符
  • 为菜单项指定加速键
  • 创建级联子菜单
  • 从菜单中删除菜单项
  • 探索菜单项的特性


创建新菜单

创建和编辑下拉菜单和快捷菜单
创建和编辑下拉菜单和快捷菜单
向菜单添加新的菜单项
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 >
创建新菜单

要创建新菜单，请使用 Add 方法向 PopupMenus 集合添加新的 PopupMenu 对象。

要创建新的快捷菜单，必须删除现有的快捷菜单。因为每一个菜单组只能有一个快捷菜单。如果菜单组中没有其他快捷菜单，可以添加具有标签“POP0”的菜单。这将告诉 AutoCAD 要创建快捷菜单。

Add 方法需要输入要添加的菜单的名称（标签）。此方法向菜单栏加载该菜单时，该名称将成为菜单的标题。该名称也是识别集合内菜单的最简单的方法。

菜单名称可以是简单的字符串，也可以包含特殊代码。创建菜单之后，用户可以改变菜单的名称。要更改现有菜单的名称，请使用该菜单的 Name 特性。

创建新的弹出式菜单

本例在 MenuGroups 集合的第一个菜单组中创建称为“TestMenu”的新弹出菜单。

Sub Ch6_CreateMenu()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    ' 创建新菜单
    Dim newMenu As AcadPopupMenu
    Set newMenu = currMenuGroup.Menus.Add("TestMenu")
End Sub


向菜单添加新的菜单项

创建新菜单
创建和编辑下拉菜单和快捷菜单
指定 Index 参数
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 >
向菜单添加新的菜单项

要向菜单添加新的菜单项，请使用 AddMenuItem 方法。此方法将创建新的 PopupMenuItem 对象并将其添加到指定的菜单中。

AddMenuItem 方法需要输入四个参数：Index、Label、Tag 和 Macro。

本节内容

  • 指定 Index 参数
  • 指定 Label 参数
  • 指定 Tag 参数
  • 指定 Macro 参数


指定 Index 参数

向菜单添加新的菜单项
向菜单添加新的菜单项
指定 Label 参数
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 > 向菜单添加新的菜单项 >
指定 Index 参数

Index 参数是一个整数，用于指定新的菜单项在菜单中的位置。索引以位置零 (0) 作为菜单标题后的第一个位置。要在菜单末尾添加新的菜单项，请将 Index 参数设置为等于菜单的 Count 特性。（菜单的 Count 特性代表该菜单中菜单项的总数。）

第一个索引位置是零 (0)，分隔符是独立的菜单项，并且具有自己的索引位置。图中菜单的 Count 特性应该是六 (6)。要在“水平平铺”和“垂直平铺”之间增加菜单项，请将 Index 参数设置为二 (2)，这是“垂直平铺”菜单项的索引。这时可将新的菜单项插入索引二 (2)，并将所有其他菜单项向下移动一个索引位置。

创建菜单项之后，就不能再通过 Index 特性来更改菜单项的索引。要更改现有菜单项的索引，必须将该菜单项删除，然后再重新添加到其他位置；或者通过添加或删除其前后的菜单项，最终到达正确的位置。


指定 Label 参数

指定 Index 参数
向菜单添加新的菜单项
指定 Tag 参数
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 > 向菜单添加新的菜单项 >
指定 Label 参数

标签是定义菜单项内容和格式的字符串。菜单项标签可以包含 DIESEL 字符串表达式，在每次显示标签时按条件改变标签。

除了 DIESEL 字符串表达式以外，标签还可以包含特殊代码。例如，直接放置在字符之前的 & 可以指定该字符为加速键。

用户看到的菜单项文本称为标题，它通过解释所有的 DIESEL 字符串表达式和特殊代码从标签中衍生。例如，标签“&编辑”将生成标题“编辑”。

创建菜单项之后，可以使用 Label 特性更改菜单项的标签。


指定 Tag 参数

指定 Label 参数
向菜单添加新的菜单项
指定 Macro 参数
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 > 向菜单添加新的菜单项 >
指定 Tag 参数

标记（或名称标记）是由字母数字和下划线 (_) 字符组成的字符串，能够在给定菜单内唯一标识菜单项。

创建菜单项之后，可以使用 TagString 特性更改菜单项的标记。


指定 Macro 参数

指定 Tag 参数
向菜单添加新的菜单项
向菜单添加分隔符
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 > 向菜单添加新的菜单项 >
指定 Macro 参数

宏是在选择菜单项时执行特定操作的一系列命令，可以只是完成任务的按键记录，也可以是复杂的命令、AutoLISP、DIESEL 或 ActiveX 编程代码等的组合。

创建菜单项之后，可以使用 Macro 特性更改菜单项的宏。

向弹出式菜单添加菜单项

本例创建称为“TestMenu”的新菜单并插入菜单项。给定的菜单项名称为“Open”，而指定给该菜单项的宏为 OPEN 命令。

Sub Ch6_AddAMenuItem()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    ' 创建新菜单
    Dim newMenu As AcadPopupMenu
    Set newMenu = currMenuGroup.Menus.Add("TestMenu")
    ' 向新菜单添加菜单项
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VBA 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    Set newMenuItem = newMenu.AddMenuItem _
                       (newMenu.count + 1, "Open", openMacro)
    ' 在菜单栏上显示菜单
    newMenu.InsertInMenuBar _
                 (ThisDrawing.Application.menuBar.count + 1)
End Sub


向菜单添加分隔符

指定 Macro 参数
创建和编辑下拉菜单和快捷菜单
为菜单项指定加速键
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 >
向菜单添加分隔符

要向菜单添加分隔符，请使用 AddSeparator 方法。此方法将创建新的 PopupMenuItem 对象并将其添加到指定的菜单中。这类 PopupMenuItem 对象被指定为 acSeparator 类型。菜单项类型可以通过 Type 特性找到。

AddSeparator 方法只需要输入 Index 参数。Index 参数是一个整数，指定分隔符在菜单中的位置。索引以位置零 (0) 作为菜单标题后的第一个位置。

请参见启用和禁用菜单项中向菜单添加分隔符的样例。


为菜单项指定加速键

向菜单添加分隔符
创建和编辑下拉菜单和快捷菜单
创建级联子菜单
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 >
为菜单项指定加速键

要通过 AutoCAD ActiveX/VBA 为菜单项指定加速键，请使用给定菜单项的 Label 特性。要指定加速键，请在标签中要成为加速键的字符前直接插入 & 的 ASCII 等价值。例如，标签 Chr(Asc("&")) + "Edit" 将显示为“Edit”，并使用字符“E”作为加速键。

向菜单添加加速键

本例重复了向弹出式菜单添加菜单项中的样例，为“TestMenu”菜单和“Open”菜单添加加速键。使用“S”作为“TestMenu”菜单的加速键，使用“O”作为“Open”菜单的加速键。

Sub Ch6_AddAMenuItem()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    ' 创建新菜单
    Dim newMenu As AcadPopupMenu
    Set newMenu = currMenuGroup.Menus.Add _
                              ("Te" + Chr(Asc("&")) + "stMenu")
    ' 向新菜单添加菜单项
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VBA 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    Set newMenuItem = newMenu.AddMenuItem _
                       (newMenu.count + 1, Chr(Asc("&")) _
                        + "Open", openMacro)
    ' 在菜单栏上显示菜单
    newMenu.InsertInMenuBar _
                 (ThisDrawing.Application.menuBar.count + 1)
End Sub


创建级联子菜单

为菜单项指定加速键
创建和编辑下拉菜单和快捷菜单
从菜单中删除菜单项
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 >
创建级联子菜单

要添加级联子菜单，请使用 AddSubmenu 方法创建子菜单。此方法将创建新的 PopupMenuItem 对象并将其添加到指定的菜单中。这种特殊的 PopupMenuItem 对象被指定为 acSubmenu 类型。

AddSubmenu 方法需要输入三个参数：Index、Label 和 Tag。

Index 参数是一个整数，用于指定新的菜单项在菜单中的位置。索引以位置零 (0) 作为菜单标题后的第一个位置。要在菜单末尾添加新的菜单项，请将 Index 参数设置为等于菜单的 Count 特性。（菜单的 Count 特性代表该菜单中菜单项的总数。）

Label 参数是一个字符串，用于定义菜单项的内容和格式。用户看到的菜单项文字称为标题，它通过解释所有的 DIESEL 字符串表达式和特殊代码从标签中衍生。例如，标签“&编辑”将生成标题“编辑”。

Tag 参数（或名称标记）是由字母数字和下划线 (_) 字符组成的字符串，能够在给定菜单内唯一标识菜单项。

AddSubmenu 方法不返回其创建的 PopupMenuItem 对象，而是返回子菜单指向的新菜单。可以将新菜单（作为 PopupMenu 对象返回）填充为普通菜单。关于填充菜单的信息，请参见向菜单添加新的菜单项。

创建和填充子菜单

本例创建称为“TestMenu”的新菜单，并将其添加到称为“OpenFile”的子菜单中。然后，将使用称为“Open”的菜单项充该子菜单，执行该菜单项将打开图形。最后，将菜单显示在菜单栏上。

Sub Ch6_AddASubMenu()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    ' 创建新菜单
    Dim newMenu As AcadPopupMenu
    Set newMenu = currMenuGroup.Menus.Add("TestMenu")
    ' 添加子菜单
    Dim FileSubMenu As AcadPopupMenu
    Set FileSubMenu = newMenu.AddSubMenu("", "OpenFile")
    ' 向子菜单添加菜单项
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VB 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    Set newMenuItem = FileSubMenu.AddMenuItem _
                          (newMenu.count + 1, "Open", openMacro)
    ' 在菜单栏上显示菜单
    newMenu.InsertInMenuBar _
                   (ThisDrawing.Application.menuBar.count + 1)
End Sub


从菜单中删除菜单项

创建级联子菜单
创建和编辑下拉菜单和快捷菜单
探索菜单项的特性
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 >
从菜单中删除菜单项

要删除菜单中的菜单项，请使用该菜单项的 Delete 方法。

警告删除菜单项时，请勿调用能够直接或间接导致相同 CUI 文件在相同宏内再次被加载的方法或特性。例如，删除菜单项之后，不要使用 MenuGroup.Load 方法或 Preferences.Profiles.ActiveProfile 特性，也不要使用 Document.SendCommand 方法发出 Menuload 命令。这些方法或特性都会直接或间接导致 CUI 文件的加载。因此应该只在单独的宏中使用它们。

从菜单中删除菜单项

本例向菜单栏上的最后一个菜单中添加菜单项，然后再删除该菜单项。

Sub Ch6_DeleteMenuItem()
    Dim LastMenu As AcadPopupMenu
    Set LastMenu = ThisDrawing.Application.menuBar. _
                Item(ThisDrawing.Application.menuBar.count - 1)
    ' 添加菜单项
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VB 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    Set newMenuItem = LastMenu.AddMenuItem _
                          (LastMenu.count + 1, "Open", openMacro)
    ' 从菜单中删除菜单项
    newMenuItem.Delete
End Sub


探索菜单项的特性

从菜单中删除菜单项
创建和编辑下拉菜单和快捷菜单
创建和编辑工具栏
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑下拉菜单和快捷菜单 >
探索菜单项的特性

所有的菜单项都具有以下特性：

TagString

标记（或名称标记）是由字母数字和下划线 (_) 字符组成的字符串，能够在给定菜单内唯一标识菜单项。标记还能够标识菜单项对应的加速键（键盘按键序列）。

可以使用 TagString 特性来读取或写入标记的值。

Label

标签是定义菜单项内容和格式的字符串。

菜单项标签可以包含 DIESEL 字符串表达式，在每次显示标签时按条件改变标签。

可以使用 Label 特性来读取或写入标签的值。

Caption

标题是用户看到的、显示在菜单上的文字。此特性是只读的，通过删除任何 DIESEL 字符串表达式从 Label 特性中衍生。

可以使用 Caption 特性来读取标题值。

宏

宏是在选择菜单项时执行特定操作的一系列命令，可以只是完成任务的按键记录，也可以是复杂的命令、AutoLISP、DIESEL 或 ActiveX 编程代码等的组合。

可以使用 Macro 特性来读取或写入宏的值。

HelpString

帮助字符串是在用户亮显选定的菜单项时，显示在 AutoCAD 状态行中的文字字符串。

可以使用 HelpString 特性来读取或写入帮助字符串的值。

Enable

使用 Enable 特性可以启用或禁用菜单项。通过读取 Enable 特性还可以判断菜单项当前是否启用。使用此特性启用或禁用菜单项，会替代菜单项的 DIESEL 表达式中所有用于启用的设置。

请参见探索菜单项的特性中禁用菜单项的样例。

Check

使用 Check 特性，可以复选或取消复选菜单项。通过读取 Check 特性，还可以判断菜单项当前是否被复选。使用此特性来复选或取消复选菜单项，会替代菜单项的 DIESEL 表达式中所有用于复选的设置。

Index

菜单项的索引用于指定该菜单项在其所属菜单中的位置。菜单的索引位置始终从位置 0 开始。例如，如果某一项是菜单的第一项，它会返回索引位置 0；如果是菜单的第二项，则会返回索引位置 1，依此类推。

Type

可以使用 Type 特性来判断菜单项的类型。菜单项可以是以下类型之一：普通菜单、分隔符或子菜单的标题。如果是普通菜单项，此特性将返回 acMenuItem；如果是分隔符，将返回 acMenuSeparator；如果是子菜单的标题，则返回 acSubMenu。

SubMenu

可以使用 SubMenu 特性查找子菜单。如果菜单项是 acSubMenu 类型，此特性将返回附着为子菜单或嵌入菜单的菜单。嵌入菜单是作为 PopupMenu 对象返回的。

如果菜单项不是 acSubMenu 类型，此特性将返回错误。

Parent

可以使用 Parent 特性查找菜单项所属的菜单。此特性将返回菜单项所在的菜单。上级菜单是作为 PopupMenu 对象返回的。

启用和禁用菜单项

本例创建称为“TestMenu”的新菜单，并插入两个菜单项。然后使用 Enable 特性禁用第二个菜单项，最后将菜单显示在菜单栏上。

Sub Ch6_DisableMenuItem()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    ' 创建新菜单
    Dim newMenu As AcadPopupMenu
    Set newMenu = currMenuGroup.Menus.Add("TestMenu")
    ' 向新菜单添加两个菜单项和一个菜单分隔符
    Dim MenuEnable As AcadPopupMenuItem
    Dim MenuDisable As AcadPopupMenuItem
    Dim MenuSeparator As AcadPopupMenuItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VB 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    Set MenuEnable = newMenu.AddMenuItem _
                (newMenu.count + 1, "OpenEnabled", openMacro)
    Set MenuSeparator = newMenu.AddSeparator("")
    Set MenuDisable = newMenu.AddMenuItem _
                (newMenu.count + 1, "OpenDisabled", openMacro)
    ' 禁用第二个菜单项
    MenuDisable.Enable = False
    ' 在菜单栏上显示菜单
    newMenu.InsertInMenuBar _
                (ThisDrawing.Application.menuBar.count + 1)
End Sub


创建和编辑工具栏

探索菜单项的特性
自定义工具栏和菜单
创建新的工具栏
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 >
创建和编辑工具栏

使用 AutoCAD ActiveX/VBA，可以在现有菜单组中创建和编辑工具栏。

本节内容

  • 创建新的工具栏
  • 向工具栏添加新的工具栏按钮
  • 向工具栏添加分隔符
  • 定义工具栏按钮图像
  • 创建弹出工具栏
  • 浮动和固定工具栏
  • 从工具栏中删除工具栏按钮
  • 探索工具栏项的特性


创建新的工具栏

创建和编辑工具栏
创建和编辑工具栏
向工具栏添加新的工具栏按钮
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑工具栏 >
创建新的工具栏

要创建新工具栏，请使用 Add 方法向 Toolbars 集合添加新的 Toolbar 对象。

Add 方法需要输入要添加的工具栏名称。该名称是由字母数字组成的字符串，不能包含划线 (-) 或下划线 (_)以外的标点。名称是识别集合内的工具栏的最简单方法。

创建工具栏之后，用户可以更改工具栏的名称。要更改现有工具栏的名称，请使用该工具栏的 Name 特性。

创建新工具栏

本例在 MenuGroups 集合的第一个菜单组中创建称“TestToolbar”的新工具栏。

Sub Ch6_CreateToolbar()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    ' 创建新工具栏
    Dim newToolbar As AcadToolbar
    Set newToolbar = currMenuGroup.Toolbars.Add("TestToolbar")
End Sub


向工具栏添加新的工具栏按钮

创建新的工具栏
创建和编辑工具栏
向工具栏添加分隔符
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑工具栏 >
向工具栏添加新的工具栏按钮

要向工具栏添加新的工具栏按钮，请使用 AddToolbarButton 方法。此方法将创建新的 ToolbarItem 对象并将其添加到指定的工具栏中。应该只在工具栏可见时向其中添加按钮。

AddToolbarButton 方法需要输入五个参数：Index、Name、HelpString、Macro 和 FlyoutButton。

Index

Index 参数是一个整数，用于指定新工具栏项在工具栏内的位置。索引以位置零 (0) 作为工具栏标题后的第一个位置。要在工具栏末尾添加新的工具栏按钮，请将 Index 参数设置为等于工具栏的 Count 特性。（工具栏的 Count 特性代表该工具栏中工具栏按钮的总数。）

创建工具栏按钮之后，就不能再通过 Index 特性来更改按钮的索引。要更改现有工具栏按钮的索引，必须先删除该按钮，然后再将其重新添加到其他位置；或者是添加或删除其前后的按钮，最终达到正确位置。

Name

名称是标识工具栏按钮的字符串，该字符串必须由字母数字字符组成，不能包含划线 (-) 或下划线 (_)以外的标点。光标位于工具栏按钮上时，将显示该字符串，作为工具栏提示。

创建工具栏按钮之后，可以使用 Name 参数来更改按钮名称。

HelpString

帮助字符串是在用户亮显选定的菜单项时，显示在 AutoCAD 状态行中的字符串。

创建工具栏按钮之后，可以使用 HelpString 参数更改按钮的帮助字符串。

宏

宏是在选择工具栏按钮时执行特定操作的一系列命令，可以只是完成任务的按键记录，也可以是复杂的命令、AutoLISP、DIESEL 或 ActiveX 编程代码等的组合。

创建工具栏按钮之后，可以使用 Macro 参数更改按钮的宏。

FlyoutButton

FlyoutButton 参数是一个可选标志，用于声明新按钮是否是弹出按钮。要使新按钮成为弹出按钮，此参数必须设置为 TRUE。如果新按钮不是弹出按钮，则可以将此参数设置为 FALSE 或忽略此参数。

向新工具栏添加按钮

本例创建一个新的工具栏，在其中添加按钮。将为该按钮指定宏，该宏将在选择该按钮时执行 OPEN 命令。

Sub Ch6_AddButton()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    ' 创建新工具栏
    Dim newToolbar As AcadToolbar
    Set newToolbar = currMenuGroup.Toolbars.Add("TestToolbar")
    ' 向新工具栏添加按钮
    Dim newButton As AcadToolbarItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VB 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    Set newButton = newToolbar.AddToolbarButton _
                   ("", "NewButton", "Open a file.", openMacro)
End Sub


向工具栏添加分隔符

向工具栏添加新的工具栏按钮
创建和编辑工具栏
定义工具栏按钮图像
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑工具栏 >
向工具栏添加分隔符

要向工具栏添加分隔符，请使用 AddSeparator 方法。此方法将创建新的 ToolbarItem 对象并将其添加到指定的工具栏中。这类 ToolbarItem 对象被指定为 acSeparator 类型。工具栏按钮的类型可以通过 Type 特性找到。

AddSeparator 方法需要输入一个参数：Index。Index 参数是一个整数，用于指定分隔符在工具栏中的位置。索引以位置零 (0) 作为工具栏标题后的第一个位置。


定义工具栏按钮图像

向工具栏添加分隔符
创建和编辑工具栏
创建弹出工具栏
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑工具栏 >
定义工具栏按钮图像

要定义工具栏按钮上的图像，请使用 SetBitmaps 和 GetBitmaps 方法。

SetBitmaps 方法需要两个参数：SmallIconName 和 LargeIconName。

SmallIconName

小图标名称用于标识小图像资源（16×15 位图）的 ID 字符串。该字符串必须由字母数字字符组成，不能包含划线 (-) 或下划线 (_)以外的标点，并且应该包含 .bmp 扩展名。资源可以是系统位图，也可以是用户定义的位图。用户定义的位图必须大小适中，而且必须位于 Support 路径中。

LargeIconName

大图标名称用于标识大图像资源（24×22 位图）的 ID 字符串。该字符串必须由字母数字字符组成，不能包含划线 (-) 或下划线 (_)以外的标点，并且应该包含 .bmp 扩展名。资源可以是系统位图，也可以是用户定义的位图。用户定义的位图必须大小适中，而且必须位于 Support 路径中。

查询现有工具栏以查找按钮的图标名称

Sub Ch6_GetButtonImages()
    Dim Button As AcadToolbarItem
    Dim Toolbar0 As AcadToolbar
    Dim MenuGroup0 As AcadMenuGroup
    Dim SmallButtonName As String
    Dim LargeButtonName As String
    Dim msg As String
    Dim ButtonType As String
    ' 获取第一个菜单组中的第一个工具栏
    Set MenuGroup0 = ThisDrawing.Application. _
                                 MenuGroups.Item(0)
    Set Toolbar0 = MenuGroup0.Toolbars.Item(0)
    ' 清除字符串变量
    SmallButtonName = ""
    LargeButtonName = ""
    ' 创建消息框的标题并
    ' 显示要查询的工具栏
    msg = "Toolbar: " + Toolbar0.Name + vbCrLf
    Toolbar0.Visible = True
    ' 遍历工具栏并收集工具栏中
    ' 每个按钮的数据。如果工具栏是
    ' 普通按钮或弹出按钮，则收集按钮的
    ' 小按钮名称和大按钮名称。
    For Each Button In Toolbar0
        ButtonType = Choose(Button.Type + 1, "Button", _
                        "Separator", "Control", "Flyout")
        msg = msg & ButtonType & ": "
        If Button.Type = acToolbarButton Or _
                       Button.Type = acToolbarFlyout Then
            Button.GetBitmaps SmallButtonName, _
                              LargeButtonName
            msg = msg + SmallButtonName + ", " _
                      + LargeButtonName
        End If
        msg = msg + vbCrLf
    Next Button
    ' 显示结果
    MsgBox msg
End Sub


创建弹出工具栏

定义工具栏按钮图像
创建和编辑工具栏
浮动和固定工具栏
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑工具栏 >
创建弹出工具栏

要向工具栏添加弹出工具栏按钮，请使用 AddToolbarButton 方法。此方法将创建新的 ToolbarItem 对象并将其添加到指定的工具栏中。

AddToolbarButton 方法需要输入五个参数：Index、Name、HelpString、Macro 和 FlyoutButton。将参数 FlyoutButton 设置为 TRUE 时，创建的新按钮即为弹出按钮。此方法的返回值将是新的弹出工具栏。该弹出工具栏可以被填充，从而成为普通工具栏。

关于如何填充工具栏的详细信息，请参见向工具栏添加新的工具栏按钮。

创建弹出工具栏按钮

本例创建两个工具栏：第一个工具栏包含一个弹出按钮，第二个工具栏被附着到第一个工具栏的弹出按钮上。

Sub Ch6_AddFlyoutButton()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application. _
                                 MenuGroups.Item(0)
    ' 创建第一个工具栏
    Dim FirstToolbar As AcadToolbar
    Set FirstToolbar = currMenuGroup.Toolbars. _
                                Add("FirstToolbar")
    ' 向菜单栏上的第一个菜单添加弹出按钮
    Dim FlyoutButton As AcadToolbarItem
    Set FlyoutButton = FirstToolbar.AddToolbarButton _
            ("", "Flyout", "Demonstrates a flyout button", _
             "OPEN", True)
    ' 创建第二个工具栏。该工具栏将通过弹出按钮附加到
    ' 第一个工具栏。
    Dim SecondToolbar As AcadToolbar
    Set SecondToolbar = currMenuGroup.Toolbars. _
            Add("SecondToolbar")
    ' 向下一个工具栏添加按钮
    Dim newButton As AcadToolbarItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VB 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    Set newButton = SecondToolbar.AddToolbarButton _
            ("", "NewButton", "Open a file.", openMacro)
    ' 将第二个工具栏附着到第一个工具栏
    ' 的弹出按钮上
    FlyoutButton.AttachToolbarToFlyout currMenuGroup.Name, _
            SecondToolbar.Name
    ' 显示第一个工具栏，隐藏第二个工具栏
    FirstToolbar.Visible = True
    SecondToolbar.Visible = False
End Sub


浮动和固定工具栏

创建弹出工具栏
创建和编辑工具栏
从工具栏中删除工具栏按钮
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑工具栏 >
浮动和固定工具栏

工具栏可以通过编程方式固定或浮动。

要浮动工具栏，请使用工具栏的 Float 方法。Float 方法需要输入三个参数： Top、Left 和 NumberFloatRows。Top 和 Left 参数用于指定工具栏顶部和左边的像素位置。NumberFloatRows 参数用于指定创建水平工具栏所需的行的数量。此数字必须大于等于 1。工具栏的按钮将平均分布在指定的行数上。对于垂直对齐的工具栏，此值指定所需的列数。

要固定工具栏，请使用工具栏的 Dock 方法。Dock 方法需要输入三个参数：Side、Row 和 Column。Side 参数用于指定固定操作中用于定位的工具栏的边。用户可以指定工具栏的上、下、左、右各边。Row 和 Column 参数用于指定要在此行或列固定工具栏时，固定工具栏现有的行和列编号。

可以使用 DockStatus 特性查询工具栏是否被固定。如果工具栏是固定的，DockStatus 特性将返回 TRUE；如果工具栏是浮动的，则返回 FALSE。

固定工具栏

本例创建一个包含三个按钮的新工具栏，然后显示工具栏并将其固定在屏幕的左边。

Sub Ch6_DockToolbar()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application. _
                                        MenuGroups.Item(0)
    ' 创建新工具栏
    Dim newToolbar As AcadToolbar
    Set newToolbar = currMenuGroup.Toolbars. _
                                       Add("TestToolbar")
    ' 向新工具栏添加三个按钮。
    ' 三个按钮都将附着相同的宏。
    Dim newButton1 As AcadToolbarItem
    Dim newButton2 As AcadToolbarItem
    Dim newButton3 As AcadToolbarItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VB 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    Set newButton1 = newToolbar.AddToolbarButton _
                   ("", "NewButton1", "Open a file.", openMacro)
    Set newButton2 = newToolbar.AddToolbarButton _
                   ("", "NewButton2", "Open a file.", openMacro)
    Set newButton3 = newToolbar.AddToolbarButton _
                   ("", "NewButton3", "Open a file.", openMacro)
    ' 显示工具栏
    newToolbar.Visible = True
    ' 将工具栏固定在屏幕的左边。
    newToolbar.Dock acToolbarDockLeft
End Sub


从工具栏中删除工具栏按钮

浮动和固定工具栏
创建和编辑工具栏
探索工具栏项的特性
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑工具栏 >
从工具栏中删除工具栏按钮

要从工具栏中删除工具栏按钮，请使用工具栏按钮的 Delete 方法。应该只在工具栏可见时删除工具栏上的按钮。


探索工具栏项的特性

从工具栏中删除工具栏按钮
创建和编辑工具栏
创建宏
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建和编辑工具栏 >
探索工具栏项的特性

所有的工具栏项都具有以下特性：

Tagstring

标记（或名称标记）是由字母数字和下划线 (_) 字符组成的字符串，能够在给定工具栏内唯一标识工具栏项。创建工具栏项时，会自动指定新的标记。

可以使用 TagString 特性来读取或写入标记的值。

Name

名称是标识工具栏项的字符串，也是用于工具栏提示的文字字符串。工具栏提示是在用户将鼠标或其他定点设备停留在工具栏项上时，AutoCAD 中弹出的文字字符串。

可以使用 Name 特性来读取或写入名称的值。

宏

宏是在选择工具栏项时执行特定操作的一系列命令，可以只是完成任务的按键记录，也可以是复杂的命令、AutoLISP、DIESEL 或 ActiveX 编程代码等的组合。

可以使用 Macro 特性来读取或写入宏的值。

HelpString

帮助字符串是在选择工具栏按钮时显示在 AutoCAD 状态行中的文字字符串。

可以使用 HelpString 特性来读取或写入帮助字符串的值。

Index

工具栏项的索引用于指定它在所属工具栏中的位置。工具栏的索引位置始终从位置 0 开始。例如，如果某一项是工具栏的第一项，则其索引位置是 0；如果是第二项，则索引位置是 1，依此类推。

可以使用 Index 特性来读取工具栏项的索引位置。

Type

工具栏项可以是以下类型之一：普通工具栏按钮、分隔符、弹出式工具栏按钮或特殊控件元素。如果工具栏项是普通工具栏按钮，此特性返回 acButton；如果是分隔符，将返回 acToolButtonSeparator；如果是弹出按钮，将返回 acFlyout；如果是特殊控件元素，则返回 acControl。

可以使用 Type 特性来判断工具栏项的类型。

Flyout

如果工具栏项是 acFlyout 类型，此特性将返回附着为弹出工具栏的工具栏。该弹出工具栏是作为 Toolbar 对象返回的。

如果菜单项不是 acFlyout 类型，此特性将返回 NULL。

可以使用 Flyout 特性来查找工具栏项的弹出工具栏。

Parent

此特性返回工具栏项所在的工具栏。上级工具栏是作为 Toolbar 对象返回的。

可以使用 Parent 特性来查找工具栏项所属的工具栏。

工具栏特性

工具栏上所有项还包含一些其他特性，这些特性包括工具栏是固定的还是浮动的、是可见的还是隐藏的、使用的是大按钮还是小按钮。


创建宏

探索工具栏项的特性
自定义工具栏和菜单
映射到 ASCII 等价值的宏字符
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 >
创建宏

宏是在选择工具栏项时执行特定操作的一系列命令，可以只是完成任务的按键记录，也可以是复杂的命令、AutoLISP、DIESEL 或 ActiveX 编程代码等的组合。

如果打算在菜单宏中包括命令参数，则必须知道该命令需要的参数顺序。菜单宏中的每个字符（包括空格）都有重要含义。由于 AutoCAD 已被修订和改进，因此许多命令的提示序列（有时甚至是命令名）都有所改变。因此，将自定义菜单升级到 AutoCAD 的新版本时，可能需要对其稍作修改。

当命令输入来自菜单项时，将假设 PICKADD 和 PICKAUTO 系统变量的设置分别为 1 和 0。这保持了与早期 AutoCAD 版本的兼容性，并且由于不必检查变量设置而简化了自定义操作。

本节内容

  • 映射到 ASCII 等价值的宏字符
  • 宏终止方式
  • 暂停等待用户输入
  • 取消命令
  • 宏重复
  • 使用单一对象选择模式


映射到 ASCII 等价值的宏字符

创建宏
创建宏
宏终止方式
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建宏 >
映射到 ASCII 等价值的宏字符

下表概要介绍了用在菜单宏中的特殊字符，以及用于 VB 和 VBA 时的 ASCII 等价值。创建 Macro 特性的字符串时，请使用这些特殊字符的 ASCII 等价值。

用于菜单宏和工具栏宏的特殊字符
字符 | ASCII 等价值 | 说明
; | chr(59) | 发出 ENTER
^M | chr(13) | 发出 ENTER
^| | chr(94) + chr(124) | 发出 TAB
SPACEBAR | chr(32) | 输入空格；菜单项中命令序列之间的空格，相当于按空格键
\ | chr(92) | 暂停等待用户输入
_ | chr(95) | 翻译随后的 AutoCAD 命令和关键字
+ | chr(43) | 继续菜单宏到下一行 （如果最后一个字符）
=* | chr(61) + chr(42) | 显示当前顶层图像菜单、 下拉菜单或快捷菜单
*^C^C | chr(42) + chr(3) + chr(3) | 重复项的前缀
$ | chr(36) | 加载菜单部分或引入条件 DIESEL 宏表达式
^B | chr(2) | 打开或关闭捕捉 (CTRL+B)
^C | chr(3) | 取消命令 (CTRL+C)
ESC | chr(3) | 取消命令 (ESC)
^D | chr(4) | 打开或关闭坐标 (CTRL+D)
^E | chr(5) | 设置下一个等轴测平面 (CTRL+E)
^G | chr(7) | 打开或关闭栅格 (CTRL+G)
^H | chr(8) | 发出 BACKSPACE
^O | chr(15) | 打开或关闭正交 (CTRL+O)
^P | chr(16) | 打开或关闭 MENUECHO
^Q | chr(17) | 将所有提示、状态列表和输入回显到打印机 (CTRL+Q)
^T | chr(20) | 打开或关闭数字化仪 (CTRL+T)
^V | chr(22) | 更改当前视口 (CTRL+V)
^Z | chr(26) | 空字符，用于抑制在 菜单项的末尾自动添加 SPACEBAR


宏终止方式

映射到 ASCII 等价值的宏字符
创建宏
暂停等待用户输入
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建宏 >
宏终止方式

执行宏时，AutoCAD 会在处理命令序列之前在宏的末尾放置一个空格。AutoCAD 将处理后跟的菜单宏，就像用户输入了 line SPACEBAR 一样。

line

有时我们并不希望出现这种情况；例如，必须通过 ENTER 而不是空格来终止 TEXT 或 DIM 命令。此外，有时需要多个空格或 ENTER 来完成命令，但某些文字编辑器不允许用户创建带有后续空格的行。以下两条特殊惯例就是用来解决这些问题的。

  • 当宏中出现分号 (;) 时，AutoCAD 会将其替换为 ENTER。
  • 如果行是以控制字符、反斜杠 (\)、加号 (+) 或分号 (;) 结尾的，AutoCAD 不会在其后添加空格。

请看下面的宏：

erase \;

如果此项仅以反斜杠（表示用户输入）结尾，它将无法完成 ERASE 操作，因为 AutoCAD 不会在反斜杠之后添加空格。因此，该宏使用分号 (;) 以在用户输入之后强制加上 ENTER。下面是其他几个例子：

ucs
ucs ;
text \.4 0 DRAFT Inc;;;Main St.;;;City, State;

选择第一个宏将在命令行上输入 ucs 和空格，然后将显示以下提示：

输入选项 [新建(N)/移动(M)/正交(G)/上一个(P)/恢复(R)/保存(S)/删除(D)/应用(A)/?/世界(W)] <世界>:

选择第二个宏将在命令行上输入 ucs、空格和分号 (;)，并将接受默认值“世界”。第一项和第二项在屏幕显示上没有区别；因此不必将其放在同一菜单上。

选择第三个宏会显示提示，要求输入起点，并将该地址绘制成三行文字。在三重分号 (;;;) 中，第一个分号将结束文字字符串，第二个分号将重复 TEXT 命令，第三个分号将调用上一行下的默认选项。

注意所有特殊的字符都必须使用其 ASCII 等价值输入。关于 ASCII 等价值的列表，请参见映射到 ASCII 等价值的宏字符。


暂停等待用户输入

宏终止方式
创建宏
取消命令
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建宏 >
暂停等待用户输入

在宏的中间要求输入的地方插入反斜杠 (\)，接受来自键盘或定点设备的输入，有时这样做非常有用。

circle \1
layer off \;

第一个宏会暂停并要求用户输入中心点，然后再从宏读取半径 1。请注意，反斜杠字符 (\) 后面没有空格。下一个宏将暂停并请求用户输入一个图层名，然后关闭该图层并退出 LAYER 命令。LAYER 命令通常提示进行另一个操作，并仅在用户按空格键（空格）或 ENTER 键 (;) 时才会退出。

通常，宏会在输入一项之后恢复执行。因此，无法构造一个接受可变输入次数（正如在对象选择中）并随后继续执行的宏。但 SELECT 命令除外：反斜杠将挂起宏，直到完成对象选择。例如，请参见下面的宏：

select \change previous ;properties color red ;

该宏使用 SELECT 命令创建包含一个或多个对象的选择集。然后，该宏将发出 CHANGE 命令，使用“上一个”选项引用此选择集，并将所有选定对象的颜色更改为红色。

因为反斜杠字符 (\) 会使宏暂停并等待用户输入，因此在宏中不能将反斜杠用于其他用途。指定文件目录路径时，可以使用正斜杠 (/) 作为路径分隔符：例如 /direct/file。

以下情况会延迟宏的重新执行：

  • 如果需要输入点，对象捕捉模式可以在输入实际点之前打开。
  • 如果使用 X/Y/Z 点过滤器，宏会一直处于暂停状态，直到已累计了整个点为止。
  • 仅就 SELECT 命令而言，直到完成对象选择，宏才会恢复运行。
  • 如果用户响应透明命令，暂停的宏会持续暂停，直到完成透明命令并收到最初要求的输入为止。
  • 如果用户选择其他宏进行响应（提供选项或执行透明命令），原来的宏会暂停，处理完新选定的项后，暂停的宏才会恢复执行。


取消命令

暂停等待用户输入
创建宏
宏重复
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建宏 >
取消命令

要确保用户没有尚未完成的命令，请在宏中使用 ^C^C。这相当于在键盘上按两次 ESC 键。虽然使用单个 ^C 就可以取消大多数命令，但要从 DIM 命令返回命令提示，需要使用 ^C^C。因此，使用 ^C^C 能够确保 AutoCAD 在大多数情况下返回命令提示。


宏重复

取消命令
创建宏
使用单一对象选择模式
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建宏 >
宏重复

用户选择一个命令后，可能要多次使用该命令，然后才继续执行其他命令。多数人都是这样使用工具：选择一种工具，使用该工具完成若干操作，然后选择其他工具，等等。为避免每次使用前都要拾取工具，AutoCAD 提供了命令重复功能，通过空 (null) 响应触发。但不能使用此功能来指定命令选项。

使用这个功能，用户可以重复经常使用的命令，然后再选择其他命令。如果宏以 *^C^C 开头，后面紧跟项标签，则该宏将保存在内存中。后续的命令提示都是由这个宏来回答的，直到它由于 ESC 或选择其他宏而终止。

请勿在以字符串 *C^C 开头的宏内使用 ^C（取消），因为这样会取消宏的重复。

下面是重复（或模式）命令处理方式的一个例子。

*^C^CMOVE Single
*^C^CCOPY Single
*^C^CERASE Single
*^C^CSTRETCH Single Crossing
*^C^CROTATE Single
*^C^CSCALE Single

宏重复不能用于图像控件菜单中的项。


使用单一对象选择模式

宏重复
创建宏
为菜单项和工具栏项创建状态行帮助
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 > 创建宏 >
使用单一对象选择模式

单一对象选择会将对象选择设在单选模式，禁用对象选择所引导的普通对话框，并且使选择返回由后续选项选定的第一个对象（组）。这种做法在宏中会相当简便。例如，请参见下面的宏：

*^C^CERASE single

该宏将终止当前命令，然后激活具有单个选择选项的 ERASE 命令。在选择这一项之后，可以指向要删除的单一对象，也可以指向空白区域并指定窗口。以这种方法选定的对象都会被删除，而且宏会重复（由于有前导星号），以便用户删除其他对象。单一选择模式使用户与 AutoCAD 的交互更加灵活。


为菜单项和工具栏项创建状态行帮助

使用单一对象选择模式
自定义工具栏和菜单
向右键单击菜单添加条目
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 >
为菜单项和工具栏项创建状态行帮助

状态行帮助消息是产品附带的帮助支持的一个重要方面。状态行帮助消息是一些简单的描述性信息，并且在亮显菜单项或工具栏项时，显示在状态行。所有菜单项和工具栏项的状态行帮助都包含在该项的 HelpString 特性中。

首次创建菜单项或工具栏项时，HelpString 特性是空的。

向菜单项添加状态行帮助

本例创建称为“TestMenu”的新菜单，然后创建称为“Open”的菜单项。随后将通过 HelpString 特性为菜单项指定状态行帮助。

Sub Ch6_AddHelp()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    ' 创建新菜单
    Dim newMenu As AcadPopupMenu
    Set newMenu = currMenuGroup.Menus.Add _
                              ("Te" + Chr(Asc("&")) + "stMenu")
    ' 向新菜单添加菜单项
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VBA 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    ' 创建菜单项
    Set newMenuItem = newMenu.AddMenuItem _
                       (newMenu.count + 1, Chr(Asc("&")) _
                        + "Open", openMacro)
    ' 向菜单项添加状态行帮助
     newMenuItem.HelpString = "Opens an AutoCAD drawing file."
    ' 在菜单栏上显示菜单
    newMenu.InsertInMenuBar _
                 (ThisDrawing.Application.menuBar.count + 1)
End Sub


向右键单击菜单添加条目

为菜单项和工具栏项创建状态行帮助
自定义工具栏和菜单
使用事件
ActiveX/VBA 开发人员手册 > 自定义工具栏和菜单 >
向右键单击菜单添加条目

右键单击菜单（或快捷菜单）是 AutoCAD 基准菜单组内的特殊菜单。该菜单将在用户按住 SHIFT 键并单击鼠标右键时显示。

AutoCAD 在基准菜单组中查找 ShortcutMenu 特性等于 TRUE 的菜单，这些菜单就是快捷菜单。可以按照向菜单添加新的菜单项中的步骤，向快捷菜单添加新的菜单项。

新菜单组有无快捷菜单均可。要创建菜单组的快捷菜单，请按照创建新菜单中介绍的指导原则进行，并使用 POP0 作为新菜单的标签名称。

向右键单击菜单的末尾添加菜单项

本例将菜单项“OpenDWG”添加到快捷菜单的尾部。

Sub Ch6_AddMenuItemToshortcutMenu()
    Dim currMenuGroup As AcadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    ' 查找快捷菜单并将其指定给
    ' shortcutMenu 变量
    Dim scMenu As AcadPopupMenu
    Dim entry As AcadPopupMenu
    For Each entry In currMenuGroup.Menus
        If entry.shortcutMenu = True Then
            Set scMenu = entry
        End If
    Next entry
    ' 向快捷菜单添加菜单项
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    ' 给宏指定“ESC ESC _open”的 VBA 等价值
    openMacro = Chr(3) + Chr(3) + "_open "
    Set newMenuItem = scMenu.AddMenuItem _
                                    ("", Chr(Asc("&")) _
                                     + "OpenDWG", openMacro)
End Sub


使用事件

向右键单击菜单添加条目
了解 AutoCAD 中的事件
ActiveX/VBA 开发人员手册 >
使用事件

事件是 AutoCAD 发出的通知或信息，用于通知用户任务的当前状态，或警告用户已发生某件事。例如，打开图形时会触发 BeginOpen 事件，该事件中包含打开的 AutoCAD 图形的名称。而关闭图形时则会触发另一个事件。有了这项信息，用户可以编写子例程或事件处理程序，使用这些事件来跟踪处理特定图形所用的时间。

本节内容

  • 了解 AutoCAD 中的事件
  • 事件处理程序的原则
  • 处理应用程序层事件
  • 处理文档层事件
  • 处理对象层事件


了解 AutoCAD 中的事件

使用事件
使用事件
事件处理程序的原则
ActiveX/VBA 开发人员手册 > 使用事件 >
了解 AutoCAD 中的事件

AutoCAD® 中有三种类型的事件：

  • 应用程序层事件，响应 AutoCAD 应用程序及其环境的更改。这些事件可以响应图形的打开、保存、关闭和打印，新图形的创建，AutoCAD 命令的发出，ARX 和 LISP 应用程序的加载或卸载，系统变量的更改以及应用程序窗口的更改。
  • 文档层事件，响应特定的文档或其内容的更改。这些事件可以响应对象的添加、删除或修改，快捷菜单的激活，优先选择集的更改，“图形”窗口的更改以及图形的重生成。还有一些文档层事件会响应图形的打开、关闭和打印，从图形加载或卸载 ARX 和 LISP 应用程序。
  • 对象层事件，响应特定对象的更改。目前只有一个对象层事件。每次更改对象时都会触发此事件。

用于响应事件的子例程称为事件处理程序，每次触发指定给它们的事件时，都会自动执行这些程序。事件中包含的信息（例如 BeginOpen 事件中的图形名）通过参数传递到事件处理程序。


事件处理程序的原则

了解 AutoCAD 中的事件
使用事件
处理应用程序层事件
ActiveX/VBA 开发人员手册 > 使用事件 >
事件处理程序的原则

请记住，事件只是提供了 AutoCAD 内部的状态或动作信息。虽然可以编写事件处理程序来响应这些事件，但触发事件处理程序时，AutoCAD 通常都在处理命令。因此，如果要使事件处理程序在涉及 AutoCAD 及其数据库时提供安全的操作，则需要对事件处理程序进行一些限制。

  • 不要依赖事件发生的顺序。

    编写事件处理程序时，请不要依赖用户所认为的事件发生顺序。例如，如果用户发出 OPEN 命令，则将全体触发事件 BeginCommand、BeginOpen、EndOpen 和 EndCommand。但它们的发生顺序可能并不是这样。唯一可以确定的顺序是 Begin 事件发生在对应的 End 事件之前。上一样例中，事件可能是按以下顺序触发的：BeginCommand、BeginOpen、EndCommand 和 EndOpen，或 BeginCommand、EndCommand、BeginOpen 和 EndOpen。

  • 不要依赖操作的顺序。

    如果用户删除 object1，然后再删除 object2，这时请不要依赖这样的事实，即先收到 object1 的 ObjectErased 事件，然后收到 object2 的事件。实际上用户可能会先收到 object2 的 ObjectErased 事件。

  • 不要试图从事件处理程序中执行任何交互式函数。

    试图从事件处理程序中执行交互式函数可能会造成严重问题，因为触发事件时 AutoCAD 可能仍在处理命令。因此，应始终在事件处理程序中避免使用输入获取方法，例如 GetPoint、GetEntity、GetKeyword 等，也不要使用选择集操作和 SendCommand 方法。

  • 不要从事件处理程序中启动对话框。

    对话框和交互式函数一样，也会干涉 AutoCAD 的当前操作。消息框和警告框不会交互考虑，因而可以安全地发出；但在事件处理程序中发出 BeginModal、EndModal、Activate、Deactivate 和 BeginRightClick 事件的消息框则会导致顺序混乱。

  • 可以向数据库中的任何对象写入数据，但发出事件的对象除外。

    显然，导致触发事件的任何对象可能仍在 AutoCAD 中处于打开状态，并用于当前正在执行的操作。因此，要避免从对象的事件处理程序将任何信息再写入到该对象。然后，用户可以安全地从触发事件的对象读取信息。例如，假设一个铺满瓷砖的地板，用户创建的事件处理程序附着到该地板的边框。如果更改地板的大小，事件处理程序将自动添加或减少瓷砖，以铺满新的区域。事件处理程序可以读取新的边框区域，但不能试图修改边框本身。

  • 不要从事件处理程序中执行任何触发相同事件的操作。

    如果在事件处理程序中执行触发该相同事件的相同操作，会导致无限循环。例如，用户不该尝试从 BeginOpen 事件中打开图形；否则，AutoCAD 将不断打开更多图形，直到打开的图形数量达到最大值。

  • 请记住，AutoCAD 显示模式对话框时，不会触发任何事件。


处理应用程序层事件

事件处理程序的原则
使用事件
启用应用程序层事件
ActiveX/VBA 开发人员手册 > 使用事件 >
处理应用程序层事件

应用程序层事件在 AutoCAD VBA 中不是永久的。也就是说，不会在加载 VBA 工程时自动启用。因此，必须对 VBA 和其他所有 ActiveX® Automation 控制程序启用应用程序层事件。

启用应用程序层事件后，有很多事件可供使用。这些事件包括：

AppActivate

紧接主“应用程序”窗口激活之前触发。

AppDeactivate

紧接主“应用程序”窗口停用之前触发。

ARXLoaded

加载 ObjectARX 应用程序之后触发。

ARXUnloaded

卸载 ObjectARX 应用程序之后触发。

BeginCommand

紧接着命令发出之后但在完成之前触发。

BeginFileDrop

将文件拖放到主“应用过程”窗口时触发。

BeginLISP

AutoCAD 收到计算 LISP 表达式的请求之后立即触发。

BeginModal

紧接模式对话框显示之前触发。

BeginOpen

AutoCAD 收到打开现有图形的请求之后立即触发。

BeginPlot

AutoCAD 收到打印图形的请求之后立即触发。

BeginQuit

AutoCAD 任务结束之前立即触发。

BeginSave

AutoCAD 收到保存图形的请求之后立即触发。

EndCommand

完成命令之后立即触发。

EndLISP

完成 LISP 表达式的计算时触发。

EndModal

关闭模式对话框之后立即触发。

EndOpen

AutoCAD 完成打开现有图形之后立即触发。

EndPlot

文档发送到打印机之后触发。

EndSave

AutoCAD 完成保存图形之后触发。

LISPCancelled

取消 LISP 表达式的计算时触发。

NewDrawing

紧邻创建新图形之前触发。

SysVarChanged

更改系统变量的值时触发。

WindowChanged

更改“应用程序”窗口时触发。

WindowMovedOrResized

“应用程序”窗口移动或调整大小之后立即触发。

本节内容

  • 启用应用程序层事件


启用应用程序层事件

处理应用程序层事件
处理应用程序层事件
处理文档层事件
ActiveX/VBA 开发人员手册 > 使用事件 > 处理应用程序层事件 >
启用应用程序层事件

必须先创建新的类模块，并声明包含事件的 AcadApplication 类型的对象，然后才能使用应用程序层事件。例如，假设创建一个称为 EventClassModule 的新类模块。该模块包含带有 VBA 关键字 WithEvents 的应用程序声明。

创建新类并声明包含事件的 Application 对象的步骤

  1. 在 VBA IDE 中，插入类模块。在“插入”菜单中，选择“类模块”。
  2. 在“工程”窗口中，选择该新类模块。
  3. 在“特性”窗口中，将类名改为 EventClass-Module。
  4. 使用 F7 键或通过依次选择菜单选项“查看” [image] “代码”来打开该类的“代码”窗口。
  5. 在该类的“代码”窗口中，添加以下行：
Public WithEvents App As AcadApplication

声明包含事件的新对象之后，新对象将出现在该类模块的“对象”下拉列表中，用户可以在该类模块中为新对象编写事件过程。（在“对象”框中选中新对象时，该对象的有效事件会显示在“过程”下拉列表框中。）

然而，在运行这些过程之前，必须将类模块中的声明对象与 Application 对象相连接。可以在任何模块中使用以下代码完成此操作。

将声明的对象与 Application 对象相连接的步骤

  1. 在主模块的“代码”窗口中，向声明部分添加以下行：
    Dim X As New EventClassModule
  2. 在相同窗口中，添加以下子例程：
    Sub InitializeEvents()
    Set X.App = ThisDrawing.Application
    End Sub
  3. 在主模块的代码中，添加对 InitializeEvents 子例程的调用：
    Call InitializeEvents

运行 InitializeEvents 过程之后，类模块中的 App 对象会指向指定的 Application 对象，并且类模块中的事件过程会在事件发生时运行。

将图形拖放到 AutoCAD 中时，提示继续

本例在将文件拖放到 AutoCAD 中时，会中断加载进程，并显示一个消息框，其中包含被拖放文件的名称以及“是”/“否”/“继续”按钮，以确定是否继续加载或显示文件。如果用户选择取消操作，那么该决定会通过 BeginFileDrop 事件的 Cancel 参数返回，并且不加载文件。

Public WithEvents ACADApp As AcadApplication
Sub Example_AcadApplication_Events()
 ' 本例初始化公有变量 (ACADApp)
 ' 该变量用于中断 AcadApplication 事件
 '
 ' 必须先运行此过程！
 ' 可以从 ThisDocument 对象获取应用程序，
 ' 但是这将需要打开图形，
 ' 因此选择从系统抓取。
 Set ACADApp = GetObject(, "AutoCAD.Application.17")
End Sub
Private Sub ACADApp_BeginFileDrop _
 (ByVal FileName As String, Cancel As Boolean)
 ' 本例中断 Application BeginFileDrop 事件。
 '
 ' 此事件在将图形文件拖放到 AutoCAD 中
 ' 时触发。
 '
 ' 触发本样例事件的步骤：
    ' 1) 确保运行初始化
 ' 链接到此事件的公有变量（名为 ACADApp）的样例。
 '
 ' 2) 将 AutoCAD 图形文件拖放到 AutoCAD
 ' 拖放到 AutoCAD 应用程序
 ' 中。
 ' 使用 Cancel 变量停止拖动文件的加载，
 ' 使用 FileName 变量通知用户要拖动
 ' 的文件。
 If MsgBox("AutoCAD is about to load " & FileName & vbCrLf _
 & "Do you want to continue loading this file?", _
 vbYesNoCancel + vbQuestion) <> vbYes Then
 Cancel = True
 End If
End Sub


处理文档层事件

启用应用程序层事件
使用事件
在非 VBA 环境中启用文档层事件
ActiveX/VBA 开发人员手册 > 使用事件 >
处理文档层事件

文档层事件在 AutoCAD VBA 中是永久的。也就是说，会在加载 VBA 工程时自动启用。但不会在其他控制器（例如 VB）中启用。因此，对于所有其他 ActiveX Automation 控制器，必须启用文档层事件。

启用文档层事件之后，有很多事件可供使用。这些事件包括

Activate

激活“文档”窗口时触发。

BeginDocClose

收到关闭图形的请求后触发。

BeginCommand

紧接着命令发出之后但在完成之前触发。

BeginDoubleClick

用户双击图形中的对象之后触发。

BeginLISP

AutoCAD 收到计算 LISP 表达式的请求之后立即触发。

BeginPlot

AutoCAD 收到打印图形的请求之后立即触发。

BeginRightClick

用户在“图形”窗口中单击右键之后触发。

BeginSave

AutoCAD 收到保存图形的请求之后立即触发。

BeginShortcutMenuCommand

用户在“图形”窗口中单击右键之后、“命令”模式中出现快捷菜单之前触发。

BeginShortcutMenuDefault

用户在“图形”窗口中单击右键之后、“默认”模式中出现快捷菜单之前触发。

BeginShortcutMenuEdit

用户在“图形”窗口中单击右键之后、“编辑”模式中出现快捷菜单之前触发。

BeginShortcutMenuGrip

用户在“图形”窗口中单击右键之后、“夹点”模式中出现快捷菜单之前触发。

BeginShortcutMenuOsnap

用户在“图形”窗口中单击右键之后、“对象捕捉”模式中出现快捷菜单之前触发。

Deactivate

“图形”窗口停用时触发。

EndCommand

完成命令之后立即触发。

EndLISP

完成 LISP 表达式的计算时触发。

EndPlot

文档发送到打印机之后触发。

EndSave

AutoCAD 完成保存图形之后触发。

EndShortcutMenu

出现快捷菜单之后触发。

LayoutSwitched

用户切换到不同布局之后触发。

LISPCancelled

取消 LISP 表达式的计算时触发。

ObjectAdded

对象添加到图形之后触发。

ObjectErased

对象从图形中删除之后触发。

ObjectModified

修改图形中的对象之后触发。

SelectionChanged

更改当前选择优先的选择集时触发。

WindowChanged

更改“文档”窗口时触发。

WindowMovedOrResized

“图形”窗口移动或调整大小之后触发。

本节内容

  • 在非 VBA 环境中启用文档层事件
  • 在非 VBA 环境中编写文档层事件代码
  • 在 VBA 中编写文档层事件代码


在非 VBA 环境中启用文档层事件

处理文档层事件
处理文档层事件
在非 VBA 环境中编写文档层事件代码
ActiveX/VBA 开发人员手册 > 使用事件 > 处理文档层事件 >
在非 VBA 环境中启用文档层事件

必须先创建新的类模块，并声明包含事件的 AcadDocument 类型的对象，然后才能在 VB 或其他非 VBA 环境中使用文档层事件。例如，假设创建一个称为 EventClassModule 的新类模块。该模块包含带有 VBA 关键字 WithEvents 的应用程序声明。

创建新类并声明包含事件的 Document 对象的步骤

  1. 在 VBA IDE 中，插入类模块。在“插入”菜单中，选择“类模块”。
  2. 在“工程”窗口中，选择该新类模块。
  3. 在“特性”窗口中，将类名改为 EventClass-Module。
  4. 使用 F7 键或通过依次选择菜单选项“查看” [image] “代码”来打开该类的“代码”窗口。
  5. 在该类的“代码”窗口中，添加以下行：
Public WithEvents Doc As AcadDocument

声明包含事件的新对象之后，新对象将出现在该类模块的“对象”下拉列表中，用户可以在该类模块中为新对象编写事件过程。（在“对象”框中选中新对象时，该对象的有效事件会显示在“过程”下拉列表框中。）

然而，在运行这些过程之前，必须将类模块中声明的对象与 Document 对象相连接。可以在任何模块中使用以下代码完成此操作。

将声明的对象与 Document 对象相连接的步骤

  1. 在主模块的“代码”窗口中，向声明部分添加以下行：
    Dim X As New EventClassModule
  2. 在相同窗口中，添加以下子例程：
    ub InitializeEvents()
     Set X.Doc = ThisDrawing
    End Sub
  3. 在主模块的代码中，添加对 InitializeApp 子例程的调用：
    Call InitializeEvents

    运行 InitializeEvents 过程之后，类模块中的 Doc 对象会指向创建的 Document 对象，并且类模块中的事件过程会在事件发生时运行。


在非 VBA 环境中编写文档层事件代码

在非 VBA 环境中启用文档层事件
处理文档层事件
在 VBA 中编写文档层事件代码
ActiveX/VBA 开发人员手册 > 使用事件 > 处理文档层事件 >
在非 VBA 环境中编写文档层事件代码

启用文档层事件之后，用户可以在“类模块代码”窗口的“对象”下拉列表中找到可用的 Doc 类变量。选择 Doc 类，可用的事件列表将显示在“过程”下拉列表中。只需选择要为之编写处理程序的事件，便会自动创建该处理程序的框架。


在 VBA 中编写文档层事件代码

在非 VBA 环境中编写文档层事件代码
处理文档层事件
处理对象层事件
ActiveX/VBA 开发人员手册 > 使用事件 > 处理文档层事件 >
在 VBA 中编写文档层事件代码

加载 VBA 工程时，自动启用文档层事件。要在 VBA 中编写文档层事件的事件处理程序，只需从“代码”窗口的“对象”下拉列表中选择“AcadDocument”。文档的可用事件将显示在“过程”下拉列表中。只需选择要为之编写处理程序的事件，便会自动创建该处理程序的框架。

注意，以这种方式创建的事件处理程序适用于当前的活动图形。要为特定图形创建事件处理程序，请先执行在非 VBA 环境中启用文档层事件中的步骤。这使用户可以为特定文档启用事件。

下例使用 BeginShortcutMenuDefault 事件的事件处理程序将“OpenDWG”菜单项添加到快捷菜单的开头。然后，EndShortcutMenu 事件的事件处理程序将删除附加的菜单项，以使其不会被永久保存在用户的菜单配置中。

Private Sub AcadDocument_BeginShortcutMenuDefault _
                    (ShortcutMenu As AutoCAD.IAcadPopupMenu)
    On Error Resume Next
    ' 向光标菜单中添加菜单项
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    openMacro = Chr(vbKeyEscape) + Chr(vbKeyEscape) + "_open "
    Set newMenuItem = ShortcutMenu.AddMenuItem _
                                    (0, Chr(Asc("&")) _
                                     + "OpenDWG", openMacro)
End Sub
Private Sub AcadDocument_EndShortcutMenu _
                   (ShortcutMenu As AutoCAD.IAcadPopupMenu)
    On Error Resume Next
    ShortcutMenu.Item("OpenDWG").Delete
End Sub


处理对象层事件

在 VBA 中编写文档层事件代码
使用事件
启用对象层事件
ActiveX/VBA 开发人员手册 > 使用事件 >
处理对象层事件

对象层事件在 AutoCAD VBA 中不是永久的。也就是说，不会在加载 VBA 工程时自动启用。因此，对于 VBA 和所有其他 ActiveX Automation 控制器，必须启用对象层事件。

启用对象层事件之后，可以使用 Modified 事件。当图形中的对象被修改时将触发该事件。

本节内容

  • 启用对象层事件


启用对象层事件

处理对象层事件
处理对象层事件
在三维空间中工作
ActiveX/VBA 开发人员手册 > 使用事件 > 处理对象层事件 >
启用对象层事件

必须先创建新的类模块，并声明包含事件的 AcadObject 类型的对象，然后才能使用对象层事件。例如，假设创建一个称为 EventClassModule 的新类模块。该模块包含带有 VBA 关键字 WithEvents 的应用程序声明。

创建新类并声明包含事件的 Circle 对象的步骤

  1. 在 VBA IDE 中，插入类模块。在“插入”菜单中，选择“类模块”。
  2. 在“工程”窗口中，选择该新类模块。
  3. 在“特性”窗口中，将类名改为 EventClass-Module。
  4. 使用 F7 键或通过依次选择菜单选项“查看” [image] “代码”来打开该类的“代码”窗口。
  5. 在该类的“代码”窗口中，添加以下行：
Public WithEvents Object As AcadCircle

声明包含事件的新对象之后，新对象将出现在该类模块的“对象”下拉列表中，用户可以在该类模块中为新对象编写事件过程。（在“对象”框中选中新对象时，该对象的有效事件会显示在“过程”下拉列表框中。）

然而，在运行这些过程之前，必须将类模块中声明的对象与 Circle 对象相连接。可以在任何模块中使用以下代码完成此操作。

将声明的对象与 Automation 对象相连接的步骤

  1. 在主模块的“代码”窗口中，向声明部分添加以下行：
    Dim X As New EventClassModule
  2. 在同一个窗口中，创建称为“MyCircle”的圆，然后将其初始化并使其包含事件：
    Sub InitializeEvents()
     Dim MyCircle As AcadCircle
     Dim centerPoint(0 To 2) As Double
     Dim radius As Double
     centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0#
     radius = 5#
     Set MyCircle = ThisDrawing.ModelSpace.AddCircle(centerPoint, radius)
     Set X.Object = MyCircle
    End Sub
  3. 在主模块的代码中，添加对 InitializeApp 子例程的调用：
    Call InitializeEvents

    运行 InitializeEvents 过程之后，类模块中的 Circle 对象会指向创建的 Circle 对象，并且类模块中的事件过程会在事件发生时运行。

    注意在 VBA 中编写代码时，必须为所有对象（为 Modified 事件启用的）都提供一个事件处理程序。否则，VBA 可能会异常终止。
    在多段线刷新时显示闭合多段线的面积

    本例创建包含事件的优化多段线。然后，多段线的事件处理程序会在每次更改多段线时显示新的面积。要触发事件，只需在 AutoCAD 中修改多段线的大小。请记住，必须在激活事件处理程序之前运行 CreatePLineWithEvents 子例程。

    Public WithEvents PLine As AcadLWPolyline
    Sub CreatePLineWithEvents()
     ' 本例创建一条优化多段线
     Dim points(0 To 9) As Double
     points(0) = 1: points(1) = 1
     points(2) = 1: points(3) = 2
     points(4) = 2: points(5) = 2
     points(6) = 3: points(7) = 3
     points(8) = 3: points(9) = 2
     Set PLine = ThisDrawing.ModelSpace. _
     AddLightWeightPolyline(points)
     PLine.Closed = True
     ThisDrawing.Application.ZoomAll
    End Sub
    Private Sub PLine_Modified _
     (ByVal pObject As AutoCAD.IAcadObject)
     ' 调整多段线大小时，该事件被触发。
     ' 如果多段线被删除，仍会触发 modified 事件，
     ' 所以使用了错误处理程序以避免
     ' 从已删除对象读取数据。
     On Error GoTo ERRORHANDLER
     MsgBox "The area of " & pObject.ObjectName & " is: " _
     & pObject.Area
     Exit Sub
    ERRORHANDLER:
     MsgBox Err.Description
    End Sub


在三维空间中工作

启用对象层事件
指定三维坐标
ActiveX/VBA 开发人员手册 >
在三维空间中工作

大部分图形都是由三维 (3D) 对象的二维 (2D) 视图组成的。尽管此种绘图方法广泛用于建筑和工程领域，但它也受到限制：图形是三维对象的二维表示形式，并且必须进行可视解释。而且，由于视图是分别绘制的，因此很有可能出现错误或表达不清楚。有鉴于此，用户可能会希望创建真正的三维模型，而不仅仅是二维表示。使用 AutoCAD 的绘图工具可以创建真实、详尽的三维对象，并且能够以多种方式对其进行处理。

本节内容

  • 指定三维坐标
  • 定义用户坐标系
  • 转换坐标
  • 创建三维对象
  • 在三维空间中编辑
  • 编辑三维实体


指定三维坐标

在三维空间中工作
在三维空间中工作
定义用户坐标系
ActiveX/VBA 开发人员手册 > 在三维空间中工作 >
指定三维坐标

输入三维世界坐标系 (WCS) 坐标与输入二维 WCS 坐标类似。只是除了指定 X 和 Y 值以外，还要指定 Z 值。就像用于二维坐标一样，变量用于向 ActiveX® 方法和特性传递坐标，也用于查询坐标。

有关指定三维坐标的详细信息，请参见《用户手册》中的“输入三维坐标”。

定义和查询二维和三维多段线的坐标

本样例创建两条多段线，每条都有三个坐标。第一条是二维多段线，第二条是三维多段线。请注意，创建三维多段线时，包含顶点的数组的长度会拉伸以包含 Z 坐标。然后，样例查询多段线的坐标，并将坐标显示在消息框中。

Sub Ch8_Polyline_2D_3D()
    Dim pline2DObj As AcadLWPolyline
    Dim pline3DObj As AcadPolyline
    Dim points2D(0 To 5) As Double
    Dim points3D(0 To 8) As Double
    ' 定义三个二维多段线点
   points2D(0) = 1: points2D(1) = 1
   points2D(2) = 1: points2D(3) = 2
   points2D(4) = 2: points2D(5) = 2
    ' 定义三个三维多段线点
   points3D(0) = 1: points3D(1) = 1: points3D(2) = 0
   points3D(3) = 2: points3D(4) = 1: points3D(5) = 0
   points3D(6) = 2: points3D(7) = 2: points3D(8) = 0
    ' 创建二维优化多段线
    Set pline2DObj = ThisDrawing.ModelSpace. _
                             AddLightWeightPolyline(points2D)
    pline2DObj.Color = acRed
    pline2DObj.Update
    ' 创建三维多段线
    Set pline3DObj = ThisDrawing.ModelSpace. _
                             AddPolyline(points3D)
    pline3DObj.Color = acBlue
    pline3DObj.Update
    ' 查询多段线的坐标
    Dim get2Dpts As Variant
    Dim get3Dpts As Variant
    get2Dpts = pline2DObj.Coordinates
    get3Dpts = pline3DObj.Coordinates
    ' 显示坐标
    MsgBox ("2D polyline (red): " & vbCrLf & _
            get2Dpts(0) & ", " & get2Dpts(1) & vbCrLf & _
            get2Dpts(2) & ", " & get2Dpts(3) & vbCrLf & _
            get2Dpts(4) & ", " & get2Dpts(5))
    MsgBox ("3D polyline (blue): " & vbCrLf & _
            get3Dpts(0) & ", " & get3Dpts(1) & ", " & _
            get3Dpts(2) & vbCrLf & _
            get3Dpts(3) & ", " & get3Dpts(4) & ", " & _
            get3Dpts(5) & vbCrLf & _
            get3Dpts(6) & ", " & get3Dpts(7) & ", " & _
            get3Dpts(8))
End Sub


定义用户坐标系

指定三维坐标
在三维空间中工作
转换坐标
ActiveX/VBA 开发人员手册 > 在三维空间中工作 >
定义用户坐标系

定义用户坐标系 (UCS) 对象以更改 (0, 0, 0) 原点的位置以及 XY 平面和 Z轴的方向。可以在三维空间中的任意位置放置 UCS 并定义其方向，并且可以定义、保存和调用所需任意数目的用户坐标系。坐标的输入和显示均相对于当前 UCS。

要标明 UCS 的原点和方向，请使用 UCSIconAtOrigin 特性，可以在 UCS 原点处显示 UCS 图标。如果已打开 UCS 图标（请参见 UCSIconOn 特性）但它没有显示在原点，则该图标将显示在由 UCSORG 系统变量定义的 WCS 坐标处。

可以使用 Add 方法创建新的用户坐标系。此方法需要输入四个值：原点的坐标、X 轴和 Y 轴上的坐标以及 UCS 的名称。

AutoCAD® ActiveX Automation 中的所有坐标都是在世界坐标系中输入的。使用 GetUCSMatrix 方法可以返回给定 UCS 的转换矩阵。由此转换矩阵可以找出等价的 WCS 坐标。

要激活 UCS 坐标系，请使用 Document 对象的 ActiveUCS 特性。如果对活动 UCS 进行更改，则必须将新的 UCS 对象重置为活动的 UCS 才能显示所做的更改。要重置活动的 UCS，只需再次调用更新的 UCS 对象的 ActiveUCS 特性即可。

有关定义 UCS 的详细信息，请参见《用户手册》中的“控制三维中的用户坐标系”。

创建新的 UCS，将其激活，并将一个点的坐标转换为 UCS 坐标

下面的子例程将创建新的 UCS，并将其设置为图形的活动 UCS。然后要求用户在图形中拾取一点，并返回该点的 WCS 和 UCS 坐标。

Sub Ch8_NewUCS()
    ' 定义所需的变量
    Dim ucsObj As AcadUCS
    Dim origin(0 To 2) As Double
    Dim xAxisPnt(0 To 2) As Double
    Dim yAxisPnt(0 To 2) As Double
    ' 定义 UCS 点
    origin(0) = 4: origin(1) = 5: origin(2) = 3
    xAxisPnt(0) = 5: xAxisPnt(1) = 5: xAxisPnt(2) = 3
    yAxisPnt(0) = 4: yAxisPnt(1) = 6: yAxisPnt(2) = 3
    ' 将 UCS 添加到
    ' UserCoordinatesSystems 集合
    Set ucsObj = ThisDrawing.UserCoordinateSystems. _
             Add(origin, xAxisPnt, yAxisPnt, "New_UCS")
    ' 显示 UCS 图标
    ThisDrawing.ActiveViewport.UCSIconAtOrigin = True
    ThisDrawing.ActiveViewport.UCSIconOn = True
    ' 使新的 UCS 成为活动的 UCS
    ThisDrawing.ActiveUCS = ucsObj
    MsgBox "The current UCS is : " & ThisDrawing.ActiveUCS.Name _
            & vbCrLf & " Pick a point in the drawing."
    ' 找出某一点的 WCS 和 UCS 坐标
    Dim WCSPnt As Variant
    Dim UCSPnt As Variant
    WCSPnt = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
    UCSPnt = ThisDrawing.Utility.TranslateCoordinates _
             (WCSPnt, acWorld, acUCS, False)
    MsgBox "The WCS coordinates are: " & WCSPnt(0) & ", " _
             & WCSPnt(1) & ", " & WCSPnt(2) & vbCrLf & _
             "The UCS coordinates are: " & UCSPnt(0) & ", " _
             & UCSPnt(1) & ", " & UCSPnt(2)
End Sub


转换坐标

定义用户坐标系
在三维空间中工作
创建三维对象
ActiveX/VBA 开发人员手册 > 在三维空间中工作 >
转换坐标

TranslateCoordinates 方法可以将点或位移从一个坐标系转换到另一个坐标系。称为 OriginalPoint 的点参数可以被解释为三维点或三维位移矢量。此参数由 Boolean 参数 Disp 来区分。如果 Disp 参数设置为 TRUE，OriginalPoint 参数将被视为位移矢量；否则视为点。两个以上的参数可以确定 OriginalPoint 所在的坐标系，以及 OriginalPoint 将要转换到的坐标系。可以在 From 和 To 参数中指定以下 AutoCAD 坐标系：

WCS

世界坐标系：参考坐标系。所有其他坐标系都相对于 WCS 定义，该坐标系恒定不变。相对于 WCS 测量的值可以稳定地转换到其他坐标系中。除非另行指定，ActiveX 方法和特性传入和传出的所有点都以 WCS 表示。

UCS

用户坐标系 (UCS)：正在使用的坐标系。用户可以指定 UCS 以方便执行绘图任务。所有传递到 AutoCAD 命令的点，包括从 AutoLISP 例程以及外部函数返回的点，都是当前 UCS 中的点（除非用户于命令提示中在点之前加上了 *）。如果希望应用程序以 WCS、OCS 或 DCS 向 AutoCAD 命令发送坐标，必须先通过调用 TranslateCoordinates 方法，将这些坐标转换为 UCS。

OCS

对象坐标系：由 Polyline 和 LightweightPolyline 对象的特定方法和特性指定的点值以此坐标系表示（相对于对象）。根据对象的用途，这些点通常会转换为 WCS、当前 UCS 或当前 DCS。相对地，WCS、UCS 或 DCS 中的点在使用相同的特性写入数据库之前，必须将其转换为 OCS。关于采用此坐标系的方法和特性，请参见 AutoCAD《ActiveX and VBA Reference》。

将坐标转换到 OCS 或从 OCS 转换坐标时，必须在 TranslateCoordinates 函数的最后一个参数中输入 OCS 的法线。

DCS

显示坐标系：即对象在显示前要进行转换的坐标系。DCS 的原点是存储在 AutoCAD 系统变量 TARGET 中的点，并且其 Z 轴为观察方向。也就是说，某个视口始终是其 DCS 的一个平面视图。这些坐标可以用来确定对 AutoCAD 用户显示画面的位置。

PSDCS

图纸空间 DCS：此坐标系只能与当前活动模型空间视口的 DCS 相互转换。这种转换实质上是一种二维转换，其中的 X 和 Y 坐标在 Disp 参数设置为 FALSE 时，始终要进行缩放和偏移。Z 坐标也要缩放，但并不转换。因此，它可用于确定两个坐标系之间的缩放比例。PSDCS 只能转换到当前的模型空间视口中。如果 from 参数等于 PSDCS，则 to 参数必须等于 DCS，反之亦然。

将 OCS 坐标转换为 WCS 坐标

本样例在模型空间中创建一条多段线。然后，以 OCS 和 WCS 坐标显示多段线的第一个顶点。从 OCS 转换为 WCS 时，需要在 TranslateCoordinates 方法的最后一个参数中提供 OCS 法线。

Sub Ch8_TranslateCoordinates()
    ' 在模型空间中创建多段线。
    Dim plineObj As AcadPolyline
    Dim points(0 To 14) As Double
    ' 定义二维多段线的点
    points(0) = 1: points(1) = 1: points(2) = 0
    points(3) = 1: points(4) = 2: points(5) = 0
    points(6) = 2: points(7) = 2: points(8) = 0
    points(9) = 3: points(10) = 2: points(11) = 0
    points(12) = 4: points(13) = 4: points(14) = 0
    ' 在模型空间中创建一个优化多段线对象
    Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points)
    ' 找出多段线第一个顶点的
    ' X 和 Y 坐标
    Dim firstVertex As Variant
    firstVertex = plineObj.Coordinate(0)
    ' 使用 elevation 特性找出多段线
    ' 的 Z 坐标
    firstVertex(2) = plineObj.Elevation
    ' 更改多段线的法线，使
    ' 坐标系之间的差值
    ' 更加明显。
    Dim plineNormal(0 To 2) As Double
    plineNormal(0) = 0#
    plineNormal(1) = 1#
    plineNormal(2) = 2#
    plineObj.Normal = plineNormal
    ' 将 OCS 坐标转换为 WCS
    Dim coordinateWCS As Variant
    coordinateWCS = ThisDrawing.Utility.TranslateCoordinates _
          (firstVertex, acOCS, acWorld, False, plineNormal)
    ' 显示点的坐标
    MsgBox "The first vertex has the following coordinates:" _
           & vbCrLf & "OCS: " & firstVertex(0) & ", " & _
           firstVertex(1) & ", " & firstVertex(2) & vbCrLf & _
           "WCS: " & coordinateWCS(0) & ", " & _
           coordinateWCS(1) & ", " & coordinateWCS(2)
End Sub


创建三维对象

转换坐标
在三维空间中工作
创建线框
ActiveX/VBA 开发人员手册 > 在三维空间中工作 >
创建三维对象

创建多面网格创建楔体实体 AutoCAD 支持三种三维建模类型：线框、曲面和实体。每种模型都有自己的创建方法和编辑技术。

有关创建三维对象的详细信息，请参见《用户手册》中的“创建三维对象”。

本节内容

  • 创建线框
  • 创建网格
  • 创建多面网格
  • 创建实体


创建线框

创建三维对象
创建三维对象
创建网格
ActiveX/VBA 开发人员手册 > 在三维空间中工作 > 创建三维对象 >
创建线框

使用 AutoCAD，可以通过将任意二维平面对象放置在三维空间中的任意位置来创建线框模型。可以使用多种方法在三维空间中放置二维对象：

  • 通过输入三维点来创建对象。输入坐标，定义点的 X、Y 和 Z 位置。
  • 设置默认的构造平面（XY 平面），用于在上面定义 UCS 并绘制对象。
  • 创建之后，在三维空间中将该对象移至适当方向。

此外，还可以创建具有三个维度的线框对象（例如多段线）。可以使用 Add3DPoly 方法创建三维多段线。

有关创建线框的详细信息，请参见《用户手册》中的“创建线框模型”。


创建网格

创建线框
创建三维对象
创建多面网格
ActiveX/VBA 开发人员手册 > 在三维空间中工作 > 创建三维对象 >
创建网格

矩形网格（PolygonMesh 对象）使用平面镶嵌面来表示对象的曲面。网格密度（或镶嵌面的数目）由包含 M 乘 N 个顶点的矩阵定义，类似于由行和列组成的栅格。M 和 N 分别指定给定顶点的列和行的位置。在二维和三维空间中都可以创建网格，但它主要用于三维空间。

使用 Add3DMesh 方法可以创建矩形网格。此方法将输入三个值：M 方向的顶点数、N 方向的顶点数和包含网格中所有顶点的坐标的变量数组。

创建 PolygonMesh 之后，可以使用 MClose 和 NClose 特性来结束网格。

有关创建网格的详细信息，请参见《用户手册》中的“创建曲面”。

创建多边形网格

本例创建一个 4×4 多边形网格。然后调整活动视口的方向，以便于查看网格的三维情况。

Sub Ch8_Create3DMesh()
    Dim meshObj As AcadPolygonMesh
    Dim mSize, nSize, Count As Integer
    Dim points(0 To 47) As Double
    ' 创建点的矩阵
    points(0) = 0: points(1) = 0: points(2) = 0
    points(3) = 2: points(4) = 0: points(5) = 1
    points(6) = 4: points(7) = 0: points(8) = 0
    points(9) = 6: points(10) = 0: points(11) = 1
    points(12) = 0: points(13) = 2: points(14) = 0
    points(15) = 2: points(16) = 2: points(17) = 1
    points(18) = 4: points(19) = 2: points(20) = 0
    points(21) = 6: points(22) = 2: points(23) = 1
    points(24) = 0: points(25) = 4: points(26) = 0
    points(27) = 2: points(28) = 4: points(29) = 1
    points(30) = 4: points(31) = 4: points(32) = 0
    points(33) = 6: points(34) = 4: points(35) = 0
    points(36) = 0: points(37) = 6: points(38) = 0
    points(39) = 2: points(40) = 6: points(41) = 1
    points(42) = 4: points(43) = 6: points(44) = 0
    points(45) = 6: points(46) = 6: points(47) = 0
    mSize = 4: nSize = 4
    ' 在模型空间中创建三维网格
    Set meshObj = ThisDrawing.ModelSpace. _
                        Add3DMesh(mSize, nSize, points)
    ' 更改视口的观察方向
    ' 以更好地查看圆柱体
    Dim NewDirection(0 To 2) As Double
    NewDirection(0) = -1
    NewDirection(1) = -1
    NewDirection(2) = 1
    ThisDrawing.ActiveViewport.direction = NewDirection
    ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport
    ZoomAll
End Sub


创建多面网格

创建网格
创建三维对象
创建实体
ActiveX/VBA 开发人员手册 > 在三维空间中工作 > 创建三维对象 >
创建多面网格

使用 AddPolyfaceMesh 方法可以创建多面网格，其中每个面都可以有很多顶点。

创建多面网格与创建矩形网格类似。要创建多面网格，首先为其顶点指定坐标，然后通过输入面的所有顶点的顶点编号来定义该面。创建多面网格时，可以将特定边设置为不可见、指定边所在的图层或边的颜色。

要使某个边不可见，可以为该边的顶点编号输入负值。关于创建多面网格的详细信息，请参见《ActiveX and VBA Reference》中介绍的 AddPolyfaceMesh 方法。

创建多面网格

本样例在模型空间中创建一个多面网格对象。然后更新活动视口的观察方向，以便于查看网格的三维情况。

Sub Ch8_CreatePolyfaceMesh()
    ' 定义网格顶点
    Dim vertex(0 To 17) As Double
    vertex(0) = 4: vertex(1) = 7: vertex(2) = 0
    vertex(3) = 5: vertex(4) = 7: vertex(5) = 0
    vertex(6) = 6: vertex(7) = 7: vertex(8) = 0
    vertex(9) = 4: vertex(10) = 6: vertex(11) = 0
    vertex(12) = 5: vertex(13) = 6: vertex(14) = 0
    vertex(15) = 6: vertex(16) = 6: vertex(17) = 1
    ' 定义面列表
    Dim FaceList(0 To 7) As Integer
    FaceList(0) = 1
    FaceList(1) = 2
    FaceList(2) = 5
    FaceList(3) = 4
    FaceList(4) = 2
    FaceList(5) = 3
    FaceList(6) = 6
    FaceList(7) = 5
    ' 创建多面网格
    Dim polyfaceMeshObj As AcadPolyfaceMesh
    Set polyfaceMeshObj = ThisDrawing.ModelSpace.AddPolyfaceMesh _
                                  (vertex, FaceList)
    ' 更改视口的观察方向
    ' 以便于查看多面网格
    Dim NewDirection(0 To 2) As Double
    NewDirection(0) = -1
    NewDirection(1) = -1
    NewDirection(2) = 1
    ThisDrawing.ActiveViewport.direction = NewDirection
    ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport
    ZoomAll
End Sub


创建实体

创建多面网格
创建三维对象
在三维空间中编辑
ActiveX/VBA 开发人员手册 > 在三维空间中工作 > 创建三维对象 >
创建实体

实体对象（3DSolid 对象）代表对象的整个体积。实体是信息最完整和最确切的三维建模类型。复杂实体形也比线框和网格更容易构造和编辑。

可以根据基本实体形（长方体、圆锥体、圆柱体、球体、圆环体和楔体）来创建实体，也可以通过沿路径拉伸二维对象或者绕轴旋转二维对象来创建实体。要创建实体，可以使用以下方法之一：

AddBox、AddCone、AddCylinder、AddEllipticalCone、AddEllipticalCylinder、AddExtrudedSolid、AddExtrudedSolidAlongPath、AddRevolvedSolid、AddSolid、AddSphere、AddTorus 或 AddWedge。

与网格类似，在进行消隐、着色或渲染之前，实体显示为线框。此外，用户还可以分析实体的质量特性（体积、惯性矩、重心等等）。以下特性可用于分析实体：MomentOfInertia、PrincipalDirections、PrincipalMoments、ProductOfInertia、RadiiOfGyration 和 Volume。

ContourlinesPerSurface 特性可控制用于直观显示线框曲线部分的镶嵌数。RenderSmoothness 特性用于调整着色对象和隐藏线对象的平滑度。

有关创建实体的详细信息，请参见《用户手册》中的“创建三维对象”。

创建楔体实体

本样例在模型空间中创建一个楔形实体。然后更新活动视口的观察方向，以便于查看楔体的三维情况。

Sub Ch8_CreateWedge()
    Dim wedgeObj As Acad3DSolid
    Dim center(0 To 2) As Double
    Dim length As Double
    Dim width As Double
    Dim height As Double
    ' 定义楔体
    center(0) = 5#: center(1) = 5#: center(2) = 0
    length = 10#: width = 15#: height = 20#
    ' 在模型空间中创建楔体
    Set wedgeObj = ThisDrawing.ModelSpace. _
                   AddWedge(center, length, width, height)
    ' 更改视口的观察方向
    Dim NewDirection(0 To 2) As Double
    NewDirection(0) = -1
    NewDirection(1) = -1
    NewDirection(2) = 1
    ThisDrawing.ActiveViewport.direction = NewDirection
    ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport
    ZoomAll
End Sub


在三维空间中编辑

创建实体
在三维空间中工作
在三维空间中旋转对象
ActiveX/VBA 开发人员手册 > 在三维空间中工作 >
在三维空间中编辑

本节说明如何编辑三维对象，例如旋转、阵列和镜像。

本节内容

  • 在三维空间中旋转对象
  • 在三维空间中创建阵列
  • 沿平面镜像对象


在三维空间中旋转对象

在三维空间中编辑
在三维空间中编辑
在三维空间中创建阵列
ActiveX/VBA 开发人员手册 > 在三维空间中工作 > 在三维空间中编辑 >
在三维空间中旋转对象

使用 Rotate 方法可以在二维空间中绕指定点旋转对象。旋转的方向由 WCS 确定。而使用 Rotate3D 方法可以在三维空间中绕指定轴旋转对象。Rotate3D 方法将输入三个值：定义旋转轴的两点的 WCS 坐标和以弧度为单位的旋转角度。

要旋转三维对象，既可以使用 Rotate 方法，也可以使用 Rotate3D 方法。

有关在三维中进行旋转的详细信息，请参见《用户手册》中的“旋转对象”。

创建三维长方体，并将其绕轴旋转

本样例创建一个三维长方体，然后定义旋转轴，将长方体绕该轴旋转 30 度。

Sub Ch8_Rotate_3DBox()
    Dim boxObj As Acad3DSolid
    Dim length As Double
    Dim width As Double
    Dim height As Double
    Dim center(0 To 2) As Double
    ' 定义长方体
    center(0) = 5: center(1) = 5: center(2) = 0
    length = 5
    width = 7
    height = 10
    ' 在模型空间中创建长方体对象
    Set boxObj = ThisDrawing.ModelSpace. _
                AddBox(center, length, width, height)
    ' 用两点定义旋转轴
    Dim rotatePt1(0 To 2) As Double
    Dim rotatePt2(0 To 2) As Double
    Dim rotateAngle As Double
    rotatePt1(0) = -3: rotatePt1(1) = 4: rotatePt1(2) = 0
    rotatePt2(0) = -3: rotatePt2(1) = -4: rotatePt2(2) = 0
    rotateAngle = 30
    rotateAngle = rotateAngle * 3.141592 / 180#
    ' 旋转长方体
    boxObj.Rotate3D rotatePt1, rotatePt2, rotateAngle
    ZoomAll
End Sub


在三维空间中创建阵列

在三维空间中旋转对象
在三维空间中编辑
沿平面镜像对象
ActiveX/VBA 开发人员手册 > 在三维空间中工作 > 在三维空间中编辑 >
在三维空间中创建阵列

使用 ArrayRectangular 方法可以在三维空间中创建矩形阵列。除了指定列数（X 方向）和行数（Y 方向）以外，还要指定层数（Z 方向）。

有关在三维中使用对象阵列的详细信息，请参见《用户手册》中的“创建对象阵列”。

创建三维矩形阵列

本样例创建一个圆，然后用该圆创建四行、四列、三层的圆的矩形阵列。

Sub Ch8_CreateRectangularArray()
    ' 创建圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 2: center(1) = 2: center(2) = 0
    radius = 0.5
    Set circleObj = ThisDrawing.ModelSpace. _
                              AddCircle(center, radius)
    ' 定义矩形阵列
    Dim numberOfRows As Long
    Dim numberOfColumns As Long
    Dim numberOfLevels As Long
    Dim distanceBwtnRows As Double
    Dim distanceBwtnColumns As Double
    Dim distanceBwtnLevels As Double
    numberOfRows = 4
    numberOfColumns = 4
    numberOfLevels = 3
    distanceBwtnRows = 1
    distanceBwtnColumns = 1
    distanceBwtnLevels = 4
    ' 创建对象的阵列
    Dim retObj As Variant
    retObj = circleObj.ArrayRectangular _
        (numberOfRows, numberOfColumns, _
         numberOfLevels, distanceBwtnRows, _
         distanceBwtnColumns, distanceBwtnLevels)
    ZoomAll
End Sub


沿平面镜像对象

在三维空间中创建阵列
在三维空间中编辑
编辑三维实体
ActiveX/VBA 开发人员手册 > 在三维空间中工作 > 在三维空间中编辑 >
沿平面镜像对象

使用 Mirror3D 方法可以沿由三点指定的特定镜像平面镜像对象。

有关在三维中镜像对象的详细信息，请参见《用户手册》中的“镜像对象”。

在三维空间中镜像对象

本样例在模型空间中创建一个长方体，然后根据某个平面镜像该长方体，并将镜像得到的长方体着色为红色。

Sub Ch8_MirrorABox3D()
    ' 创建长方体对象
    Dim boxObj As Acad3DSolid
    Dim length As Double
    Dim width As Double
    Dim height As Double
    Dim center(0 To 2) As Double
    center(0) = 5#: center(1) = 5#: center(2) = 0
    length = 5#: width = 7: height = 10#
    ' 在模型空间中创建长方体 (3DSolid) 对象
    Set boxObj = ThisDrawing.ModelSpace. _
                AddBox(center, length, width, height)
    ' 用三个点定义镜像平面
    Dim mirrorPt1(0 To 2) As Double
    Dim mirrorPt2(0 To 2) As Double
    Dim mirrorPt3(0 To 2) As Double
    mirrorPt1(0) = 1.25: mirrorPt1(1) = 0: mirrorPt1(2) = 0
    mirrorPt2(0) = 1.25: mirrorPt2(1) = 2: mirrorPt2(2) = 0
    mirrorPt3(0) = 1.25: mirrorPt3(1) = 2: mirrorPt3(2) = 2
    ' 镜像长方体
    Dim mirrorBoxObj As Acad3DSolid
    Set mirrorBoxObj = boxObj.Mirror3D _
                (mirrorPt1, mirrorPt2, mirrorPt3)
    mirrorBoxObj.Color = acRed
    ZoomAll
End Sub


编辑三维实体

沿平面镜像对象
在三维空间中工作
定义布局并打印
ActiveX/VBA 开发人员手册 > 在三维空间中工作 >
编辑三维实体

创建实体之后，可以通过组合实体来创建更复杂的形状。可以合并这些实体、获得它们的差集或找出实体的公用（重叠）部分。可以使用 Boolean 或 CheckInterference 方法完成这些组合。

通过获取实体的二维相交截面或将实体剖切为两个部分，可以进一步修改实体。可以使用 SectionSolid 方法找出实体的相交截面，使用 SliceSolid 方法将实体剖切为两部分。

找出两个实体之间的干涉

本样例在模型空间中创建一个长方体和一个圆柱体，然后找出这两个实体之间的干涉，并由干涉创建一个新的实体。为便于查看，将长方体着色为白色，圆柱体着色为青色，得到的干涉实体为红色。

Sub Ch8_FindInterferenceBetweenSolids()
    ' 定义长方体
    Dim boxObj As Acad3DSolid
    Dim length As Double
    Dim width As Double
    Dim height As Double
    Dim center(0 To 2) As Double
    center(0) = 5: center(1) = 5: center(2) = 0
    length = 5
    width = 7
    height = 10
    ' 在模型空间中创建长方体对象
    ' 并着色为白色
    Set boxObj = ThisDrawing.ModelSpace. _
                AddBox(center, length, width, height)
    boxObj.Color = acWhite
    ' 定义圆柱体
    Dim cylinderObj As Acad3DSolid
    Dim cylinderRadius As Double
    Dim cylinderHeight As Double
    center(0) = 0: center(1) = 0: center(2) = 0
    cylinderRadius = 5
    cylinderHeight = 20
    ' 创建圆柱体并
    ' 着色为青色
    Set cylinderObj = ThisDrawing.ModelSpace.AddCylinder _
                   (center, cylinderRadius, cylinderHeight)
    cylinderObj.Color = acCyan
    ' 找出两个实体之间的干涉
    ' 并由干涉创建新的实体。新实体
    ' 着色为红色。
    Dim solidObj As Acad3DSolid
    Set solidObj = boxObj.CheckInterference(cylinderObj, True)
    solidObj.Color = acRed
    ZoomAll
End Sub
将实体剖切为两个实体
本样例在模型空间中创建一个长方体，然后基于由三个点定义的平面剖切该长方体。剖切后的结果作为 3DSolid 返回。
Sub Ch8_SliceABox()
    ' 创建长方体对象
    Dim boxObj As Acad3DSolid
    Dim length As Double
    Dim width As Double
    Dim height As Double
    Dim center(0 To 2) As Double
    center(0) = 5#: center(1) = 5#: center(2) = 0
    length = 5#: width = 7: height = 10#
    ' 在模型空间中创建长方体 (3DSolid) 对象
    Set boxObj = ThisDrawing.ModelSpace. _
                AddBox(center, length, width, height)
    boxObj.Color = acWhite
    ' 用三点定义剖切平面
    Dim slicePt1(0 To 2) As Double
    Dim slicePt2(0 To 2) As Double
    Dim slicePt3(0 To 2) As Double
    slicePt1(0) = 1.5: slicePt1(1) = 7.5: slicePt1(2) = 0
    slicePt2(0) = 1.5: slicePt2(1) = 7.5: slicePt2(2) = 10
    slicePt3(0) = 8.5: slicePt3(1) = 2.5: slicePt3(2) = 10
     ' 剖切长方体并将新实体着色为红色
    Dim sliceObj As Acad3DSolid
    Set sliceObj = boxObj.SliceSolid _
                    (slicePt1, slicePt2, slicePt3, True)
    sliceObj.Color = acRed
    ZoomAll
End Sub


定义布局并打印

编辑三维实体
模型空间和图纸空间
ActiveX/VBA 开发人员手册 >
定义布局并打印

用户在使用 AutoCAD 创建图形之后，通常要将其打印到图纸上。打印的图形可以包含图形的单一视图，也可以包含更复杂的视图安排。在图纸空间中，可以创建称为浮动视口的窗口，以显示图形的不同视图。可以根据需要打印一个或多个视口，或者设置选项以确定打印的内容以及图像在图纸上的布局方式。

本节内容

  • 模型空间和图纸空间
  • 布局
  • 视口
  • 打印图形


模型空间和图纸空间

定义布局并打印
定义布局并打印
布局
ActiveX/VBA 开发人员手册 > 定义布局并打印 >
模型空间和图纸空间

模型空间是创建模型几何图形的图形环境。当开始在模型空间中绘图时，通常需要指定图形界限以确定图形环境的范围，然后按实际的单位来绘图。

图纸空间代表模型打印时的图纸表示方式。在图纸空间中可以布局图形的不同视图、独立地缩放各个视图并按照所需的打印布局排列图形的不同视图。一个图形可以有多个不同的图纸空间表示。


布局

模型空间和图纸空间
定义布局并打印
布局和块
ActiveX/VBA 开发人员手册 > 定义布局并打印 >
布局

图形中的所有几何图形都包含在布局中。模型空间几何图形包含在称为“模型”的单个布局中。用户不能重命名模型空间布局，也不能创建其他模型空间布局，并且每个图形只能有一个模型空间布局。

图纸空间几何图形也包含在布局中。图形可以具有多个不同的图纸空间布局，每个布局代表一种不同的打印配置。可以修改图纸空间布局的名称。

在 ActiveX® Automation 中，ModelSpace 集合包含模型空间布局中的所有几何图形。由于一个图形可以具有多个图纸空间布局，所以 PaperSpace 集合指向最后一个活动的图纸空间布局。

有关操作图纸空间布局的详细信息，请参见《用户手册》中的“图案填充、填充和区域覆盖”。

本节内容

  • 布局和块
  • 打印配置
  • 布局设置


布局和块

布局
布局
打印配置
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 布局 >
布局和块

任何布局的内容都分布在两种不同的 ActiveX 对象中：Layout 对象和 Block 对象。Layout 对象包含布局显示在 AutoCAD 用户界面中时的打印设置和视觉特性。Block 对象包含布局的几何图形。

每个 Layout 对象与一个并且只能与一个 Block 对象关联。要访问与给定布局关联的 Block 对象，请使用 Block 特性。与此相对，每个 Block 对象与一个并且只能与一个 Layout 对象关联。要访问与给定 Block 关联的 Layout 对象，请使用该块的 Layout 特性。


打印配置

布局和块
布局
布局设置
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 布局 >
打印配置

PlotConfiguration 对象与 Layout 对象类似，两者都包含相同的打印信息。不同之处在于 Layout 对象与包含需要打印的几何图形的 Block 对象关联。而 PlotConfiguration 对象并不关联特定的 Block 对象，它只是一个可供任意几何图形使用的打印设置的命名集合。


布局设置

打印配置
布局
图纸尺寸与单位
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 布局 >
布局设置

布局设置控制最终的打印输出。这些设置会影响图纸尺寸、打印比例、打印区域、打印原点和打印设备名称。只有掌握如何使用布局设置，才能确保打印出理想的布局。布局的所有设置都可以通过 Layout 对象的特性和方法来修改。

本节内容

  • 图纸尺寸与单位
  • 调整打印原点
  • 设置打印区域
  • 设置打印比例
  • 设置线宽比例
  • 设置打印设备


图纸尺寸与单位

布局设置
布局设置
调整打印原点
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 布局 > 布局设置 >
图纸尺寸与单位

图纸尺寸的选择取决于系统配置的打印机。每种不同打印机具有一个可用图纸尺寸的标准列表。可以使用 CanonicalMediaName 特性来更改布局的图纸尺寸。

也可以使用 PaperUnits 特性来指定布局的单位。此特性可以采用以下三个值之一： acInches、acMillimeters 或 acPixels。如果配置绘图仪进行光栅输出，则必须按像素指定输出尺寸。


调整打印原点

图纸尺寸与单位
布局设置
设置打印区域
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 布局 > 布局设置 >
调整打印原点

打印原点是指定打印区域的左下角点，由 PlotOrigin 特性控制。打印原点通常设置为 (0, 0)，但可以通过将 CenterPlot 特性设置为 TRUE 在图纸上居中打印。居中打印改变了打印原点的位置。


设置打印区域

调整打印原点
布局设置
设置打印比例
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 布局 > 布局设置 >
设置打印区域

准备打印布局时，可以指定打印区域以确定要打印的内容。要指定打印区域，请使用 PlotType 特性。此特性需要输入以下值之一：

acDisplay

打印当前模型空间中显示的所有内容。从图纸空间布局打印时，此选项不可用。

acExtents

打印当前选定空间边界内的所有内容。

acLimits

打印当前空间限定范围内的所有内容。

acView

打印由 ViewToPlot 特性命名的视图。

acWindow

打印 SetWindowToPlot 方法指定的窗口中的所有内容。

acLayout

打印指定图纸尺寸边界内的所有内容。从模型空间打印时，此选项不可用。

当创建新的图纸空间布局时，默认选项是 acLayout。


设置打印比例

设置打印区域
布局设置
设置线宽比例
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 布局 > 布局设置 >
设置打印比例

通常情况下，用户是以实际尺寸来绘制对象。打印图形时，可以指定精确比例，也可以根据图纸调整图像尺寸。要指定比例，可以输入标准或自定义的打印比例。

要输入标准比例，首先将 UseStandardScale 特性设置为 TRUE。然后使用 StandardScale 特性输入所需的比例。

要输入自定义比例，首先将 UseStandardScale 特性设置为 FALSE，然后使用 SetCustomScale 方法输入自定义比例。

查看初期的草图视图时，通常并不需要精确的比例。可以使用 StandardScale 特性的 acScaleToFit 值，以适合图纸的最大可能尺寸来打印布局。


设置线宽比例

设置打印比例
布局设置
设置打印设备
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 布局 > 布局设置 >
设置线宽比例

可以根据打印比例按比例缩放布局中的线宽。通常情况下，线宽指定打印对象的线宽并以此线宽打印对象，在打印时不受打印比例的影响。打印布局时通常使用默认的打印比例 1:1。但是，例如，如果要打印按适合 A 号图纸缩放的 E 号布局，则可以指定缩放线宽，以适应新的打印比例。

要缩放线宽，请将 ScaleLineweights 特性设置为 TRUE。如果不希望缩放线宽，请将此特性设置为 FALSE。


设置打印设备

设置线宽比例
布局设置
视口
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 布局 > 布局设置 >
设置打印设备

打印设备名称在 ConfigName 特性中指定。可以将此名称设置为用户系统的任何有效设备名称。如果不设置此特性，打印作业会被发送到用户系统的默认打印设备。


视口

设置打印设备
定义布局并打印
浮动视口
ActiveX/VBA 开发人员手册 > 定义布局并打印 >
视口

在模型空间中操作时，是在平铺视口（在 ActiveX Automation 中称为 Viewport 对象）中绘制几何图形。用户一次可以显示一个或多个不同视口。当同时显示多个平铺视口时，一个视口中的编辑操作会影响所有其他视口。不过，用户可以为每个视口单独设置放大比例、视点、栅格和捕捉。

在图纸空间中，可以使用浮动图纸空间视口（在 ActiveX Automation 中称为 PViewport 对象）来包含模型的不同视图。可以将浮动视口视为对象进行移动、调整大小和改变形状，以创建合适的布局。也可以直接在图纸空间视图中绘制对象（例如标题栏或注释），这不会影响模型本身。

有关视口的详细信息，

请参见《用户手册》中的“设置模型空间视口”和“在模型空间中显示多个视图”。

本节内容

  • 浮动视口
  • 切换到图纸空间布局
  • 切换到模型空间布局
  • 创建图纸空间视口
  • 修改视口视图和内容
  • 相对于图纸空间缩放视图
  • 在图纸空间中缩放图案线型
  • 使用着色视口


浮动视口

视口
视口
切换到图纸空间布局
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 视口 >
浮动视口

用户不能在图纸空间中编辑模型。要访问 PViewport 对象中的模型，请使用 ActiveSpace 特性从图纸空间切换到模型空间。这样既可以操作模型又可以保持显示整个布局。PViewport 对象的编辑和视图更改功能与 Viewport 对象基本相同。只是可以更好地控制单个视图。例如，可以冻结或关闭某些视口中的图层，而不会影响其他视口；可以打开或关闭整个视口显示；还可以对齐视口之间的视图，以及相对于整个布局来缩放视图。

下图显示了模型的不同视图如何在图纸空间中显示。每个图纸空间图像代表一个不同视图的 PViewport 对象。在一个视图中，标注图层是冻结的。注意，在图纸空间中绘制的标题栏、边框和注释不会出现在“模型空间”视图中。此外，包含视口边框的图层已被关闭。

在 Viewport 对象中操作时，必须将 ActiveSpace 特性始终设置为 acModelSpace。在 PViewport 对象中操作时，可以将 ActiveSpace 特性设置为 acModelSpace 或 acPaperSpace，这样便可以根据需要在图纸空间和模型空间之间进行切换。

PViewport 对象、Viewport 对象和 ActiveSpace 特性设置
视口类型 | 状态 | 使用
PViewport | ActiveSpace = acPaperspace | 通过创建浮动视口并添加标题栏、边框和注释的方式来排列布局。编辑操作不会影响模型。
PViewport | ActiveSpace = acModelspace | 在浮动视口中操作以编辑模型或更改视图。可以关闭或冻结单个视口中的图层。
视口 | ActiveSpace = acModelspace | 将屏幕拆分为平铺视口以编辑模型的不同视图。

在 AutoCAD® ActiveX Automation 中，ActiveSpace 特性用于控制 TILEMODE 系统变量。设置 ThisDrawing.ActiveSpace = acModelSpace 等同于设置 TILEMODE = on，而设置 ThisDrawing.ActiveSpace = acPaperSpace 等同于设置 TILEMODE = off。

与此类似，MSpace 特性等同于 AutoCAD 中的 MSPACE 和 PSPACE 命令。设置 ThisDrawing.MSpace = TRUE 与使用 MSPACE 命令的作用相同：它将切换到模型空间。设置 ThisDrawing.MSpace = FALSE 与使用 PSPACE 命令的作用相同：它将切换到图纸空间。

此外，在将 MSpace 特性设置为 TRUE 之前，需要使用 Display 方法。对于某些需要在切换到模型空间之前设置的图形设置，可以使用 Display 方法对其进行初始化。在 AutoCAD 中，此任务是在“后台”完成的。但是，在 ActiveX Automation 接口中，程序员必须考虑此初始化过程。

注意请注意，在将 MSpace 特性设置为 TRUE 之前，必须至少先对一个 PViewport 对象使用 Display 方法来显示。如果打开显示失败，则在尝试设置 MSpace 特性时，会返回一个错误。


切换到图纸空间布局

浮动视口
视口
切换到模型空间布局
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 视口 >
切换到图纸空间布局

可以从模型空间切换到上一个活动的图纸空间布局。

切换到上一个活动的图纸空间布局的步骤

  1. 将 ActiveSpace 特性设置为 acPaperSpace：
    ThisDrawing.ActiveSpace = acPaperSpace
  2. 将 MSpace 特性切换为 FALSE：
ThisDrawing.MSpace = FALSE

当处于图纸空间中时，AutoCAD 会将图纸空间用户坐标系 (UCS) 图标显示在图形区的左下角。十字光标表示可以编辑图纸空间布局区域（不是视口中的视图）。


切换到模型空间布局

切换到图纸空间布局
视口
创建图纸空间视口
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 视口 >
切换到模型空间布局

可以从图纸空间切换到模型空间浮动视口或模型空间平铺视口。

切换到浮动视口的步骤：

  1. 使用 Display 方法初始化图形设置：
    ThisDrawing.ActivePViewport.Display TRUE
  2. 将 MSpace 特性切换到 TRUE：
ThisDrawing.MSpace = TRUE

这将切换到模型空间浮动视口。

注意在尝试切换到模型空间之前，必须先创建浮动视口。

切换到平铺视口的步骤：

要切换到平铺视口，还需要执行以下步骤：

  • 将 ActiveSpace 特性设置为 acModelSpace：
ThisDrawing.ActiveSpace = acModelSpace


创建图纸空间视口

切换到模型空间布局
视口
修改视口视图和内容
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 视口 >
创建图纸空间视口

可以使用 AddPViewport 方法创建图纸空间视口。此方法需要一个中心点以及新建视口的宽度和高度。在创建视口之前，请使用 ActiveSpace 特性将图纸空间设置为当前空间（一般通过将 TILEMODE 设置为 0 来完成）。

在创建 PViewport 对象后，可以设置视图本身的特性，例如观察方向（Direction 特性）、透视图的镜头长度（LensLength 特性）和栅格显示（GridOn 特性）。还可以控制视口本身的特性，例如图层（Layer 特性）、线型（Linetype 特性）和线型缩放（LinetypeScale 特性）。

创建并启用浮动视口

本样例说明如何将 AutoCAD 切换到图纸空间、创建浮动视口、设置视图以及启用视口。

Sub Ch9_SwitchToPaperSpace()
   ' 将活动空间设置为图纸空间
    ThisDrawing.ActiveSpace = acPaperSpace
   ' 创建图纸空间视口
    Dim newVport As AcadPViewport
    Dim center(0 To 2) As Double
    center(0) = 3.25
    center(1) = 3
    center(2) = 0
    Set newVport = ThisDrawing.PaperSpace. _
                              AddPViewport(center, 6, 5)
   ' 修改视口的观察方向
    Dim viewDir(0 To 2) As Double
    viewDir(0) = 1
    viewDir(1) = 1
    viewDir(2) = 1
    newVport.direction = viewDir
   ' 启用视口
    newVport.Display True
   ' 切换到模型空间
    ThisDrawing.MSpace = True
   ' 将 newVport 置为当前
   ' （并非始终需要，但建议如此）
    ThisDrawing.ActivePViewport = newVport
   ' 在模型空间中进行范围缩放
    ZoomExtents
   ' 关闭模型空间编辑
    ThisDrawing.MSpace = False
    ' 在图纸空间中进行范围缩放
    ZoomExtents
End Sub
上述代码中的步骤顺序非常重要。一般来讲，步骤的顺序必须与它们在 AutoCAD 命令行中的执行顺序相同。唯一不能预期的操作是定义视图和启用视口。
注意要设置或修改视图的特性（视图方向、焦距等），必须将 Viewport 对象的 Display 方法设置为关 (FALSE)；并且，必须将 Display 方法设置为开 (TRUE)，才能将视口置为当前。
创建四个浮动视口
本样例使用了“创建和启用浮动视口”中的例子，并以之为基础继续创建了四个浮动视口，同时分别将每个视口的视图设置为俯视图、主视图、右视图和等轴测视图。每个视图按图纸空间比例的一半进行缩放。为确保在这些视口中能够看到一些内容，可以在进行本样例之前创建一个三维实体球体。
Sub Ch9_FourPViewports()
    Dim topVport, frontVport As AcadPViewport
    Dim rightVport, isoVport As AcadPViewport
    Dim pt(0 To 2) As Double
    Dim viewDir(0 To 2) As Double
    ThisDrawing.ActiveSpace = acPaperSpace
    ThisDrawing.MSpace = True
' 获取现有的 PViewport 并使其成为 topVport
    pt(0) = 2.5: pt(1) = 5.5: pt(2) = 0
    Set topVport = ThisDrawing.ActivePViewport
    ' 对俯视图不需要设置 Direction
    topVport.center = pt
    topVport.width = 2.5
    topVport.height = 2.5
    topVport.Display True
    ThisDrawing.MSpace = True
    ThisDrawing.ActivePViewport = topVport
    ZoomExtents
    ZoomScaled 0.5, acZoomScaledRelativePSpace
' 创建并设置 frontVport
    pt(0) = 2.5: pt(1) = 2.5: pt(2) = 0
    Set frontVport = ThisDrawing.PaperSpace. _
            AddPViewport(pt, 2.5, 2.5)
    viewDir(0) = 0: viewDir(1) = 1: viewDir(2) = 0
    frontVport.direction = viewDir
    frontVport.Display acOn
    ThisDrawing.MSpace = True
    ThisDrawing.ActivePViewport = frontVport
    ZoomExtents
    ZoomScaled 0.5, acZoomScaledRelativePSpace
' 创建并设置 rightVport
    pt(0) = 5.5: pt(1) = 5.5: pt(2) = 0
    Set rightVport = ThisDrawing.PaperSpace. _
            AddPViewport(pt, 2.5, 2.5)
    viewDir(0) = 1: viewDir(1) = 0: viewDir(2) = 0
    rightVport.direction = viewDir
    rightVport.Display acOn
    ThisDrawing.MSpace = True
    ThisDrawing.ActivePViewport = rightVport
    ZoomExtents
    ZoomScaled 0.5, acZoomScaledRelativePSpace
' 创建并设置 isoVport
    pt(0) = 5.5: pt(1) = 2.5: pt(2) = 0
    Set isoVport = ThisDrawing.PaperSpace. _
                             AddPViewport(pt, 2.5, 2.5)
    viewDir(0) = 1: viewDir(1) = 1: viewDir(2) = 1
    isoVport.direction = viewDir
    isoVport.Display acOn
    ThisDrawing.MSpace = True
    ThisDrawing.ActivePViewport = isoVport
    ZoomExtents
    ZoomScaled 0.5, acZoomScaledRelativePSpace
'完成：在所有视口中执行重生成
    ThisDrawing.Regen True
End Sub


修改视口视图和内容

创建图纸空间视口
视口
相对于图纸空间缩放视图
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 视口 >
修改视口视图和内容

要在 Viewport 对象中修改视图，必须处于模型空间并且视口必须处于活动状态。

在浮动视口中编辑图形的步骤

  1. 在模型空间中，通过设置 ActiveViewport 特性使视口处于活动状态：
    Thisdrawing.ActiveViewport = MyViewportObject
  2. 编辑图形。

也可以在图纸空间中创建对象，例如注释、标注和标题栏。但是，必须将 ActiveSpace 特性设置为 FALSE，并使用 MSpace 特性打开图纸空间。在图纸空间中创建的对象只在图纸空间中可见。


相对于图纸空间缩放视图

修改视口视图和内容
视口
在图纸空间中缩放图案线型
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 视口 >
相对于图纸空间缩放视图

在打印之前，可以为图形的每个部分创建精确的缩放比例因子。相对于图纸空间来缩放视图将为每个显示的视图建立一致的缩放比例。例如，以下图解显示了具有多个视口的图纸空间—每个视口均被设置为不同的比例和视图。要精确缩放打印的图形，必须相对于图纸空间缩放每个视图，而不是相对于前一个视图或者全比例模型。

如果使用图纸空间，比例因子代表打印图形的大小与视口中显示模型的实际尺寸之间的比例。要获得此比例，请将图纸空间单位除以模型空间单位。例如，对于四分之一比例图形，可以将比例因子指定为一个图纸空间单位对应四个模型空间单位 (1:4)。

可以使用 ZoomScaled 方法相对于图纸空间单位来缩放视口。此方法将输入三个值：要缩放的视口、比例因子和应用比例因子的方法。第三个值是可选的，它确定如何应用缩放比例：

  • 相对于图形界限
  • 相对于当前视图
  • 相对于图纸空间单位

要指定相对于图纸空间单位的缩放比例，请输入此值的 acZoomScaledRelativePSpace 常量。

如下图所示，如果输入相对于图纸空间单位 2 倍的缩放比例，视口中的缩放将增加为图纸空间单位尺寸的两倍；如果输入相对于图纸空间单位 0.5 倍的缩放比例，缩放将设置为图纸空间单位尺寸的一半，模型将以其实际尺寸的一半比例进行打印。


在图纸空间中缩放图案线型

相对于图纸空间缩放视图
视口
使用着色视口
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 视口 >
在图纸空间中缩放图案线型

在图纸空间中，可以用两种方法来缩放任何类型的线型。可以基于创建对象时所在空间（模型空间或图纸空间）的图形单位进行缩放，也可以使用基于图纸空间单位的统一比例进行缩放。使用 PSLTSCALE 系统变量，可以使不同视口中以不同缩放比例显示的对象保持相同的线型比例。此变量也会影响三维视图中的线条显示。

在下面的图解中，通过 PSLTSCALE 系统变量，模型空间中线条的图案线型在图纸空间中按统一比例进行缩放。注意，两个视口中线型的缩放比例是相同的，即使对象各自按不同的比例缩放。

可以使用 SetVariable 方法设置 PSLTSCALE 系统变量的值。


使用着色视口

在图纸空间中缩放图案线型
视口
打印图形
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 视口 >
使用着色视口

如果图形包含三维面、网格、拉伸对象、曲面或实体，则可以使用“按显示”、“线框”、“消隐”和“渲染”选项从图纸空间打印。着色和渲染视口包括打印预览、打印和打印到文件（完全着色和渲染）。

要为在图纸空间中打印的着色视口设置选项，请使用 PViewport 对象的 ShadePlot 特性。

注意要在模型空间视口（Viewport 对象）的打印中隐藏线条，请使用 Layout 对象的 PlotHidden 特性。此特性将采用布尔值：TRUE 用于删除隐藏线，FALSE 用于绘制隐藏线。


打印图形

使用着色视口
定义布局并打印
执行基本打印
ActiveX/VBA 开发人员手册 > 定义布局并打印 >
打印图形

可以按照模型空间中的显示打印图形，也可以打印其中一个已准备好的图纸空间布局。如果在创建图纸空间布局之前需要先查看或验证图形，则通常选择从模型空间打印。当模型准备就绪后，可以准备并打印图纸空间布局。

注意在脚本打印多个作业前，必须将 BACKGROUNDPLOT 系统变量设置为 0。

打印涉及到两个 ActiveX Automation 对象：Layout 对象和 Plot 对象。Layout 对象包含给定布局的打印设置，Plot 对象包含初始化和监视打印序列的方法和特性。

本节内容

  • 执行基本打印
  • 从模型空间打印
  • 从图纸空间打印


执行基本打印

打印图形
打印图形
从模型空间打印
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 打印图形 >
执行基本打印

从 Plot 对象可以使用以下方法和特性：

PlotToFile

将打印输出到文件中。

PlotToDevice

打印到绘图仪或打印机。

DisplayPlotPreview

显示指定打印的预览。

QuietErrorMode

将打印错误报告切换为静默错误模式。


从模型空间打印

执行基本打印
打印图形
从图纸空间打印
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 打印图形 >
从模型空间打印

通常情况下，当打印较大的图形（例如平面布置图）时，可以指定一个比例将实际图形单位转换为打印英寸或毫米。如果从模型空间打印时未指定设置，则使用默认设置。默认设置包括打印到系统打印机、打印当前显示、缩放到充满、0 旋转和 0,0 偏移。要修改打印设置，请修改与模型空间关联的 Layout 对象的特性。

打印活动模型空间布局的范围

本样例首先检查以确保活动空间是模型空间，然后创建若干打印设置，最后使用 PlotToDevice 方法发送打印。

Sub Ch9_PrintModelSpace()
    ' 验证活动空间是模型空间
    If ThisDrawing.ActiveSpace = acPaperSpace Then
        ThisDrawing.MSpace = True
        ThisDrawing.ActiveSpace = acModelSpace
    End If
    ' 设置打印区域的范围和比例
    ThisDrawing.ModelSpace.Layout.PlotType = acExtents
    ThisDrawing.ModelSpace.Layout. _
                          StandardScale = acScaleToFit
    ' 将打印份数设置为 1
    ThisDrawing.Plot.NumberOfCopies = 1
    ' 初始化打印
    ThisDrawing.Plot.PlotToDevice
End Sub
设备名称可以使用 ConfigName 特性指定。此设备可以在 PlotToDevice 方法中通过指定 PC3 文件来替代。


从图纸空间打印

从模型空间打印
打印图形
高级绘图与组织技术
ActiveX/VBA 开发人员手册 > 定义布局并打印 > 打印图形 >
从图纸空间打印

可以打印图纸空间布局。可以打印活动布局（如“从模型空间打印”中所示），也可以通过名称指定要打印的布局。


高级绘图与组织技术

从图纸空间打印
使用光栅图像
ActiveX/VBA 开发人员手册 >
高级绘图与组织技术

获得一些经验后，可以利用 AutoCAD 的许多高级功能进一步加强应用程序。

可以在图形中包含光栅图像，例如航空拍摄图像、卫星拍摄图像、数字照片以及计算机渲染图像。关于本节以外的光栅图像信息，请参见《用户手册》。

除了加强用户图形的视觉图像以外，AutoCAD 还提供了若干功能以协助用户组织数据，允许用户进一步扩充图形中对象的智能。

本节内容

  • 使用光栅图像
  • 使用块和属性
  • 使用外部参照
  • 指定和检索扩展数据


使用光栅图像

高级绘图与组织技术
高级绘图与组织技术
附着和缩放光栅图像
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 >
使用光栅图像

使用 AutoCAD®，可以将光栅图像添加到基于矢量的 AutoCAD 图形中，然后查看和打印生成的文件。

本节内容

  • 附着和缩放光栅图像
  • 管理光栅图像
  • 修改图像和图像边界
  • 剪裁图像


附着和缩放光栅图像

使用光栅图像
使用光栅图像
管理光栅图像
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 >
附着和缩放光栅图像

可以将图像放到图形文件中，但它们实际上并不属于图形文件。图像通过路径名称或数据管理文档 ID 链接到图形文件。链接图像的路径可以随时进行更改或删除。要附着图像，请使用 AddRaster 方法在图形中创建 Raster 对象。此方法的输入值有四个：要附着的图像文件的名称、在图形中放置图像的插入点、图像的比例因子以及图像的旋转角度。请记住，Raster 对象代表独立的图像链接，而不是图像本身。

在用户附着图像之后，可以多次重新附着，为每个附件创建新的 Raster 对象。每个附件都有自己的剪裁边界以及亮度、对比度、褪色度和透明度设置。一个图像可以裁剪成许多块，并且在图形中分别排放。

在创建 Raster 对象时可以设置光栅图像比例因子，使图像的几何图形比例与在 AutoCAD 图形中创建的几何图形的比例相匹配。选择要附着的图像时，图像将以 1 个图像测量单位对 1 个 AutoCAD 测量单位的比例因子插入。要设置图像的比例因子，用户需要了解图像上几何图形的比例以及用来定义 1 个 AutoCAD 单位的测量单位（英寸、英尺等等）。图像文件必须包含定义 DPI（即，每英寸点数）以及图像中像素数目的分辨率信息。

如果图像包含分辨率信息，AutoCAD 会将其与用户在图形中提供用来缩放图像的比例因子和 AutoCAD 测量单位结合起来。例如，如果光栅图像是扫描的设计图，比例为 1 英寸等于 50 英尺（即，1:600），而用户的 AutoCAD 图形被设置为 1 个单位代表 1 英寸，那么要设置该图像的比例因子，应将 AddRaster 方法的 ScaleFactor 参数设置为 600。这样，AutoCAD 中插入图像的比例即可使图像中的几何图形与图形中的矢量几何图形保持一致。

注意如果没有在附着的图像文件中定义分辨率信息，AutoCAD 将以图像的初始宽度作为一个单位进行计算。插入图像之后，以 AutoCAD 单位表示的图像宽度即等于比例因子。

附着光栅图像

本例在模型空间中添加光栅图像，本例使用 watch.jpg 文件（可在 sample 目录中找到此文件）。如果没有此图像，或者此图像位于其他目录中，请为 imageName 变量插入有效的路径和文件名。

Sub Ch10_AttachingARaster()
    Dim insertionPoint(0 To 2) As Double
    Dim scalefactor As Double
    Dim rotationAngle As Double
    Dim imageName As String
    Dim rasterObj As AcadRasterImage
    imageName = "C:/Program Files/AutoCAD Directory/sample/watch.jpg '
insertionPoint(0) = 5
insertionPoint(1) = 5
insertionPoint(2) = 0
scalefactor = 2
rotationAngle = 0
  On Error GoTo ERRORHANDLER
   ' 在模型空间中附着光栅图像
  Set rasterObj = ThisDrawing.ModelSpace.AddRaster _
        (imageName, insertionPoint, _
               scalefactor, rotationAngle)
   ZoomAll
   Exit Sub
ERRORHANDLER:
    MsgBox Err.Description
End Sub


管理光栅图像

附着和缩放光栅图像
使用光栅图像
更改图像文件路径
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 >
管理光栅图像

用户可以使用 Raster 对象的特性管理光栅图像名、文件名和文件路径。

本节内容

  • 更改图像文件路径
  • 命名图像


更改图像文件路径

管理光栅图像
管理光栅图像
命名图像
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 管理光栅图像 >
更改图像文件路径

可以使用 ImageFile 特性来查询或更改图像的路径和文件名。由此特性设置的路径是 AutoCAD 查找此图像的实际路径。

如果 AutoCAD 无法定位图形（例如，如果用户将文件移到其他目录中，与 ImageFile 特性中保存的目录不同），那么 AutoCAD 将删除名称中的相对或绝对路径信息（例如，使 \images\tree.tga 或 c:\my project\images\tree.tga 变为 tree.tga），并搜索用 Preferences 对象的 SetProjectFilePath 方法定义的路径。如果图形不在此路径中，AutoCAD 会尝试再次在第一个搜索路径中搜索。

可以删除文件名中的路径或通过重置 ImageFile 特性来指定相对路径。

更改 ImageFile 特性中的路径不会影响工程文件的搜索路径设置。


命名图像

更改图像文件路径
管理光栅图像
修改图像和图像边界
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 管理光栅图像 >
命名图像

图像名不一定要与图像文件名相同。在将图像附着到图形时，AutoCAD 将使用文件名（不带文件扩展名）作为图像名。可以更改图像名，这样做不会影响文件名。

图像文件由 Raster 对象的 ImageFile 特性表示。更改 ImageFile 特性将更改图形中的图像。图像名由 Name 特性表示，更改 Name 特性只会更改图像的名称，而不会更改与其关联的文件。


修改图像和图像边界

命名图像
使用光栅图像
显示和隐藏图像边界
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 >
修改图像和图像边界

所有图像都具有图像边界。将图像附着到图形时，图像边界将继承当前的特性设置，包括颜色、图层、线型和线型比例。如果图像是两色图像，则图像颜色和边界颜色相同。

与对待其他 AutoCAD 对象相同，用户可以修改图像及其边界特性。例如，用户可以：

  • 显示或隐藏图像边界
  • 修改图像的图层、边界颜色和线型
  • 更改图像位置
  • 缩放、旋转和更改图像的宽度和高度
  • 切换图像的可见性
  • 更改图像的透明度
  • 更改图像的亮度、对比度和褪色度
  • 更改图像显示的质量和速度

本节内容

  • 显示和隐藏图像边界
  • 更改图像的图层、边界颜色和边界线型
  • 更改图像的比例、旋转、位置、宽度和高度
  • 更改图像的可见性
  • 修改两色图像的颜色和透明度
  • 调整图像的亮度、对比度和褪色度


显示和隐藏图像边界

修改图像和图像边界
修改图像和图像边界
更改图像的图层、边界颜色和边界线型
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 修改图像和图像边界 >
显示和隐藏图像边界

隐藏图像边界可以确保图像不会被意外地移动或修改，并且可以防止打印或显示边界。隐藏图像边界时，被剪裁的图像仍显示在指定的边界界限内，只有边界会受到影响。显示和隐藏图像边界将影响所有附着到图形的图像。

要显示或隐藏图像边界，请使用 ClippingEnabled 特性。

注意此特性只影响图像边界。要在切换此特性时查看图像的变化，请仔细查看图像周围的小边界。


更改图像的图层、边界颜色和边界线型

显示和隐藏图像边界
修改图像和图像边界
更改图像的比例、旋转、位置、宽度和高度
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 修改图像和图像边界 >
更改图像的图层、边界颜色和边界线型

可以使用以下特性更改图像边界的颜色和线型以及图像的图层

Layer

指定图像的图层

Color

指定图像边界的颜色

Linetype

指定图像的线型


更改图像的比例、旋转、位置、宽度和高度

更改图像的图层、边界颜色和边界线型
修改图像和图像边界
更改图像的可见性
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 修改图像和图像边界 >
更改图像的比例、旋转、位置、宽度和高度

可以使用以下方法和特性更改图像的比例、旋转、位置、宽度和高度：

ScaleEntity

缩放图像

Rotate

旋转图像

Origin

指定图像位置

Width

以像素为单位指定图像的宽度

Height

以像素为单位指定图像的高度

ImageWidth

使用数据库单位指定图像的宽度

ImageHeight

使用数据库单位指定图像的高度

ShowRotation

确定是否旋转显示光栅


更改图像的可见性

更改图像的比例、旋转、位置、宽度和高度
修改图像和图像边界
修改两色图像的颜色和透明度
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 修改图像和图像边界 >
更改图像的可见性

通过在当前绘图任务中隐藏图像，图像可见性可以影响重画的速度。隐藏的图像既不会显示也不会打印，而只是显示图形边界。要隐藏图像，请将 ImageVisibility 特性设置为 FALSE。要重显示图像，请将 ImageVisibility 特性设置为 TRUE。


修改两色图像的颜色和透明度

更改图像的可见性
修改图像和图像边界
调整图像的亮度、对比度和褪色度
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 修改图像和图像边界 >
修改两色图像的颜色和透明度

两色光栅图像是仅由前景色和背景色组成的图像。附着两色图像时，图像中的前景像素会继承当前图层的颜色设置。除了可以修改任何附着的图像以外，用户还可以通过更改前景色以及打开或关闭背景透明度来修改两色图像。

注意两色图像和两色图像边界颜色通常相同。

要更改两色图像的前景色，请使用 Color 特性。要打开和关闭透明度，请使用 Transparency 特性。


调整图像的亮度、对比度和褪色度

修改两色图像的颜色和透明度
修改图像和图像边界
剪裁图像
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 修改图像和图像边界 >
调整图像的亮度、对比度和褪色度

可以在 AutoCAD 中将图像的亮度、对比度和褪色度调整为要显示的图像和打印输出，而不影响原始光栅图像文件。

使用以下特性可以调整亮度、对比度和褪色度：

Brightness

指定图像的亮度级别

Contrast

指定图像的对比度级别

Fade

指定图像的褪色度级别


剪裁图像

调整图像的亮度、对比度和褪色度
使用光栅图像
更改剪裁边界
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 >
剪裁图像

用户可以通过剪裁图像来定义用于显示和打印的图像的范围。剪裁边界必须是二维多边形或矩形，其顶点限制在图像边界之内。同一图像的多个实例可以具有不同的边界

剪裁图像的步骤

  1. 使用 ClippingEnabled 特性打开图像边界
  2. 使用 ClipBoundary 方法指定剪裁边界，进行剪裁。此方法的输入值有一个：用于指定光栅图像剪裁边界的二维世界坐标系坐标的变量数组。

本节内容

  • 更改剪裁边界
  • 显示和隐藏剪裁边界


更改剪裁边界

剪裁图像
剪裁图像
显示和隐藏剪裁边界
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 剪裁图像 >
更改剪裁边界

要更改现有的剪裁边界，只需重复前述步骤即可。旧边界将被删除，新边界将取代旧边界。


显示和隐藏剪裁边界

更改剪裁边界
剪裁图像
剪裁光栅图像边界
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 剪裁图像 >
显示和隐藏剪裁边界

可以使用剪裁边界来显示剪裁的图像，也可以隐藏剪裁边界并显示原始图像边界。要隐藏剪裁边界并显示原始图像，请将 ClippingEnabled 特性设置为 FALSE。要显示剪裁的图像，请将 ClippingEnabled 特性设置为 TRUE。

本节内容

  • 剪裁光栅图像边界


剪裁光栅图像边界

显示和隐藏剪裁边界
显示和隐藏剪裁边界
使用块和属性
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用光栅图像 > 剪裁图像 > 显示和隐藏剪裁边界 >
剪裁光栅图像边界

本例在模型空间中添加光栅图像，然后根据剪裁边界来剪裁图像。本例使用 sample 目录中的 downtown.jpg 文件。如果没有此图像，或者此图像位于其他目录中，请为 imageName 变量插入有效的路径和文件名。

Sub Ch10_ClippingRasterBoundary()
    Dim insertionPoint(0 To 2) As Double
    Dim scalefactor As Double
    Dim rotationAngle As Double
    Dim imageName As String
    Dim rasterObj As AcadRasterImage
    imageName = "C:\AutoCAD\sample\downtown.jpg"
    insertionPoint(0) = 5
    insertionPoint(1) = 5
    insertionPoint(2) = 0
    scalefactor = 2
    rotationAngle = 0
    On Error GoTo ERRORHANDLER
    ' 在模型空间中创建光栅图像
    Set rasterObj = ThisDrawing.ModelSpace.AddRaster _
                    (imageName, insertionPoint, _
                     scalefactor, rotationAngle)
   ZoomAll
    ' 使用点数组建立剪裁边界
    Dim clipPoints(0 To 9) As Double
    clipPoints(0) = 6: clipPoints(1) = 6.75
    clipPoints(2) = 7: clipPoints(3) = 6
    clipPoints(4) = 6: clipPoints(5) = 5
    clipPoints(6) = 5: clipPoints(7) = 6
    clipPoints(8) = 6: clipPoints(9) = 6.75
    ' 剪裁图像
    rasterObj.ClipBoundary clipPoints
    ' 启用剪裁显示
    rasterObj.ClippingEnabled = True
    ThisDrawing.Regen acActiveViewport
    Exit Sub
ERRORHANDLER:
    MsgBox Err.Description
End Sub


使用块和属性

剪裁光栅图像边界
高级绘图与组织技术
使用块
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 >
使用块和属性

AutoCAD 提供了若干功能，用来帮助用户管理图形中的对象。使用块可以将多个对象作为一个部件进行组织和操作。属性可以将信息项与图形中的块相关联，例如，部件号和价格。

使用 AutoCAD 外部参照，可以将整个图形附着或覆盖到当前的图形。打开当前图形时，参照图形中所做的任何更改都会出现在当前图形中。

本节内容

  • 使用块
  • 使用属性


使用块

使用块和属性
使用块和属性
定义块
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用块和属性 >
使用块

块是对象的集合，用户可以将它们关联起来，形成单一的对象或块参照。可以插入、缩放和旋转图形中的块参照。可以将块参照分解为其组成对象、修改块参照以及重定义块。AutoCAD 会根据块定义更新该块参照的所有未来实例。

对于使用不同的颜色和线型在不同的图层中绘制的对象，也可以从这些对象定义块。可以保留块中对象的图层、颜色和线型信息。这样，每次插入块时，就可以将块中的每个对象绘制在其原始图层上，并具有原来的颜色和线型。

有关操作块的详细信息，请参见《用户手册》中的“创建和插入符号（块）”。

本节内容

  • 定义块
  • 插入块
  • 分解块参照
  • 重定义块


定义块

使用块
使用块
插入块
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用块和属性 > 使用块 >
定义块

要创建新块，请使用 Add 方法。此方法的输入值有两个：图形中要添加块的位置和要创建的块的名称。

创建新块后，可以向其中添加任何几何对象或其他块。然后可以将块的实例插入到图形中。插入的块是对象，称为块参照。

也可以使用 WBlock 方法创建块，将对象编组到单独的图形文件中。这样，该图形文件就可以用作其他图形的块定义。AutoCAD 将插入到其他图形中的任何图形都看作块。

有关定义块的详细信息，请参见《用户手册》中的“创建块”。


插入块

定义块
使用块
分解块参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用块和属性 > 使用块 >
插入块

可以使用 InsertBlock 方法将块或整个图形插入到当前图形中。InsertBlock 方法的输入值有六个：插入点、要插入的块或图形的名称、X 比例因子、Y 比例因子、Z 比例因子以及旋转角度。

将整个图形插入到另一个图形中时，AutoCAD 会将插入图形当作块参照处理。后续的插入操作会以不同的位置、不同的比例和不同的旋转设置来参照块定义（该块定义包含块的几何说明）。如果在插入后更改原始图形，这些更改将不影响插入的块。如果希望插入的块反映对原始图形所做的更改，则可以通过重新插入原始图形重定义块。此操作可以通过 InsertBlock 方法完成。

如果将图形作为块插入，将自动使用文件名作为块的名称。在创建块之后，可以使用 Name 特性更改块的名称。

默认情况下，AutoCAD 使用坐标 (0,0,0) 作为插入图形的基点。可以打开原始图形并使用 SetVariable 方法为 INSBASE 系统变量指定其他插入基点，从而更改图形的基点。下次插入图形时，AutoCAD 将使用新的基点。

如果插入的图形包含 PaperSpace 对象，当前图形的块定义中将不包含这些对象。要使用其他图形中的 PaperSpace 对象，可以打开原始图形，并使用 Add 方法将 PaperSpace 对象定义为块。可以将图形插入到其他图形的图纸空间或模型空间中。

不能通过遍历块参照的方式来查找组成它的原始对象。但是，可以遍历原始块定义，或者将块参照分解为其原始部件。

也可以使用 AddMInsertBlock 方法插入块阵列。此方法不会在图形中插入单一块（与 InsertBlock 一样），而是插入指定块的数组。此方法将返回 MInsertBlock 对象。

有关插入块的详细信息，请参见《用户手册》中的“插入块”。

定义块并将块插入到图形中

本例定义一个块并将一个圆添加到块定义中。然后，将块作为块参照插入图形。

Sub Ch10_InsertingABlock()
    ' 定义块
    Dim blockObj As AcadBlock
    Dim insertionPnt(0 To 2) As Double
    insertionPnt(0) = 0
    insertionPnt(1) = 0
    insertionPnt(2) = 0
    Set blockObj = ThisDrawing.Blocks.Add _
                     (insertionPnt, "CircleBlock")
    ' 向块中添加圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 0
    center(1) = 0
    center(2) = 0
    radius = 1
    Set circleObj = blockObj.AddCircle(center, radius)
    ' 插入块
    Dim blockRefObj As AcadBlockReference
    insertionPnt(0) = 2
    insertionPnt(1) = 2
    insertionPnt(2) = 0
    Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _
               (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)
    ZoomAll
    MsgBox "The circle belongs to " & blockRefObj.ObjectName
End Sub
注意插入后，当前图形中外部文件的 WCS 会平行对齐当前用户坐标系 (UCS) 的 XY 平面。因此，在插入块之前设置 UCS，可以按任何方向插入外部文件中的块。


分解块参照

插入块
使用块
重定义块
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用块和属性 > 使用块 >
分解块参照

使用 Explode 方法可以打断块参照。通过分解块参照，可以修改块，或者添加或删除定义块参照的对象。

显示分解的块参照的结果

本例创建一个块并向块定义中添加一个圆，然后将块作为块参照插入到图形中。接着块参照被分解，最后显示分解过程中生成的对象及其对象类型。

Sub Ch10_ExplodingABlock()
    ' 定义块
    Dim blockObj As AcadBlock
    Dim insertionPnt(0 To 2) As Double
    insertionPnt(0) = 0
    insertionPnt(1) = 0
    insertionPnt(2) = 0
    Set blockObj = ThisDrawing.Blocks.Add _
                     (insertionPnt, "CircleBlock")
    ' 向块中添加圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 0
    center(1) = 0
    center(2) = 0
    radius = 1
    Set circleObj = blockObj.AddCircle(center, radius)
    ' 插入块
    Dim blockRefObj As AcadBlockReference
    insertionPnt(0) = 2
    insertionPnt(1) = 2
    insertionPnt(2) = 0
    Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _
               (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)
    ZoomAll
    MsgBox "The circle belongs to " & blockRefObj.ObjectName
    ' 分解块参照
    Dim explodedObjects As Variant
    explodedObjects = blockRefObj.Explode
    ' 遍历分解的对象
    Dim I As Integer
    For I = 0 To UBound(explodedObjects)
        explodedObjects(I).Color = acRed
        explodedObjects(I).Update
        MsgBox "Exploded Object " & I & ": " _
                            & explodedObjects(I).ObjectName
        explodedObjects(I).Color = acByLayer
        explodedObjects(I).Update
    Next
End Sub


重定义块

分解块参照
使用块
使用属性
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用块和属性 > 使用块 >
重定义块

要重定义块，请使用 Block 对象的任何方法和特性。重定义块时，图形中对该块的所有参照也随即更新，以便反映新的定义。

重定义会影响以前和以后的块插入。固定属性会丢失，并且被新的固定属性所替换。即使新块不包含属性，可变属性也保持不变。

在块定义中重定义对象

本例创建一个块并向块定义中添加一个圆，然后将块作为块参照插入到图形中。块定义中的圆将被更新，块参照也会自动更新。

Sub Ch10_RedefiningABlock()
    ' 定义块
    Dim blockObj As AcadBlock
    Dim insertionPnt(0 To 2) As Double
    insertionPnt(0) = 0
    insertionPnt(1) = 0
    insertionPnt(2) = 0
    Set blockObj = ThisDrawing.Blocks.Add _
                     (insertionPnt, "CircleBlock")
    ' 向块中添加圆
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    center(0) = 0
    center(1) = 0
    center(2) = 0
    radius = 1
    Set circleObj = blockObj.AddCircle(center, radius)
    ' 插入块
    Dim blockRefObj As AcadBlockReference
    insertionPnt(0) = 2
    insertionPnt(1) = 2
    insertionPnt(2) = 0
    Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _
               (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)
    ZoomAll
    ' 重定义块中的圆，
    ' 并更新块参照
    circleObj.radius = 3
    blockRefObj.Update
End Sub


使用属性

重定义块
使用块和属性
创建属性定义和属性参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用块和属性 >
使用属性

属性参照为用户提供交互式标记或标签，以便将文字附着到块中。数据的样例包括部件号、价格、注释和所有者姓名等。

用户可以从图形中提取属性参照信息，并在电子表格或数据库中使用该信息以生成各种项（例如，部件列表或明细表）。如果每个属性参照都包含不同的标记，则可以将多个属性参照与块关联。也可以定义固定属性。由于对每个块引用，这些固定属性都具有相同的值，因此在插入块时，AutoCAD 不提示用户输入值。

属性可以不可见，这意味着将不显示或打印属性参照。但是，关于属性参照的信息可以存储在图形文件中。

有关操作属性的详细信息，请参见《用户手册》中的“块属性概述”。

本节内容

  • 创建属性定义和属性参照
  • 编辑属性定义
  • 提取属性信息


创建属性定义和属性参照

使用属性
使用属性
编辑属性定义
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用块和属性 > 使用属性 >
创建属性定义和属性参照

要创建属性参照，首先必须使用 AddAttribute 方法在块上创建属性定义。此方法的输入值有六个：属性文字的高度、属性模式、提示字符串、插入点、标记字符串和默认属性值。

模式值是可选的。可以输入五个常量来指定属性模式：

acAttributeModeNormal

指定保留每个属性的当前模式。

acAttributeModeInvisible

指定在用户插入块时不显示属性值。ATTDISP 命令将替代“不可见”模式。

acAttributeModeConstant

在插入块时赋予属性固定值。

acAttributeModeVerify

在插入块时，提示验证属性值是否正确。

acAttributeModePreset

当用户插入包含当前属性的块时，将属性设置为其默认值。在此模式下不能编辑该值。

可以输入无、任意组合或全部选项。要指定选项组合，请将各个常量相加。例如，用户可以输入 acAttributeModeInvisible + acAttributeModeConstant。

插入包含属性的块时，将显示提示字符串。此字符串的默认值是 Tag 字符串。在模式中输入 acAttributeModeConstant 可以禁用提示。

标记字符串可以标识每个属性引用。用户可以使用任何字符，但空格与叹号除外。AutoCAD 会将小写字符转换为大写。

在块中定义属性定义之后，每当用户使用 InsertBlock 方法插入块时，都可以为属性参照指定不同的值。

属性定义将与创建此属性定义的块关联。在模型空间或图纸空间中创建的属性定义不会附着到任何给定的块。

定义属性定义

本例创建一个块，然后向块中添加属性。接着将块插入到图形中。

Sub Ch10_CreatingAnAttribute()
    ' 定义块
    Dim blockObj As AcadBlock
    Dim insertionPnt(0 To 2) As Double
    insertionPnt(0) = 0
    insertionPnt(1) = 0
    insertionPnt(2) = 0
    Set blockObj = ThisDrawing.Blocks.Add _
                     (insertionPnt, "BlockWithAttribute")
    ' 向块添加属性
    Dim attributeObj As AcadAttribute
    Dim height As Double
    Dim mode As Long
    Dim prompt As String
    Dim insertionPoint(0 To 2) As Double
    Dim tag As String
    Dim value As String
    height = 1
    mode = acAttributeModeVerify
    prompt = "New Prompt"
    insertionPoint(0) = 5
    insertionPoint(1) = 5
    insertionPoint(2) = 0
    tag = "New Tag"
    value = "New Value"
    Set attributeObj = blockObj.AddAttribute(height, mode, _
                          prompt, insertionPoint, tag, value)
    ' 插入块，创建块参照
    ' 和属性参照
    Dim blockRefObj As AcadBlockReference
    insertionPnt(0) = 2
    insertionPnt(1) = 2
    insertionPnt(2) = 0
    Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _
               (insertionPnt, "BlockWithAttribute", 1#, 1#, 1#, 0)
End Sub


编辑属性定义

创建属性定义和属性参照
使用属性
提取属性信息
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用块和属性 > 使用属性 >
编辑属性定义

可以使用 Attribute 对象特性和方法来编辑属性。属性上的部分特性如下：

Alignment

指定属性的水平对齐和垂直对齐方式

Backward

指定属性文字的方向

FieldLength

指定属性的字段长度

Height

指定属性的高度

InsertionPoint

指定属性的插入点

Mode

指定属性的模式

PromptString

指定属性的提示字符串

Rotation

指定属性的旋转角度

ScaleFactor

指定属性的缩放比例

TagString

指定属性的标记字符串

以下方法可用来编辑属性：

ArrayPolar

创建环形阵列

ArrayRectangular

创建矩形阵列

Copy

复制属性

Erase

删除属性

Mirror

镜像属性

Move

移动属性

Rotate

旋转属性

ScaleEntity

缩放属性

重定义属性定义

本例创建一个块，然后向块中添加属性。接着将块插入到图形中。然后更新属性文字，使其反向显示。

Sub Ch10_RedefiningAnAttribute()
    ' 定义块
    Dim blockObj As AcadBlock
    Dim insertionPnt(0 To 2) As Double
    insertionPnt(0) = 0
    insertionPnt(1) = 0
    insertionPnt(2) = 0
    Set blockObj = ThisDrawing.Blocks.Add _
                     (insertionPnt, "BlockWithAttribute")
    ' 向块添加属性
    Dim attributeObj As AcadAttribute
    Dim height As Double
    Dim mode As Long
    Dim prompt As String
    Dim insertionPoint(0 To 2) As Double
    Dim tag As String
    Dim value As String
    height = 1
    mode = acAttributeModeVerify
    prompt = "New Prompt"
    insertionPoint(0) = 5
    insertionPoint(1) = 5
    insertionPoint(2) = 0
    tag = "New Tag"
    value = "New Value"
    Set attributeObj = blockObj.AddAttribute(height, mode, _
                          prompt, insertionPoint, tag, value)
    ' 插入块，创建块参照
    ' 和属性参照
    Dim blockRefObj As AcadBlockReference
    insertionPnt(0) = 2
    insertionPnt(1) = 2
    insertionPnt(2) = 0
    Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _
               (insertionPnt, "BlockWithAttribute", 1#, 1#, 1#, 0)
    ' 重定义属性文字，使其反向显示。
    attributeObj.Backward = True
    attributeObj.Update
End Sub


提取属性信息

编辑属性定义
使用属性
使用外部参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用块和属性 > 使用属性 >
提取属性信息

可以使用 GetAttributes 和 GetConstantAttributes 方法从图形中提取属性信息。GetAttributes 方法返回附着到块的属性参照数组及其当前值。GetConstantAttributes 方法返回附着到块或外部参照的固定属性数组。由此方法返回的属性是固定属性定义，而不是属性参照。

不需要样板文件来提取属性信息，而且也不会创建属性信息文件。要迭代属性参照数组，只需要使用属性参照的 TagString 和 TextString 特性来检查属性信息。

TagString 特性代表属性参照的单个标记。TextString 特性包含属性参照的值。

有关提取属性信息的详细信息，请参见《用户手册》中的“从块属性中提取数据”。

获取属性参照信息

本例创建一个块，然后向块中添加属性。接着将块插入到图形中。然后返回属性数据，并在消息框中显示。块参照中的属性数据将被更新，并再次返回和显示属性数据。

Sub Ch10_GettingAttributes()
    ' 创建块
    Dim blockObj As AcadBlock
    Dim insertionPnt(0 To 2) As Double
    insertionPnt(0) = 0
    insertionPnt(1) = 0
    insertionPnt(2) = 0
    Set blockObj = ThisDrawing.Blocks.Add _
                          (insertionPnt, "TESTBLOCK")
    ' 定义属性定义
    Dim attributeObj As AcadAttribute
    Dim height As Double
    Dim mode As Long
    Dim prompt As String
    Dim insertionPoint(0 To 2) As Double
    Dim tag As String
    Dim value As String
    height = 1#
    mode = acAttributeModeVerify
    prompt = "Attribute Prompt"
    insertionPoint(0) = 5
    insertionPoint(1) = 5
    insertionPoint(2) = 0
    tag = "Attribute Tag"
    value = "Attribute Value"
    ' 在块上创建属性定义对象
    Set attributeObj = blockObj.AddAttribute _
                        (height, mode, prompt, _
                        insertionPoint, tag, value)
    ' 插入块
    Dim blockRefObj As AcadBlockReference
    insertionPnt(0) = 2
    insertionPnt(1) = 2
    insertionPnt(2) = 0
    Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _
                     (insertionPnt, "TESTBLOCK", 1, 1, 1, 0)
    ZoomAll
    ' 获取块参照的属性
    Dim varAttributes As Variant
    varAttributes = blockRefObj.GetAttributes
    ' 将属性标记和值移至
    ' 要在 Msgbox 中显示的字符串中
    Dim strAttributes As String
    strAttributes = ""
    Dim I As Integer
    For I = LBound(varAttributes) To UBound(varAttributes)
        strAttributes = strAttributes + " Tag: " + _
                    varAttributes(I).TagString + vbCrLf + _
                    " Value: " + varAttributes(I).textString
    Next
    MsgBox "The attributes for blockReference " + _
                   blockRefObj.Name & " are: " & vbCrLf _
                   & strAttributes
    ' 更改属性值
    ' 注意：没有 SetAttributes。一旦包含
    ' 变量数组，就拥有了对象。
    ' 更改这些对象就会改变图形中的对象。
    varAttributes(0).textString = "NEW VALUE!"
    ' 再次获取属性
    Dim newvarAttributes As Variant
    newvarAttributes = blockRefObj.GetAttributes
    ' 再次显示标记和值
    strAttributes = ""
    For I = LBound(varAttributes) To UBound(varAttributes)
        strAttributes = strAttributes + " Tag: " + _
                    newvarAttributes(I).TagString + vbCrLf + _
                    " Value: " + newvarAttributes(I).textString
    Next
    MsgBox "The attributes for blockReference " & _
                  blockRefObj.Name & " are: " & vbCrLf _
                  & strAttributes
End Sub


使用外部参照

提取属性信息
高级绘图与组织技术
更新外部参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 >
使用外部参照

外部参照可以将其他图形链接到当前图形。将图形作为块插入时，块和所有关联的几何图形都存储在当前的图形数据库中。更改初始图形时它并不会更新。但是，如果将图形作为外部参照插入，它就会随着原始图形的更改而更新。因此，包含外部参照的图形总是反映每个外部参照文件的最新编辑。

与块参照类似，外部参照也作为单个对象在当前图形中显示。但是，外部参照不会明显增加当前图形的文件大小，并且不能被分解。与对待块相同，可以嵌套附着到图形的外部参照。

有关外部参照的详细信息，请参见《用户手册》中的“附着、更新和绑定外部参照”。

本节内容

  • 更新外部参照
  • 附着外部参照
  • 拆离外部参照
  • 重载外部参照
  • 卸载外部参照
  • 绑定外部参照
  • 剪裁块和外部参照
  • 按需加载和外部参照性能


更新外部参照

使用外部参照
使用外部参照
附着外部参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用外部参照 >
更新外部参照

打开或打印图形时，AutoCAD 会重载每个外部参照以反映参照图形的最新状态。更改外部参照图形并保存文件后，其他用户可以通过重载外部参照立即访问此更改。


附着外部参照

更新外部参照
使用外部参照
覆盖外部参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用外部参照 >
附着外部参照

附着外部参照可以将某个图形（参照文件或外部参照）链接到当前图形。当图形参照外部参照时，AutoCAD 仅将外部参照定义附着到图形；而在常规块中，块定义以及块的内容都与当前图形一同存储。AutoCAD 读取参照图形，以确定要在当前图形中显示的内容。如果参照文件丢失或损坏，其数据就不会显示在当前图形中。每次打开图形时，AutoCAD 都会从参照文件中加载所有图形对象和非图形对象（例如：图层、线型和文字样式）。如果 VISRETAIN 处于打开状态，AutoCAD 会将所有更新的依赖于外部参照的图层信息存储在当前图形中。

可以附着数目不限的外部参照副本，每个副本都可以具有不同的位置、比例和旋转。也可以控制在外部参照中定义的从属图层和线型特性。

要附着外部参照，请使用 AttachExternalReference 方法。此方法需要输入要参照图形的路径和文件名、要在当前图形中使用的外部参照的名称、外部参照的插入点、比例和旋转信息。AttachExternalReference 方法将返回新创建的 ExternalReference 对象。

有关附着外部参照的详细信息，请参见《用户手册》中的“附着外部参照”。

将外部参照附着到图形中

本例显示在添加外部参照之前和添加外部参照之后当前图形中所有的块。本例使用位于“Sample”目录中的“3D House.dwg”文件。如果没有此图像，或者此图像位于其他目录中，请为 PathName 变量插入有效的路径和文件名。

Sub Ch10_AttachingExternalReference()
    On Error GoTo ERRORHANDLER
    Dim InsertPoint(0 To 2) As Double
    Dim insertedBlock As AcadExternalReference
    Dim tempBlock As AcadBlock
    Dim msg As String, PathName As String
    ' 定义要插入的外部参照
    InsertPoint(0) = 1
    InsertPoint(1) = 1
    InsertPoint(2) = 0
    PathName = "C:/Program Files/AutoCAD 2008/sample/3D House.dwg"
    ' 显示此图形当前的 Block 信息
    GoSub ListBlocks
    ' 向图形添加外部参照
    Set insertedBlock = ThisDrawing.ModelSpace. _
            AttachExternalReference(PathName, "XREF_IMAGE", _
            InsertPoint, 1, 1, 1, 0, False)
    ZoomAll
    ' 显示此图形新的 Block 信息
    GoSub ListBlocks
    Exit Sub
ListBlocks:
    msg = vbCrLf ' 重置消息
    For Each tempBlock In ThisDrawing.Blocks
        msg = msg & tempBlock.Name & vbCrLf
    Next
    MsgBox "The current blocks in this drawing are: " & msg
    Return
ERRORHANDLER:
    MsgBox Err.Description
End Sub
本节内容
  • 覆盖外部参照


覆盖外部参照

附着外部参照
附着外部参照
拆离外部参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用外部参照 > 附着外部参照 >
覆盖外部参照

覆盖与附着类似，不同之处在于一个是附着图形，另一个是覆盖图形。所有嵌套于图形中的覆盖都将被忽略，因此，不显示这些覆盖。换句话说，不能读取嵌套的覆盖。

要覆盖外部参照，请将 AttachExternalReference 方法的 Overlay 参数设置为 TRUE。


拆离外部参照

覆盖外部参照
使用外部参照
重载外部参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用外部参照 >
拆离外部参照

可以拆离外部参照定义，以便从图形中完全删除外部参照。也可以删除单独的外部参照实例。拆离外部参照定义会删除与该外部参照关联的所有依赖符号。如果从图形中删除所有外部参照的实例，则在下次打开图形时，AutoCAD 会删除外部参照定义。

要拆离外部参照，请使用 Detach 方法。不能拆离嵌套的外部参照。

拆离外部参照定义

本例附着外部参照，然后再将其拆离。本例使用位于“Sample”目录中的“3D House.dwg”文件。如果没有此图像，或者此图像位于其他目录中，请为 PathName 变量插入有效的路径和文件名。

Sub Ch10_DetachingExternalReference()
    On Error GoTo ERRORHANDLER
    ' 定义要插入的外部参照
    Dim xrefHome As AcadBlock
    Dim xrefInserted As AcadExternalReference
    Dim insertionPnt(0 To 2) As Double
    Dim PathName As String
    insertionPnt(0) = 1
    insertionPnt(1) = 1
    insertionPnt(2) = 0
    PathName = "c:/AutoCAD 2008/sample/3D House.dwg"
    ' 添加外部参照
    Set xrefInserted = ThisDrawing.ModelSpace. _
            AttachExternalReference(PathName, "XREF_IMAGE", _
            insertionPnt, 1, 1, 1, 0, False)
    ZoomAll
    MsgBox "The external reference is attached."
    ' 拆离外部参照定义
    Dim name As String
    name = xrefInserted.name
    ThisDrawing.Blocks.Item(name).Detach
    MsgBox "The external reference is detached."
    Exit Sub
ERRORHANDLER:
    MsgBox Err.Description
End Sub


重载外部参照

拆离外部参照
使用外部参照
卸载外部参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用外部参照 >
重载外部参照

如果在使用附着了外部参照的宿主图形时有人修改了该外部参照的图形，则可以使用 Reload 方法更新该外部参照图形。重载时，将在宿主图形中更新选定的外部参照图形。另外，如果已卸载外部参照，则可以随时选择重载该外部参照的图形。

重载外部参照定义

本例附着外部参照，然后重载该外部参照。本例使用位于“Sample”目录中的“3D House.dwg”文件。如果没有此图像，或者此图像位于其他目录中，请为 PathName 变量插入有效的路径和文件名。

Sub Ch10_ReloadingExternalReference()
    On Error GoTo ERRORHANDLER
    ' 定义要插入的外部参照
    Dim xrefHome As AcadBlock
    Dim xrefInserted As AcadExternalReference
    Dim insertionPnt(0 To 2) As Double
    Dim PathName As String
    insertionPnt(0) = 1
    insertionPnt(1) = 1
    insertionPnt(2) = 0
    PathName = "c:/AutoCAD 2008/sample/3D House.dwg"
    ' 向块添加外部参照
    Set xrefInserted = ThisDrawing.ModelSpace. _
            AttachExternalReference(PathName, "XREF_IMAGE", _
            insertionPnt, 1, 1, 1, 0, False)
    ZoomAll
    MsgBox "The external reference is attached."
    ' 重载外部参照定义
    ThisDrawing.Blocks.Item(xrefInserted.name).Reload
    MsgBox "The external reference is reloaded."
    Exit Sub
ERRORHANDLER:
    MsgBox Err.Description
End Sub


卸载外部参照

重载外部参照
使用外部参照
绑定外部参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用外部参照 >
卸载外部参照

要卸载外部参照，请使用 Unload 方法。卸载未在当前图形中使用的参照文件时，AutoCAD 的性能会有所提高，因为这样就不必读取和显示不必要的几何图形或符号表信息。加载外部参照之前，不会显示外部参照几何图形和任何外部参照的嵌套的外部参照几何图形。

卸载外部参照定义

本例附着外部参照，然后卸载外部参照。本例使用位于“Sample”目录中的“ 3D House.dwg ”文件。如果没有此图像，或者此图像位于其他目录中，请为 PathName 变量插入有效的路径和文件名。

Sub Ch10_UnloadingExternalReference()
    On Error GoTo ERRORHANDLER
    ' 定义要插入的外部参照
    Dim xrefHome As AcadBlock
    Dim xrefInserted As AcadExternalReference
    Dim insertionPnt(0 To 2) As Double
    Dim PathName As String
    insertionPnt(0) = 1
    insertionPnt(1) = 1
    insertionPnt(2) = 0
    PathName = "c:/AutoCAD 2008/sample/3D House.dwg"
    ' 添加外部参照
    Set xrefInserted = ThisDrawing.ModelSpace. _
            AttachExternalReference(PathName, "XREF_IMAGE", _
            insertionPnt, 1, 1, 1, 0, False)
    ZoomAll
    MsgBox "The external reference is attached."
    ' 卸载外部参照定义
    ThisDrawing.Blocks.Item(xrefInserted.name).Unload
    MsgBox "The external reference is unloaded."
    Exit Sub
ERRORHANDLER:
    MsgBox Err.Description
End Sub


绑定外部参照

卸载外部参照
使用外部参照
剪裁块和外部参照
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用外部参照 >
绑定外部参照

使用 Bind 方法将外部参照绑定到图形，可以使外部参照成为图形的永久部分，而不再是外部参照文件。外部参照信息将成为块。更新外部参照图形时，不会更新绑定的外部参照。此过程将绑定整个图形的数据库，包括所有依赖符号。

依赖符号指命名的对象，例如块、标注样式、图层、线型和文字样式。通过绑定外部参照，可以在当前图形中使用外部参照中的命名对象。

Bind 方法只需要一个参数： bPrefixName。如果将 bPrefixName 设置为 TRUE，当前图形中外部参照图形的符号名将以 <blockname>$x$ 作为前缀，其中 x 是自动递增的整数，用于避免替代现有的块定义。如果将 bPrefixName 参数设置为 FALSE，外部参照图形的符号名会合并到当前图形中，且不包含前缀。如果存在重复的名称，AutoCAD 会使用已在本地图形中定义的符号。如果不确定图形中是否包含重复的符号名，建议将 bPrefixName 设置为 TRUE。

有关绑定外部参照的详细信息，请参见《用户手册》中的“归档包含外部参照的图形（绑定）”。

绑定外部参照定义

本例附着外部参照，然后将外部参照绑定到图形。本例使用位于“Sample”目录中的“3D House.dwg”文件。如果没有此图像，或者此图像位于其他目录中，请为 PathName 变量插入有效的路径和文件名。

Sub Ch10_BindingExternalReference()
    On Error GoTo ERRORHANDLER
    ' 定义要插入的外部参照
    Dim xrefHome As AcadBlock
    Dim xrefInserted As AcadExternalReference
    Dim insertionPnt(0 To 2) As Double
    Dim PathName As String
    insertionPnt(0) = 1
    insertionPnt(1) = 1
    insertionPnt(2) = 0
    PathName = "c:/AutoCAD 2008/sample/3D House.dwg"
    ' 添加外部参照
    Set xrefInserted = ThisDrawing.ModelSpace. _
            AttachExternalReference(PathName, "XREF_IMAGE", _
            insertionPnt, 1, 1, 1, 0, False)
    ZoomAll
    MsgBox "The external reference is attached."
    ' 绑定外部参照定义
    ThisDrawing.Blocks.Item(xrefInserted.name).Bind False
    MsgBox "The external reference is bound."
    Exit Sub
ERRORHANDLER:
    MsgBox Err.Description
End Sub


剪裁块和外部参照

绑定外部参照
使用外部参照
按需加载和外部参照性能
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用外部参照 >
剪裁块和外部参照

ActiveX Automation 没有提供剪裁块和外部参照边界的方法。可以使用 AutoCAD 中的 XCLIP 命令，或者使用 SendCommand 方法将 XCLIP 命令发送到 AutoCAD。


按需加载和外部参照性能

剪裁块和外部参照
使用外部参照
指定和检索扩展数据
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 > 使用外部参照 >
按需加载和外部参照性能

结合使用按需加载和以索引保存图形，可以提高包含外部参照的图形的性能。按需加载可以配合 XLOADCTL 和 INDEXCTL 系统变量一同使用。打开按需加载时，如果已将索引保存到参照图形中，AutoCAD 只将参照图形中重生成当前图形所必需的数据加载到内存中。换句话说，被参照的材料是“根据需要”读取的。

要最大限度地利用按需加载的优点，需要将参照图形与图层及空间索引一起保存。当处于以下情况时，按需加载在性能上的优点最为显著：

  • 剪裁外部参照以显示它的一小部分，并在外部参照的图形中保存空间索引。
  • 冻结外部参照的几个图层，并且将外部参照的图形与图层索引一起保存。

要打开按需加载，请使用 XRefDemandLoad 特性。如果通过 acDemandLoadEnabledWithCopy 选项打开了按需加载，AutoCAD 将生成外部参照文件的临时副本，并按需加载该临时文件。然后在允许修改初始参照图形的同时，按需加载外部参照。如果禁用按需加载，AutoCAD 将读取整个参照图形，而忽略图层可见性或剪裁实例。

要打开图层和空间索引，请使用 SetVariable 方法设置 INDEXCTL 系统变量。以下设置适用于 INDEXCTL 系统变量：

  • 0 = 不创建索引
  • 1 = 创建图层索引
  • 2 = 创建空间索引
  • 3 = 创建空间索引和图层索引

默认情况下，在创建新的 AutoCAD 图形时，INDEXCTL 将设置为 0。

有关按需加载和外部参照的详细信息，请参见《用户手册》中的“提高使用大型外部参照时的性能”。


指定和检索扩展数据

按需加载和外部参照性能
高级绘图与组织技术
使用 VBA 开发应用程序
ActiveX/VBA 开发人员手册 > 高级绘图与组织技术 >
指定和检索扩展数据

可以将扩展数据用作链接信息与图形中对象的方式。

将扩展数据指定给选择集中的所有对象

本例提示用户选择图形中的对象，选定的对象将被置于选择集中，并且指定的扩展数据将附着到该选择集中的所有对象

Sub Ch10_AttachXDataToSelectionSetObjects()
    ' 创建选择集
    Dim sset As Object
    Set sset = ThisDrawing.SelectionSets.Add("SS1")
    ' 提示用户选择对象
    sset.SelectOnScreen
    ' 定义扩展数据
    Dim appName As String, xdataStr As String
    appName = "MY_APP"
    xdataStr = "This is some xdata"
    Dim xdataType(0 To 1) As Integer
    Dim xdata(0 To 1) As Variant
    ' 为每个数组定义值
    ' 1001 指示 appName
    xdataType(0) = 1001
    xdata(0) = appName
    ' 1000 指示字符串值
    xdataType(1) = 1000
    xdata(1) = xdataStr
    ' 遍历选择集中的所有图元
    ' 将扩展数据设置和指定给每个图元
    Dim ent As Object
    For Each ent In sset
        ent.SetXData xdataType, xdata
    Next ent
End Sub
查看选择集中所有对象的扩展数据
本例显示上例所附着的扩展数据。如果附着的扩展数据不是字符串（类型 1000）类型，则需要修改此代码
Sub Ch10_ViewXData()
    ' 查找上例中创建的选择集
    Dim sset As Object
    Set sset = ThisDrawing.SelectionSets.Item("SS1")
    ' 定义扩展数据变量以保存扩展数据信息
    Dim xdataType As Variant
    Dim xdata As Variant
    Dim xd As Variant
    ' 定义索引计数器
    Dim xdi As Integer
    xdi = 0
    ' 遍历选择集中的对象
    ' 并检索对象的扩展数据
    Dim msgstr As String
    Dim appName As String
    Dim ent As AcadEntity
    appName = "MY_APP"
    For Each ent In sset
        msgstr = ""
        xdi = 0
        ' 检索 appName 扩展数据类型和值
        ent.GetXData appName, xdataType, xdata
        ' 如果未初始化 xdataType 变量，
        ' 则没有可供该图元检索的 appName 扩展数据
        If VarType(xdataType) <> vbEmpty Then
            For Each xd In xdata
                msgstr = msgstr & vbCrLf & xdataType(xdi) _
                         & ": " & xd
                xdi = xdi + 1
            Next xd
        End If
        ' 如果 msgstr 变量为 NULL，则没有扩展数据
        If msgstr = "" Then msgstr = vbCrLf & "NONE"
        MsgBox appName & " xdata on " & ent.ObjectName & _
                                      ":" & vbCrLf & msgstr
    Next ent
End Sub


使用 VBA 开发应用程序

指定和检索扩展数据
其他 VBA 术语
ActiveX/VBA 开发人员手册 >
使用 VBA 开发应用程序

许多编程任务不只涉及 AutoCAD ActiveX 对象模型。本章简要介绍了如何创建对话框、处理错误、控制窗口焦点以及将应用程序分发给他人。

请注意，Microsoft 的 VBA 的文档包含这些主题的详细信息。

本节内容

  • 其他 VBA 术语
  • VBA 中的窗体
  • 处理错误
  • 加密 VBA 代码模块
  • 从工具栏或菜单运行 VBA 宏
  • 自动加载 VBA 工程
  • 自动运行 VBA 宏
  • 加载工程时自动打开 VBA IDE
  • 在无文档状态下工作
  • 分发应用程序
  • 64 位移植


其他 VBA 术语

使用 VBA 开发应用程序
使用 VBA 开发应用程序
VBA 中的窗体
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
其他 VBA 术语

本章帮助用户扩展对 VBA 的认识。以下术语有助于用户理解 VBA 环境以及在其中更好地工作。

工程

编组到一个文件中的一组窗体和模块。

模块

一组（通常是相关的）子例程和函数。

宏

公有子例程或函数。宏作为工程中的一个可执行组件提供给用户。

对话框

应用程序执行期间显示或收集信息的一种方式。

窗体

对话框控件的容器。


VBA 中的窗体

其他 VBA 术语
使用 VBA 开发应用程序
设计模式和运行模式
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
VBA 中的窗体

窗体是基本的构造块，用户可以通过它为应用程序创建自定义的对话框。通过自定义窗体，可以向信息提供用户、从用户获取信息或者让用户控制应用程序中的操作。

窗体就像艺术家的画布：开始时是空白的。要填充画布，需要使用调色板。在本例中，控件工具箱就是调色板。用户就是艺术家，将选定的控件从工具箱放到窗体上。用户可以添加任意数量的控件，随时可以调整控件甚至窗体本身的大小和特性。最后，将功能（代码）添加到控件，为窗体注入生命。

虽然 Visual Basic 6 支持不同类型的窗体，但 VBA 仅支持“自定义窗体”，这意味着 Visual Basic 6 中创建和输出的某些窗体不能输入到 VBA 中。

UserForm—本手册中称为窗体—可以是模式窗体，也可以是无模式窗体。窗体的 ShowModal 特性确定该窗体是模式窗体还是无模式窗体。对于在运行的应用程序中显示的模式窗体，必须先将其关闭，用户才能执行操作。关于使用模式窗体的详细信息，请参见模式窗体 。

在工程中创建新窗体的步骤

  1. 打开 VBA IDE 的“工程”窗口并选择要向其中添加窗体的工程。
  2. 从“插入”菜单中选择“自定义窗体”。

    就会创建一个空白窗体，并将其添加到工程。

在工程中创建无模式窗体的步骤

  1. 打开 VBA IDE 的“工程”窗口并选择要向其中添加窗体的工程。
  2. 从“插入”菜单中选择“自定义窗体”，并将 ShowModal 特性更改为 False。
  3. 将 AcFocusCtrl (AcFocusCtrl.dll) 添加到工具箱中，并将该控件拖放到窗体上。

    AcFocusCtrl 使窗体在用户交互操作过程中一直拥有焦点。

本节内容

  • 设计模式和运行模式
  • 向窗体中添加控件
  • 显示和隐藏窗体
  • 加载和卸载窗体
  • 模式窗体


设计模式和运行模式

VBA 中的窗体
VBA 中的窗体
向窗体中添加控件
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > VBA 中的窗体 >
设计模式和运行模式

当以“设计”模式创建窗体时，用户可以

  • 向窗体中添加控件
  • 更改窗体的特性
  • 更改窗体上控件的特性
  • 向窗体模块添加代码

在设计模式下，用户、AutoCAD® 的用户界面以及窗体之间不进行交互。

一旦您运行自己的应用程序，或用户运行您的应用程序，窗体就处于“运行”模式。在“运行”模式下，不能直接调整窗体。但是，现在窗体显示在 AutoCAD 用户界面中，用户可以如同对待应用程序的普通操作那样与窗体交互。


向窗体中添加控件

设计模式和运行模式
VBA 中的窗体
更改控件的大小和位置
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > VBA 中的窗体 >
向窗体中添加控件

向窗体中添加控件非常容易。只需从控件工具箱中选择控件，然后将该控件拖放到窗体上即可。释放鼠标时，控件的副本就被放到窗体上。当控件位于窗体上之后，用户就可以修改控件的位置和大小。用户可以根据自己的需要复制任意数量的控件。

除了上述的拖放方法以外，还可以通过其他方法将控件放到窗体上。

本节内容

  • 更改控件的大小和位置
  • 使用格式化控制
  • 更改控件的特性
  • 向控件添加代码


更改控件的大小和位置

向窗体中添加控件
向窗体中添加控件
使用格式化控制
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > VBA 中的窗体 > 向窗体中添加控件 >
更改控件的大小和位置

要移动控件，只需选择该控件并将其拖放到窗体上的一个新位置即可。

要调整控件大小，首先要在该控件上单击鼠标按钮以选择它。当控件被选中后，其边框即可见。要调整控件大小，只需选择边框上的一个可见的调整大小夹点，并将其拖动到一个新位置即可。释放夹点后，控件调整至该位置。（用户可以用相同的方式来调整窗体大小。）

要一次移动多个控件或调整其大小，请在按住 SHIFT 键时选择每个控件。这会亮显所有的控件。现在用户可以将这些控件作为一个组来移动或调整大小。

在放置控件时调整其大小的步骤

  1. 在控件工具箱中选择所需的控件。
  2. 在窗体上按住鼠标按钮，拖动，然后释放鼠标按钮。选定的控件将会被放到窗体上。控件的大小取决于用户拖动鼠标的距离。

放置同一个控件的多个实例的步骤

  1. 在控件工具箱中双击要放置的控件。
  2. 在窗体上要放置控件副本的位置处单击。移到窗体上的另一个位置处再单击，将出现控件的另一个副本。用户可以根据自己的需要添加任意数量的控件副本。
  3. 完成该控件的添加操作后，回到控件工具箱再次单击该控件以取消选择。


使用格式化控制

更改控件的大小和位置
向窗体中添加控件
更改控件的特性
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > VBA 中的窗体 > 向窗体中添加控件 >
使用格式化控制

VBA 提供多种格式化控制来帮助用户布置窗体，它们可以在 VBA IDE 的“格式”菜单中找到。通过这些控制，用户可以对齐各个控件、让两个或更多的控件大小相同、更改控件之间的间距以及在窗体上居中对齐控件。

请记住，使用格式化控件时，通过使用 SHIFT 键可以一次选择多个控件。


更改控件的特性

使用格式化控制
向窗体中添加控件
向控件添加代码
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > VBA 中的窗体 > 向窗体中添加控件 >
更改控件的特性

特性控制控件的各种特征，例如大小、形状、颜色、标签和默认值。用户可以在设计模式中使用“特性”窗口来设置控件的特性。

更改控件特性的步骤

  1. 在窗体上选择所需的控件。
  2. 如果“特性”窗口尚未打开，请使用 F4 键打开该窗口。
  3. 在“特性”窗口中，查找需要更改的特性并选择该特性的当前值，
  4. 将该值更改为特性所需的新值。

用户也可以通过编写代码来访问控件的特性，从而在运行时更改该特性。关于在运行时更改控件特性的详细信息，请参见 Microsoft 文档。


向控件添加代码

更改控件的特性
向窗体中添加控件
显示和隐藏窗体
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > VBA 中的窗体 > 向窗体中添加控件 >
向控件添加代码

现在，窗体已经具有所需外观，需要在控件后面添加一些代码。要打开控件的“代码”窗口，只需在“窗体”窗口中双击该控件即可。将会打开“代码”窗口，在其中显示为该控件创建的子例程及其默认事件。

用户向默认事件中添加代码，或者从“代码”窗口右上角的事件下拉列表中选择不同的事件。


显示和隐藏窗体

向控件添加代码
VBA 中的窗体
加载和卸载窗体
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > VBA 中的窗体 >
显示和隐藏窗体

上面用户已经创建了设计美观的窗体，而且所有的控件背后都具有功能完善的代码。最后一个步骤就是在运行时向用户显示窗体。显示窗体是通过 VBA Show 方法来完成的。Show 方法可以从应用程序的任何代码模块中调用。

默认情况下，创建的窗体是模式窗体，所以显示该窗体时，用户不能与 AutoCAD 直接交互。例如，当窗体显示时，用户不能选择图形中的点和对象。要允许用户访问 AutoCAD 图形，请使用 VBA Hide 方法。Hide 方法会隐藏窗体，并允许用户有限访问 AutoCAD。当使用 Hide 方法时，请记住窗体并未从内存中卸载。隐藏时它会保留所有的当前值。

Hide 方法的调用方式与 Show 方法相同。

显示窗体

本例将显示命名为“UserForm1”的窗体：

Public Sub MyApplication()
   UserForm1.Show
End Sub

现在，可以从 VBARUN 命令或从 AutoCAD 菜单中以宏的方式调用子例程，从而也可以调用窗体的显示。

隐藏窗体

本例隐藏命名为“UserForm1”的窗体：

Public Sub MyAppHide()
   UserForm1.Hide
End Sub


加载和卸载窗体

显示和隐藏窗体
VBA 中的窗体
模式窗体
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > VBA 中的窗体 >
加载和卸载窗体

有时候用户可能希望在运行时将窗体加载到内存中，但不显示窗体。这种操作有助于更好地控制何时在应用程序中加载窗体，或者可以通过编程访问窗体同时又不会向用户显示窗体。

要加载窗体同时又不显示该窗体，请使用 VBA Load 方法。随后，可以使用 Show 方法在执行应用程序过程中的适当时机显示窗体。请记住，在窗体可见之前，用户无法与窗体进行交互。

如果调用 Show 方法时窗体尚未加载，将会自动加载窗体。

有时候用户也可能需要明确卸载窗体。卸载窗体会从内存中卸载该窗体并回收与窗体关联的所有内存。通过使用 Load 或 Show 方法重新加载窗体之前，用户无法与窗体进行交互，并且不能通过编程来操作窗体。当用户知道应用程序中不再使用该窗体并希望回收内存时，就可以选择卸载窗体。

Hide 方法不会执行卸载操作。如果应用程序结束时窗体尚未卸载，将会自动卸载窗体。下表比较了 VBA Show、Hide、Load 和 Unload 方法：

VBA Show、Hide、Load 和 Unload 方法
方法 | 使用
Show | 显示窗体。如果窗体尚未加载，将自动加载窗体。
Hide | 隐藏窗体。窗体不会从内存中卸载。
Load | 将窗体加载到内存中但不显示窗体。
Unload | 从内存中卸载窗体。此操作可以明确使用 Unload 方法来完成，或者在应用程序终止时自动执行。


模式窗体

加载和卸载窗体
VBA 中的窗体
处理错误
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > VBA 中的窗体 >
模式窗体

在 AutoCAD VBA 中将对话框定义为模式对话框时，用户必须先响应该对话框，才允许继续操作应用程序的其他部分。在通过 Hide 或 Unload 方法关闭模式对话框之前，任何后续代码都不会执行。这就要求应用程序的开发者仔细考虑如何以及何时实现模式对话框。

例如，可能有对话框需要用户选择 AutoCAD 图形中的对象。为了让用户能够从 AutoCAD 应用程序窗口中拾取对象，必须通过调用 Hide 方法来隐藏窗体。一旦对象被选中后，就可以使用 Show 方法重新显示窗体（它的所有数据仍是当前的）并继续执行应用程序。

注意虽然模式对话框显示时应用程序中的其他窗体都被禁用，但是不会禁用其他应用程序。


处理错误

模式窗体
使用 VBA 开发应用程序
定义应用程序错误类型
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
处理错误

大部分开发环境都提供默认的错误处理。对于 VB 和 VBA，对错误的默认反应是显示错误信息并终止应用程序。虽然这种处理方式在应用程序的开发阶段足以解决问题，但对最终用户来说效率并不高。有些错误可能是用户要忽略的，或者是用户希望提供特殊响应的，还有些错误开发人员不希望向用户显示错误信息，或者只需要控制向用户显示的信息。此外，自动终止应用程序对于最终用户来说是很难接受的。

一般来说，只要需要用户输入或操作文件 I/O，就需要进行错误处理。请记住，即使确信所需文件位于正确位置并且可被处理，也可能出现没有考虑到的情况，从而导致出现错误。

注意AutoCAD 文档中提供的大多数代码样例都不使用错误捕获。这是为了让样例能够简洁扼要。不过，对于所有的编程语言，适当的错误捕获和处理，对于提高应用程序的强壮性是非常重要的。

本节内容

  • 定义应用程序错误类型
  • 捕获运行时错误
  • 响应捕获的错误
  • 响应 AutoCAD 用户输入错误


定义应用程序错误类型

处理错误
处理错误
捕获运行时错误
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > 处理错误 >
定义应用程序错误类型

可能在应用程序中遇到的错误有三种不同类型：编译时错误、运行时错误和逻辑错误。

  • 编译时错误发生在构造应用程序的过程中。这些错误大部分是语法错误、变量作用域问题或数据类型问题。在 VBA 中，这些错误类型会被开发环境捕获。当用户输入了错误的代码行，该代码行会被亮显，并显示一条错误信息来通知用户。必须更正编译时错误后才能运行应用程序。
  • 运行时错误比较难找出和更正。此类错误发生在代码执行期间，通常涉及到从用户接收信息。例如，如果应用程序需要用户输入图形的名称，而用户输入了不存在的图形的名称，则将发生运行时错误。要有效地处理运行时错误，用户必须预测可能会发生哪些种类的问题，接着捕获这些问题，然后编写代码来处理这些情况。
  • 逻辑错误最难找出和更正。逻辑错误的症状是不包含编译时错误和运行时错误，但程序的结果仍然不正确。这就是程序员通常所说的程序错误—捕捉到这种程序错误可能很容易也可能很难。

关于查找和更正这三种错误的信息，请参见开发环境的文档。AutoCAD 特有的错误属于运行时错误，因此本文档涵盖了大部分此类错误。


捕获运行时错误

定义应用程序错误类型
处理错误
响应捕获的错误
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > 处理错误 >
捕获运行时错误

在 VB 和 VBA 中，使用 On Error 语句来捕获运行时错误。此语句为系统设置精确的捕获。当错误发生时，此语句会自动转到专门编写的错误处理程序，系统的默认错误处理则被略过。

On Error语句有三种形式：

  • On Error Resume Next
  • On Error GoTo Label
  • On Error GoTo 0

当希望忽略错误时，可以使用 On Error Resume Next 语句。此语句捕获错误但是不会显示错误信息或者终止程序，而是移到下一行代码继续执行。例如，如果希望创建子例程来遍历模型空间并修改每个图元的颜色，则在尝试对锁定图层上的图元着色时，AutoCAD 将会抛出错误。这时不需要终止过程，而只需要跳过锁定图层上的图元并继续处理其余的图元。On Error Resume Next 语句就可以完成这个过程。

当希望编写明确的处理程序时，可以使用 On Error GoTo Label 语句。此语句捕获错误但不会显示错误信息或者终止程序，而是跳到代码中的特定位置。然后代码可以使用适当的方式来响应错误。例如，可以扩充上一个样例，以显示包含锁定图层上每个图元句柄的消息。

用 On Error Resume Next 语句处理错误

以下子例程遍历模型空间，并将每个图元的颜色改为红色。对具有若干图元、有些图元位于锁定图层上的图形运行这个子例程。接着注释掉 On Error Resume Next 语句并再次运行子例程。用户将会看到子例程在遇到锁定图层上的第一个图元时终止。

Sub Ch11_ColorEntities()
    Dim entry As Object
    On Error Resume Next
    For Each entry In ThisDrawing.ModelSpace
        entry.Color = acRed
    Next entry
End Sub

用 On Error GoTo 语句处理错误

以下子例程遍历模型空间，并将每个图元的颜色改为红色。对于锁定图层上的每个图元，错误处理程序会显示一条自定义的错误信息和该图元的句柄。对具有若干图元、有些图元位于锁定图层上的图形运行这个子例程。接着注释掉 On Error GoTo MyErrorHandling 语句并再次运行子例程。用户将会看到子例程在遇到锁定图层上的第一个图元时终止。

Sub Ch11_ColorEntities2()
    Dim entry As Object
    On Error GoTo MyErrorHandler
    For Each entry In ThisDrawing.ModelSpace
        entry.Color = acRed
    Next entry
    ' 重要信息！在退出错误处理程序之前退出子例程
    Exit Sub
MyErrorHandler:
    Msgbox entry.EntityName + " is on a locked layer."+ _
                 " The handle is: " + entry.Handle
    Resume Next
End Sub

On Error GoTo 0 语句取消当前的错误处理程序。On Error Resume Next 和 On Error GoTo Label 语句会保持有效，直到子例程结束、声明了其他错误处理程序或者使用 On Error GoTo 0 语句取消错误处理程序为止。


响应捕获的错误

捕获运行时错误
处理错误
响应 AutoCAD 用户输入错误
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > 处理错误 >
响应捕获的错误

捕获到错误后，应该如何进行处理？答案取决于应用程序和错误的性质。

VB 和 VBA 提供了关于使用 Err 对象所捕获到的错误的类型信息。此对象具有多个特性：Number、Description、Source、HelpFile、HelpContext 和 LastDLLError。Err 对象的特性会被填入最近发生的错误的信息。其中最重要的特性是 Number 和 Description 特性。Number 特性包含与错误关联的唯一的错误代码，而 Description 特性则包含通常显示的错误信息。

在错误处理程序中，用户可以将错误的 Number 特性与期望值相比较，这样可帮助用户确定发生的错误的性质。知道需要处理的错误类型后，就可以采取适当的操作。


响应 AutoCAD 用户输入错误

响应捕获的错误
处理错误
加密 VBA 代码模块
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > 处理错误 >
响应 AutoCAD 用户输入错误

用户输入方法提供了相当数量的固有错误捕获，要求用户输入特定类型的数据。如果用户尝试输入某些其他数据，AutoCAD 会拒绝输入并再次提示用户。对用户输入函数使用 InitializeUserInput 方法可以提供额外的用户输入控制，但是也会引入更多需要通过错误捕获来验证的情况。关于需要某种用户输入的错误捕获的样例，请参见提示用户输入。


加密 VBA 代码模块

响应 AutoCAD 用户输入错误
使用 VBA 开发应用程序
从工具栏或菜单运行 VBA 宏
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
加密 VBA 代码模块

虽然 VBA 不支持创建可执行文件，但它提供了口令保护，以工程的方式保护工程窗体、类和模块的可见性。用户可以在 VBA IDE 菜单中找到此“工程保护”功能。依次选择“工具” [image] “工程特性” [image] “保护”。


从工具栏或菜单运行 VBA 宏

加密 VBA 代码模块
使用 VBA 开发应用程序
自动加载 VBA 工程
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
从工具栏或菜单运行 VBA 宏

只需修改 AutoCAD 工具栏或菜单的 Macro 特性，就可以从该工具栏或菜单来运行 VBA 宏。Macro 特性必须设置为等于

-VBARUN filename.dvb!modulename.macroname

其中，filename 是工程文件的名称，modulename 是包含要运行的宏的模块名称，而 macroname 是要运行的宏的名称。只有在当前 AutoCAD 任务中未加载文件时，才需要文件名。如果提供了文件名，将会加载该文件。

关于编辑菜单和工具栏的详细信息，请参见自定义工具栏和菜单。


自动加载 VBA 工程

从工具栏或菜单运行 VBA 宏
使用 VBA 开发应用程序
自动运行 VBA 宏
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
自动加载 VBA 工程

有两种不同的方法可以自动加载 VBA 工程：

  • 加载 VBA 时，它会在 AutoCAD 目录中查找名为 acad.dvb 的工程。此文件将会自动加载为默认工程。
  • 除了默认工程 acad.dvb 以外的任何工程，都可以使用 VBALOAD 命令在启动时明确加载该工程。在以下代码样例中，在启动 AutoCAD 时，使用 AutoLISP 启动文件来加载 VBA 和名为 myproj.dvb 的 VBA 工程。启动 notepad.exe 并在 acad.lsp 中创建（或附加）下面几行：

    (defun S::STARTUP()

    (command "_VBALOAD" "myproj.dvb")

    )


自动运行 VBA 宏

自动加载 VBA 工程
使用 VBA 开发应用程序
加载工程时自动打开 VBA IDE
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
自动运行 VBA 宏

用户可以自动运行 acad.dvb 文件中的任何宏，方法是从 AutoCAD 启动功能（如 acad.lsp）中使用 VBARUN 的命令行版本调用。例如，要自动运行名为 drawline 的宏，请先将 drawline 宏保存在 acad.dvb 文件中。然后调用 notepad.exe 并在 acad.lsp 中创建（或附加）下面几行：

(defun S::STARTUP()
     (command "_-vbarun" "drawline")
)

将宏命名为 AcadStartup，这样在加载 VBA 时就会自动运行该宏。当加载 VBA 时，将自动执行 acad.dvb 文件中所有名为 AcadStartup 的宏。


加载工程时自动打开 VBA IDE

自动运行 VBA 宏
使用 VBA 开发应用程序
在无文档状态下工作
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
加载工程时自动打开 VBA IDE

“打开 VBA 工程”对话框中有一个选项，可让用户自动打开交互式开发环境。只要选中对话框左下方的“打开 Visual Basic 编辑器”复选框，就会在加载 VBA 工程时自动打开 VBA IDE。此选项将会一直保留其设置，直到用户再次关闭为止。

注意要访问“打开 VBA 工程”对话框，请在命令行中输入 VBALOAD。将会打开该对话框，并让用户选择要加载的工程。如果没有看到“打开 VBA 工程”对话框，可能是因为系统变量 FILEDIA 被关闭。此系统变量可打开或关闭对话框的显示。要打开 FILEDIA，请将其设置为 1。


在无文档状态下工作

加载工程时自动打开 VBA IDE
使用 VBA 开发应用程序
分发应用程序
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
在无文档状态下工作

无文档状态是指 AutoCAD 中无打开的图形的状况。当在无文档状态下使用 VBA 时，请注意以下几点：

  • 无文档状态下没有定义 ThisDrawing 对象。任何试图使用 ThisDrawing 对象的操作都会导致错误。
  • 无文档状态下也没有定义依赖于文档的对象。依赖于文档的对象是 AutoCAD 对象模型中位于 Document 对象下的对象。允许使用不依赖于文档的对象，例如 Application 或 MenuBar 对象。
  • 在无文档状态下，AutoCAD 没有命令行。AutoCAD 处于无文档状态时，任何尝试访问 AutoCAD 命令行的操作都将导致错误。


分发应用程序

在无文档状态下工作
使用 VBA 开发应用程序
分发 Visual Basic 6 应用程序
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
分发应用程序

VBA 应用程序可以通过两种不同的方法分发：

  • 嵌在 AutoCAD 图形文件中
  • 存储在 VBA 工程文件中

用户必须选择适合自己应用程序的分发方式。适用于当前图形且不会访问其他图形的应用程序，通常内嵌在图形中。将应用程序内嵌在图形中，通常可以确保每次打开图形时都加载该应用程序，因此只要打开该图形，用户就可以使用该应用程序。

对于那些会被许多人使用、经常更新、需要打开和关闭其他图形或者不常使用的应用程序，用户可能希望将其存储在 VBA 工程文件中。采用这种方式，应用程序会集中在一个位置，可以确保每个人使用的都是最新的版本。

关于内嵌工程和 VBA 工程文件的详细信息，请参见了解内嵌与全局 VBA 工程。

本节内容

  • 分发 Visual Basic 6 应用程序


分发 Visual Basic 6 应用程序

分发应用程序
分发应用程序
64 位移植
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > 分发应用程序 >
分发 Visual Basic 6 应用程序

Visual Basic 6 应用程序或任何其他进程外应用程序都不能存储在 AutoCAD 图形中。这些应用程序被编译成独立的可执行文件 (EXE)。


64 位移植

分发 Visual Basic 6 应用程序
使用 VBA 开发应用程序
VBA 中 AutoCAD 对象的实例化
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 >
64 位移植

Microsoft 未向开发人员 提供 64 位版本的 VBA；因此，开发的 32 位应用程序需要转换为 64 位 AutoCAD 版本。在 64 AutoCAD 版本中，VBA 将作为进程外组件运行，可以通过 32 位至 64 位“thunking”层进行访问。

无法保证 VBA 在 64 位版本 AutoCAD 中的表现与在 32 位版本 AutoCAD 中的表现相同。例如，当 VBA IDE 处于激活状态或正在显示模式窗口时，在 AutoCAD 窗口重新绘制过程中，可能会稍有延迟。

有关详细信息，请参见《AutoCAD 移植手册》。

本节内容

  • VBA 中 AutoCAD 对象的实例化
  • 处理 ObjectId
  • 32 位方法附录


VBA 中 AutoCAD 对象的实例化

64 位移植
64 位移植
处理 ObjectId
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > 64 位移植 >
VBA 中 AutoCAD 对象的实例化

64 位操作系统可以执行 32 位和 64 位应用程序，但是无法将这些类型的应用程序混合在一个进程中。例如，无法将 32 位 DLL 加载到 64 位进程中，反之亦然。加载到进程中的所有可执行组件（EXE 和 DLL 文件）必须与进程的二进制类型匹配。64 位应用程序的进程中组件应该尽可能地转换为 64 位进程。

试图创建新对象时出错。VB 的 New 关键字将试图加载 64 位 AutoCAD COM DLL。由于 VBA 为 32 位应用程序，因此无法加载 64 位 DLL。例如，如下代码

Dim color As AcadAcCmColor
Set color = New AcadAcCmColor

或

Dim col As New AcadAcCmColor
color.SomeMethod()

需要进行修改并转换为

Dim color As AcadAcCmColor
Set color = AcadApplication.GetInterfaceObject(“Autocad.AcCmColor.17”)。

以上问题应使用针对衍生自 IDispatch 的对象的 AcadApplication.GetInterfaceObject(“ProgIdOfAcAnyObject”) 来解决。衍生自 IUnknown的类（例如 AcSmSheetSet、 AcSmSheetMgr 等）可以不进行 64 位 VBA 移植。建议将此进程转换为 VB .Net。


处理 ObjectId

VBA 中 AutoCAD 对象的实例化
64 位移植
32 位方法附录
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > 64 位移植 >
处理 ObjectId

自 AutoCAD 2008 64 位开始，对象 ID 将由 64 位整数数据类型 (__int64) 表示。在 32 位 VBA 中访问这些值将导致编译错误。作为解决方法，将使用对相应的旧方法名称加上“32”后缀的新方法名称集合（例如 ObjectID32()、OwnerID32()）。这些方法使用 LONG 数据类型，该数据类型将内部映射到 64 位整数数据类型。

更确切地说，是为 VBA 中需要的每个对象 ID 均内部创建 32 位对象 ID。此 ID 将映射到其 64 位实际 ID，因此，如果 32 位 ID 从 VBA 代码传递回 AutoCAD，则将返回 64 位对象 ID 并在内部用于各种情况。

以下是已转换的 32 位对象 ID 代码样例：

源代码：

Dim splineObj As AcadSpline
Dim objectID As Long
objectID = splineObj.objectID
Dim tempObj As AcadObject
Set tempObj = ThisDrawing.ObjectIdToObject(objectID)

转换代码以实现 64 位兼容性：

Dim splineObj As AcadSpline
Dim objectID As Long
objectID = splineObj.objectID32
Dim tempObj As AcadObject
Set tempObj = ThisDrawing.ObjectIdToObject32(objectID)

VBA 应用程序也可以使用对象句柄代替对象 ID。以下样例显示了如何使用句柄代替对象 ID：

源代码：

Dim splineObj As AcadSpline
Dim objectID As Long
objectID = splineObj.objectID
Dim tempObj As AcadObject
Set tempObj = ThisDrawing.ObjectIdToObject(objectID)

转换代码以实现 64 位兼容性：

Dim splineObj As AcadSpline
Dim objectHandle As String
objectHandle = splineObj.Handle
Dim tempObj As AcadObject
Set tempObj = ThisDrawing.HandleToObject(objectHandle)
注意：在 AutoCAD 的后续版本中将不支持 VBA。VBA 开发人员应准备将 VBA 代码转换为 VB.Net。


32 位方法附录

处理 ObjectId
64 位移植
与其他应用程序及 Windows API 交互
ActiveX/VBA 开发人员手册 > 使用 VBA 开发应用程序 > 64 位移植 >
32 位方法附录

以下表格列出了 AutoCAD 2008 中已添加的用于 32 位替换的新方法：

用于 64 位系统的 VBA 表方法
方法 | 使用
GetBlockAttributeValue32 | 使用 32 位对象 ID，从块中包含的属性定义对象的指定块单元返回属性值。
GetBlockTableRecordId32 | 获取与块类型单元和内容关联的块表记录的 32 位对象 ID。
GetDataLink32 | 返回数据链接对象的 32 位对象 ID。
GetFieldId32 | 返回与指定单元关联的字段对象的 32 位对象 ID。
GetGridLinetype32 | 返回栅格线型对象的 32 位对象 ID。
Key32 | 在对 64 位系统进行 CopyObjects 操作时指定源对象的对象 ID。
ObjectID32 | 获取 64 位系统的对象 ID。
ObjectIDtoObject32 | 获取与 64 位系统的给定对象 ID 对应的对象。
OwnerID32 | 获取 64 位系统的属主（父）对象的对象 ID。
SetBlockAttributeValue32 | 使用 32 位对象 ID，从块和内容中包含的属性定义对象的指定块单元设置属性值。
SetBlockTableRecordId32 | 设置与块类型单元和内容关联的 32 位对象 ID 块表记录。
SetDataLink32 | 设置数据链接对象的 32 位对象 ID。
SetFieldId32 | 设置与指定单元和内容关联的字段对象的 32 位对象 ID。
SetGridLinetype32 | 设置网格线类型对象的 32 位对象 ID。
Value32 | 为 64 位系统指定特性的当前值或新创建的克隆对象的对象 ID。


与其他应用程序及 Windows API 交互

32 位方法附录
与 Visual LISP 应用程序交互
ActiveX/VBA 开发人员手册 >
与其他应用程序及 Windows API 交互

使用 ActiveX 技术，用户可以很容易地与其他 AutoCAD 应用程序以及其他启用 ActiveX 的应用程序（例如 Microsoft Excel 或 Microsoft Word）交换信息。本章将讨论一些与其他应用程序交互的基本步骤。

本节内容

  • 与 Visual LISP 应用程序交互
  • 与其他 Windows 应用程序交互
  • 从 VBA 访问 Windows API


与 Visual LISP 应用程序交互

与其他应用程序及 Windows API 交互
与其他应用程序及 Windows API 交互
与其他 Windows 应用程序交互
ActiveX/VBA 开发人员手册 > 与其他应用程序及 Windows API 交互 >
与 Visual LISP 应用程序交互

Visual LISP® 应用程序可以访问所有 ActiveX® 对象。可以调用 ActiveX 方法，设置和检索 ActiveX 特性。另外，Visual LISP 应用程序还可以通过 VBARUN 命令来运行 VBA 宏。

ActiveX 和 VBA 应用程序可以通过 SendCommand 方法来执行 Visual LISP 应用程序。此方法允许 ActiveX 和 VBA 应用程序向 AutoCAD 命令行发送命令。

有关通过 Visual LISP 访问 ActiveX 对象的详细信息，请参见《AutoLISP Developer's Guide》。


与其他 Windows 应用程序交互

与 Visual LISP 应用程序交互
与其他应用程序及 Windows API 交互
引用其他应用程序的 ActiveX 对象库
ActiveX/VBA 开发人员手册 > 与其他应用程序及 Windows API 交互 >
与其他 Windows 应用程序交互

AutoCAD® ActiveX 技术使用户可以方便地与其他启用 ActiveX 的应用程序（例如 Microsoft Excel 和 Microsoft Word）交换信息。这项功能可以让用户以不同于 AutoCAD 图形的格式收集、存储和表示 AutoCAD 信息。也可以从这些应用程序中读取信息并传回到 AutoCAD 中，来指导 AutoCAD 对象的创建或操作。从 AutoCAD 图形中的对象用 Microsoft Excel 电子表格创建明细表，就是使用该技术的一个例子。

前面已经学习了如何使用 AutoCAD ActiveX 对象模型来编写代码。与其他启用 ActiveX 的应用程序交换信息的过程仅包括：引用其他应用程序的 ActiveX 对象模型并编写使用其对象所需的代码。

注意本章仅简单介绍跨应用程序编程的功能。这个功能不是 AutoCAD 专有的，在 Microsoft 文档和其他的独立编程指南中也进行了讨论。

跨 ActiveX 对象模型交换信息的步骤

  1. 引用另一个应用程序的 ActiveX 对象模型。

    这一步可以使用户代码了解其他对象模型中的对象名称和关系。

  2. 创建其他应用程序的实例。

    这一步将创建（实例化）其他对象模型中基本对象的有效对象。

  3. 编写利用 AutoCAD 对象模型和其他应用程序的对象模型的代码。

    这一步就是进行数据交换。

本节内容

  • 引用其他应用程序的 ActiveX 对象库
  • 创建其他应用程序的实例
  • 用其他应用程序的对象进行编程


引用其他应用程序的 ActiveX 对象库

与其他 Windows 应用程序交互
与其他 Windows 应用程序交互
创建其他应用程序的实例
ActiveX/VBA 开发人员手册 > 与其他应用程序及 Windows API 交互 > 与其他 Windows 应用程序交互 >
引用其他应用程序的 ActiveX 对象库

要编写能够访问其他应用程序的代码，必须使 VBA 能够使用其他应用程序中的对象。方法是在另一个应用程序的对象库中设置引用。引用是计算机上的一个文件，其中定义了该应用程序的所有对象、方法、特性、常量和事件。

可以通过 VBA IDE 引用对象库。在 VBA IDE 中的“工具”菜单下，有一个“引用”选项。选择此菜单选项后将显示一个对话框，列出 VBA 在系统中找到的所有对象库。要引用某个库，只需从列表中选择该库即可。对应复选框已被选中的库，表示已经在当前工程中引用。例如，要添加 Microsoft Excel 对象库，可以在列表中选择 Microsoft Excel 对象库条目。

创建对另一个应用程序的对象库的引用之后，就可以使用 VBA 对象浏览器来查看应用程序的对象列表。

注意用户必须为使用该对象模型的每个 VBA 工程设置引用。为一个工程设置引用将不会自动为另一个工程设置这个引用。这样做是为了提高性能。

引用另一个应用程序的对象库的步骤

  1. 在 VBA IDE 中，打开“工具”菜单，然后选择“引用”菜单选项。
  2. 在“可使用的引用”列表中查找并选择要访问的应用程序条目。
  3. 选择“确定”关闭对话框并保存更改。


创建其他应用程序的实例

引用其他应用程序的 ActiveX 对象库
与其他 Windows 应用程序交互
用其他应用程序的对象进行编程
ActiveX/VBA 开发人员手册 > 与其他应用程序及 Windows API 交互 > 与其他 Windows 应用程序交互 >
创建其他应用程序的实例

引用应用程序的对象库后，必须创建该应用程序的实例。也就是说，需要通过编程方式启动该应用程序，以便代码可以使用有效对象。

要创建实例，首先声明一个代表其他应用程序的变量。其方法与声明内置对象一样使用 Dim 语句，并应该在 Dim 语句中定义应用程序的类型。例如，以下 Dim 语句声明了 Excel.Application 类型的对象变量：

Dim ExcelAppObj as Excel.Application

声明变量后，使用 Set 语句和 New 关键字将变量设置为等于应用程序的运行实例。例如，以下 Set 语句将上面声明的变量设置为等于 Excel 应用程序，其中的 New 关键字将启动新的 Excel 任务。

Set ExcelAppObj = New Excel.Application
注意某些应用程序只允许一次设置一个运行实例。对这类应用程序使用 New 关键字，将创建现有实例的引用，而不会启动应用程序的新任务。


用其他应用程序的对象进行编程

创建其他应用程序的实例
与其他 Windows 应用程序交互
退出其他应用程序
ActiveX/VBA 开发人员手册 > 与其他应用程序及 Windows API 交互 > 与其他 Windows 应用程序交互 >
用其他应用程序的对象进行编程

上面引用了对象库并创建了应用程序的新实例，接下来用户可以创建和操作该应用程序中的对象。由对象模型定义的所有对象、方法和特性都是可用的。例如，使用上节声明的变量，以下代码行将 Excel 任务设置为可见：

ExcelAppObj.Visible = TRUE

要为应用程序编写代码，应该熟悉其中的对象模型。可以使用 VBA 对象浏览器或应用程序的帮助文件来学习任何要引用的对象模型。

本节内容

  • 退出其他应用程序


退出其他应用程序

用其他应用程序的对象进行编程
用其他应用程序的对象进行编程
从 VBA 访问 Windows API
ActiveX/VBA 开发人员手册 > 与其他应用程序及 Windows API 交互 > 与其他 Windows 应用程序交互 > 用其他应用程序的对象进行编程 >
退出其他应用程序

以编程方式启动应用程序，会占用计算机的内存，所以使用完毕后应该退出应用程序，以释放系统资源。

虽然每个对象模型各不相同，但是大部分都可以使用 Application 对象的 Quit 方法来完全关闭应用程序。例如，使用上节的变量声明，以下代码行将使 Excel 退出：

ExcelAppObj.Application.Quit
注意破坏或超出对象变量的作用域，不一定会导致应用程序终止。一定要使用适当的方法退出应用程序，以确保正确清除内存。

在 Excel 电子表格中列出 AutoCAD 属性

以下子例程在当前图形中查找所有的块引用，然后查找附着到这些块引用的属性，并将它们列在 Excel 电子表格中。要运行本样例，请按以下步骤执行：

  1. 打开包含块引用的图形，这些块引用带有属性。（样例图形 sample/activeX/attrib.dwg 包含这样的块引用。）
  2. 使用 AutoCAD VBAIDE 命令打开 VBA IDE。
  3. 在 VBA IDE 中依次使用“工具” [image] “引用”菜单选项，以选择“Microsoft Excel 8.0 对象模型”。
  4. 将这个子例程复制到 VBA 的“代码”窗口中并运行它。
Sub Ch12_Extract()
    Dim Excel As Excel.Application
    Dim ExcelSheet As Object
    Dim ExcelWorkbook As Object
    Dim RowNum As Integer
    Dim Header As Boolean
    Dim elem As AcadEntity
    Dim Array1 As Variant
    Dim Count As Integer
    ' 启动 Excel。
    Set Excel = New Excel.Application
    ' 创建新的工作簿并查找活动电子表格。
    Set ExcelWorkbook = Excel.Workbooks.Add
    Set ExcelSheet = Excel.ActiveSheet
    ExcelWorkbook.SaveAs "Attribute.xls"
    RowNum = 1
    Header = False
    ' 遍历模型空间，查找
    ' 所有的块引用。
    For Each elem In ThisDrawing.ModelSpace
        With elem
            ' 找到块引用时，
            ' 检查其属性
            If StrComp(.EntityName, "AcDbBlockReference", 1) _
                = 0 Then
                If .HasAttributes Then
                    ' 获取属性
                    Array1 = .GetAttributes
                    ' 将属性的标记字符串
                    ' 复制到 Excel
                    For Count = LBound(Array1) To UBound(Array1)
                        If Header = False Then
                            If StrComp(Array1(Count).EntityName, _
                                  "AcDbAttribute", 1) = 0 Then
                                ExcelSheet.Cells(RowNum, _
                                    Count + 1).value = _
                                    Array1(Count).TagString
                            End If
                        End If
                    Next Count
                    RowNum = RowNum + 1
                    For Count = LBound(Array1) To UBound(Array1)
                        ExcelSheet.Cells(RowNum, Count + 1).value _
                                    = Array1(Count).textString
                    Next Count
                    Header = True
                End If
            End If
        End With
    Next elem
    Excel.Application.Quit
End Sub


从 VBA 访问 Windows API

退出其他应用程序
与其他应用程序及 Windows API 交互
ActiveX/VBA 教程：设计花园小径
ActiveX/VBA 开发人员手册 > 与其他应用程序及 Windows API 交互 >
从 VBA 访问 Windows API

Windows® API 过程对于大多数 Windows 应用程序可用。这些程序可用于扩展应用程序的功能。

通过 Windows API，用户可以获取当前系统的信息，例如系统安装了或运行了哪些其他程序、信息位于系统的什么地方以及系统当前的控制设置是什么；还可以访问游戏杆、多媒体和声音控制。这些任务只是 Windows API 提供的众多功能中的一小部分。

要使用某个 Windows API，首先必须在应用程序中声明该 API，此操作通过 Declare 语句完成。Declare 语句需要以下几项信息：

  • 动态链接库（DLL，其中包含要使用的过程）的名称
  • 出现在 DLL 中的过程名称
  • 需要在应用程序中使用的过程名称
  • 过程需要接收的参数
  • 返回值的数据类型（如果调用的过程是函数）

可以将 Declare 语句放在任何 VBA 模块中。如果将其放在标准模块中，应用程序中的所有模块都可以使用该程序，除非用户使用关键字 Private 限制其作用域。如果将 Declare 语句放在类或窗体模块中，则只有该模块能使用此程序。声明程序后，在应用程序中可以像调用其他程序一样调用此程序。

要想很好地使用 Declare 语句是比较难的。用户常常会使用错误的 Declare 语句，导致严重后果。因此，在试图使用新的 Declare 语句之前，请务必保存活动应用程序中的所有信息。

为了帮助用户使用 Declare 语句，Microsoft 提供了一个文件，其中列出了许多常用声明，该文件名称为 Win32api.txt，包含在 Visual Basic 6 和 Office 中。用户可以在该文件中搜索所需的过程，并将提供的 Declare 语句复制到自己的代码中。

Microsoft VBA 文档包含了关于 Declare 语句的详细信息以及其使用样例。Microsoft Windows API 参考包含在 Mircrosoft Developer Network CD 订阅中，它提供了 Windows API 中所有可用程序的参考。Dan Appleman 撰写的《Visual Basic Programmer's Guide to the Win32 API》一书对于 Visual Basic 6 程序员也非常有用。


ActiveX/VBA 教程：设计花园小径

从 VBA 访问 Windows API
检查环境
ActiveX/VBA 开发人员手册 >
ActiveX/VBA 教程：设计花园小径

本教程演示了如何使用 ActiveX 和 Visual Basic for Applications (VBA) 以及如何向 AutoCAD 添加宏。本教程是针对园林建筑的，但教程中的概念同样适用于其他应用领域。

本教程适用于熟练掌握 AutoCAD 并初步涉足 VBA 的用户。

本节内容

  • 检查环境
  • 定义目标
  • 编写第一个函数
  • 获取输入
  • 绘制路的轮廓
  • 绘制瓷砖
  • 形成宏
  • 单步执行代码
  • 执行宏
  • 添加对话框界面


检查环境

ActiveX/VBA 教程：设计花园小径
ActiveX/VBA 教程：设计花园小径
定义目标
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
检查环境

对于本教程，用户需要使用 AutoCAD® VBA 集成式开发环境 (VBA IDE)。AutoCAD 安装程序的“完全”安装选项会自动安装 VBA IDE。安装 AutoCAD 时，如果选择“自定义”选项，则可能不会安装 VBA IDE；此时可能需要再次运行 AutoCAD 安装程序以安装 VBA IDE。

测试是否已安装 VBA IDE 的步骤

  1. 启动 AutoCAD。
  2. 在命令行中，输入 vbaide 并按 ENTER 键。

    如果打开 VBA IDE，则表明已安装了 VBA IDE。如果收到消息“当前未安装 AutoCAD VBA”，则表明未安装 VBA IDE。


定义目标

检查环境
ActiveX/VBA 教程：设计花园小径
编写第一个函数
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
定义目标

本教程的目标是为 AutoCAD 添加一个新宏，用于绘制一条铺满圆形混凝土瓷砖的花园小路。新宏将提供下列提示序列：

命令: gardenpath

路的起点: 用户将指定起点

路的终点: 用户将指定终点

路的半宽: 用户将指定一个数字

瓷砖的半径: 用户将指定一个数字

瓷砖之间的间距: 用户将指定一个数字

该宏将首先提示用户输入起点和端点以指定路的中心线。然后提示用户输入路的半宽和圆形瓷砖的半径。最后，用户将输入瓷砖之间的间距。这里使用路的半宽而不是全宽，是因为从路的中心线更容易显示半宽。


编写第一个函数

定义目标
ActiveX/VBA 教程：设计花园小径
获取输入
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
编写第一个函数

开发 Gardenpath 宏时需要使用一系列函数和子例程。许多子例程都要求操作角度。因为 ActiveX 用弧度指定角度，而大多数用户习惯于用度来表示，所以首先需要创建一个将度转换为弧度的函数。

将度转换为弧度的步骤

  1. 在命令行中，输入 vbaide 并按 ENTER 键。
  2. 在 VBA IDE 的“视图”菜单中，单击“代码”，打开“代码”窗口。
  3. 在“代码”窗口中输入下列代码：
    Const pi = 3.14159
    ' 将角度从度转换为弧度
    Function dtr(a As Double) As Double
        dtr = (a / 180) * pi
    End Function

    请注意，在输入行 Function dtr(a As Double) As Double 并按 ENTER 键后，会立即自动添加 End Function。这将确保所有子例程和函数都有关联的 End 语句。

    现在看一下代码。首先，常量 pi 定义为值 3.14159。这使得每次需要使用该值时，可以使用单词 pi 而不必键入 3.14159。

    下一步，定义称为 dtr（度转换为弧度的缩写）的函数。dtr 函数接收一个用度表示的角度参数 a。将度表示的角度除以 180，所得的值乘以 pi 即可获得结果。以单引号开始的行是注释行；VBA 会忽略代码行中单引号后面的所有文字。

    现在该函数已可用于整个工程中的其他子例程。

  4. 保存所做的工作。依次单击“文件” [image] “保存 Global1”。将工程命名为 gardenpath.dvb。

下一步，添加计算两点之间距离的函数。

计算两点之间距离的步骤

  1. 在 dtr 函数的后面输入下列代码：
    ' 计算两点之间距离
    Function distance(sp As Variant, ep As Variant) _
     As Double
        Dim x As Double
        Dim y As Double
        Dim z As Double
        x = sp(0) - ep(0)
        y = sp(1) - ep(1)
        z = sp(2) - ep(2)
        distance = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2))
    End Function
  2. 保存所做的工作。


获取输入

编写第一个函数
ActiveX/VBA 教程：设计花园小径
声明变量
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
获取输入

Gardenpath 宏将向用户询问绘制小路的位置、路的宽度、混凝土瓷砖的大小以及瓷砖之间的间距。为此，可以定义一个子例程执行上述所有询问项目，然后计算出各个数值，留待在宏的剩余部分中使用。

在此子例程中，使用 Utility 对象中的用户输入方法。

本节内容

  • 声明变量
  • 输入 gpuser 子例程


声明变量

获取输入
获取输入
输入 gpuser 子例程
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 > 获取输入 >
声明变量

下一个子例程将使用若干变量。所有变量都必须在该子例程能够访问它们之前声明。

在 VBA IDE 的“代码”窗口中，紧随 Const pi = 3.14159 行输入下列代码：

Private sp(0 To 2) As Double
Private ep(0 To 2) As Double
Private hwidth As Double
Private trad As Double
Private tspac As Double
Private pangle As Double
Private plength As Double
Private totalwidth As Double
Private angp90 As Double
Private angm90 As Double

现在看一下“代码”窗口顶部的两个下拉列表。这两个列表称为对象框和过程/事件框，当前分别显示了“(通用)”和“(声明)”项。这两个列表显示当前正在处理的代码部分，利用它们只需在列表中进行选择便可快速移动到其他代码部分。(声明) 部分是用于声明要在多个子例程中使用的变量的位置。


输入 gpuser 子例程

声明变量
获取输入
绘制路的轮廓
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 > 获取输入 >
输入 gpuser 子例程

gpuser 子例程提示用户提供绘制花园小路所需要的信息。在 distance 函数后面输入下列代码：

' 获取花园小路的信息
Private Sub gpuser()
    Dim varRet As Variant
    varRet = ThisDrawing.Utility.GetPoint( _
     , "Start point of path: ")
    sp(0) = varRet(0)
    sp(1) = varRet(1)
    sp(2) = varRet(2)
    varRet = ThisDrawing.Utility.GetPoint( _
     , "Endpoint of path: ")
    ep(0) = varRet(0)
    ep(1) = varRet(1)
    ep(2) = varRet(2)
    hwidth = ThisDrawing.Utility. _
     GetDistance(sp, "Half width of path: ")
    trad = ThisDrawing.Utility. _
     GetDistance(sp, "Radius of tiles: ")
    tspac = ThisDrawing.Utility. _
     GetDistance(sp, "Spacing between tiles: ")
    pangle = ThisDrawing.Utility.AngleFromXAxis( _
     sp, ep)
    totalwidth = 2 * hwidth
    plength = distance(sp, ep)
    angp90 = pangle + dtr(90)
    angm90 = pangle - dtr(90)
End Sub
在 gpuser 子例程中，Dim varRet As Variant 一行声明了 varRet 变量。因为该变量仅用在此子例程中，所以可以在此将它声明为局部变量，而不必在 (声明) 部分中声明。
下一行 varRet = ThisDrawing.Utility.GetPoint( , "Start point of path: ") 用于调用 GetPoint 方法。行中的下划线是为了便于阅读较长的行，并告知 VBA 读取下一行时将它视为同一行。将所有代码放在一行中可以删除该下划线。
要访问 GetPoint 方法，必须首先访问代表当前图形的 ThisDrawing 对象。依次输入 ThisDrawing 和句点 (.)，表示要访问该对象中的内容。输入句点后，再输入 Utility 和另一个句点。同样，这表示要访问 Utility 对象中的内容。最后，输入要调用的方法的名称 GetPoint。
GetPoint 方法接收两个参数。第一个参数可选，并且将不会使用它。保留该参数为空，只键入一个逗号以标记它的位置。第二个参数是提示，也是可选的。为该参数输入一个字符串，用于提示用户输入起点。用户输入的点放在 varRet 变量中。该子例程接下来的三行将用户返回的点复制到 sp 数组中。
以同样的方式返回端点。
GetDistance 方法用于获取小路的半宽 (hwidth)、瓷砖的半径 (trad) 和瓷砖之间的间距 (tspac)。GetDistance 方法接收两个参数。第一个参数是基点。这里为该值提供了起点。第二个参数是提示，需要提供一个字符串，用于提示用户提供适当的输入。GetDistance 方法的有趣之处在于：它既可以返回在命令行中输入的值，也可以返回 AutoCAD 中的选定点和起点之间的距离。
该子例程将继续计算若干变量，留待稍后在宏中使用。pangle 变量被设置为从起点到端点的角度，可以使用 AngleFromXAxis 方法找到。将路的半宽乘以 2 可以得到路的宽度。plength 变量被设置为路的长度，可以使用早些时候输入的 distance 函数得到。最后，分别在 angp90 和 angm90 中计算并保存加/减 90 度的路的角度。
下面的图解显示了通过 gpuser 获取的变量如何指定路的尺寸。

保存所做的工作。


绘制路的轮廓

输入 gpuser 子例程
ActiveX/VBA 教程：设计花园小径
绘制瓷砖
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
绘制路的轮廓

现在已经获得了路的位置和宽度，可以绘制它的轮廓了。在 gpuser 子例程下面添加下列代码：

' 绘制路的轮廓
Private Sub drawout()
    Dim points(0 To 9) As Double
    Dim pline As AcadLWPolyline
    Dim varRet As Variant
    varRet = ThisDrawing.Utility.PolarPoint( _
        sp, angm90, hwidth)
    points(0) = varRet(0)
    points(1) = varRet(1)
    points(8) = varRet(0)
    points(9) = varRet(1)
    varRet = ThisDrawing.Utility.PolarPoint( _
        varRet, pangle, plength)
    points(2) = varRet(0)
    points(3) = varRet(1)
    varRet = ThisDrawing.Utility.PolarPoint( _
        varRet, angp90, totalwidth)
    points(4) = varRet(0)
    points(5) = varRet(1)
    varRet = ThisDrawing.Utility.PolarPoint( _
        varRet, pangle + dtr(180), plength)
    points(6) = varRet(0)
    points(7) = varRet(1)
    Set pline = ThisDrawing.ModelSpace. _
     AddLightWeightPolyline(points)
End Sub

此子例程使用 AddLightweightPolyline 方法绘制小路的轮廓。此方法采用一个参数：组成多段线的点阵列。必须找到组成多段线对象的所有点，并将它们按绘制顺序放在数组中。对于该多段线，所需要的点是路的角点。

要找到小路的角点，请使用 PolarPoint 方法。该方法可以找到与基点成给定角度和距离的点。从起点 (sp) 开始，沿逆时针方向找到路的第一个角点。该角点将相距一半路宽 (hwidth)，并与路角度成 -90 度。因为要为该路绘制闭合矩形，所以该点成为数组的第一个也是最后一个点。因此，PolarPoint 方法返回的 X 和 Y 坐标被移动到点数组的第一个和最后一个位置。

使用路的长度和宽度（plength 和 width）以及路的角度以同样方式得到路的其他角点。每次调用 PolarPoint 方法时，返回的坐标 (varRet) 都复制到点数组中。

在点阵列中标识所有角点后，调用 AddLightweightPolyline 方法。请注意，此方法是从 ModelSpace 对象调用的。如果要运行此宏，还将注意到多段线在 AutoCAD 中尚不可见。要使多段线可见，必须更新显示（稍后将做此工作）。


绘制瓷砖

绘制路的轮廓
ActiveX/VBA 教程：设计花园小径
形成宏
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
绘制瓷砖

现在已经开发了用户输入子例程和用于绘制轮廓的子例程，下面将用圆形瓷砖来填充小路。该任务需要一些几何图形。

在 VBA IDE 的“代码”窗口中，在 drawout 子例程后面输入下列代码：

' 按沿小路的给定距离放置一行瓷砖
' 并且可能需要偏移
Private Sub drow(pd As Double, offset As Double)
    Dim pfirst(0 To 2) As Double
    Dim pctile(0 To 2) As Double
    Dim pltile(0 To 2) As Double
    Dim cir As AcadCircle
    Dim varRet As Variant
    varRet = ThisDrawing.Utility.PolarPoint( _
     sp, pangle, pd)
    pfirst(0) = varRet(0)
    pfirst(1) = varRet(1)
    pfirst(2) = varRet(2)
    varRet = ThisDrawing.Utility.PolarPoint( _
     pfirst, angp90, offset)
    pctile(0) = varRet(0)
    pctile(1) = varRet(1)
    pctile(2) = varRet(2)
    pltile(0) = pctile(0)
    pltile(1) = pctile(1)
    pltile(2) = pctile(2)
    Do While distance(pfirst, pltile) < (hwidth - trad)
        Set cir = ThisDrawing.ModelSpace.AddCircle( _
         pltile, trad)
        varRet = ThisDrawing.Utility.PolarPoint( _
         pltile, angp90, (tspac + trad + trad))
        pltile(0) = varRet(0)
        pltile(1) = varRet(1)
        pltile(2) = varRet(2)
    Loop
    varRet = ThisDrawing.Utility.PolarPoint( _
     pctile, angm90, tspac + trad + trad)
    pltile(0) = varRet(0)
    pltile(1) = varRet(1)
    pltile(2) = varRet(2)
    Do While distance(pfirst, pltile) < (hwidth - trad)
        Set cir = ThisDrawing.ModelSpace.AddCircle( _
         pltile, trad)
        varRet = ThisDrawing.Utility.PolarPoint( _
         pltile, angm90, (tspac + trad + trad))
        pltile(0) = varRet(0)
        pltile(1) = varRet(1)
        pltile(2) = varRet(2)
    Loop
End Sub
' 绘制每行瓷砖
Private Sub drawtiles()
    Dim pdist As Double
    Dim offset As Double
    pdist = trad + tspac
    offset = 0
    Do While pdist <= (plength - trad)
        drow pdist, offset
        pdist = pdist + ((tspac + trad + trad) * Sin(dtr(60)))
        If offset = 0 Then
            offset = (tspac + trad + trad) * Cos(dtr(60))
        否则
            offset = 0
        End If
    Loop
End Sub

要理解这些子例程如何工作，请参考下面的图解。子例程 drow 按其第一个参数指定的沿小路的给定距离绘制一行瓷砖，并沿垂直小路方向将行偏移由第二个参数指定的距离。可以交替偏移瓷砖行以覆盖更多空间，并使排列更美观。

drow 子例程使用 PolarPoint 方法找到第一行的位置，并以第一个参数指定的距离沿小路移动。然后该子例程再次使用 PolarPoint 方法沿垂直小路方向移动偏移距离。该子例程使用 While 语句继续绘制圆，直至遇到小路的边。第一个 While 语句中的 PolarPoint 方法按两个瓷砖半径 (trad) 和一个瓷砖间间距 (tspac) 的距离移动到下一个瓷砖的位置。然后第二个 while 循环绘制垂直小路方向的行中的瓷砖，直至遇到另一边。

drawtiles 子例程重复调用 drow 来绘制所有的瓷砖行。该子例程的 While 循环沿小路前进，为每行调用 drow。相邻行的瓷砖构成了等边三角形，如前面的图解所示。这些三角形的边长等于两个瓷砖半径加上一个瓷砖间距。因此，可以利用三角函数进行计算，即两行之间沿小路方向的距离是 60 度正弦乘以边长，奇数行的偏移是 60 度余弦乘以边长。

drawtiles 中使用了 If 语句来实现隔行偏移。如果偏移值为 0，则将它设置为瓷砖中心之间间距乘以 60 度余弦，如前所述。如果偏移值不为 0，则将它设置为 0。这将如希望的那样交替设置行的偏移值。

保存所做的工作。


形成宏

绘制瓷砖
ActiveX/VBA 教程：设计花园小径
单步执行代码
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
形成宏

现在可以将各个子例程合并到 Gardenpath 宏中。在 VBA IDE 的“代码”窗口中，在 drawtiles 子例程后面输入下列代码：

' 执行命令，调用各个函数
Sub gardenpath()
    Dim sblip As Variant
    Dim scmde As Variant
    gpuser
    sblip = ThisDrawing.GetVariable("blipmode")
    scmde = ThisDrawing.GetVariable("cmdecho")
    ThisDrawing.SetVariable "blipmode", 0
    ThisDrawing.SetVariable "cmdecho", 0
    drawout
    drawtiles
    ThisDrawing.SetVariable "blipmode", sblip
    ThisDrawing.SetVariable "cmdecho", scmde
End Sub

path 子例程调用 gpuser 以收集所需的输入。然后将使用 GetVariable 方法获取 BLIPMODE 和 CMDECHO 系统变量的当前值，并将这些值保存为 sblip 和 scmde。然后，该子例程使用 SetVariable 方法将这两个系统变量设置为 0，从而禁用点标记和命令回显。下一步，使用 drawout 和 drawtiles 子例程绘制小路。最后，用 SetVariable 方法将系统变量重新设置为原始值。

从上述代码中可能会注意到，这是所输入的唯一不以私有关键字开始的子例程（私有关键字确保只能从当前模块中调用该子例程）。因为 gardenpath 子例程必须对用户可用，所以应该去掉私有关键字。

保存所做的工作。


单步执行代码

形成宏
ActiveX/VBA 教程：设计花园小径
执行宏
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
单步执行代码

现在运行宏，并在宏执行时单步执行代码。

从 AutoCAD“工具”菜单中，依次单击“宏” [image] “宏”。在“宏”对话框中，选择“ThisDrawing.gardenpath”并单击“逐语句”。

屏幕上显示 VBA IDE，并亮显 gardenpath 宏的第一行。亮显的行是将要执行的代码行。要执行该行，请按 F8 键。下一个要执行的代码行是 gpuser 子例程。要单步执行 gpuser 子例程，请再次按 F8 键。

现在将开始执行 gpuser 子例程。再次按 F8 键以亮显第一个 GetPoint 方法。执行该行前，请通过依次单击“视图” [image] “本地窗口”来打开“本地”窗口。该窗口显示在 VBA IDE 的底部。宏执行时，所有局部变量和它们的值都显示在“本地”窗口中。

现在，按 F8 键以执行 GetPoint 方法。注意到亮显消失，并且没有新代码显示。这是因为 GetPoint 方法正在等待用户在 AutoCAD 中输入点。切换回 AutoCAD 窗口。在命令行中会看到在 GetPoint 调用中指定的提示。输入点。

现在控制权返回到宏。GetPoint 方法调用后面的行被亮显。通过按 F8 键继续单步执行代码。记住在输入信息时切换回 AutoCAD 窗口。


执行宏

单步执行代码
ActiveX/VBA 教程：设计花园小径
添加对话框界面
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
执行宏

不必每次运行宏时都单步执行代码。通过依次单击“宏” [image] “宏”，选择一个宏，然后单击“运行”，可以从“工具”菜单中运行宏。这样可以查看用户在执行该宏时所看到的执行流程。从 AutoCAD 中运行该宏，输入下列值：

路的起点: 2,2

路的终点: 9,8

路的半宽: 2

瓷砖的半径: 0.2

瓷砖之间的间距: 0.1

该样例应绘制如下图所示的花园小路：

可以通过指定不同的输入来试验 Gardenpath 宏。


添加对话框界面

执行宏
ActiveX/VBA 教程：设计花园小径
创建对话框
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 >
添加对话框界面

上面编写的 Gardenpath 宏用于接受命令行输入。要添加对话框，请使用 VBA IDE 中的窗体。

首先，将所完成的 gardenpath.dvb 复制到另一个文件 gpdialog.dvb 中。然后将 gpdialog.dvb 拖动到 AutoCAD 中。

本节内容

  • 创建对话框
  • 使用“工程”窗口浏览工程
  • 更新现有代码
  • 向对话框中添加代码


创建对话框

添加对话框界面
添加对话框界面
使用“工程”窗口浏览工程
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 > 添加对话框界面 >
创建对话框

创建的对话框包含两个选项按钮（如果选择其中一个，将清除另一个），用于选择瓷砖的形状：圆或多边形。对话框还包含三个文本框，用于输入以下数值：瓷砖的半径、瓷砖之间的间距和瓷砖的边数（只有选定“多边形”选项按钮才可用）。

从 VBA IDE 中创建对话框的步骤

  1. 在“插入”菜单中，单击“用户窗体”打开一个新窗体。将显示两个窗口、一个工具箱和一个空用户窗体。
  2. 从工具箱中依次选择并拖动下列控件，将它们放到用户窗体中。如下面的窗体所示放置两个选项按钮 (

    )、三个标签 (

    )、三个文本框 (

    ) 和两个命令按钮 (

    )：

  3. 关闭工具箱。

为单选按钮控件设置特性的步骤

  1. 在用户窗体中，选择“OptionButton1”控件。在“视图”菜单中，单击“特性窗口”，为 OptionButton1 更改下列特性：

    (名称) = gp_poly

    Caption = Polygon

    ControlTipText = Polygon Tile Shape

    Accelerator = P

  2. 在用户窗体中，选择“OptionButton2”控件。在“特性”窗口中，为 OptionButton2 更改下列特性：

    (名称) = gp_circ

    Caption = Circle

    ControlTipText = Circle Tile Shape

    Accelerator = I

为标签控件设置特性的步骤

  1. 在用户窗体中，选择“Label1”控件。在“特性”窗口中，为 Label1 更改下列特性：

    (名称) = label_trad

    Caption = Radius of tiles

    TabStop = True

  2. 在用户窗体中，选择“Label2”控件。在“特性”窗口中，为 Label2 更改下列特性：

    (名称) = label_tspac

    Caption = Space between tiles

    TabStop = True

  3. 在用户窗体中，选择“Label3”控件。在“特性”窗口中，为 Label3 更改下列特性：

    (名称) = label_tsides

    Caption = Number of sides

    TabStop = True

为文本框控件设置特性的步骤

  1. 在用户窗体中，选择“TextBox1”控件。在“特性”窗口中，为 TextBox1 更改下列特性：

    (名称) = gp_trad

  2. 在用户窗体中，选择“TextBox2”控件。在“特性”窗口中，为 TextBox2 更改下列特性：

    (名称) = gp_tspac

  3. 在用户窗体中，选择“TextBox3”控件。在“特性”窗口中，为 TextBox3 更改下列特性：

    (名称) = gp_tsides

为命令按钮控件和窗体窗口设置特性的步骤

  1. 在用户窗体中，选择“CommandButton1”控件。在“特性”窗口中，更改 CommandButton1 的下列特性：

    (名称) = accept

    Caption = OK

    ControlTipText = Accept the options

    Accelerator = O

    Default = True

  2. 在用户窗体中，选择“CommandButton2”控件。在“特性”窗口中，更改 CommandButton2 的下列特性：

    (名称) = cancel

    Caption = Cancel

    ControlTipText = Cancel the operation

    Accelerator = C

  3. 在窗体背景中所有控件之外的位置单击以选择用户窗体。在“特性”窗口中，更改窗体的下列特性：

    (名称) = gpDialog

    Caption = Garden Path

    现在窗体应如下所示：

  4. 保存所做的工作。


使用“工程”窗口浏览工程

创建对话框
添加对话框界面
更新现有代码
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 > 添加对话框界面 >
使用“工程”窗口浏览工程

在 VBA IDE 中，“工程”窗口中包含工程的名称和位置、一个名为“AutoCAD 对象”的文件夹和一个名为“窗体”的文件夹。（可能需要单击“切换文件夹”来查看文件夹。）打开“AutoCAD 对象”文件夹时（可能已打开)，将看到一个图形图标和名称 ThisDrawing。打开“窗体”文件夹时（可能已经打开)，将看到一个窗体图标和名称 gpDialog，即所创建的窗体。

可以使用“工程”窗口浏览代码并帮助识别当前的工作位置。例如，要查看与创建的窗体关联的代码，可以在“工程”窗口中亮显 gpDialog 并单击“查看代码”。

将显示该窗体的“代码”窗口。

现在在“工程”窗口中亮显 ThisDrawing。可以单击“查看代码”来查看其代码。所输入的全部代码将显示在该窗口中。


更新现有代码

使用“工程”窗口浏览工程
添加对话框界面
向对话框中添加代码
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 > 添加对话框界面 >
更新现有代码

前面已经创建了对话框，现在可以修改或添加代码。

修改现有代码的步骤

  1. 打开 ThisDrawing 的代码（如果尚未打开）。
  2. 更新 Declarations 部分的下列行：
    Public trad As Double ' 已更新
    Public tspac As Double ' 已更新
    Public tsides As Integer ' 新增
    Public tshape As String ' 新增

    因为窗体中的代码要访问 trad 和 tspac，所以需要更新它们的定义使其成为公有变量。私有变量仅在其被定义的模块中可用，因此需要将私有变量变为公有。此外，已经添加表示多边形瓷砖边数的 tsides，和表示用户选择的瓷砖形状（圆形或多边形）的tshape。

  3. 转到 gpuser 子例程。删除包含瓷砖的半径和瓷砖之间间距的两行（因为这些信息现在来自窗体），即：
    trad = ThisDrawing.Utility. _
         GetDistance(sp, "Radius of tiles: ")
    tspac = ThisDrawing.Utility. _
         GetDistance(sp, "Spacing between tiles: ")
  4. 添加用于加载和显示窗体的行。在步骤 3 中删除行的位置处添加下列行：
    Load gpDialog
    gpDialog.Show
  5. 在绘制圆形瓷砖或多边形瓷砖的代码文件的末尾添加子例程：
    ' 用指定的形状绘制瓷砖
    Sub DrawShape(pltile)
        Dim angleSegment As Double
        Dim currentAngle As Double
        Dim angleInRadians As Double
        Dim currentSide As Integer
        Dim varRet As Variant
        Dim aCircle As AcadCircle
        Dim aPolygon As AcadLWPolyline
        ReDim points(1 To tsides * 2) As Double
        ' 基于要绘制的形状类型来控制不同情况
        Select Case tshape
        Case "Circle"
            Set aCircle = ThisDrawing.ModelSpace. _
                          AddCircle(pltile, trad)
        Case "Polygon"
            angleSegment = 360 / tsides
            currentAngle = 0
            For currentSide = 0 To (tsides - 1)
                angleInRadians = dtr(currentAngle)
                varRet = ThisDrawing.Utility.PolarPoint(pltile, _
                         angleInRadians, trad)
                points((currentSide * 2) + 1) = varRet(0)
                points((currentSide * 2) + 2) = varRet(1)
                currentAngle = currentAngle + angleSegment
            Next currentSide
            Set aPolygon = ThisDrawing.ModelSpace. _
                            AddLightWeightPolyline(points)
            aPolygon.Closed = True
        End Select
    End Sub

    该子例程使用 Select Case 语句基于要绘制的形状类型来控制程序的不同情况。tshape 变量用于确定形状类型。

  6. 下一步，转到 drow 子例程。找到下面一行所出现的两处位置：
    Set cir = ThisDrawing.ModelSpace.AddCircle(pltile, trad)

    更改这些行以绘制适当形状的瓷砖，如下所示：

    DrawShape (pltile) ' 已更新


向对话框中添加代码

更新现有代码
添加对话框界面
Visual LISP 与 ActiveX/VBA 的比较
ActiveX/VBA 开发人员手册 > ActiveX/VBA 教程：设计花园小径 > 添加对话框界面 >
向对话框中添加代码

现在删除创建圆形瓷砖的代码，转而调用 DrawShape 子例程来绘制适当的形状。

为对话框添加事件处理程序的步骤

  1. 打开 gpDialog 的“代码”窗口。
  2. 在窗口的顶部输入下列代码：
    Private Sub gp_poly_Click()
        gp_tsides.Enabled = True
        ThisDrawing.tshape = "Polygon"
    End Sub
    Private Sub gp_circ_Click()
        gp_tsides.Enabled = False
        ThisDrawing.tshape = "Circle"
    End Sub

    注意，子例程 gp_poly_Click() 和 gp_circ_Click() 是按照前面添加的两个选项控件命名的，并且附加了“_Click”。这些子例程在用户单击相应控件时会自动执行。还要注意，对象框按“名称”特性的字母顺序列出了窗体中的控件。

  3. 将光标放在 Private Sub gp_poly_Click() 行并打开过程/事件框。

    查看可以为 gp_poly 选项控件响应的所有事件的列表。输入的两个子例程将处理 Click 事件。还可以添加响应 DblClick 事件的代码，当用户双击该控件时，将自动执行这一代码。可以为任何列出的事件添加代码。这些类型的子例程称为事件处理程序。

    查看为这两个事件处理程序输入的代码。第一个事件处理程序响应 gp_poly 选项控件的 Click 事件。代码的第一行启用了用于输入边数的文本框。该文本框仅适用于多边形，所以如果未选择“多边形”控件，它将被禁用。代码的下一行将 tshape 变量设置为“多边形”。

    第二个事件处理程序响应 gp_circ 选项控件的 Click 事件。该处理程序禁用了用于输入边数的文本框，并将 tshape 变量设置为“圆形”。

  4. 为“确定”按钮添加下列事件处理程序：
    Private Sub accept_Click()
        If ThisDrawing.tshape = "Polygon" Then
            ThisDrawing.tsides = CInt(gp_tsides.text)
            If (ThisDrawing.tsides < 3#) Or _
                             (ThisDrawing.tsides > 1024#) Then
                MsgBox "Enter a value between 3 and " & _
                        "1024 for the number of sides."
                Exit Sub
            End If
        End If
        ThisDrawing.trad = CDbl(gp_trad.text)
        ThisDrawing.tspac = CDbl(gp_tspac.text)
        If ThisDrawing.trad < 0# Then
            MsgBox "Enter a positive value for the radius."
            Exit Sub
        End If
        If (ThisDrawing.tspac < 0#) Then
            MsgBox "Enter a positive value for the spacing."
            Exit Sub
        End If
        GPDialog.Hide
    End Sub

    该代码测试最后选择的形状是否为多边形。如果是，代码从 gp_tsides 控件中检索边数。用户输入的值存储在“Text”特性中。因为它是作为文字字符串存储的，所以可以使用 CInt 函数将该字符串转换为等价的整数。得到整数后，事件处理程序将测试该值的范围以确定它是否在 3 到 1024 之间。如果超出范围，将显示一条消息，并且事件处理程序将退出而不做进一步处理。其结果是显示一条消息，并提供用户更改该值的机会。再次单击“确定”按钮后，会再次触发该事件处理程序并测试值。

    该宏获取半径和间距值，但这些值是双精度的，不是整数，并且是用 CDbl 函数获取的。这些值也被测试以确保是正数。

    获取并验证这些值后，gpDialog.Hide 语句将隐藏窗体，并将控制权传递回首次调用该窗体的子例程。

  5. 为“取消”按钮添加下列事件处理程序：
    Private Sub cancel_Click()
        Unload Me
        End
    End Sub

    这一简单的事件处理程序用于卸载窗体并结束整个宏。

    现在唯一未做的事是为窗体添加初始值。有一个应用于窗体的称为 Initialize 的事件。首次加载窗体时将执行该事件。

  6. 为窗体初始化添加下列事件处理程序：
    Private Sub UserForm_Initialize()
        gp_circ.Value = True
        gp_trad.Text = ".2"
        gp_tspac.Text = ".1"
        gp_tsides.Text = "5"
        gp_tsides.Enabled = False
        ThisDrawing.tsides = 5
    End Sub

该代码为窗体和 tsides 变量设置初始值。tsides 变量必须设置为大于 3 的正数，即使用户选择了圆形。要了解其中原因，请查看早些时候输入的 DrawShape 子例程。那里有一个使用多边形的边数定义的称为 points 的变量。无论是否要求多边形形状，该变量都会获取分配给它的内存。因此，必须为 tsides 定义一个有效范围。在宏执行期间，用户可以自由更改该值。

现在可以保存该宏并从 AutoCAD 运行它。


Visual LISP 与 ActiveX/VBA 的比较

向对话框中添加代码
Visual LISP 与 ActiveX/VBA 的比较
ActiveX/VBA 开发人员手册 >
Visual LISP 与 ActiveX/VBA 的比较

Visual LISP 接口中的大部分功能都可以在 ActiveX 和 VBA 接口中找到。本附录为帮助熟悉 Visual LISP 的开发者了解等价的 ActiveX 和 VBA 功能提供了参考。

本节内容

  • Visual LISP 与 ActiveX/VBA 的比较


Visual LISP 与 ActiveX/VBA 的比较
Visual LISP 与 ActiveX/VBA 的比较
ActiveX/VBA 开发人员手册 > Visual LISP 与 ActiveX/VBA 的比较 >
Visual LISP 与 ActiveX/VBA 的比较

以下表格比较了 Visual LISP 函数与类似的 ActiveX®、VBA 和 Visual Basic 6 函数和运算符。“AutoCAD.Application”表示 ActiveX Automation 的等效项。Visual Basic 6 等效项作为函数或运算符列出。

Visual LISP 与 ActiveX/VBA 的比较
AutoLISP 函数 | ActiveX、VBA 或 Visual Basic 6 等价对象
+（加） | +（加运算符）
-（减） | -（减运算符）
*（乘） | *（乘运算符）
/（除） | /（除运算符）
=（等于） | =（等于比较运算符）
/=（不等于） | <>（不等于比较运算符）
<（小于） | <（小于比较运算符）
<=（小于或等于） | <=（小于等于比较运算符）
/=（不等于） | <>（不等于比较运算符）
>（大于） | >（大于比较运算符）
>= （大于或 等于） | >=（大于等于比较运算符）
~（按位取反） | 非运算符
1+（递增） | 使用 +（加运算符）
1-（递减） | 使用 -（减运算符）
abs | Abs 函数
acad_colordlg | 未提供
acad_helpdlg | 在联机帮助索引中搜索 HELP
acad_strlsort | 在联机帮助索引中搜索 SORT
action_tile | 使用对话框编辑器
add_list | 使用对话框编辑器
ads | AutoCAD.Application.ListADS 方法
alert | MsgBox 函数
and | 与运算符
angle | AutoCAD.Application.ActiveDocument.Utility. AngleFromXAxis 方法
angtof | AutoCAD.Application.ActiveDocument.Utility.AngleToReal 方法
angtos | AutoCAD.Application.ActiveDocument.Utility. AngleToString 方法
append | 使用数组操作函数
apply | 未提供
arx | AutoCAD.Application.ListARX 方法
arxload | AutoCAD.Application.LoadARX 方法
arxunload | AutoCAD.Application.UnloadARX 方法
ascii | Asc 函数
assoc | 未提供
atan | Atn 函数
atof | CDbl 函数
atoi | CInt 函数
atom | 在联机帮助索引中搜索 IS
atoms-family | 未提供
autoarxload | 未提供
autoload | 未提供
Boole | 使用逻辑运算符
boundp | 在联机帮助索引中搜索 IS
car/cdr | 使用数组操作函数
chr | Chr 函数
client_data_tile | 使用对话框编辑器
close | AutoCAD.Application.Documents.Close 方法
command | AutoCAD.ActiveDocument.SendCommand 方法
cond | Select Case 语句
cons | 使用数组操作函数或 AutoCAD.Application.collection.Add<图元名称> 方法
cos | Cos 函数
cvunit | 使用转换函数
defun | 关键字函数和 End 函数
dictadd | AutoCAD.Application.ActiveDocument.Dictionaries.Add 方法
dictnext | AutoCAD.Application.ActiveDocument.Dictionaries.Item 方法
dictremove | AutoCAD.Application.ActiveDocument.Dictionaries. Dictionary.Delete 方法
dictrename | AutoCAD.Application.ActiveDocument.Dictionaries. Dictionary.Rename 方法
dictsearch | AutoCAD.Application.ActiveDocument.Dictionaries. Dictionary.GetName 和 GetObject 方法
dimx_tile 和 dimy_tile | 使用对话框编辑器
distance | AutoCAD.Application.Utility.GetDistance，用于交互式方法。
distof | 未提供
done_dialog | 使用对话框编辑器
end_image | 使用对话框编辑器
end_list | 使用对话框编辑器
entdel | AutoCAD.Application.ActiveDocument.collection_object. Delete 方法
entget | AutoCAD.Application.ActiveDocument.collection_object. property 特性
entlast | AutoCAD.Application.ActiveDocument.Modelspace. Item（总数 - 1）
entmake | AutoCAD.Application.ActiveDocument.Modelspace. Add<图元名称> 方法
entmakex | AutoCAD.Application.ActiveDocument.Modelspace. Add<图元名称> 方法
entmod | 使用对象的任何读写特性
entnext | AutoCAD.Application.ActiveDocument.collection.Item 方法
entsel | AutoCAD.Application.ActiveDocument.SelectionSets 对象/方法/特性
entupd | AutoCAD.Application.ActiveDocument.Modelspace.object. Update 方法
eq | 未提供
equal | Eqv 运算符
*error* | Error 对象/方法/特性
eval | 未提供
exit | AutoCAD.Application.Quit 方法
exp | Exp 函数
expand | 未提供
expt | ^（指数运算符）
fill_image | 使用对话框编辑器
findfile | Dir 函数
fix | Fix、Int、Cint 函数
float | CDbl 函数
foreach | For Each...Next 语句
gc | AutoCAD.Application.ActiveDocument.PurgeAll
gcd | 未提供
get_attr | 使用对话框编辑器
get_tile | 使用对话框编辑器
getangle | AutoCAD.Application.ActiveDocument.Utility.GetAngle 方法
getcfg | AutoCAD.Application.Preferences.property 特性
getcname | 未提供
getcorner | AutoCAD.Application.ActiveDocument.Utility.GetCorner 方法
getdist | AutoCAD.Application.ActiveDocument.Utility.GetDistance 方法
getenv | AutoCAD.Application.Preferences.property 特性
getfiled | 使用文件对话框
getint | AutoCAD.Application.ActiveDocument.Utility.GetInteger 方法
getkword | AutoCAD.Application.ActiveDocument.Utility.GetKeyword 方法
getorient | AutoCAD.Application.ActiveDocument.Utility. GetOrientation 方法
getpoint | AutoCAD.Application.ActiveDocument.Utility.GetPoint 方法
getreal | AutoCAD.Application.ActiveDocument.Utility.GetReal 方法
getstring | AutoCAD.Application.ActiveDocument.Utility.GetString 方法
getvar | AutoCAD.Application.GetVariable 方法
graphscr | AppActivate AutoCAD.Application.Caption
grclear | Obsolete 函数
grdraw | 未提供
grread | 未提供
grtext | AutoCAD.Application.ActiveDocument.Utility.Prompt
grvecs | 未提供
handent | AutoCAD.Application.ActiveDocument.ModelSpace.object. Handle 特性
help | 在联机帮助索引中搜索 HELP
if | If… Then… Else 语句
initget | AutoCAD.Application.ActiveDocument.Utility. InitializeUserInput
inters | AutoCAD.Application.ActiveDocument.Modelspace.object. IntersectWith
itoa | Str 函数
lambda | 未提供
last | arrayname(UBound(arrayname))
length | UBound 函数
list | ReDim 语句
listp | IsArray 函数
load_dialog | 使用对话框编辑器
load | Automation 不支持 AutoLISP
log | Log 函数
logand | And 函数
logior | Or 函数
lsh | Imp 函数
mapcar | 未提供
max | Max 函数
mem | 未提供
member | 使用集合
menucmd | AutoCAD.Application.MenuBar 对象
menugroup | AutoCAD.Application.MenuGroup 对象
min | Min 函数
minusp | 使用 < 0 语法
mode_tile | 使用对话框编辑器
namedobjdict | AutoCAD.Application.ActiveDocument.Dictionaries 集合
nentsel | AutoCAD.Application.ActiveDocument.SelectionSets. SelectionSet.SelectAtPoint 方法
nentselp | AutoCAD.Application.ActiveDocument.SelectionSets. SelectionSet.SelectAtPoint 方法
new_dialog | 使用对话框编辑器
not | 使用逻辑运算符
nth | 使用 object(n) 语法
null | IsNull 函数
numberp | TypeName 函数
open | Open 函数
or | 使用逻辑运算符
osnap | 未提供（用户可以使用 SetVariable 方法控制 OSMODE 系统变量。）
polar | AutoCAD.Application.ActiveDocument.Utility.PolarPoint 方法
prin1 | AutoCAD.Application.ActiveDocument.Utility.Prompt
princ | AutoCAD.Application.ActiveDocument.Utility.Prompt
print | AutoCAD.Application.ActiveDocument.Utility.Prompt
progn | 未提供
prompt | AutoCAD.Application.ActiveDocument.Utility.Prompt
quit | AutoCAD.Application.Quit 方法
quote | 未提供
read | 未提供
read-char | Input 函数
read-line | 行输入函数
redraw | AutoCAD.Application.ActiveDocument.Modelspace.object. Update 方法
regapp | AutoCAD.Application.ActiveDocument. RegisteredApplications.Add 方法
rem | Mod 函数
repeat | For… Each, While,
reverse | 未提供
rtos | AutoCAD.Application.ActiveDocument.Utility.RealToString 方法
set | Set 函数
set_tile | 使用对话框编辑器
setcfg | AutoCAD.Application.Preferences.property 特性
setfunhelp | 未提供
setq | Set 函数
setvar | AutoCAD.Application.SetVariable 方法
sin | Sin 函数
setview | AutoCAD.Application.ActiveDocument.Viewports.Viewport. SetView 方法
slide_image | 使用对话框编辑器
snvalid | 未提供
sqrt | Sqr 函数
ssadd | AutoCAD.Application.ActiveDocument.SelectionSets.Add 方法
ssdel | AutoCAD.Application.ActiveDocument.SelectionSets. SelectionSet.Delete 方法
ssget | AutoCAD.Application.ActiveDocument.SelectionSets. SelectionSet.SelectOnScreen 方法
ssgetfirst | 未提供
sslength | AutoCAD.Application.ActiveDocument.SelectionSets. SelectionSet.Count 方法
ssmemb | 比较对象的 ID 和 SelectionSet 成员
ssname | AutoCAD.Application.ActiveDocument.SelectionSets. SelectionSet.Name 特性
ssnamex | 未提供
sssetfirst | AutoCAD.Application.ActiveDocument.PickfirstSelectionSet
startapp | Shell 函数
start_dialog | 使用对话框编辑器
start_image | 使用对话框编辑器
start_list | 使用对话框编辑器
strcase | StrConv 函数
strcat | & 运算符
strlen | Len 函数
subst | 未提供
substr | Mid 函数
tablet | 未提供
tblnext | AutoCAD.Application.ActiveDocument.collection_object. Item 方法
tblobjname | AutoCAD.Application.ActiveDocument.collection_object. Name 方法
tblsearch | AutoCAD.Application.ActiveDocument.collection_object. Name 方法
term_dialog | 使用对话框编辑器
terpri | 未提供
textbox | AutoCAD.Application.ActiveDocument.space.object. GetBoundingBox 方法
textpage | 未提供
textscr | 未提供
trace | 未提供
trans | AutoCAD.Application.ActiveDocument.Utility. TranslateCoordinates 方法
type | TypeName 函数
unload_dialog | 使用对话框编辑器
untrace | 未提供
vector_image | 使用对话框编辑器
ver | AutoCAD.Application.Version 特性
vports | AutoCAD.Application.ActiveDocument.Viewports 集合
wcmatch | Like 运算符
while | While… Wend
write-char | Print 函数
write-line | Print 函数
xdroom | 未提供
xdsize | 未提供
zerop | 使用 = 0 语法


评论？

请使用该表格将注释发送至负责该文档的 Autodesk 技术出版组。

主题标题和位置（请勿编辑）：
姓名（可选）：
         电子邮件（可选）：
评论：

注意：该表并不作为用户接收反馈或技术支持的途径。用户提供的信息可使我们将来更好地更新该文档。谢谢！