Skip to main content

Someone wanted to learn this too, so Grasp built them a personal learning path.

You can keep exploring this one or create your own

Тонкостенная оболочка из монолитного блока

Здравствуйте!

На прошлом уроке мы заложили фундамент нашего проекта, создав монолитный блок, который определяет внешние габариты будущего корпуса. Этот подход "сверху-вниз" позволяет нам работать с единым "мастер-телом", что гарантирует точность и упрощает дальнейшие модификации.

Сегодня мы переходим к следующему, ключевому этапу: превращению этого сплошного "кирпича" в полую оболочку. Цель этого урока — научиться создавать тонкостенную оболочку из монолитного блока с помощью операции thicken. Это, пожалуй, самая важная операция при проектировании корпусов, так как она позволяет нам мгновенно получить основу для будущей коробки.

1. Концепция операции thicken (оболочка)

Представьте, что наш сплошной блок — это кусок сахара-рафинада. Наша задача — выдолбить его изнутри, оставив только стенки заданной толщины. Именно это и делает операция thicken (в некоторых CAD-системах она называется shell).

Она берет твердое тело (Solid) и "выскабливает" его изнутри, оставляя тонкий слой материала. Кроме того, она позволяет указать, какие из граней исходного тела нужно удалить, чтобы создать отверстие. В нашем случае, мы удалим верхнюю грань, чтобы получить открытую коробку.

3D-модель корпуса с вырезами
Пример готового корпуса, состоящего из двух полых частей. Операция `thicken` — ключевой шаг для создания таких оболочек.

2. Применение thicken в build123d

Давайте модифицируем наш код из прошлого урока. Создайте копию файла enclosure_v1.py и назовите ее enclosure_v2.py.

Сначала добавим новый параметр — толщину стенок. Это критически важный параметр для 3D-печати.

# enclosure_v2.py
from build123d import *

# ================== ПАРАМЕТРЫ ==================
# Внешние габариты будущего корпуса
enclosure_length = 100.0
enclosure_width = 70.0
enclosure_height = 35.0

# Толщина стенок корпуса
wall_thickness = 2.0 

# ================== ПРОЕКТИРОВАНИЕ ==================
# 1. Создаем монолитный блок
solid_block = Box(
    length=enclosure_length,
    width=enclosure_width,
    height=enclosure_height,
    align=(Align.CENTER, Align.CENTER, Align.CENTER)
)

# ... здесь будет операция thicken ...

# ================== ВИЗУАЛИЗАЦИЯ ==================
# if "show_object" in locals():
#     show_object(solid_block, name="Monolithic Block")

Теперь применим операцию thicken к нашему solid_block. Метод thicken принимает два основных аргумента:

  1. amount: Величина "утолщения". Для создания полости внутри объекта используется отрицательное значение, которое задает толщину удаляемого материала, то есть итоговую толщину стенки. Мы передадим -wall_thickness.
  2. faces: Список граней, которые нужно удалить. Если не указать ни одной грани, получится замкнутая полость внутри объекта. Чтобы получить открытую коробку, нам нужно удалить верхнюю грань.

Как же программно выбрать верхнюю грань? В build123d для этого существует мощная система фильтров.

# Выбираем верхнюю грань (грань с максимальной координатой по оси Z)
top_face = solid_block.faces().filter_by(Axis.Z).last

# 2. Создаем полую коробку
hollow_box = solid_block.thicken(amount=-wall_thickness, faces=top_face)

Давайте разберем строку solid_block.faces().filter_by(Axis.Z).last:

  • solid_block.faces(): Получаем список всех шести граней нашего параллелепипеда.
  • .filter_by(Axis.Z): Из этих граней выбираем только те, чьи нормали параллельны оси Z. В нашем случае это верхняя и нижняя грани.
  • .last: Из отфильтрованного набора (верхняя и нижняя грань) выбираем последнюю. Поскольку объекты сортируются по положению их центра, грань с большей координатой Z (верхняя) будет последней.

Теперь объединим все в один файл.

3. Итоговый код и результат

Ваш файл enclosure_v2.py должен выглядеть так:

# enclosure_v2.py
from build123d import *

# ================== ПАРАМЕТРЫ ==================
# Внешние габариты будущего корпуса в миллиметрах
enclosure_length = 100.0
enclosure_width = 70.0
enclosure_height = 35.0

# Толщина стенок корпуса
wall_thickness = 2.0

# ================== ПРОЕКТИРОВАНИЕ ==================
# 1. Создаем монолитный блок, отцентрованный по всем осям
solid_block = Box(
    length=enclosure_length,
    width=enclosure_width,
    height=enclosure_height,
    align=(Align.CENTER, Align.CENTER, Align.CENTER)
)

# 2. Выбираем верхнюю грань для удаления
# .faces() - получить все грани
# .filter_by(Axis.Z) - отфильтровать по нормали, параллельной оси Z
# .last - выбрать ту, что выше по оси Z
top_face = solid_block.faces().filter_by(Axis.Z).last

# 3. Применяем thicken для создания полости
# amount - толщина стенки (отрицательное значение для создания полости)
# faces - грань, которую нужно удалить, чтобы сделать коробку открытой
hollow_box = solid_block.thicken(amount=-wall_thickness, faces=top_face)


# ================== ВИЗУАЛИЗАЦИЯ ==================
# Проверяем, что получилось
if "show_object" in locals():
    show_object(hollow_box, name="Hollow Box")

Запустите этот код. В окне OCP CAD Viewer вы увидите уже не сплошной блок, а открытую коробку с толщиной стенок 2 мм. Мы успешно превратили нашу "глыбу мрамора" в заготовку для корпуса!

Операция 'Thicken' в COMSOL Multiphysics
Эта иллюстрация из другого CAD-пакета (COMSOL) наглядно демонстрирует сам принцип "утолщения": исходная геометрия (слева) преобразуется в объект с заданной толщиной стенок (справа). В нашем случае мы применили аналогичную операцию не к поверхности, а ко всему твердому телу, удалив его внутреннюю часть.
Проверьте себя!

Представьте, что вам нужно создать не открытую сверху коробку, а лоток, открытый спереди (со стороны положительного направления оси Y).

Задание:
Модифицируйте код enclosure_v2.py так, чтобы операция thicken удаляла не верхнюю, а переднюю грань.

Подсказка: Подумайте, как нужно изменить селектор для выбора грани.

Показать решение

Для выбора передней грани нам нужно отфильтровать грани, чьи нормали параллельны оси Y, и выбрать ту, что находится "впереди", то есть имеет максимальную координату по Y.

# enclosure_v2_exercise.py
from build123d import *

# ================== ПАРАМЕТРЫ ==================
enclosure_length = 100.0
enclosure_width = 70.0
enclosure_height = 35.0
wall_thickness = 2.0

# ================== ПРОЕКТИРОВАНИЕ ==================
solid_block = Box(
    length=enclosure_length,
    width=enclosure_width,
    height=enclosure_height,
    align=(Align.CENTER, Align.CENTER, Align.CENTER)
)

# Изменяем селектор для выбора передней грани
# Фильтруем по оси Y и выбираем последнюю (с максимальной координатой Y)
front_face = solid_block.faces().filter_by(Axis.Y).last

# Применяем thicken, удаляя переднюю грань
hollow_tray = solid_block.thicken(amount=-wall_thickness, faces=front_face)


# ================== ВИЗУАЛИЗАЦИЯ ==================
if "show_object" in locals():
    show_object(hollow_tray, name="Hollow Tray (open front)")

Этот пример показывает, насколько гибким является программный подход. Изменив всего одну строку кода, мы кардинально поменяли геометрию, что в графическом CAD-редакторе могло бы потребовать нескольких кликов и перестройки операции.

Ключевые выводы

  • Мы преобразовали сплошной блок в полую оболочку с помощью метода thicken.
  • Для создания внутренней полости толщина (amount) задается отрицательным числом.
  • Для создания открытой коробки необходимо указать удаляемую грань в параметре faces.
  • build123d предоставляет мощный API для программного выбора геометрических элементов (граней, ребер, вершин) с помощью цепочек методов, таких как .faces().filter_by(...).last.

Что дальше?

Мы получили полую коробку, но для полноценного корпуса нам нужны две части: основание и крышка. В следующем уроке мы научимся "разрезать" нашу полую модель на две части с помощью режущей плоскости. Это позволит нам получить отдельные, но идеально подогнанные друг к другу детали.

Can't find a good explanation? Sign up and we'll make it for you

Sign up