Dynamo 为各种可视化编程任务提供了许多核心节点。有时,更快速、更简洁或更轻松共享的解决方案是构建自己的节点。这些节点可以在不同项目中重用,使图形更清晰、更简洁,并且可以将它们推送到软件包管理器,并与全球 Dynamo 社区共享。
Dynamo 提供了几种不同方法来创建自定义节点。可以从头开始构建自定义节点、从现有图形构建自定义节点,也可以在 C# 中显式构建自定义节点。在本节中,我们将介绍如何在 Dynamo UI 中基于现有图形构建自定义节点。此方法非常适用于清理工作空间,以及打包一系列节点以在其他位置重用。
在下图中,我们使用 UV 坐标将某个点从一个曲面映射到另一个曲面。我们将利用此概念创建镶板曲面,该曲面参照 XY 平面中的曲线。我们将在此处创建四边形嵌板以进行镶板,但是使用相同的逻辑,我们可以使用 UV 映射创建各种嵌板。这是开发自定义节点的绝佳机会,因为我们将能够在此图形或其他 Dynamo 工作流中更轻松地重复类似过程。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
首先,我们创建一个要嵌套到自定义节点的图形。在本示例中,我们将使用 UV 坐标创建一个图形,该图形会将多边形从基础曲面映射到目标曲面。我们经常使用此 UV 映射过程,使其成为用于自定义节点的理想候选过程。有关曲面和 UV 空间的详细信息,请参见曲面页面。完整图形是来自上面下载的 .zip 文件中的 “UVmapping_Custom-Node.dyn”。
代码块:使用以下代码行可创建一系列介于 -45 和 45 之间的 10 个数字:
45..45..#10;
Point.ByCoordinates:将 “代码块” 的输出连接到“x”和“y”输入,并将连缀设置为“交互参照”。现在,您应该有了点栅格。
Plane.ByOriginNormal:将 “Point” 输出连接到 “origin” 输入,以在每个点处创建一个平面。将使用默认法向向量 (0,0,1)。
Rectangle.ByWidthLength:将上一步中的平面连接到 “plane” 输入,并使用值为 “10” 的 “代码块” 指定宽度和长度。
现在,您应该会看到矩形栅格。让我们使用 UV 坐标将这些矩形映射到目标曲面。
Polygon.Points:将上一步中的 “Rectangle.ByWidthLength” 输出连接到 “polygon” 输入以提取每个矩形的角点。这些点是我们要映射到目标曲面的点。
Rectangle.ByWidthLength:使用值为 “100” 的 “代码块” 指定矩形的宽度和长度。这将是基础曲面的边界。
Surface.ByPatch:将上一步中的 “Rectangle.ByWidthLength” 连接到 “closedCurve” 输入以创建基础曲面。
Surface.UVParameterAtPoint:连接 “Polygon.Points” 节点的 “Point” 输出和 “Surface.ByPatch” 节点的 “Surface” 输出,以返回每个点处的 UV 参数。
现在,我们已拥有一个基础曲面和一组 UV 坐标,可以输入目标曲面并在曲面之间映射点。
文件路径:选择要输入的曲面的文件路径。文件类型应为“.SAT”。单击 “浏览...” 按钮,然后导航到来自上面下载的 .zip 文件中的 “UVmapping_srf.sat” 文件。
Geometry.ImportFromSAT:连接文件路径以输入曲面。您应该会在几何图形预览中看到输入的曲面。
UV:将 UV 参数输出连接到 “UV.U” 和 “UV.V” 节点。
Surface.PointAtParameter:连接输入的曲面以及 u 和 v 坐标。现在,您应该会在目标曲面上看到三维点栅格。
最后一步是使用三维点来构造矩形曲面修补。
PolyCurve.ByPoints:连接曲面上的点,以通过这些点构造复合线。
Boolean:将 “Boolean” 添加到工作空间,然后将其连接到 “connectLastToFirst” 输入并切换到 True 以关闭复合线。现在,您应该会看到映射到曲面的矩形。
Surface.ByPatch:将复合线连接到 “closedCurve” 输入以构建曲面修补。
现在,我们选择要嵌套到自定义节点中的节点,以考虑我们希望哪些内容作为节点的输入和输出。我们希望自定义节点尽可能灵活,以便它应该能够映射任何多边形,而不仅仅是矩形。
选择以下节点(从“Polygon.Points”开始),在工作空间上单击鼠标右键,然后选择“创建自定义节点”。
在“自定义节点特性”对话框中,为“自定义节点”指定名称、描述和类别。
名称:MapPolygonsToSurface
描述:将多边形从基础曲面映射到目标曲面
附加模块类别:Geometry.Curve
“自定义节点”已显着清理工作空间。请注意,已基于原始节点命名输入和输出。让我们编辑“自定义节点”,以使名称更具描述性。
双击“自定义节点”以对其进行编辑。这将打开一个工作空间,该工作空间有表示节点内部的黄色背景。
输入:将输入名称更改为 “baseSurface” 和 “targetSurface”。
输出:为映射的多边形添加附加输出。
保存自定义节点,然后返回到主工作空间。请注意,“MapPolygonsToSurface” 节点反映了我们刚才所做的更改。
我们还可以通过添加 “自定义注释” 来增加“自定义节点”的稳定性。注释有助于提示输入和输出类型或解释节点的功能。用户将光标悬停在“自定义节点”的输入或输出上时,将显示注释。
双击“自定义节点”以对其进行编辑。这将重新打开黄色背景的工作空间。
开始编辑输入 “代码块”。要开始注释,请键入“//”,后跟注释文字。键入可能有助于阐明节点的任何内容 - 在此处,我们将介绍 “targetSurface”。
我们还将通过设置输入类型等于某个值,来设置 “inputSurface” 的默认值。在此处,我们会将默认值设置为原始 “Surface.ByPatch” 集。
注释也可以应用于输出。
编辑输出“代码块”中的文字。键入“//”,后跟注释文字。在此处,我们将通过添加更深入的描述来阐明 “Polygons” 和 “surfacePatches” 输出。
将光标悬停在“自定义节点输入”上可查看注释。
在对 “inputSurface” 设置默认值后,我们还可以运行定义,无需输入曲面。
我们刚创建了一个自定义节点,并将它应用到 Dynamo 图形中的特定流程。我们非常喜欢这个节点,我们想将它保留在 Dynamo 库中,以便在其他图形中引用。为此,我们将本地发布节点。这与发布软件包的过程类似,我们将在下一章中详细介绍。
通过本地发布节点,可以在打开新会话时在 Dynamo 库中访问该节点。如果不发布节点,则引用自定义节点的 Dynamo 图形也必须在其文件夹中具有该自定义节点(或必须使用 “文件”>“输入库” 将自定义节点输入到 Dynamo 中)。
只要 Dynamo Sandbox 2.17 及更高版本中的自定义节点和软件包没有宿主 API 依存关系,就可以发布它们。在早期版本中,只能在 Dynamo for Revit 和 Dynamo for Civil 3D 中发布自定义节点和软件包。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
让我们继续处理上一节中创建的自定义节点。打开“PointsToSurface”自定义节点后,我们会在 Dynamo 自定义节点编辑器中看到该图形。还可以在 Dynamo 图形编辑器中双击自定义节点来打开它。
要在本地发布自定义节点,只需在画布上单击鼠标右键,然后选择 “发布此自定义节点...” 。
填写与上图类似的相关信息,然后选择 “本地发布” 。请注意,“组”字段定义可从 Dynamo 菜单访问的主图元。
选择一个文件夹以容纳计划在本地发布的所有自定义节点。Dynamo 每次加载时都会检查该文件夹,因此请确保该文件夹处于永久位置。导航到此文件夹,然后选择 “选择文件夹” 。现在,Dynamo 节点在本地发布,每次加载程序时都会保留在 Dynamo 库中!
要检查自定义节点文件夹位置,请转到 “Dynamo”>“首选项”>“软件包设置”>“节点和软件包路径” 。
在此窗口中,我们会看到路径列表。
“Documents\DynamoCustomNodes...” 是指我们已本地发布的自定义节点的位置。
“AppData\Roaming\Dynamo...” 是指联机安装的 Dynamo 软件包的默认位置。
您可能希望按照列表顺序将本地文件夹路径下移(通过单击路径名左侧的向下箭头)。顶层文件夹是安装软件包的默认路径。因此,通过保留默认的 Dynamo 软件包安装路径作为默认文件夹,联机软件包将与本地发布的节点分离。
我们切换了路径名称的顺序,以便让 Dynamo 的默认路径作为软件包安装位置。
导航到此本地文件夹,我们可以在 “.dyf” 文件夹中找到原始自定义节点,该文件夹是 Dynamo 自定义节点文件的扩展名。我们可以编辑此文件夹中的文件,并且节点将在 UI 中更新。我们还可以向 “DynamoCustomNode” 主文件夹添加更多节点,Dynamo 会在重新启动时将它们添加到您的库中!
现在,每次使用 Dynamo 库的“DynamoPrimer”组中的“PointsToSurface”时,Dynamo 都会载入。
自定义节点通过在“Dynamo 自定义节点”内嵌套其他节点和自定义节点来构建,我们可以从概念上将其看作容器。在图形中执行该容器节点时,将执行其中的所有内容,以允许您重用和共享有用的节点组合。
如果图形中有自定义节点的多个副本,可以通过编辑基础自定义节点更新所有副本。这样,您可以通过适应工作流或设计中可能发生的任何更改来无缝更新图形。
可以说,自定义节点的最佳功能是其工作共享功能。如果“超级用户”创建复杂的 Dynamo 图形,并将其交给 Dynamo 的新手设计师,则他/她可以将图形压缩为用于设计交互的基本要素。可以打开自定义节点来编辑内部图形,但“容器”可以保持简单。借助此过程,自定义节点可让 Dynamo 用户设计清晰且直观的图形。
我们跳到自定义节点环境,并创建一个简单节点来计算百分比。自定义节点环境与 Dynamo 图形环境不同,但交互基本相同。说到这里,让我们创建第一个自定义节点!
要从头开始创建自定义节点,请启动 Dynamo 并选择“自定义节点”,或者从画布键入 Ctrl + Shift + N。
在“自定义节点特性”对话框中指定名称、说明和类别。
名称:百分比
说明:计算一个值相对于另一个值的百分比。
类别:Math.Functions
这将打开一个带黄色背景的画布,表示您正在自定义节点内部工作。在此画布中,您可以访问所有核心 Dynamo 节点,以及“输入”和“输出”节点,这些节点标记自定义节点的数据流入和流出。它们位于“输入”>“基本”中。
输入:输入节点在自定义节点上创建输入端口。输入节点的语法为 “input_name : datatype = default_value(optional)”。
可以将此自定义节点另存为“.dyf”(与标准“.dyn”相反)文件,并且该文件将自动添加到您的会话和将来的会话中。您会在库的“附加模块”部分中找到自定义节点。
现在,我们已创建了第一个自定义节点,接下来的部分将更深入地介绍自定义节点功能以及如何发布常规工作流。在以下部分中,我们将介绍如何开发将几何体从一个曲面传输到另一个曲面的自定义节点。
在 Dynamo 中,有多种方法可构建自定义节点。在本章的示例中,我们将直接从 Dynamo 用户界面创建自定义节点。如果您是程序员并且对 C# 或 Zero-Touch 格式感兴趣,可以参见 Dynamo Wiki 上的进行更深入的了解。
输出:与输入类似,这些输出将在自定义节点上创建和命名输出端口。考虑将 “自定义注释” 添加到输入和输出端口,以提示输入和输出类型。这将在部分中详细介绍。