^
brixelweb.de OpenSCAD-Menu
[ https://openscad.org/ ]


for - Schleife(n)

Mit dem Befehl "for ..." gibt es einige Möglichkeiten eine Schleife zu gestalten.

Die wahrscheinlich Beste einer Schleife ist die, mit einer Variablen arbeiten zu können.


Im folgenden Beispiel wird jeder Wert in einem festgelegten Bereich oder Vektor ausgewertet.

for(variable = [anfang : schrittweite : ende])
 

Zu Beachten ist, dass die Werte durch Doppelpunkte und nicht durch Kommas getrennt werden.

Für die Bestimmung eines Bereiches können als Parameter eingegeben werden:

...[ anfang : schrittweite : ende ]

anfang benennt den Anfangswert
schrittweite ist der Betrag um den der Wert zu erhöhen ist. Dieser Wert ist optional und muss nicht angegeben werden. Er erhöht sich dann jeweils um den Wert 1.
ende benennt das Ende der Schleife, wenn der nächste Wert hinter "ende" liegen würde.


Geben wir folgendes ein und drücken F5 :

for (a =[2:6])echo(a);

ergibt in der Konsole:
ECHO: 2
ECHO: 3
ECHO: 4
ECHO: 5
ECHO: 6

Da die Schrittweite optional ist, wurde sie weggelassen. Sie beträgt dadurch automatisch immer "1".
Nun vertauschen wir versuchsweise die Werte :

for (a =[6:2])echo(a);

erscheint in der Konsole zwar die richtige Ausgabe, jedoch mit einer Fehlermeldung.
Der Anfangs-Wert sollte immer kleiner als der Ende-Wert sein!


Gehen wir jetzt zur Erstellung einiger Objekte und geben folgendes ein:

for (a =[2:6]) 
   translate([a,a,0])
   cube(a);

Nach dem Start erscheint dann:
Würfel mit Schleife 01 erstellt

Hier werden Würfel mit den Größen von 2 bis 6 erzeugt. Zusätzlich verschieben sich die Startpunkte zur Erstellung.

Die einzelnen Schritte sind:

Die 1.Schleife erzeugt den Wert a=2
Dies ergibt 1. translate([2,2,0]) und cube(2);
und legt fest: x=2 und y=2 und einen Würfel von 2 Kantenlänge

2. a=3 translate([3,3,0]) und cube(3);
3. a=4 translate([4,4,0]) und cube(4);
4. a=5 translate([5,5,0]) und cube(5);
5. a=6 translate([6,6,0]) und cube(6);

In allen fünf Schritten der Schleife wurde x, y und die Größe von "2" bis "6" jeweils um eins erhöht.


Starten wir mit einer zusätzlichen Eingabe der Schrittweite von "2"

for (a =[3:2:12]) 
 translate([a,a,0])
    color("silver")
    cube(a);

Nach dem Start erscheint dann:
Würfel mit Schleife 01 erstellt

Nun werden Würfel mit den Größen von 3 bis 12 mit einer Schrittweite von "2" erzeugt. Auch die Startpunkte zur Erstellung verschieben sich wieder.

Die einzelnen Schritte sind:

Die 1.Schleife erzeugt den Wert a=3
Dies ergibt:
1. a=3translate([3,3,0]) und cube(3);
und legt fest: x=3 und y=3 und einen Würfel von 3 Kantenlänge

2. a=5 translate([5,5,0]) und cube(5);
3. a=7 translate([7,7,0]) und cube(7);
4. a=9 translate([9,9,0]) und cube(9);
5. a=11 translate([11,11,0]) und cube(11);

Da der nächste Wert "a" = 13 entsprechen würde und somit größer als die ende-Vorgabe "12" ist, wird er nicht mehr ausgeführt und die Schleife dadurch beendet.


Bisher haben wir den Schritt-Wert innerhalb einer Schleife für die Werte X und Y verwendet. Die Schleifen können ebenso verschachtelt werden. Somit kann in einer Schleife der X-Wert und in der anderen Schleife der Y-wert erhöht werden.


Verschachtelte Schleife(n)

Über "a" und "b" sprechen wir jetzt die Werte von X und Y im Befehl "translate" an.

//  49 Lotto-Kugeln
$fn=50;

for (a =[0:5:30]) 
  
    for (b =[0:5:30]) 
      translate([a,b,0])
      sphere(2);

49 lottokugeln mit ein paar Zeilen erstellt


Die Innere Schleife (in blau) erzeugt beim ersten Durchlauf auf der Y-Achse 7 Kugeln.

//  49 Lotto-Kugeln
$fn=50;

for (a =[0:5:30]) 
  
    for (b =[0:5:30]) 
      translate([a,b,0])
      sphere(2);

Diese 7er Reihe wird durch die äußere Schleife (in rot) sieben mal wiederholt.

//  49 Lotto-Kugeln
$fn=50;

for (a =[0:5:30]) 
  
    for (b =[0:5:30]) 
      translate([a,b,0])
      sphere(2);

Beide Schleifen in diesem Beispiel laufen bis zum nächsten Semikolon (;). Da kein weiteres folgt, verwenden beide Schleifen das Gleiche!

Sollten jedoch mehrere Befehle mit Semikolon am Ende zusammen die Schleife durchlaufen, so können diese über zusätzlich geschweifte Klammern zusammen gefasst werden. Alles zwischen diesen geschweiften Klammen wird dann durch die for-Schleife wiederholt.


Wie wäre es mit einem neuen Zifferblatt für die alte Uhr?

// Zifferblatt
$fn=50;

for(z=[0:30:360]) 
    
  for(x=[5:3:20]) 
      
    rotate([0,0,z])
    translate([x,0,0])
    cylinder(h=2,r=1);

for(z=[0:30:360]) beschreibt mit Anfangswert = 0 und Endwert = 360 einen kompletten Kreis um die Z-Achse. Der Schritt-Wert "30" entspricht der 30°-Einteilung des Zifferblattes.

Ein tolles Zifferblatt


Verschachtelte Schleife(n) mit { }

Jetzt werden zwei verschiedene Objekte mit unterschiedlichen "translate"-Befehlen angesteuert.

Es sind demnach 2x ein Semikolon vorhanden. Leider klappt dies nicht ganz!
Daher werden die betreffenden Objekte mit den Befehlen über die geschweiften Klammern { } zusammengefasst. Und schon funktioniert es reibungslos!

//  49 x Nicht reinbeissen!
$fn=50;
color("saddlebrown")

for (a =[0:5:30]) 
  
    for (b =[0:5:30]) {
      translate([a,b,0])
      sphere(2);
      translate([a,b,-2])
      cylinder(h=2, r=2);
    }


Was aus den 49 Lotto-Kugeln geworden ist ...

49 Süssigkeiten mit ein paar Zeilen erstellt

Bitte nicht reinbeissen!

Nur mittels den zwei geschweiften Klammern { } ist dies möglich, mehrere Objekte zusammen zufassen.


Schleife(n) mit Text

Mit Variablen lässt es sich gut arbeiten. Wie sieht es aber mit Text aus?

Folgender Script gibt die Lösung:

// Schleifen mit Vektor
 auswahl = ["Blau", "Rot", "Gruen", "Gelb", "Teal"];
   for(farbe = auswahl)
     echo(str("Ich liebe Farben, wie ", farbe));

Nachdem der Script gestartet ist, erscheint in der Konsole die rechte Ausgabe:

Also auch Text gelten als Variable, allerdings anders "verpackt".

	
Compiling design (CSG Tree generation)...
ECHO: "Ich liebe Farben, wie Blau"
ECHO: "Ich liebe Farben, wie Rot"
ECHO: "Ich liebe Farben, wie Gruen"
ECHO: "Ich liebe Farben, wie Gelb"
ECHO: "Ich liebe Farben, wie Teal"
Compiling design (CSG Products generation)...
Geometries in cache: 14
Geometry cache size in bytes: 205072
CGAL Polyhedrons in cache: 0
CGAL cache size in bytes: 0
Compiling design (CSG Products normalization)...
Normalized tree has 1 elements!
Compile and preview finished.
Total rendering time: 0:00:00.058	


Drei Schleifen verschachtelt in Farbe!

In der Original-Anleitung von OpenSCAD fand ich dieses wunderschöne Beispiel. Etwas habe ich es jedoch noch abgeändert, damit es in allen sechs Richtungen funktioniert:

 color_vec = ["black","red","blue","green","purple","yellow"];
 for (x = [-20:10:20] )
 for (y = [0:5] )color(color_vec[y])
 for (z = [-10,1,10] )
     {translate([x,y*5-10,z])cube();}

Nun geht's ab in alle sechs Richtungen:

in alle sechs Richtungen!

Original unter wikibooks .... OpenSCAD zu finden


Auch in der verkürzten Schreibweise kommt es zum gleichen Ergebnis

// Verkuerzte Version
 color_vec = ["black","red","blue","green","purple","yellow"];
 for (x = [-20:10:20],
 y = [0:5],
 z = [-10,0,10] )
     translate([x,y*5-10,z]){color(color_vec[y])cube();}
	 

Nun geht's ab in alle sechs Richtungen:

in alle sechs Richtungen!

Original unter wikibooks .... OpenSCAD zu finden


Ebenso fand ich in der Original-Anleitung von OpenSCAD noch ein wunderbares Beispiel. Musste auch dieses noch etwas abändern ...

for(i = [ [  0,  0,  0],
          [ 10, 15, 10],
          [ 20, 30, 20],
          [ 30, 45, 30],
          [  0, 60, 40],
          [-20, 75, 50] ])
{
   translate(i)
   cube([50, 15, 10], center = true);
}

Über "cube" werden sechs gleichgroße Treppenstufen erzeugt, deren Ansatzpunkt durch die drei Koordinaten bestimmt werden.
Die erste Treppenstufen beginnt in [ 0,0,0 ]. Die zweite in [ 10, 15, 10], die dritte in [ 20, 30, 20] usw bis zur sechsten in [-20, 75, 50].

Alle drei Koordinatenwerte werden schrittweise über "i" an "translate" übergeben. Bitte die geschweiften Klammern beachten!


Treppenstufen ueber Vektoren

Original unter wikibooks .... OpenSCAD zu finden







www.brixelweb.de