8. Werte berechnen und speichern

Was sind Platzhalter oder Variablen?Das Wort „Variable“ klingt nach „variieren“.Aber bestimmt haben alle schon einmal folgende Gleichung gesehen:

a+b=c oder c=a+b

a, b und c sind Platzhalter für Werte. Oft steht da auch:

5+12=c

Welchen Wert hat c?

In diesem Kapitel geht es um solche Platzhalter (Konstanten) und Variablen. OpenSCAD (Version 2021.01) kennt nur Platzhalter und keine Variablen, denn eine Variable kann man jederzeit verändern. OpenSCAD lässt das „Überschreiben“ von Platzhaltern jedoch nicht zu. Es wäre sehr schön, wenn veränderbare Platzhalter möglich wären.

Darum muss in dieser Version des Programms von Konstanten gesprochen werden. Platzhalter werden einmal definiert und bleiben dann während des gesamten „Runs“ gleich.

8.1 Zahlenwerte speichern und nutzen

Als erstes Beispiel können wir das Würfel-Beispiel vom Kapitel 1 nehmen.

translate([-10,0,0])
  cube(5);
translate([-10,10,0])
  cube(5);
translate([-10,20,0])
  cube(5);
translate([0,0,0])
  cube(5);
translate([0,10,0])
  cube(5);
translate([0,20,0])
  cube(5);
translate([10,0,0])
  cube(5);
translate([10,10,0])
  cube(5);
translate([10,20,0])
  cube(5);

Die cube()-Objekte sind alle 5 mm groß, und die Abstände zwischen den cube()-Objekten betragen ebenfalls 5 mm.

druckansicht

Wenn wir aber verschiedene Grössen und Abstände testen wollen, müssen wir alle Werte überschreiben und nochmals überschreiben. Wäre es nicht einfacher einen Wert a=5; zu definieren und den Platzhalter a im Code zu nutzen?

a=5;

translate([-10,0,0])
  cube(a);
translate([-10,10,0])
  cube(a);
translate([-10,20,0])
  cube(a);
translate([0,0,0])
  cube(a);
translate([0,10,0])
  cube(a);
translate([0,20,0])
  cube(a);
translate([10,0,0])
  cube(a);
translate([10,10,0])
  cube(a);
translate([10,20,0])
  cube(a);

Das Resultat sieht genau gleich aus!

druckansicht

Nun können wir a = 5; durch a = 7; ersetzen, die Vorschau (F5) neu berechnen lassen und …

druckansicht

Wir mussten den Wert nur an einer Stelle verändern und haben damit gleich alle cube()-Objekte angepasst.

Die Abstände sind jedoch noch statisch und bleiben unverändert. Wird a = 10; gesetzt, ist das Resultat nur noch eine Fläche.

druckansicht

Es muss ein zweiter Platzhalter her! Wenn wir den Code ansehen, gibt es jedoch verschiedene translate()-Werte wie 10 oder 20. Wir brauchen also nicht nur Platzhalter, sondern müssen mit diesen auch rechnen.

Weiter unten werden wir die wichtigsten Rechenoperationen genauer anschauen. Hier betrachten wir zunächst nur die Operation Addition (sowie Subtraktion).

Damit wir die Abstände unabhängig von der cube()-Größe verändern können, erstellen wir einen zweiten Platzhalter mit dem Namen b.

a=5;
b=10;

translate([-b,0,0])
  cube(a);
translate([-b,b,0])
  cube(a);
translate([-b,b+b,0])
  cube(a);
translate([0,0,0])
  cube(a);
translate([0,b,0])
  cube(a);
translate([0,b+b,0])
  cube(a);
translate([b,0,0])
  cube(a);
translate([b,b,0])
  cube(a);
translate([b,b+b,0])
  cube(a);

Dort, wo die Verschiebung 20 mm betrug, schreiben wir b + b, um den Wert von 20 mm zu erreichen. Nun ist das Resultat wieder wie zu Beginn.

druckansicht

An diesem Beispiel sehen wir, wie mit Platzhaltern (ab hier werde ich nur noch von Konstanten sprechen) ein sehr flexibler Code erstellt werden kann.

8.2 Beispiel mit der Schale

Für dieses Beispiel nehmen wir die eckige Schale aus Übung 3.4. Diese Schale hat eine feste Breite und Länge von 20 mm, eine Höhe von 5 mm, einen Rand von 2 mm (20 − 16 geteilt durch 2 = 2) und eine Bodendicke von 2 mm.

Alle diese festen Werte (Länge, Breite, Höhe, Rand und Bodendicke) sollen als Konstanten vordefiniert werden.

Wichtig: Alle Platzhaltenamen dürfen keine Umlaute (äöü oder èàé) oder Sonderzeichen (!£?..) enthalten. Diese Zeichen können von OpenSCAD nicht gelesen werden. Es wird eine Fehlermeldung erscheinen.

Nennen wir die Konstanten darum lang, breit, hoch, wand und boden.

lang=20;
breit=20;
hoch=5;
wand=2;
boden=2;

Die Konstanten werden am Anfang des Codes definiert und können nun im gesamten Code verwendet werden. Wie sah der Code in Übung 3.4 aus?

difference(){
  color("green")
    cube([20,20,5]); // Bodenplatte
  
  color("red")
    translate([2,2,2])
    cube([16,16,3.1]); // Vertiefung
}

Überlegt, wie die Konstanten eingesetzt werden müssen. Im Anhang ist der entsprechende Code hinterlegt.

Wenn nun die Werte wie folgt gesetzt werden …

lang=20;
breit=10;
hoch=3;
wand=1;
boden=2;

... sieht das Bespiel so aus.

druckansicht

Ändern wir die Werte für die Länge und die Wandstärke …

lang=30;
breit=10;
hoch=3;
wand=0.5;
boden=2;

... ergibt es die Schale wie gewünscht.

druckansicht

8.3 weitere Rechenoperationen

Wenn wir unter „Hilfe“ → „Befehlsübersicht“ nachschauen, finden wir weitere Rechenoperationen und Funktionen:

n + m Addition
n - m Subtraction
n * m Multiplication
n / m Division
n ^ m Quadrat
sqrt() Quadratwurzelfunktion

Die Operation 4^2 berechnet das Quadrat von 4, also 4 × 4. Das Ergebnis ist somit 16.

Die Operation 4^3 berechnet 4 × 4 × 4. Das Ergebnis ist somit 64.

quadrat=4^2;
a=sqrt(quadrat);

Im Beispiel hat quadrat den Wert 16. Die Funktion sqrt(16) gibt die Wurzel dieses Wertes zurück, also wieder 4.

Wo braucht man solche Berechnungen? Zum Beispiel beim Berechnen von rechtwinkligen Dreiecken.

Wikipedia:
Der Satz des Pythagoras ist einer der fundamentalen Sätze der euklidischen Geometrie. Er besagt, dass in allen ebenen rechtwinkligen Dreiecken die Summe der Flächeninhalte der Kathetenquadrate gleich dem Flächeninhalt des Hypotenusenquadrates ist.

Worum geht es bei diesem Satz?

Wikipedia:
Er besagt, dass in allen ebenen rechtwinkligen Dreiecken die Summe der Flächeninhalte der Kathetenquadrate gleich dem Flächeninhalt des Hypotenusenquadrates ist.

druckansichtdruckansicht

Die OpenSCAD-Formel mit den Funktionen sqrt und ^ würde für die mittlere Formel wie folgt aussehen:

a=3;
b=4;
c=sqrt( (a^2) + (b^2) );
echo(c);

Das Ergebnis c wäre bei diesen Werten 5. Im Beispiel sehen wir auch die Funktion echo(). Damit wird im Konsolenfenster der Wert echo(c) angezeigt: ECHO: 5.

druckansicht

Ausgeschrieben ergibt sich: (3 × 3 = 9) + (4 × 4 = 16) = 25, und die Wurzel aus 25 ist dann 5, denn 5 × 5 ergibt 25.

Das Code-Beispiel könnte auch vereinfacht geschrieben werden:

a=3;
b=4;
c=sqrt(a^2 + b^2);

Es braucht keine Klammern um a^2 und b^2, denn Punktrechnung kommt vor Strichrechnung. Allerdings helfen Klammern, die Formel klarer zu strukturieren.

Woher kommt der Name Pythagoras?

Wikipedia:
In der Spätantike und im Mittelalter war die Überzeugung allgemein verbreitet, Pythagoras sei der Begründer der Mathematik gewesen.
Pythagoras von Samos (um 570 v. Chr. auf Samos) war ein antiker griechischer Philosoph, Mathematiker und Gründer einer einflussreichen religiös-philosophischen Bewegung.

8.4 weitere Speichertypen

Bis hierhin haben wir nur mit Zahlen gearbeitet. Es können aber auch Texte gespeichert werden.

farbe="#807060";
farbe_als_texte="blue";

color(farbe)
color(farbe_als_texte)

Die Konstante farbe = "#807060"; ist keine echte Farbe, sondern nur der Text, der dann bei color(farbe); verwendet wird. Im Kapitel 2.3.1 haben wir Beispiele mit Farben durchgespielt.

Auch das Beispiel in 2.3.2 mit [r, g, b, a] kann mit Konstanten umgesetzt werden.

farbe3=[95,158,160]/255;
color(farbe3)

Erstaunlich was da in der Konstante farbe3 steht.

druckansicht

8.5 Boolean

Wikipedia:
Ein Boolean, benannt nach George Boole, ist ein Element einer booleschen Algebra. Eine Sonderform mit nur zwei Zuständen ist in der Digitaltechnik die Schaltvariable (englisch switching variable) bzw. bei der Programmierung der boolesche Datentyp zur Darstellung der logischen Wahrheitswerte wahr und falsch.

„Falsch“ und „Wahr“ werden mit false und true übersetzt. Wir werden später den Nutzen dieser Konstanten noch kennenlernen.

mache_was=true;

oder

mache_was=false;

Konstanten oder Platzhalter müssen in einem Wort geschrieben werden; Leerstellen sind nicht erlaubt. Darum wurde im Beispiel ein Unterstrich _ für die Leerstelle verwendet. So ist mache_was nur ein Wort.

Das zweite mache_was = false; wird bei einer Abfrage nichts ausführen.