OpenSCAD разница / пересечение не работает

Я пытался создать разницу, если y == 0, однако, когда я помещаю последний "куб", он заполняет другие части фигуры, которые не должны быть заполнены, и даже не вырезает то, что должен был, Однако, когда я закомментирую последний куб, он работает нормально (за исключением того, что у него, очевидно, нет последней разницы). Я пытался использовать openscad.net и программное обеспечение. Оба они имеют одинаковый эффект. Что я делаю неправильно?

С кубом без комментариев

С кубом прокомментировал

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]);
                        }
                    }
                }
            }
        }
    }
}

2 ответа

Решение

Причина ваших результатов, кажется, в том, что когда y==0Ваше пересечение приводит к пустому объекту, следовательно, ничего не вычитается. Если вы уменьшите свой дизайн до небольшого примера, демонстрирующего такое поведение, его будет намного легче отлаживать. Подсказка: вы можете использовать # а также % операторы для выделения объектов для отладки (# включает их в дерево CSG, % удаляет их из дерева CSG).

Чтобы добавить к ответу Kintel, я думаю, что вы намеревались сделать union() там в строке 38, также положить вещи в module очень помогает при повторном использовании или обновлении вещей в будущем.

Другие вопросы по тегам