Прощай перетаскивание мышкой или как кодить 3D модели на Python
Помню, как в первый раз открыл FreeCAD, чтобы нарисовать простую деталь для 3D-принтера. Полдня ушло на то, чтобы понять, в каком верстаке (Workbench) я нахожусь и почему при изменении одного размера вся модель «разлетается» в клочья. Если вы разработчик, то привыкли контролировать логику через код, циклы и переменные. Мысль о том, чтобы «рисовать» шестеренку мышкой, кажется дикой, когда можно просто написать функцию.
Проект build123d — это как раз тот случай, когда CAD (система автоматизированного проектирования) превращается в чистый Python-код. Это наследник известного CadQuery, но переписанный так, чтобы писать модели было удобно, быстро и, главное, предсказуемо.
Зачем это нужно, когда есть облачные CAD
Обычно инженеры выбирают между тяжелыми GUI-пакетами вроде SolidWorks и программными инструментами типа OpenSCAD. Но у OpenSCAD свой специфичный язык и он довольно слаб в работе со сложными скруглениями или фасками. build123d работает на ядре Open Cascade. Это серьезный промышленный движок, который понимает геометрию на уровне поверхностей и твердых тел (BREP), а не просто набора треугольников.
Главная фишка здесь в возможности параметризации. Вам нужно изменить диаметр подшипника в десяти деталях проекта сразу? Просто меняете одну переменную в конфиге.
Два подхода к созданию геометрии
Разработчики build123d предложили интересную концепцию: вы можете писать код в двух разных стилях в зависимости от того, как работает ваш мозг.
Алгебраический режим
Тут все строится на перегрузке операторов. Вы буквально складываете и умножаете объекты. Например, чтобы вычесть отверстие из пластины, вы используете оператор -=.
from build123d import *
# Создаем эскиз и сразу вычитаем из него круг
sketch = Rectangle(10, 10) - Circle(2)
# Вытягиваем в 3D
part = extrude(sketch, amount=5)
Это выглядит лаконично и очень «питонично». Перемещение объектов тоже завязано на умножении: Plane.XY * Pos(5, 5) * Box(1, 1, 1). Сначала непривычно, но через час работы начинаешь понимать, насколько это избавляет от лишних вложенных вызовов функций.
Режим строителя (Builder Mode)
Если проект становится сложным, алгебраический подход может превратиться в кашу. Для таких случаев есть контекстные менеджеры with. В этом режиме состояние модели отслеживается автоматически внутри блока.
with BuildPart() as p:
Box(10, 10, 10)
with BuildSketch(p.faces().sort_by(Axis.Z)[-1]):
Circle(3, mode=Mode.SUBTRACT)
extrude(amount=-2, mode=Mode.SUBTRACT)
Тут магия в том, что Circle внутри контекста эскиза понимает, куда он должен «приклеиться» или что он должен вычесть из родительского объекта.
Как найти нужную грань без мата
Одна из самых болезненных тем в CAD-программировании — выбор нужного ребра для скругления. В build123d реализована крутая система селекторов. Вы можете сказать: «дай мне все ребра, параллельные оси Z», или «выбери самую большую по площади грань».
К примеру, фильтрация выглядит так:
# Находим все цилиндрические поверхности с радиусом 2
bore = part.faces().filter_by(GeomType.CYLINDER).filter_by(lambda f: f.radius == 2)
# И снимаем фаску на их ребрах
part = chamfer(bore.edges(), 0.2)
Интеграция с миром
Библиотека не живет в вакууме. Она умеет:
- Экспортировать в STEP (для заводов), STL (для 3D-принтеров) и SVG (для лазерной резки).
- Импортировать существующие модели. Можно взять готовый корпус разъема в STEP-формате и «нарастить» вокруг него крепление.
- Работать с VS Code. Для визуализации есть расширение ocp_vscode — оно открывает окно предпросмотра, которое обновляется сразу после нажатия Ctrl+S в файле с кодом.
Кому стоит попробовать
Я бы советовал заглянуть в этот репозиторий, если вы:
- Занимаетесь DIY и вам надоело мучиться с интерфейсом FreeCAD.
- Проектируете сложные сборки, где размеры одной детали зависят от другой.
- Хотите автоматизировать генерацию моделей (например, создавать корпуса под разные размеры плат).
У проекта отличная документация и очень живой Discord. Из минусов — порог вхождения чуть выше, чем у OpenSCAD, из-за обилия классов и методов. Но как только разберетесь с тем, как работают плоскости (Planes) и локации (Locations), возвращаться к рисованию мышкой уже не захочется.
Посмотреть примеры и документацию можно на странице проекта. А если решите ставить, начните сразу с настройки просмотрщика в VS Code — без него отлаживать геометрию вслепую очень тяжело.