Daten gruppieren und filtern


Haben Sie sich schon einmal mehr Granularität auf den Daten oder Objekten innerhalb von Grasshopper gewünscht? Wollten Sie zum Beispiel nur diejenigen Objekte in Ihrem Modell auswählen, auf die ein ganz bestimmtes Material (z.B. Glas) angewendet wurde? Oder wollten Sie vielleicht alle Flächen in Ihrem Modell entfernen, die auf einer bestimmten Ebene lagen, und deren Flächeninhalt einen bestimmten Wert unterschritt? Konnten Sie das (mit Leichtigkeit) tun?

Grasshopper 1 für Rhino 8 verfügt jetzt über Komponenten, mit denen Sie Ihre Daten effizienter verwalten können.

Zur Erläuterung, wie diese neue Komponente funktioniert, beginnen wir am besten mit einem einfachen Beispiel. In diesem Körpermodell befinden sich BREPs, welche die Außenfassade der Gebäude wie auch die als Stockwerke verwendeten Flächen repräsentieren. Die Objekte wurden auf verschiedenen Ebenen platziert, bei Zuweisung unterschiedlicher Farben aufgrund ihrer Anwendungsart (Büro, Wohnraum, etc.).

Den meisten Objekten wurden auch einige Metadaten als Benutzertexteinträge zugewiesen.

Beginnen wir dieses Tutorial, indem wir den gesamten Flächeninhalt jedes Gebäudes in unserem Körpermodell herausfinden. Wir haben drei Gebäudekörper in unserem Modell. Jedem dieser Etagenböden wurde eine Gebäude-ID-Nummer als Benutzertexteintrag zugewiesen.

Inhalt gruppieren

Öffnen wir zunächst den Grasshopper-Editor und klicken wir auf File -> New Document, um eine neue Definition zu beginnen.

Um den allgemeinen Flächeninhalt jedes Gebäudes herauszufinden, müssen wir zunächst alle Etagen in unserem Rhino-Modell in unsere Grasshopper-Definition referenzieren.

In diesem Tutorial geht es ausschließlich um Datenfilterung. Da wir unser Modell in Ebenen organisiert haben, können wir die Etagen durch Verwendung der Ebeneneingabe der Komponente Query Model Objects (zu finden unter dem Reiter Rhino und der Unterkategorie Objekt) herausfiltern. Unter Verwendung des Ersatzzeichens “*” nach dem Wort Floors werden alle Objekte auf den Floors-Unterebenen ausgewählt.

Wenn wir den Mauszeiger über die Objekt-Ausgabeparameter verschieben, sehen wir dass wir 31 Flächen haben, die jede der Bodenplatten in unserem Modell repräsentieren.

Als nächstes müssen wir alle diese Bodenplatten unter Verwendung der Gebäude-ID als Gruppierungskriterium gruppieren. Verwenden wir die Komponente Group Content (zu finden unter dem Rhino-Reiter und der Unterkategorie Content) und verbinden die Ausgabe der Komponente Query mit der Eingabe Content.

Diese Komponente verwendet die Eingabe Key um zu bestimmen, wie der Inhalt in unterschiedliche Verzweigungen des Datenbaums zu gruppieren ist. Wenn Sie mit der rechten Maustaste auf die Eingabe Key klicken, bekommen Sie einige Optionen zu sehen.

Typ auswählen - In diesem Drop-down können Sie auswählen, ob Sie Inhalt nach einem Benutzertextschlüssel oder nach einem Datentypattribut gruppieren wollen. Im vorliegenden Fall wollen wir die auf dem Benutzertextwert der Gebäude-ID basierenden Objekte gruppieren, daher müssen wir “User Text” aus dem Dropdownmenü auswählen.

Eigenschaft/Schlüssel auswählen - Je nach Auswahl aus dem Dropdownmenü - sieh oben - zeigt die Steuerung mit drei Ansichten eine Liste verfügbarer Eigenschaften oder Schlüssel an, die Sie als Filterkriterien verwenden können. Für dieses Beispiel können wir den Schlüssel “Building ID” verwenden.

Mit Blick auf die Ausgabe Content sehen wir, dass jetzt alle Etagen über verschiedene Zweige verteilt wurden, je nach Gebäude-ID-Nummer. Die Ausgabe Values gibt eine Liste aller einzigartigen Schlüsselwerte wieder, die im Inhalt gefunden wurden. In diesem Fall sehen wir eine Liste von drei Werten (1, 2 und 3), in Entsprechung zu den einzigartigen ID-Werten, die in der Inhaltsliste wie auch den Datenbaumverzweigungen des gruppierten Inhalts gefunden wurden.

Der letzte Schritt dieses Prozesses besteht in der Summierung aller Bereiche auf jedem Zweig unseres Datenbaums. Da alle unsere Bodenflächen jetzt über verschiedene Zweige verteilt sind, ist es relativ einfach, die Ausgabe der Komponente Group Content in eine Komponente Area einzupassen, und dann alle diese Werte unter Verwendung einer Komponente Mass Addition miteinander zu summieren.

Aus der obigen Grasshopper-Definition lässt sich folgendes bestimmen:

  • Gebäude 1 = 43,622 Qf
  • Gebäude 2 = 36,626 Qf
  • Gebäude 3 = 5,736 Qf

Was diesen Workflow so angenehm macht, ist die Leichtigkeit, mit der die Gruppierungskriterien geändert werden können. Nehmen wir z.B. an, Sie möchten den gesamten Flächeninhalt der verschiedenen Anwendungsarten (also Wohngebäude, Büro, Geschäftsraum, etc.) bestimmen, statt nur den gesamten Flächeninhalt jedes Gebäudes. In diesem Fall müssen wir nur die Eigenschaft Key in “Use Type” umwandeln. Alles andere kann bleiben wie es ist.

Indem wir die Gruppierungskriterien in “Use Type” umschalten, summiert sich die gesamte Fläche in Quadratfuß wie folgt:

  • Geschäftsräume = 21,740 Qf
  • Bildungsräume = 5,736 Qf
  • Gemischt = 11,326 Qf
  • Büro = 23,972 Qf
  • Wohnräume = 23,210 Qf

Inhalt filtern

Zusätzlich zur Gruppierung können wir Inhalt auch basierend auf der Erfüllung oder Nichterfüllung einer Bedingung filtern. Eine Filterbedingung vergleicht typischerweise eine Objekteigenschaft mit einer anderen und erbringt einen Booleschen Wert (Wahr oder Falsch). Ist beispielsweise x gleich wie y? Oder ist x größer als oder gleich wie y? Wir können diese Regeln auch unter Verwendung von Operatoren zu komplexeren Ausdrücken komprimieren.

Nehmen wir also unser vorhandenes Modell und erstellen wir eine Reihe von Filtern, welche die Bodenplatten nach folgenden Kriterien trennen:

  1. Use Type muss Typ “Office” sein UND
  2. Der Bodenbereich muss größer sein als 2250 Quadratfuß sein UND
  3. Der Bodenbereich muss auch kleiner sein als 2500 Quadratfuß

Beginnen wir mit der Erstellung einer neuen Grasshopper-Definition. Klicken Sie im Grasshopper-Dateimenü auf File -> New Document. Nehmen wir, wie schon im vorausgegangenen Beispiel, die Komponente Query Model Objects mit dem auf “Floors” eingestellten Filter Layer, um sämtliche Bodenflächen in unser Grasshopper-Dokument zu referenzieren. Das Ausgabemodell sollte 31 Flächen enthalten, die jede der Bodenplatten in unserem Modell repräsentieren.

Als nächstes erstellen wir einen Filter, der die erste unserer obigen Bedingungen definiert - alle Bodenplatten filtern, deren Verwendungsart dem Typ “Office” entspricht. Unter dem Rhino-Reiter und der Unterkategorie Content steht uns eine Reihe von Filtern zur Verfügung, von denen einige auf Gleichheit angewendet werden können. Für dieses Tutorial beginnen wir mit der Hinzufügung einer Komponente Match Text Filter auf unserer Arbeitsfläche.

Der Match Text Filter ist eine unglaublich leistungsstarke und flexible Komponente für Textvergleiche. In diesem Filter wollen wir jede Bodenplatte durchlaufen und den dem Benutzertexteintrag “Use Type” zugewiesenen Wert extrahieren. Dann vergleichen wir diesen Wert um zu sehen, ob er dem Wort “Office” gleichkommt, und filtern die Objekte dementsprechend.

Der Match Text Filter kann auf drei Weisen funktionieren. Wenn Sie mit der rechten Maustaste mitten auf die Komponente Match Text Filter klicken, sehen Sie eine Auflistung von drei Modi:

In diesem Beispiel sind für uns nur Textwerte von Belang, die dem Wort “Office” gleichkommen. Wählen wir also den Modus Equals im Kontextmenü der rechten Maustaste des Match Text Filters.

Als nächstes müssen wir die Eingabe Key festlegen, um zu bestimmen, wie der Inhalt gefiltert wird. Wie schon im vorangegangenen Beispiel können wir mit der rechten Maustaste auf die Key-Eingabe klicken und “User Text” aus dem Dropdown-Menü sowie “Use Type” aus der Drei-Ansichten-Steuerung wählen.

Der letzte Schritt besteht darin, die Eingabe Pattern des Match Text Filters festzulegen, um den zum Vergleich verwendeten Textwert zu definieren. Für dieses Beispiel sollten wir überprüfen, ob der Wert von Use Type dem Wort “Office” gleichkommt, damit wir ein Text-Panel mit diesem Wort zur Eingabe Pattern hinzufügen können.

Nachdem wir nun einen Filter erstellt haben, müssen wir eine Komponente Filter Content auf unserer Arbeitsfläche hinzufügen, um die tatsächliche Filterfunktion anzuwenden. Der Inhalt, den wir filtern wollen, sind die 31 BREPs die von der Komponente Query Model Objects wiedergegeben werden. Und der von uns gewünschte Filter ist der, den wir gerade unter Verwendung des Match Text Filters erstellt haben.

Mit Blick auf die Ausgabe haben wir jetzt nur 10 Flächen, die mit unseren Filterkriterien übereinstimmten (d.h. diese Bodenplatten, die dem Typ “Office” entsprechen). Wirklich fertig sind wir aber noch nicht. Wir wollten auch die Bodenplatten basierend darauf filtern, welche Bereiche größer als 2250, aber kleiner als 2500 Quadratfuß waren.

Fügen wir eine Komponente Greater Than Filter hinzu und platzieren wir sie unter unserer Komponente Match Text Filter. Wie schon zuvor müssen wir unsere Key-Eingabe so einstellen, dass Sie definiert, welchen Wert wir in diesem Filter vergleichen wollen. In diesem Fall sollten wir den Schlüssel mit Blick auf den Benutzertextwert Area einstellen. Klicken Sie also mit der rechten Maustaste auf den Key-Input und wählen Sie “Area” aus der Drei-Ansichten-Steuerung.

Als nächstes müssen wir einen numerischen Wert definieren, mit dem wir unseren Bereichswert vergleichen können. Fügen wir einen Numeric Slider hinzu (zu finden unter dem Reiter Params und in der Unterkategorie Input) und setzen den Wert auf 2250. Den Minimal- und Maximalwert dieses Schiebereglers können Sie beliebig einstellen, ich habe jedoch die jeweiligen Werte 2000 und 2500 gewählt.

Wir haben jetzt einen Filter erstellt, mit dem nach Bodenplatten gesucht wird, die größer sind als 2250 Quadratfuß. Erstellen wir einen weiteren, zur Suche nach Bodenplatten, die kleiner sind als 2500 Quadratfuß.

Fügen Sie eine Komponente Smaller Than Filter unter dem Filter Greater Than hinzu, den wir gerade erstellt haben. Stellen Sie die Eingabe Key auf den Bereichs-Benutzertextwert ein. Wählen Sie den gerade erste erstellten Schieberegler und fügen Sie mittels Copy/Paste einen weiteren auf Ihrer Arbeitsfläche hinzu. Stellen Sie den Wert dieses neuen Schiebereglers auf 2500 ein und verbinden Sie seinen Output mit dem Value-Input des Filters Smaller Than.

Wir haben jetzt drei Filter in unserer Definition, welche den oben definierten Kriterien entsprechen. Wir müssen diese jedoch miteinander kombinieren, damit alle drei Filter den Inhalt korrekt und den Gegebenheiten entsprechend filtern können. Hierfür wollen wir die Komponente Intersection Filter verwenden.

Mit dem Intersection Filter können Sie eine Vielzahl von Filtern kombinieren, und TRUE wird nur dann erbracht, wenn alle Filter als TRUE ausgewertet werden. Verbinden Sie durch Gedrückthalten der Umschalttaste den Output unserer drei Filter in den Filters-Input des Intersection Filters.

Ersetzen Sie schließlich den mit der Filter-Eingabe der Komponente Filter Content verbundenen Match Text Filter durch die Ausgabe des Intersection Filters. Ihre Definition sollte wie auf dem Bild unten aussehen.

Sicher haben Sie bemerkt, dass wir jetzt nur 5 BREPs haben, die von der Komponente Filter Content erbracht wurden. Dies sind die 5 Bodenplatten, die dem Verwendungstyp “Office” entsprechen und dazu größer als 2250 Quadratfuß, aber kleiner als 2,500 Quadratfuß sind.

Ausprobieren