我想写一个模块,它可以选择性地将其子级组合为并集或差集。
module u_or_d(option="d") {
if (option == "d") {
difference() children();
} else {
union() children();
}
}
module thing(option) {
u_or_d(option) {
cube(10, center=true);
cylinder(h=20, d=5, center=true);
}
}
translate([-15, 0, 0]) thing("d");
translate([ 15, 0, 0]) thing("u");
我很惊讶这不起作用。事物的两个实例似乎都创建了立方体和圆柱体的并集。
CSG树转储显示了问题。以下是相关摘录:
difference() {
group() {
cube(size = [10, 10, 10], center = true);
cylinder($fn = 0, $fa = 12, $fs = 2, h = 20, r1 = 2.5, r2 = 2.5, center = true);
}
}
孩子们被包裹在一个组中,所以difference()
实际上只有一个孩子,这恰好是被包裹的孩子们的隐式联合。
有没有一种方法可以调用children()
来避免这种不需要的分组?如果没有,模块是否有其他方法允许调用程序选择模块如何组合其子级?
我找到了一个解决方案:
module u_or_d(option="d") {
if (option == "d" && $children > 1) {
difference() {
children([0]);
children([1:$children-1]);
}
} else {
union() children();
}
}
您仍然可以在每次调用子对象时使用一个组,但至少我们可以创建两个组。