Recommended resources
The freely available resources this lesson will direct you to.
Здравствуйте!
На прошлом уроке мы завершили большой и важный модуль по оптимизации дизайна для FDM-печати, научившись бороться с деформацией и улучшать межслойную адгезию на уровне CAD-модели. Теперь, вооружившись этими знаниями, мы готовы приступить к самому интересному — финальному проекту, в рамках которого мы с нуля создадим корпус для вашей печатной платы.
Сегодняшний урок закладывает фундамент всего проекта. Наша цель — организовать код проекта в виде параметрической функции для легкой модификации. Мы не будем сразу создавать сложную геометрию. Вместо этого мы сосредоточимся на правильной структуре кода. Такой подход, хорошо знакомый вам из разработки ПО, позволит нам в будущем легко изменять размеры, толщину стенок и другие параметры корпуса, просто меняя значения переменных, а не переписывая логику.
1. Что такое параметрическая модель?
В контексте CAD-as-code, параметрическая модель — это модель, геометрия которой полностью определяется набором входных параметров (переменных). Вместо того чтобы "зашивать" в код конкретные размеры, мы описываем их в виде зависимостей.
Например, вместо "статического" куба:
# Статический подход: "магические числа"
Box(100, 50, 30)
Мы используем параметрический подход:
# Параметрический подход
enclosure_length = 100
enclosure_width = 50
enclosure_height = 30
Box(enclosure_length, enclosure_width, enclosure_height)
Это простой пример, но он иллюстрирует главную идею. В реальном проекте параметрами будут размеры печатной платы, толщина стенок, зазоры, диаметры крепежных отверстий и так далее.

2. Структурирование кода: от скрипта к функции
Чтобы сделать наш проект по-настоящему гибким и поддерживаемым, мы инкапсулируем всю логику создания модели в одну Python-функцию.
Такая функция будет:
- Принимать на вход все ключевые параметры дизайна (размеры платы, толщину стенок и т.д.).
- Выполнять все необходимые расчеты и построения
build123d. - Возвращать готовый 3D-объект (или несколько объектов, например, основание и крышку).
Преимущества такого подхода очевидны с точки зрения инженерии ПО:
- Инкапсуляция: Логика создания корпуса изолирована и самодостаточна.
- Повторное использование: Вы сможете сгенерировать корпус для другой платы, просто вызвав ту же функцию с новыми параметрами.
- Читаемость и поддержка: Сигнатура функции
create_enclosure(pcb_width, pcb_length, ...)сразу дает понять, от чего зависит модель. Изменения вносятся в одном месте.
В документации build123d есть пример создания параметрических объектов через наследование классов. Мы будем использовать более простой, но не менее мощный подход с функциями.
gumyr/build123d: A python CAD programming library
Чтобы ознакомиться с общей идеей создания параметрических многократно используемых компонентов в build123d, вы можете взглянуть на пример в официальной документации. Обратите внимание на секцию 'Extending objects'.
Найдите раздел 'Extending objects'. Там показано, как создать параметрический объект Punch с помощью класса. Мы реализуем похожую логику, но с использованием функции, что идеально подходит для нашего проекта.
3. Создаем основу параметрического корпуса
Давайте напишем первую версию нашей функции. Согласно плану, первый шаг в проектировании корпуса — создание монолитного блока по его внешним габаритам. Наша функция будет принимать на вход размеры печатной платы и другие важные параметры, а на выходе возвращать этот блок.
Мы определим следующие параметры:
- Размеры печатной платы (
pcb_width,pcb_length,pcb_height). - Толщина стенок корпуса (
wall_thickness). - Зазоры между платой и внутренними стенками корпуса (
side_clearance,bottom_clearance,top_clearance).
На основе этих входных данных функция рассчитает внешние габариты и создаст Box.
from build123d import *
# В вашем случае ocp_vscode не используется, но для общности примера оставим.
# from ocp_vscode import show
def create_enclosure_block(
pcb_width: float,
pcb_length: float,
pcb_height: float,
wall_thickness: float = 2.0,
side_clearance: float = 1.0,
bottom_clearance: float = 3.0,
top_clearance: float = 5.0,
) -> Part:
"""
Создает параметрический монолитный блок для корпуса печатной платы.
Args:
pcb_width (float): Ширина печатной платы (по оси X).
pcb_length (float): Длина печатной платы (по оси Y).
pcb_height (float): Высота платы с учетом самых высоких компонентов.
wall_thickness (float, optional): Толщина стенок, дна и крышки. Defaults to 2.0.
side_clearance (float, optional): Зазор между краями платы и внутренними стенками. Defaults to 1.0.
bottom_clearance (float, optional): Зазор между низом платы и дном корпуса (для стоек). Defaults to 3.0.
top_clearance (float, optional): Зазор между верхом компонентов и потолком корпуса. Defaults to 5.0.
Returns:
Part: Монолитный блок корпуса.
"""
# 1. Расчет внутренних размеров корпуса
inner_width = pcb_width + 2 * side_clearance
inner_length = pcb_length + 2 * side_clearance
inner_height = pcb_height + bottom_clearance + top_clearance
# 2. Расчет внешних размеров корпуса
outer_width = inner_width + 2 * wall_thickness
outer_length = inner_length + 2 * wall_thickness
outer_height = inner_height + 2 * wall_thickness
print(f"Рассчитанные внешние габариты (ШxДxВ): {outer_width:.2f} x {outer_length:.2f} x {outer_height:.2f} мм")
# 3. Создание монолитного блока
with BuildPart() as enclosure_block:
Box(outer_width, outer_length, outer_height)
return enclosure_block.part
# Основной блок для выполнения и тестирования
if __name__ == "__main__":
# Задаем параметры нашей конкретной платы
# (замените на реальные измерения вашей платы)
my_pcb_dims = {
"width": 65.0,
"length": 100.0,
"height": 12.0 # Высота с учетом компонентов
}
# Генерируем модель
final_block = create_enclosure_block(
pcb_width=my_pcb_dims["width"],
pcb_length=my_pcb_dims["length"],
pcb_height=my_pcb_dims["height"],
wall_thickness=1.8,
side_clearance=1.5,
bottom_clearance=5.0,
top_clearance=3.0,
)
# Если используется ocp_vscode или другой вьювер, который запускается так:
# show(final_block)
# Экспорт в STL для просмотра или печати
final_block.export_stl("enclosure_block.stl")
print("Модель 'enclosure_block.stl' успешно экспортирована.")
Как этот код работает:
- Мы определили функцию
create_enclosure_blockс типизированными аргументами и значениями по умолчанию — это хорошая практика, делающая код понятнее. - Внутри функции мы сначала рассчитываем необходимое внутреннее пространство, отталкиваясь от размеров платы и зазоров.
- Затем, зная внутренние размеры, мы добавляем толщину стенок, чтобы получить внешние габариты.
- С помощью
Boxсоздается и возвращается монолитный блок. - Блок
if __name__ == "__main__":позволяет использовать этот файл и как библиотеку (импортируя функцию), и как самостоятельный скрипт для генерации модели. Здесь мы задаем конкретные размеры нашей платы и вызываем функцию для создания STL-файла.
Теперь, если вы решите, что зазор над платой слишком мал, или что стенки должны быть толще, вам достаточно изменить одно значение в словаре my_pcb_dims или в вызове функции. Вся геометрия пересчитается автоматически.
Проверьте себя!
Предположим, после печати прототипа вы обнаружили, что плата слишком плотно садится по ширине. Вам нужно увеличить зазор между краями платы и внутренними стенками корпуса с 1.5 мм до 2.0 мм. Какое одно значение в коде (в блоке if __name__ == "__main__":) нужно изменить, и как это изменение повлияет на итоговый внешний размер корпуса?
Показать ответ
Нужно изменить значение параметра side_clearance в вызове функции create_enclosure_block на 2.0.
Это сработает, потому что функция параметрическая. Изменение side_clearance приведет к следующей цепочке пересчетов:
inner_widthувеличится на2 * (2.0 - 1.5) = 1.0мм.outer_widthтакже увеличится на1.0мм, так какouter_width = inner_width + 2 * wall_thickness.
Таким образом, одно изменение в параметрах корректно обновит всю геометрию.
Ключевые выводы
- Мы начали работу над финальным проектом, заложив профессиональную и гибкую основу кода.
- Вся логика создания модели инкапсулирована в параметрическую функцию, что упрощает её повторное использование и модификацию.
- Все размеры модели теперь вычисляются на основе базового набора параметров (размеры платы, зазоры, толщина стенок), что исключает "магические числа" и ручные пересчеты.
Что дальше?
Мы создали прочный фундамент. В следующем уроке мы возьмем наш монолитный блок и сделаем из него полую оболочку с помощью операции thicken (в build123d это делается через вычитание или другие методы). Мы также создадим отдельную параметрическую модель самой печатной платы и разместим её внутри нашего корпуса, чтобы использовать как наглядный референс для дальнейшего проектирования. Это позволит нам перейти к следующему шагу — созданию монтажных стоек и вырезов с высокой точностью.