Рекурсивное построение объекта в OpenSCAD - PullRequest
0 голосов
/ 20 декабря 2018

Итак, я пытаюсь создать простой стек масштабированных кубов, используя рекурсивную функцию:

function stack(levels) = (
  levels <= 0
  ? cube([1,1,1], center=true)
  : union() {
    cube([1,1,1], center=true);
    translate([0, 0, 0.9]) scale([1, 1, 0.9]) stack(levels - 1);
  }
);

stack(5);

Теперь по какой-то причине я сейчас не понимаю, что OpenSCAD говорит мне, что у меня есть синтаксисошибка в строке 4, помечающая редактор следующим образом:

highlighted syntax error in the mentioned code

К сожалению, консоль выдает только эти выходные данные:

ОШИБКА: Ошибка синтаксического анализатора в строке 4: синтаксическая ошибка

ОШИБКА: ошибка компиляции!

Так что мне довольно сложно понять, что именно я делаю неправильно.Я думаю, что есть способ сделать это, используя for, но я бы посчитал рекурсивный подход более читабельным.

Я попытаюсь сделать это с модулями, и если это не сработает, я могу прибегнуть киспользуйте for в сочетании с модулями, я полагаю - мне бы хотелось, чтобы это работало и было очень удобочитаемым.


Обновление: так из OpenSCAD User Manual Я получил этот фрагмент: OpenSCAD definition of modules and functions

Я хотел бы интерпретировать это так, что невозможно создать рекурсивную структуру так, как я себе представлял.

Вместо этого яМогут: * Использовать вспомогательную функцию для генерации параметров куба и последующего вычисления их объединения.* Перепишите структуру в терминах for цикла.

Я не уверен, правильно ли мое убеждение, но причина в следующем:

  1. Я не могу создавать объекты вфункция, потому что это будет иметь эффект.
  2. Я не могу использовать модуль рекурсивно, потому что он не возвращает результат и, возможно, способ работы переменных в OpenSCAD будет мешать идее.

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете создать рекурсивный модуль, единственная проблема в том, что троичный оператор принимает значения, а не объекты:

module stack(levels) {
  if(levels) {
    cube([1,1,1], center=true);
    translate([0, 0, 0.9]) scale([1, 1, 0.9]) stack(levels-1);      
  } else {
    cube([1,1,1], center=true);
  }
}

stack(5);

Вот еще один пример: https://github.com/cashlo/OpenSCAN-Objects/blob/master/xmas-tree.scad

...