代码之家  ›  专栏  ›  技术社区  ›  Jakob Runge

在openscad中递归构造对象

  •  0
  • Jakob Runge  · 技术社区  · 6 年前

    因此,我尝试使用递归函数构建一个简单的缩放多维数据集堆栈:

    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 ,但我认为递归方法更具可读性。

    我试着用模块来做,如果不行,我可以使用 对于 结合模块我想-我更希望这个工作,并发现它非常可读。


    更新:所以从 OpenSCAD User Manual 我得到这个片段: OpenSCAD definition of modules and functions

    我倾向于对此进行解释,这样就不可能像我想象的那样创建递归结构。

    相反,我可以: *使用helper函数生成多维数据集参数,然后计算它们的并集。 *根据 对于 循环。

    我不确定我的信念是否正确,但理由是:

    1. 我不能在函数中创建对象,因为那样会产生效果。
    2. 我不能递归地使用模块,因为它不返回结果,而且变量在openscad中的工作方式可能会干扰这个想法。
    1 回复  |  直到 6 年前
        1
  •  1
  •   Cash Lo    6 年前

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

    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