データのグループ化とフィルタリング


Grasshopper内のデータやオブジェクトをより細かく管理したいと思ったことはありませんか?例えば、モデル内の (ガラスなど) 特定のマテリアルが適用されているオブジェクトだけを選択したいと思ったことはありませんか?あるいは、特定のレイヤ上にある、面積が特定の値より小さいモデル内のすべてのサーフェスを削除したいこともあるかもしれません。これらのことを簡単にしてみたいと思いませんか?

Rhino 8のGrasshopper 1には、データをより効率的に管理するのに役立つ新しいコンポーネントが搭載されています。

これらの新しいコンポーネントがどのように機能するかを簡単な例を使用して説明していきましょう。この マスモデル には、建物の外側のエンベロープと床の役割をするサーフェスを表すBREPがあります。オブジェクトは別々のレイヤに配置され、用途のタイプ (オフィス、住宅など) に基づいて異なる色が割り当てられています。

ほとんどのオブジェクトには、メタデータがユーザーテキストのエントリとして添付されています。

このチュートリアルをマスモデル内の各建物の全体面積を把握することから始めましょう。モデルには3つの建物のマスがあります。また、それぞれの床プレートには、建物のID番号がユーザーテキストのエントリとして割り当てられています。

コンテンツのグループ化

まず、Grasshopperのエディタを開き、File -> New Documentをクリックして、新しい定義を開始します。

各建物の全体の床面積を見つけるには、まず Rhinoのモデル内のすべての床を Grasshopperの定義に参照させる必要があります。

このチュートリアルは、データをフィルタリングすることを学ぶことがすべてです。モデルはレイヤごとに組織化されているので、Query Model Objectsコンポーネント (RhinoタブのObjectsサブカテゴリ) の入力パラメータのLayerを使用すると、床をフィルタリングできます。Floorsという単語の後にワイルドカード「*」を使用します。これでFloorsのサブレイヤ上のすべてのオブジェクトを選択できます。

出力パラメータの「Objects」の上にマウスを置くと、モデル内の各床プレートを表す31個のサーフェスがあることがわかります。

次に、グループ化の基準として建物のIDを使用して、これらの各床プレートをグループ化する必要があります。Group Contentコンポーネント (RhinoタブのContentサブカテゴリ) を使用して、クエリコンポーネントの出力を入力パラメータのContentに接続しましょう。

このコンポーネントは、入力パラメータのKeyを使用して、コンテンツを別々のデータツリーのブランチ (枝) にグループ化する方法を決定します。入力パラメータのKeyを右クリックしてください。いくつかのオプションが表示されます。

タイプの選択 - このドロップダウンでは、コンテンツをユーザーテキストのキーごとにグループ化するか、データタイプの属性ごとにグループ化するかを選択できます。ここでは、建物のIDのユーザーテキスト値に基づいてオブジェクトをグループ化したいため、ドロップダウンメニューから「User Text」を選択します。

プロパティ/キーの選択 - 上のドロップダウンメニューの選択によって、ツリービューのコントロールに、フィルタリングの基準として使用できる使用可能なプロパティ (キー) のリストが表示されます。この例では、「Building ID」キーを選択します。

出力パラメータの「Content」を見ると、すべての床が建物のID番号に従って異なるブランチに分けられています。出力パラメータの「Values」は、コンテンツ内で見つかったすべての一意のキー値のリストを返します。この場合は、コンテンツのリストで見つかった一意のID値に対応する3つの値(1、2、および3)のリストと、グループ化されたコンテンツのデータツリーブランチが表示されます。

このプロセスの最後のステップは、データツリーの各ブランチ上のすべての面積を合計することです。すべての床サーフェスが異なるブランチに分けられたため、Group Contentコンポーネントの出力をAreaコンポーネントに渡し、Mass Additionコンポーネントを使用してこれらの値をすべて加算するのは非常に簡単です。

上記のGrasshopperの定義から、次のことがわかります。

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

このワークフローの利点は、グループ化の基準を簡単に変更できることです。例えば、単にそれぞれの各建物の合計平方フィートでを求めるだけでなく、様々な用途タイプ (Residential(住宅)、Office(オフィス)、Commercial(商業)など) の合計平方フィートを求めたいとします。この場合、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をクリックします。前の例と同様に、Layerフィルタを「Floors」に設定したQuery Model Objectsコンポーネントを使用して、すべての床のサーフェスをGrasshopperのドキュメントに参照してみましょう。出力には、モデル内の各床プレートを表す31個のサーフェスが含まれているはずです。

次に、上記の1つ目の条件を定義するフィルタを作成しましょう。用途タイプ (Use Type) が「Office」に等しいすべての床プレートをフィルタリングしていきます。RhinoタブのContentサブカテゴリには、利用できる様々なフィルタがあり、その内のいくつかは同等性をチェックできます。ただし、このチュートリアルでは、キャンバスにMatch Text Filterコンポーネントを追加することから始めましょう。

Match Text Filterは、テキスト比較のための非常に強力で柔軟なコンポーネントです。このフィルタでは、それぞれの床プレートから「Use Type」というユーザーテキストのエントリに割り当てられた値を抽出します。次に、その値が「Office」という単語と一致するかどうか比較し、それに応じてオブジェクトをフィルタリングします。

Match Text Filterには3つのモードがあります。Match Text Filterコンポーネントの中央を右クリックすると、その3つのモードのリストを表示できます:

この例では、「Office」という単語に*等しい (Equal)*テキスト値のみに関心があります。そこで、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を設定して、このフィルタで比較する値を定義する必要があります。ここでは、Areaのユーザーテキスト値を参照するようにキーを設定するので、入力パラメータのKeyを右クリックし、ツリービューコントロールから「Area」を選択します。

次に、面積値を比較する数値を定義する必要があります。Numeric Slider(ParamsタブのInputサブカテゴリ)を追加し、値を2,250に設定しましょう。このスライダの最小値と最大値は任意に設定できますが、ここではそれぞれ2,000と2,500 の値を選択しました。

これで、2,250平方フィートを超える床プレートをチェックするフィルタが作成できました。次は、2,500平方フィート未満の床プレートを探す別のテンプレートを作成してみましょう。

Smaller Than Filterコンポーネントを作成したばかりのGreater Than Filterの下に追加します。入力パラメータのKeyをAreaのユーザーテキスト値に設定します。作成したばかりのスライダを選択し、別のスライダをキャンバスにコピー/ペーストします。この新しいスライダの値を2,500に設定し、その出力をSmaller Than Filterの入力パラメータのValueに接続します。

これで、最初に定義した基準に一致する3つのフィルタが定義に追加されました。ただし、コンテンツを正しくフィルタリングするには、3つのフィルタがすべてTrueになるように、これらを組み合わせる必要があります。これを行うには、Intersection Filterコンポーネントを使用します。

Intersection Filterを使用すると、複数のフィルタを組み合わせることができ、すべての入力フィルタがTRUEと評価された場合にのみTRUEを返します。SHIFTキーを押しながら、3つのフィルタの出力をIntersectionフィルタの入力パラメータのFiltersに接続します。

最後に、Filter Contentコンポーネントの入力パラメータのFilterに接続されているMatch Text FilterをIntersection Filterの出力に置き換えます。定義は以下の画像のようになります。

Filter Contentコンポーネントから返されるBREPは5つだけであることがわかります。これらは「Office」の用途タイプに一致し、2,250 平方フィートより大きく、2,500平方フィート未満の5つの床プレートです。

試すには