Begriffe vorab
- for: Erzeugt für jeden Wert eines Bereichs oder Vektors einen Zweig im Objektbaum.
- intersection_for: Wie for, aber mit Schnittmenge statt Vereinigung.
- if / else: Bedingte Ausführung eines Blocks.
- Ternärer Operator: Ausdruck der Form bedingung ? a : b.
- let: Legt Variablen für einen Teilbaum oder Ausdruck fest.
for() baut einen Baum
Die Doku betont: OpenSCAD ist keine iterative Sprache. for() schleift nicht im programmiersprachlichen Sinn, sondern erzeugt einen Baum von Objekten, einen Zweig pro Wert. Jeder Durchlauf hat seinen eigenen Scope; Variablen lassen sich über Durchläufe hinweg nicht verändern.
Formen
- Bereich:
for (a = [3 : 0.5 : 5])liefert 3, 3.5, 4, 4.5, 5 (Standardschritt 1). - Vektor:
for (a = [3, 4, 1, 5])geht jedes Element durch. - Verschachtelt in Kurzform:
for (x = r1, y = r2, z = r3).
Die Variante für Objekte (for (v = object)) nennt die Doku nur für Entwicklungs-Snapshots.
intersection_for()
Arbeitet wie for(), bildet aber die Schnittmenge aller Durchläufe statt der Vereinigung.
if / else
if (test) a oder if (test) a else b, auch verkettet mit else if. Die erste wahre Bedingung gewinnt, weitere Tests entfallen. Variablen, die du innerhalb eines Blocks zuweist, gelten nur in diesem Scope.
Ternärer Operator
wert = test ? wahr : falsch; liefert einen Wert und eignet sich für Funktionen und Rekursion.
let()
let setzt Variablen nacheinander innerhalb eines Teilbaums – spätere dürfen auf frühere zugreifen. Es ersetzt das veraltete assign().
echo() und assert()
echo() schreibt in die Console und rundet auf fünf signifikante Stellen. assert(bedingung, meldung) prüft Annahmen und stoppt bei Verletzung.
// Zahnrad-artiger Kranz aus Zylindern per for und let
for (i = [0 : 11])
let (winkel = i * 30, abstand = 20)
rotate([0, 0, winkel])
translate([abstand, 0, 0])
if (i % 2 == 0)
cylinder(h = 6, r = 3, $fn = 24);
else
cylinder(h = 4, r = 2, $fn = 24);
// Zwei Schleifenvariablen: Raster aus Säulen
translate([50, 0, 0])
for (x = [0 : 3], y = [0 : 2])
translate([x * 8, y * 8, 0]) cube([5, 5, 2 + x + y]);
// Schnitt über intersection_for
translate([100, 0, 0])
intersection_for (a = [0, 60, 120])
rotate([0, 0, a]) cube([20, 8, 8], center = true);
Im ersten Beispiel entscheidet i % 2, ob ein hoher oder niedriger Zylinder entsteht. Im zweiten erzeugt eine Schleife mit zwei Variablen ein 4 × 3-Raster. Das dritte bildet den Durchschnitt dreier gedrehter Balken.
Wenn du „Zähler hochsetzen“ denkst, brauchst du in OpenSCAD stattdessen eine Formel in Abhängigkeit vom Schleifenwert.
Zum Selbermachen
- Baue eine Wendeltreppe: für jede Stufe i drehst du um i·15° und hebst um i·3.
- Nutze assert, um zu prüfen, dass eine Wandstärke positiv ist.
Verwandte Themen
OpenSCAD → Die übrigen Lektionen dieser Themenwelt; Informatik: Grundlagen → „Algorithmen und Berechenbarkeit“ für das Denken in Schritten.
Prüfstatus: Belegt (Stand 1. Oktober 2026): Die drei for-Formen, die Aussage „keine iterative Sprache“, intersection_for, if/else, den ternären Operator, let (ersetzt assign), echo-Rundung auf fünf signifikante Stellen und assert wurden gegen die Seiten „Conditional and Iterator Functions“ und „Other Language Features“ geprüft. Alle Codebeispiele dieser Lektion wurden mit OpenSCAD 2026.09.18 (lokale Installation) ausgeführt und liefen ohne Fehler und Warnungen. Nicht einzeln belegt: die Erklärungen in eigenen Worten, die Beispiele als solche (konstruiert) und die Wertungen.
Quellen
- OpenSCAD User Manual – Conditional and Iterator Functions (en.wikibooks.org/wiki/OpenSCAD_User_Manual/Conditional_and_Iterator_Functions)
- OpenSCAD User Manual – Other Language Features (en.wikibooks.org/wiki/OpenSCAD_User_Manual/Other_Language_Features)
- OpenSCAD Cheat Sheet (openscad.org/cheatsheet, bezieht sich auf Version 2021.01)