OpenSCAD User Manual/Conditional and Iterator Functions
For Loop
Iterate over the values in a vector or range.
Vector version: for (variable=<vector>) <do_something> - <variable> is assigned to each successive value in the vector
Range version: for (variable=<range>) <do_something>
Range: [<start>:<end>] - iterate from start to end inclusive. Also works if if <end> is smaller than <start>
Range: [<start>:<increment>:<end>] - iterate from start to end with the given increment. The increment can be a fraction. Note: The increment is given as an absolute value and cannot be negative. If <end> is smaller than <start> the increment should remain unchanged. Warning: If the increment is not an even divider of <end>-<start>, the iterator value for the last iteration will be <end>-(<end>-<start> mod <increment>).
Nested loops : for ( variable1 = <range or vector>, variable2 = <range or vector> ) <do something, using both variables>
for loops can be nested, just as in normal programs. A shorthand is that both iterations can be given in the same for statement
| Usage example 1 - iteration over a vector: | |
for (z = [-1, 1]) // two iterations, z = -1, z = 1 { translate([0, 0, z]) cube(size = 1, center = false); } |
| Usage example 2a - iteration over a range: | |
for ( i = [0 : 5] ) { rotate( i * 360 / 6, [1, 0, 0]) translate([0, 10, 0]) sphere(r = 1); } |
| Usage example 2b - iteration over a range specifying an increment: |
// Note: The middle parameter in the range designation // ('0.2' in this case) is the 'increment-by' value // Warning: Depending on the 'increment-by' value, the // real end value will be smaller than the given one. for ( i = [0 : 0.2 : 5] ) { rotate( i * 360 / 6, [1, 0, 0]) translate([0, 10, 0]) sphere(r = 1); } |
| Usage example 3 - iteration over a vector of vectors (rotation): | |
for(i = [ [ 0, 0, 0], [ 10, 20, 300], [200, 40, 57], [ 20, 88, 57] ]) { rotate(i) cube([100, 20, 20], center = true); } |
| Usage example 4 - iteration over a vector of vectors (translation): | |
for(i = [ [ 0, 0, 0], [10, 12, 10], [20, 24, 20], [30, 36, 30], [20, 48, 40], [10, 60, 50] ]) { translate(i) cube([50, 15, 10], center = true); } |
Nested loop example
for (xpos=[0:3], ypos = [2,4,6]) // do twelve iterations, using each xpos with each ypos translate([xpos*ypos, ypos, 0]) cube([0.5, 0.5, 0.5]);
Intersection For Loop
Iterate over the values in a vector or range and take an intersection of the contents.
Note: intersection_for() is a work around because of an issue that you cannot get the expected results using a combination of the standard for() and intersection() statements.
Parameters
- <loop variable name>
- Name of the variable to use within the for loop.
| Usage example 1 - loop over a range: | |
intersection_for(n = [1 : 6]) { rotate([0, 0, n * 60]) { translate([5,0,0]) sphere(r=12); } } |
| Usage example 2 - rotation : | |
intersection_for(i = [ [ 0, 0, 0], [ 10, 20, 300], [200, 40, 57], [ 20, 88, 57] ]) { rotate(i) cube([100, 20, 20], center = true); } |
If Statement
Conditionally evaluate a sub-tree.
Parameters
- The boolean expression that should be used as condition
NOTE:
Do not confuse the assignment operator '=' with the equal operator '=='
if (a=b) dosomething(); // will fail to be processed without any error message
Usage example:
if (x > y) { cube(size = 1, center = false); } else { cube(size = 2, center = true); }
Assign Statement
Set variables to a new value for a sub-tree.
Parameters
- The variables that should be (re-)assigned
Usage example:
for (i = [10:50]) { assign (angle = i*360/20, distance = i*10, r = i*2) { rotate(angle, [1, 0, 0]) translate([0, distance, 0]) sphere(r = r); } }