Как добавить отверстие 2х2 мм в файл SCAD?

Я пытаюсь изменить этот код, чтобы создать небольшое отверстие размером 2 x 2 мм на короткой стороне коробки (чтобы вместить два провода, выходящие из батареи):

// Какой из них вы бы хотели увидеть?
part = "both"; // [box:Только коробка, верх: Только верхняя крышка, оба: коробка и верхняя крышка]

// Размер сопла вашего принтера в мм
nozzle_size = 0.35;

// Количество стенок, которые должен иметь отпечаток
number_of_walls = 3; // [1:5]

// Допуск (используйте 0,2 для FDM)
tolerance = 0.2; // [0.1:0.1:0.4]

// Внутренний размер X в мм
interior_x=70;

// Внутренний размер Y в мм
interior_y=21;

// Внутренний размер Z в мм
interior_z=17;

// радиус внутреннего угла в мм
radius=0; // [0:20]

// Какую часть плоской стороны X должен занимать крючок? (0 — без крючка)
x_hook_fraction = 0.5; // [0:0.1:1.0]

// Какую часть плоской стороны Y должен занимать крючок? (0 — без крючка)
y_hook_fraction = 0.5; // [0:0.1:1.0]

// Какая часть крючков должна иметь прорезь позади них? (0 — нет слота)
slot_length = 0.7; // [0:0.1:1]

/* Hidden */
$fn=100;

wall_thickness=nozzle_size*number_of_walls;

// Внешние размеры
x = interior_x + 2 * wall_thickness;
y = interior_y + 2 * wall_thickness;
z = interior_z + 2 * wall_thickness;

hook_thickness = 3 * nozzle_size;

top_cover_wall_thickness = hook_thickness + wall_thickness;

y_hook_length = (y - 2 * radius) * y_hook_fraction;
x_hook_length = (x - 2 * radius) * x_hook_fraction;

module box_interior () {
    offset(r=radius) {
        square([interior_x-2*radius, interior_y-2*radius], center=true);
    }
}

module box_exterior () {
    offset(r=wall_thickness) {
        box_interior();
    }
}

module bottom_box () {
    difference(){
        // Сплошной ящик
        linear_extrude(z-wall_thickness){
            box_exterior();
        }
        
        // Выдолбить
        translate([0,0,wall_thickness]) linear_extrude(z){
            box_interior();
        }
        left_slot();
        rotate([180,180,0]) left_slot(); // правый слот
        front_slot();
        rotate([180,180,0]) front_slot(); // задний слот
    }
    left_hook(); // левый хук
    rotate([180,180,0]) left_hook(); // правый хук
    front_hook(); // передний крючок
    rotate([180,180,0]) front_hook(); // задний хук
}

module left_hook () {
    translate([(x-2*wall_thickness)/2,-y_hook_length/2,z-wall_thickness]) rotate([0,90,90]) {
        base_hook(y_hook_length);
    }
}

module front_hook () {
    translate([-x_hook_length/2,-y/2+wall_thickness,z-wall_thickness]) rotate([90,90,90]) {
        base_hook(x_hook_length);
    }
}

module base_hook (hook_length) {
    difference(){
        linear_extrude(hook_length){
            polygon(points=[[0,0],[2*hook_thickness,0],[hook_thickness,hook_thickness]]);
        }
        translate([hook_thickness, hook_thickness, 0]) rotate([45,0,0]) cube(2*hook_thickness, center=true);
        translate([hook_thickness, hook_thickness, hook_length]) rotate([45,0,0]) cube(2*hook_thickness, center=true);        
    }
}

module left_slot () {
    slot_length = y_hook_length*slot_length;
    epsilon=2; // убеждаемся, что он определенно выступает
    translate([x/2+epsilon,-slot_length/2,z]) rotate([0,90,90]) {
        cube([2*hook_thickness, wall_thickness+epsilon, slot_length]);
    }
}

module front_slot () {
    slot_length = x_hook_length*slot_length;
    epsilon=2; // убеждаемся, что он определенно выступает
    translate([-slot_length/2,-y/2-epsilon,z]) rotate([90,90,90]) {
        cube([2*hook_thickness, wall_thickness+epsilon, slot_length]);
    }
}

module right_groove () {
    translate([-tolerance/2+(x-2*wall_thickness)/2,-y_hook_length/2,wall_thickness+hook_thickness*2]) rotate([0,90,90]) linear_extrude(y_hook_length) {
        base_groove();
    }
}


module front_groove () {
    translate([-x_hook_length/2,-y/2+wall_thickness+tolerance/2,wall_thickness+hook_thickness*2]) rotate([90,90,90]) linear_extrude(x_hook_length){
        base_groove();
    }
}

module base_groove () {
    polygon(points=[[0,0],[0, -1], [2*hook_thickness, -1],[2*hook_thickness,0],[hook_thickness,hook_thickness]]);
}

module top_cover () {

    // Верхняя грань
    linear_extrude(wall_thickness) {
        box_exterior();
    }
    
    difference(){
        // Стенка верхней крышки
        inset = wall_thickness + tolerance/2;
        linear_extrude(wall_thickness+hook_thickness*2){
            offset(r=-inset) {
                box_exterior();
            }
        }
        
        // Выдолбить
        translate([0,0,wall_thickness]) linear_extrude(z){
            offset(r=-wall_thickness*2) {
                offset(r=-inset) {
                    box_exterior();
                }
            }
        }
        
        right_groove();
        rotate([180,180,0]) right_groove();
        front_groove();
        rotate([180,180,0])  front_groove();
    }
  

}

// левый_хук();
print_part();

module print_part() {
    if (part == "box") {
        bottom_box();
    } else if (part == "top") {
        top_cover();
    } else if (part == "both") {
        both();
    } else {
        both();
    }
}

module both() {
    translate([0,-(y/2+wall_thickness),0]) bottom_box();
    translate([0,+(y/2+wall_thickness),0]) top_cover();
}

Я пробовал что-то подобное, но это не сработало:

// Добавляем отверстие на короткой стороне коробки
translate([interior_x / 2, interior_y - hole_size / 2, interior_z / 2])
    cube([hole_size, hole_size, interior_z], center=true);

, 👍2


1 ответ


Лучший ответ:

1

Вам нужно использовать функцию difference() в OpenSCAD, чтобы вычесть одну или несколько 3D-фигур из другой. Источник: Документация для функции разницы().

Для справки: ваш код уже делает это несколько раз. Примерно так:

module bottom_box () {
    difference(){
        // Существующий код...

        // Вычитаем дырку
        translate([hole_position_x, hole_position_y, hole_position_z])
            cube([hole_size, hole_depth, hole_size], center=true);
    }
    // Остальная часть кода...
}

Простые примеры кубов

Вот пример Openscad, который можно протестировать в вашем браузере, представляющий простой куб с отверстием и без него (внизу):

Модель без отверстия

cube_size = 20;
module simple_cube() {
    cube(cube_size);
}
simple_cube();

модель без отверстия

Модель с дыркой

cube_size = 20;
hole_size = 2;
module cube_with_hole() {
    difference() {
        cube(cube_size);
        translate([cube_size / 2, cube_size / 2, 0])
        cube([hole_size, hole_size, cube_size], center=true);
    }
}
cube_with_hole();

модель с отверстием


,

Я добавил это в нижнее поле, но отверстия не появилось. Не знаю, где это портится., @stormist

Вы уверены, что все переменные верны и позиционирование правильное? Я бы отлаживал это шаг за шагом. Сначала сделайте фигуру сплошной и окрашенной в очевидный цвет, затем расположите ее правильно, а затем попытайтесь включить ее в функцию различия., @Bob Ortiz

@stormist Отверстие должно быть длиннее коробки. Отверстие должно выступать за коробку с обеих сторон (чтобы сдвинуть отверстие, возможно, понадобится перевод)., @Uwe

Измените эту строку: куб([дырка_размер, дырка_размер, куб_размер], центр=истина); на это: куб([hole_size,hole_size, Cube_size +hole_size], center=true); для более длинного выступающего отверстия., @Uwe