Zum Inhalt springen

OpenSCAD Benutzerhandbuch/2D-Objekte

Aus Wikibooks

Alle 2D-Grundformen können mit 3D-Transformationen bearbeitet werden. Meistens werden sie als Basis für eine 3D-Extrusion genutzt. Obwohl sie eigentlich unendlich dünn sind, werden sie in der Vorschau mit einer Dicke von 1 Einheit dargestellt.

Hinweis: Wenn du versuchst, mit difference() etwas von einem 3D-Objekt abzuziehen, das aus einer 2D-Form stammt, kann das zu unerwarteten Ergebnissen beim Rendern führen.

square

[Bearbeiten]

Erzeugt ein Quadrat oder Rechteck im ersten Quadranten. Ist "center = true", wird das Quadrat am Ursprung zentriert. Die Parameternamen sind optional, wenn die Argumente in der hier gezeigten Reihenfolge übergeben werden.

square(size = [x, y], center = true/false);
square(size =  x    , center = true/false);
Parameter:
size
Einzelwert → Quadrat mit dieser Seitenlänge
2-Werte-Array "[x,y]" → Rechteck mit Breite x und Höhe y
center
false (Standard): Liegt im 1. Quadranten, eine Ecke bei (0,0)
true: Am Punkt (0,0) zentriert

Standardwert:

square();   // entspricht: square(size = [1, 1], center = false);
Beispiele:

10×10-Quadrat

Äquivalente Schreibweisen für dieses Beispiel:

square(size = 10);
square(10);
square([10,10]);

square(10,false);
square([10,10],false);
square([10,10],center=false);
square(size = [10, 10], center = false);
square(center = false,size = [10, 10]);

OpenSCAD-Rechteck 20×10

Äquivalente Schreibweisen für dieses Beispiel:

square([20,10],true);
a=[20,10];square(a,true);

circle

[Bearbeiten]

Erzeugt einen Kreis am Ursprung. Alle Parameter außer "r" müssen benannt werden.

circle(r=radius | d=durchmesser);
Parameter
r : Radius des Kreises. Nur bei "r" ist der Name optional.
Die Auflösung richtet sich nach der Größe und den Variablen "$fa" oder "$fs".
Für einen kleinen, hochauflösenden Kreis kannst du entweder einen großen Kreis erzeugen und ihn verkleinern – oder direkt "$fn" setzen.
Hinweis: Diese Beispiele übertreffen oft die Auflösung von 3D-Druckern und Bildschirmen!
scale([1/100, 1/100, 1/100]) circle(200); // Kreis mit Radius 2, hohe Auflösung
circle(2, $fn=50);                        // Alternative Methode
d : Durchmesser (nur in Versionen ab 2014.03 verfügbar)
$fa : Minimaler Winkel (in Grad) pro Segment
$fs : Minimale Bogenlänge pro Segment
$fn : Feste Anzahl der Segmente für 360°. Werte ≥ 3 überschreiben "$fa" und "$fs".
Werden diese verwendet, müssen sie als benannte Parameter übergeben. Mehr dazu hier.

Standardwert:

circle(); // entspricht: circle($fn = 0, $fa = 12, $fs = 2, r = 1);

Kreis für das Handbuch

Äquivalente Schreibweisen für dieses Beispiel:

circle(10);
circle(r=10);
circle(d=20);
circle(d=2+9*2);

Ellipsen

[Bearbeiten]

Eine Ellipse entsteht aus einem Kreis, indem du mit scale() oder resize() die x- und y-Ausdehnung unterschiedlich machst. Siehe OpenSCAD User Manual/Transformations.

Ellipse aus Kreis Ellipse – Draufsicht

Äquivalente Schreibweisen für dieses Beispiel:

resize([30,10]) circle(d=20);
scale([1.5,.5]) circle(d=20);

Regelmäßige Vielecke

[Bearbeiten]

Ein regelmäßiges Vieleck mit mindestens 3 Seiten lässt sich mit circle() erzeugen, indem du "$fn" auf die gewünschte Seitenzahl setzt. Folgende Codeschnipsel sind äquivalent:

circle(r=1, $fn=4);

module regular_polygon(order = 4, r=1){
    angles=[ for (i = [0:order-1]) i*(360/order) ];
    coords=[ for (th=angles) [r*cos(th), r*sin(th)] ];
    polygon(coords);
}
regular_polygon();

Beide erzeugen dieselbe Form: ein Vieleck, das im Kreis eingeschrieben ist – alle Seiten und Winkel gleich, eine Ecke zeigt in positive x-Richtung. Für unregelmäßige Formen verwende stattdessen das "polygon"-Primitiv.

Beispielskript:

translate([-42,  0]){circle(20,$fn=3);%circle(20,$fn=90);}
translate([  0,  0]) circle(20,$fn=4);
translate([ 42,  0]) circle(20,$fn=5);
translate([-42,-42]) circle(20,$fn=6);
translate([  0,-42]) circle(20,$fn=8);
translate([ 42,-42]) circle(20,$fn=12);

color("black"){
    translate([-42,  0,1])text("3",7,,center);
    translate([  0,  0,1])text("4",7,,center);
    translate([ 42,  0,1])text("5",7,,center);
    translate([-42,-42,1])text("6",7,,center);
    translate([  0,-42,1])text("8",7,,center);
    translate([ 42,-42,1])text("12",7,,center);
}

polygon

[Bearbeiten]

Erzeugt eine beliebige, mehrseitige Form aus einer Liste von x,y-Koordinaten. Das "polygon" ist das mächtigste 2D-Objekt: Es kann alles, was "circle" und "square" können – und noch viel mehr. Dazu gehören auch unregelmäßige Formen mit konkaven und konvexen Kanten sowie Löcher im Inneren.

polygon(points = [ [x, y], ... ], paths = [ [p1, p2, p3..], ...], convexity = N);
Parameter
points
Liste der x,y-Punkte des Polygons – ein Vektor aus 2-elementigen Vektoren.
Hinweis: Punkte werden von 0 bis n-1 durchnummeriert.
paths
Standardfall
Ohne Angabe werden alle Punkte in der angegebenen Reihenfolge verbunden.
Einzelner Vektor
Definiert die Reihenfolge der Punkte (per Index). Kann alle oder nur einige Punkte nutzen und in beliebiger Reihenfolge.
Mehrere Vektoren
Erzeugt eine Hauptform und Sekundärformen. Letztere werden von der Hauptform abgezogen (wie bei difference()). Sie können ganz oder teilweise innerhalb der Hauptform liegen.
Eine geschlossene Form entsteht automatisch durch Verbindung des letzten Punkts mit dem ersten.
convexity
Ganzzahl: Maximale Anzahl der „Einbuchtungen“, also wie oft eine beliebige Linie das Polygon durchqueren kann. Wichtig für die korrekte Darstellung in der Vorschau (siehe unten).

Standardwert:

polygon(); // entspricht: polygon(points = undef, paths = undef, convexity = 1);

Ohne Löcher

[Bearbeiten]

Äquivalente Schreibweisen für dieses Beispiel:

polygon(points=[[0,0],[100,0],[130,50],[30,50]]);
polygon([[0,0],[100,0],[130,50],[30,50]], paths=[[0,1,2,3]]);
polygon([[0,0],[100,0],[130,50],[30,50]], [[3,2,1,0]]);
polygon([[0,0],[100,0],[130,50],[30,50]], [[1,0,3,2]]);

a=[[0,0],[100,0],[130,50],[30,50]];
b=[[3,0,1,2]];
polygon(a);
polygon(a,b);
polygon(a,[[2,3,0,1,2]]);

Ein Loch

[Bearbeiten]

Äquivalente Schreibweisen für dieses Beispiel:

polygon(points=[[0,0],[100,0],[0,100],[10,10],[80,10],[10,80]], paths=[[0,1,2],[3,4,5]],convexity=10);

triangle_points =[[0,0],[100,0],[0,100],[10,10],[80,10],[10,80]];
triangle_paths =[[0,1,2],[3,4,5]];
polygon(triangle_points,triangle_paths,10);

Der erste Pfadvektor "[0,1,2]" wählt die Punkte "[0,0],[100,0],[0,100]" für die Hauptform. Der zweite Pfadvektor "[3,4,5]" wählt "[10,10],[80,10],[10,80]" für die Sekundärform. Da die Sekundärform vollständig innerhalb der Hauptform liegt, entsteht ein Objekt mit Loch – ähnlich wie bei difference().

Mehrere Löcher

[Bearbeiten]

Vorlage:Requires (wegen Verwendung von concat())

// Beispiel: Polygon mit mehreren Löchern
a0 = [[0,0],[100,0],[130,50],[30,50]];     // Hauptform
b0 = [1,0,3,2];
a1 = [[20,20],[40,20],[30,30]];            // Loch 1
b1 = [4,5,6];
a2 = [[50,20],[60,20],[40,30]];            // Loch 2
b2 = [7,8,9];
a3 = [[65,10],[80,10],[80,40],[65,40]];    // Loch 3
b3 = [10,11,12,13];
a4 = [[98,10],[115,40],[85,40],[85,10]];   // Loch 4
b4 = [14,15,16,17];
a  = concat(a0,a1,a2,a3,a4);
b  = [b0,b1,b2,b3,b4];
polygon(a,b);
// Alternativ:
polygon(a,[b0,b1,b2,b3,b4]);

3D-Form aus einem Polygon extrudieren

[Bearbeiten]
translate([0,-20,10]) {
    rotate([90,180,90]) {
        linear_extrude(50) {
            polygon(
                points = [
                   //x,y
                    /*
                               O  .
                    */
                    [-2.8,0],
                    /*
                             O__X  .
                    */
                    [-7.8,0],
                    /*
                           O
                            \
                             X__X  .
                    */
                    [-15.3633,10.30],
                    /*
                           X_______._____O
                            \         
                             X__X  .
                    */
                    [15.3633,10.30],
                    /*
                           X_______._______X
                            \             /
                             X__X  .     O
                    */
                    [7.8,0],
                    /*
                           X_______._______X
                            \             /
                             X__X  .  O__X
                    */
                    [2.8,0],
                    /*
                        X__________.__________X
                         \                   /
                          \              O  /
                           \            /  /
                            \          /  /
                             X__X  .  X__X
                    */
                    [5.48858,5.3],
                    /*
                        X__________.__________X
                         \                   /
                          \   O__________X  /
                           \            /  /
                            \          /  /
                             X__X  .  X__X
                    */
                    [-5.48858,5.3],
                                ]
                            );
                        }
        }
    }

convexity

[Bearbeiten]

Der "convexity"-Parameter gibt an, wie oft ein Strahl das Objekt maximal durchdringen kann. Dieser Wert ist nur für die korrekte Darstellung im OpenCSG-Vorschaumodus (F5) relevant – er beeinflusst das finale Rendering nicht.

Das Bild zeigt eine 2D-Form mit "convexity = 2": Der rote Strahl durchquert die Form maximal zweimal (von außen nach innen oder umgekehrt). Bei 3D-Objekten gilt das analog. In den meisten Fällen reicht ein Wert von 10 völlig aus.

import_dxf

[Bearbeiten]

en:OpenSCAD_User_Manual/The_OpenSCAD_Language#import import().}}

Liest eine DXF-Datei und erzeugt daraus eine 2D-Form.

Beispiel

linear_extrude(height = 5, center = true, convexity = 10)
    import_dxf(file = "example009.dxf", layer = "plate");