Руководство пользователя по OpenSCAD/Итераторы и условные функции

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

Цикл For[править]


Повторяет значения заданного диапазона или вектора, применяя их в теле цикла..

 for(variable = [start : increment : end])
 for(variable = [start : end])
 for(variable = [vector])

Параметры

Диапазон [ start : <increment : > end ]
Для диапазона параметры отделяются двоеточием, в векторе запятыми.
start - начальное значение
increment or step - шаг циклы, опциональный, по умолчанию = 1
end - конечное значение цикла
Вектор
Действие вычисляется для каждого значения вектора
Пример:
 for (a =[3:5])echo(a);     // 3 4 5
 for (a =[3:0.5:5])echo(a); // 3 3.5 4 4.5 5
 for (a =[0:2:5])echo(a);   // 0 2 4           a не достигнет конечного значение,  поскольку шаг 2
 for (a =[3:-2:-1])echo(a); // 3 1 -1          цикл может идти и в отрицательную сторону если end < start
 for (a =[3,4,1,5])echo(a); // 3 4 1 5
 for (a =[0.3,PI,1,99]){echo(a);}    // 0.3 3.14159 1 99
 x1=2; x2=8; x3=5.5;
 for (a =[x1,x2,x3]){echo(a);} // 2 8 5.5 
 for (a =[[1,2],6,"s",[[3,4],[5,6]]])echo(a);  // [1,2] 6 "s" [[3,4],[5,6]]

for() это оператор. Оператору необходимо проставлять фигурные скобки {} если у него больше одного действия внутри него. Действия заканчиваются точкой с запятой(;), операторам не нужны точки с запятой для окончания.

for() is не исключение для правила о переменных, имеющих только одно значение в пределах области значений. Для каждого прохода цикла создаётся своя копия тела цикла. Каждая копия имеет свою область значений, что позволяет любым переменным иметь уникальные значения в этой области. Нет, вы по-прежнему не можете выполнить a=a+1;

Помните, что это не итеративный язык, for() не цикл в программном смысле, он строит дерево объектов одной ветви для каждого элемента в диапазоне или векторе, внутри каждой ветви 'переменная' является специфической и отдельной инстанцией.

Следовательно:

for (i=[0:3])
   translate([i*10,0,0])
     cube(i+1);

Производит: [See Design/Display-CSG-Tree menu]

 group() {
       group() {
               multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
                       cube(size = [1, 1, 1], center = false);
               }
               multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
                       cube(size = [2, 2, 2], center = false);
               }
               multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
                       cube(size = [3, 3, 3], center = false);
               }
               multmatrix([[1, 0, 0, 30], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
                       cube(size = [4, 4, 4], center = false);
               }
       }
}

Все экземпляры for() существуют одновременно, они не перебираются последовательно.

Цикл с пересечением[править]

intersection_for() использует те же самые параметры и работает аналогично Циклу For, кроме устранения неявного объединения.

Пример 1 - цикл по диапазону значений:
intersection_for(n = [1 : 6])
{
    rotate([0, 0, n * 60])
    {
        translate([5,0,0])
        sphere(r=12);
    }
}
intersection_for()
either intersection() for() or for() intersection()
Пример 2 - поворот :
 intersection_for(i = [ [  0,  0,   0],
 			[ 10, 20, 300],
 			[200, 40,  57],
 			[ 20, 88,  57] ])
{
    rotate(i)
    cube([100, 20, 20], center = true);
}
intersection_for()
intersection() for()

In