Руководство пользователя по 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);
}
}
|
Пример 2 - поворот : | ||
intersection_for(i = [ [ 0, 0, 0],
[ 10, 20, 300],
[200, 40, 57],
[ 20, 88, 57] ])
{
rotate(i)
cube([100, 20, 20], center = true);
}
|
In
Оператор If
правитьОсуществляет проверку, требуется ли выполнять указанные в его области действия или нет.
ВАЖНО! Переменные этот оператор менять не может. Если вы измените значение некоторой переменной внутри скобок, оно сохранится только до выхода из этой области действия.