Seite 1 von 1

Röhren mit openSCAD

Verfasst: Di 5. Jan 2016, 22:50
von RAU
Ich möchte eine einfache Konstruktionstechnik mit openSCAD vorstellen, mit der es möglich ist, gut druckbare dünnwandige Röhren zu gestalten. Die Form kann dabei beliebige Übergänge, z.B. von einem Kreisquerschnitt auf Rechteck, verwirklichen. Ich habe es so ähnlich zum ersten mal hier benutzt
http://www.rf1000.de/viewtopic.php?f=23 ... t=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]);
Mit "offset" wird die Größe entsprechend der Wandstärke gedehnt:

Code: Alles auswählen

offset(r=1) circle(d=10);
offset(r=1) square([20, 30]);
Nun wollen wir die Objekte in die dritte Dimension befördern, sonst können wir sie nicht im Raum plazieren und "hull" benutzen. Dazu extrudieren wir sie einfach um eine sehr kleine Höhe, die nach dem Slicen nicht mehr auffällt:

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]);
Nun plazieren wir sie im Raum. Ein Umriss bleibt hier am Boden, der andere wird - beliebig versetzt - darüber gelegt:

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]);
Das kommt dann dabei heraus:
offset_hull_1.JPG
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]);
}
Bild:
offset_hull_2.JPG
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]);
	}
}
Bilder (gerendert):
offset_hull_3.JPG
offset_hull_4.JPG
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.