OpenSCAD Benutzerhandbuch/Spezialvariablen
Spezielle Variablen
[Bearbeiten]Spezielle Variablen bieten eine alternative Möglichkeit, Argumente an Module und Funktionen zu übergeben. Alle vom Benutzer oder von OpenSCAD definierten Variablen, die mit einem "$" beginnen, sind spezielle Variablen – ähnlich wie in Lisp. Module und Funktionen sehen alle außenliegenden Variablen, zusätzlich zu den übergebenen Argumenten oder intern definierten Werten.
Gültige Namen für spezielle Variablen bestehen nur aus "$" gefolgt von Buchstaben, Ziffern und Unterstrichen ("[a-zA-Z0-9_]"). Hoch-ASCII- oder Unicode-Zeichen sind nicht erlaubt.
Während reguläre Variablen zur Kompilierzeit zugewiesen werden und somit statisch sind, vererben spezielle Variablen ihren Wert aus dem Gültigkeitsbereich (Scope), aus dem das Modul oder die Funktion aufgerufen wird. Das bedeutet: Ihr Wert kann sich bei jedem Aufruf ändern!
regular = "regulär global";
$special = "speziell global";
module show() echo(" in show ", regular," ", $special );
echo (" außerhalb ", regular," ", $special );
// ECHO: " außerhalb ", "regulär global", " ", "speziell global"
for ( regular = [0:1] ) {
echo("in regulärer Schleife ", regular," ", $special );
show();
}
// ECHO: "in regulärer Schleife ", 0, " ", "speziell global"
// ECHO: " in show ", "regulär global", " ", "speziell global"
// ECHO: "in regulärer Schleife ", 1, " ", "speziell global"
// ECHO: " in show ", "regulär global", " ", "speziell global"
for ( $special = [5:6] ) {
echo("in spezieller Schleife ", regular," ", $special );
show();
}
// ECHO: "in spezieller Schleife ", "regulär global", " ", 5
// ECHO: " in show ", "regulär global", " ", 5
// ECHO: "in spezieller Schleife ", "regulär global", " ", 6
// ECHO: " in show ", "regulär global", " ", 6
show();
// ECHO: " in show ", "regulär global", " ", "speziell global"
Das ist besonders nützlich, wenn du mehrere Parameter durch mehrere Modulebenen hindurchreichen möchtest.
---
Kreisauflösung: $fa, $fs und $fn
[Bearbeiten]Diese drei speziellen Variablen steuern, wie viele Segmente zur Darstellung von Kreisen, Zylindern und Kugeln verwendet werden:
- "$fa": Minimaler Winkel pro Segment (Standard: 12° → max. 30 Segmente für einen Vollkreis).
- "$fs": Minimale Segmentlänge (Standard: 2 Einheiten).
- "$fn": Feste Anzahl der Segmente (Standard: 0 = deaktiviert).
Wenn "$fn > 0" ist, werden "$fa" und "$fs" ignoriert.
Empfehlungen:
- Für die Vorschau: "$fn ≤ 50"
- Für das finale Rendering: "$fn ≤ 128" (höhere Werte stark belastend!)
- Für achsenparallele Bounding Boxes: Wähle "$fn" durch 4 teilbar (z. B. 32, 64).
Beispiel für unterschiedliche Auflösung in Vorschau vs. Rendering:
$fn = $preview ? 32 : 64;
sphere(10);
OpenSCAD verwendet mindestens 5 Segmente, auch bei sehr kleinen Kreisen.
Die Anzahl der Segmente wird intern so berechnet:
// Nur zur Veranschaulichung – nicht zum Kopieren!
n = ($fn > 0) ?
($fn >= 3 ? $fn : 3) :
ceil(max(min(360/$fa, r*2*PI/$fs), 5));
- Bei Kugeln wird zuerst in „Breitenkreise“ geschnitten (Anzahl = Segmente des Äquators), dann jeder Ring segmentiert.
- Bei Zylindern gilt der größere Radius.
- Diese Variablen wirken nicht beim Import von STL-Dateien.
---
Animation: $t
[Bearbeiten]Die Variable "$t" läuft während einer Animation von 0 bis knapp 1 (genau: "0 ≤ $t < 1 - 1/Steps"). Sie wird genutzt, um glatte Bewegungen zu erzeugen.
So aktivierst du die Animation: Ansicht → Animieren → gib Werte für FPS und Steps ein.
Beispiele
[Bearbeiten]Einfache harmonische Schwingung:
translate([0, 0, 10*sin($t*360)]) sphere(2);
Rotation:
rotate([0, 0, $t*360]) square(5, center=true);
Gekoppelte Zahnräder (unterschiedliche Geschwindigkeit):
rotate([0, 0, $t*360/17]) gear(teeth=17);
rotate([0, 0, -$t*360/31]) gear(teeth=31);
Kreisbahn (ohne Eigenrotation):
rotate([0, 0, $t*360])
translate([9, 0])
rotate([0, 0, -$t*360])
square(5, center=true);
Elliptische Bahn:
translate([10*sin($t*360), 20*cos($t*360)])
square(2, center=true);
Bilder exportieren: Aktiviere „Dump Pictures“, um PNGs zu generieren. Mit ImageMagick kannst du daraus ein GIF erstellen: """bash magick -delay 10 -loop 0 *.png myimage.gif """
---
Viewport-Variablen: $vpr, $vpt, $vpf, $vpd
[Bearbeiten]Diese Variablen enthalten die aktuelle Kameraposition – aber nur beim Rendern (nicht beim bloßen Bewegen der Maus!).
- "$vpr": Rotationswinkel "[x, y, z]"
- "$vpt": Translationsvektor (Kameraposition)
- "$vpf": Sichtfeld (Field of View, ab 2021.01)
- "$vpd": Kameraabstand (ab 2015.03)
Beispiel: Ein Würfel, der sich mit der Blickrichtung verändert:
cube([10, 10, $vpr[0] / 10]);
Du kannst den Viewport auch steuern (nur auf oberster Ebene wirksam):
$vpr = [0, 0, $t * 360]; // Automatische Drehung in Animation
Hinweis: Der Menübefehl „Edit → Paste Viewport Rotation/Translation“ kopiert die aktuelle Ansicht – nicht den Wert von "$vpr"/"$vpt".
---
Ausführungsmodus: $preview
[Bearbeiten]Vorlage:Requires Vorlage:Anchor
- "$preview = true" → im Vorschaumodus (F5, OpenCSG)
- "$preview = false" → beim Rendern (F6, CGAL)
Praktische Nutzung: Unterschiedliche Detailstufen:
$fn = $preview ? 12 : 72;
sphere(r = 1);
Beim Kommandozeilenaufruf ist "$preview" nur true, wenn ein PNG mit OpenCSG erzeugt wird (nicht bei STL/DXF/SVG).
---
Echo-Modul
[Bearbeiten]"echo()" gibt Inhalte in die Konsole aus – ideal zum Debuggen.
- Zahlen werden auf 5 signifikante Stellen gerundet.
- Du kannst benannte Ausgaben machen: "echo(a=a, b=b)".
Beispiel:
my_h=50; my_r=100;
echo("Zylinder mit h=", my_h, " und r=", my_r);
echo(my_h=my_h, my_r=my_r); // → ECHO: my_h = 50, my_r = 100
Achtung: Obwohl "1.0" und "1.000002" beide als "1" ausgegeben werden, sind sie intern verschieden!
Große/kleine Zahlen werden wissenschaftlich dargestellt:
echo(1000002); // → 1e+06
echo(0.000002); // → 2e-06
---
Echo-Funktion
[Bearbeiten]Seit 2019.05 kann "echo()" auch innerhalb von Ausdrücken verwendet werden – besonders nützlich bei rekursiven Funktionen:
a = 3; b = 5;
r1 = echo(a, b) a * b; // Gibt zuerst a,b aus, dann berechnet a*b
// Rekursion debuggen:
v = [4, 7, 9, 12];
function result(x) = echo(result = x) x;
function sum(x, i = 0) =
echo(str("x[", i, "]=", x[i]))
result(len(x) > i ? x[i] + sum(x, i + 1) : 0);
echo("sum(v) = ", sum(v));
---
render
[Bearbeiten]Erzwingt die Erzeugung eines echten Netzes – auch in der Vorschau. Nützlich bei komplexen booleschen Operationen, die sonst flimmern oder fehlerhaft dargestellt werden.
Beispiel:
render(convexity = 2)
difference() {
cube([20, 20, 150], center = true);
translate([-10, -10, 0]) cylinder(h = 80, r = 10, center = true);
}
---
surface
[Bearbeiten]Liest Höhenkarten aus Text- oder Bilddateien.
Parameter:
- "file": Pfad zur Datei
- "center": Zentrierung (Standard: "false")
- "invert": Invertiert Grauwerte (nur bei Bildern, ab 2015.03)
- "convexity": Wie bei "render()"
Textformat
[Bearbeiten]Matrix aus Zahlen, getrennt durch Leerzeichen/Tabs. Zeilen = Y, Spalten = X. Kommentare mit "#" möglich.
Bilder
[Bearbeiten]Nur PNG (ab 2015.03). Farben werden in Graustufen umgewandelt (sRGB-Luminanz). Werte werden auf 0–100 skaliert. Automatisch wird eine 1-Einheit-dicke „Fußsohle“ hinzugefügt.
Beispiele:
- Textdatei → Wellenform
- PNG-Bild → 3D-Relief (z. B. Smiley-Gesicht)
---
search
[Bearbeiten]Sucht Werte in Listen, Zeichenketten oder verschachtelten Strukturen.
Syntax:
search(match_value, string_or_vector, num_returns_per_match=1, index_col_num=0)
Wichtige Fälle:
- "search("a", "abcd")" → "[0]"
- "search("a", data, 0)" → alle Treffer ("0,4")
- "search(3, data, 0, 1)" → suche in Spalte 1 statt 0
Tipp: Um nach einem ganzen String zu suchen, packe ihn in eine Liste: "search(["abc"], ...)".
---
OpenSCAD-Version
[Bearbeiten]- "version()" → "[2021, 1, 0]"
- "version_num()" → "20210100"
---
parent_module(n) und $parent_modules
[Bearbeiten]- "$parent_modules": Anzahl der Module im Aufrufstapel
- "parent_module(i)": Name des Moduls "i" Ebenen darüber
Beispiel:
top() middle() echo(parent_module(0)); // → "middle"
top() middle() echo(parent_module(1)); // → "top"
Ideal für Stücklisten (BOM).
---
assert
[Bearbeiten]Prüft eine Bedingung – bei "false" bricht OpenSCAD mit Fehlermeldung ab.
Syntax:
assert(bedingung);
assert(bedingung, "Fehlermeldung");
Beispiele:
- Parameter prüfen: "assert(cnt > 0, "Anzahl muss positiv sein!")"
- In Funktionen nutzbar – gibt den letzten Ausdruck zurück:
function f(a,b) =
assert(a>0) assert(b>0)
a*b;