OpenSCAD User Manual/条件と繰り返し

出典: フリー教科書『ウィキブックス(Wikibooks)』


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);
}
OpenSCAD iteration over a vector
例2a - 範囲の繰り返し:
for ( i = [0 : 5] )
{
    rotate( i * 360 / 6, [1, 0, 0])
    translate([0, 10, 0])
    sphere(r = 1);
}
OpenSCAD iteration over a range)
例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);
}
OpenSCAD for loop (rotation)
例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);
}
OpenSCAD for loop (translation)

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);
    }
}
OpenSCAD Intersection for
例2 - 回転:
 intersection_for(i = [ [  0,  0,   0],
 			[ 10, 20, 300],
 			[200, 40,  57],
 			[ 20, 88,  57] ])
{
    rotate(i)
    cube([100, 20, 20], center = true);
}
OpenSCAD Intersection for (rotation)

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() は後方互換性のために残されている)。