Donnerstag, 14. August 2014

Kombination der direkten und parametrischen Modellierung mit hilfe von freien Softwarelösungen

Hintergrund

Der 3d-Druck ist nur ein Fertigungsverfahren, dem ein Entwurfsprozess vorausgeht. Das heißt, dass ein Teil, welche mit einem 3d-Drucker herzustellen ist, zuvor modelliert werden muss. Als Alternative gibt es bereits fertige 3d-Modelle aus zum Teil sehr großen Datenbanken. Ein prominentes Beispiel ist die durch ihrer Nutzungsbedingungen in Kritik geratene Plattform Thingiverse. Sind die Anforderungen an einem eigenen 3d-Modell allerdings zu speziell, ist eine individuelle Lösung meist unumgänglich. Ein Zwischenweg kann die Verwendung eines parametrischen Modells sein. Dies sind Modelle die mit Hilfe von Parametern an die eigenen Bedürfnisse anpassbar sind. Der Entwickler von solchen Modellen muss sich zuvor ganz genau überlegen welche Aspekte seines Modells über Parameter variierbar seien sollen. Ist für den gewünschten Aspekt kein Parameter vorhanden, muss dennoch ein eigenes Modell entwickelt werden. 

Für die Erstellung eines individuellen 3d-Objektes gibt es zwei grundsätzlich unterschiedliche Ansätze.
Man unterscheidet zwischen der bereits genannten parametrischen, sowie der direkten Modellierung.

Direkte Modellierung

Die direkte Modellierung ist vergleichbar mit der Benutzung eines Zeichenprogramms. Das Zeichenprogramm stellt verschiedene Werkzeuge zur Verfügung, welche nacheinander zur Erstellung eines Endergebnisses eingesetzt werden. Der gesamte Entwicklungsprozess ist dann nur noch anhand einer Historie nach zuverfolgen. Ändern sich Anforderungen die weit zurückliegende Arbeitsschritte betreffen, sind nötige Änderungen nur noch schwer einzupflegen. Ein Beispielprogramm bei dem die Modellierung direkt erfolgt, ist Sketchup.

Parametrische Modellierung

Anders als die direkte Modellierung wird hier nicht direkt an der Geometrie gearbeitet, sondern an einem Bauplan der beschreibt wie die Geometrie aufzubauen ist.
Bei jeder Änderung des Bauplans wird die Geometrie neu erstellt, so ist es möglich jeden Arbeitsschritt im Nachhinein anzupassen. Der Bauplan liegt in Textform als eine Abfolge von Anweisungen vor. Um nur ein paar von möglichen Anweisungen zu nennen:
  • erstellen von primitiven Geometrien wie z.B.:
    • Quader
    • Kugel
    • Zylinder
  • Manipulation von Geometrien
    • verschieben
    • rotieren
    • skalieren
  • Kombination von Geometrien mit Hilfe boolscher Operationen  (CSG - Constructive Solid Geometry):
    • Vereinigung
    • Differenz
    • Durchschnitt

von links nach rechts - Vereinigung, Differenz, Durchschnitt


Parameter sorgen für den Zusammenhang von Anweisungen, d.h. ändert sich ein Parameter wirkt sich das auf alle Anweisungen aus die diesen Parameter verwenden. Von einem Zylinder A der Höhe h wird ein weiterer Zylinder B mit wiederum der Höhe h abgezogen (Differenz). Der Parameter h sorgt dafür das die beiden Zylinder A und B stets gleich hoch sind und deren Differenz immer ein Hohlzylinder ist.

Auch runde Formen werden durch Polygone abgebildet und sind daher immer nur eine Approximation der gewünschten Form. Die Qualität dieser Approximation kann vom Benutzer frei über entsprechende Parameter gewählt werden. Je genauer die Approximation ausfallen soll, desto mehr Polygone sind nötig. Mehr Polygone bedeuten mehr Rechenaufwand für die Darstellung aber noch viel schwerwiegender, mehr Rechenaufwand für die CSG Operationen. Damit die Wartezeiten für die Darstellung von Änderungen nicht ausufern, sollte immer ein gesunder Kompromiss zwischen Approximationsgüte und Rechenaufwand gefunden werden. Eine andere Möglichkeit ist es, während des Entwurfes mit einer geringeren Aproximationsgüte zu arbeiten und erst Zwischenschritte oder das Endresultat mit der gewünschten Genauigkeit abzubilden.

steigende Approximationsgüte von links nach recht


OpenSCAD

Das prominenteste Beispiele für das parametrische modellieren von Objekten für den 3d-Druck ist OpenSCAD. Im Gegensatz zu kommerziellen Produkten wie Autodesk Inventor steht OpenSCAD zur freien Nutzung zur Verfügung und ist noch dazu Open-Source Software. OpenSCAD hat sich bewährt und wird stets weiter-entwickelt. Auch bringt es eine Entwicklungsumgebung mit, die das Formulieren von Anweisungen ermöglicht, sowie einen Darstellungsbereich zum Betrachten der Ergebnisse bietet.
Die sprachlichen Mittel die OpenSCAD zur Verfügung stellt, sind im Vergleich zu bekannten Hochsprachen leider recht begrenzt. OpenSCAD unterstützt keine zusammengesetzten Datentypen. Konstrukte wie rekursive Modulaufrufe waren  bis vor kurzen noch nicht möglich.


OpenJsCAD

OpenJsCAD ist - wie der Name vermuten lässt - in JavaScript implementiert und läuft direkt im Browser. Eine im Browser lauffähige IDE ist hier zu finden. OpenJsCAD nutzt csg.js als Constructive Solid Geometry Implementierung. Für die Darstellung der generierten Geometrien im Browser dient lightgl.js, welches von WebGL Verwendung macht. Damit die Benutzeroberfläche während den CSG Berechnungen nicht blockiert, finden Web Worker Verwendung. Parameter können exportiert werden, so dass sie im Browser interaktiv über Eingabefelder manipulierbar werden.

Sind parametrische Modelle im Format von OpenSCAD bereits vorhanden, können diese in OpenJsCAD importiert oder direkt konvertiert werden. Dies funktioniert zumindest für einfache Modelle. 


OpenSCAD / OpenJsCAD in Verbindung mit Inkscape

Beide zuvor beschriebenen Ansätze der Modellierung von Objektgeometrien haben ihre Existenzberechtigung. Manchmal ist es sinnvoll die Vorteile beider Techniken zu vereinen. Hierzu kann Beispielsweise ein Teil der Modellierung direkt geschehen. Die daraus gewonnen Resultate können anschließend bei der parametrischen Modellierung weiterverwendet werden. So kann es sinnvoller sein ein Logo oder einen Schriftzug in einem Vektorzeichenprogramm zu erstellen und damit sein parametrisches Modell zu dekorieren. Ein solcher Vorgang ist für das Vektorzeichenprogramm Inkscape in Verbindung mit OpenSCAD beschrieben. Die zu verwendende Form muss als Pfad vorliegen. Ein Pfad kann einfache Liniensegmente, aber auch Beziersegmente oder Kreisbögen beinhalten. OpenSCAD unterstützt den Import von Dateien im DXF-Format. Exportiert man nun eine Pfad der Beziersegmente beinhaltet, werden diese zu Splinesegmente konvertiert, welche das DFX-Format unterstützt. OpenSCAD allerdings scheint Probleme mit dem Import von Splinesegmente zu haben, so das ein Import fehl schlägt. Daher müssen zuvor alle Beziersegmente durch Liniensegmente approximiert werden.

Ist die Approximationsgüte einmal gewählt, kann diese nach dem Export nicht mehr geändert werden.


Problemstellung und Lösung

Im Gegensatz zu OpenSCAD unterstützt OpenJsCAD nicht den Import von DXF Dateien. Damit trotzdem 2D-Vektrografiken in OpenJsCAD genutzt werden können, wurde ein Pythonscript entwickelt, welches die Konvertierung einer *.svg Datei in eine *.jscad Datei ermöglicht. Inkscape arbeitet vorrangig mit dem SVG-Dateiformat, so dass für den Import kein Zwischenformat notwendig ist. Der entscheidende Vorteil liegt im Vergleich zur ursprünglichen Kombination aus OpenSCAD und dem DXF-Format, in der Unterstützung von Beziersegmenten. So ist es noch im Nachhinein möglich die Approximationsgüte über den von OpenJsCAD zur Verfügung gestellten Parameter CSG.defaultResolution2D anzupassen.


Das entwickelte Script ist hier zu finden.  Das Folgende einfache Beispiel - mit dem auch die Variation der Approximationsgüte gezeigt wurde - ist auch mit enthalten.



Einschränkungen

Die Implementierung unterliegt durchaus Einschränkungen. Der Pfad ist das einzige Element welches aus der SVG-Spezifikation umgesetzt wurde, d.h. dass z.B. Rechtecke und Kreise über Pfade abgebildet werden müssen. Dies ist jedoch uneingeschränkt möglich. Ein Pfad unterstützt nach SVG-Spezifikation verschiedene Segmente: eine einfache Linie, verschiedene Bezierkurven, sowie Kreisbögen. Leider werden zur Zeit nur Liniensegmente, sowie kubische Bezierkurven unterstützt. Für das Exportieren kann entweder die ID eines Pfades explizit angegeben werden oder es wird implizit der erste im XML-Baum gefundene Pfad für den Export verwendet. Mehrere Pfade müssen separat exportiert oder zuvor als ein Pfad zusammengefasst werden. 


Unannehmlichkeiten
   
Einer der wesentlichen Vorteile von OpenJsCAD ist die Tatsache das es vollständig im Browser lauffähig ist. Mit dem in Python geschrieben Script, ist neben Inkscape als Vektorzeichenprogramm noch eine Pythonumgebung nötig, die zumindest unter Windows Systemen nicht selbstverständlich ist. 
Werden komplexere Pfade exportiert, kann der durch die Kodierung in Javascript entstehende ASCII-Overhead schnell zu übermäßig großen Dateien führen.

 
Aussicht

In naher Zukunft ist die vollständige Unterstützung aller Pfadsegmente der SVG-Spezifikation wünschenswert. Auf Dauer ist eine komplette Portierung nach JavaScript anzustreben, um den direkten Import von SVG Dateien im Browser zu ermöglichen.
Auch kann es interessant sein, noch andere bereits bekannte Ansätze für die Kombination von direkter und parametrischer Modellierung auf Open-Source-Lösungen wie OpenSCAD, OpenJsCAD und Inkscape zu übertragen.