Dynamo for Civil 3D 包含一个非常强大的机制,用于“记住”每个节点创建的对象。此机制称为 “对象绑定”,它使 Dynamo 图形能够每次在同一文档中运行时生成一致的结果。尽管这一机制在许多情况下都是非常需要的,但在其他情况下,您可能希望更好地控制 Dynamo 的行为。本部分将帮助您了解对象绑定的工作方式以及如何利用它。
请考虑此图形,该图形会在模型空间中的当前图层上创建一个圆。
注意半径发生更改时会出现什么情况。
这是正在进行对象绑定。Dynamo 的默认行为是_修改_圆的半径,而不是每次半径输入发生更改时都创建一个新圆。这是因为 Object.ByGeometry 节点“记住”:每次运行图形时,它都创建此_特定_圆。此外,Dynamo 会存储此信息,以便下次打开 Civil 3D 文档并运行图形时,它将具有完全相同的行为。
让我们看一个示例,在其中您可能希望更改 Dynamo 的默认对象绑定行为。假定您要构建一个将文字放置在圆中间的图形。但您使用此图形的目的是,该图形可以反复不断地运行,并每次为选定的任何圆都放置新文字。该图形可能如下所示。
但是,当选择其他圆时,实际上会发生这种情况。
似乎每次运行图形时都会删除并重新创建文字。实际上,文字的位置会根据选择的圆进行_修改_。如此一来,就是文字相同,位置却不同!为了每次都创建新文字,我们需要修改 Dynamo 的对象绑定设置,以便不保留绑定数据(请参见下文的#binding-settings)。
进行更改后,我们会获得所需的行为。
Dynamo for Civil 3D 允许通过 “Dynamo” 菜单中的 “绑定数据存储” 设置来修改默认对象绑定行为。
请注意,“绑定数据存储”选项在 Civil 3D 2022.1 及更高版本中可用。
默认情况下,所有选项都处于启用状态。以下是每个选项的作用摘要。
启用此选项后,Dynamo 将“忘记”上次运行图形时创建的对象。因此,图形可以在任何情况下在任何图形中运行,每次都会创建新对象。
何时使用
如果希望 Dynamo“忘记”以前运行时所执行的所有操作并每次都创建新对象,请使用此选项。
此选项意味着对象绑定元数据会在保存时序列化到图形(.dyn 文件)中。如果关闭/重新打开图形并在同一图形中运行该图形,则所有操作都应与离开时相同。如果在其他图形中运行图形,则绑定数据会从该图形中删除,并创建新对象。这意味着,如果打开原始图形并再次运行图形,则除了旧对象外,还会创建新对象。
何时使用
如果希望 Dynamo“记住”上次它在特定图形中运行时创建的对象,请使用此选项。
此选项最适合在 特定图形 和 Dynamo 图形之间保持 1:1 关系的情况。选项 1 和 3 更适用于设计为在多个图形上运行的图形。
此选项类似于选项 2,不同之处在于对象绑定数据在图形中序列化,而不是在图形(.dyn 文件)中序列化。如果关闭/重新打开图形并在同一图形中运行该图形,则所有操作都应与离开时相同。如果在其他图形中运行图形,则由于绑定数据保存在图形 (drawing)(而不是图形 (graph))中,因此该绑定数据仍保留在原始图形中。
何时使用
如果要在多个图形中使用相同的图形,并让 Dynamo“记住”它在每个图形中执行的操作,请使用此选项。
使用此选项时,首先要注意的是,当通过主 Dynamo 界面运行图形时,该选项对图形与图形的交互方式没有影响。_仅_当使用 Dynamo 播放器运行图形时,此选项才适用。
如果您对使用 Dynamo 播放器不熟悉,请参见 Dynamo 播放器部分。
如果使用主 Dynamo 界面运行图形,然后关闭并使用 Dynamo 播放器运行同一图形,则它将在之前创建的对象之上创建新对象。但是,Dynamo 播放器执行一次图形后,该播放器将序列化图形中的对象绑定数据。因此,如果通过 Dynamo 播放器多次运行图形,则该播放器会更新对象,而不是创建新对象。如果通过 Dynamo 播放器对其他图形运行图形,则由于绑定数据保存在图形 (drawing)(而不是图形 (graph))中,因此该绑定数据仍保留在原始图形中。
何时使用
如果要在多个图形中使用 Dynamo 播放器运行图形,并让它“记住”在每个图形中执行的操作,请使用此选项。
随着时间的推移,您可能会发现自己需要超越基础知识,深入了解 Dynamo 的内部运作。本部分中的页面将为您提供一个用于解锁 Dynamo for Civil 3D 中高级功能的蓝图,以便您可以将图形处理提升到更高级别。
虽然 Dynamo 是一款功能非常强大的可视化编程工具,但也可以越过节点和导线,以文本形式编写代码。有两种方法可以执行此操作:
使用代码块编写 DesignScript
使用 Python 节点编写 Python
本部分将重点介绍如何在 Civil 3D 环境中利用 Python,来利用 AutoCAD 和 Civil 3D .NET API。
有关如何在 Dynamo 中使用 Python 的更多常规信息,请参见 Python部分。
AutoCAD 和 Civil 3D 都提供了多个 API,使像您这样的开发人员能够使用自定义功能扩展核心产品。在 Dynamo 的上下文中,相关的托管 .NET API 可用。以下链接对于了解 API 的结构及其工作方式至关重要。
在您浏览此部分时,可能会有一些您不熟悉的概念(如数据库、事务、方法、特性等)。其中许多概念是使用 .NET API 的核心,并不是 Dynamo 或 Python 特有的。本 Primer 的此部分不会详细讨论这些项目,因此建议您经常参见上述链接以了解详细信息。
当第一次编辑一个新的 Python 节点时,该节点会预填充模板代码以便于您快速开始。以下是模板的详细介绍,其中包含有关每个块的说明。
输入
sys
和clr
模块,这两个模块都是 Python 解释器能够正常运行所必需的。特别是,clr
模块使 .NET 名称空间能够基本上被视为 Python 软件包。加载标准程序集(即 DLL),以使托管 .NET API 能够用于 AutoCAD 和 Civil 3D。
添加对标准 AutoCAD 和 Civil 3D 名称空间的引用。这些引用分别相当于 C# 或 VB.NET 中的
using
或Imports
指令。可使用名为
IN
的预定义列表来访问节点的输入端口。可以使用特定端口的索引号来访问该端口中的数据(例如,dataInFirstPort = IN[0]
)。获取活动文档和编辑器。
锁定文档并启动数据库事务。
在此应放置脚本的大部分逻辑。
在主要工作完成后,取消注释此行以提交事务。
如果要输出节点中的任何数据,请在脚本末尾将该节点指定给
OUT
变量。
要自定义?
可以通过编辑位于 C:\ProgramData\Autodesk\C3D <version>\Dynamo
中的 PythonTemplate.py
文件,来修改默认 Python 模板。
让我们通过一个示例来演示在 Dynamo for Civil 3D 中编写 Python 脚本的一些基本概念。
以下是可以在本次练习中参照的示例文件。
下面概述了此图形中的逻辑。
查看 Civil 3D API 文档
按图层名称选择文档中的所有汇流
“展开”Dynamo 对象以访问 Civil 3D API 内部成员
从 AutoCAD 点创建 Dynamo 点
从点创建 PolyCurve
开始吧!
在我们开始构建图形和编写代码之前,最好先查看 Civil 3D API 文档,了解 API 的可用内容。在这种情况下,Catchment 类中有一个特性,该特性会返回汇流的边界点。请注意,此特性会返回一个 Point3dCollection
对象,而 Dynamo 并不会知道该如何处理该对象。换句话说,我们将无法从 Point3dCollection
创建 PolyCurve,因此最终需要将所有内容都转换为 Dynamo 点。稍后会对此进行详细介绍。
现在,我们可以开始构建图形逻辑。首先,获取文档中所有汇流的列表。有节点可用于此操作,因此我们不需要将其包含在 Python 脚本中。使用节点可以为可能读取图形的其他人提供更好的可见性(而不是在 Python 脚本中隐藏大量代码),它还使 Python 脚本能够专注于一件事:返回汇流的边界点。
请注意,All Objects on Layer 节点的输出内容是 CivilObject 的列表。这是因为 Dynamo for Civil 3D 当前没有任何用于处理汇流的节点,这正是我们需要通过 Python 访问 API 的原因。
在进一步介绍之前,我们需要简要介绍一个重要概念。在节点库部分中,我们讨论了 Objects 和 CivilObject 之间的关系。对此详加说明,Dynamo Object 是 AutoCAD Entity 的包裹器。同样,Dynamo CivilObject 是 Civil 3D Entity 的包裹器。可以通过访问对象的 InternalDBObject
或 InternalObjectId
特性来“展开”该对象。
根据经验,通常使用 InternalObjectId
特性获取对象 ID,然后在事务中访问包裹对象更安全。这是因为 InternalDBObject
特性会返回一个不处于可写状态的 AutoCAD DBObject。
以下是一个完整的 Python 脚本,用于访问内部汇流对象以获取其边界点。亮显行表示基于默认模板代码修改/添加的行。
单击脚本中带下划线的文字,可了解每行的说明。
根据经验,最好将大部分脚本逻辑包含在事务中。这可确保安全访问脚本正在读/写的对象。在许多情况下,忽略事务可能会导致出现致命错误。
在此阶段,Python 脚本应该会输出可在后台预览中看到的 Dynamo 点列表。最后一步是从这些点创建 PolyCurve。请注意,这也可以直接在 Python 脚本中完成,但我们有意将其放置在脚本之外的节点中,以便它更明显。最终图形如下所示。
以下最终的 Dynamo 几何图形。
在我们结束之前,作一个简短说明。根据您正在使用的 Civil 3D 版本,Python 节点的配置可能会有所不同。在 Civil 3D 2020 和 2021 中,Dynamo 使用名为 IronPython 的工具在 .NET 对象和 Python 脚本之间移动数据。但在 Civil 3D 2022 中,Dynamo 转变为使用标准的本地 Python 解释器(也称为 CPython),而不是使用 Python 3。此转变的好处包括能够访问常用现代库和新平台功能、基本维护和安全修补程序。
可以在 Dynamo 博客上,详细了解此转变以及如何升级旧脚本。如果要继续使用 IronPython,只需使用 Dynamo Package Manager 安装 DynamoIronPython2.7 软件包。
此行从 Dynamo 几何图形库中获取我们需要的特定类。请注意,我们在此处指定 import Point as DynPoint
而不是 import *
,因为后者会引发命名冲突。
在此处,我们准确指定哪个输入端口包含我们需要的数据,而不是使用默认的 IN
,后者指的是所有输入的整个列表。
获取图形中所有汇流的边界几何图形。
Dynamo 类型 | 包裹 |
---|---|
任务完成!
Object Autodesk.AutoCAD.DynamoNodes.Object
Entity Autodesk.AutoCAD.DatabaseServices.Entity
CivilObject Autodesk.Civil.DynamoNodes.CivilObject
Entity Autodesk.Civil.DatabaseServices.Entity