在 OpenSCAD 中递归构建对象

Recursively constructing an object in OpenSCAD

所以我正在尝试使用递归函数构建一个简单的缩放立方体堆栈:

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 行有语法错误,将编辑器标记为这样:

遗憾的是控制台只产生这个输出:

ERROR: Parser error in line 4: syntax error

ERROR: Compilation failed!

所以我很难弄清楚我到底做错了什么。 我想有一种方法可以使用 for 来做到这一点,但我认为递归方法更具可读性。

我将尝试使用模块来完成此操作,如果这不起作用,我可以求助于 for 与我想的模块结合使用 - 我更希望它能够工作并且发现它非常可读。


更新:所以从 OpenSCAD User Manual 我得到了这个片段:

我倾向于这样解释,因此不可能按照我想象的方式创建递归结构。

相反,我可以:

我不确定我的信念是否正确,但推理是这样的:

  1. 我不能在函数中创建对象,因为那样会产生影响。
  2. 我不能递归地使用模块,因为它没有 return 结果,而且变量在 OpenSCAD 中的工作方式可能会干扰这个想法。

你可以做一个递归模块,唯一的问题是三元运算符取值而不是对象:

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