在 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 我得到了这个片段:
我倾向于这样解释,因此不可能按照我想象的方式创建递归结构。
相反,我可以:
- 使用辅助函数生成立方体参数,然后计算它们的并集。
- 根据
for
循环重写结构。
我不确定我的信念是否正确,但推理是这样的:
- 我不能在函数中创建对象,因为那样会产生影响。
- 我不能递归地使用模块,因为它没有 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
所以我正在尝试使用递归函数构建一个简单的缩放立方体堆栈:
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 我得到了这个片段:
我倾向于这样解释,因此不可能按照我想象的方式创建递归结构。
相反,我可以:
- 使用辅助函数生成立方体参数,然后计算它们的并集。
- 根据
for
循环重写结构。
我不确定我的信念是否正确,但推理是这样的:
- 我不能在函数中创建对象,因为那样会产生影响。
- 我不能递归地使用模块,因为它没有 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