Разрыв в перфорированной полосе OpenSCAD

Я использую OpenSCAD для создания детали, содержащей перфорированную полосу между двумя гранями. Двумерная версия без перфорации выглядит так:

Визуализация неперфорированной конструкции в OpenSCAD

square([100, 100]);
translate([(100-80)/2, 100]) square([80, 5]);
translate([0, 100+5]) square([100, 100]);

Я также хочу добавить несколько перфораций вдоль полосы:

module pill(diameter, width) {
    square([width - diameter, diameter], center=true);
    translate([-((width - diameter) / 2), 0]) circle(d=diameter);
    translate([ ((width - diameter) / 2), 0]) circle(d=diameter);
}

module pill_strip(diameter, width, gap, num) {
    spacing = width + gap;
    for (i = [0:num-1])
        translate([-(num-1)*spacing/2 + i*spacing, 0, 0])
            pill(diameter, width);
}

square([100, 100]);
translate([(100-80)/2, 100]) {
    difference() {
        square([80, 5]);
        translate([ 100/2, 5/2, 0]) pill_strip(5, 10, 20, 3);
    }
}
translate([0, 100+5]) square([100, 100]);

Однако это создает разрыв между перфорированной полосой и верхней поверхностью.

Полагаю, здесь какая-то ошибка с плавающей запятой? Есть ли способ получше?

Визуализация проблемной перфорированной конструкции в OpenSCAD

, 👍1

Обсуждение

Вы хотите, чтобы перфорированная полоса... разрывала деталь или использовала ее в качестве оттока? Пожалуйста, покажите, насколько это применимо к 3D-печати., @Trish

Да, это место, где можно разобрать модель или вырезать её дремелем. Реальная часть просто выдавливается в трёхмерном пространстве и печатается. Я искал более подходящий сайт, и на этом теге OpenSCAD самый активный., @rgov


1 ответ


3

Похоже, это какая-то ошибка округления, поскольку добавление смещения (например, -0,001) к 100+5 в последней строке приводит к исчезновению разрыва (а изменение его на -0,0001 заставляет его снова появиться).

Я бы создал это, добавив большой контур (205x100) как единый «квадрат», а затем разместив перфорацию. Тогда не было бы границы там, где происходит разрыв.

Обратите внимание, что функция differ() может иметь несколько аргументов; все аргументы после первого также считаются отличными от первого элемента; например, должно работать что-то вроде:

difference(){
    mainsquare();
    leftnotch();
    rightnotch();
    translate([spacing*1,0,0])pill();
    translate([spacing*2,0,0])pill();
}

,