
OpenSCAD ist für mich bei der Programmierung der Druckobjekte das Werkzeug meiner Wahl. Derzeit verwende ich ein Appimage von Juli 2018. Hat man die ersten Schritte hinter sich, dann geht es zunehmend flotter. Etwas gewöhnungsbedürftig sind die unterschiedlichen Formate der Parameter. Meist werden sie als Vectoren (cube, translate, rotate etc.) übergeben, aber auch nur als einfache Variablen (sphere, cylinder). Etwas unübersichtlich wird es, wenn zusätzlich noch die Funktionen Translate ond/oder Rotate angewendet werden. Da das meist der Fall ist, habe ich für mich eine Modulbibliothek angelegt, die den Befehlssatz dahingehend erweitert, das mit den Körperdimensionen auch gleich die Vektoren für Translate, Rotate und andere mit übergeben werden. Vorteil ist, dass man die Modifikationen direkt anwendet und somit mehr Übersicht hat. Der originale Befehlssatz steht nach wie vor zur Verfügung.
Die zusätzlichen Körper in meiner aktuellen Modulbibliothek:
rprism( [x, y, z], [xt, yt, zt], [xr, yr, zr], mink, center ); (rectangular prism - rechteckiges Prisma, im Idealfall ein Würfel)
conus( [h, r1, r2], [xt, yt, zt], [xr, yr, zr], mink, center ); (Konus, ein gerader Kegel, Kegelstumpf oder im Idealfall ein Zylinder)
csection( [h, r, s], [xt, yt, zt], [xr, yr, zr], mink ); (cylindric section - senkrechter Zylinderabschnitt s <= 2*r, s > 0 )
Inzwischen ist auch das rechtwinklige Dreieck dazu gekommen:
rtriangle( [x, y, z], [xt, yt, zt], [xr, yr, zr], mink, center);
Weitere Module werden bei Bedarf folgen.
[x, y, z] - Vector für die Dimension eines rechteckigen Prisamas (default ist [1, 1, 1])
[h, r1, r2] - Vector für die Dimension eines Konus (h = Höhe, r1 = radius unten, r2 = radius oben, default ist [1, 1, 1])
[h, r, s] - Vector für die Dimension eines senkrechten Zylinderabschnitts( h= Höhe, r = radius, s = Kreissehne, default ist [1, 1, 1])
[xt, yt, zt] - Vector für den Versatz (translate)
[xr, yr, zr] - Vector für die Drehung (rotate)
mink - Radius bei der Anwendung der minkowski-Funktion mit der Kugel auf den Körper (mink > 0, 0 keine minkowski-Funktion)
center - Boolean true - Koordinatenursprung ist der Körpermittelpunkt, false Koordinatenursprung ist die vordere untere linke Ecke
Selbstverständlich muss man nicht zwingend alle Parameter übergeben - Beispiele zur Anwendung:
rprism(); erzeugt einen Würfel mit der Kantenlänge 1
rprism( [2, 2, 2] ); erzeugt einen Würfel mit der Kantenlängen 2
rprism( [2, 2, 2], [10, 10 ,10], [ 90, 0, 0] ); erzeugt einen würfel und versetzt ihn auf jeder Achse um 10 und dreht ihn 90° um die X-Achse
Wird ein leerer Vector verwendet, dann sollte man diesen mit einer "0" füllen, sonst werden die Parameter zuvor definierter Objekte übernommen. Das Ergebnis sieht gerade bei dem Rotate-Vector sehr lustig aus, aber es läßt sich damit nicht gut arbeiten..
rprism( [2, 2, 2], [0], [0], 1 ); erzeugt einen Würfel und wendet die minkowski-Funktion mit dem radius 1 an.
rprism( [2, 2, 2], [0], [0], 0, false ); erzeugt einen Würfel und setzt die linke untere vorder Ecke auf den Koordinatenursprung.
Quelltext meiner Modulbibliothek (Stand Oktober 2018):
Diese Bibliothek funktioniert erst mit einer OpenScad-Version aus 2018. Frührere Versionen verweigern die Anzeige mit F5. Das aktuelle Release aus 2015 funktioniert nicht fehlerfrei.
/* Written by Felix Sternsdorf <Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!>
To the extent possible under law, the author(s) have dedicated all
copyright and related and neighboring rights to this software to the
public domain worldwide. This software is distributed without any
warranty.
You should have received a copy of the CC0 Public Domain
Dedication along with this software.
If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
/*
rprism( [dimension], [translate], [rotate], mink, center );
conus( [dimension], [translate], [rotate], mink, center );
csection( [dimension], [translate], [rotate], mink );
rtriangle([dimension],[translate],[rotate], mink, center);
default:
dimension [1, 1, 1];
translate [0, 0, 0];
rotate [0, 0, 0];
mink = 0;
center = true;
*/
$fn = 36;
// rprism([dimension],[translate],[rotate], mink, center)
module rprism( dim = [1, 1, 1], trans = [0, 0, 0], rot = [0, 0, 0], mink = 0, center=true ) {
x = dim[0];
y = dim[1];
z = dim[2];
tx = trans[0];
ty = trans[1];
tz = trans[2];
wx = rot[0];
wy = rot[1];
wz = rot[2];
translate([tx, ty, tz])
rotate([wx, wy, wz ])
minkowski() {
cube([x - 2*mink, y - 2*mink, z - 2*mink], center);
sphere( mink );
}
}
// rtriangle([dimension],[translate],[rotate], mink, center)
module rtriangle( dim = [1, 1, 1], trans = [0, 0, 0], rot = [0, 0, 0], mink = 0, center=true ) {
x = dim[0];
y = dim[1];
z = dim[2];
tx = trans[0];
ty = trans[1];
tz = trans[2];
wx = rot[0];
wy = rot[1];
wz = rot[2];
translate([tx, ty, tz])
rotate([wx, wy, wz ])
minkowski() {
difference() {
cube([x - 2*mink, y - 2*mink, z - 2*mink], center);
rotate([ - asin (z / sqrt(y*y + z*z)) , 0, 0 ])
translate([0, 0, z/2 ])
cube([x + 2*mink, sqrt((y*y) + (z*z)) + 2*mink, z + 2*mink], center);
}
sphere( mink );
}
}
// conus( [dimension], [translate], [rotate], mink, center )
module conus( dim = [1, 1, 1], trans = [0, 0, 0], rot = [0, 0, 0], mink = 0, center=true ) {
h = dim[0];
r1 = dim[1];
r2 = dim[2];
tx = trans[0];
ty = trans[1];
tz = trans[2];
wx = rot[0];
wy = rot[1];
wz = rot[2];
translate([tx, ty, tz])
rotate([wx, wy, wz ])
minkowski() {
cylinder( h - 2*mink, r1 - mink, r2 - mink, center);
sphere( mink );
}
}
// csection( [dimension], [translate], [rotate], mink );
module csection( dim = [1, 1, 1], trans = [0, 0, 0], rot = [0, 0, 0], mink = 0 ) {
h = dim[0];
r = dim[1];
s = dim[2];
tx = trans[0];
ty = trans[1];
tz = trans[2];
wx = rot[0];
wy = rot[1];
wz = rot[2];
translate([tx, ty, tz])
rotate([wx, wy, wz ])
difference() {
conus( [h, r, r], [], [], mink );
rprism( [ 2*r, 2*r+0.1 , h+0.1 ], [r-sqrt(r*r - s/2*s/2), 0, 0 ]);
}
}

