OpenSCAD Benutzerhandbuch/Listenoperationen
List Comprehensions
[Bearbeiten]"List Comprehensions" sind eine elegante und kompakte Möglichkeit, neue Listen (Vektoren) in OpenSCAD zu erzeugen – basierend auf bestehenden Listen, Bereichen oder Bedingungen. Sie folgen einer klaren, mathematisch inspirierten Syntax und ermöglichen es dir, Schleifen, Filter und Transformationen in einer einzigen Zeile auszudrücken.
Die allgemeine Form lautet:
[ für jedes Element: Ausdruck ]
In OpenSCAD-Syntax:
[ for (variable = quelle) ausdruck ]
Du kannst sie auch mit Bedingungen kombinieren:
[ for (variable = quelle) if (bedingung) ausdruck ]
Und mehrere Quellen gleichzeitig nutzen:
[ for (a = liste1, b = liste2) ausdruck ]
---
Einfache Beispiele
[Bearbeiten]1. Alle Werte verdoppeln:
input = [1, 2, 3, 4];
output = [ for (x = input) x * 2 ];
echo(output); // ECHO: [2, 4, 6, 8]
2. Nur gerade Zahlen behalten:
input = [1, 2, 3, 4, 5, 6];
output = [ for (x = input) if (x % 2 == 0) x ];
echo(output); // ECHO: [2, 4, 6]
3. Koordinatenpaare erzeugen:
points = [ for (x = [0:2], y = [0:2]) [x, y] ];
echo(points);
// ECHO: [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]
---
Praktische Anwendungen
[Bearbeiten]Kreis aus Punkten:
n = 12;
radius = 20;
circle_points = [ for (i = [0:n-1])
[ radius * cos(360*i/n), radius * sin(360*i/n) ]
];
polygon(circle_points);
Gefilterte Objekte platzieren:
radii = [5, 8, 3, 12, 2];
// Nur Räder mit Radius ≥ 5 anzeigen
for (i = [0:len(radii)-1])
if (radii[i] >= 5)
translate([i*20, 0, 0]) cylinder(r = radii[i], h = 5);
Oder noch kürzer mit List Comprehension im "for":
valid_wheels = [ for (r = radii) if (r >= 5) r ];
for (i = [0:len(valid_wheels)-1])
translate([i*20, 0, 0]) cylinder(r = valid_wheels[i], h = 5);
---
Verschachtelte Strukturen
[Bearbeiten]Du kannst auch Vektoren von Vektoren erzeugen:
matrix = [ for (row = [1,2,3])
[ for (col = [10,20]) row * col ]
];
echo(matrix); // ECHO: [[10,20],[20,40],[30,60]]
---
Tipps
[Bearbeiten]- List Comprehensions erzeugen immer einen neuen Vektor – sie verändern den Originalvektor nicht.
- Die "if"-Bedingung filtert – wenn sie "false" ist, wird das Element übersprungen.
- Du kannst beliebige Ausdrücke verwenden: "x+1", "str(x)", "sin(x)", sogar "cube(x)" (wenn du Module aufrufst – aber Achtung: das erzeugt Geometrie!).
- Für komplexe Logik kannst du auch benutzerdefinierte Funktionen einbinden.
List Comprehensions machen deinen Code oft kürzer, klarer und schneller – besonders beim Generieren von Mustern, Gittern oder parametrischen Geometrien. Probier sie aus!