3D Konstruktion mit OpenSCAD

  • Hallo Stefan,


    Bevor ich es noch vergesse, hier ist nochmal ein einfaches und langweiliges Ergebnis aus meiner Projektesammlung gezeigt, wenn man mit primitiven geometrischen Formen in OpenSCAD programmatisch spielt. Also Kugeln mit wenigen Befehlen dehnen, schrumpfen und aushöhlen, um geschmeidige gekrümmte Oberflächen für einen kugelförmigen Führerstand zu erzeugen. Eine gute Übung wäre, die Form eines Hühnereis mittels einer mathematischen Formel in OpenSCAD exakt zu definieren und der Rest ist wirklich einfach. Dabei wären u.a. diese wichtigen Grundbefehle sphere(...) und scale([...]) so wie die erweiterten Befehle hull(...) und minkowski(...) zu benutzen, worüber sehr viel Dokumentation und Tutorials auch als Videos im Internet gibt.


    Gruss,


    Johannis

  • Hallo liebe openSCAD-Freunde,


    Ich wollte mich kurz mal ueber die Wichtigkeit des unsinnig erscheinenden Befehls cube(0); auseinandersetzen. Dieser Befehl symbolisiert den Urknall bei der Geburt eines komplizierten 3D-Modells, was sich sehr dramatisch anhört, aber der Beweis folgt weiter unten, denn "Grosse Dinge haben einen kleinen Anfang", wie es frei uebersetzt im SciFi-Film Prometheus zu hören war. Dieser Befehl dient als Platzhalter fuer noch nicht im Kopf des Kontrukteurs ausgereifte Teilkomponenten, so dass dieser Platzhalter zum geeigneten Zeitpunkt durch komplexen SCAD-Code ersetzt werden kann. Man könnte statt cube(0); auch sphere(0); bzw. cylinder(0); schreiben, aber cube(0); ist viel kuerzer in der Schreibweise und stellt einen unsichtbaren und unendlich kleinen Wuerfel dar. Also man fängt mit dem Programmieren sehr abstract an und spezifiziert später schrittweise bis zum Detail, ohne dass das Testen der Teilkomponenten in der Zwischenschritte gestört wird. Hier ein Beispiel im eigenen primitiven Programmierstil, um das Thema der Abstrahierung dem openSCAD-Einsteiger verständlicher zu machen:

    Code
    // Phase I
    
    LOK_TYP="Vectron";
    
    dasModell(LOK_TYP);
    
    module dasModell(welches){
     cube(0);
    };

    Bei jeder Programmierphase wächst der Code, zuerst langsam und dann schnell, ohne die Uebersicht zu verlieren. Der Befehl cube(0); erscheint immer wieder, aber rueckt weiter runter zu den untergeordneten Unterroutinen, wo man schrittweise von der Abstrahierung zur Konkretisierung uebergeht.

    Die Unterteilung in mehrere Unterroutienen module abc(u,v,w,...,x,y,z){...}; und deren Benennung sollte die Logik der Montage des später 3D-gedruckten Modells aus zerlegbaren Teilkomponenten folgen. Es wäre klug eine eigene erweiterbare Bibliothek von Unteroutienen zu sammeln, die dann bei Bedarf abgerufen werden können. Die Benennung der Unterroutinen und der variablen Uebergabeparameter sollten beschreibend sein, so dass auch nach langer Unterbrechung der Programmiercode lesbar und verständlich ist. So entwickelt der Konstrukteur einen "sprechenden" Programmiercode, der ihm hilft, evtl. Fehler aufzudecken und zu korrigieren, um letztendlich die gewuenschte Modellform zu optimieren.

    Die Abhängigkeitshierarchie der Unterroutinen untereinander muss wegen der besseren Uebersicht sinnvoll ueberlegt sein. Man kann Unterroutinen auch in späterer Programmierphase in der Hierarchie nach oben oder nach unten verschieben, falls es einen besseren Sinn macht. Der uebergebene Wert +1 oder -1 indiziert die Richtung zur Orientierung und evtl. Rotation der betreffenden Teilkomponente um die Z-Achse, z.B. vorderes oder hinteres Drehgestell, vorderer oder hinterer Stromabnehmer, linkes oder rechtes Fuehrerstandsfenster, linke oder rechte Pufferbohle, oberer oder unterer Seitenlueftungsschacht, obere oder untere Zierleiste, usw.

    ...und wo weiter, die Codezeilen wachsen und wachsen mit mehr vordefinierten Konstanten verfeinert bis zur allerletzten Programmierphase mit wiederholenden Zwischentests. Auch wenn man noch nichts vom 3D-Modell sieht, trotzdem ist das abstrakte virtuelle Geruest so ungefähr fertig durchdacht, um dannach mit der genauen Definition und Positionierung der kleineren und kleinsten Teilkomponenten auf Detailebene in den nächsten Programmierphasen anzufangen.


    Fazit: das abstrakte Programmieren von mehreren 3D-Modellen mit ähnlicher Körperanatomie mittels openSCAD lohnt sich auf langer Sicht, wobei der Platzhalter cube(0); eine wichtige Rolle spielt, falls man effizient konstruieren und sich unnötige Wiederholungen bei jedem neuen Projekt ersparen will.


    Gruss,


    Johannis

  • Hallo liebe OpenSCAD-Freunde,


    Es ist lange her seit der vorherigen Post und da dachte ich, kurz meine Erfahrungen über konstante Gehäusewandstärke bei variablen Gehäusequerschnitten mit euch zu teilen, was für den einen oder anderen evtl. nützlich sein könnte.

    Eine konstante Gehäusewandstärke hängt von der Materialfestigkeit/-sprödigkeit/-elastizität und von der Qualität des 3D-Druckers ab.

    Ein variabler Gehäusequerschnitt könnte sich durch Hoch- oder Runterskalieren einer vordefinierten Gehäusegeometrie (z.B. von H0 nach 0 oder von 1 nach 0) ergeben. Der Slicer (z.B. Cura) vergrössert oder verkleinert das zu druckende Modellteil prozentuell nach Belieben, aber dabei als Nebenerscheinung wächst bzw. schrumpft die Wandstärke ungewollt mit. Eine Lösung zu diesem Problem könnte ein intelligentes OpenSCAD-Modell sein. Obwohl der scale-Befehl auch nur mit relativen Werten das Modell modifiziert, kann man trotzdem anhand des unten aufgelisteten Quellcode-Beispiels mit absoluten Werten das Modell dynamisch manipulieren, ohne die vordefinierte Wandstärke zu riskieren.

    Dazu braucht man etwas Phantasie, um sich die Aussenwand und den Innenhohlraum des evtl. asymmetrischen Gehäuses in jeder Koordinatenrichtung abstrakt vorzustellen.

    Allgemein gelten die Formeln:

    Hohlraumabmessungen = Aussenabmessungen - 2 x Wandstärke

    Verschiebungen = Wandstärke x Korrekturfaktoren

    Bei primitiven symmetrischen Formen geht es recht einfach, aber bei komplizierteren asymmetrischen Paramorphosen fangen die Herausforderungen gerade an, wo die Positionierung des inneren Hohlraums geringfügig angepasst werden muss. Eine horizontale Korrekturverschiebung in X-Richtung wäre unnötig,, falls es sich um einen Reisezugwagen handelt oder es an beiden Enden des Lokgehäuses Führerstände gibt. In der Regel ist eine seitlich Korrekturverschiebung in Y-Richtung wegen der Spiegelsymmetrie unnötig. Eine vertikale Korrekturverschiebung in Z-Richtung ist immer zwingend, besonders wenn der Gehäuseboden wegen der Innenausstattung und des motorisierten Unterbaus unten offen bleiben muss.

    Zur Veranschaulichung nehmen wir als Beispiel den hypothetischen Steuerwagen des Experimental-ICE 5 in einer stark vereinfachten Kugelzugform aus dem virtuellen Windkanal, wobei die Parametrisierung über vordefinierte Konstanten kontrollierbar ist.

    Man fängt vom der verkleinerten Kopie einer Pausenzeichnung an, die vielleicht das gewünschte Modell in 1:100 darstellt. Die Proportionen der strategischen Abmessungen müssen der Spur 0 angepasst werden. Erst wenn die Wandstärke und die endgültige Gehäuseform unter Kontrolle ist, kann man dannach Fenster, Türen und sonstige Öffnungen ausschneiden.

    Ich hoffe, dass das Thema mit der Wandstärke als Anregung interessant genug für eure Projekte ist.


    Gruss,


    Johannis

  • Hallo Leute,


    Einige Gedanken zum 3D-Drucksupport, was als Stütze für (über-)hängende Strukturen an einem komplizierteren Modell nützlich wäre.

    Wenn man nicht mit der angebotenen 3D-Drucksupportfunktionalität (Form, Positionierung, usw.) der Slicer-Software zufrieden ist, kann mit Hilfe eines erweiterten OpenSCAD-Quellcodes das eigene optimierte Drucksupportmaterial je nach 3D-Druckverfahren im Modelldesign miteinbezogen werden und je nach Belieben in der STL-Datei ein- oder ausgeblendet werden.


    Hier ist das Beispiel eines vereinfachten Güterwagen-Drehgestells als Ergebnis in mehrere Ansichten, das auf dem Rücken mit billigem FDM-Drucker gedruckt wird, wobei das überschüssige Supportmaterial in der Nachbearbeitung weg getrennt wird.


    Nebenbei noch angemerkt, falls es jemanden interessiert, gibt es einen Cloud-Service mit Registrierung, wo man eigene OpenSCAD-Dateien im Browser-Fenster editieren, als Drahtmodell oder Solidmodell oder halbdurchsichtiges Mischmodell ansehen und dort speichern kann.


    Gruss,


    Johannis

  • Hallo,


    Immer wieder kann man spielerisch neue Methoden im OpenSCAD entdecken, mit denen durch die Kombination von primitiven Formen komplexere Geometrien gezaubert werden können. Hier wird wieder ein anderer Güterwagen-Drehgestelltyp gezeigt, der mit Hilfe der folgenden Befehle abstrakt mit einigen herausgehobenen bzw. vertieften Details entworfen wurde. Aus einem Würfel (cube([...]...)) kann eine rechteckige Kiste, aus einer Kugel (sphere(...)) ein Ellipsoid und aus einem Zylinder (cylinder(...)) ein Kegel oder ein Kegelstumpf geformt werden, die voneinander ausgeschnitten (difference() werden können oder sich miteinander übereinschneiden (intersection()) oder miteinander geschweisst (union()) werden können. Ihre Verschiebungen, einzeln oder gruppiert, bewegen (translate([...])) sich entlang der Koordinatenachsen oder drehen (rotate([...])) sich um die Koordinatenachsen. Etwas komplizierter wird es mit dem Spiegeln (mirror([...])), weil man sich die zu multiplizierenden Körper spiegelsymmetrisch oder rotationsymmetrisch im Raum plastisch vorstellen muss. Wegen der Parametrisierung der o.g. Befehle kann man sich die offiziele Beschreibung anschauen.

    Zusätzlich benutze ich persönlich kommentierte Konstantendefinitionen als Schalter vor dem eigentlichen Unterroutinen-Quellcode, um bestimmte Details gezielt ein- oder auszublenden, falls sie störend für den einen oder anderen Zweck sind. Aber Konstantendefinitionen sind auch sinnvoll, um Positionierungen oder Skalierungen quasi-automatisch zu steuern, z.B.:

    SPUR=0; // 0=1:45, 1=1:32, 2=1:22.5

    HANDGRIFFE=1; // 0=ausblenden, 1=einblenden

    LOCHPOSITION=0; // -1=unten, 0=mittig, +1=oben

    ANSICHT=+1; // -1=hinten, 0=mittig, +1=vorne

    DREHUNG=0; // -1=negativ, 0=neutral, +1=positiv

    Hier nochmal das visuelle Ergebnis eines weiteren vereinfachten Experiments im Maßstab 1:45 für die Spur 0.


    Am Ende wird dann die OpenSCAD-Datei (z.B.: "DB_Einheitsdrehgestell_45.scad") und auch als Stereolithographiedatei (z.B.: "DB_Einheitsdrehgestell_45.stl") abgespeichert und ab geht die Post zur 3D-Druckerei, damit das Stück noch rechtzeitig bis zum kommenden Sonnabend bereit steht.


    Gruss,


    Johannis

  • Hallo Leute,


    Um Zierstreifen in der OpenSCAD-Umbegung zu visualisieren, braucht man nur eine leichte Sommerübung in der Hitze, indem dünne waagerechte Balken um wenige tausendstel Millimeter seitlich aus der Gehäuseoberfläche herausragen. OpenSCAD benutzt eigene Farbdefinitionen, die nicht unbedingt direkt mit RAL oder Pantone vergleichbar sind. Anstatt "Elfenbein/Beige" wird "Wheat" benutzt und anstatt "Ozeanblau" wird "DarkCyan" benutzt. Alternativ können auch RGB-Farbcodes benutzt werden.

    Hier sind die einzelnen Arbeitsschritte:

    1. Den Quellcode für die zwei- oder mehrteilige Gehäuseform programmieren.

    2. Den zusätzlichen Quellcode zum Hervorheben der Zierstreifen programmieren.

    3. Das gelbe Volumenmodell erzeugen.

    4. Das gelbe Volumenmodell rotieren, zoomen und positionieren.

    5. Das Farbmodell erzeugen.

    6. Screendump/Snapshot vom Farbmodell als Bitmap-Bilddatei speichern.

    Falls das Volumenmodell zu kompliziert ist und die Rechnerkapazität nicht reicht, erscheint im Console-Fenster eine Fehlermeldung:

    Hier sind einige Ergebnisse (z.B.: Epoche IV, InterCity/TEE und Rheingold)


    Gruss,


    Johannis

  • Hallo Leute,


    Ausser den Online-Tutorials gibt es noch gedruckte Bücher. In meiner privaten Bücherei findet man folgende englisch- und deutschsprachige Bücher für Anfänger und Fortgeschrittene zum Erlernen und Vertiefen der OpenSCAD-Programmierung:



    OpenSCAD Basic Tutorial (Kishore) ISBN 978-1-393-98880-9

    OpenSCAD for 3D Printing (Al Williams) ISBN 978-1-500-58247-0

    OpenSCAD Cookbook (John Clark Craig) ISBN 978-1-790-27391-1

    Understanding OpenSCAD (Alicia Noors) ISBN 978-3-752-68560-2

    Mastering OpenSCAD (Jochen Kerdels) ISBN 978-3-753-45858-8

    Technisches Konstruiren mit OpenSCAD (Tam Hanna) ISBN 978-3-895-76396-0


    Alle hier aufgelisteten Veröffentlichungen beinhalten bebilderte Grundlagenbeispiele mit dokumentierten Programmiercode, wobei jeder Verfasser seine Schwerpunkte setzt. Für Kleinteile-Konstruktion würden diese Bücher ausreichen, aber für komplettes Rollmaterial entwerfen, bezweifele ich. Ob ein speziell für die Modellbahner ausgerichtetes OpenSCAD-Buch von breitem Interesse wäre, ist auch fragwürdig, höchstens als Book-on-Demand.


    Gruss,


    Johannis

  • Hallo Leute,


    Hier ist ein vereinfachtes Beispiel in vier Varianten, wie man genietete oder geschweisste Kessel virtuell modellieren kann.

    Die Nietenköpfe (für ältere Epochen) sehen attraktiver aus im Vergleich zu den Schweissnähten (für modernere Epochen), was eine Freude für die Augen eines jeden Nietenzählers ist.

    Die inneren Nietenköpfe bzw. Schweissnähte können zur Vereinfachung ausgeblendet werden. Die Abmessungen können für eigene Projekte angepasst werden. Die Oberflächenrundheit kann auf Kosten der Rechenzeit verfeinert werden. Die Schnittansicht kann aktiviert werden, um das Innere zu überprüfen. Die Dichte der Nietenabstände und die Sauberkeit der Schweissnähte kann optimiert werden. Alles das wird über Parametern gesteuert, wie es im folgenden Quellcode zu sehen ist.



    Die für sich sprechenden Namen der Konstanten, der Variablen und der Unterroutinen wurden so gewählt, dass der Quellcode leicht verständlich ist, aber dafür muss man die langen Programmierzeilen in Kauf nehmen. Die Richtungsindizes sind zur plastischen Orientierung im XYZ-Raum. Die Logik der Kesselanatomie wurde in mehrere Unterroutinen aufgesplittet, damit der Quellcode übersichtlicher wird und für jeden OpenSCAD-Einsteiger nachvollziehbar ist. Das Allerkomplizierteste (wenn überhaupt) wären die trigonometrischen Koordinatenfunktionen in den Schleifen, um die Positionierung jeder Naht bzw. jeder Niete zu definieren. Man könnte den Quellcode auch etwas anders schreiben können und die Unterroutinen anders formulieren können, aber dieses Beispiel gilt nur als Ideenvorschlag. Letztendlich kann dieses Beispiel nach Belieben erweitert werden, indem Zufuhr- und Abflussleitungen mit DIN/ISO/ANSI-Flanchen nach dem selben Prinzip angebracht werden.


    Gruss,


    Johannis

  • Hallo Johannis

    Wirklich bewundernswert!

    Ich habe mich gerade zum Lernen an zwei Puffer gewagt. Jetzt brauch ich noch einen Drucker.... 8)

    macht aber auch so schon Spaß.

    Den Kesselquelltext muß ich mal genauer studieren, der ist ja ultrakompakt. aber er tut´s :thumbup:



    Wer den Code haben möchte, ist angehängt. Das graue Teil sieht man nur, wenn man zum Rendern auf den Vorschaumodus klickt . Ob das so muss, weiß ich (noch) nicht.

    ___________________________________

    Gruß Olli

    Homepage

    Edited once, last by Olli ().

  • Hallo Olli,


    Ich denke, OpenSCAD ist es einen Versuch wert. Zuerst programmierst du runde Puffer, dann eckige Puffer und am Ende hast du ein ganzes Fahrzeug fertig.

    Du findest deine eigene Methode, deine (un-)gerenderten Teile nach belieben ein- und auszublenden. Das A und O ist das modulare und parametrisierte Vorgehen, um intelligenten Quellcode zu erstellen. Das selbe Ergebnis kann mit umständlichem oder mit komprimiertem oder gesplittetem Quellcode erreicht werden. Die unzähligen Youtube-Tutorials helfen dabei, sich in die Thematik zu vertiefen. Einige komplizierte geometrische Formen lassen sich mit herkömmlicher Mausakrobatik nicht so leicht konstruieren, daher wäre OpenSCAD eine erprobte Lösung. Du kannst mit OpenSCAD auch eigenes Drucksupportmaterial hinzuentwerfen, das auch ein- und ausgeblendet werden kann, wenn die Funktionalität deiner Slicer-Software nicht ausreicht und wenn du nicht sicher bist, welche Druckrichtung (vertikal, horizontal, diagonal) fuer das anzufertigende Teil am optimalsten ist. Ich denke, du wirst mit OpenSCAD Freude haben, besonderst wenn du deine konstruirten Teile fertig gedruckt plastisch vor dir auf deiner Werkbank siehst. Mach weiter so. :thumbup:


    Gruss,


    Johannis

  • Hallo Leute,


    In diesem Beitrag schreibe ich kurz meine Gedanken über die Möglichkeit der Automatisierung mit OpenSCAD, deshalb entschuldigt vorab die EDV-technischen Fachausdrücke und die kryptischen Abkürzungen.


    Bisher waren wir es gewohnt, den OpenSCAD-Quellcode unmittelbar in der OpenSCAD-Umgebung zu programmieren. Alternativ kann der OpenSCAD-Quellcode mit einem üblichen Texteditor (Notepad, usw.) geschrieben und dann in die OpenSCAD-Umgebung importiert werden, denn SCAD-Dateien sind letztendlich lesbare Textdateien. Aber man muss ja überhaupt nicht den OpenSCAD-Quellcode von Hand eintippen. Der OpenSCAD-Quellcode kann zum Beispiel mit den folgenden Schritten auch automatisch generiert werden.


    Die Formbeschreibung und die Koordinatenpositionierung von Teilobjekten (Führerstände, Fensterrahmen, Drehgestelle, Türöffnungen, Handgriffe, Kühlrippen, usw.) können in flachen Tabellen (CSV, XML, XLSM, usw.) bzw. Index-Datenbanken (SQL) ausgelagert werden. Eine komplette Bibliothek von Teilobjekten kann gesammelt, erweitert und je nach Bedarf wahlweise aufgerufen werden.


    Man definiert die branchenspezifische Intelligenz bzw. Logik mit konfortabler Benutzeroberfläche, die erstens die obigen Eingabedaten in einer Interpreter- bzw. Compiler-Sprache (Java, Python, VBA, usw.) bearbeitet, die zweitens das Ergebnis in eine Datei mit SCAD-Syntax schreibt und die drittens OpenSCAD aufruft, um das Endprodukt graphisch darzustellen und um daraus eine druckbare STL-Datei für die bevorzugte Slicer-Software zu erzeugen.


    Dieser wiederholende Prozess lohnt sich besonders, wenn mehrere Varianten eines vielfältigen Endprodukts effizient abgeleitet werden sollen. Ich selber habe dieses Lösungskonzept mit XML und Python getestet und dabei zufriedenstellende Ergebnisse erzielt. Hoffentlich dienen die obigen Gedanken als Anregung, so etwas ansatzmässig auszuprobieren, um neue Erfahrungen zu sammeln.


    Gruss,


    Johannis

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!