Python 和 Civil 3D
Last updated
Last updated
虽然 Dynamo 是一款功能非常强大的可视化编程工具,但也可以越过节点和导线,以文本形式编写代码。有两种方法可以执行此操作:
使用代码块编写 DesignScript
使用 Python 节点编写 Python
本部分将重点介绍如何在 Civil 3D 环境中利用 Python,来利用 AutoCAD 和 Civil 3D .NET API。
AutoCAD 和 Civil 3D 都提供了多个 API,使像您这样的开发人员能够使用自定义功能扩展核心产品。在 Dynamo 的上下文中,相关的托管 .NET API 可用。以下链接对于了解 API 的结构及其工作方式至关重要。
当第一次编辑一个新的 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
变量。
让我们通过一个示例来演示在 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
特性来“展开”该对象。
Object Autodesk.AutoCAD.DynamoNodes.Object
Entity Autodesk.AutoCAD.DatabaseServices.Entity
CivilObject Autodesk.Civil.DynamoNodes.CivilObject
Entity Autodesk.Civil.DatabaseServices.Entity
根据经验,通常使用 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。此转变的好处包括能够访问常用现代库和新平台功能、基本维护和安全修补程序。