Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
向量由大小和方向表示,可以将其视为以给定速度朝特定方向加速的箭头。在 Dynamo 中,它是模型的关键组件。请注意,由于它们属于“辅助对象”的“抽象”类别,因此当我们创建向量时,不希望在背景预览中看到任何内容。
我们可以使用一条线作为向量预览的替代对象。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
平面是一个二维曲面,可以将其视为无限延伸的平面。每个平面都有一个原点、X 方向、Y 方向和 Z(向上)方向。
尽管它们是抽象的,但平面确实具有原点位置,以便我们可以在空间中定位它们。
在 Dynamo 中,平面在背景预览中渲染。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
坐标系是一个用于确定点或其他几何图元位置的系统。下图介绍了它在 Dynamo 中的外观以及每种颜色所表示的含义。
尽管它们是抽象的,但坐标系也具有原点位置,以便我们可以在空间中定位它们。
在 Dynamo 中,坐标系在背景预览中渲染为一个点(原点)和定义轴(X 为红色、Y 为绿色以及 Z 为蓝色,遵循约定)的线。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
向量、平面和坐标系构成了抽象几何图形类型的主组。它们帮助我们为描述形状的其他几何图形定义位置、方向和空间环境。如果我说我在纽约市第 42 街的百老汇(坐标系)、站在街道上(平面)、面朝北(向量),我刚刚使用这些“辅助对象”来定义我所在的位置。这同样适用于手机壳产品或摩天大楼 - 我们需要此环境来开发模型。
向量是描述方向和幅值的几何量。向量是抽象的;即它们表示量,而不表示几何图元。向量可能容易与“点”混淆,因为它们都是由一列值组成。不过,有一个关键区别:“点”描述给定坐标系中的位置,而“向量”描述位置中的相对差异(这就是所谓的“方向”)。
如果相对差异的概念令人困惑,请将“向量 AB”想象为“我站在点 A,面朝点 B”。 从这里 (A) 到那里 (B) 的方向就是我们所谓的向量。
使用相同 AB 符号将向量详解为其各组成部分:
向量的 “起点” 称为 “基底”。
向量的 “终点” 称为 “尖端” 或 “指向”。
“向量 AB”与“向量 BA”不同 - 它们指向相反的方向。
如果您需要关于向量(及其抽象定义)的喜剧效果,请观看经典喜剧《飞机》,聆听时常引用的半开玩笑台词:
Roger, Roger.What's our vector, Victor?
平面是二维抽象“辅助对象”。 更具体地说,平面在概念上是“平”的,在两个方向上无限延伸。通常,它们在其原点附近被渲染为较小的矩形。
您可能会想:“等等!原点?这听起来像是一个坐标系...就像我在 CAD 软件中建模所使用的坐标系!”
您是对的!大多数建模软件都利用构造平面或“标高”来定义要拔模的本地二维环境。XY、XZ、YZ 或北、东南、平面图听起来可能更加熟悉。这些都是“平面”,用于定义无限的“平”环境。平面没有深度,但也有助于我们描述方向 -
如果我们对平面感到满意,那么我们只需一小步就能理解坐标系。平面与坐标系一样具有相同的各部分,前提是它是标准的“欧几里德”或“XYZ”坐标系。
但是,还有其他可选坐标系,如圆柱坐标系或球形坐标系。如我们在后续各部分中所见,坐标系也可应用于其他几何图形类型,以定义该几何图形上的位置。
添加可选坐标系 - 圆柱坐标系、球形坐标系
点仅由一个或多个称为坐标的值定义。定义点所需的坐标值数量取决于该点所在的坐标系或环境。
Dynamo 中最常用的点类型存在于三维世界坐标系中,具有三个坐标 [X,Y,Z](Dynamo 中的三维点)。
Dynamo 中的二维点有两个坐标 [X,Y]。
曲线和曲面的参数是连续的,并且延伸到给定几何图元的边缘之外。由于定义“参数空间”的形状存在于三维世界坐标系中,因此我们始终可以将“参数化坐标”转换为“世界”坐标。例如,曲面上的点 [0.2, 0.5] 与世界坐标中的点 [1.8, 2.0, 4.1] 相同。
假定的世界 XYZ 坐标中的点
相对于给定坐标系(圆柱)的点
曲面上 UV 坐标形式的点
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
如果“几何图形”是模型的语言,则“点”是字母。点是创建所有其他几何图形的基础 - 我们需要至少两个点来创建曲线、我们需要至少三个点来生成一个多边形或网格面,依此类推。通过定义点之间的位置、顺序和关系(尝试使用正弦函数),我们可以定义更高阶的几何图形,例如我们识别为“圆”或“曲线”的图形。
使用函数
x=r*cos(t)
和y=r*sin(t)
的圆使用函数
x=(t)
和y=r*sin(t)
的正弦曲线
点也可以存在于二维坐标系中。根据我们所使用的空间类型,约定的字母表示法有所不同 - 我们可能在平面上使用 [X,Y] 或在曲面上使用 [U,V]。
欧几里得坐标系中的点:[X,Y,Z]
曲线参数坐标系中的点:[t]
曲面参数坐标系中的点:[U,V]
在本部分中,我们将介绍 Dynamo 库中提供的基本节点,这些节点将帮助您像专业人员一样创建自己的可视化程序。
:如何在 Dynamo 中使用几何图元?探索基于基本体创建简单或复杂几何图形的多种方法。
:“数据”是什么,我可以在程序中开始使用哪些基本类型?此外,还要了解有关在设计工作流中结合数学和逻辑运算的更多信息。
:如何管理和协调数据结构?详细了解“列表”的概念,并使用它来高效管理设计数据。
:什么是词典?了解如何使用词典查找现有结果中的特定数据和值。
是我们介绍的第一个几何数据类型,有一组更熟悉的形状描述特性 - 弯曲度或笔直度如何?多长或多短?请记住,点仍然是我们的构建块,用于定义从直线到样条曲线以及它们之间的所有曲线类型。
线
多段线
圆弧
圆
椭圆
NURBS 曲线
复合线
“NurbsCurve.ByControlPoints” 使用一列点作为控制点
“NurbsCurve.ByPoints” 通过一列点绘制曲线
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
术语 “曲线” 通常是所有不同类型弯曲(即使是笔直)形状的全部捕捉。大写字母“C”(即“Curve”)是所有这些形状类型(直线、圆、样条曲线等)的父分类。从技术上讲,“曲线”描述了通过将“t”输入到函数集合中可以找到的所有可能点,范围可能从简单形式 (x = -1.26*t, y = t
) 到涉及微积分的函数。不论我们使用何种类型的曲线,这一名为“t”的 “参数” 都是我们可以计算的特性。此外,不论形状的外观如何,所有曲线也都具有起点和终点,它们与用于创建曲线的最小和最大 t 值一致符合。这也有助于我们了解其方向性。
请务必注意,Dynamo 假定曲线的“t”值域可理解为 0.0 到 1.0。
所有曲线还拥有许多可用于描述或分析它们的特性或特征。如果起点和终点之间的距离为零,则曲线为“闭合”。 此外,每条曲线都有多个控制点,如果所有这些点都位于同一平面中,则该曲线为“平面”的。 某些特性整体上适用于曲线,而其他特性仅适用于沿曲线的特定点。例如,平面性是全局特性,而给定 t 值处的切线向量是局部特性。
“线” 是最简单的曲线形式。它们看起来可能不弯曲,但它们实际上是曲线 - 只是没有任何曲率。创建直线的方法有几种,最直观的形式是从点 A 到点 B。在这两个点之间绘制“直线 AB”的形状,但在数学上它在两个方向上无限延伸。
将两条直线连接在一起时,我们得到了 “多段线”。在此处,我们可以直接了解什么是“控制点”。编辑其中任何点位置都将更改多段线的形状。如果多段线是闭合的,则会得到一个多边形。如果多边形的边长全部相等,则将其描述为常规边。
随着我们为定义形状的参数化函数增加了更多复杂性,我们可以从直线进一步创建 “圆弧” 、“圆” 、“椭圆圆弧” 或 “椭圆”,方法是描述一个或两个半径。“圆弧”版本与“圆”或“椭圆”之间的差异仅在于形状是否是闭合的。
NURBS(非均匀有理基本样条曲线)是数学表示形式,可以对任何形状进行精确建模(从简单的二维直线、圆、圆弧或矩形到最复杂的三维自由形式有机曲线)。由于其灵活性(相对较少的控制点,但基于“阶数”设置的平滑插值)和精度(受强大的数学约束),NURBS 模型可用于从插图、动画到制造的任何过程。
阶数:曲线的阶数确定了控制点对曲线的影响范围;阶数越高,范围越大。“阶数”为正整数。此数字通常为 1、2、3 或 5,但可以是任意正整数。NURBS 直线和多段线通常为 1 阶,并且大多数自由形式曲线为 3 阶或 5 阶。
控制点:控制点是一列至少包含 Degree+1 的点。更改 NURBS 曲线形状的最简单方法之一是移动其控制点。
权重:控制点具有一个称为“权重”的关联数字。权重通常为正数。当曲线的控制点全都具有相同的权重(通常为 1)时,曲线称为“非有理性曲线”,否则曲线称为“有理曲线”。大多数 NURBS 曲线是非有理性曲线。
结:结是一列 (Degree+N-1) 数字,其中 N 是控制点的数量。结与权重一起使用,以控制控制点对生成的曲线的影响。结的一个用途是在曲线中的某些点处创建扭折。
阶数 = 1
阶数 = 2
阶数 = 3
请注意,阶数值越高,则用于对生成的曲线进行插值的控制点越多。
在我们准备好深入探讨开发可视化程序后,我们将需要深入了解我们将使用的构建块。本章介绍有关数据的基本概念 - 介绍通过 Dynamo 程序的“导线”的内容。
作为可视化编程环境,Dynamo 使您可以构思数据的处理方式。数据是数字或文本,但几何体也是数据。根据计算机的理解方式,几何体(有时也称为计算几何体)是我们可以用来创建精美、复杂或性能驱动的模型的数据。为此,我们需要了解我们可以使用的各种几何图形的详细内容。
由一组点组成,每条直线至少有 2 个点。在 Dynamo 中创建直线的最常见方法之一是使用 Line.ByStartPointEndPoint
在 Dynamo 中创建直线。
是一个用于精确表示曲线和曲面的模型。在 Dynamo 中使用两种不同方法制作正弦曲线,以创建 NURBS 曲线来比较结果。
创建 |
Color.ByARGB 按 Alpha、红色、绿色和蓝色分量构造颜色。 |
颜色范围 基于起点颜色和终点颜色之间的颜色渐变获取颜色。 |
操作 |
Color.Brightness 获取该颜色的亮度值。 |
Color.Components 按以下顺序列出颜色分量:Alpha、红、绿、蓝。 |
Color.Saturation 获取该颜色的饱和度值 |
Color.Hue 获取该颜色的色调值。 |
查询 |
Color.Alpha 查找颜色的 Alpha 分量:0 到 255。 |
Color.Blue 查找颜色的蓝色分量:0 到 255。 |
Color.Green 查找颜色的绿色分量:0 到 255。 |
Color.Red 查找颜色的红色分量:0 到 255。 |
创建 |
GeometryColor.ByGeometryColor 使用一种颜色显示几何图形。 |
操作 |
View.Watch 将节点输出内容可视化。 |
View.Watch 3D 显示几何图形的动态预览。 |
操作 |
布尔 在“True”和“False”之间选择。 |
代码块 允许直接编写 DesignScript 代码。 |
目录路径 允许您选择系统上的目录以获取其路径 |
文件路径 允许您选择系统上的文件以获取其文件名 |
整数滑块 用于生成整数值的滑块。 |
编号 创建数字。 |
数字滑块 用于生成数字值的滑块。 |
字符串 创建字符串。 |
Object.IsNull 确定给定对象是否为 Null。 |
创建 |
List.Create 基于给定输入创建一个新列表。 |
List.Combine 将组合器应用于两个序列中的每个元素 |
数字范围 按指定范围创建一系列数字 |
数字序列 创建一系列数字。 |
操作 |
List.Chop 将某个列表切成一组列表,其中每个列表包含给定数量的项目。 |
List.Count 返回存储于给定列表中的项数。 |
List.Flatten 按一定数量展平一列嵌套列表。 |
List.FilterByBoolMask 通过在单独布尔列表中查找相应索引过滤序列。 |
List.GetItemAtIndex 获取位于指定索引处给定列表中的项目。 |
List.Map 将函数应用于列表的所有元素,从而基于结果生成一个新列表。 |
List.Reverse 以相反顺序创建包含给定列表各项的新列表。 |
List.ReplaceItemAtIndex 替换位于指定索引处给定列表中的项目。 |
List.ShiftIndices 将列表中的索引右移给定数量 |
List.TakeEveryNthItem 在给定偏移后是给定值倍数的索引处提取给定列表的项。 |
List.Transpose 交换一列列表中的行和列。如果一些行长短不一,则 Null 值将作为占位符插入结果数组中,使其始终为矩形 |
操作 |
If 条件语句。检查测试输入的布尔值。如果测试输入为 True,则结果将输出 True 输入,否则结果将输出 False 输入。 |
操作 |
Math.Cos 查找角度的余弦。 |
Math.DegreesToRadians 将以度为单位的角度换算为以弧度为单位的角度。 |
Math.Pow 求数字的指定次幂。 |
Math.RadiansToDegrees 将以弧度为单位的角度换算为以度为单位的角度。 |
Math.RemapRange 调整数字列表的范围,同时保留分布率。 |
Math.Sin 查找角度的正弦。 |
公式 计算数学公式。使用 NCalc 进行评估。请参见 http://ncalc.codeplex.com |
映射 将值映射到输入范围 |
操作 |
String.Concat 将多个字符串合并为单个字符串。 |
String.Contains 确定给定字符串是否包含给定子字符串。 |
String.Join 将多个字符串合并为单个字符串,在每个连接的字符串之间插入给定分隔符。 |
String.Split 使用由给定分隔符字符串确定的分段,将单个字符串拆分为字符串列表。 |
String.ToNumber 将字符串转换为整数或双精度数。 |
创建 |
Circle.ByCenterPointRadius 以世界坐标系 Z 轴为法线,通过在世界坐标系 XY 平面输入圆心和半径创建圆。 |
Circle.ByPlaneRadius 在输入平面内以输入平面原点(根)为圆心,按给定半径创建圆。 |
创建 |
CoordinateSystem.ByOrigin 创建坐标系,方法是使其原点位于输入点,X 和 Y 轴设置为 WCS 的 X 和 Y 轴 |
CoordinateSystem.ByCyclindricalCoordinates 在指定柱面坐标参数处相对于指定坐标系创建坐标系 |
创建 |
Cuboid.ByLengths 以 WCS 原点为中心,使用宽度、长度和高度创建立方体。 |
Cuboid.ByLengths(原点) 以输入点为中心,使用特定宽度、长度和高度创建立方体。 |
Cuboid.ByLengths(坐标系) 以 WCS 原点为中心,使用宽度、长度和高度创建立方体。 |
Cuboid.ByCorners 通过从低点到高点延伸创建立方体。 |
Cuboid.Length 返回立方体的输入尺寸标注,而不是实际的世界空间尺寸标注。** |
Cuboid.Width 返回立方体的输入尺寸标注,而不是实际的世界空间尺寸标注。** |
Cuboid.Height 返回立方体的输入尺寸标注,而不是实际的世界空间尺寸标注。** |
BoundingBox.ToCuboid 获取边界框作为实心长方体 |
操作 |
Curve.Extrude(距离) 朝法向量方向拉伸曲线。 |
Curve.PointAtParameter 获取 StartParameter() 和 EndParameter() 之间指定参数处曲线上的点。 |
操作 |
Geometry.DistanceTo 获取从该几何图形到另一个几何图形的距离。 |
Geometry.Explode 将复合或非单独图元拆分为其构件 |
Geometry.ImportFromSAT 输入几何图形的列表 |
Geometry.Rotate(基准面) 绕平面原点和法线将对象旋转指定度数。 |
Geometry.Translate 将任意几何图形类型按给定距离朝给定方向平移。 |
创建 |
Line.ByBestFitThroughPoints 创建最逼近点散布图的直线。 |
Line.ByStartPointDirectionLength 从某个点开始创建直线,朝向量方向延伸指定长度。 |
Line.ByStartPointEndPoint 在两个输入点之间创建一条直线。 |
Line.ByTangency 创建与输入曲线相切的直线,定位于输入曲线的参数点处。 |
查询 |
Line.Direction 曲线的方向。 |
创建 |
NurbsCurve.ByControlPoints 使用显式控制点创建 BSplineCurve。 |
NurbsCurve.ByPoints 通过在各点之间插值创建 BSplineCurve |
创建 |
NurbsSurface.ByControlPoints 通过使用具有指定 U 和 V 度数的显式控制点创建 NurbsSurface。 |
NurbsSurface.ByPoints 使用指定插值点以及 U 和 V 度数创建 NurbsSurface。生成的曲面将通过所有点。 |
创建 |
Plane.ByOriginNormal 以原点为中心,通过输入法向量创建平面。 |
Plane.XY 在世界坐标 XY 平面中创建平面 |
创建 |
Point.ByCartesianCoordinates 在给定坐标系中通过 3 个笛卡尔坐标形成一个点 |
Point.ByCoordinates(二维) 在 XY 平面中通过 2 个笛卡尔坐标形成一个点。Z 分量为 0。 |
Point.ByCoordinates(三维) 通过给定的 3 个笛卡尔坐标形成一个点。 |
Point.Origin 获取原点 (0,0,0) |
操作 |
Point.Add 将向量添加到点。相当于平移(向量)。 |
查询 |
Point.X 获取点的 X 分量 |
Point.Y 获取点的 Y 分量 |
Point.Z 获取点的 Z 分量 |
创建 |
Polycurve.ByPoints 由连接点的直线序列生成 PolyCurve。对于闭合曲线,最后一个点应与起点位于同一位置。 |
创建 |
Rectangle.ByWidthLength(平面) 以输入平面原点为中心,按输入宽度(平面 X 轴长度)和长度(平面 Y 轴长度)创建矩形。 |
创建 |
Sphere.ByCenterPointRadius 以输入点为球心,按给定半径创建实心球体。 |
创建 |
Surface.ByLoft 通过在输入横截面曲线之间放样来创建实体 |
Surface.ByPatch 通过在由输入曲线确定的闭合边界内填充来创建曲面。 |
操作 |
Surface.Offset 在曲面法线方向上,按指定距离偏移曲面 |
Surface.PointAtParameter 返回指定 U 和 V 参数处的点。 |
Surface.Thicken 将曲面加厚为实体,以朝曲面法线方向在曲面两侧进行拉伸。 |
创建 |
UV.ByCoordinates 由两个双精度数创建 UV。 |
创建 |
Vector.ByCoordinates 由 3 个欧几里得坐标形成一个向量 |
Vector.XAxis 获取规范 X 轴向量 (1,0,0) |
Vector.YAxis 获取规范 Y 轴向量 (0,1,0) |
Vector.ZAxis 获取规范 Z 轴向量 (0,0,1) |
操作 |
Vector.Normalized 获取向量的规范版本 |
创建 |
CoordinateSystem.ByOrigin 创建坐标系,方法是使其原点位于输入点,X 和 Y 轴设置为 WCS 的 X 和 Y 轴 |
CoordinateSystem.ByCyclindricalCoordinates 在指定柱面坐标参数处相对于指定坐标系创建坐标系 |
+ 加 |
- 减 |
* 乘 |
/ 除 |
% 模块除法会查找在除以第二个输入后得到的第一个输入的余数 |
< 小于 |
> 大于 |
== 两个值之间的相等测试。 |
逻辑,或更确切地说是条件逻辑,允许我们基于测试指定一个操作或操作集。在评估测试后,我们将得到一个布尔值,该值表示 True
或 False
,我们可以使用它来控制程序流。
数字变量可以存储整个范围的不同数字。布尔变量只能存储两个名为“True”或“False”、“Yes”或“No”、“1”或“0”的值。由于布尔范围有限,我们很少使用布尔来执行计算。
“If”语句是编程中的关键概念:如果 this 为 true,则 that 发生;否则 something else 发生。语句的结果操作由布尔值驱动。在 Dynamo 中,有多种方法可定义“If”语句:
图标 | 名称(语法) | 输入(Inputs) | 输出 (Outputs) |
---|---|---|---|
接下来,我们来看一个简短示例,分别介绍这三个节点在使用“If”条件语句时的行为。
在本图中,“boolean”设置为“true”,这意味着结果是字符串读取:“this is the result if true”。在此处,创建 “If” 语句的三个节点的工作方式相同。
同样,该节点的工作方式也相同。如果 “boolean” 更改为 “false”,则结果是 “Pi” 数字,如原始 “If” 语句中所定义。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
我们使用逻辑将一列数字分隔为一列偶数和一列奇数。
a.Number Range - 向画布添加一个数字范围。
b.Numbers - 向画布添加三个数字节点。每个数字节点的值应为:“start”为“0.0”、“end”为“10.0”以及“step”为“1.0”。
c.Output - 输出是一列 11 个数字(范围从 0 到 10)。
d.求模(%) - “Number Range” 连接到 “x” , “2.0” 连接到 “y”。这将计算列表中每个数字除以 2 的余数。此列表的输出将给出一列介于 0 和 1 之间的交替值。
e.相等测试 (==) - 向画布添加相等测试。将 “modulo” 输出连接到 “x” 输入,将 “0.0” 输入连接到 “y” 输入。
f.Watch - 相等测试的输出是一列介于 true 和 false 之间的交替值。这些值用于分隔列表中的项目。0(或 true)表示偶数,1(或 false)表示奇数。
g.List.FilterByBoolMask - 此节点会根据输入布尔值将值过滤为两个不同的列表。将原始 “number range” 连接到 “list” 输入,将 “equality test” 输出连接到 “mask” 输入。“in” 输出表示 true 值,而 “out” 输出表示 false 值。
h.Watch - 结果,我们现在得到了一列偶数和一列奇数。我们已使用逻辑运算符将列表分成各图案!
在第一个练习中建立的逻辑基础上,我们将此设置应用于建模操作。
2.我们将从上一个具有相同节点的练习跳转。唯一的例外(除了更改格式外):
a.使用具有这些输入值的 “Sequence” 节点。
b.我们已取消将列表输入连接到 “List.FilterByBoolMask”。现在,我们将这些节点放在旁边,但稍后在练习中,它们会派上用场。
3.首先,我们创建一组单独的图形,如上图所示。该组节点表示参数方程,用于定义曲线。几点注意事项:
a.第一个 “数字滑块” 表示波浪的频率,其最小值应为 1,最大值应为 4,步长应为 0.01。
b.第二个 “数字滑块” 表示波浪的振幅,其最小值应为 0,最大值应为 1,步长应为 0.01。
c.PolyCurve.ByPoints - 如果复制上述节点图表,则在 Dynamo 预览视口中结果为正弦曲线。
此处的输入方法:使用数字节点可获得更多静态特性,使用数字滑块可获得更多灵活特性。我们希望保留在此步骤开头定义的原始数字范围。但是,我们在此处创建的正弦曲线应该具有一定的灵活性。我们可以移动这些滑块,来观察曲线更新的频率和振幅。
4.我们在定义中跳过一点,从而看一下最终结果,以便我们可以参照所得到的内容。前两个步骤是分别进行的,我们现在要将这两个步骤连接起来。我们将使用基础正弦曲线来驱动拉链组件的位置,我们将使用 true/false 逻辑以在小框和大框之间交替。
a.Math.RemapRange - 使用在步骤 02 中创建的数字序列,我们通过重新映射范围来创建一系列新数字。原始数字来自步骤 01,范围为 0-100。这些数字介于 0 到 1,分别通过 “newMin” 和 “newMax” 输入。
5.创建 “Curve.PointAtParameter” 节点,然后将步骤 04 中的 “Math.RemapRange” 输出连接为其 “param” 输入。
此步骤将沿曲线创建点。我们将数字重新映射为 0 到 1,因为 “param” 的输入将查找此范围中的值。值为 “0” 表示开始点,值为 “1” 表示结束点。介于两者之间的所有数字均在 “[0,1]” 范围内求值。
6.将 “Curve.PointAtParameter” 的输出连接到 “List.FilterByBoolMask”,以分隔奇数和偶数索引列表。
a.List.FilterByBoolMask - 将上一步的**“Curve.PointAtParameter”**连接到_“list”_输入。
b.Watch -_“in”的观察节点和“out”_的观察节点表明,我们有表示偶数索引和奇数索引的两个列表。这些点在曲线上的排序方式相同,我们将在下一步中进行演示。
7.接下来,我们将在步骤 05 中使用 “List.FilterByBoolMask” 的输出结果,以根据其索引生成具有大小的几何图形。
Cuboid.ByLengths - 重新创建在上图中所见到的连接,以沿正弦曲线获得拉链。立方体在此处就是一个框,我们将基于框中心的曲线点定义其大小。现在,偶数/奇数分割的逻辑在模型中应该一清二楚。
a.偶数索引处的立方体列表。
b.奇数索引处的立方体列表。
大功告成!您刚刚编写了一个根据本练习中演示的逻辑操作定义几何图形尺寸的过程。
列表是我们组织数据的方式。在计算机的操作系统上,有文件和文件夹。在 Dynamo 中,我们可以分别将它们视为项目和列表。与操作系统一样,可通过多种方法创建、修改和查询数据。在本章中,我们将分析如何在 Dynamo 中管理列表。
颜色是用于在可视化程序中创建引入注目的视觉效果以及渲染输出差异的绝佳数据类型。处理抽象数据和改变数字时,有时难以了解变化内容以及变化程度。这是颜色的绝佳应用。
Dynamo 中的颜色是使用 ARGB 输入创建的。这对应于 Alpha、红、绿和蓝通道。Alpha 表示颜色的 透明度,而其他三种颜色用作原色来协调生成整个色谱。
图标 | 名称(语法) | 输入 | 输出 |
---|---|---|---|
下表中的颜色查询用于定义相应颜色的特性:Alpha、红、绿和蓝。请注意,Color.Components 节点给出全部四个不同输出,这使得该节点更适合查询颜色的特性。
图标 | 名称(语法) | 输入 | 输出 |
---|---|---|---|
下表中的颜色对应于 HSB 颜色空间。对于我们如何解释颜色,将颜色分为色调、饱和度和亮度无疑更加直观:应该是什么颜色?应该如何呈现多彩?颜色应该如何变亮或变暗?这分别是色调、饱和度和亮度的细分。
图标 | 名称(语法) | 输入 | 输出 |
---|---|---|---|
颜色范围类似于 #part-ii-from-logic-to-geometry练习中的 “Remap Range” 节点:它将数字列表重新映射到其他域。但它不会映射到 “数字” 域,而是基于 0 到 1 范围的输入数字映射到 “颜色渐变”。
当前节点运作良好,但第一次就使一切正常工作可能会有点勉强。熟悉颜色渐变的最佳方法是以交互方式对其进行测试。让我们快速练习,了解如何使用与数字对应的输出颜色设置渐变。
定义三种颜色:使用 “Code Block” 节点,通过插入相应的 “0” 和 “255” 组合来定义 红色、绿色 和 蓝色。
创建列表:将三种颜色合并到一个列表中。
定义索引:创建列表以定义每种颜色的夹点位置(范围从 0 到 1)。请注意,值 0.75 表示绿色。这会将绿颜色 3/4 置于颜色范围滑块中水平渐变的位置。
代码块:输入值(介于 0 和 1 之间)以转换为颜色。
“Display.ByGeometry” 节点使我们能够在 Dynamo 视口中为几何图形着色。这有助于分离不同类型的几何图形、演示参数化概念或定义用于模拟的分析图例。输入很简单:几何图形和颜色。要创建与上图类似的渐变,请将颜色输入连接到 “Color Range” 节点。
“Display.BySurfaceColors” 节点使我们能够使用颜色在整个曲面上映射数据!此功能为可视化通过离散分析(例如日光、能量和接近度)获得的数据引入了一些令人兴奋的可能性。在 Dynamo 中将颜色应用于曲面类似于在其他 CAD 环境中将纹理应用于材质。在下面的简短练习中,我们来演示如何使用此工具。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
本练习重点介绍如何以参数方式控制与几何图形平行的颜色。该几何图形是基本螺旋线,我们在下面使用 “代码块” 对其进行定义。这是一种用于创建参数化函数的快速而简单的方法;由于我们的重点是颜色(而不是几何图形),因此我们使用代码块来有效地创建螺旋线,而不会使画布变得混乱。随着底漆迁移到更高级的材质,我们会更频繁地使用代码块。
代码块:使用上述公式定义两个代码块。这是用于创建螺旋的快速参数化方法。
Point.ByCoordinates:将代码块的三个输出连接到该节点的坐标。
现在,我们会看到创建螺旋线的一组点。下一步是通过这些点创建曲线,以便我们可以可视化螺旋线。
PolyCurve.ByPoints:将 “Point.ByCoordinates” 输出连接到节点的 “points” 输入。我们会得到螺旋曲线。
Curve.PointAtParameter:将 “PolyCurve.ByPoints” 输出连接到 “curve” 输入。此步骤的目的是创建一个沿曲线滑动的参数化吸引器点。由于曲线将计算参数处的点,因此我们需要输入一个介于 0 和 1 之间的 参数 值。
数字滑块:添加到画布后,将_最小_值更改为 0.0、将 最大 值更改为 1.0、将 步长 值更改为 .01。将滑块输出插入 “Curve.PointAtParameter” 的 “param” 输入。现在,我们会沿螺旋线长度看到一个点,由滑块的百分比表示(起点处为 0,终点处为 1)。
创建参照点后,我们现在将比较参照点与定义螺旋线的原始点之间的距离。此距离值将驱动几何图形以及颜色。
Geometry.DistanceTo:将 “Curve.PointAtParameter” 输出连接到 “input”。将 “Point.ByCoordinates” 连接到几何图形输入。
Watch:结果输出会显示沿曲线从每个螺旋点到参照点的距离列表。
下一步是通过从螺旋点到参照点的距离列表来驱动参数。我们使用这些距离值来沿曲线定义一系列球体的半径。为了使球体保持合适大小,我们需要 重映射 距离值。
Math.RemapRange:将 “Geometry.DistanceTo” 输出连接到数字输入。
代码块:将值为 0.01 的代码块连接到 “newMin” 输入,将值为 1 的代码块连接到 “newMax” 输入。
Watch:将 “Math.RemapRange” 输出连接到一个节点,并将 “Geometry.DistanceTo” 输出连接到另一个节点。比较结果。
此步骤已将距离列表重新映射为较小的范围。我们可以编辑 “newMin” 和 “newMax” 值,但我们认为合适。这些值将重新映射并在整个域中具有相同的 分布率。
Sphere.ByCenterPointRadius:将 “Math.RemapRange” 输出连接到 “radius” 输入,将原始 “Point.ByCoordinates” 输出连接到 “centerPoint” 输入。
更改数字滑块的值,并观察球体更新的大小。现在,我们有了一个参数化夹具
球体的大小演示了由沿曲线的参照点定义的参数化阵列。让我们对球体半径使用相同的概念来驱动其颜色。
Color Range:在画布顶部添加。将光标悬停在 “value” 输入上时,我们注意到请求的数字介于 0 和 1 之间。我们需要重新映射 “Geometry.DistanceTo” 输出中的数字,以便它们与此域兼容。
Sphere.ByCenterPointRadius:目前,我们禁用此节点上的预览(单击鼠标右键 >“预览”)
Math.RemapRange:此过程看起来很熟悉。将 “Geometry.DistanceTo” 输出连接到数字输入。
Code Block:与之前的步骤类似,为 “newMin” 输入创建值 0,为 “newMax” 输入创建值 1。注意,在这种情况下,我们能够在一个代码块中定义两个输出。
Color Range:将 “Math.RemapRange” 输出连接到 “value” 输入。
Color.ByARGB:这是我们要为创建两种颜色所执行的操作。尽管此过程看起来可能有些古怪,但它与其他软件中的 RGB 颜色相同,我们只需使用可视化编程即可实现。
Code Block:创建由 0 和 255 组成的两个值。将两个输出连接到与上图一致的两个 “Color.ByARGB” 输入(或创建您最喜欢的两种颜色)。
Color Range: “colors” 输入要求一列颜色。我们需要基于上一步中创建的两种颜色创建此列表。
List.Create:将两种颜色合并到一个列表中。将输出连接到 “Color Range” 的 “colors” 输入。
Display.ByGeometryColor:将 “Sphere.ByCenterPointRadius” 连接到 “geometry” 输入,将 “Color Range” 连接到 “color” 输入。现在,我们在曲线域上具有平滑渐变。
如果我们之前在定义中更改了 “Number Slider” 的值,则颜色和尺寸会更新。在这种情况下,颜色和半径大小直接相关:我们现在在两个参数之间有视觉链接!
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
首先,我们需要创建(或引用)一个曲面以用作 “Display.BySurfaceColors” 节点的输入。在此示例中,我们将在正弦和余弦曲线之间放样。
该组节点将沿 Z 轴创建点,然后基于正弦和余弦函数置换它们。然后,使用这两个点列表生成 NURBS 曲线。
Surface.ByLoft:在 NURBS 曲线列表之间生成插值曲面。
File Path:选择要取样的图像文件以获取下游像素数据
使用 “File.FromPath” 将文件路径转化为某个文件,然后传递给 “Image.ReadFromFile” 以输出图像进行采样
Image.Pixels:输入某个图像并提供要沿图像的 X 和 Y 标注使用的样例值。
Slider:为 “Image.Pixels” 提供样例值
Display.BySurfaceColors:在整个曲面上分别沿 X 和 Y 映射颜色值数组
输出曲面的特写预览,分辨率为 400x300 样例
我们在模型中使用“曲面”来表示在三维世界中所看到的对象。虽然曲线并非始终是平面的(即它们是三维的),但它们定义的空间始终绑定到一个维度。曲面为我们提供了另一个维度和一组附加特性,我们可以在其他建模操作中使用它们。
在 Dynamo 中输入和评估“参数处的曲面”,以查看我们可以提取的信息类型。
“Surface.PointAtParameter” 返回给定 UV 坐标处的点
“Surface.NormalAtParameter” 返回给定 UV 坐标处的法线向量
“Surface.GetIsoline” 返回 U 或 V 坐标处的等参曲线 - 请注意“isoDirection”输入。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
曲面是由函数和两个参数定义的数学形状,我们使用 U
和 V
(而不是曲线的 t
)来描述相应的参数空间。这意味着,在处理此类型的几何体时,我们需要从中绘制更多的几何数据。例如,曲线具有切线向量和法线平面(可以沿曲线的长度旋转或扭曲),而曲面具有在其方向上保持一致的法线向量和切线平面。
曲面
U 向等参曲线
V 向等参曲线
UV 坐标
垂直平面
法线向量
曲面域:曲面域定义为“(U,V)”参数的范围,这些参数评估为该曲面上的三维点。每个维度中的域(U 或 V)通常描述为两个数字(U 最小值到 U 最大值)和(V 最小值到 V 最大值)。
尽管曲面的形状看起来不是“矩形”,但是局部可能有更紧或更松的等参曲线集,由其域定义的“空间”始终是二维的。在 Dynamo 中,始终可以将曲面理解为使域在 U 和 V 方向上最小为 0.0 且最大为 1.0。平面曲面或修剪曲面可能具有不同的域。
Isocurve(等参曲线):由曲面上的恒定 U 或 V 值定义的曲线,以及相应其他 U 或 V 方向的值域。
UV 坐标:UV 参数空间中的点由 U、V(有时为 W)定义。
垂直平面:在给定 UV 坐标处与 U 向和 V 向等位曲线垂直的平面。
法线向量:定义相对于垂直平面的“向上”方向向量。
NURBS 曲面与 NURBS 曲线非常相似。可以将 NURBS 曲面视为位于两个方向上的 NURBS 曲线的栅格。NURBS 曲面的形状由多个控制点以及该曲面在 U 和 V 方向的阶数定义。相同的算法用于通过控制点、权重和阶数来计算形状、法线、切线、曲率和其他特性。
对于 NURBS 曲面,几何图形会隐含两个方向,因为无论我们看到的是什么形状,NURBS 曲面都是矩形控制点栅格。尽管这些方向通常与世界坐标系任意相关,但我们将经常使用它们来分析模型或基于曲面生成其他几何图形。
阶数 (U,V) = (3,3)
阶数 (U,V) = (3,1)
阶数 (U,V) = (1,2)
阶数 (U,V) = (1,1)
多边形曲面由跨边连接的曲面组成。多边形曲面提供了超过二维的 UV 定义,现在我们可以通过其拓扑在连接的形状中移动。
“拓扑”通常描述了有关零件连接方式的概念和/或 Dynamo 中的相关拓扑也是一种几何体类型。特别是,它是“曲面”、“多边形曲面”和“实体”的父类别。
有时称为“面片”,以这种方式连接曲面可以创建更加复杂的形状,并定义跨接缝的细节。我们可以方便地将圆角或倒角操作应用到多边形曲面的边。
在计算建模领域,网格是表示三维几何图形的最普遍形式之一。网格几何图形通常由一组四边形或三角形组成,它可以是使用 NURBS 的轻量级和灵活的替代方案,并且网格用于从渲染和可视化到数字制造和三维打印的所有领域。
Dynamo 使用“面-顶点”数据结构定义网格。在最基本的层次上,此结构只是分组为多边形的点集。网格的点称为“顶点”,而类似曲面的多边形称为“面”。
要创建网格,我们需要一列顶点和将这些顶点分组为面的系统(称为“索引组”)。
顶点列表
用于定义面的索引组列表
Dynamo 的网格功能可通过安装“Mesh Toolkit”软件包进行扩展。Dynamo Mesh Toolkit 包提供了多种工具,可从外部文件格式输入网格、从 Dynamo 几何图形对象创建网格,以及按顶点和索引手动构建网格。
该库还提供了一些工具,可用于修改网格、修复网格或提取水平切片以在制造中使用。
例如,有关使用此软件包的信息,请访问 Mesh Toolkit 案例研究。
网格是表示曲面或实体几何图形的四边形和三角形的集合。像实体一样,网格对象的结构包括顶点、边和面。还有一些使网络独一无二的特性,例如法线。
网格顶点
网格边 *仅具有一个邻接面的边称为“裸边”。 所有其他边均为“装饰边”
网格面
网格的顶点只是一列点。在构建网格或获取网格结构的相关信息时,顶点的索引非常重要。对于每个顶点,还有一个相应的顶点法线(向量),它描述了附加面的平均方向,并帮助我们了解网格的“入”和“出”方向。
顶点
顶点法线
面是由三个或四个顶点组成的有序列表。因此,根据要建立索引的顶点位置,网格面的“曲面”表示处于隐含状态。我们已经拥有构成网格的顶点列表,因此无需提供单独的点来定义面,只需使用顶点的索引即可。这样,我们还可以在多个面中使用同一顶点。
使用索引 0、1、2 和 3 创建的四边形面
使用索引 1、4 和 2 创建的三角形面 请注意,索引组可以按其顺序移动 - 只要该顺序按逆时针顺序排序,相应面将正确定义
网格几何图形与 NURBS 几何图形有何不同?何时可能要使用其中一个而不是另一个?
在前一章中,我们看到 NURBS 曲面由一系列沿两个方向的 NURBS 曲线进行定义。这些方向标有 U
和 V
,并允许根据二维曲面域对 NURBS 曲面进行参数化。曲线本身作为方程存储在计算机中,从而允许将生成的曲面计算为任意小的精度。但是,将多个 NURBS 曲面组合在一起可能会非常困难。连接两个 NURBS 曲面将生成多重曲面,其中几何图形的不同部分将具有不同的 UV 参数和曲线定义。
曲面
等参(等参线)曲线
曲面控制点
曲面控制多边形
等参点
曲面框架
网格
裸边
网格网络
网格边
顶点法线
网格面/网格面法线
另一方面,网格由许多离散的精确定义的顶点和面组成。顶点网络通常无法通过简单的 UV
坐标进行定义;由于面是离散的,因此精度量内置到网格中,并只能通过优化网格和添加更多面来进行更改。由于缺少数学描述,因此网格可以更灵活地处理单个网格内的复杂几何图形。
另一个重要区别是网格或 NURBS 几何图形中的局部更改影响整个形状的程度。移动网格的一个顶点只会影响与该顶点相邻的面。在 NURBS 曲面中,影响范围更加复杂,具体取决于曲面的阶数以及控制点的权重和结。但通常,在 NURBS 曲面中移动单个控制点会在几何图形中产生更平滑、更广泛的更改。
NURBS 曲面 - 移动控制点具有延伸到形状上的影响
网格几何图形 - 移动顶点仅对相邻图元有影响
一个可能有用的类比是将向量图像(由直线和曲线组成)与光栅图像(由各个像素组成)进行比较。如果放大向量图像,曲线将保持清晰明了,而放大光栅图像的结果是看到各个像素变大。在此类比中,可以将 NURBS 曲面与向量图像进行比较,因为存在平滑的数学关系,而网格的行为与具有设定分辨率的光栅图像类似。
如果我们要构建无法基于单个曲面创建的更复杂模型,或者要定义明确的体积,我们现在必须进入到实体(和多边形曲面)领域。即使简单的立方体也足够复杂,需要六个曲面,每个面一个。实体可用于访问曲面所没有的两个关键概念 - 更加优化的拓扑描述(面、边、顶点)和布尔操作。
可以使用布尔运算修改实体。让我们使用几个布尔操作来创建一个尖球。
Sphere.ByCenterPointRadius:创建基本体。
Topology.Faces、Face.SurfaceGeometry:查询实体的面并转换为曲面几何图形(在本例中,球体仅有一个面)。
Cone.ByPointsRadii:使用曲面上的点构造圆锥体。
Solid.UnionAll:使圆锥体和球体合并。
Topology.Edges:查询新实体的边
Solid.Fillet:对尖球的边进行圆角处理
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
布尔运算很复杂,计算速度可能很慢。使用“冻结”功能可暂停选定节点和受影响的下游节点的执行。
1.使用快捷上下文菜单可冻结“实体并集”操作
2.选定节点和所有下游节点将以浅灰色重影模式预览,并且受影响的线将显示为虚线。受影响的几何体预览也将生成重影。现在,可以在上游修改值,而无需计算布尔并集。
3.要解冻节点,请单击鼠标右键,然后取消选中“冻结”。
4.所有受影响的节点和关联的几何图形预览将更新并还原为标准预览模式。
您可以在[4_nodes_and_wiresmentiontitle部分,阅读有关冻结节点的详细信息。
实体由一个或多个曲面组成,这些曲面包含通过定义“内”或“外”的闭合边界进行定义的体积。 无论这些曲面有多少,它们都必须形成“无间隙”体积才能视为实体。可以通过将曲面或多边形曲面连接在一起,或者使用放样、扫掠和旋转等操作来创建实体。球体、立方体、圆锥体和圆柱体基本体也是实体。至少删除了一个面的立方体视为多边形曲面,它具有一些类似的属性,但它不是实体。
平面由单个曲面组成,而且不是实体。
球体由一个曲面组成,但_是_实体。
圆锥体由两个连接在一起以形成实体的曲面组成。
圆柱体由三个连接在一起以形成实体的曲面组成。
立方体由六个连接在一起以形成实体的曲面组成。
实体由三种类型的元素组成:顶点、边和面。面是组成实体的曲面。边是定义相邻面之间的连接的曲线,顶点是这些曲线的起点和终点。可以使用拓扑节点查询这些图元。
面
边
顶点
可以通过对实体的边进行圆角或倒角操作来修改实体,以消除锐角和角度。倒角操作可在两个面之间创建规则曲面,而圆角可在面之间过渡以保持相切。
实体立方体
倒角立方体
圆角立方体
实体布尔运算是用于合并两个或两个以上实体的方法。单个布尔操作实际上意味着执行四项操作:
与两个或多个对象相交。
在交点处分割它们。
删除几何图形中不需要的部分。
重新连接所有内容。
并集:删除实体的重叠部分,并将它们合并为单个实体。
差集:从一个实体中减去另一个实体。要减去的实体称为工具。请注意,可以切换哪个实体是保留反向体积的工具。
交集:仅保留两个实体的相交体积。
UnionAll:使用球体和朝外的圆锥体进行并集操作
DifferenceAll:使用球体和朝内圆锥体时的差集运算
数据是我们程序的内容。它穿过连线,为节点提供输入,在这些节点中处理为新形式的输出数据。让我们回顾一下数据的定义、数据的结构,然后开始在 Dynamo 中使用它。
数据是一组定性变量或定量变量的值。最简单形式的数据是数字,如 0
、3.14
或 17
。但数据也可以是多种不同的类型:表示变化数字的变量 (height
);字符 (myName
);几何图形 (Circle
);或一列数据项 (1,2,3,5,8,13,...
)。
在 Dynamo 中,我们会向节点的输入端口添加/提供数据 - 我们可以具有无需操作的数据,但我们需要数据来处理节点表示的操作。将某个节点添加到工作空间后,如果未提供任何输入,则结果将为函数,而不是操作本身的结果。
简单数据
数据和操作(A 节点)成功执行
没有数据输入的操作(A 节点)返回通用函数
注意空值,'null'
类型表示缺少数据。尽管这是一个抽象概念,但在使用可视化编程时,您可能会遇到这种情况。如果某个操作未创建有效结果,则节点会返回空值。
测试空值并从数据结构中删除空值是创建健壮程序的关键部分。
在进行可视化编程时,我们可以非常快速地生成大量数据,并需要一种方式来管理其层次结构。这是数据结构的作用,也是我们存储数据的组织方案。数据结构的具体内容及其使用方法具体取决于编程语言。
在 Dynamo 中,我们通过列表向数据添加层次结构。我们将在后续章节中深入探讨这一点,但先让我们简单介绍一下:
列表表示放置在一个数据结构中的项目集合:
我手(列表)上有五根手指(项目)。
我的街道(列表)上有十座房屋(项目)。
“Number Sequence” 节点使用 “start” 、 “amount” 和 “step” 输入来定义一列数字。使用这些节点,我们创建了两个包含十个数字的单独列表,一个列表的范围为 100-109,另一列表的范围为 0-9。
“List.GetItemAtIndex” 节点会选择列表中特定索引处的项目。选择 “0” 时,我们会得到列表中的第一项(在本例中为 “100” )。
通过将相同过程应用于第二个列表,得到的值为 “0”,即列表中的第一项。
现在,我们使用 “List.Create” 节点将这两个列表合并为一个列表。请注意,该节点将创建_一列列表_。这会更改数据的结构。
再次使用 “List.GetItemAtIndex” 时,如果索引设置为 “0”,则我们将获得该列列表中的第一个列表。这就是将列表视为项目的含义,这与其他脚本编写语言略有不同。在后面的章节中,我们将通过列表操作和数据结构获得更高级的功能。
在 Dynamo 中了解数据层次结构的关键概念:在数据结构方面,列表被视为项目。换句话说,Dynamo 通过自上而下的过程来了解数据结构。这意味着什么?我们通过一个示例来介绍它。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
在此第一个示例中,我们装配了一个带壳圆柱体,该圆柱体遍历本节中讨论的几何图像层次结构。
1.添加 “Point.ByCoordinates” - 向画布添加节点后,我们会在 Dynamo 预览栅格的原点处看到一个点。“x,y”和“z”输入的默认值为“0.0”,从而在此位置处向我们提供一个点。
2.Plane.ByOriginNormal - 几何图形层次结构中的下一步是平面。有几种构建平面的方法,我们使用原点和法线作为输入。原点是在上一步中创建的点节点。
Vector.ZAxis - 这是 Z 方向上单位化的向量。请注意,没有输入,仅有值为 [0,0,1] 的向量。我们将此项用作 “Plane.ByOriginNormal” 节点的 “normal” 输入。这样,我们在 Dynamo 预览中就得到了一个矩形平面。
3.Circle.ByPlaneRadius - 逐步扩展层次结构,我们现在基于上一步中的平面创建曲线。在连接到节点后,我们会在原点处得到一个圆。节点上的默认半径值为 “1”。
4.Curve.Extrude - 现在,我们通过增加其深度并进入第三维,使该内容弹出。该节点基于曲线创建曲面,方法是拉伸该曲线。节点上的默认距离为 “1”,应该可以在视口中看到一个圆柱体。
5.Surface.Thicken - 此节点通过将曲面偏移给定距离并闭合形状,从而为我们提供一个闭合实体。默认厚度值为 “1”,我们会在视口中看到一个与这些值对应的带壳圆柱体。
6.数字滑块 - 我们不使用所有这些输入的默认值,而是向模型添加一些参数化控件。
域编辑 - 在向画布添加数字滑块后,单击左上角的插入符号可显示域选项。
最大值/最小值/步长 - 将 “min” 、 “max” 和 “step” 值分别更改为 “0” 、 “2” 和 “0.01”。我们这样做的目的是控制整个几何图形的大小。
7.数字滑块 - 在所有默认输入中,我们复制并粘贴此数字滑块(选择滑块、按 Ctrl+C,然后按 Ctrl+V)多次,直到具有默认值的所有输入都有滑块为止。某些滑块值必须大于零,才能使定义生效(即:需要拉伸深度才能加厚曲面)。
8.现在,我们已使用这些滑块创建参数化带壳圆柱体。尝试调整其中一些参数,然后在 Dynamo 视口中动态查看几何图形更新。
数字滑块 - 更进一步对此进行介绍,我们已向画布添加了很多滑块,并且需要清理刚刚创建的工具的界面。在一个滑块上单击鼠标右键、选择“重命名...”,然后将每个滑块更改为其参数的相应名称(厚度、半径、高度等)。
9.此时,我们创建了一个令人惊叹的加厚圆柱体。目前,这是一个对象,让我们来看看如何创建一个圆柱体阵列,其中圆柱体保持动态链接。为此,我们将创建一列圆柱体,而不是使用单个项。
加(+) - 我们的目的是在创建的圆柱体旁边添加一排圆柱体。如果要添加一个与当前圆柱体相邻的圆柱体,我们需要考虑圆柱体的半径及其壳厚度。通过添加滑块的两个值,可得到此数字。
10.该步骤更加复杂,因此让我们缓慢地逐步介绍:最终目的是创建一列数字,用于定义每个圆柱体在一排中的位置。
a.相乘 - 首先,我们要将上一步中的值乘以 2。上一步中的值表示半径,我们希望将圆柱体移动整个直径。
b.数字序列 - 使用此节点创建数字数组。第一个输入是上一步中的 “multiplication” 节点到 “step” 值。可以使用 “number” 节点将 “start” 值设置为 “0.0”。
c.整数滑块 - 对于 “amount” 值,我们会连接整数滑块。这将定义创建多少个圆柱体。
d.输出 - 此列表显示阵列中每个圆柱体移动的距离,并由原始滑块以参数化方式驱动。
11.此步骤足够简单 - 将上一步中定义的序列连接到原始 “Point.ByCoordinates” 的 “x” 输入。这将替换可以删除的滑块 “pointX”。现在,在视口中可以看到圆柱体阵列(确保整数滑块大于 0)。
12.圆柱体链仍与所有滑块动态链接。调整每个滑块以观察定义更新!
如果最简单的数据形式是数字,则将这些数字关联起来的最简单方法是通过数学。从除法等简单的运算符到三角函数,再到更复杂的公式,Math 是开始探索数值关系和模式的好方法。
运算符是一组组件,这些组件使用具有两个数字输入值的代数函数,这些结果产生一个输出值(加、减、乘、除等)。这些可在“运算符”>“操作”下找到。
图标 | 名称(语法) | 输入(Inputs) | 输出 |
---|---|---|---|
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
通过公式将运算符和变量组合在一起以形成更复杂的关系。使用滑块来创建可由输入参数控制的公式。
1.创建表示参数方程中“t”的数字序列,因此我们要使用足够大的列表来定义螺旋。
Number Sequence:基于以下三个输入定义数字序列:start、amount 和 step。
2.上述步骤已创建一列数字,来定义参数化域。接下来,创建表示黄金螺旋方程的节点组。
黄金螺旋定义为以下方程:
下图以可视化编程形式呈现了黄金螺旋。在逐步查看节点组时,请尝试注意可视化程序和编写方程之间的平行性。
a.Number Slider:向画布添加两个数字滑块。这些滑块将表示参数方程的 “a” 和 “b” 变量。这些表示灵活的常量,或我们可以根据所需结果调整的参数。
b.相乘 (*):乘法节点由星号表示。我们将反复使用它来连接乘法变量
c.Math.RadiansToDegrees:“t”值需要转换为度数,以便在三角函数中进行求值。请记住,Dynamo 默认使用度数来对这些函数求值。
d.Math.Pow:作为“t”和数字“e”的函数,这将创建 Fibonacci 数列。
e.Math.Cos 和 Math.Sin:这两个三角函数将分别区分每个参数点的 x 坐标和 y 坐标。
f.Watch:现在,我们看到输出为两个列表,它们将是用于生成螺旋的点的 x 和 y 坐标。
现在,上一步中的大部分节点都可以正常工作,但这种工作量很大。要创建更高效的工作流,请查看“DesignScript”,以将 Dynamo 表达式的字符串定义到一个节点中。在接下来的一系列步骤中,我们将了解如何使用参数方程绘制 Fibonacci 螺旋。
Point.ByCoordinates:将上乘法节点连接到 “x” 输入,将下乘法节点连接到 “y” 输入。现在,我们在屏幕上会看到点的参数化螺旋。
Polycurve.ByPoints:将上一步的 “Point.ByCoordinates” 连接到 “points”。我们可以不输入而保留 “connectLastToFirst”,因为我们不会绘制闭合曲线。这将创建穿过上一步中定义的每个点的螺旋。
我们现在已完成 Fibonacci 螺旋!让我们从此处开始进一步研究两个独立的练习,我们称之为 Nautilus 和 Sunflower。这些是自然系统的抽象表示,但 Fibonacci 螺旋的两种不同应用将得到充分体现。
Circle.ByCenterPointRadius:我们将在此处使用“Circle”节点,其输入与上一步相同。半径值默认为 “1.0”,因此可以看到圆即时输出。这些点与原点之间的分离程度立即清晰可辩。
Number Sequence:这是 “t” 的原始数组。通过将其连接到 “Circle.ByCenterPointRadius” 的半径值,圆心仍会与原点进一步偏离,但圆的半径不断增大,从而创建一个时髦的 Fibonacci 圆图形。
如果使其成为三维形式,可获得奖励积分!
现在的情况是,我们已创建一个圆形 Nautilus 壳,接下来我们转到参数化栅格。我们将在 Fibonacci 螺旋上使用基本旋转来创建 Fibonacci 栅格,然后在向日葵种子生长后对结果进行建模。
作为一个跳跃点,我们从上一练习的相同步骤开始:使用 “Point.ByCoordinates” 节点创建点的螺旋阵列。
![](../images/5-3/2/math-part IV-01.jpg)
接下来,按照这些小步骤操作以生成一系列不同旋转的螺旋。
a.Geometry.Rotate:有多个 “Geometry.Rotate” 选项;请务必选择将 “geometry” 、 “basePlane” 和 “degrees” 作为其输入的节点。将 “Point.ByCoordinates” 连接到几何图形输入。在该节点上单击鼠标右键,并确保将连缀设置为“叉积”
b.Plane.XY:连接到 “basePlane” 输入。我们将绕原点旋转,该原点与螺旋的底部位置相同。
c.Number Range:对于度数输入,我们要创建多个旋转。我们可以使用 “Number Range” 组件快速完成此操作。将其连接到 “degrees” 输入。
d.Number:要定义数字范围,请按垂直顺序将三个数字节点添加到画布。从上到下,分别指定值 “0.0,360.0,” 和 “120.0”。这些驱动螺旋的旋转。将三个数字节点连接到相应节点后,请注意 “Number Range” 节点的输出结果。
我们的输出开始类似于旋涡。我们调整一些 “Number Range” 参数,看一看结果如何变化。
将 “Number Range” 节点的步长从 “120.0” 更改为 “36.0”。请注意,这将创建更多旋转,因此会为我们提供更密集的栅格。
将 “Number Range” 节点的步长从 “36.0” 更改为 “3.6”。现在,我们得到更密集的栅格,但螺旋的方向性尚不清楚。女士们,先生们:我们创建了一颗向日葵。
词典表示与另一数据(称为主键)相关的数据集合。词典可以搜索、删除数据并将数据插入到集合中。
我们基本上可以将词典看作真正智能的查找内容的方式。
虽然在 Dynamo 中提供词典功能有一段时间了,但 Dynamo 2.0 引入了管理此数据类型的新方式。
原始图片来源:sixtysecondrevit.com
列表是元素或项目的集合。以一串香蕉为例。每个香蕉都是列表(或串)中的一个项目。拾取一串香蕉比单独拾取每个香蕉要容易得多,同样适用于通过数据结构中的参数化关系对元素进行分组。
照片由 Augustus Binu 提供。
当我们购买生活用品时,我们会将所有购买物品放入一个袋子中。这个袋子也是一个列表。如果我们要制作香蕉面包,需要 3 束香蕉(我们要制作 许多 香蕉面包)。袋子表示一列香蕉串,每串表示一列香蕉。袋子是一列列表(二维),香蕉串是一个列表(一维)。
在 Dynamo 中,会对列表数据进行排序,并且每个列表中第一项的索引均为“0”。下面,我们将讨论如何在 Dynamo 中定义列表以及如何将多个列表相互关联。
乍看起来可能有些奇怪的是,列表的第一个索引始终为 0,而不是 1。因此,当我们谈论列表的第一项时,实际上是指对应于索引 0 的项。
例如,如果要计算我们右手的手指数,则很有可能您的计数是 1 到 5。但是,如果要将手指放入列表,Dynamo 会为其指定索引 0 到 4。尽管这对于编程初学者来说似乎有些奇怪,但是从零开始的索引是大多数计算系统中的标准做法。
请注意,列表中仍有 5 个项目;只是列表使用的是基于零的计数系统。而且,列表中存储的项目并不仅限于数字。它们可以是 Dynamo 支持的任何数据类型,例如点、曲线、曲面、族等。
a.索引
b.点
c.项目
通常,查看列表中存储的数据类型的最简单方法是将“Watch”节点连接到另一个节点的输出。默认情况下,观察节点自动将所有索引显示在列表的左侧,并在右侧显示数据项。
这些索引是使用列表时的关键元素。
与列表相关,输入和输出因使用的 Dynamo 节点而异。例如,我们使用一列 5 个点,并将该输出连接到两个不同的 Dynamo 节点:”PolyCurve.ByPoints”和“Circle.ByCenterPointRadius”:
“PolyCurve.ByPoints” 的 “points” 输入正在查找 “Point[]”。这表示一列点
“PolyCurve.ByPoints” 的输出是基于一列五个点所创建的一条复合线。
“Circle.ByCenterPointRadius” 的 “centerPoint” 输入要求提供 “Point”。
“Circle.ByCenterPointRadius” 的输出是一列五个圆,其中心与点的原始列表相对应。
“PolyCurve.ByPoints” 和 “Circle.ByCenterPointRadius” 的输入数据相同,但 “Polycurve.ByPoints” 节点会提供一条复合线,而 “Circle.ByCenterPointRadius” 节点会提供 5 个圆(中心位于每个点处)。直观地讲,这很有意义:将复合线绘制为连接 5 个点的曲线,而圆在每个点处创建不同的圆。数据发生了什么变化?
通过将光标悬停在 “Polycurve.ByPoints” 的 “points” 输入上,我们会看到该输入正在查找 “Point[]”。请注意末端的括号。这表示一列点,并且要创建复合线,输入需要每个复合线是一个列表。因此,该节点会将每个列表压缩为一个复合线。
另一方面,“Circle.ByCenterPointRadius” 的 “centerPoint” 输入要求提供 “Point”。此节点会查找一个点作为项目,以定义圆的圆心。这就是我们基于输入数据获得五个圆的原因。在 Dynamo 中识别输入的这些差异有助于在管理数据时更好地了解节点的运行方式。
在没有清晰解决方案的情况下,数据匹配会是一个问题。当节点有权访问不同大小的输入时,就会发生这种情况。更改数据匹配算法可能会导致结果差异极大。
假定在各点之间创建线段的节点(“Line.ByStartPointEndPoint”)。它将有两个输入参数,两个输入参数均提供点坐标:
最简单的方法是逐一连接输入,直到其中一个流运行干。这称为“最短列表”算法。这是 Dynamo 节点的默认行为:
“最长列表”算法会一直连接输入、重用元素,直到所有流都流干为止:
最后,“笛卡尔积”方法可以建立所有可能的连接:
如您所见,我们可以通过不同的方式在这些点集之间绘制直线。通过在某个节点的中心上单击鼠标右键并选择“连缀”菜单,即可找到连缀选项。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
为了演示下面的连缀操作,我们将使用此基础文件定义最短列表、最长列表和笛卡尔积。
我们将更改 “Point.ByCoordinates” 上的连缀,但不会更改有关上图的其他任何内容。
通过选择 “最短列表” 作为连缀选项(也是默认选项),我们会得到一条由五个点组成的基本对角线。五个点是较小列表的长度,因此最短列表连缀在到达一个列表的末尾后即停止。
通过将连缀更改为 “最长列表”,我们得到一条垂直延伸的对角线。采用与概念图相同的方法,将重复该列表的 5 个项目中的最后一项,以达到较长列表的长度。
通过将连缀更改为 “笛卡尔积”,我们得到每个列表之间的每个组合,从而获得 5x10 点栅格。这是与上述概念图中所示的笛卡尔积等效的数据结构,但数据现在是一列列表。通过连接复合线,我们可以看到每个列表均由其 X 值定义,从而得到一行垂直线。
既然我们已经建立了列表,那么让我们来介绍如何对它执行操作。将一个列表想象为一副纸牌。一副纸牌即是列表,每张纸牌表示一个项目。
照片由 Christian Gidlöf 提供
我们可以在列表中进行哪些查询?这将访问现有特性。
一副纸牌中纸牌的张数?52.
玩家人数?4.
材料?纸。
长度?3.5" 或 89mm。
宽度?2.5" 或 64mm。
我们可以对列表执行哪些操作?这将基于给定操作更改列表。
我们可以洗牌。
我们可以按值对一副纸牌进行排序。
我们可以按玩家对一副纸牌进行排序。
我们可以拆分一副纸牌。
我们可以通过发牌来划分一副纸牌。
我们可以选择一副纸牌中某张特定纸牌。
上面列出的所有操作都有类似 Dynamo 节点来用于处理常规数据列表。下面的课程将演示可以对列表执行的一些基本操作。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
下图是我们在两个圆之间绘制直线以表示基本列表操作的基础图形。我们将探讨如何管理列表中的数据,并通过下面的列表操作演示可视结果。
从 “代码块” 开始,其中值为
500;
连接到 “Point.ByCoordinates” 节点的 x 输入。
将上一步中的节点连接到 “Plane.ByOriginNormal” 节点的原点输入。
使用 “Circle.ByPlaneRadius” 节点,将上一步中的节点连接到平面输入。
使用 “代码块” ,为半径指定值
50;
。这是我们将创建的第一个圆。使用 “Geometry.Translate” 节点,将圆沿 Z 方向向上移动 100 个单位。
使用 “Code Block” 节点,通过以下一行代码定义一系列 10 个介于 0 和 1 之间的数字:
0..1..#10;
将上一步中的代码块连接到两个 “Curve.PointAtParameter” 节点的 “param” 输入。将 “Circle.ByPlaneRadius” 插入到顶部节点的曲线输入,并将 “Geometry.Translate” 连接到其下节点的曲线输入。
使用 “Line.ByStartPointEndPoint” ,连接两个 “Curve.PointAtParameter” 节点。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
“List.Count” 节点简单明了:它计算列表中值的数量,并返回该数量。随着我们使用列表的列表,此节点会变得更加微妙,但我们会在接下来的各部分中进行演示。
“List.Count”**** 节点会返回 “Line.ByStartPointEndPoint” 节点中线的数量。在本例中,该值为 10,表示与从原始 “Code Block” 节点创建的点数一致。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
“List.GetItemAtIndex” 是用于查询列表中项的基本方法。
首先,在 “Line.ByStartPointEndPoint” 节点上单击鼠标右键以关闭其预览。
使用 “List.GetItemAtIndex” 节点,我们选择索引 “0” 或线列表中的第一项。
将滑块值更改为介于 0 和 9 之间,以使用 “List.GetItemAtIndex” 选择其他项目。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
“List.Reverse” 可反转列表中所有项的顺序。
要正确显示反转的线列表,请通过将 “代码块” 更改为
0..1..#50;
来创建更多线复制 “Line.ByStartPointEndPoint” 节点,在 “Curve.PointAtParameter” 和第二个 “Line.ByStartPointEndPoint” 之间插入“List.Reverse”节点
使用 “Watch3D” 节点预览两个不同的结果。第一个显示没有反向列表的结果。这些线垂直连接到相邻点。但是,反转列表会将所有点以相反顺序连接到其他列表。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
“List.ShiftIndices” 是适用于创建扭曲或螺旋图案或者任何其他类似数据操作的工具。此节点会将列表中的项目移动给定数量的索引。
在与反转列表相同的过程中,将 “List.ShiftIndices” 插入到 “Curve.PointAtParameter” 和 “Line.ByStartPointEndPoint” 中。
使用 “代码块”,指定值为“1”以将列表移动一个索引。
请注意,更改很细微,但在连接到另一组点时,较低 “Watch3D” 节点中的所有线都已移动一个索引。
例如,通过将 “代码块” 更改为较大值(“30”),我们注意到对角线存在明显差异。在本例中,该移动类似于照相机的光圈,从而以原始圆柱形式创建扭曲。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
“List.FilterByBooleanMask” 将基于布尔值列表移除某些项目,或通过读取“true”或“false”值来移除某些项目。
为了创建读取“true”或“false”的值列表,我们需要做更多的工作...
使用 “代码块”,通过以下语法定义一个表达式:
0..List.Count(list);
。将 “Curve.PointAtParameter” 节点连接到 “list” 输入。我们将在代码块章节中详细介绍此设置,但本例中的该行代码会为我们提供一个列表,该列表表示 ”Curve.PointAtParameter” 节点的每个索引。使用 “%” **(求模)**节点,将 代码块 的输出连接到 x 输入,将值 4 连接到 y 输入。当将索引列表除以 4 时,这将为我们提供余数。求模节点对于创建图案而言确实非常有用。所有值将读取为 4 的可能余数:0、1、2、3。
在 “%” (求模) 节点中,我们知道值为 0 意味着索引是 4 的倍数(0、4、8,依此类推)。通过使用 “==” 节点,我们可以针对值 “0” 对其进行测试,以测试其可除性。
“Watch” 节点仅显示以下情况:我们有一个“true/false”模式,其读取:true,false,false,false...。
使用此 true/false 模式,连接到两个 “List.FilterByBooleanMask” 节点的遮罩输入。
将 “Curve.PointAtParameter” 节点连接到 “List.FilterByBooleanMask” 的每个列表输入。
“Filter.ByBooleanMask” 的输出读取 “in” 和 “out”。“in” 表示遮罩值为 “true” 的值,而 “out” 表示值为 “false” 的值。通过将 “in” 输出连接到 “Line.ByStartPointEndPoint” 节点的 “startPoint” 和 “endPoint” 输入,我们创建了过滤后的线列表。
“Watch3D” 节点显示线数少于点数。通过仅过滤 true 值,我们仅选择了 25% 的节点!
Dynamo 2.0 引入了将词典数据类型与列表数据类型进行分隔的概念。此更改可能会对您在工作流中创建和使用数据的方式作出一些重大改变。在 2.0 之前,词典和列表已组合为一种数据类型。简而言之,列表实际上是带有整数键的词典。
词典是由一组键值对组成的数据类型,其中每个键在每个集合中是唯一的。词典没有顺序,基本上可以使用键而不是类似列表的索引值来“查找”内容。在 Dynamo 2.0 中,键只能是字符串。
列表是由有序值集合组成的数据类型。在 Dynamo 中,列表使用整数作为索引值。
词典与列表之间的分离会使词典成为“一等公民”,可以使用词典快速、轻松地存储和查找值,无需记住索引值或在整个工作流中保持严格的列表结构。在用户测试期间,当使用词典而不是多个 GetItemAtIndex
节点时,我们看到图形大小显著减小。
语法 已发生更改,改变了初始化以及使用代码块中的词典和列表的方式。
词典使用以下语法:{key:value}
列表使用以下语法:[value,value,value]
库中引入了 新节点,以帮助您创建、修改和查询词典。
加载脚本时,v1.x 代码块中创建的列表会自动迁移为使用方括号 [ ]
(而不是大括号 { }
)的新列表语法 \
在计算机科学中,词典(如列表)是对象集合。虽然列表按特定顺序排列,但词典是 无序 集合。它们并不依赖于顺序编号(索引),而是使用 键。
在下图中,我们演示了词典的潜在使用案例。通常,词典用于关联两个可能没有直接相关性的数据。在本例中,我们将单词的西班牙语版本连接到英文版本,供以后查找。
构建词典来关联两条数据。
获取给定键的值。
Dynamo 2.0 带有各种词典节点供我们使用。这包括 创建、操作和查询 节点。
Dictionary.ByKeysValues
会使用提供的值和键创建词典。(条目数将是最短列表输入内容)
Dictionary.Components
会生成输入词典的组件。(这与创建节点相反。)
Dictionary.RemoveKeys
会生成一个新的词典对象,其中输入键已删除。
Dictionary.SetValueAtKeys
会根据输入键和值生成新词典,以替换相应键处的当前值。
Dictionary.ValueAtKey
会返回输入键处的值。
Dictionary.Count
会告诉您词典中有多少键值对。
Dictionary.Keys
会返回当前存储在词典中的键。
Dictionary.Values
会返回当前存储在词典中的值。
与词典建立整体关联数据是对使用索引和列表的旧方法的重大替代。
您是否曾想过使用 Revit 中包含的数据查找内容?
如果您已经完成了类似以下示例的操作,则有可能出现这种情况。
在下图中,我们会收集 Revit 模型中的所有房间、获取所需房间的索引(按房间编号),最后在索引处抓取房间。
收集模型中的所有房间。
要查找的房间编号。
获取房间编号并查找它所在的索引。
获取索引处的房间。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
现在,让我们使用词典重建这个想法。首先,我们需要收集 Revit 模型中的所有房间。
我们选择要处理的 Revit 类别(在本例中,我们处理的是房间)。
我们告诉 Dynamo 收集所有这些元素
接下来,我们需要决定要使用哪些键来查找此数据。(键的相关信息位于“什么是词典?”部分中。)
我们将使用的数据是房间编号。
现在,我们将使用给定的键和元素创建词典。
节点 “Dictionary.ByKeysValues” 将根据相应的输入创建词典。
Keys
需要是字符串,而values
可以是多种对象类型。
最后,我们现在可以使用房间编号从词典中检索房间。
String
将是用于从词典中查找对象的键。现在,“Dictionary.ValueAtKey” 将从词典中获取对象。
使用相同的词典逻辑,我们还可以使用分组对象创建词典。如果我们要查找给定级别的所有房间,可以按如下所示修改上图。
我们现在可以使用参数值(在本例中,我们将使用标高),而不是将房间编号用作键。
现在,我们可以按房间所在的标高对房间进行分组。
按标高对图元进行分组后,我们现在可以使用共享键(唯一键)作为词典的键,以及将房间列表作为元素。
最后,使用 Revit 模型中的标高,我们可以在词典中查找位于该标高的房间。
Dictionary.ValueAtKey
将获取标高名称并返回该标高处的房间对象。
使用词典的机会确实是无限的。在 Revit 中将 BIM 数据与元素本身关联的功能可用于各种使用案例。
Dynamo 2.0 不仅引入之前针对词典讨论的节点,还在代码块中提供了新功能!
可以使用如下所示的语法或基于 DesignScript 的节点表示。
由于词典是 Dynamo 中的对象类型,因此我们可以对其执行以下操作。
在将 Revit 数据与字符串相关联时,保持这些交互类型尤其有用。接下来,我们将了解一些 Revit 使用案例。
再往下钻,让我们为层次结构添加更多层。数据结构可以扩展到远超二维列表的列表。由于列表是 Dynamo 中的项目,而且它们本身也是项目,因此我们可以创建尽可能多维的数据。
我们将在此处使用的类比是俄罗斯套娃。每个列表可视为一个包含多个项的容器。每个列表都有自己的特性,也被视为自己的对象。
一组俄罗斯套娃(照片由 提供)是 n 维列表的类比。每个层表示一个列表,每个列表在其中包含项目。在 Dynamo 的情况下,每个容器内可以有多个容器(表示每个列表的项目)。
n 维列表很难用直观的方式进行解释,但是我们在本章中设置了一些练习,这些练习着重于处理超出二维范围的列表。
映射无疑是 Dynamo 中数据管理最复杂的部分,并且在处理列表的复杂层次结构时尤其重要。在下面的一系列练习中,我们将演示在数据变为多维时何时使用映射和组合。
在上一节中,可以找到 “List.Map” 和 “List.Combine” 的初步介绍。在下面的最后一个练习中,我们将对复杂数据结构使用这些节点。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
本练习是三个练习中的第一个,侧重于阐述输入的几何图形。本系列练习中的每个部分都将增加数据结构的复杂性。
让我们从练习文件文件夹中的“.sat”文件开始。我们可以使用 “File Path” 节点抓取此文件。
使用 “Geometry.ImportFromSAT”,该几何图形将作为两个曲面输入到 Dynamo 预览中。
在本练习中,我们希望保持简单并处理其中一个曲面。
让我们选择索引 1,以抓取上方曲面。我们使用 “List.GetItemAtIndex” 节点来执行此操作。
关闭 “Geometry.ImportFromSAT” 预览中的几何图形预览。
下一步是将曲面分割为点栅格。
1.使用 “代码块”,插入以下两行代码:
0..1..#10;
0..1..#5;
2.使用 “Surface.PointAtParameter”,将两个代码块值连接到 u 和 v。将此节点的 “连缀” 更改为 “叉积”。
3.输出显示数据结构,这在 Dynamo 预览中也可见。
接下来,使用上一步中的点以沿曲面生成十条曲线。
要了解数据结构的组织方式,我们将 “NurbsCurve.ByPoints” 连接到 “Surface.PointAtParameter” 的输出。
现在,可以关闭 “List.GetItemAtIndex” 节点的预览,以获得更清晰的结果。
基本 “List.Transpose” 将翻转一列列表的列和行。
通过将 “List.Transpose” 的输出连接到 “NurbsCurve.ByPoints”,我们现在得到五条曲线在整个曲面上水平延伸。
可以在上一步中关闭 “NurbsCurve.ByPoints” 节点的预览,以在图像中获得相同的结果。
让我们增加复杂性。假定我们要对上一个练习中创建的曲线执行操作。也许,我们希望将这些曲线与其他曲面相关联,并在它们之间进行放样。这需要更加注意数据结构,但基本逻辑是相同的。
从上一练习的步骤开始,使用 “List.GetItemAtIndex” 节点隔离已输入几何图形的上曲面。
使用 “Surface.Offset”,将曲面偏移值 “10”。
按照与上一练习相同的方式,使用以下两行代码定义 “代码块”:
0..1..#10;
0..1..#5;
将这些输出连接到两个 “Surface.PointAtParameter” 节点,每个节点的 “连缀” 设置为 “叉积”。其中一个节点连接到原始曲面,而另一个节点连接到偏移曲面。
关闭这些曲面的预览。
与上一练习中一样,将输出连接到两个 “NurbsCurve.ByPoints” 节点。结果显示与两个曲面对应的曲线。
通过使用 “List.Create”,我们可以将两组曲线合并为一列列表。
在输出中注意到,我们有两个列表,其中每个列表都包含十个项目,分别表示每个 NURBS 曲线的连接集。
通过执行 “Surface.ByLoft”,我们可以直观地了解此数据结构。该节点将放样每个子列表中的所有曲线。
在上一步中,关闭 “Surface.ByLoft” 节点的预览。
通过使用 “List.Transpose”,请记住,我们将翻转所有列和行。此节点会将两列(每个列表十条曲线)转换为十列(每个列表两条曲线)。现在,我们得到与另一个曲面上的相邻曲线相关的每条 NURBS 曲线。
使用 “Surface.ByLoft”,我们得到一个带肋的结构。
接下来,我们将演示实现此结果的替代流程
在开始之前,请在上一步中关闭 “Surface.ByLoft” 预览以避免混淆。
除 “List.Transpose” 之外,还可以使用 “List.Combine”。这将对每个子列表运算 “连结符”。
在本例中,我们使用 “List.Create” 作为 “连结符”,这将在子列表中创建每个项目的列表。
使用 “Surface.ByLoft” 节点,我们得到与上一步中相同的曲面。在这种情况下,转置更容易使用,但当数据结构变得更加复杂时,“List.Combine” 更加可靠。
如果要切换带肋结构中曲线的方向,请后退几步,我们需要先使用 “List.Transpose”,然后再连接到 “NurbsCurve.ByPoints”。这将翻转列和行,从而得到 5 个水平加强筋。
现在,我们将更进一步。在本练习中,我们将使用两个输入的曲面,从而创建复杂的数据层次结构。尽管如此,我们的目标是使用相同的基础逻辑来完成相同的操作。
从上一练习中输入的文件开始。
与上一练习中一样,使用 “Surface.Offset” 节点按值 “10” 进行偏移。
在输出中注意到,我们创建了两个具有偏移节点的曲面。
按照与上一练习相同的方式,使用以下两行代码定义 “代码块”:
0..1..#20;
0..1..#20;
将这些输出连接到两个 “Surface.PointAtParameter” 节点,每个节点的连缀设置为 “叉积”。其中一个节点连接到原始曲面,而另一个节点连接到偏移曲面。
与上一练习中一样,将输出连接到两个 “NurbsCurve.ByPoints” 节点。
查看 “NurbsCurve.ByPoints” 的输出,注意到这是一列两个列表,比上一练习更复杂。数据按基础曲面分类,因此我们为结构化数据添加了另一个层级。
请注意,“Surface.PointAtParameter” 节点中的对象变得更加复杂。在本例中,我们会看到一列列表。
在继续操作之前,请关闭现有曲面的预览。
使用 “List.Create” 节点,我们将 NURBS 曲线合并为一个数据结构,从而创建一列列表(其中每个元素也是一个列表)。
通过连接 “Surface.ByLoft” 节点,我们得到原始曲面的版本,因为它们各自保留在由原始数据结构创建的自己列表中。
在上一练习中,我们能够使用 “List.Transpose” 创建带肋结构。这在此处不起作用。对二维列表应使用转置,但由于我们有三维列表,因此“翻转列和行”操作不会像之一样轻松。请记住,列表是对象,因此 “List.Transpose” 将翻转包含子列表的列表,但不会将 NURBS 曲线在层次结构中进一步向下翻转一个列表。
“List.Combine” 在此处将更加适用。当访问更复杂的数据结构时,我们要使用 “List.Map” 和 “List.Combine” 节点。
使用 “List.Create” 作为 “连结符”,我们可以创建一个数据结构,使其更加适用。
数据结构仍需要在层次结构上向下转置一步。为此,我们将使用 “List.Map”。除了使用一个输入列表(而不是两个或更多)之外,这类似于使用 “List.Combine”。
我们将应用于 “List.Map” 的函数是 “List.Transpose”,这将翻转主列表中子列表的列和行。
最后,我们可以结合使用正确的数据层次结构放样 NURBS 曲线,从而提供带肋结构。
我们使用 “Surface.Thicken” 节点和输入设置为几何图形添加一些深度,如图所示。
最好添加一个曲面来支撑这两个结构,因此请添加另一个 “Surface.ByLoft” 节点,并使用上一步中 “NurbsCurve.ByPoints” 的第一个输出作为输入。
随着预览变得混乱,请通过在每个节点上单击鼠标右键并取消选中“预览”以关闭这些节点的预览,以便更好地查看结果。
加厚这些选定曲面,完成连接。
这不是有史以来最舒适的摇椅,但还会进行大量数据处理。
最后一步,我们反转带条纹成员的方向。如在上一练习中使用转置一样,我们将在此处执行类似操作。
由于我们的层次结构中还有一层级,因此我们需要将 “List.Map” 与 “List.Tranpose” 函数一起使用来更改 NURBS 曲线的方向。
我们可能希望增加踏板数,因此可以将 “代码块” 更改为
0..1..#20;
0..1..#30;
摇椅的第一个版本很流畅,因此我们的第二个模型提供了越野、运动多功能版本的靠背。
让我们再为层次结构添加一个层级。如果我们从原始示例中获取数据卡组并创建包含多个数据卡组的框,则该框现在表示一列数据卡组,每个数据卡组表示一列数据卡。这是一列列表。在本节的类比中,下图包含一列硬币卷,每个卷包含一列便士。
我们可以在该列列表中进行哪些查询?这将访问现有特性。
硬币类型的数量?2.
硬币类型值?$0.01 和 $0.25。
两角五分的材料?75% 铜和 25% 镍。
便士材料?97.5% 锌和 2.5% 铜。
我们可以对该列列表执行哪些操作?这会根据给定的操作更改该列列表。
选择一叠特定的两角五分或便士。
选择一个特定的两角五分或便士。
重新排列各叠两角五分和便士。
将各叠堆叠在一起。
同样,Dynamo 为上述每项操作都提供了一个分析节点。由于我们处理的是抽象数据而不是物理对象,因此我们需要一组规则来控制如何上下移动数据层次结构。
在处理列表的列表时,数据是分层且复杂的,但这使得有机会执行一些很棒的参数化操作。让我们来分解基础知识,并在下面的课程中再讨论几项操作。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
要从本部分中了解的基本概念:Dynamo 将列表视为自身内部和自身的对象。这种自上而下层次结构是在考虑面向对象编程的情况下开发的。Dynamo 会选择数据结构中主列表的索引,而不是使用诸如 “List.GetItemAtIndex” 之类的命令选择子元素。该项可以是另一个列表。让我们用示例图像进行分解:
使用 “代码块”,我们已定义两个范围:
0..2; 0..3;
这些范围连接到 “Point.ByCoordinates” 节点,其中连缀设置为 “叉积”。这将创建点栅格,并且还会返回一列列表作为输出。
请注意,“Watch” 节点提供 3 个列表,其中每个列表中有 4 个项目。
使用 “List.GetItemAtIndex” 时,在索引为 0 的情况下,Dynamo 会选择第一个列表及其所有内容。其他程序可能会选择数据结构中每个列表的第一个项目,但 Dynamo 在处理数据时采用自上而下层次结构。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
“展平”会从数据结构中删除所有层级的数据。这在操作不需要数据层次结构时非常有用,但由于它会删除信息,因此可能存在风险。下面的示例显示了展平一列数据的结果。
在 “代码块” 中插入一行代码以定义一个范围:
-250..-150..#4;
通过将 “代码块” 插入到 “Point.ByCoordinates” 节点的 “x” 和 “y” 输入,我们会将连缀设置为 “叉积” 以获取点栅格。
“Watch” 节点显示我们有一列列表。
“PolyCurve.ByPoints” 节点将引用每个列表并创建相应的复合线。请注意,在 Dynamo 预览中,我们有四条复合线分别表示栅格中的每一行。
通过在复合线节点之前插入 “展平”,我们为所有点创建了一个列表。“PolyCurve.ByPoints” 节点引用列表来创建一条曲线,并且由于所有点都在一个列表中,因此我们得到了一条锯齿形复合线,该复合线贯穿整个点列表。
还有用于展平孤立层级数据的选项。使用 “List.Flatten” 节点,可以定义一定数量的数据层级,以从层次结构的顶部展平。如果要处理的复杂数据结构不一定与工作流相关,那么这是一个非常有用的工具。另一个选择是在 “List.Map” 中将展平节点用作函数。我们将在下面详细介绍 “List.Map”。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
使用参数化建模时,有时您还希望将修改现有列表的数据结构。此外,还有许多节点可用于此操作,其中最基本的版本是“切除”。使用“切除”,我们可以将一个列表划分为具有一定数量项目的子列表。
“切除”命令会根据给定的列表长度来分割列表。在某些方面,切除与展平相反:它不是删除数据结构,而是向其中添加新的层级。这是一个有助于执行几何操作(如以下示例)的工具。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
“List.Map/Combine” 会将设置的函数应用于输入列表,但在层次结构中向下一步。组合与贴图相同,但组合可以具有与给定函数的输入相对应的多个输入。
通过简单介绍一下,我们来回顾上一节中的 “List.Count” 节点。
“List.Count” 节点对列表中的所有项目进行计数。我们将使用此节点来演示 “List.Map” 如何工作。
将两行代码插入到 “代码块”:
-50..50..#Nx; -50..50..#Ny;
在键入此代码后,代码块将为 Nx 和 Ny 创建两个输入。
使用两个 整数滑块,通过将它们连接到 “代码块” 来定义 “Nx” 和 “Ny” 值。
将代码块的每行连接到 “Point.ByCoordinates” 节点的相应 “X” 和 “Y” 输入。在节点上单击鼠标右键,选择“连缀”,然后选择 “叉积”。这将创建点栅格。因为我们定义的范围是 -50 到 50,所以我们跨越了默认的 Dynamo 栅格。
“Watch” 节点显示所创建的点。请注意数据结构。我们已创建一列列表。每个列表都表示栅格的一行点。
将上一步中的 “List.Count” 节点附加到“Watch”节点的输出。
将 “Watch” 节点连接到 “List.Count” 输出。
请注意,“List.Count”节点提供的值为“5”。这等于代码块中所定义的“Nx”变量。这是为什么呢?
首先,“Point.ByCoordinates” 节点使用“x”输入作为用于创建列表的主输入。当 Nx 为 5 且 Ny 为 3 时,我们得到一列 5 个列表,每个列表都包含 3 个项目。
由于 Dynamo 将列表视为自身内部和自身的对象,因此 “List.Count” 节点会应用于层次结构中的主列表。结果为值 5 或主列表中列表的数量。
通过使用 “List.Map” 节点,我们在层次结构中向下一步,然后在此级别上执行 “函数”。
请注意,“List.Count” 节点没有输入。它将用作一个函数,因此 “List.Count” 节点将应用于层次结构中向下一步的每个单独列表。“List.Count” 的空白输入对应于 “List.Map” 的列表输入。
“List.Count” 的结果现在提供一列 5 个项目,每个项目的值为 3。这表示每个子列表的长度。
在本练习中,我们将使用 “List.Combine” 演示如何使用它来在单独的对象列表中应用函数。
首先,设置两个点列表。
使用 “Sequence” 节点生成 10 个值,每个值都有 10 步增量。
将结果连接到 “Point.ByCoordinates” 节点的 x 输入。这将在 Dynamo 中创建点列表。
将第二个 “Point.ByCoordinates” 节点添加到工作空间、使用相同的 “Sequence” 输出作为其 x 输入,但使用 “Interger Slider” 作为其 y 输入并将其值设置为 31(它可以是任何值,只要它们不与第一组点重叠),这样 2 组点就不会相互重叠。
接下来,我们将使用 “List.Combine” 对 2 个单独列表中的对象应用函数。在本例中,它将是一个简单的绘制线函数。
将 “List.Combine” 添加到工作空间,并连接 2 组点作为其 list0 和 list1 输入。
使用 “Line.ByStartPointEndPoint” 作为 “List.Combine” 的输入函数。
完成后,通过 “Line.ByStartPointEndPoint” 函数将 2 组点压缩/成对组合在一起,并在 Dynamo 中返回 10 行。
请参见 n 维列表中的练习,以查看使用“List.Combine”的另一个示例。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
相较于 “List.Map”,“List@Level” 功能允许直接选择要在节点的输入端口上使用的列表级别。此功能可应用于节点的任何传入输入,并让您可以更快、更容易地访问列表的各级别(相较于其他方法)。只需告诉节点要使用列表的哪个级别作为输入,然后让节点执行其余操作即可。
在本练习中,我们将使用 “List@Level” 功能隔离特定级别的数据。
我们将从一个简单的三维点栅格开始。
该栅格使用 X、Y 和 Z 范围构建,因此我们知道数据结构由 3 个层级组成:X 列表、Y 列表和 Z 列表。
这些层级存在于不同的级别上。级别显示在预览气泡的底部。“列表级别”列与上述列表数据相对应,以帮助确定要在哪个级别工作。
“列表级别”按相反顺序进行组织,以便最低级别数据始终位于“L1”。这将有助于确保图形按计划工作,即使上游发生任何更改也是如此。
要使用 “List@Level” 函数,请单击“>”。在此菜单中,您会看到两个复选框。
使用级别 - 这会启用 “List@Level” 功能。单击此选项后,将能够点进,然后选择希望节点使用的输入列表级别。使用此菜单,可以通过单击上下箭头来快速试用不同的级别选项。
保持列表结构 - 如果已启用,则可以选择保持该输入的级别结构。有时,您可能会有目的地将数据组织到子列表中。选中此选项,即可使列表组织保持完整,而不会丢失任何信息。
使用简单的三维栅格,我们可以通过切换“列表级别”来访问和可视化列表结构。每个列表级别和索引组合将从原始三维集中返回一组不同的点。
DesignScript 中的“@L2”允许我们仅选择级别 2 的列表。级别 2 列表(索引为 0)仅包含第一组 Y 点,从而仅返回 XZ 栅格。
如果将级别过滤器更改为“L1”,则我们将能够看到第一列表级别中的所有内容。级别 1 列表(索引 0)将所有三维点都包括在一个展平列表中。
如果我们尝试对“L3”执行相同操作,则我们仅会看到第三列表级别点。级别 3 列表(索引为 0)仅包含第一组 Z 点,从而仅返回 XY 栅格。
如果我们尝试对“L4”执行相同操作,则我们仅会看到第三列表级别点。级别 4 列表(索引为 0)仅包含第一组 X 点,从而仅返回 YZ 栅格。
尽管也可以使用 “List.Map” 创建此特定示例,但 “List@Level” 会极大地简化交互,从而可以轻松访问节点数据。请在下面查看 “List.Map” 和 “List@Level” 方法的比较:
尽管这两种方法都将允许我们访问相同的点,但 “List@Level” 方法允许我们轻松地在一个节点内的数据层之间切换。
要使用 “List.Map” 访问点栅格,我们需要使用 “List.GetItemAtIndex” 节点以及 “List.Map”。对于我们要向下步进的每个列表级别,我们需要使用额外的 “List.Map” 节点。根据列表的复杂程度,这可能需要将大量 “List.Map” 节点添加到图形中,才能访问正确级别的信息。
在此示例中,“List.GetItemAtIndex” 节点与 “List.Map” 节点结合使用会返回列表结构与 “List.GetItemAtIndex”(在选择“@L3”的情况下)相同的一组相同点。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
“Transpose”是一个处理列表的列表时的基本函数。与在电子表格程序中一样,转置会翻转数据结构的列和行。我们将在下面的基本矩阵中对此进行演示,并且在以下部分中我们将演示如何使用转置来创建几何关系。
让我们从上一个练习中删除 “List.Count” 节点,然后转到一些几何图形以查看数据的结构。
从 “Point.ByCoordinates” 将 “PolyCurve.ByPoints” 连接到“Watch”节点的输出。
输出会显示 5 条复合线,我们可以在 Dynamo 预览中看到这些曲线。Dynamo 节点将查找一列点(或在本例中为一列点列表)并基于它们创建一条复合线。实际上,每个列表已转换为数据结构中的曲线。
“List.Transpose” 节点将切换一列列表中所有列表的所有项目。这听起来很复杂,但其逻辑与 Microsoft Excel 中的“转置”相同:在数据结构中切换列和行。
请注意抽象结果:“转置”将列表结构从 5 列(每列 3 个项目)更改为 3 列(每列 5 个项目)。
请注意几何结果:使用 “PolyCurve.ByPoints”,我们在与原始曲线的垂直方向上获得 3 条复合线。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
本练习使用在上一个练习中建立的某些逻辑来编辑曲面。我们在此处的目标一目了然,但将更多涉及数据结构导航。我们希望通过移动控制点来接合曲面。
从上述节点字符串开始。我们将创建一个跨越默认 Dynamo 栅格的基本曲面。
使用 “代码块”,插入以下两行代码并分别连接到 “Surface.PointAtParameter” 的 “u” 和 “v” 输入:
-50..50..#3;
-50..50..#5;
确保将 “Surface.PointAtParameter” 的“连缀”设置为 “叉积”。
“Watch” 节点显示我们有一列 3 个列表(每个列表都含有 5 个项目)。
在此步骤中,我们要在已创建的栅格中查询中心点。为此,我们将选择中间列表中的中间点。有道理,对吧?
要确认这一点是正确的,我们还可以单击“Watch”节点项目来确认我们面向的目标是正确的。
使用 “代码块”,我们将编写一行基本代码,用于查询一列列表:
points[1][2];
使用 “Geometry.Translate”,我们会将选定点在 Z 方向上上移 20 个单位。
我们还要使用 “List.GetItemAtIndex” 节点选择中间行的点。注意:与上一步类似,我们还可以使用 “代码块”,通过一行代码
points[1];
查询列表
到目前为止,我们已成功查询中心点并将其向上移动。现在,我们需要将此移动的点插回原始数据结构。
首先,我们要替换在上一步中隔离的列表项。
使用 “List.ReplaceItemAtIndex”,我们会将使用且索引为 “2” 的中间项替换为与移动的点( “Geometry.Translate” )相连的替换项。
输出显示我们已将移动的点输入到列表的中间项。
现在,我们已经修改了列表,我们需要将此列表插回原始数据结构:列表的列表。
遵循相同的逻辑,使用 “List.ReplaceItemAtIndex” 将中间列表替换为我们修改的列表。
请注意,为这两个节点定义索引的 “代码块” 为 1 和 2,这与 “代码块” (points[1][2]) 中的原始查询匹配。
通过选择 “索引 1” 处的列表,我们会看到数据结构在 Dynamo 预览中亮显。我们已成功将移动的点合并到原始数据结构中。
基于这组点生成曲面的方法有多种。在本例中,我们将通过一起放样曲线来创建曲面。
创建 “NurbsCurve.ByPoints” 节点并连接新的数据结构,来创建三条 NURBS 曲线。
将 “Surface.ByLoft” 连接到 “NurbsCurve.ByPoints” 的输出。现在,我们得到了一个修改的曲面。我们可以更改几何图形的原始 Z 值。平移并观察几何图形更新!
“几何图形” 是设计语言。当编程语言或环境的核心有几何图形内核时,我们可以针对以下目标开启各种可能性:设计精确而稳健的模型、自动执行设计例程以及使用算法生成设计迭代。
了解几何图形类型及,将使我们能够浏览库中可用的 “几何图形节点” 的集合。几何图形节点按字母顺序组织,而不是按层次组织 - 它们在此处的显示类似于其在 Dynamo 界面中的布局。
此外,随着时间的流逝,在 Dynamo 中制作模型并将在“背景预览”中所看到内容的预览连接到图形中的数据流应会变得更加直观。
请注意,假定坐标系由栅格和彩色轴渲染
“选定节点”将在背景中以亮显颜色渲染相应的几何图形(如果节点创建几何图形)
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
传统上定义的几何图形是对形状、大小、图形的相对位置和空间特性的研究。这一领域悠久历史,可以追溯到数千年前。随着计算机的出现和普及,我们在定义、浏览和生成几何图形方面获得了强大的工具。现在,可以非常轻松地计算复杂几何交互的结果;实际上,我们所做的几乎是透明的。
如果您想知道如何利用计算机的强大功能来获得多样化和复杂的几何图形,请通过 Web 快速搜索“斯坦福兔”(即,一种用于测试算法的规范模型)。
在算法、计算和复杂性的环境中了解几何图形可能会令人望而生畏;但有一些关键和相对简单的原则,我们可以将这些原则确立为基础来开始构建更高级的应用程序:
几何图形是 “数据” - 对计算机和 Dynamo 而言,兔子与数字没有什么不同之处。
几何图形依赖 “抽象” - 从根本上来说,几何图元由给定空间坐标系中的数字、关系和公式进行描述
几何图形具有 “层次” - 点汇聚生成线、线汇聚生成面,以此类推
几何图形同时描述 “零件和整体” - 如果有曲线,则它既包括形状,也包括沿其的所有可能点
实际上,这些原则意味着我们需要知道我们正在处理的内容(几何图形的类型、如何创建等);因此,我们在开发更复杂的模型时,可以顺畅地构建、分解和重新构建不同的几何图形。
让我们花点时间了解一下几何图形的“抽象”说明和“层次”说明之间的关系。由于这两个概念是相关的,但起初并不总是很明显,因此一旦我们开始开发更深的工作流或模型,我们可能会快速遇到概念上的障碍。首先,我们使用维数作为所建模“素材”的简单描述符。描述形状所需的维数为我们提供了一个窗口,让我们可以了解几何图形是如何按层次组织的。
“点”(由坐标定义)没有任何维数 - 它只是描述每个坐标的数字
“线”(由两个点定义)现在有 一 个维数 - 我们可以向前(正方向)或向后(负方向)“漫游”直线
“平面”(由两条直线定义)有 两 个维数 - 现在可以向左或向右更多漫游
“方框”(由两个平面定义)有 三 个维数 - 我们可以定义相对于上或下的位置
维数是一种开始对几何图形进行分类的便捷方法,但它不一定是最佳方法。毕竟,我们不仅使用“点”、“线”、“平面”和“方框”建模 - 如果我想要弯曲,该怎么办?此外,还有另一类完全抽象的几何类型,即它们定义诸如方向、体积或各部件之间关系之类的特性。我们无法真正抓住向量,那么如何相对于空间中的显示内容定义向量?几何层次的更详细分类应适应“抽象类型”或“辅助对象”之间的差异,我们可以根据它们的帮助内容和有助于描述模型图元形状的类型对它们进行分组。
在 Dynamo 中创建模型并不局限于我们可以通过节点所生成的内容。以下是进一步处理几何图形的一些关键方法:
Dynamo 允许您输入文件 - 尝试将 CSV 用于点云,或将 SAT 用于引入曲面
使用 Revit 时,我们可以参照要在 Dynamo 中使用的 Revit 图元
正式地,字符串是代表文字常量或某种类型变量的字符序列。非正式,字符串是文本编程术语。我们已使用数字(整数和小数)来驱动参数,可以对文本执行相同操作。
字符串可用于各种应用,包括定义自定义参数、注释文档集以及解析基于文本的数据集。字符串节点位于“核心”>“输入类别”中。
上面的示例节点都是字符串。数字可以表示为字符串、字母或整个文本数组。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
通过查询字符串,即可快速解析大量数据。我们将介绍一些基本操作,这些操作可以加快工作流并帮助实现软件互操作性。
下图考虑了来自外部电子表格的数据字符串。该字符串表示矩形在 XY 平面中的顶点。让我们在微型练习中分解一些字符串拆分操作:
“;”分隔符分割矩形的每个顶点。这将为每个顶点创建一个包含 3 个项目的列表。
点击节点中间的“+”,可创建新的分隔符。
向画布添加“,”字符串,然后连接到新的分隔符输入。
现在,我们得到了包含十个项目的列表。节点先基于 “separator0” 进行分割,然后基于 “separator1” 进行分割。
虽然上述项目列表看起来像数字,但在 Dynamo 中仍将它们视为单独的字符串。要创建点,需要将点的数据类型从“字符串”转换为“数字”。使用 “String.ToNumber” 节点可执行此操作
此节点简单明了。将 “String.Split” 结果连接到输入。输出看起来没有什么不同,但数据类型现在是 “number” ,而不是 “string”。
使用其他一些基本操作,我们现在在原点处基于原始字符串输入绘制了一个三角形。
由于字符串是通用文本对象,因此它们承载了各种应用。让我们来了解一下 Dynamo 的“核心”>“字符串类别”中的一些主要操作:
这是一个将两个字符串按顺序合并到一起的方法。这将提取列表中的每个文字字符串,并创建一个合并字符串。
以下内容表示三个字符串的串联:
通过单击节点中心的“+/-”按钮,可在串联中添加或减少字符串。
输出会提供一个串联的字符串,其中包含空格和标点符号。
合并方法与连接方法非常相似,只是它增加了标点图层。
如果您使用过 Excel,则可能遇到过 CSV 文件。这代表逗号分隔值。可以使用逗号(或在本例中,使用两个短划线)作为 “String.Join” 节点的分隔符,以创建类似的数据结构。
下图表示两个字符串的合并:
分隔符输入允许一个分隔符创建一个字符串,该字符串会分割已合并的字符串。
我们先从该诗小节的基本字符串拆分开始。首先,我们注意到书写格式基于逗号设置。我们将使用此格式来将每行分隔为单独的项目。
基础字符串将粘贴到 “String” 节点中。
另一个 “String” 节点用于表示分隔符。在本例中,我们使用的是逗号。
“String.Split” 节点将添加到画布并连接到两个字符串。
输出表明,我们现在已将各行分成各个元素。
现在,让我们了解这首诗的优美部分:最后两行。原始诗小节是一项数据。在第一步中,我们已将该数据分为各个项目。现在,我们需要搜索所需的文字。尽管我们 可以 通过选择列表的最后两项来完成此操作,但如果这是一本书,我们不希望通读所有内容并手动隔离各元素。
我们使用 “String.Contains” 节点来搜索一组字符,而不是手动搜索。这类似于在文字处理器中执行“查找”命令。在本例中,如果在项目中找到相应子字符串,则返回“true”或“false”。
在 “searchFor” 输入中,我们定义了要在诗小节中查找的子字符串。我们使用一个带有文字“And miles”的 “String” 节点。
输出结果为一列 false 或 true。我们将在下一步中使用此布尔逻辑过滤各元素。
“List.FilterByBoolMask” 是我们要用来剔除 false 和 true 的节点。“in”输出返回“mask”输入为“true”的语句,而“out”输出返回“mask”输入为“false”的语句。
“in”的输出与预期一样,为我们提供了诗小节的最后两行。
现在,我们要通过合并这两行,来再现该诗小节。查看上一步的输出时,我们注意到列表中有两个项目:
使用两个 “List.GetItemAtIndex” 节点,我们可以使用值 0 和 1 作为索引输入来隔离项目。
每个节点的输出按顺序为我们提供最后两行。
要将这两个项目合并为一个项目,我们将使用 “String.Join” 节点:
在添加 “String.Join” 节点后,我们注意到需要分隔符。
要创建分隔符,我们向画布中添加一个 “String” 节点,然后键入逗号。
最终输出已将最后两个项目合并为一个项目。
隔离最后两行看起来可能需要大量工作;确实,字符串操作通常需要一些前期工作。但它们具有可伸缩性,可以相对轻松地应用于大型数据集。如果您以参数方式使用电子表格和互操作性,请务必记住字符串操作。
这使实体布尔成为一个强大的省时过程。有三种实体布尔运算,它们可区分保留几何图形的哪些部分。
除了这三项操作,Dynamo 还具有 “Solid.DifferenceAll” 和 “Solid.UnionAll” 节点,用于对多个实体执行差集和并集操作。
图标 | 名称/语法 | 输入(Inputs) | 输出 (Outputs) |
---|---|---|---|
照片由 拍摄。
注意:此练习是使用 Dynamo 的先前版本创建的。通过添加“List@Level”功能,“List.Map”的大部分功能已经解决。有关详细信息,请参见 下面 的。
注意:此练习是使用 Dynamo 的先前版本创建的。通过添加“List@Level”功能,“List.Combine”的大部分功能已经解决。有关详细信息,请参见下面的。
代码块简写使用“[]”来定义列表。与 “List.Create” 节点相比,这种方法可更快、更流畅地创建列表。代码块会在 中进行更详细的介绍。请参照下图,以注意如何使用代码块定义具有多个表达式的列表。
代码块简写使用“[]”作为要从复杂数据结构中选择所需特定项目的快速简便方法。代码块会在一章中进行更详细的介绍。请参照下图,以注意如何使用代码块查询具有多个数据类型的列表。
Dynamo Package Manager 为扩展几何图形类型和操作提供了附加功能 - 查看 软件包
在本练习中,我们将使用查询和操作字符串的方法来解构 Robert Frost 的诗的最后一小节。这并非最实用的应用,但在我们将概念性的字符串操作应用于节奏和韵律的清晰各行时,它将有助于我们掌握此类操作。
ARGB 颜色 (Color.ByARGB)
A,R,G,B
颜色
Alpha (Color.Alpha)
颜色
A
红色 (Color.Red)
颜色
R
绿色 (Color.Green)
颜色
G
蓝色 (Color.Blue)
颜色
B
组件 (Color.Components)
颜色
A,R,G,B
色调 (Color.Hue)
颜色
色调
饱和度 (Color.Saturation)
颜色
饱和度
亮度 (Color.Brightness)
颜色
亮度
Object.IsNull
obj
bool
如果 (If)
test, true, false
结果
公式 (IF(x,y,z))
x, y, z
结果
代码块 ((x?y:z);)
x? y, z
结果
相加 (+)
var[]...[], var[]...[]
var[]...[]
相减 (-)
var[]...[], var[]...[]
var[]...[]
相乘 (*)
var[]...[], var[]...[]
var[]...[]
相除 (/)
var[]...[], var[]...[]
var[]...[]