{"id":8174,"date":"2025-10-15T15:03:11","date_gmt":"2025-10-15T14:03:11","guid":{"rendered":"https:\/\/www.thetawelle.de\/?p=8174"},"modified":"2025-11-03T12:30:37","modified_gmt":"2025-11-03T11:30:37","slug":"meine-erste-3d-konstruktion-mit-openscad","status":"publish","type":"post","link":"https:\/\/www.thetawelle.de\/?p=8174","title":{"rendered":"Meine erste 3D Konstruktion mit OpenSCAD"},"content":{"rendered":"<p>Durch die Verf\u00fcgbarkeit eines 3D Druckers im Hackerspace, habe ich in der Vergangenheit bereits einige Dinge f\u00fcr meinen Alltag gedruckt. Oftmals bin ich daf\u00fcr auf einschl\u00e4gige Webseiten gegangen, die 3D Modelle in einer Art Library vorhalten. Da hab ich dann solange gesucht, bis ich was fand, was mir hilft und habe es runtergeladen, ge-slice&#8217;d und gedruckt (mit einem <a href=\"https:\/\/www.3dprima.com\/de\/3d-drucker-3d-druck\/3d-drucker-kaufen\/filament-3d-drucker\/anycubic-kobra-2-max\/a-29210\">ANYCUBIC Kobra II Max<\/a>).<\/p>\n<h2>DIY<\/h2>\n<p>Doch bei einigen dieser Dinge blieb das Gef\u00fchl zur\u00fcck, dass es zwar schon eine L\u00f6sung ist, aber halt nur so eine 70-Prozent-L\u00f6sung. Sch\u00f6ner w\u00e4re es, wenn man die Sachen selbst konstruieren k\u00f6nnte, so dass sie eine 90 bis 99-Prozent-L\u00f6sung ergeben. Doch daf\u00fcr muss man sich mit 3D-Konstruktionsprogrammen besch\u00e4ftigen. Da hatte ich Bammel vor, bis ich ich dann OpenSCAD genauer angeschaut habe.<\/p>\n<h2>3D Konstruktion f\u00fcr Programmierer<\/h2>\n<p><a href=\"https:\/\/www.thetawelle.de\/wp-upload\/openscad_logo.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.thetawelle.de\/wp-upload\/openscad_logo.png\" alt=\"\" width=\"594\" height=\"132\" class=\"alignright size-full wp-image-8176\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/openscad_logo.png 594w, https:\/\/www.thetawelle.de\/wp-upload\/openscad_logo-300x67.png 300w\" sizes=\"auto, (max-width: 594px) 85vw, 594px\" \/><\/a><a href=\"https:\/\/openscad.org\/\">OpenSCAD<\/a> (gesprochen &#8222;Open-Ess-Kat&#8220;) ist ein Werkzeug, mit dem man seine Konstruktion in Programmcode erzeugt. Und wow, hat das meine Weltsicht auf 3D Konstruktion ver\u00e4ndert.<\/p>\n<blockquote><p>OpenSCAD is software for creating solid 3D CAD objects. It is free software and available for Linux\/UNIX, MS Windows and Mac OS X.<\/p><\/blockquote>\n<p><strong>Auf Deutsch:<\/strong><\/p>\n<blockquote><p>OpenSCAD ist ein freies Modellierungswerkzeug, das 3D-Modelle nicht durch Mausinteraktion, sondern durch textbasierte Skripte beschreibt. Die Sprache folgt funktionalen Prinzipien: Variablen sind unver\u00e4nderlich, und jeder Entwurf ist reproduzierbar und leicht automatisierbar. Sie erm\u00f6glicht so einen pr\u00e4zisen, programmatischen Ansatz f\u00fcr den Modellaufbau.<\/p><\/blockquote>\n<p>Ich hatte irgendwann mal <a href=\"https:\/\/www.blender.org\/\">Blender<\/a> probiert (ich denke deren <a href=\"https:\/\/www.blender.org\/features\/sculpting\/\">Sculpting Funktionen<\/a> kommen dem was man hier braucht noch am n\u00e4chsten), war aber von den M\u00f6glichkeiten einfach \u00fcberw\u00e4ltigt. Die Lernkurve schien mir gewaltig steil zu sein. Nicht so bei OpenSCAD, denn da muss ich nicht in einem Editor mir die Maushand bis zu echten Handproblemen kaputt navigieren. Ich beschreibe einfach was ich ben\u00f6tige mit primitiven geometrischen Grundformen mathematisch in Programmcode.<\/p>\n<h2>Was ist die OpenSCAD Scripting Language<\/h2>\n<p>Die OpenSCAD-Skriptsprache ist eine funktionale, dom\u00e4nenspezifische Sprache zur Erzeugung von 2D- und 3D-Modellen, die vor allem im Bereich des Computer-Aided-Design (CAD) und 3D-Drucks eingesetzt wird.<superscript>[1][7]<\/superscript><\/p>\n<h3 id=\"m\u00f6glichkeiten-f\u00fcr-nutzer\">M\u00f6glichkeiten f\u00fcr Nutzer<\/h3>\n<ol>\n<li>\n        <strong>Skriptgesteuerte Modellierung:<\/strong> Nutzer schreiben Skripte, die geometrische Grundformen (z.B. cube, sphere, cylinder, polygon) definieren und diese durch Transformationen oder Boolesche Operationen (Vereinigung, Differenz, Schnittmenge, Minkowski-Summe) kombinieren.[7]\n    <\/li>\n<li>\n        <strong>Parametrisches Design:<\/strong> Wichtige Ma\u00dfe oder Eigenschaften lassen sich \u00fcber Variablen steuern. Ein einzelnes Skript kann so viele Varianten desselben Objekts generieren, indem nur Parameterwerte angepasst werden.[7]\n    <\/li>\n<li>\n        <strong>Funktionale und modulare Struktur:<\/strong> OpenSCAD unterst\u00fctzt Funktions- und Moduldarstellung, wodurch sich wiederverwendbare Komponenten und Abstraktionsebenen bilden lassen.[1]\n    <\/li>\n<li>\n        <strong>Transformationen und Stilmittel:<\/strong> Mit Befehlen wie translate, rotate, scale oder mirror werden Objekte verschoben, gedreht und skaliert. Farb- und Transparenzattribute erlauben visuelle Gestaltung.[2]\n    <\/li>\n<li>\n        <strong>Dateiausgabe:<\/strong> Modelle k\u00f6nnen in Formate wie STL oder DXF exportiert werden &#8211; ideal f\u00fcr Slicer-Programme und 3D-Drucker.[1]\n    <\/li>\n<li>\n        <strong>Automatisierte Workflows:<\/strong> Durch seine Textbasiertheit l\u00e4sst sich OpenSCAD leicht in Versionsverwaltungssysteme oder generative Design-Pipelines integrieren.[7]\n    <\/li>\n<\/ol>\n<h3 id=\"typische-leistungsmerkmale\">Typische Leistungsmerkmale<\/h3>\n<ol>\n<li>\n        <strong>Konstruktive Festk\u00f6rpergeometrie \/ Constructive Solid Geometry (CSG):<\/strong> Modelle entstehen aus Kombinationen bzw. Subtraktionen fester K\u00f6rper mittels Boolescher Operationen.[3]\n    <\/li>\n<li>\n        <strong>Funktionaler Programmierstil:<\/strong> Unver\u00e4nderliche Variablen, rekursive Ausdr\u00fccke und modulare Strukturen f\u00f6rdern klare, fehlerresistente Konstruktionen.[1]\n    <\/li>\n<li>\n        <strong>Spezialvariablen:<\/strong> Mit reservierten Variablen (z.B. $fn, $fa, $fs) kann der Detailgrad von Rundungen oder die Aufl\u00f6sung von Oberfl\u00e4chen beeinflusst werden.[2]\n    <\/li>\n<li>\n        <strong>Vektoren, Felder und Bereiche:<\/strong> \u00dcber dynamische Listen und Wertebereiche lassen sich Schleifen und Array-Operationen zur effektiven Geometrieerzeugung verwenden.[2]\n    <\/li>\n<li>\n        <strong>Rekursion und Iteration:<\/strong> Auch wenn OpenSCAD nicht Turing-vollst\u00e4ndig ist, erm\u00f6glichen rekursive Module und Schleifen die Erstellung komplexer, wiederholter Strukturen.[2]\n    <\/li>\n<li>\n        <strong>String-Unterst\u00fctzung und Unicode:<\/strong> Textausgabe und Beschriftungen k\u00f6nnen mit Unicode-Zeichen realisiert werden, was f\u00fcr parametrische Gravuren oder Skript-Debugging n\u00fctzlich ist.[1]\n    <\/li>\n<li>\n        <strong>Bibliotheken und Erweiterbarkeit:<\/strong> Nutzer k\u00f6nnen eigene Module oder Community-Bibliotheken importieren. Dadurch entstehen hochgradig konfigurierbare Modelle.[3]\n    <\/li>\n<\/ol>\n<p>Dank dieser Eigenschaften ist OpenSCAD besonders beliebt bei Ingenieuren, Entwicklern und Makern, die programmatische Pr\u00e4zision, Wiederholbarkeit und vollst\u00e4ndige Kontrolle \u00fcber Konstruktionen bevorzugen.[7][1]<\/p>\n<p><strong>Quellen:<\/strong> <a href=\"https:\/\/www.hessenhub.de\/wp-content\/uploads\/2022\/09\/OpenScad-Tutorial.pdf\">1<\/a>, <a href=\"https:\/\/openscad-meistern.de\/buch\/basic_ops_and_structure\/\">2<\/a>, <a href=\"https:\/\/openscad-meistern.de\/buch\/\">3<\/a>, <a href=\"https:\/\/www.youtube.com\/playlist?list=PLZ89Fw0KZGPzrNtcVRDutvuOsVAHZNa20\">4<\/a>, <a href=\"https:\/\/www.youtube.com\/watch?v=3hli3X0VeUg\">5<\/a>, <a href=\"https:\/\/hackmd.okfn.de\/p\/Skrmbac-r?print-pdf\">6<\/a>, <a href=\"https:\/\/web2-unterricht.ch\/programmieren\/3d-objekte-programmieren-mit-openscad\/\">7<\/a>, <a href=\"https:\/\/www.gutefrage.net\/frage\/wie-stellt-man-die-sprache-bei-open-scad-um\">8<\/a>, <a href=\"https:\/\/www.studocu.com\/de\/document\/hochschule-kaiserslautern\/anwendungssysteme\/open-scad-tutorial-ubungen\/83244512\">9<\/a> (Diese Erkl\u00e4rung wurde mit Hilfe von perplexity.ai erstellt &#038; gegengelesen.)<\/p>\n<h2>Jeder Topf braucht &#8217;nen Deckel: Die 90-Prozent-L\u00f6sung<\/h2>\n<p>Fangen wir mit dem Ergebnis zuerst an. Ich brauchte einen Deckel f\u00fcr eine Metallschale, die ich in der K\u00fcche immer f\u00fcr organischen Bioabfall benutze. Da die Schale bislang immer offen rumstand, hat sich gerade im Sommer schnelle eine Population Fruchtfliegen gebildet, die ich kaum mehr in den Griff bekommen habe. Wenn ich doch bloss einen Deckel f\u00fcr diese Schale&#8230;<\/p>\n<p><a href=\"\/wp-upload\/deckel_result.jpeg\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-upload\/deckel_result.jpeg\" alt=\"\" width=\"2048\" height=\"2048\" class=\"alignnone size-full wp-image-8185\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/deckel_result.jpeg 2048w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_result-300x300.jpeg 300w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_result-1024x1024.jpeg 1024w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_result-150x150.jpeg 150w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_result-768x768.jpeg 768w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_result-1536x1536.jpeg 1536w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_result-1200x1200.jpeg 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<p>&#8230;nun, einige Monate NACH der Feststellung des Problems und einer L\u00f6sungsidee und nach ca. 6 Stunden Basteln mit OpenSCAD, dann nochmal ca. 15 Minuten Druck des Griffs und ca. 3 Stunden Druck des Deckels an sich, gibt es eine passende L\u00f6sung. Im Bild sieht man die Schale und den Deckel. Der Deckel besteht aus zwei Komponenten Griff und eigentliche Abdeckung, die mit zwei Schrauben verbunden wurden. Griff und Abdeckung habe ich noch mit einem schwarzen Lack aus der Spr\u00fchdose lackiert.<\/p>\n<h2>Wie kam es aus dem 3D Drucker?<\/h2>\n<p>Hier nochmal die etwas detailliertere Sicht auf das fertige Produkt. (Bereits lackiert)<\/p>\n<p><a href=\"\/wp-upload\/deckel_druck.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-upload\/deckel_druck.jpg\" alt=\"\" width=\"1967\" height=\"1868\" class=\"alignnone size-full wp-image-8187\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/deckel_druck.jpg 1967w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_druck-300x285.jpg 300w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_druck-1024x972.jpg 1024w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_druck-768x729.jpg 768w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_druck-1536x1459.jpg 1536w, https:\/\/www.thetawelle.de\/wp-upload\/deckel_druck-1200x1140.jpg 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<h2>Wie wurde es konstruiert?<\/h2>\n<p>Hier sieht man die Abdeckung einmal von unten und einmal von oben. In der Unterseite habe ich versucht eine hexagonale \u00d6ffnung f\u00fcr die Mutter zu den beiden Schrauben umzusetzen. Leider war die Abmessung dann zu end. Was ich also f\u00fcr das n\u00e4chste mal gelernt habe: Insbesondere \u00d6ffnungen die eigentlich Bohrungen sein k\u00f6nnten immer 1-2 Millimeter gr\u00f6sser designen als ben\u00f6tigt.<\/p>\n<p>Alle Abmessungen hatte ich vorher mit einem Messschieber und einem Lineal vorgenommen. Aber gerade bei den Abmessungen der Schrauben\u00f6ffnungen war ich mir echt unsicher ob das klappt. Notfalls h\u00e4tte ich die halt gebohrt. Das urspr\u00fcngliche Design war eine einzige Konstruktion, Deckel mit Griff in einem. Doch f\u00fcr den 3D-Druck sind vor allem frei schwebende Teile ein grosses Problem, daher habe ich Griff und Deckel in zwei Komponenten aufgeteilt und auf eine Schraubverbindung gesetzt.<\/p>\n<p><a href=\"\/wp-upload\/lid_part_01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-upload\/lid_part_01.png\" alt=\"\" width=\"1196\" height=\"710\" class=\"alignnone size-full wp-image-8190\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/lid_part_01.png 1196w, https:\/\/www.thetawelle.de\/wp-upload\/lid_part_01-300x178.png 300w, https:\/\/www.thetawelle.de\/wp-upload\/lid_part_01-1024x608.png 1024w, https:\/\/www.thetawelle.de\/wp-upload\/lid_part_01-768x456.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<p><a href=\"\/wp-upload\/lid_part_01_b.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-upload\/lid_part_01_b.png\" alt=\"\" width=\"1196\" height=\"710\" class=\"alignnone size-full wp-image-8191\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/lid_part_01_b.png 1196w, https:\/\/www.thetawelle.de\/wp-upload\/lid_part_01_b-300x178.png 300w, https:\/\/www.thetawelle.de\/wp-upload\/lid_part_01_b-1024x608.png 1024w, https:\/\/www.thetawelle.de\/wp-upload\/lid_part_01_b-768x456.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<p><a href=\"\/wp-upload\/lid_part_02.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-upload\/lid_part_02.png\" alt=\"\" width=\"1196\" height=\"710\" class=\"alignnone size-full wp-image-8192\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/lid_part_02.png 1196w, https:\/\/www.thetawelle.de\/wp-upload\/lid_part_02-300x178.png 300w, https:\/\/www.thetawelle.de\/wp-upload\/lid_part_02-1024x608.png 1024w, https:\/\/www.thetawelle.de\/wp-upload\/lid_part_02-768x456.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<p><a href=\"\/wp-upload\/full_upper.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-upload\/full_upper.png\" alt=\"\" width=\"1334\" height=\"725\" class=\"alignnone size-full wp-image-8200\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/full_upper.png 1334w, https:\/\/www.thetawelle.de\/wp-upload\/full_upper-300x163.png 300w, https:\/\/www.thetawelle.de\/wp-upload\/full_upper-1024x557.png 1024w, https:\/\/www.thetawelle.de\/wp-upload\/full_upper-768x417.png 768w, https:\/\/www.thetawelle.de\/wp-upload\/full_upper-1200x652.png 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<h2>Der Quellcode f\u00fcr Deckel und Griff<\/h2>\n<p>Hier der Quellcode f\u00fcr den Deckel und den Griff. Ich hab den bereits ein wenig refactored f\u00fcr den Deckel. Die Griff-Konstruktion ist noch nicht so sch\u00f6n.<\/p>\n<p>Die Code-Abschnitte f\u00fcr LABEL und LOGO sind Experimente gewesen ein SVG-file als Logo einzubinden und das LABEL war ein Experiment Text mit einem spezifischen Font einzubinden. Beides hat funktioniert, aber leider h\u00e4tte es den 3D-Druck arg verkompliziert weil ich dann Supportmaterial h\u00e4tte drucken m\u00fcssen. Das wollte ich absolut vermeiden.<\/p>\n<pre class=\"brush: cpp; gutter: true; title: Source\/Snippet; toolbar: true; notranslate\" title=\"Source\/Snippet\">\r\n\/\/  AUTHOR: blazr\r\n\/\/    DATE: OCT 2025\r\n\/\/ VERSION: 1.5\r\n\r\n\/\/ INITIALIZATION\r\necho( &quot;---------------------------------&quot; );\r\necho( &quot;INITIALIZING&quot; );\r\n\/* &#x5B;BUILD\/ADD] *\/\r\n\/\/ CAP\r\nUSE_CAP = true;\r\n\/\/ GRIP\/HANDLE\r\nUSE_GRIP = true;\r\n\/\/ LOGO\r\nUSE_LOGO = false;\r\n\/\/ LABELS\r\nUSE_LABELS = false;\r\n\r\n\/* &#x5B;CAP] *\/\r\n\/\/ CAP RESOLUTION\/QUALITY\r\ncap_resolution = 300; \/\/ &#x5B;20:Low,50:Medium,300:High,600:Perfect]\r\n\/\/ COLOR\r\ncap_color = &quot;Silver&quot;; \/\/ &#x5B;Dimgray,Gray,Slategray,Silver,Lightgray,Gainsboro]\r\n\/\/ INNER DIAMETER (CM)\r\ncap_diameter_inner = 20.7; \/\/ &#x5B;10:0.1:100]\r\n\/\/ HEIGHT (CM)\r\ncap_height = 2.0;  \/\/ &#x5B;1:0.5:50]\r\n\/\/ WALL SIZE (CM)\r\ncap_wall_size = 0.5; \/\/ &#x5B;0.5:0.1:5]\r\n\/\/ HOLES DIAMETER (CM)\r\nhole_diameter = 0.55; \/\/ .01\r\n\/\/ SCREW HEAD HEIGHT (CM)\r\nhole_screw_head_length = 0.3; \/\/ .05\r\n\/\/ SCREW HEAD DIAMETER (CM)\r\nhole_screw_head_diameter = 1.05; \/\/ .01\r\n\/\/ HEX NUT RADIUS (CM)\r\nhole_hexa_radius = 0.5; \/\/ .05\r\n\/\/ HEX NUT DEPTH (CM)\r\nhole_hexa_depth = 0.3; \/\/ .1\r\n\r\n\/* &#x5B;GRIP] *\/\r\n\/\/ COLOR\r\ngrip_color = &quot;Dimgray&quot;; \/\/ &#x5B;Dimgray,Gray,Slategray,Silver,Lightgray,Gainsboro]\r\n\/\/ HEIGHT (CM)\r\ngrip_height = 2.0; \/\/ &#x5B;1:0.5:15]\r\n\/\/ WIDTH (CM)\r\ngrip_width = 1.5; \/\/ &#x5B;1:0.1:5]\r\n\/\/ LENGTH (CM)\r\ngrip_length = 6.0; \/\/ &#x5B;4:0.5:30]\r\n\/\/ WALL SIZE (CM)\r\ngrip_wall_size = 0.5; \/\/ &#x5B;0.5:0.1:5]\r\n\r\n\/* &#x5B;LOGO] *\/\r\n\/\/ COLOR\r\nlogo_color = &quot;Fuchsia&quot;; \/\/ &#x5B;Fuchsia,DeepPink,Crimson,DarkOrange,Gold,Yellow,GreenYellow,DarkViolet,Aqua,SandyBrown,Wheat]\r\n\/\/ SIZE\r\nlogo_scale_size = 0.02;  \/\/ &#x5B;0.0025:Tiny,0.005:Small,0.01:Normal,0.02:Bigger,0.04:Big]\r\n\/\/ FILENAME (SVG)\r\nlogo_filename = &quot;lightbulb.svg&quot;;\r\n\r\n\/* &#x5B;LABEL] *\/\r\n\/\/ COLOR\r\nlabel_color = &quot;Gold&quot;; \/\/ &#x5B;Fuchsia,DeepPink,Crimson,DarkOrange,Gold,Yellow,GreenYellow,DarkViolet,Aqua,SandyBrown,Wheat]\r\n\/\/ TEXT\r\nlabel_text = &quot;blazr&quot;;\r\n\/\/ FONT NAME\r\nlabel_fontname = &quot;Data Control&quot;;\r\n\/\/ FONT HEIGHT (CM)\r\nlabel_size = 3; \/\/ &#x5B;0.1:0.1:10]\r\n\r\n\/\/ USED TO STOP FOLLOWINg VARS TO APPEAR In CUSTOMIZER\r\nmodule __Customizer_Limit__ () {}\r\n \r\n\/\/ MISC VARS\r\nmodel_version = &#x5B;1, 5, 0];\r\nopenscad_version = version();\r\nflicker_correction = 0.005; \/\/ NEEDED TO FIX OPENSCAD FLICKERING ON DIFFS IN PREVIEW-RENDER\r\n\r\n\/**\r\n* CAP WITH A CERTAIN DEPTH AND WALL THICKNESS\r\n*\/\r\nmodule cap( height, radius, wall_size, color_name, color_name_inner ) {\r\n  difference() {\r\n    \/\/ OUTER CYLINDER\r\n    color( color_name )\r\n    cylinder(h = height, r = radius, center = false, $fn=cap_resolution);\r\n    \/\/ INNER CYLINDER\r\n    height_inner = height - wall_size;\r\n    translate(&#x5B;0.0, 0.0, -flicker_correction]) {\r\n      color( color_name_inner )\r\n      cylinder(h = height_inner-flicker_correction, r = (radius-wall_size), center = false, $fn=cap_resolution);\r\n    }\r\n  }\r\n}\r\n\r\n\/**\r\n* POLYGON 2D-SHAPE FOR EXTRUSION\r\n*\/\r\nmodule regular_polygon(order = 3, radius = 1) {\r\n     angles=&#x5B; for (i = &#x5B;0:order-1]) i*(360\/order) ];\r\n     coords=&#x5B; for (th=angles) &#x5B;radius*cos(th), radius*sin(th)] ];\r\n     polygon( coords );\r\n }\r\n\r\n\/**\r\n* HOLE ROUND\r\n*\/\r\nmodule hole( length, radius, color_name, offset_center_x ) {\r\n   translate( &#x5B;offset_center_x,0,0] ) {\r\n     color(color_name) cylinder(length, radius, radius, $fn = 50);\r\n   }\r\n}\r\n\r\n\/**\r\n* HOLE HEXAGON\r\n*\/\r\nmodule hole_hexa(length, radius, color_name, offset_center_x, offset_z) {\r\n  translate( &#x5B;offset_center_x, 0, offset_z] ) {\r\n    color( color_name ) linear_extrude( length ) regular_polygon( 6, radius );\r\n  } \r\n}\r\n\r\n\/**\r\n* MAIN MODULE TO CONSTRUCT CAP &amp; GRIP\r\n*\/\r\nmodule main(cap_diameter,cap_height,cap_wall_size,label_text,gh,gw,gs,gl) {\r\n  cap_radius_inner = cap_diameter \/ 2.0;\r\n  cap_radius_outer = (cap_diameter + (2*cap_wall_size)) \/ 2.0;\r\n  \/\/ HOLE CALCULATIONS\r\n  hole_radius = hole_diameter\/2.0;\r\n  hole_spacing = 0.5;      \r\n  hole_length = (2*hole_spacing)+hole_diameter;\r\n  bar_length = (2*hole_length) + gl;\r\n  hole_grip_offset_center = (bar_length\/2.0)-(hole_spacing+hole_radius);\r\n  hole_through_length = gs;  \r\n  rotate(&#x5B;0.0, 180.0, 0.0]) { \/\/ CONSTRUCTION ALL\r\n    if( USE_CAP ) {\r\n    translate(&#x5B;0,0,-cap_height]) { \/\/ CAP CONSTRUTION\r\n      cap_radius = cap_radius_outer;\r\n      difference() { \/\/ HOLES HEXAGON\r\n        \/\/ DECKEL\r\n        difference() { \/\/ HOLES ROUND\r\n          \/\/ CAP (BUILD WITH INNER &amp; OUTER CYLINDER)\r\n          cap(\r\n            cap_height,\r\n            cap_radius,\r\n            cap_wall_size,\r\n            cap_color,\r\n            &quot;gray&quot;\r\n          );\r\n          \r\n          \/\/ HOLES ROUND THROUGH\r\n          hole_offset_center = hole_grip_offset_center;\r\n          hole_length = cap_height+flicker_correction;\r\n          hole_diameter = 0.5;          \r\n          hole_radius = hole_diameter\/2.0;\r\n          \/\/ HOLE 1\r\n          hole( hole_length, hole_radius, &quot;yellow&quot;, -hole_offset_center );\r\n          \/\/ HOLE 2\r\n          hole( hole_length, hole_radius, &quot;yellow&quot;, hole_offset_center );\r\n          \r\n      } \/\/ difference HOLES ROUND\r\n    \r\n      \/\/ HOLES HEXAGON SURFACE\r\n      hole_hexa_offset_center = hole_grip_offset_center;\r\n      hole_hexa_offset_z = cap_height-cap_wall_size-(3*flicker_correction);\r\n      hole_hexa_length = hole_hexa_depth;\r\n      \/\/ HOLE HEXA 1\r\n      hole_hexa(\r\n        hole_hexa_length,\r\n        hole_hexa_radius,\r\n        &quot;blue&quot;,\r\n        hole_hexa_offset_center,\r\n        hole_hexa_offset_z\r\n      );\r\n      \/\/ HOLE HEXA 2\r\n      hole_hexa( \r\n        hole_hexa_length,\r\n        hole_hexa_radius,\r\n        &quot;blue&quot;,\r\n        -hole_hexa_offset_center,\r\n        hole_hexa_offset_z\r\n      );\r\n    } \/\/ difference HOLES HEXAGON\r\n        \r\n    \/\/ OPTIONAL LABELS ON TOP OF CAP (PROBLEMATIC FOR PRINTING)\r\n    if( USE_LABELS ) {\r\n      label_height = 0.1;\r\n      label_offset_to_center = cap_radius_outer\/2.3;\r\n      \/\/ LABEL LOWER\r\n      translate(&#x5B;0.0, +(label_offset_to_center-(label_size\/2.0)), cap_height]) {\r\n        color(label_color) linear_extrude(label_height) text(label_text, size=label_size,halign=&quot;center&quot;,font=label_fontname, $fn=300);\r\n      }\r\n      \r\n      \/\/ LABEL UPPER\r\n      rotate( &#x5B;0, 0, 180] ) {\r\n        translate( &#x5B;0.0, +(label_offset_to_center-(label_size\/2.0)), cap_height] ) {\r\n          color(label_color) linear_extrude(label_height) text(label_text, size=label_size,halign=&quot;center&quot;,font=label_fontname, $fn=300);\r\n        }\r\n      }\r\n    } \/\/ if\r\n  } \/\/ translate CAP CONSTRUTION\r\n  } \/\/ if\r\n  \/\/ END OF CAP CONSTRUCTION\r\n  \r\n  \/\/ BEGIN GRIP CONSTRUCTION (DEACTIVATED)\r\n  if( USE_GRIP ) {\r\n  difference() {\r\n    translate( &#x5B;0,0,(gh\/2.0)] ) {\r\n      \/\/ HANDLE UNION\r\n      union() {\r\n        \/\/ UPPER PART WITH HOLE\r\n        difference() {\r\n            color(grip_color)\r\n            cube(&#x5B;gl, gw, gh], center = true);\r\n            translate( &#x5B;0,0,-gs] ) {\r\n              color(grip_color)\r\n              cube(&#x5B;gl-(gs*2), (2.0*gw), (gh)], center = true);\r\n            }\r\n        }\r\n        \/\/ LOWER PART\r\n        translate( &#x5B;0,0,-((gh-gs)\/2.0)] ) {\r\n          color(grip_color)\r\n          cube(&#x5B;bar_length, gw, gs], center = true);\r\n        }\r\n      }\r\n    }\r\n    \/\/ HOLES\r\n    translate( &#x5B;-hole_grip_offset_center,0,-flicker_correction] ) {\r\n      color(&quot;yellow&quot;) cylinder(hole_through_length+(2*flicker_correction),hole_radius,hole_radius, $fn = 50);\r\n    }\r\n    translate( &#x5B;hole_grip_offset_center,0,-flicker_correction] ) {\r\n      color(&quot;yellow&quot;) cylinder(hole_through_length+(2*flicker_correction),hole_radius,hole_radius, $fn = 50);\r\n    }\r\n    \/\/ HOLES HEAD\r\n    hole_screw_head_radius = hole_screw_head_diameter\/2.0;        \r\n    translate( &#x5B;-hole_grip_offset_center,0,(hole_through_length-hole_screw_head_length+flicker_correction)] ) {\r\n      color(&quot;crimson&quot;) cylinder(hole_screw_head_length,hole_screw_head_radius,hole_screw_head_radius, $fn = 100);\r\n    }\r\n    translate( &#x5B;hole_grip_offset_center,0,(hole_through_length-hole_screw_head_length+flicker_correction)] ) {\r\n      color(&quot;crimson&quot;) cylinder(hole_screw_head_length,hole_screw_head_radius,hole_screw_head_radius, $fn = 100);\r\n    }        \r\n  } \/\/ difference\r\n  }\r\n\r\n  \/\/ OPTIONAL LOGO\r\n  if( USE_LOGO ) {\r\n    \/\/ ADDITIONAL STUFF\r\n    color(logo_color) linear_extrude(0.1)\r\n    translate( &#x5B;-7.3,0, 0] ) {\r\n      scale(&#x5B;logo_scale_size,logo_scale_size,logo_scale_size]) {\r\n          import(file = logo_filename, center = true, $fn = 100);\r\n        }\r\n      }\r\n      mirror( &#x5B;0,1,0] ) {\r\n        color(logo_color) linear_extrude(0.1)\r\n        translate( &#x5B;7.3,0, 0] ) {\r\n          scale(&#x5B;logo_scale_size,logo_scale_size,logo_scale_size]) {\r\n            import(file = logo_filename, center = true, $fn = 100);\r\n          }\r\n        }\r\n      }\r\n    }    \r\n  } \/\/ rotation CONSTRUCTION ALL\r\n} \/\/ END MAIN MODULE\r\n\r\n\/\/ EXECUTE PROGRAM\r\necho( &quot;EXECUTING&quot; );\r\nmain( \r\n  cap_diameter_inner,\r\n  cap_height,\r\n  cap_wall_size,\r\n  label_text,\r\n  grip_height,\r\n  grip_width,\r\n  grip_wall_size,\r\n  grip_length\r\n);\r\n\r\necho( str( &quot;MODEL VERSION: &quot;, model_version&#x5B;0],&quot;.&quot;,model_version&#x5B;1],&quot;.&quot;,model_version&#x5B;2] ) )\r\necho( str( &quot;BINARY VERSION: &quot;, openscad_version&#x5B;0],&quot;.&quot;,openscad_version&#x5B;1],&quot;.&quot;,openscad_version&#x5B;2]) );\r\necho( &quot;COMPLETE&quot; );\r\necho( &quot;---------------------------------&quot; );\r\n<\/pre>\n<p>Code als ZIP-Archiv <a href=\"\/wp-upload\/cap_and_grip_1_5_0.zip\"><strong>cap_and_grip_1_5_0.zip<\/strong><\/a> download.<\/p>\n<p>Mit etwas Zeit, werde ich das noch ein wenig sch\u00f6ner machen, den Code. Ich h\u00e4tte gerne ein vollst\u00e4ndig parametrisierbaren Deckel mit Griff, so dass ich f\u00fcr jedes Gef\u00e4\u00df von sagen wie einem Durchmesser von 5 bis 60 Zentimeter einen Deckel konstruieren kann.<\/p>\n<p><strong>UPDATE 1.4.0<\/strong><br \/>\nIch hab die Parameter jetzt nach der Dokumentation refactored so dass man eine sch\u00f6ne Ansicht im &#8222;Customizer&#8220; hat. Das ist eine optionale Einblendung in OpenSCAD, bei der man die Variablen die die Konstruktion beeinflussen, im GUI verstellen kann und die \u00c4nderung sofort sieht.<\/p>\n<p><strong>UPDATE 1.5.0<\/strong><br \/>\nJetzt sind alle Parameter \u00fcber den Customizer wunderbar anpassbar.<\/p>\n<p><strong>UPDATE 1.6.0<\/strong><br \/>\nErster <a href=\"https:\/\/www.thingiverse.com\/thing:7173716\">Release auf Thingiverse<\/a> f\u00fcr mich. Bin noch nicht damit zufrieden, dass man die handlebar noch manuell drehen m\u00fcsste f\u00fcr den Druck. Es fehlen noch die Daten f\u00fcr die eingesetzten Metallschrauben und Muttern. Ich hab da einfach Zeug gegriffen das noch in meiner Werkzeugkiste vorr\u00e4tig war.<\/p>\n<p><strong>UPDATE 1.7.0<\/strong><br \/>\nJetzt auch bei <a href=\"https:\/\/www.printables.com\/model\/1448985-universeller-deckel-fur-runde-gefasse\">Printables<\/a> ver\u00f6ffentlicht.<\/p>\n<p><strong>UPDATE 1.8.0<\/strong><br \/>\nSupport f\u00fcr transparente Farben hinzugef\u00fcgt, einige ASSERT statements hinzugef\u00fcgt, um Grenzwerte zu pr\u00fcfen, das Rendersystem zu Beginn sauber initialisiert,  die aktuelle Viewport Konfiguration (Kamerasicht und Ausschnitt) per ECHO statement ausgegeben.<br \/>\nCode als ZIP-Archiv <a href=\"\/wp-upload\/universal_cap_1_8_0.zip\"><strong>universal_cap_1_8_0.zip<\/strong><\/a> download.<\/p>\n<table>\n<tr>\n<th>Customizer Default GUI<\/th>\n<th>Customizer Easy GUI<\/th>\n<\/tr>\n<tr>\n<td valign=\"top\">\n<a href=\"\/wp-upload\/open_scad_customizer.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-upload\/open_scad_customizer.png\" alt=\"\" width=\"364\" height=\"755\" class=\"alignnone size-full wp-image-8208\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/open_scad_customizer.png 364w, https:\/\/www.thetawelle.de\/wp-upload\/open_scad_customizer-145x300.png 145w\" sizes=\"auto, (max-width: 364px) 85vw, 364px\" \/><\/a>\n<\/td>\n<td valign=\"top\">\n<a href=\"\/wp-upload\/open_scad_customizer_gui_1_5_0.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-upload\/open_scad_customizer_gui_1_5_0.png\" alt=\"\" width=\"366\" height=\"1182\" class=\"alignnone size-full wp-image-8217\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/open_scad_customizer_gui_1_5_0.png 366w, https:\/\/www.thetawelle.de\/wp-upload\/open_scad_customizer_gui_1_5_0-93x300.png 93w, https:\/\/www.thetawelle.de\/wp-upload\/open_scad_customizer_gui_1_5_0-317x1024.png 317w\" sizes=\"auto, (max-width: 366px) 85vw, 366px\" \/><\/a>\n<\/td>\n<\/tr>\n<\/table>\n<p>Man kann in dem <strong>Customizer<\/strong> sich die Arbeit noch sch\u00f6ner machen, indem man &#8222;Description only&#8220; w\u00e4hlt bei der Anzeige der Parameter. Das h\u00e4ngt nat\u00fcrlich davon ab wieviel Arbeit sich der Autor gemacht hat, ob das n\u00fctzlich ist.<\/p>\n<h2>Fazit: Augen auf bei den Einheiten und beim Slicing<\/h2>\n<p>Es war nicht so schwer wie gedacht. Es hat Spass gemacht. Man sollte bei der Konstruktion bereits permanent einbeziehen, ob der 3D-Druck ohne Supportstrukturen auskommen wird. Es ist leicht m\u00f6glich ein grosses Konstrukt in zwei Teile zu teilen. Ich habe mit Hilfe von <strong>Translation<\/strong> und <strong>Rotation<\/strong> beide Konstrukte abschliessend in die Lage im Raum gebracht, die dann auch auf dem Druckbett des 3D-Druckers verwendet werden sollte. Das hat die Weiterverarbeitung im Slicer vereinfacht.<\/p>\n<p>Beim Slicing musste ich dann nur noch eine einzige Korrektur vornehmen, n\u00e4mlich das Modell skalieren. Offenbar interpretiert der Slicer die OpenSCAD Masseinheiten als Millimeter. Ich hatte jedoch in Zentimetern gerechnet und kalkuliert. Anf\u00e4ngerfehler.<\/p>\n<p>Weiterer Nachtrag: Wie man in den Fotos sieht, ist die innere Oberflaeche nicht so toll gedruckt worden. Woran es genau lag, kann ich nicht sagen, jedoch hat das Slicing mit dem <a href=\"https:\/\/anycubic.com\/en\/slicerNextDownload\">ANYCUBIC Next Slicer<\/a> (und der zugehoerigen Druckerkonfiguration) das Problem behoben. Der eingesetzte Prusa Slicer hatte offenbar nicht die richtige Konfiguration beim Druck.<\/p>\n<h2>Nachtrag<\/h2>\n<p>Ich hab hier nur an der Oberfl\u00e4che der F\u00e4higkeiten von OpenSCAD gekratzt. Es steht einem letztlich das volle Spektrum der Mathematik zur Verf\u00fcgung, um sich auszudr\u00fccken. Das ist mir beim Lesen der Dokumentation aufgefallen. Das bedeutet, man ist &#8222;nur&#8220; durch die eigenen Kenntnisse in Mathematik begrenzt.\\<\/p>\n<p>Damit halte ich OpenSCAD f\u00fcr ein wunderbares Werkzeug, um Begleitend <strong>Konzepte der Mathematik zu lernen und zu begreifen.<\/strong> Und dabei meine ich &#8222;begreifen&#8220; im Sinne von &#8222;Begreifen&#8220; es anfassen k\u00f6nnen. Ich w\u00fcrde mir w\u00fcnschen dieses Werkzeug (exemplarisch f\u00fcr die Kategorie dieser Werkzeuge) w\u00fcrde Eingang finden in die mathematische Grundbildung junger Menschen. Ich l\u00f6nnte mir das super im Mathematikunterricht vorstellen und halte das Werkzeug f\u00fcr geeignet spielerisch Mathematik auszuprobieren und zu verstehen.<\/p>\n<h2>Basis Template<\/h2>\n<p>Da ich nun des \u00f6fteren ein neues Projekt mit OpenSCAD begonnen habe, hab ich mir ein kleines <strong>Basis Template<\/strong> gebaut, so dass ich nicht immer wieder beu Null beginnen muss.<\/p>\n<p><a href=\"\/wp-upload\/template.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-upload\/template.png\" alt=\"\" width=\"708\" height=\"539\" class=\"alignnone size-full wp-image-8239\" srcset=\"https:\/\/www.thetawelle.de\/wp-upload\/template.png 708w, https:\/\/www.thetawelle.de\/wp-upload\/template-300x228.png 300w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/a><\/p>\n<p>Mit dem Template werden einige Variablen, die man immer gut brauchen kann definiert. Auch wird der Customizer sofort benutzt. Das Template unterstuetzt zwei Konstruktionen, die einzeln, oder kombiniert ausgegeben werden k\u00f6nnen.<\/p>\n<p>Basis Template zum runterladen: <a href=\"\/wp-upload\/openscad_base_template_0_1_0.zip\">openscad_base_template_0_1_0.zip<\/a><\/p>\n<p><small><strong>Why do I blog this?<\/strong> Ich hatte ein wenig Spass dran. Und ich hab eine Menge gelernt. Vor allem hab ich den Schrecken vor 3D Konstruktionen verloren. Es kostet zwar einiges an \u00dcberlegungen, bis das was man sieht auch den eigenen Vorstellungen entspricht, aber man kann es programmieren. Und DAS ist VIEL besser als es zu konstruieren per Hand.<\/p>\n<p>Was ist wirklich schwierig fand, war das Denken in geschweiften Klammern. Welche Translation bezieht sich jetzt nochmal auf welche Objekte? Ich finde es schade, dass man das Ergebns einer &#8222;Action&#8220; (so nennt man eine Zeile die eine graphische Primitive umsetzt) nicht in einer Variablen speichern kann. Da muss ich nochmal schauen, ob das \u00fcber &#8222;Module&#8220; besser geht. Denn wenn ich eine gleiche Bohrung nicht nur einmal verwende, dann moechte ich das ungern per Copy &#038; paste tun. Vermutlich ist der richtige Weg hier ein neue &#8222;Module&#8220; zu definieren.<br \/>\n<\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Durch die Verf\u00fcgbarkeit eines 3D Druckers im Hackerspace, habe ich in der Vergangenheit bereits einige Dinge f\u00fcr meinen Alltag gedruckt. Oftmals bin ich daf\u00fcr auf einschl\u00e4gige Webseiten gegangen, die 3D Modelle in einer Art Library vorhalten. Da hab ich dann solange gesucht, bis ich was fand, was mir hilft und habe es runtergeladen, ge-slice&#8217;d und &hellip; <a href=\"https:\/\/www.thetawelle.de\/?p=8174\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eMeine erste 3D Konstruktion mit OpenSCAD\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":8189,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,9,68,4,8,15],"tags":[149,151,152,150],"class_list":["post-8174","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practice","category-studien","category-hardware","category-learning","category-open-something","category-visualisierung","tag-3d","tag-cad","tag-openscad","tag-printer"],"_links":{"self":[{"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/posts\/8174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8174"}],"version-history":[{"count":38,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/posts\/8174\/revisions"}],"predecessor-version":[{"id":8292,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/posts\/8174\/revisions\/8292"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/media\/8189"}],"wp:attachment":[{"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}