Computational Design · Grasshopper-Plugin-Entwicklung

Grasshopper-Plugin-Entwicklung: eigene Komponenten für Rhino und Grasshopper

Eine Definition löst ein Problem einmal. Ein Plugin löst dasselbe Problem beim nächsten Mal wieder, im ganzen Team, ohne dass jemand die Logik kopiert und dabei verändert.

Ergebnis
Kompilierte Komponenten für Grasshopper
Sprachen
C# gegen das Rhino- und Grasshopper-SDK, Python für Vorstufen
Übergabe
Quellcode, Dokumentation, Installer, Beispiel-Definitionen
Übergeordnet
Computational Design

01 · Entscheidung

Wann ein Plugin die Definition schlägt

Nicht jede Aufgabe braucht ein Plugin. Eine Grasshopper-Definition ist schneller gebaut, leichter zu ändern und für viele Projekte die richtige Antwort. Ein Plugin lohnt sich, wenn mindestens einer der folgenden vier Punkte zutrifft, und es lohnt sich sehr, wenn drei davon zutreffen.

01

Wiederverwendung

Dieselbe Gruppe von vierzig Komponenten taucht in sieben Projekten auf, jedes Mal leicht anders, weil sie jedes Mal von Hand kopiert und angepasst wurde. Sobald das passiert, ist die Logik faktisch siebenmal vorhanden und nirgends gepflegt. Eine kompilierte Komponente ersetzt die vierzig durch eine, und ein Fehler wird an einer Stelle behoben statt an sieben.

02

Geschwindigkeit

Grasshopper wertet einen Graphen aus, und bei Schleifen, großen Datenbäumen und Geometrieprüfungen kostet dieser Weg spürbar Zeit. Was in einer Definition als Kette aus vielen kleinen Schritten läuft, läuft in kompiliertem C# als eine Rechnung. Der Unterschied wird dort entscheidend, wo jemand am Regler zieht und eine Antwort erwartet, statt einen Batch-Lauf zu starten.

03

Schutz von Know-how

Eine Definition ist offen: Wer sie öffnet, liest die Methode. Das ist im eigenen Team ein Vorteil und außerhalb ein Risiko. Wenn eine Definition an einen Zulieferer, einen Partner oder einen Kunden geht, ist eine kompilierte Komponente die Form, in der Sie Funktion weitergeben, ohne das Verfahren mitzuliefern. Die Entscheidung darüber, was offen bleibt und was nicht, treffen Sie und nicht das Dateiformat.

04

Verteilung im Team

Eine Definition, die per Mail wandert, existiert nach vier Wochen in fünf Ständen. Ein Plugin hat eine Version, eine Installationsroutine und eine feste Stelle in der Komponentenleiste. Alle im Team arbeiten mit demselben Werkzeug, und wer ein Modell öffnet, das jemand anders gebaut hat, findet dieselben Komponenten vor.

Der ehrliche Test: Wenn Sie dieselbe Gruppe zum dritten Mal kopieren, war der richtige Zeitpunkt beim zweiten Mal.

02 · Aufbau

Anatomie einer Komponente

Eine Grasshopper-Komponente sieht aus wie ein Kästchen mit Anschlüssen und ist innen ein kleines Programm mit drei Aufgaben: Eingaben prüfen, rechnen, Ergebnisse und Meldungen zurückgeben. Fahren Sie über einen Bereich der Zeichnung oder wählen Sie ihn mit der Tastatur, um die passende Erklärung hervorzuheben. Alle Erklärungen stehen dauerhaft daneben.

Schema · keine Bildschirmaufnahme Aufbau einer kompilierten Komponente
Schematischer Aufbau einer Grasshopper-Komponente Links vier Eingänge, in der Mitte der Komponentenkörper mit Kopfzeile, Vorprüfung, Rechenkern, Fehlerkanal und Zustand, rechts vier Ausgänge. Alle Bereiche sind in der Liste daneben beschrieben. EINGÄNGE Umriss CURVE Rastermaß NUMBER Gerätetypen LIST Zonen DATA TREE StudioRaster SR 01 VORPRÜFUNG Typ, Einheit, Bereich geschlossen? eben? plausibel? 02 RECHENKERN Raster setzen Wege prüfen Kennzahlen messen 03 FEHLERKANAL Hinweis, Warnung, Fehler an der Komponente sichtbar 04 ZUSTAND Einstellungen, Kontextmenü AUSGÄNGE Geometrie BREP, CURVE Kennzahlen NUMBER Verstöße TEXT, CURVE Protokoll TEXT Eine Komponente, ein Vertrag: gleiche Eingabe, gleiche Ausgabe, jedes Mal
Eingänge
Jeder Eingang hat einen Typ, einen Zugriffsmodus (ein Wert, eine Liste, ein Baum) und optional einen Vorgabewert. Der Typ ist die erste Prüfung: Wer eine Fläche an einen Kurveneingang hängt, bekommt die Rückmeldung, bevor irgendetwas gerechnet wird.
Kopfzeile
Name, Kürzel, Kategorie und Unterkategorie bestimmen, wo die Komponente in der Leiste erscheint und wie sie über die Suche gefunden wird. Ein eigenes Plugin bekommt eine eigene Kategorie, damit Ihre Werkzeuge nicht zwischen den Standardkomponenten verschwinden.
Vorprüfung
Bevor gerechnet wird, wird geprüft: Ist die Kurve geschlossen, liegt sie eben, ist das Rastermaß größer als null, passen die Einheiten zum Modell. Diese Schicht entscheidet darüber, ob eine Komponente im Fehlerfall eine klare Meldung gibt oder eine unbrauchbare Geometrie.
Rechenkern
Hier liegt das Verfahren: Raster setzen, Abstände einhalten, Wege prüfen, Kennzahlen messen. Der Kern wird so geschrieben, dass er ohne Grasshopper testbar ist, denn eine Rechnung, die nur im Graphen läuft, lässt sich nur im Graphen prüfen.
Fehlerkanal
Grasshopper kennt drei Stufen von Meldungen, und eine gute Komponente nutzt alle drei. Ein Hinweis erklärt eine Annahme, eine Warnung nennt eine Verletzung, die trotzdem ein Ergebnis erlaubt, ein Fehler bricht ab. Wer diese Stufen ernst nimmt, spart der Konstruktion die Suche nach der Ursache.
Zustand
Einstellungen, die kein Eingang sein sollen (Maßeinheit, Prüfstrenge, Ausgabeformat), gehören in den gespeicherten Zustand der Komponente und in ihr Kontextmenü. Sie wandern mit der Datei und müssen nicht bei jedem Öffnen neu gesetzt werden.
Ausgänge
Ausgänge tragen nicht nur Geometrie. Kennzahlen, die Liste der verletzten Bedingungen und ein Protokoll des Laufs sind eigene Ausgänge, damit die nachgelagerte Definition damit rechnen kann, statt sie aus einem Text herauszulesen.

Das Schema ist gezeichnet, nicht abfotografiert. Es zeigt den Aufbau, den wir für eigene Komponenten verwenden, und nicht die Oberfläche einer bestimmten Rhino-Version.

03 · Umfang

Was ausgeliefert wird

Ein Plugin ist nicht die Datei allein. Vier Teile gehören zusammen, weil ohne sie das Werkzeug nach dem Projekt niemandem gehört.

QuellcodeDas C#-Projekt mit Lösungsdatei, Abhängigkeiten und Bauanleitung. Sie können das Plugin selbst neu bauen, ändern und in Ihre eigene Versionsverwaltung legen. Ohne Quellcode ist ein Plugin eine Blackbox mit Ablaufdatum.
DokumentationJe Komponente: was jeder Ein- und Ausgang bedeutet, welche Einheit erwartet wird, welche Annahmen im Kern stecken und welche Meldung wann erscheint. Dazu eine kurze Beschreibung des Verfahrens, damit ein Nachfolger nicht raten muss, warum eine Prüfung existiert.
InstallerEine Installationsroutine, die die Dateien an die richtige Stelle legt, statt einer Anleitung zum Kopieren in einen Ordner. Alternativ als Paket im Format, das Ihr Team ohnehin für Rhino-Erweiterungen nutzt. Der Weg wird vor dem Bau festgelegt, weil er von Ihrer IT abhängt.
Beispiel-DefinitionenMindestens eine lauffähige Grasshopper-Datei je Komponente, die den gedachten Einsatz zeigt, plus eine, die absichtlich gegen eine Bedingung verstößt, damit sichtbar ist, wie sich das Werkzeug im Fehlerfall verhält. Beispiele sind der schnellste Weg, ein Werkzeug im Team zu verbreiten.
Bildschirmaufnahme des Mechanism Lab mit einem Viergelenkgetriebe und eingezeichneter Koppelkurve, daneben die Tafel mit den laufenden Zahlenwerten und die Herleitung der Formel in nummerierten Rechenschritten.
Mechanism Lab, Viergelenkgetriebe: Übertragungswinkel, Schwingwinkel und Koppelpunkt werden an derselben Lösung gemessen, die auch die Geometrie platziert, und daneben steht, woher die Formel kommt. Genau diese Trennung ist gemeint, wenn ein Rechenkern ohne Grasshopper testbar sein soll.
Bildschirmaufnahme von Tessera-Mosaic in der Malansicht: die zeitgesteuerte Füllung des Bogens läuft, ein Teil der Regionen ist bereits farbig, unten laufen Fortschrittsleiste und die gerade aufgetragene Farbe mit.
Tessera-Mosaic, Malansicht: eine Regelkette, die sich Schritt für Schritt zurückspulen und wieder abspielen lässt. Ein Plugin ist derselbe Gedanke in der Komponentenleiste, nämlich eine Kette, die bei gleicher Eingabe jedes Mal gleich läuft.

04 · Aufgabenklasse

Ein Fall aus der Anfragepraxis

Eine der Aufgaben, die uns über dieses Thema erreichen, sieht immer ähnlich aus. Ein Betreiber betreibt mehrere Standorte derselben Art, in unserem Fall Trainingsflächen mit Geräten. Jeder Standort hat einen anderen Grundriss: andere Länge, andere Tiefe, andere Stützen, andere Lage der Türen. Die Geräte dagegen sind immer dieselben, und die Regeln, nach denen sie stehen dürfen, auch.

Von Hand entsteht daraus eine Zeichnung pro Standort, jedes Mal von vorn. Der Planer setzt Geräte, misst Abstände nach, prüft, ob ein Weg frei bleibt, zählt am Ende, wie viele Geräte hineingepasst haben, und liefert eine Variante. Wenn der Betreiber eine zweite Anordnung sehen will, beginnt die Arbeit erneut. Die eigentliche Frage des Betreibers, nämlich welche Anordnung die meisten Geräte bei gleicher Wegequalität trägt, wird dabei nie beantwortet, weil man dafür Varianten vergleichen müsste, die niemand gezeichnet hat.

Parametrisch gestellt ist es eine andere Aufgabe. Der Umriss, die Stützen und die Türen sind Eingaben. Die Gerätetypen mit ihren Stellflächen, ihren Bedienradien und ihren Mindestabständen sind eine Liste. Die Regeln sind Bedingungen: Ein Hauptweg muss durchgehend frei bleiben, jeder Punkt der Fläche muss innerhalb einer festgelegten Länge einen Ausgang erreichen, Geräte einer Gruppe stehen zusammen, vor Spiegelflächen bleibt Abstand. Was herauskommt, ist keine Zeichnung, sondern eine Funktion, die aus einem Grundriss Anordnungen erzeugt.

Der Nutzen liegt nicht in der ersten Anordnung, sondern in der zwanzigsten. Wenn das Modell in wenigen Minuten zwanzig zulässige Varianten rechnet und für jede die Kennzahlen ausgibt, die den Betreiber interessieren (Geräteanzahl, Fläche je Gerät, längster Weg zum Ausgang, Anteil der Fläche ohne Nutzung), dann verschiebt sich die Arbeit von der Produktion der Varianten auf ihre Beurteilung. Genau an diesem Punkt lohnt sich ein Plugin statt einer Definition: Die Prüfregeln sind das Firmenwissen des Betreibers, sie gelten an jedem Standort gleich, und sie sollen nicht in fünf verschiedenen Kopien einer Datei leben.

Wir beschreiben hier die Aufgabenklasse und nicht einen einzelnen Auftrag. Wer eine Trainingsfläche plant, ein Lager einrichtet, eine Werkstatt belegt oder eine Verkaufsfläche mit Möbelmodulen bestückt, hat dasselbe Problem in anderer Kleidung: begrenzte Fläche, feste Objekte, harte Wege, weiche Ziele. Der Weg zur Antwort ist derselbe. Der Einstiegspunkt, wenn der Grundriss zunächst nur als Zeichnung oder als Scan vorliegt, ist Floorplan AI: Ohne strukturierte Fläche gibt es nichts zu optimieren.

05 · Vorbereitung

Typische Anforderungen

Diese Punkte klären wir vor der ersten Zeile Code, weil jeder davon die Bauweise verändert. Je mehr davon Sie vorab beantworten können, desto kürzer wird die Vorlaufzeit.

  • Rhino-Version und Zielplattform. Gegen welche Rhino- und Grasshopper-Version wird gebaut, und läuft das Plugin nur unter Windows oder auch auf Rhino für Mac? Das entscheidet über das SDK-Ziel und wird vor dem Bau festgelegt, nicht danach.
  • Eingabegeometrie und ihre Qualität. Kommt der Umriss aus einer sauberen Zeichnung, aus einem Scan oder aus einem PDF? Unsaubere Eingaben sind kein Randfall, sie sind der Normalfall, und die Vorprüfung muss dafür ausgelegt sein.
  • Einheiten und Toleranz. Millimeter oder Meter, und mit welcher Modelltoleranz. Die meisten schwer zu findenden Fehler in parametrischen Modellen sind Einheiten- oder Toleranzfehler.
  • Harte und weiche Bedingungen. Was darf nie verletzt werden (Wegbreiten, Mindestabstände, Fertigungsgrenzen) und was ist ein Ziel, das man abwägen darf. Die Trennung dieser beiden Listen ist die wichtigste Vorarbeit überhaupt.
  • Datenmenge und Antwortzeit. Zieht jemand interaktiv an einem Regler, oder läuft die Rechnung als Stapel über Nacht? Interaktive Nutzung setzt eine Obergrenze für die Rechenzeit, und die bestimmt die Bauweise des Kerns.
  • Ausgabeformate. Welche Dateien müssen am Ende herausfallen, damit Fertigung, Kalkulation oder Planung damit arbeiten können. Üblich sind DXF, STEP, IFC, CSV und glTF, und jedes davon hat eigene Anforderungen an die Struktur der Geometrie.
  • Verteilung und Lizenzform. Bleibt das Plugin im eigenen Haus, geht es an Partner, oder soll es an Kunden weitergegeben werden. Davon hängt ab, ob und welche Lizenzprüfung eingebaut wird.
  • Regelwerke und Quellen. Auf welche Normen, Landesvorschriften oder internen Standards stützen sich die Bedingungen, und wo liegen diese Dokumente. Wenn viele Regelwerke im Spiel sind, ist eine durchsuchbare Wissensbasis neben dem Plugin oft sinnvoller als ein Plugin, das hundert Regeln fest verdrahtet. Sollen diese Dokumente das Haus nicht verlassen, ist der Aufbau on-premise möglich.
  • Wer pflegt es danach. Bleibt die Weiterentwicklung bei Ihnen, bei uns oder geteilt. Diese Frage gehört an den Anfang, weil sie beeinflusst, wie der Code geschnitten und dokumentiert wird.

06 · Fragen

Häufige Fragen zur Grasshopper-Plugin-Entwicklung

Wenn dieselbe Logik in mehreren Projekten gebraucht wird, wenn die Auswertung im Graphen zu langsam für interaktive Nutzung ist, wenn das Verfahren das Haus verlässt und nicht offenliegen soll, oder wenn mehrere Personen mit demselben Werkzeug arbeiten sollen. Trifft nichts davon zu, ist eine Definition die schnellere und billigere Antwort, und wir sagen das auch.

Kompilierte Komponenten entstehen in C# gegen das Rhino- und Grasshopper-SDK. Python setzen wir für Vorstufen, Datenaufbereitung und Prüfskripte ein, weil sich damit schneller ausprobieren lässt. Was sich bewährt, wandert danach in eine kompilierte Komponente.

Ja, der Quellcode ist Teil der Übergabe, zusammen mit der Bauanleitung und den Abhängigkeiten. Damit können Sie das Plugin selbst neu bauen und weiterentwickeln. Wie die Rechte im Einzelnen geregelt werden, steht im Vertrag und nicht auf dieser Seite.

Über eine Installationsroutine, die die Dateien an die vorgesehene Stelle legt, oder als Paket in dem Format, das Ihr Team ohnehin für Rhino-Erweiterungen einsetzt. Welcher Weg passt, hängt von Ihrer IT ab und wird vor dem Bau festgelegt, weil es die Struktur des Projekts beeinflusst.

Das hängt vom SDK-Ziel und von den verwendeten Abhängigkeiten ab. Es ist eine Anforderung, die vor dem Bau feststehen muss, denn sie schränkt ein, welche Bibliotheken und welche Oberflächenelemente in Frage kommen. Nachträglich portieren ist deutlich aufwendiger als von Anfang an beide Ziele mitzudenken.

Ein Plugin ist gegen eine bestimmte SDK-Version gebaut. Bei einem größeren Versionssprung von Rhino kann ein Neubau gegen das neue SDK nötig werden. Weil das absehbar ist, gehört es an den Anfang: Wer den Neubau übernimmt und in welchem Rahmen, wird im Projekt geklärt und nicht erst beim nächsten Update.

Prüfregeln lassen sich einbauen, solange sie sich als Geometrie- oder Zahlenbedingung formulieren lassen: Mindestbreiten, Abstände, maximale Weglängen, zulässige Flächenanteile. Nicht sinnvoll ist es, hunderte Regeln fest in Code zu schreiben, weil Regelwerke sich ändern. In dem Fall ist die bessere Bauweise ein Plugin, das eine externe Regelliste liest, gegebenenfalls neben einer durchsuchbaren Wissensbasis über die Originaldokumente.

Ja, das ist ein häufiger zweiter Schritt. Entweder die Definition läuft als Dienst auf einem Server und der Browser fragt sie an, oder die Regel wird für den Browser nachgebaut und läuft vollständig auf dem Gerät des Nutzers. Welche Bauart passt, hängt von der Komplexität der Geometrie und davon ab, wer den Konfigurator bedienen soll.

Zur letzten Frage ausführlicher: Der Gedanke, wie aus einer Definition ein Web-Konfigurator wird, steht im Beitrag Definition als Dienst. Was der Begriff Grasshopper für Termine und Kosten bedeutet, ist unter Was ist Grasshopper 3D eingeordnet.

Nächster Schritt

Sie kopieren dieselbe Gruppe zum dritten Mal?

Schildern Sie kurz, was die Gruppe tut und wie oft sie gebraucht wird. Wir sagen Ihnen, ob daraus eine Komponente werden sollte oder ob eine aufgeräumte Definition in Ihrem Fall reicht.

Arthur C. Clarke

“Jede hinreichend fortgeschrittene Technologie ist von Magie nicht zu unterscheiden.”