Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Dynamo 为各种可视化编程任务提供了许多核心节点。有时,更快速、更简洁或更轻松共享的解决方案是构建自己的节点。这些节点可以在不同项目中重用,使图形更清晰、更简洁,并且可以将它们推送到软件包管理器,并与全球 Dynamo 社区共享。
我们刚创建了一个自定义节点,并将它应用到 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 提供了几种不同方法来创建自定义节点。可以从头开始构建自定义节点、从现有图形构建自定义节点,也可以在 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 Package Manager 是一个社区门户,用于下载已在线发布的任何软件包。这些工具集由第三方开发,用于扩展 Dynamo 的核心功能、可供所有人访问,只需单击相应按钮即可下载。
诸如 Dynamo 之类的开源项目通过此类社区参与有了蓬勃发展。借助专门的第三方开发人员,Dynamo 能够将其应用范围扩展到各行各业的工作流。因此,Dynamo 团队已共同努力来简化软件包的开发和发布(将在以下各节中详细讨论)。
安装软件包的最简单方法是使用 Dynamo 界面中的“软件包”菜单选项。现在,让我们直接跳转到该菜单选项并安装软件包。在本快速示例中,我们将安装一个常用软件包,用于在栅格上创建四边形嵌板。
在 Dynamo 中,转到 “软件包”>“软件包管理器...”。
在搜索栏中,让我们搜索“quads from rectangular grid”。片刻之后,您应该会看到与此搜索查询匹配的所有软件包。我们想要选择具有匹配名称的第一个软件包。
单击“安装”以将此软件包添加到库,然后接受确认。完成!
请注意,现在 Dynamo 库中有另一个名为“buildz”的组。该名称指代软件包的开发人员,并且自定义节点将放置在此组中。我们可以立即开始使用此组。
使用 “代码块” 以快速定义矩形栅格、将结果输出到 “Polygon.ByPoints” 节点,然后输出到 “Surface.ByPatch” 节点以查看刚创建的矩形嵌板列表。
上述示例重点介绍内含一个自定义节点的软件包,但相同过程可用于下载内含多个自定义节点的软件包以及支持数据文件。现在,我们通过一个更全面的软件包来进行演示:Dynamo Unfold。
如上例中所示,首先选择 “软件包”>“软件包管理器...”。
这次,我们将搜索 “DynamoUnfold” 一词。当我们看到该软件包时,请通过单击“安装”下载,以将“Dynamo Unfold”添加到 Dynamo 库中。
在 Dynamo 库中,我们有一个 “DynamoUnfold” 组,其中包含多个类别和自定义节点。
现在,让我们来看一下软件包的文件结构。
首先,转到“软件包”>“软件包管理器”>“已安装的软件包”。
然后,单击“显示根目录”以打开此软件包的根文件夹。
这会转到该软件包的根目录。请注意,我们有 3 个文件夹和一个文件。
“bin” 文件夹中存储了 .dll 文件。此 Dynamo 软件包使用 Zero-Touch 开发,因此自定义节点保存在此文件夹中。
“dyf” 文件夹中存储了自定义节点。此软件包不是使用 Dynamo 自定义节点开发的,因此此软件包的该文件夹为空。
“extra”文件夹中存储了所有附加文件,包括我们的示例文件。
pkg 文件是一个基本文本文件,用于定义软件包设置。我们现在可以忽略该文件。
打开“extra”文件夹,我们会在其中看到随安装下载的一系列示例文件。并非所有软件包中都有示例文件,如果示例文件是软件包的一部分,那么就可以在该位置找到它们。
让我们打开“SphereUnfold”。
在打开该文件并点击求解器上的“运行”后,我们会得到一个展开的球体!此类示例文件有助于了解如何使用新的 Dynamo 软件包。
在软件包管理器中,可以在“搜索软件包”选项卡中使用排序和过滤选项浏览软件包。有若干过滤器可用于查找宿主程序、状态(新的、已弃用或未弃用),以及软件包是否具有依存关系。
通过对软件包进行排序,可以识别评分较高或下载次数最多的软件包,也可以查找包含最新更新的软件包。
还可以通过单击“查看详细信息”,来访问每个软件包的更多详细信息。这将在“软件包管理器”中打开一个侧面板,在其中可以查找版本控制和依存关系、网站或存储库 URL、许可信息等信息。
了解 Dynamo 软件包的另一种方法是浏览 Dynamo Package Manager 网站。在此处,可以查找软件包和作者排行榜的统计信息。还可以从 Dynamo Package Manager 下载软件包文件,但直接在 Dynamo 中进行下载是一个更无缝的过程。
如果要查看软件包文件的保存位置,请在顶部导航中,依次单击“Dynamo”>“首选项”>“软件包设置”>“节点和软件包文件位置”,可以在此处查找当前根文件夹目录。
默认情况下,软件包安装在与以下文件夹路径类似的位置:C:/Users/[用户名]/AppData/Roaming/Dynamo/[Dynamo 版本]。
Dynamo 社区不断发展壮大。通过不时浏览 Dynamo Package Manager,您会发现一些令人兴奋的新进展。在以下各部分中,我们将更深入地探索软件包,从最终用户角度到您自己的 Dynamo 软件包制作。
在“DynamoUnfold”的旁边,选择菜单菜单 。
Dynamo 提供了多种方法来创建软件包,以供个人使用或与 Dynamo 社区共享。在下面的案例研究中,我们将通过解构现有软件包来逐步介绍如何创建一个软件包。本案例研究基于上一章的课程构建,提供一组自定义节点用于按 UV 坐标映射几何图形(从一个 Dynamo 曲面到另一个 Dynamo 曲面)。
我们将使用一个示例包,演示点从一个曲面到另一个曲面的 UV 映射。我们已在本 Primer 的创建自定义节点部分中构建了该工具的基础知识。下面的文件演示了如何理解 UV 映射的概念,并为可发布库开发一组工具。
在此图像中,我们使用 UV 坐标将点从一个曲面映射到另一个曲面。软件包基于此概念,但有更加复杂的几何图形。
在前一章中,我们探讨了在 Dynamo 中基于在 XY 平面中定义的曲线为曲面镶板的方法。本案例研究扩展了这些概念,以获得更多几何图形尺寸。我们将以内置方式安装此软件包,以演示其开发方式。在下一节中,我们将演示如何发布此软件包。
在 Dynamo 中,依次单击“软件包”>“软件包管理器”,然后搜索软件包“MapToSurface”(全部写为一个单词)。单击“安装”以开始下载,并将软件包添加到库。
完成安装后,自定义节点应位于“附加模块”>“DynamoPrimer”部分下。
现在,软件包已完成安装,我们来介绍其设置方式。
我们正在创建的软件包使用我们为参照而构建的五个自定义节点。下面,我们来介绍每个节点的作用。某些自定义节点基于其他自定义节点构建,图表具有布局,供其他用户直接理解。
这是一个包含五个自定义节点的简单软件包。在下面的步骤中,我们将简要介绍每个自定义节点的设置。
这是一个基本自定义节点,所有其他映射节点均基于该节点。只需放置,该节点会将某个点从源曲面 UV 坐标映射到目标曲面 UV 坐标的位置。由于点是最基本的几何图形,基于它可构建更复杂的几何图形,因此我们可以使用此逻辑将二维几何图形(甚至三维几何图形)从一个曲面映射到另一个曲面。
仅使用此处的多边形,可演示将映射点从一维几何图形扩展到二维几何图形的逻辑。请注意,我们已将 “PointsToSurface” 节点嵌套到此自定义节点中。这样,我们就可以将每个多边形的点映射到曲面,然后基于这些映射点重新生成多边形。通过保持正确的数据结构(一列点列表),我们可以在多边形简化为一组点后,使多边形保持分离。
此处应用的逻辑与 “PolygonsToSurface” 节点中的逻辑相同。但是,我们不是映射多边形点,而是映射 NURBS 曲线的控制点。
OffsetPointsToSurface
此节点变得更加复杂,但概念非常简单:与 “PointsToSurface” 节点类似,此节点会将点从一个曲面映射到另一个曲面。但是,它还会考虑不在原始源曲面上的点,获取其与最近 UV 参数的距离,并将此距离映射到相应 UV 坐标处的目标曲面法线。在查看示例文件时,这会更有意义。
这是一个简单节点,用于创建参数化曲面以从源栅格映射到示例文件中的波状曲面。
示例文件位于软件包的根文件夹中。依次单击“软件包管理器”>“已安装的软件包”选项卡。
在“MapToSurface”的旁边,依次单击垂直点菜单 >“显示根目录”。
接着,打开 “extra” 文件夹,该文件夹存储软件包中所有非自定义节点的文件。这是存储 Dynamo 软件包示例文件(如果存在)的位置。下面的屏幕截图介绍每个示例文件中演示的概念。
此示例文件演示了如何使用 “PointsToSurface” 来根据矩形栅格为曲面镶板。这应该看起来很熟悉,如我们在上一章中演示的类似工作流。
使用类似的工作流,本练习文件显示用于将圆(或表示圆的多边形)从一个曲面映射到另一个曲面的设置。这将使用 “PolygonsToSurface” 节点。
此示例文件通过使用“NurbsCrvToSurface”节点增加了一些复杂性。目标曲面偏移给定距离,且 NURBS 曲线映射到原始目标曲面和偏移曲面。从这里,将放样两条映射曲线以创建曲面,然后加厚该曲面。此结果实体有表示目标曲面法线的波动。
此示例文件演示如何将褶皱多重曲面从源曲面映射到目标曲面。源曲面和目标曲面是分别跨栅格和旋转曲面的矩形曲面。
源多重曲面从源曲面映射到目标曲面。
由于自定义节点能够映射不同类型的曲线,因此最后这个文件会引用从 Illustrator 输出的 SVG 文件,并将输入的曲线映射到目标曲面。
通过解析 .svg 文件的语法,曲线将从 .xml 格式转换为 Dynamo 复合线。
输入的曲线将映射到目标曲面。这样,我们可以在 Illustrator 中显式(点击)设计镶板、输入 Dynamo,然后应用于目标曲面。
在前面的各部分中,我们详细介绍了如何使用自定义节点和示例文件构建 “MapToSurface” 软件包。但是,我们如何发布本地开发的软件包?本案例研究演示了如何发布由本地文件夹中的一组文件构成的软件包。
有多个方法可以发布软件包。下面是我们建议的流程:本地发布、本地开发,然后联机发布。我们首先从包含软件包中所有文件的文件夹开始。
在开始发布 MapToSurface 软件包之前,如果您安装了上一课中的软件包,请将其卸载,以免使用相同的软件包。
首先,转到“软件包”>“软件包管理器”>“已安装的软件包”选项卡 >“MapToSurface”的旁边,依次单击垂直点菜单 >“删除”。
然后,重新启动 Dynamo。重新打开后,选中 “管理软件包” 窗口时,“MapToSurface” 应不再存在。现在,我们已准备好从头开始!
只要 Dynamo Sandbox 2.17 及更高版本中的自定义节点和软件包没有宿主 API 依存关系,就可以发布它们。在早期版本中,只能在 Dynamo for Revit 和 Dynamo for Civil 3D 中发布自定义节点和软件包。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
这是软件包的首次提交,我们已将所有示例文件和自定义节点放入一个文件夹中。准备好此文件夹后,我们便可以上传到 Dynamo 软件包管理器。
此文件夹中包含五个自定义节点 (.dyf)。
此文件夹中还包含五个示例文件 (.dyn) 和一个输入的矢量文件 (.svg)。这些文件将用作介绍性练习,以向用户介绍如何使用自定义节点。
在 Dynamo 中,首先依次单击 “软件包”>“软件包管理器”>“发布新软件包” 选项卡。
在 “发布软件包” 选项卡中,填写窗口左侧的相关字段。
接下来,我们将添加软件包文件。可以逐个添加文件,也可以通过选择“添加目录” (1) 来添加整个文件夹。要添加并非 .dyf 文件的文件,请确保在浏览器窗口中将文件类型更改为 “所有文件(.)”。请注意,我们将随意添加每个文件、自定义节点 (.dyf) 或示例文件 (.dyn)。当我们发布软件包时,Dynamo 会对这些项目进行分类。
选择“MapToSurface”文件夹后,“软件包管理器”会显示文件夹内容。如果您正在上传具有复杂文件夹结构的软件包,并且不希望 Dynamo 对文件夹结构进行更改,可以启用“保留文件夹结构”开关。此选项适用于高级用户,如果您的软件包并非以特定方式有意设置,则最好使此开关保持处于关闭状态,允许 Dynamo 根据需要组织文件。单击“下一步”以继续操作。
在此处,您有机会在发布之前预览 Dynamo 将如何组织软件包文件。单击“完成”以继续。
单击“本地发布” (1) 即可发布。如果您遵照执行,请务必单击 “本地发布” (而 不是 “联机发布” )以避免在“软件包管理器”中出现一系列重复的软件包。
发布后,应该会在“DynamoPrimer”组或 Dynamo 库下提供自定义节点。
现在,我们来查看根目录,以了解 Dynamo 如何设置刚刚创建的软件包的格式。要执行此操作,请转到“已安装的软件包”选项卡 >“MapToSurface”的旁边,单击垂直点菜单 > 选择“显示根目录”。
请注意,根目录位于软件包的本地位置(请记住,我们已“本地”发布了软件包)。Dynamo 当前正在引用此文件夹来读取自定义节点。因此,请务必将目录本地发布到永久文件夹位置(即:不是桌面)。以下内容详细介绍了 Dynamo 软件包文件夹。
“bin” 文件夹中存储了使用 C# 或 Zero-Touch 库创建的 .dll 文件。我们没有任何此软件包的内容,因此在本例中,此文件夹为空。
“dyf” 文件夹中存储了自定义节点。打开此文件夹将显示该软件包的所有自定义节点(.dyf 文件)。
附加文件夹中存储了所有附加文件。这些文件可能是 Dynamo 文件 (.dyn),也可能是所需的任何其他文件(.svg、.xls、.jpeg、.sat 等)。
pkg 文件是一个基本文本文件,用于定义软件包设置。这是在 Dynamo 中自动生成的,但如果您想要了解详细信息,可以对其进行编辑。
注意:除非您实际上发布自己的软件包,否则请勿遵循此步骤!
准备好发布后,在“软件包”>“软件包管理器”>“已安装的软件包”窗口中,选择要发布的软件包右侧的按钮,然后选择“发布”。
如果要更新已发布的软件包,请选择“发布版本”,然后 Dynamo 会根据该软件包的根目录中的新文件联机更新软件包。就这么简单!
当更新已发布软件包的根文件夹中的文件时,还可以通过在 “我的软件包” 选项卡中选择 “发布版本...” 来发布该软件包的新版本。这是对内容进行必要更新并与社区共享的无缝方式。仅当您是该软件包的维护人员时,“发布版本” 才起作用。
创建几个自定义节点后,下一步就是通过软件包开始组织和发布它们 - 这是一种存储节点并与 Dynamo 社区共享节点的便捷方式。
“Zero-Touch 输入”是指用于输入 C# 库的简单点击方法。Dynamo 将读取 .dll 文件的公有方法,并将这些方法转换为 Dynamo 节点。可以将 Zero-Touch 用于开发您自己的自定义节点和软件包,以及将外部库输入到 Dynamo 环境。
.dll 文件
Dynamo 节点
使用 Zero-Touch,实际上可以输入不一定为 Dynamo 开发的库,以及创建一组新节点。当前的 Zero-Touch 功能演示了 Dynamo 项目的跨平台思维。
本部分演示如何使用 Zero-Touch 输入第三方库。有关开发您自己的 Zero-Touch 库的信息,请参考 Dynamo Wiki 页面。
Zero-Touch 软件包是对用户定义的自定义节点的良好补充。下表列出了使用 C# 库的一些软件包。有关软件包的更多详细信息,请访问“附录”中的“软件包”部分。
在本案例研究中,我们将介绍如何输入 AForge 外部 .dll 库。AForge 是一个功能强大的库,提供了从图像处理到人工智能的一系列功能。我们将引用 AForge 中的图像处理类,以在下面进行一些图像处理练习。
首先,我们下载 AForge。在 AForge 下载页面上,选择 “[下载安装程序]”,然后在下载完成后进行安装。
在 Dynamo 中,创建一个新文件,然后依次选择 “文件”>“导入库...”
接下来,找到 dll 文件。
在弹出窗口中,导航到安装有 AForge 的相应版本文件夹。该文件夹可能类似于以下文件夹:C:\Program Files (x86)\AForge.NET\Framework\Release。
AForge.Imaging.dll:我们只想要将 AForge 库中的此文件用于本案例研究。选择此 .dll,然后点击 “打开”。
返回 Dynamo,您应该会看到已添加到库的 “AForge” 节点组。现在,我们可从可视化程序访问 AForge 图像处理库!
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
现在,库已输入,我们将开始此第一个简单练习 (01-EdgeDetection.dyn)。我们将对样例图像进行一些基本图像处理,以显示 AForge 图像如何过滤。我们将使用 “Watch Image” 节点来显示结果,并在 Dynamo 中应用过滤器(与 Photoshop 中的过滤器类似)
要输入图像,请将 “File Path” 节点添加到画布,然后从练习文件夹中选择“soapbubbles.jpg”(照片来源:Flickr)。
“File Path”节点仅提供指向选定图像的路径字符串。接下来,我们需要在 Dynamo 中将其转换为可用的图像文件。
使用 “File From Path” 将文件路径项目转换为 Dynamo 环境中的图像。
将 “File Path” 节点连接到 “File.FromPath” 节点。
要将此文件转换为图像,我们将使用 “Image.ReadFromFile” 节点。
最后,我们来看一看结果!将 “Watch Image” 节点拖动到画布上,然后连接到 “Image.ReadFromFile”。我们尚未使用 AForge,但我们已成功将图像输入 Dynamo。
在“AForge.Imaging.AForge.Imaging.Filters”(导航菜单中)下,您会注意到有许多可用过滤器。现在,我们将使用其中一个过滤器来基于阈值降低图像饱和度。
将这三个滑块拖动到画布上,将它们的范围更改为 0 到 1,将其步长值更改为 0.01。
将 “Grayscale.Grayscale” 节点添加到画布。这是一个“AForge”过滤器,可将“灰度”过滤器应用于图像。将步骤 1 中的三个滑块连接到 cr、cg 和 cb。将顶部和底部滑块的值更改为 1,将中间滑块的值更改为 0。
为了应用“灰度”过滤器,我们需要对图像执行一个操作。为此,我们使用 “BaseFilter.Apply”。将图像连接到图像输入,然后将 “Grayscale.Grayscale” 连接到“baseFilter”输入。
通过连接到 “Watch Image” 节点,我们会得到饱和度降低的图像。
我们可以控制如何根据红、绿和蓝的阈值来降低该图像的饱和度。这些值由 “Grayscale.Grayscale” 节点的输入定义。请注意,图像看起来很暗,这是因为滑块中的绿色值设置为 0。
将顶部和底部滑块的值更改为 0,将中间滑块的值更改为 1。这样,我们获得饱和度明显降低的图像。
让我们使用饱和度降低的图像,然后基于它应用另一个过滤器。饱和度降低的图像有一定的对比度,因此我们将测试一些边缘检测。
将 “SobelEdgeDetector.SobelEdgeDetector” 节点添加到画布。
将其连接到 “BaseUsingCopyPartialFilter.Apply”,然后将饱和度降低的图像连接到此节点的图像输入。
“Sobel Edge Detector”已在新图像中亮显边缘。
放大时,边缘检测器使用像素标注出气泡的轮廓。AForge 库提供的工具可用于获取类似结果以及创建 Dynamo 几何图形。我们将在下一练习中进行探索。
现在,我们已经介绍了一些基本图像处理,让我们使用图像来驱动 Dynamo 几何图形!从根本上讲,在本练习中我们旨在使用 AForge 和 Dynamo 对图像进行 “实时跟踪”。我们将遵循简单原则,从参照图像中提取矩形,但在 AForge 中提供一些工具来执行更复杂的操作。我们将从下载的练习文件中使用 “02-RectangleCreation.dyn”。
使用“File Path”节点,导航到练习文件夹中的“grid.jpg”。
连接上述其余一系列节点,以显示路线参数化网格。
在下一步中,我们要参照图像中的白色方块,并将它们转换为实际的 Dynamo 几何图形。AForge 具有许多功能强大的计算机视觉工具,我们将在此处针对名为“BlobCounter”的库使用一个特别重要的工具。
将“BlobCounter”添加到画布,然后我们需要一种方法来处理图像(类似于上一个练习中的 “BaseFilter.Apply” 工具)。
遗憾的是,“Process Image”节点在 Dynamo 库中不会立即显示。这是因为该函数在 AForge 源代码中可能不可见。为了解决此问题,我们需要找到解决方法。
将“Python”节点添加到画布,并将以下代码添加到“Python”节点。此代号将输入 AForge 库,然后处理输入的图像。
将图像输出连接到“Python”节点输入,我们可从“Python”节点获得“AForge.Imaging.BlobCounter”结果。
接下来将进行一些技巧操作,以展示对“AForge Imaging API”的熟悉程度。对于使用 Dynamo 而言,无需了解所有这些技巧。这更多是在 Dynamo 环境的灵活性内使用外部库的演示。
将 Python 脚本的输出连接到“BlobCounterBase.GetObjectRectangles”。这将基于阈值读取图像中的对象,并从像素空间中提取量化矩形。
通过将另一个“Python”节点添加到画布,从而连接到“GetObjectRectangles”,然后输入以下代码。这将创建 Dynamo 对象的有组织列表。
调换上一步中“Python”节点的输出。这将创建 4 个列表,每个列表表示每个矩形的 X、Y、宽度和高度。
通过使用代码块,我们将数据组织为可容纳 Rectangle.ByCornerPoints 节点的结构(代码如下)。
我们得到一个矩形阵列,代表图像中的白色方块。通过编程,我们(大致)完成了与 Illustrator 中实时跟踪类似的操作!
但是,我们仍需要进行一些清理。放大后,可以看到我们有一堆小的不需要的矩形。
接下来,我们将编写代码以消除不需要的矩形。
在“GetObjectRectangles”节点和另一个“Python”节点之间插入一个“Python”节点。节点代码位于下方,并删除小于指定大小的所有矩形。
在删除多余的矩形后,只需单击几下即可基于这些矩形创建一个曲面,然后根据它们的面积拉伸一段距离。
最后,将“both_sides”输入更改为“false”,我们将在一个方向上得到拉伸。将此婴儿浸入树脂中,您便拥有一张超级书呆子桌子。
这些是基本示例,但此处概述的概念可以传递给令人兴奋的真实应用程序。计算机视觉可用于各种流程。仅举几例:条形码读取器、透视匹配、投影映射和增强现实。有关与本练习相关的 AForge 的更多高级主题,请通读本文。
Dynamo 的节点库中存储了许多即时可用的功能。对于那些常用例程或要与社区共享的特殊图形,自定义节点和软件包是进一步扩展 Dynamo 的好方法。
Dynamo Mesh Toolkit 包提供了多种工具,可从外部文件格式输入网格、从 Dynamo 几何体对象创建网格,以及按顶点和索引手动构建网格。该库还提供了一些工具,可用于修改网格、修复网格或提取水平切片以在制造中使用。
Dynamo Mesh Toolkit 是 Autodesk 持续网格研究的一部分,因此在未来几年内将继续增长。希望新方法经常出现在工具包中,您可以随时与 Dynamo 团队联系并提供评论、错误和新功能建议。
以下练习演示了使用 Mesh Toolkit 的一些基本网格操作。在该练习中,我们将网格与一系列平面相交,这可能需要使用实体进行大量的计算。与实体不同,网格有设置的“分辨率”,且不是以数学方式而是以拓扑方式定义,我们可以基于手头的任务定义此分辨率。有关网格与实体关系的详细信息,可参考本 Primer 中的“用于计算设计的几何图形”一章。要更全面的了解 Mesh Toolkit,可以参见 Dynamo Wiki 页面。接下来,我们跳至下面练习中的软件包。
在 Dynamo 中,转到顶部菜单栏中的“软件包”>“软件包管理器...”。在搜索字段中,键入“MeshToolkit”,全部写为一个单词。单击“安装”并接受确认以开始下载。就这么简单!
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
在此示例中,我们将查看网格工具包中的“相交”节点。我们将导入网格并与一系列输入平面相交以创建切片。这是准备模型以在激光刀具、水射流刀具或 CNC 铣削上进行加工的起点。
首先,在 Dynamo 中打开 “Mesh-Toolkit_Intersect-Mesh.dyn”。
File Path:找到要输入的网格文件(“stanford_bunny_tri.obj”)。支持的文件类型包括 .mix 和 .obj
Mesh.ImportFile:连接文件路径以输入网格
Point.ByCoordinates:构造点 - 这将是圆弧的中心。
Arc.ByCenterPointRadiusAngle:围绕点构造圆弧。此曲线将用于定位一系列平面。设置如下所示:
radius: 40, startAngle: -90, endAngle:0
创建一系列沿圆弧定向的平面。
代码块:创建 25 个介于 0 和 1 之间的数字。
Curve.PointAtParameter:将圆弧连接到 “curve” 输入,将代码块输出连接到 “param” 输入以沿曲线提取一系列点。
Curve.TangentAtParameter:连接与上一个节点相同的输入。
Plane.ByOriginNormal:将点连接到 “origin” 输入并将向量连接到 “normal” 输入,以在每个点处创建一系列平面。
接下来,我们将使用这些平面来与网格相交。
Mesh.Intersect:使平面与输入的网格相交,从而创建一系列复合线轮廓。在节点上单击鼠标右键并将连缀设置为最长
PolyCurve.Curves:将复合线断开为其曲线片段。
Curve.EndPoint:提取每条曲线的端点。
NurbsCurve.ByPoints:使用点来构建 NURBS 曲线。使用设定为 True 的布尔节点闭合曲线。
在继续操作之前,请关闭某些节点(例如:Mesh.ImportFile、Curve.EndPoint、Plane.ByOriginNormal 和 Arc.ByCenterPointRadiusAngle)的预览,以便更好地查看结果。
Surface.ByPatch:为每个轮廓构造曲面面片以创建网格的“切片”。
为一个格子/卵形木箱效果添加第二组切片。
您可能已注意到,相交操作通过网格与类似实体进行更快的计算。此练习中演示的工作流适合于与网格结合使用。
自定义节点通过在“Dynamo 自定义节点”内嵌套其他节点和自定义节点来构建,我们可以从概念上将其看作容器。在图形中执行该容器节点时,将执行其中的所有内容,以允许您重用和共享有用的节点组合。
如果图形中有自定义节点的多个副本,可以通过编辑基础自定义节点更新所有副本。这样,您可以通过适应工作流或设计中可能发生的任何更改来无缝更新图形。
可以说,自定义节点的最佳功能是其工作共享功能。如果“超级用户”创建复杂的 Dynamo 图形,并将其交给 Dynamo 的新手设计师,则他/她可以将图形压缩为用于设计交互的基本要素。可以打开自定义节点来编辑内部图形,但“容器”可以保持简单。借助此过程,自定义节点可让 Dynamo 用户设计清晰且直观的图形。
在 Dynamo 中,有多种方法可构建自定义节点。在本章的示例中,我们将直接从 Dynamo 用户界面创建自定义节点。如果您是程序员并且对 C# 或 Zero-Touch 格式感兴趣,可以参见 Dynamo Wiki 上的此页面进行更深入的了解。
我们跳到自定义节点环境,并创建一个简单节点来计算百分比。自定义节点环境与 Dynamo 图形环境不同,但交互基本相同。说到这里,让我们创建第一个自定义节点!
要从头开始创建自定义节点,请启动 Dynamo 并选择“自定义节点”,或者从画布键入 Ctrl + Shift + N。
在“自定义节点特性”对话框中指定名称、说明和类别。
名称:百分比
说明:计算一个值相对于另一个值的百分比。
类别:Math.Functions
这将打开一个带黄色背景的画布,表示您正在自定义节点内部工作。在此画布中,您可以访问所有核心 Dynamo 节点,以及“输入”和“输出”节点,这些节点标记自定义节点的数据流入和流出。它们位于“输入”>“基本”中。
输入:输入节点在自定义节点上创建输入端口。输入节点的语法为 “input_name : datatype = default_value(optional)”。
输出:与输入类似,这些输出将在自定义节点上创建和命名输出端口。考虑将 “自定义注释” 添加到输入和输出端口,以提示输入和输出类型。这将在“创建自定义节点”部分中详细介绍。
可以将此自定义节点另存为“.dyf”(与标准“.dyn”相反)文件,并且该文件将自动添加到您的会话和将来的会话中。您会在库的“附加模块”部分中找到自定义节点。
现在,我们已创建了第一个自定义节点,接下来的部分将更深入地介绍自定义节点功能以及如何发布常规工作流。在以下部分中,我们将介绍如何开发将几何体从一个曲面传输到另一个曲面的自定义节点。
徽标/图像
名称