Получить 2D-объект из грани 3D-объекта в OpenSCAD

В основном я занимаюсь автоматизацией генерации верхних и нижних оболочек корпусов устройств. Эти корпуса имеют довольно неправильную форму, которая была создана, например, с помощью hull(). В настоящее время у меня есть полый корпус, который я хотел бы разделить на верхнюю и нижнюю половины, чтобы распечатать их на 3D-принтере. Это легко сделать, пересекая или различая их с помощью большого объекта cube. Но мне бы также хотелось, чтобы крышка была в разделенном положении, чтобы обе части имели механическое прочное прилегание.

В настоящее время мой подход заключается в том, чтобы получить 2D-поверхность плоскости сечения и изменить ее, чтобы получить внешнюю часть для одной оболочки и внутреннюю часть для другой оболочки. Но я не знаю, как получить этот поверхностный объект на первом этапе процесса.

Есть идеи, как это сделать в OpenSCAD? Или еще лучшие предложения?

РЕДАКТИРОВАТЬ:

Возможный обходной путь:

Я моделирую внутреннюю полую конструкцию, совмещая необходимое пространство для компонентов. Корпус создается путем применения minkowski() {inner(); сфера (r = wallThickness); к нему. Затем перекрывающиеся части крышки создаются путем применения операции Минковского со сферой размером в половину толщины стенки. Проблема в том, что это создает невертикальное перекрытие, как вы можете видеть в примере, установив cutHeight = 10 вместо -20. Я знаю, что вертикальная крышка (т. е. перпендикулярная плоскости разреза), с другой стороны, может привести к проблемам, если толщина стенки слишком мала.

$fn=32;
wallThickness = 5;
lidHeight = 5;
cutHeight = -20;    // или 10

module inner()
{
    translate([0,0, cutHeight])
    hull() { // только пример, может иметь произвольную неправильную форму
        translate([0, 0, 20]) sphere(40); 
        translate([20, 20, -10]) cube(50,center=true);
    }
}

module shell(wall)
{
    minkowski() {
        inner();
        sphere(wall);
    }
}

module lower_enclosure()
{
    union() {
        intersection() {
            difference() {
                shell(wallThickness);
                shell(0);
            }
            translate([0,0,-500]) cube(1000, center=true);
        }
        intersection() {
            difference() {
                shell(wallThickness/2);
                shell(0);
            }
            translate([0,0,-500 + lidHeight]) cube(1000, center=true);
        }
    }
}

module upper_enclosure()
{
    rotate([180,0,0]) 
    union() {
        intersection() {
            difference() {
                shell(wallThickness);
                shell(0);
            }
            translate([0,0,500]) cube(1000, center=true);
        }
        intersection() {
            difference() {
                shell(wallThickness);
                shell(wallThickness/2);
            }
            translate([0,0,500 - lidHeight]) cube(1000, center=true);
        }
    }
}


lower_enclosure();
translate([0,110,0]) upper_shell();

, 👍1

Обсуждение

Есть ли возможность сделать эскиз? Знаю, что если вы создаете крышки, вам нужен ободок, чтобы он оставался сверху, внутренний ободок должен быть меньше, чем полые объекты корпуса внутри. Похоже, вы смоделировали все это в OpenSCAD, так что вы можете использовать этот код для крышки? Вы можете разместить свой текущий код для справки., @0scar

@0scar: Я моделирую внутреннюю полую структуру, объединяя необходимое пространство для компонентов, скажем hull() { translate([0, 0, 20])spheric(40); translate([20, 20, -10]) cube(50,center=true); } с разрезом, проходящим через плоскость XY. Корпус строится путем применения к нему minkowski() { inner();spheric(r=wallThickness); }. Итак, мое текущее решение теперь заключается в применении операции Минковского со сферой размером в половину толщины стенки, которая генерирует крышку, а затем в сочетании с разрезом выше и ниже плоскости для перекрытия. Проблема в том, что это создает невертикальное перекрытие., @Stefan


1 ответ


1

Вы можете использовать функцию openSCAD projection().

При использовании cut=true ваша модель разрезается по плоскости Z=0.

Документация по проецированию 3D в 2D.

модель, из которой нужно вырезать

projection(cut = true) example002();

проецируемый разрез


,