Im folgenden Blogbeitrag stelle ich Ihnen daher eines unserer Dynamo Schulungsbeispiele, den Export von Autodesk-Revit Daten nach Excel, vor. Dieses Tutorial ist auch für Dynamo-Einsteiger geeignet. Anders als bei den mir bekannten Skripten zum Thema, kommt dieses Skript mit sehr wenigen Blöcken aus (es werden lediglich 10 Blöcke genutzt) und kann dennoch die Spalten in Excel beliebig erweitern.
Bereitstellung des fertigen Skriptes
Mit der hier gezeigten Schritt für Schritt Anleitung sollte Ihnen klar werden, wie man ein Skript zum Export von Excel aufbereiten könnte. Für alle diejenigen, die das fertige Skript zunächst einmal testen wollen, ohne diese Anleitung durchzugehen, wird ihnen hier das fertige Skript bereitgestellt.
Das Skript wurde in Gruppierungen eingeteilt und kommentiert. Der Übersichtlichkeit halber habe ich mir angewöhnt alle Gruppen bei denen etwas eingegeben werden kann und soll „grün“ zu färben und Gruppen mit Blöcken, die rein zur Verarbeitung dienen, „orange“.
Um eine Liste zu erstellen, muss eine Kategorie der zu exportierenden Elemente gewählt werden und in einer Parameterliste die Bezeichnungen aller Parameter, die exportiert werden sollen angegeben werden. Zudem sind ggf. die Einstellungen für den Excel-Export (WriteToExcel) anzupassen.
Viel Spaß beim Testen!
Vorstellung der Schnittstelle zwischen Dynamo und Excel
Dynamo hat zwei Blöcke, die als Schnittstelle zu Excel dienen. Zum Schreiben von Daten nach Excel nutzen Sie den Block „Excel.WriteToFile“ und zum Auslesen von Daten
„Excel.ReadFromFile“.
Excel.WriteToFile benötigt folgende Eingabewerte:
- Den Pfad zur Exceldatei (filePath)
- Den Namen des Excel-Arbeitsblattes (sheetName)
- Die erste Zeile (startRow), in die die Daten geschrieben werden sollen
- Die erste Spalte (StartCol ), in die die Daten geschrieben werden sollen
- Die eigentlichen Daten (data) und
- Die Erlaubnis die bestehende Datei zu überschreiben (overWrite)
All diese Eingabewerte müssen im Vorfeld definiert und an den Block übergeben werden.
- Fügen Sie einen „Excel.WriteToFile“ Block in Ihr Dynamo Skript ein!
- Während der Skriptentwicklung sollten Sie zudem den Ausführungsmodus auf „Manuell“ stellen, um das ständige Ausführen des Skriptes zu unterbinden!
Die Definition der Eingabewerte
Es stellen sich die Fragen: Wie komme ich an die Eingabedaten? und In welcher Form müssen diese vorliegen?
Der Name der Eingabeschnittstellen sollte einen ersten Hinweis darauf geben, was, wo übergeben werden muss (Siehe Beschreibung Eingabewerte). Wenn Sie mit der Maus über die Eingabeschnittstellen gehen, wird Ihnen teilweise auch eine Beschreibung und der Datentyp angezeigt und Sie erhalten so eine Information über das erwartete Format der Eingabedaten.
Leider gibt es teilweise auch Blöcke, die nicht so eindeutig beschrieben sind, wie in diesem Beispiel. In solchen Fällen hilft nur viel Erfahrung bzw. die Hilfe durch andere oder die gute alte Methode des Versuchs und des Irrtums.
Die Übergabe des Dateipfades (filePath)
Der Dateipfad muss auf eine existierende Exceldatei zeigen und in Form eines Textes (string) an die Eingabeschnittstelle des Blockes „Excel.WriteToFile“ übergeben werden. Um dies zu garantieren, empfehle ich daher den Dynamo Block „File Path“ zu benutzen. Dieser Block nutzt einen „Datei öffnen“-Dialog, lässt Sie einen Dateipfad auswählen und gibt diesen als Text (string) zurück.
- Fügen Sie links vom „Excel.WriteToExcel“ Block einen „File Path“ Block in Ihr Skript ein!
- Verbinden Sie die Ausgabeschnittstelle (>) von „File Path“ mit der entsprechenden Eingabeschnittstelle (filePath) des Blockes „Excel.WriteToFile“!
- Wählen Sie anschließend Ihre Excel Datei aus!
Die Übergabe der Arbeitsblattbezeichnung, sowie der Angangszeile und -spalte
Zur Übergabe der folgenden drei Eingabewerte nutze ich gern einen Codeblock. Codeblöcke eigenen sich sehr gut zur Erstellung von Eingabedaten, da diese beliebig viele verschiedene Werte, aber auch Funktionen beinhalten können und das Skript übersichtlich halten. Jeder Wert/Funktion innerhalb eines Codeblockes muss durch ein Semikolon abgeschlossen werden.Codeblöcke können durch einen Doppelklick im Editor eingefügt werden.
- Fügen Sie links vom „Excel.WriteToExcel“ Block einen Codeblock ein!
Die Arbeitsblattbezeichnung muss erneut als Text (string) übergeben werden. Um innerhalb eines Codeblockes einen Text zu erzeugen, beginnen Sie einfach mit einem Gänsefüßchen („“), schreiben Sie Ihr Wort/ Ihren Text und schließen Sie diesen erneut mit einem Gänsefüßchen („“) ab. Der Text sollte nun in Rot im Codeblock stehen.
- Schreiben Sie in den Codeblock die Arbeitsblatt-Bezeichnung!
- Wenn Sie eine noch nicht verwendete Bezeichnung nutzen, wird ein neues Arbeitsblatt angelegt. Existiert das Arbeitsblatt, wird dieses evtl. überschrieben (siehe: „Die Festlegung ob eine Exceldatei überschrieben werden soll oder nicht“).
Die Angangszeile/ -spalte muss als Index in Form einer Zahl (int) übergeben werden. Hier genügt es, wenn Sie diese Zahl in den Codeblock schreiben und ein Semikolon als Trennzeichen zwischen Text bzw. den Zahlen nutzen. Bitte beachten Sie, dass die Indexierung in Excel nicht mit „Eins“ sondern intern mit „Null“ beginnt, Spalte A hat demnach den Index „Null“.
- Legen Sie im Codeblock die Anfangszeile/ -Spalte fest und verbinden Sie anschließend die Ausgabeschnittstellen (>) des
Codeblockes mit den entsprechenden Eingabeschnittstellen des Blockes „Excel.WriteToFile“!
Die Zusammenstellung der Übergabedaten für Excel
Kommen wir nun zum aufwändigsten Teils des Skriptes, der Zusammenstellung der Exportdaten (data). Ich werde hier etwas detaillierten auf meine Gedankengänge eingehen.
Ziel sollte es der Einfachheit halber zunächst sein, Revit-Parameterwerte in eine Excelliste zu bekommen. Natürlich könnten Sie neben diesen Parameterwerten z.B. auch in Dynamo errechnete Werte, oder z.B. die XYZ Koordinaten mit ausgeben.
Um an Parameterdaten heran zu kommen, benötig man zunächst einmal Revit-Elemente, die für einen Export in Frage kommen. Diese könnten mittels Dynamo selektiert oder gefiltert werden. Die passenden Blöcke finden Sie in der Dynamo-Kategorie Revit > Selection. Ich habe mich für eine Filterung nach allen Elementen einer bestimmten Kategorie entschieden und nutze daher den Block „All Elements of Category“.
Dieser Block erfordert als Eingabe eine Kategorie (category). Die Kategorie erhalten Sie durch den Block „Category“. Dieser Block lässt Sie eine Kategorie wählen und gibt eine Referenz auf das in Revit intern genutzte Element zurück. Genau diese Referenz wird von der Eingabeschnittstelle des Blockes „All Elements of Category“ benötigt.
- Fügen Sie links im Skript die Blöcke „Category“ und „All Elements of Category“ ein!
(Bitte lassen Sie dabei einen gewissen Abstand vom bisherigen Skript, da zwischen den Blöcken „All Elements of Category“ und „Excel.WriteToFile“ weitere Blöcke eingefügt werden ) - Verbinden Sie die Blöcke miteinander!
- Wählen Sie eine Kategorie!
Beim Ausführen des Skriptes hätten Sie nun eine Liste mit Elementen, deren Parameter Sie auslesen könnten. (Nutzen Sie ggf. einen Watch-Block, um sich diese Liste anzeigen zu lassen)
Nun gilt es, aus diesen Elementen Parameter auszulesen und diese in einer Liste so aufzubereiten, dass Sie dem erwarteten Datenformat der Eingabeschnittstelle „data“ des Blockes „Excel.WriteToFile“ entsprechen. Hier wird eine verschachtelte Liste (Baumstruktur) erwartet. Die Hauptknoten des Baumes repräsentieren die Elemente (Zeilen in Excel) und die Unterknoten die Parameterwerte (je Parameter eine Spalte)
Ein solcher Baum, könnte wie folgt aussehen:
– Element 1
—–> Parameterwert 1
—–> Parameterwert 2
—–> …
—–> Parameterwert x
– Element 2
—–> Parameterwert 1
—–> Parameterwert 2
—–> …
—–> Parameterwert x
Die eigentlichen Parameterwerte können Sie mit dem Block „Element.GetParameterValueBy
Name“ abfragen. Dieser Block erwartet ein Element und einen Parameternamen, um anhand des Namens den eigentlichen Parameterwert zu ermitteln.
- Fügen Sie einen „Element.GetParameterValueByName“ Block zwischen „All Elements of Category“ und „Excel.WriteToFile“ ein!
- Verbinden Sie die Ausgabeschnittstelle (>) des Blockes „All Elements of Category“ mit der Eingabeschnittstelle „Element“ des
Blockes „Element.GetParameterValueByName“!
Die Eingabeschnittstelle verlangt einen Parameternamen in Form einer Textes (string). Dieser Text kann erneut durch einen Codeblock bereitgestellt werden.
- Fügen Sie links des Blockes „Element.GetParameterValueByName“ einen Codeblock ein und schreiben Sie den Parameternamen eines zu exportierenden Parameterwertes in den Codeblock!
- Geben Sie ggf. weitere Parameternamen an!
(Vergessen Sie dabei nicht die Gänsefüßchen!)
Sie würden durch die Verbindung des Parameternamens mit der entsprechenden Eingabeschnittstelle , z.B. das Kennzeichen eines Elementes an Excel übergeben. In der Regel wollen Sie jedoch mehrere Parameter übergeben. Darum sollten Sie einen kleinen, aber entscheidenden Trick anwenden und der Eingabeschnittstelle nicht nur einen Parameternamen, sondern eine ganze Liste von Parametern übergeben.
Eine Liste kann mit dem Block „List.Create“ erzeugt werden. Sie erhalten einen Block bei dem Sie mittels „+“ und „-“ festlegen können, wie viele Elemente die Liste hat.
- Erzeugen Sie eine mit Hilfe des „List.Create“-Blockes eine Liste!
- Weisen Sie die Namen aller Parameter, die Sie exportieren möchten, zu!
- Verbinden Sie die Liste mit der Eingabeschnittstelle „parameterName“ des Blockes „Element.GetParameterValueByName“!
Fast geschafft! Nun müssen Sie nur noch das Verkettungsverfahren des Blockes
„Element.GetParameterValueByName“ von Kürzestes auf Kreuzprodukt umstellen. Dies hat zur Folge, dass für jedes gefundene Element, alle Parameter aus der Liste ausgegeben zu der oben beschriebenen Baumstruktur zusammengefasst werden.
- Ändern Sie im Block „Element.GetParameterValueByName“ das Vergitterungsverfahren auf Kreuzprodukt!
Den letzten Schritt den Sie tun sollten bevor Sie ihre Daten an Excel übergeben, ist das Einfügen einer Kopfzeile. Die Spaltennamen haben Sie bereits in Form der Parameterliste vorliegen. Diese müssen Sie nun nur noch vor die eigentlichen Parameterwerte setzen, sodass der Baum anschließend wie folgt aussieht:
– Kopfzeile
—–> Parametername 1
—–> Parametername 2
—–> …
—–> Parametername x
– Element 1 (1. Tabellenzeile 1 in Excel)
—–> Parameterwert 1 (Spalte 1 in Excel)
—–> Parameterwert 2 (Spalte 2 in Excel)
—–> …
—–> Parameterwert x
– Element 2 (2. Tabellenzeile in Excel)
—–> Parameterwert 1
—–> Parameterwert 2
—–> …
—–> Parameterwert x
– …Um zu Beginn eine Liste einzufügen, können Sie den Block „List.AddItemToFront“ nutzen.
- Fügen Sie einen „List.AddItemToFront“ Block zwischen dem „Element.GetParameterValueByName“- und dem
„Excel.WriteToFile“ Block ein! - Verbinden Sie anschließend die Ausgabeschnittstelle (list) des Blockes „List.Create“ mit der Eingabeschnittstelle „item“ des
Blockes „List.AddItemToFront“! - Verfahren Sie genau so mit der Ausgabeschnittstelle (var[][]) des Blockes „Element.GetParameterValueByName“ und der
Eingabeschnittstelle „list“ des Blockes „List.AddItemToFront“! - Verbinden Sie anschließend die Ausgabeschnittstelle (list) des Blockes „List.AddItemToFront“ mit der Eingabeschnittstelle „data“ des Blockes „Excel.WriteToFile“!
Damit ist die Datenaufbereitung und Übergabe an Excel abgeschlossen.
Die Festlegung ob eine Exceldatei überschrieben werden soll oder nicht
Nun bleibt Ihnen nur noch eine Eingabeschnittstelle (overWrite) die Sie belegen müssen. Diese Schnittstelle erwartet als Eingabewert einen boolschen Wert, d.h. „wahr“ (true) oder „falsch“ (false). Sie bestimmen damit, ob die Exceldatei überschrieben werden soll („wahr“) oder nicht („falsch“). Nutzen Sie hierzu den Block „Boolean“.
Damit ist ihr Skript fertig! Beim Starten des Skriptes werden Ihnen nun alle Parameterwerte nach Excel exportiert.
- Fügen Sie Ihrem Skript einen „Boolean“ Block hinzu und verbinden Sie diesen mit der verbliebenen Eingabeschnittstelle!
- Setzen Sie zunächst den Wert von „Boolean“ auf true!
Abschließende Worte
Der ein oder andere wird sich vielleicht gefragt haben, warum ich das Skript von rechts nach links aufgebaut habe?! Nun, dies ist eine Methode, die ich gerne „Das Pferd von hinten aufziehen“ nenne und die für die Erstellung eigener Skripte sehr nützlich sein kann. Die beruht auf der Annahme, dass man weiß, welches Ziel man am Ende hat, aber eben noch nicht ganz, wie man dort hin kommt. Daher der Ansatz zu schauen, welche Eingabe Daten man braucht und wie man sich diese durch andere Blöcke besorgen kann.
Das hier vorgestellte Beispiel ist eines von vielen in meinem Dynamo-Schulungen. Die Schulungen geben einige Schulungsbeispiele vor, können aber auch individuell mit im Vorfeld abgesprochenen Kundenwünschen angereichert werden. Die Schulungsbeispiele unserer Schulung werden dem Nutzer alle zur Verfügung gestellt.
Da ich bereits festgestellt habe, dass immer wieder Inhalte noch nicht durch Dynamo-Blöcke abgedeckt werden, habe ich begonnen einige nützliche Blöcke selbst zu programmieren. Auch dieses Know How wird in unseren Schulungen weitergegeben.
Sie haben nicht die Zeit für einen oder sogar mehrere Schulungstage? Kein Problem, wir bieten neben den Schulungen auch Webseminare zu kundenindividuellen Themen an!
Wie wäre es beispielsweise, wenn Sie alles zum Thema Excel-Import in einem 1- 2 stündigen Webseminar erfahren könnten. Schreiben Sie uns?