在OpenSCAD中递归构造对象

时间:2018-12-20 12:48:43

标签: recursion 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行出现语法错误,将编辑器标记为:

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 :(得分:1)

您可以创建一个递归模块,唯一的问题是三元运算符采用值而不是对象:

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