數據的分組和過濾


您是否曾經想要更詳細的了解 Grasshopper 中的數據或物件?例如,您是否曾經想要只選取模型中套用特定材質的物件 (如玻璃)?或者,您可能想要刪除模型中特定圖層上且面積小於特定值的所有曲面。您是否可以很輕鬆的做到呢?

Grasshopper 1 for Rhino 8 有新元件,可協助您更有效地管理數據。

要解釋這些新元件的工作原理,最好從一個簡單的範例開始。在這個 質量模型中,BREP 代表建築物的外部圍護結構和用作地板的曲面。這些物件被放置在不同的圖層上,並根據其使用類型 (辦公室、住宅等) 賦予不同的顏色。

大多數物件也有附加一些後設資料作為外掛程式文字項目。

讓我們透過計算質量模型中每棟建築物的總面積來開始本教學。我們的模型有三個建築物,每個樓層都有一個賦予它們的建築物 ID 號碼作為外掛程式文字項目。

內容分組

首先,我們開啟 Grasshopper 編輯器並選擇 File -> New Document 開始新定義。

為了找到每棟建築的總建築面積,我們需要先將 Rhino 模型中的所有樓層引用到 Grasshopper 定義。

本教學主要是關於數據的過濾,但由於我們是以圖層組織模型,因此我們可以使用 Query Model Objects 元件 (位於 Rhino 標籤的 Objects 子類別下) 的圖層 (Layer) 輸入端過濾樓層。在 Floors 後加上“*”,它​​將會選取 Floors 子圖層上的所有物件。

將滑鼠停留在 Objects 輸出參數上會顯示我們有 31 個曲面,它們代表模型中的每個樓層。

接下來,我們需要使用建築物 ID 作為分組標準對每個樓層進行分組。使用 Group Content 元件 (位於 Rhino 標籤的 Content 子類別下) 並將 Query 元件的輸出端連接到 Content 輸入端。

此元件使用 Key 輸入端決定如何將內容分組到不同的數據樹分支。當您在 Key 輸入端按滑鼠右鍵時,您會看到幾個選項。

選取類型 - 在此下拉式選單中,您可以選擇是否要依照外掛程式文字鍵或數據類型屬性對內容進行分組。在本例中,我們希望根據建築物 ID 的外掛程式文字值對物件進行分組,因此我們需要從下拉式選單中選擇 “User Text”。

選取屬性/鍵 - 根據上述的下拉式選單,樹狀視圖控制項將顯示可用作過濾條件的可用屬性或鍵的清單。在本例中,我們可以選擇 “Building ID” 鍵。

查看 Content 輸出端,現在所有樓層都已根據建築物 ID 號碼分為不同的分支。Values 輸出端會傳回在內容中找到的所有獨立鍵值的清單。在本例中,我們看到一個包含三個值 (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

過濾內容

除了分組之外,我們還可以根據是否滿足某個條件來過濾內容。通常,過濾條件會將一個物件屬性與另一個物件屬性進行比較並傳回一個布林值 (True 或 False)。想一想,x 等於 y 嗎? 或 x 大於或等於 y? 我們也可以使用運算子將這些規則組合成更複雜的運算式。

因此,讓我們採用現有模型並建立一系列過濾器,這些過濾器將根據以下標準分隔樓層:

  1. Use Type 必須是 “Office” 類型並且
  2. 樓層面積必須大於 2,250 平方英尺
  3. 但必須小於 2,500 平方英尺

讓我們先建立一個新的 Grasshopper 定義。在 Grasshopper 主選單,選擇 File -> New Document。就像前面的範例一樣,使用 Query Model Objects 元件並將 Layer 過濾器設定為 “Floors”,將所有樓層曲面引用到我們的 Grasshopper 檔案。輸出端應包含 31 個曲面,代表模型中的每個樓板。

接下來,建立一個過濾器定義上述的第一個條件 - 過濾 use type 等於 “Office” 類型的所有樓層。 在 Rhino 標籤的 Content 子類別下,我們可以使用許多不同的過濾器,其中有一些可以檢查相等性。然而,在本教學中,我們首先將 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 個符合我們過濾標準的曲面 (即對應於 “Office” 使用類型的樓層)。然而,我們還沒有完全完成。我們還需要根據面積大於 2,250 平方英尺但小於 2,500 平方英尺的樓層進行過濾。

加入一個 Greater Than Filter 元件並將其放置在 Match Text Filter 元件的下方。就像前面一樣,我們需要設定 Key 輸入端以定義我們要在此過濾器中比較的值。在本範例中,我們要設定 Key 以查看 Area* 外掛程式文字值。因此,在 Key 輸入端按滑鼠右鍵,從樹狀視圖控制項選擇 “Area”。

接下來,我們需要定義一個數值與面積值進行比較。加入一個 Numeric Slider (位於 Params 標籤的 Input 子類別下),並將值設為 2,250。您可以將此滑桿的最小值和最大值設定為您想要的任何值,此範例分別選擇了 2,000 和 2,500 的值。

我們現在建立了一個過濾器,用於檢查大於 2,250 平方英尺的樓層。現在要再建立另一個過濾器用來尋找面積小於 2,500 平方英尺的樓層。

在我們剛剛建立的 Greater Than Filter 下方加入一個 Smaller Than Filter 元件。將 Key 輸入端設定為 Area 外掛程式文字值。選擇我們剛剛建立的滑桿並將另一個滑桿複製/貼上到視窗上。將此新滑桿的值設為 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 個 BREP。這些是與 “Office” 使用類型相符的 5 個樓層,面積大於 2,250 平方英尺但小於 2,500 平方英尺。

試試看