viewtopic.php?f=23&t=865&start=20#p8784
aber erst jetzt entdeckt, wie man sowas wirklich einfach beschreibt.
Es sind zwei möglicherweise weniger bekannt Befehle von openSCAD, die hier eine Rolle spielen.
offset https://en.wikibooks.org/wiki/OpenSCAD_ ... ons#offset
und
hull https://en.wikibooks.org/wiki/OpenSCAD_ ... tions#hull
"offset" arbeitet nur auf 2D-Strukturen und kann diese in der Größe um einen konstanten Offset zu allen Seiten verändern. Interessant ist, dass die Ecken dabei gerundet werden können. Bei genauer Betrachtung wird damit die Vorgabe, dass der neue Umriss einen konstanten Abstand zum ursprünglichen aufweist, eigentlich am exaktesten erfüllt. Es gibt aber auch die Möglichkeit ohne Eckenrundung.
"hull" ist ein 3D-Befehl, der eine Hülle um zwei beliebige Objekte umspannt, so als würde man sie mit Frischhaltefolie einwickeln.
WIr müssen nun die beiden Querschnitte an den Enden der Röhre als 2D-Objekt beschreiben. Wir nehmen einen Kreis und ein Rechteck:
Code: Alles auswählen
circle(d=10);
square([20, 30]);
Code: Alles auswählen
offset(r=1) circle(d=10);
offset(r=1) square([20, 30]);
Code: Alles auswählen
linear_extrude(height=0.01) offset(r=1) circle(d=10);
linear_extrude(height=0.01) offset(r=1) square([20, 30]);
Code: Alles auswählen
translate([0, 15, 40]) linear_extrude(height=0.01) offset(r=1) circle(d=10);
linear_extrude(height=0.01) offset(r=1) square([20, 30]);
Nun kann man beide Objekte mit dem "hull" Befehl verbinden: (Für schöne Rundungen wird die Variable $fn hochgesetzt.)
Code: Alles auswählen
$fn=64;
hull() {
translate([0, 15, 40]) linear_extrude(height=0.01) offset(r=1) circle(d=10);
linear_extrude(height=0.01) offset(r=1) square([20, 30]);
}
Wir wollten aber eine Röhre, und keinen Klotz. Es wird daher einfach das Selbe nochmal gemacht, aber ohne "offset" zu benutzen, und vom Objekt wieder abgezogen:
Code: Alles auswählen
$fn=64;
difference() {
hull() {
translate([0, 15, 40]) linear_extrude(height=0.01) offset(r=1) circle(d=10);
linear_extrude(height=0.01) offset(r=1) square([20, 30]);
}
hull() {
translate([0, 15, 40]) linear_extrude(height=0.01) circle(d=10);
linear_extrude(height=0.01) square([20, 30]);
}
}
Das ist alles. Natürlich würde man es bei einem größeren Modell etwas anders aufbauen, nämlich die sich wiederholenden Teile in eine Prozedur packen und den Offsetwert als Variable übergeben.
Wenn man dies nun sliced und im Viewer anschaut sieht man, dass die 1mm Wandstärke in allen Layern exakt eingehalten wurde. Bei 0.5mm Extrusionsbreite ergeben sich zwei Perimeter ohne Lücken oder Überlappungen.