数据分组和筛选


您是否曾经想要更详细地了解 Grasshopper 中的数据或物件?例如,您是否曾经想过仅选择模型中应用了特定材质的物件(例如玻璃)? 或者,您可能想要删除模型中特定图层上且面积小于特定值的所有曲面?您能很轻松地做到吗?

Grasshopper 1 for Rhino 8 具有新组件,可帮助您更有效地管理数据。

要解释这些新组件的工作原理,最好从一个简单的示例开始。在这个体量模型中,BREP 代表建筑物的外部围护结构和用作地板的曲面。这些物件放置在不同的图层上,并根据其使用类型(办公室、住宅等)分配了不同的颜色。

大多数物件还附加了一些元数据,这些数据作为用户文本项附加在物件上面。

让我们通过计算体量模型中每座建筑物的总面积来开始本教程。我们的模型中有三个建筑体量。每个楼层都有一个分配给它们的建筑物 ID 号作为用户文本输入。

Grouping Content

首先打开 Grasshopper 编辑器,然后点击 File -> New Document 以新建一个定义。

要找到每栋建筑的总楼层面积,我们首先需要将 Rhino 模型中的所有楼层引用到我们的 Grasshopper 定义中。

下面这个是关于过滤数据的例子。由于我们按图层组织了模型,因此可以通过 Query Model Objects 组件 (在 Rhino 选项卡和物件子类别下)的图层输入项来筛选楼层。在单词 Floors 之后使用 “*” 通配符,可以选择 Floors 子图层上的所有物件。

将鼠标悬停在物件输出参数上,将会显示我们的模型中有 31 个曲面,它们代表模型中的每个楼层。

接下来,我们需要使用建筑物 ID 作为分组标准对每个楼层进行分组。我们使用 Group Content 组件 (在 Rhino 选项卡的 Content 子类别下) ,并将 query 组件的输出连接到 Content 的输入。

该组件使用 Key 输入来确定如何将内容分组到不同的数据树分支中。 当您右键单击 Key 输入时,您将看到几个选项。

Select Type - 在此下拉菜单中,您可以选择是否要按用户文本键或数据类型属性对内容进行分组。在本例中,我们希望根据 Building ID 用户文本值对物件进行分组,因此我们需要从下拉菜单中选择“用户文本”。

Select Property/Key - 根据上面的下拉菜单选择,树形视图控件将显示可用的属性或键的列表,您可以将其用作筛选条件。在此示例中,我们可以选择“Building ID”键。

查看 Content 输出,所有楼层现在都已根据 Building ID 号分为不同的分支。Values 输出返回一个列表,其中包含在 content 中找到的所有唯一键值对。在本例中,我们看到一个包含三个值 (1、2 和 3) 的列表,它们对应于在内容列表中找到的唯一 ID 值以及分组内容的数据树分支。

这个过程的最后一步是将数据树的每个分支上的所有面积相加。由于我们所有的楼层地面现在都分为不同的分支,因此可以很容易地将 Group Content 组件的输出传递到 Area 组件,然后使用 Mass Addition 组件将所有这些值相加在一起。

从上面的 Grasshopper 定义中,我们可以确定:

  • Building 1 = 43,622 sf
  • Building 2 = 36,626 sf
  • Building 3 = 5,736 sf

这种工作流程的好处在于更改分组标准的简便性。例如,您想要确定不同使用类型 (住宅、办公、商业等) 的总面积,而不仅仅是每栋建筑的总面积。这种情况下,您只需要将 Key 属性改为 “Use Type”。其它一切可保持不变。

将分组标准改为 “Use Type”,得到的总面积为:

  • Commercial = 21,740 sf
  • Educational = 5,736 sf
  • Mixed Use = 11,326 sf
  • Office = 23,972 sf
  • Residential = 23,210 sf

Filtering Content

除了数据分组之外,我们还可以根据是否满足某个条件来过滤内容。通常,筛选条件将比较一个物件的属性与另一个物件的属性,并返回一个布尔值(True 或 False)。比如,x 是否等于 y?或者 x 是否大于或等于 y?我们还可以使用运算符将这些规则组合成更复杂的表达式。

现在,让我们采用现有模型并创建一系列过滤器,这些过滤器将根据以下标准分隔楼层板:

  1. Use Type 必须是 “Office” 类型
  2. 地板面积必须大于 2,250 sqft
  3. 地板面积也必须小于 2,500 sqft

让我们从创建一个新的 Grasshopper 定义开始。在 Grasshopper 文件菜单中,点击文件 -> 新建。就像先前的案例,使用 Query Model Objects 组件并将 Layer 过滤器设置为 “Floors”,将所有楼层的曲面引用到 Grasshopper 文档中。输出应包含 31 个曲面,分别代表模型中的每个楼层地板。

接下来,让我们创建一个过滤器来定义上面的第一个条件 - 过滤使用类型为 “Office” 类型的所有楼层。在 Rhino 选项卡的内容子类别下,我们可以使用许多不同的过滤器,其中一些可以检查匹配性。在本教程中,让我们首先在画布上添加一个 Match Text Filter 组件。

Match Text Filter 是一个非常强大且灵活的文本比较组件。在这个过滤器中,我们要遍历每个地板,并提取分配给 “Use Type” 用户文本输入的值。然后,我们将比较该值,看它是否与 “Office” 一词匹配,并相应地过滤物件。

Match Text Filter 有三种操作模式。如果右键单击 Match Text Filter 组件的中间,您会看到三种模式的列表:

在此示例中,我们仅对等于单词 “Office” 的文本值感兴趣。因此,在 Match Text Filter 的右键菜单中选择 Equals 模式。

接下来,我们需要指定 Key 输入来确定如何过滤内容。再次,就像上个示例中一样,我们可以右键单击 Key 输入,然后从从下拉菜单中选择 “User Text” ,然后从树视图控件中选择 “Use Type”。

最后一步是定义 Match Text Filter 的 Pattern 输入,以定义我们将要进行比较的文本值。在这个示例中,我们想要检查 Use Type 的值是否等于 “Office” ,所以我们可以将一个包含该词的文本面板添加到 Pattern 输入。

现在,我们已经创建了一个过滤器,我们需要在画布上添加一个 Filter Content 组件来执行实际的过滤操作。我们要过滤的内容是从 Query Model Objects 组件返回的 31 个BREP。而我们要使用的过滤器就是我们刚刚使用 Match Text Filter 创建的那个。

从输出来看,只有 10 个曲面符合我们的过滤条件 (即只有 10 个曲面符合 “Office” 用途类型)。尽管如此,我们还没完成。我们还想根据面积大于 2,250 平方英尺但小于 2,500 平方英尺的楼板进行过滤。

添加一个 Greater Than Filter 组件,并将其放在 Match Text Filter 组件下面。就像之前操作,我们需要设置 Key 输入来定义我们要在此过滤器中比较的值。在本例中,我们要设置 Key 以查看 Area 的用户文本值。因此,右键单击 Key 输入并从树视图控件中选择"面积" 。

接下来,我们需要定义一个数值来与面积值进行比较。添加一个 Numeric Slider (位于参数选项卡的输入子类别下) 并将值设置为 2,250。您可以将此滑块的最小值和最大值设置为您想要的任何值,但此案例中选择了 2,000 和 2,500 的值。

我们现在创建了一个过滤器,用于检查大于 2,250 sqft 的地板。 接下来创建另一个过滤器用以检查小于 2,500 sqft的地板。

在刚刚创建的 Greater Than Filter 下面添加一个 Smaller Than Filter 组件。设置 Key 输入为面积用户文本值。选择我们刚刚创建的滑块并将另一个滑块复制/粘贴到我们的画布上。将这个新滑块的值设置为 2,500,然后将其连接到 Smaller Than Filter 的 Value 输入端。

现在,我们的定义中有三个过滤器,它们与我们上面定义的标准相匹配。但是,我们需要将它们组合在一起,以便所有三个过滤器都必须为 true 才能正确过滤内容。 为此,我们使用 Intersection Filter 组件。

Intersection Filter 组件可以让您将多个过滤器组合在一起,并且仅当所有输入过滤器的计算结果都为 TRUE 时才会返回 TRUE。 按住 SHIFT 键,将三个过滤器的输出连接到 Intersection Filter 的 Filters 输入端。

最后,将连接到 Filter Content 组件的 Filter 输入端的 Match Text Filter 替换为 Intersection Filter 的输出。

您会注意到,我们现在只有从 Filter Content 组件返回的 5 个 BREPs。这些是与 “Office” 使用类型相匹配的 5 层楼板,其面积大于 2,250 平方英尺但小于 2,500 平方英尺。

请试用