为什么要在 Dynamo 的可视化编程环境中使用文本编程?可视化编程有许多优势。它使您无需在直观的可视化界面中学习特殊语法即可创建程序。但是,可视化程序可能会变得混乱,有时可能会在功能上有所降低。例如,Python 提供了更多可实现的方法来编写条件语句 (if/then) 和循环。Python 是一款功能强大的工具,可扩展 Dynamo 的功能,并允许您将许多节点替换为几行简明的代码。
可视化程序:
文本程序:
与代码块一样,Python 节点也是可视化编程环境中的脚本编写界面。Python 节点位于库中的“脚本”>“编辑器”>“Python 脚本”下。
双击节点会打开 Python 脚本编辑器(也可以在节点上单击鼠标右键,然后选择 “编辑...” )。您会注意到顶部的一些样本文字,旨在帮助您引用所需的库。输入存储在 IN 数组中。通过将值指定给 OUT 变量,可将这些值返回给 Dynamo
Autodesk.DesignScript.Geometry 库使您能够使用与代码块类似的点符号。有关 Dynamo 语法的详细信息,请参见 https://github.com/DynamoDS/DynamoPrimerNew/blob/master-chs/coding-in-dynamo/7_code-blocks-and-design-script/7-2_design-script-syntax.md以及 DesignScript 手册(要下载此 PDF 文档,请在链接上单击鼠标右键并选择“将链接另存为...”)。键入几何图形类型(如“Point.”),将显示用于创建和查询点的方法列表。
方法包括构造函数(如 ByCoordinates)、操作(如 Add)和查询(如 X、Y 和 Z 坐标)。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
在本示例中,我们将编写一个 Python 脚本,该脚本用于从实体模块创建图案,并将其转换为自定义节点。首先,我们使用 Dynamo 节点创建实体模块。
Rectangle.ByWidthLength:创建一个矩形,它将作为实体的基础。
Surface.ByPatch:将矩形连接到“closedCurve”输入以创建底部曲面。
Geometry.Translate:将矩形连接到“geometry”输入以向上移动它,从而使用代码块指定实体的基础厚度。
Polygon.Points:查询平移的矩形以提取角点。
Geometry.Translate:使用代码块创建与四个点对应的一列四个值,从而向上平移实体的一个角。
Polygon.ByPoints:使用平移的点来重建顶部多边形。
Surface.ByPatch:连接多边形以创建顶部曲面。
现在,我们有了顶面和底面,接下来让我们在两个轮廓之间放样来创建实体的侧面。
List.Create:将底部矩形和顶部多边形连接到索引输入。
Surface.ByLoft:放样两个轮廓以创建实体的侧面。
List.Create:将顶面、侧面和底面连接到索引输入以创建曲面列表。
Solid.ByJoinedSurfaces:连接曲面以创建实体模块。
现在,我们有了实体,接下来将 Python 脚本节点拖动到工作空间。
要向节点添加其他输入,请单击节点上的“+”图标。输入命名为 IN[0]、IN[1] 等,以指示它们表示列表中的各项。
首先定义输入和输出。双击该节点以打开 Python 编辑器。按照下面的代码,在编辑器中修改代码。
随着我们在练习中的进展,此代码将更有意义。接下来,我们需要考虑排列实体模块所需的信息。首先,我们需要知道实体的尺寸以确定平动距离。由于存在边界框 Bug,因此我们需要使用边曲线几何图形来创建边界框。
在 Dynamo 中查看 Python 节点。请注意,我们使用的语法与在 Dynamo 中节点标题中看到的语法相同。查看下面注释的代码。
由于我们将平移并旋转实体模块,因此我们使用 Geometry.Transform 操作。通过查看 Geometry.Transform 节点,我们知道需要源坐标系和目标坐标系来变换实体。源是实体的上下文坐标系,而目标是每个阵列模块的不同坐标系。这意味着我们需要遍历 X 和 Y 值,以每次变换不同的坐标系。
单击“运行”,然后保存代码。将 Python 节点与现有脚本连接,如下所示。
将 “Solid.ByJoinedSurfaces” 的输出连接为 Python 节点的第一个输入,然后使用“代码块”定义其他输入。
创建 “Topology.Edges” 节点,并使用 Python 节点的输出作为其输入。
最后,创建 “Edge.CurveGeometry” 节点,并使用“Topology.Edges”的输出作为其输入。
尝试更改种子值以创建不同的图案。还可以更改实体模块本身的参数以实现不同的效果。
现在,我们已创建了一个有用的 Python 脚本,接下来我们将它另存为一个自定义节点。选择 Python 脚本节点、在工作空间上单击鼠标右键,然后选择“创建自定义节点”。
指定名称、描述和类别。
这将打开一个新的工作空间,可以在其中编辑自定义节点。
输入:将输入名称更改为更具描述性的名称,并添加数据类型和默认值。
输出:更改输出名称。
将节点另存为 .dyf 文件,然后您应该会看到自定义节点反映了我们刚才所做的更改。
使用 Dynamo 2.0,我们可以指定在首次打开 Python 窗口时要使用的默认模板 (.py extension)
。这是一个渴望已久的请求,因为这可加快 Dynamo 内 Python 的使用。通过使用模板,我们可以在计划开发自定义 Python 脚本时准备好默认导入。
此模板的位置位于 Dynamo 安装的 APPDATA
位置。
这通常如下所示:( %appdata%\Dynamo\Dynamo Core\{version}\ )
。
为了能够利用此功能,我们需要在 DynamoSettings.xml
文件中添加以下行。(在记事本中编辑)
在我们看到 <PythonTemplateFilePath />
的位置,只需将其替换为以下内容:
注意:将 CURRENTUSER 替换为您的用户名
接下来,我们需要使用要内置的功能构建模板。在本例中,我们在使用 Revit 时嵌入 Revit 相关的导入和一些其他典型项目。
您可以开始一个空白记事本文档,并在其中粘贴以下代码:
完成后,将此文件在 APPDATA
位置中另存为 PythonTemplate.py
。
完成定义 Python 模板后,Dynamo 会在每次放置 Python 节点时查找该模板。如果找不到,它将看起来像默认的 Python 窗口。
如果找到 Python 模板(如我们的 Revit 模板),则您会看到所有内置的默认项目。
有关此出色附加功能(由 Radu Gidei 提供)的其他信息可以在此处找到。https://github.com/DynamoDS/Dynamo/pull/8122
Python 是一种广泛使用的编程语言,其流行程度与其语法风格有很大关系。它的可读性很高,因此比许多其他语言更易于学习。Python 支持模块和软件包,可以嵌入到现有应用程序中。有关如何启动和运行 Python 的信息,请访问 上的页面(这是一个很好的资源)。
现在,我们已演示了如何在 Dynamo 中使用 Python 脚本,接下来我们来了解如何将 Revit 库连接到脚本编写环境。请记住,我们输入了 Python 标准和 Dynamo 核心节点,其中代码块中前四行如下所示。要输入 Revit 节点、Revit 图元和 Revit 文档管理器,我们只需添加几行代码即可:
这样,我们便可以访问 Revit API,并为任何 Revit 任务提供自定义脚本编写。通过将可视化编程流程与 Revit API 脚本编写相结合,协作和工具开发得到显著改进。例如,BIM 经理和方案设计人员可以协同处理同一图形。在此协作中,他们可以改进模型的设计和执行。
Dynamo 项目背后的计划是拓宽平台实施范围。随着 Dynamo 向 Docket 中添加更多程序,用户将可以从 Python 脚本编写环境访问特定于平台的 API。尽管 Revit 是本部分的案例研究,但我们可以预见将来会有更多章节,这些章节会提供有关在其他平台上编写脚本的综合教程。此外,现在还有许多 IronPython 库可供访问,这些库都可以输入到 Dynamo 中!
下面的示例演示了在 Dynamo 中使用 Python 实现特定于 Revit 操作的方法。有关 Python 与 Dynamo 和 Revit 关系的更详细综述,请参见 Dynamo Wiki 页面。Python 和 Revit 的另一个有用资源是 Revit Python Shell 项目。
创建新的 Revit 项目。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
在这些练习中,我们将在 Dynamo for Revit 中了解基本的 Python 脚本。本练习将重点介绍如何处理 Revit 文件和图元,以及 Revit 和 Dynamo 之间的通信。
这是一种用于检索与 Dynamo 任务链接的 Revit 文件的 doc、uiapp 和 app 的简便方法。之前使用过 Revit API 的程序员可能会在观察列表中注意到这些项目。如果这些项目看起来不太熟悉,没关系;我们将在下面练习中使用其他示例。
下面介绍如何在 Dynamo 中输入 Revit 服务和检索文档数据。
在 Dynamo 中查看 Python 节点。还可以在下面找到代码:
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
在本练习中,我们将在 Revit 中使用 Dynamo Python 节点创建一个简单的模型曲线。
先在 Revit 中创建新的概念体量族。
打开 “概念体量文件夹”,然后使用 “Metric Mass.rft” 模板文件。
在 Revit 中,使用键盘快捷键 un
显示“项目单位设置”,将长度单位更改为“米”。
启动 Dynamo,然后创建下图中的节点集。首先,我们将在 Revit 中基于 Dynamo 节点创建两个参照点。
创建 “代码块”,并为其赋值
"0;"
将该值插入 X、Y 和 Z 输入的 “ReferencePoint.ByCoordinates” 节点。
创建三个滑块,范围从 -100 到 100,步长为 1。
将每个滑块都连接到 “ReferencePoint.ByCoordinates” 节点。
将 “Python” 节点添加到工作空间,单击节点上的“+”按钮以添加另一个输入并将两个参照点插入到每个输入。打开 “Python” 节点。
在 Dynamo 中查看 Python 节点。在下面查找完整代码。
System.Array:Revit 需要 “系统数组” 作为输入(而不是 Python 列表)。这只是多一行代码,但注意参数类型将有助于在 Revit 中进行 Python 编程。
在 Dynamo 中,我们使用 Python 创建了两个参照点以及一条连接它们的线。在下一练习中,我们将进一步介绍。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
本练习尽可能简单,但主要介绍将数据和几何图形从 Revit 连接到 Dynamo 和反向操作的主题。首先,打开 Revit-StructuralFraming.rvt。打开后,启动 Dynamo 并打开“Revit-StructuralFraming.dyn”文件。
此 Revit 文件实现的是基本功能。两条参照曲线:一条在标高 1 上绘制,另一条在标高 2 上绘制。我们希望将这些曲线输入 Dynamo,并保持实时链接。
在此文件中,我们有一组节点插入到 Python 节点的五个输入中。
选择模型图元节点:点击每个节点对应的选择按钮,然后在 Revit 中选择相应曲线。
代码块: 使用语法
0..1..#x;
, 将介于 0 到 20 之间的整数滑块连接到 “x” 输入。这会指定要在两条曲线之间绘制的梁数。结构框架类型:此处,我们将从下拉菜单中选择默认的 W12x26 梁。
标高:选择“标高 1”。
Python 中的这段代码更加密集,但代码中的注释描述了该过程中出现的情况
在 Revit 中,我们有一组横跨两条曲线的梁作为结构图元。注意:这不是一个真实示例...结构图元用作从 Dynamo 创建的原生 Revit 实例的示例。
在 Dynamo 中,我们也可以看到结果。“Watch3D” 节点中的梁引用从 Revit 图元查询所得的几何图形。
请注意,我们有一个连续过程,将数据从 Revit 环境转换到 Dynamo 环境。总之,下面介绍了该过程的具体流程:
选择 Revit 图元
将 Revit 图元转换为 Dynamo 曲线
将 Dynamo 曲线分割为一系列 Dynamo 点
使用两条曲线之间的 Dynamo 点来创建 Dynamo 线
通过参照 Dynamo 线创建 Revit 梁
通过查询 Revit 梁的几何图形输出 Dynamo 曲面
这听起来可能有点费劲,但脚本使它变得简单,就像在 Revit 中编辑曲线并重新运行求解器一样(尽管这样做可能必须删除以前的梁)。这是因为我们在 Pyhon 中放置梁,从而打破了 OOTB 节点的关联。
在 Revit 中更新参照曲线后,我们会得到新的梁阵列。