OpenSCAD User Manual/条件と繰り返し
for ループ
[編集]配列要素の値または範囲に基づいて繰り返し実行する。
配列要素の値: for (変数=<配列>) <実行されるもの> - <変数> には配列の値が次々に代入される
範囲: for (変数=<範囲>) <実行されるもの>
範囲: [<初期値>:<終値>] - 初期値から終値まで繰り返す。<終値> は <初期値> より小さくてもよい。
範囲: [<初期値>:<増分>:<終値>] - 初期値から終値まで増分だけ増やして繰り返す。増分は非整数でもよい。
注意: 増分は正の絶対値である必要がある。もし <終値> が <初期値> より小さくとも、増分は絶対値でなくてはならない。
警告: 増分で (<end>-<start>) が割り切れない場合、繰り返しの実際の終値は <end>-(<end>-<start> mod <increment>) となる
(訳注: 範囲を超えることはない。初期値1、終値6、差分2の場合、1、3、5が代入される)。
ループのネスト :
for (変数1 = <範囲または配列>, 変数2 = <範囲または配列> ) <両方の変数を変化させて実行されるもの>
for ループは通常のプログラム同様、ネストできる。ひとつのfor文で両方の繰り返しを実行できる。
例1 - 配列要素に基づく繰り返し: | |
for (z = [-1, 1]) // z = -1, z = 1 の2つの繰り返し
{
translate([0, 0, z])
cube(size = 1, center = false);
}
|
例2a - 範囲の繰り返し: | |
for ( i = [0 : 5] )
{
rotate( i * 360 / 6, [1, 0, 0])
translate([0, 10, 0])
sphere(r = 1);
}
|
例2b - 増分を指定した範囲の繰り返し: |
// 注: 2番めの引数 (この場合 '0.2' ) が増分
// 注: 増分によっては、実際の終値は与えられた終値
// より小さい場合がある。
for ( i = [0 : 0.2 : 5] )
{
rotate( i * 360 / 6, [1, 0, 0])
translate([0, 10, 0])
sphere(r = 1);
}
|
例3 - 2次元配列による繰り返し (回転): | |
for(i = [ [ 0, 0, 0],
[ 10, 20, 300],
[200, 40, 57],
[ 20, 88, 57] ])
{
rotate(i)
cube([100, 20, 20], center = true);
}
|
例4 - 2次元配列による繰り返し (移動): | |
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 = [0,2,6]) // 3要素の配列を範囲によって4回繰り返す
translate([xpos, ypos, 0]) cube([0.5, 0.5, 0.5]);
forループの交わり (intersection)
[編集]配列または範囲による繰り返しを実行し、描いたものの交わり (intersection) をとる。
注: intersection_for()
は、通常のfor()
文と intersection()
文を用いた結果と同じにならない問題があり、対処中である。
パラメータ
- <ループ変数名>
- for ループ内で用いられる変数名。
例1 - 範囲の繰り返し: | |
intersection_for(n = [1 : 6])
{
rotate([0, 0, n * 60])
{
translate([5,0,0])
sphere(r=12);
}
}
|
例2 - 回転: | |
intersection_for(i = [ [ 0, 0, 0],
[ 10, 20, 300],
[200, 40, 57],
[ 20, 88, 57] ])
{
rotate(i)
cube([100, 20, 20], center = true);
}
|
If 文
[編集]サブツリー内を条件によって評価する。
引数
- 条件となるべきbooleanの式。
例:
if (x > y)
{
cube(size = 1, center = false);
} else {
cube(size = 2, center = true);
}
Assign 文
[編集]変数にサブツリー内での新しい値を代入する。
引数
- (再)代入される変数。
例:
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);
}
}
Update:
このバージョンから値の代入は好きなところでできるため、assign() は必要ない (assign() は後方互換性のために残されている)。