Recommended resources
The freely available resources this lesson will direct you to.
Здравствуйте!
В предыдущем уроке мы научились создавать сложные вентиляционные решётки с помощью паттернов на 2D-эскизах. Вы освоили мощный и эффективный подход, позволяющий создавать сотни отверстий за одну операцию.
Сегодня мы вернёмся от массовых операций к единичным, но не менее важным. Цель этого урока — научиться моделировать точные отверстия для кабелей и элементов управления, таких как кнопки и светодиоды. В отличие от вентиляции, эти отверстия часто имеют сложную форму, например, ступеньки (цековку) или некруглый профиль, чтобы соответствовать конкретной детали.

1. Простые круглые отверстия (для светодиодов и проводов)
Самый базовый случай — это сквозное круглое отверстие. Оно подходит для вывода отдельных проводов или для установки стандартного 5мм или 3мм светодиода. Техника вам уже знакома:
- Выбрать грань на корпусе.
- Создать на ней эскиз окружности (
Circle). - Выполнить вычитающее выдавливание (
extrudeсmode=Mode.SUBTRACT).
Важным аспектом здесь является точное позиционирование. В отличие от вентиляционных решёток, где взаимное расположение важнее абсолютного, здесь каждая дырочка должна быть на своём, строго определённом месте. Для этого идеально подходит контекстный менеджер Locations.
Давайте добавим на стенку нашего корпуса два отверстия: одно для светодиода и одно для пары проводов.
# enclosure_v16.py
from build123d import *
# ================== ПАРАМЕТРЫ ==================
# --- Габариты корпуса ---
enclosure_length = 100
enclosure_width = 80
enclosure_height = 40
wall_thickness = 2
# --- Параметры отверстий ---
led_dia = 5
led_pos = (-20, 0) # X, Y относительно центра грани
cable_hole_dia = 6
cable_hole_pos = (20, 0) # X, Y относительно центра грани
# ================== МОДЕЛИРОВАНИЕ ==================
with BuildPart() as enclosure:
# 1. Создаем полый короб
Box(enclosure_length, enclosure_width, enclosure_height)
offset(amount=-wall_thickness, openings=enclosure.faces().sort_by(Axis.Z)[-1])
# 2. Выбираем переднюю грань
front_face = enclosure.faces().sort_by(Axis.X)[-1]
# 3. Создаем эскиз на грани для отверстий
with BuildSketch(front_face):
# Позиционируем и создаем отверстие для светодиода
with Locations(led_pos):
Circle(led_dia / 2)
# Позиционируем и создаем отверстие для кабеля
with Locations(cable_hole_pos):
Circle(cable_hole_dia / 2)
# 4. Вычитаем оба отверстия за одну операцию
extrude(amount=-wall_thickness, mode=Mode.SUBTRACT)
if "show_object" in locals():
show_object(enclosure.part)
В этом коде мы создаём эскиз с двумя окружностями в заданных координатах и затем вычитаем их из стенки. Это эффективно, так как все 2D-операции выполняются в рамках одного эскиза, после чего следует одна 3D-операция.
2. Отверстия со ступенькой (цековка) для кнопок
Большинство кнопок, предназначенных для монтажа на панель, имеют головку большего диаметра, чем резьбовая часть. Чтобы кнопка не проваливалась внутрь и плотно прилегала к поверхности, в корпусе делается ступенчатое отверстие — цековка (counterbore).
Слева: кнопка для монтажа на панель. Справа: сечение корпуса с ответным ступенчатым отверстием.
Создать такое отверстие в build123d можно в два шага:
- Сделать сквозное отверстие меньшего диаметра для резьбовой части.
- Сделать неглубокое отверстие большего диаметра с той же оси для головки кнопки.
Давайте добавим такое отверстие в наш корпус.
# enclosure_v17.py
from build123d import *
# ================== ПАРАМЕТРЫ ==================
# --- Габариты корпуса ---
enclosure_length = 100
enclosure_width = 80
enclosure_height = 40
wall_thickness = 2
# --- Параметры кнопки ---
button_pos = (0, 0)
button_body_dia = 7 # Диаметр резьбовой части
button_head_dia = 10 # Диаметр головки
button_head_depth = 1.5 # Глубина, на которую утапливается головка
# ================== МОДЕЛИРОВАНИЕ ==================
with BuildPart() as enclosure:
Box(enclosure_length, enclosure_width, enclosure_height)
offset(amount=-wall_thickness, openings=enclosure.faces().sort_by(Axis.Z)[-1])
# Выбираем боковую грань
side_face = enclosure.faces().sort_by(Axis.Y)[-1]
# Переходим в локальные координаты грани
with Locations(side_face.center()):
# 1. Создаем сквозное отверстие для "тела" кнопки
with BuildSketch():
with Locations(button_pos):
Circle(button_body_dia / 2)
extrude(amount=-wall_thickness, mode=Mode.SUBTRACT)
# 2. Создаем углубление для "шляпки" кнопки
with BuildSketch():
with Locations(button_pos):
Circle(button_head_dia / 2)
extrude(amount=-button_head_depth, mode=Mode.SUBTRACT)
if "show_object" in locals():
show_object(enclosure.part)
Разбор кода:
- Мы выполняем две последовательные операции
extrudeсmode=Mode.SUBTRACT. - Первая операция создает узкое сквозное отверстие на всю толщину стенки (
-wall_thickness). - Вторая операция создает широкое, но неглубокое отверстие (
-button_head_depth). - Поскольку обе операции начинаются с одной и той же грани и имеют один и тот же центр, они создают идеальную цековку.
Этот подход очень гибок и позволяет создавать отверстия сложного профиля. В официальных примерах build123d есть пример создания сложного гнезда для клавиши механической клавиатуры, который использует похожие многоэтапные техники.
The build123d Examples - Key Cap
Взгляните на пример 'Key Cap' в документации. Он демонстрирует создание сложного внутреннего рельефа для крепления клавиши к переключателю. Это хороший пример того, как последовательные операции вычитания и добавления формируют геометрию под конкретный компонент.
Найдите на странице раздел 'Key Cap'. Обратите внимание на шаги, где сначала создаётся и выдалбливается общая форма, а затем добавляются внутренние рёбра жесткости и крестообразное гнездо ('switch socket').
3. Отверстия нестандартной формы
Не все отверстия круглые. Например, для вывода плоского шлейфа или USB-кабеля может потребоваться отверстие в форме скруглённого прямоугольника (слота). build123d предоставляет готовый инструмент SlotOverall или SlotCenterToCenter для таких задач.
Давайте добавим на заднюю стенку корпуса слот для вывода шлейфа.
# enclosure_v18.py
from build123d import *
# ================== ПАРАМЕТРЫ ==================
# --- Габариты корпуса ---
enclosure_length = 100
enclosure_width = 80
enclosure_height = 40
wall_thickness = 2
# --- Параметры слота ---
slot_pos = (0, 0)
slot_width = 20
slot_height = 5
# ================== МОДЕЛИРОВАНИЕ ==================
with BuildPart() as enclosure:
Box(enclosure_length, enclosure_width, enclosure_height)
offset(amount=-wall_thickness, openings=enclosure.faces().sort_by(Axis.Z)[-1])
# Выбираем заднюю грань
back_face = enclosure.faces().sort_by(Axis.X)[0]
with BuildSketch(back_face):
with Locations(slot_pos):
SlotOverall(slot_width, slot_height) # Создаем слот по габаритным размерам
extrude(amount=-wall_thickness, mode=Mode.SUBTRACT)
if "show_object" in locals():
show_object(enclosure.part)
Здесь SlotOverall(slot_width, slot_height) создаёт 2D-эскиз слота, который затем вычитается из стенки. Если требуется ещё более сложная форма (например, D-образное отверстие для разъёма), вы всегда можете нарисовать её контур вручную, комбинируя Line и Arc, как мы делали в ранних уроках.
Проверьте себя!
Представьте, что вам нужно сделать отверстие для стандартного разъёма питания DC Barrel Jack. У него есть не только основной круглый корпус, но и небольшой плоский "ключ", чтобы разъём не проворачивался в корпусе.
Как бы вы создали эскиз для такого отверстия, используя примитивы Circle и Rectangle? Опишите последовательность действий в рамках BuildSketch.
Показать ответ
Для создания такого эскиза нужно скомбинировать две фигуры с помощью булевых операций на уровне 2D.
- Создать основную окружность (
Circle) для тела разъёма. - Создать небольшой прямоугольник (
Rectangle) для "ключа". - Объединить эти две фигуры. В
build123dэто произойдёт автоматически, если они созданы в одномBuildSketchбезmode=Mode.SUBTRACT.
Примерный код эскиза:
dc_jack_dia = 7.0
key_width = 1.0
key_height = 2.0
key_offset = dc_jack_dia / 2 - 0.5 # Сдвигаем прямоугольник к краю окружности
with BuildSketch() as dc_jack_sketch:
Circle(dc_jack_dia / 2)
# Позиционируем прямоугольник так, чтобы он пересекался с окружностью
Rectangle(key_width, key_height, align=(Align.CENTER, Align.MIN), loc=Location((0, key_offset)))
# Этот эскиз (dc_jack_sketch) теперь можно вычесть из стенки.
Ключевые выводы
- Отверстия для компонентов моделируются по тому же принципу "эскиз -> выдавливание", но требуют особого внимания к точному позиционированию и форме.
- Ступенчатые отверстия (цековка) легко создаются последовательным вычитанием двух эскизов разного диаметра и глубины.
build123dпредоставляет готовые инструменты для стандартных форм вроде слотов (SlotOverall), но вы всегда можете нарисовать любой кастомный контур.- Ключ к успеху — параметризация. Всегда задавайте размеры отверстий через переменные, основанные на измерениях реальных компонентов (штангенциркулем или по даташиту).
Что дальше?
Мы добавили в наш корпус почти все необходимые функциональные вырезы. Однако сейчас все рёбра острые, что не очень практично и эстетично. В заключительном уроке этого модуля мы научимся применять скругления (fillets) и фаски (chamfers), чтобы придать нашей модели завершённый вид, а также улучшить её прочность и безопасность.