OpenSCAD difference/intersection 不工作
OpenSCAD difference/intersection not working
我试图在 y == 0 时创建一个差异,但是当我将最后一个 'cube' 放入其中时,它会填充不应该填充的形状的其他部分,它甚至不会填充剪掉它应该有的东西。但是,当我注释掉最终的多维数据集时,它工作正常(除了它显然没有最后的区别)。我试过使用 openscad.net 和软件。两者的作用是一样的。我做错了什么?
With cube uncommented
With cube commented
s = 20+8; //Block size in mm
l = 2; //In "blocks"
w = 2; //In "blocks"
h = 40; //In mm
t = 1;
for (x = [0:l-1]) {
for (y = [0:w-1]) {
translate([s*x-s*l/2, s*y-s*w/2, -h/2]) {
if (x==0) {
translate([-s*(2/28)-t, s*(16/28)+t/2, 0]) {
cube([s*(2/28)+t, s*(8/28)-t, h]);
}
translate([-s*(4/28), s*(14/28)+t/2, 0]) {
cube([s*(2/28)-t, s*(12/28)-t, h]);
}
}
if (x==l-1) {
translate([s, s*(4/28)+t/2, 0]) {
cube([s*(2/28)+t, s*(8/28)-t, h]);
}
translate([s+s*(2/28)+t, s*(2/28)+t/2, 0]) {
cube([s*(2/28)-t, s*(12/28)-t, h]);
}
}
if (y==0) {
translate([s*(4/28)+t/2, -s*(2/28)-t, 0]) {
cube([s*(8/28)-t, s*(2/28)+t, h]);
}
translate([s*(2/28)+t/2, -s*(4/28), 0]) {
cube([s*(12/28)-t, s*(2/28)-t, h]);
}
}
difference() {
cube([s, s, h]);
intersection() {
if (x == 0) {
translate([0, s*(4/28), 0]) {
cube([s*(2/28), s*(8/28), h]);
}
translate([s*(2/28), s*(2/28), 0]) {
cube([s*(2/28), s*(12/28), h]);
}
}
if (x==l-1) {
translate([s-s*(4/28), s*(14/28), 0]) {
cube([s*(2/28), s*(12/28), h]);
}
translate([s-s*(2/28), s*(16/28), 0]) {
cube([s*(2/28), s*(8/28), h]);
}
}
if (y==0) {
translate([s*(14/28), -s*(4/28), 0]) {
cube([s*(12/28), s*(2/28), h]);
}
}
}
}
}
}
}
您的结果的原因似乎是当 y==0
时,您的交集生成一个空对象,因此没有减去任何内容。
如果您将您的设计精简为一个表现出这种行为的较小示例,那么调试起来会容易得多。
提示:您可以使用 #
和 %
运算符来突出显示要调试的对象(# 将其包含在 CSG 树中,% 将其从 CSG 树中删除)。
为了补充 kintel 的回答,我认为你打算在第 38 行做一个 union()
,同时将内容放入 module
对将来重用或更新内容有很大帮助。
我试图在 y == 0 时创建一个差异,但是当我将最后一个 'cube' 放入其中时,它会填充不应该填充的形状的其他部分,它甚至不会填充剪掉它应该有的东西。但是,当我注释掉最终的多维数据集时,它工作正常(除了它显然没有最后的区别)。我试过使用 openscad.net 和软件。两者的作用是一样的。我做错了什么?
With cube uncommented
With cube commented
s = 20+8; //Block size in mm
l = 2; //In "blocks"
w = 2; //In "blocks"
h = 40; //In mm
t = 1;
for (x = [0:l-1]) {
for (y = [0:w-1]) {
translate([s*x-s*l/2, s*y-s*w/2, -h/2]) {
if (x==0) {
translate([-s*(2/28)-t, s*(16/28)+t/2, 0]) {
cube([s*(2/28)+t, s*(8/28)-t, h]);
}
translate([-s*(4/28), s*(14/28)+t/2, 0]) {
cube([s*(2/28)-t, s*(12/28)-t, h]);
}
}
if (x==l-1) {
translate([s, s*(4/28)+t/2, 0]) {
cube([s*(2/28)+t, s*(8/28)-t, h]);
}
translate([s+s*(2/28)+t, s*(2/28)+t/2, 0]) {
cube([s*(2/28)-t, s*(12/28)-t, h]);
}
}
if (y==0) {
translate([s*(4/28)+t/2, -s*(2/28)-t, 0]) {
cube([s*(8/28)-t, s*(2/28)+t, h]);
}
translate([s*(2/28)+t/2, -s*(4/28), 0]) {
cube([s*(12/28)-t, s*(2/28)-t, h]);
}
}
difference() {
cube([s, s, h]);
intersection() {
if (x == 0) {
translate([0, s*(4/28), 0]) {
cube([s*(2/28), s*(8/28), h]);
}
translate([s*(2/28), s*(2/28), 0]) {
cube([s*(2/28), s*(12/28), h]);
}
}
if (x==l-1) {
translate([s-s*(4/28), s*(14/28), 0]) {
cube([s*(2/28), s*(12/28), h]);
}
translate([s-s*(2/28), s*(16/28), 0]) {
cube([s*(2/28), s*(8/28), h]);
}
}
if (y==0) {
translate([s*(14/28), -s*(4/28), 0]) {
cube([s*(12/28), s*(2/28), h]);
}
}
}
}
}
}
}
您的结果的原因似乎是当 y==0
时,您的交集生成一个空对象,因此没有减去任何内容。
如果您将您的设计精简为一个表现出这种行为的较小示例,那么调试起来会容易得多。
提示:您可以使用 #
和 %
运算符来突出显示要调试的对象(# 将其包含在 CSG 树中,% 将其从 CSG 树中删除)。
为了补充 kintel 的回答,我认为你打算在第 38 行做一个 union()
,同时将内容放入 module
对将来重用或更新内容有很大帮助。