Здравствуйте! В предыдущем уроке мы успешно настроили проект с build123d и uv, написав скрипт, который создаёт объект Box в памяти компьютера. Однако мы пока не могли его увидеть. Сегодня мы это исправим.
Цель этого урока — интегрировать 3D-вьювер в ваш рабочий процесс. Мы установим OCP CAD Viewer и настроим его так, чтобы он автоматически обновлял модель при каждом сохранении кода в Helix. Это позволит создать удобный и эффективный цикл разработки, который идеально впишется в вашу рабочую связку tmux и Helix.
Парадигма "Code-First" и роль вьювера
build123d работает по принципу "Code-First CAD": вы описываете геометрию кодом на Python, а затем программа генерирует на его основе 3D-модель. Такой подход требует отдельного инструмента для визуализации результата. OCP CAD Viewer — это легковесный, работающий в браузере вьювер, который стал стандартом для build123d и его "родителя" CadQuery.
Он позволяет не только просматривать модель, но и инспектировать ее: измерять расстояния, видеть иерархию объектов и управлять отображением.
Установка и первый запуск
Вьювер является пакетом Python, который мы установим как зависимость для разработки.
-
Установите
ocp-cad-viewer:
В терминале, находясь в директории вашего проекта (b3d-enclosures), выполните:uv add ocp-cad-viewer --devКак и в прошлый раз,
uvдобавит пакет в ваше виртуальное окружение и зафиксирует его в файлеpyproject.toml, но на этот раз в секции[tool.uv.dev-dependencies], так как вьювер нужен только на этапе разработки. -
Модифицируйте скрипт для отображения объекта:
Откройте файлlesson1_box.pyиз предыдущего урока вHelix. Измените его код следующим образом:# lesson1_box.py from build123d import Box, show_object # Создаем простой параллелепипед размерами 10x20x30 мм my_box = Box(10, 20, 30) # Отображаем объект в OCP CAD Viewer show_object(my_box)Мы импортировали функцию
show_objectизbuild123dи использовали её для визуализации нашего объектаmy_box. -
Запустите скрипт:
Выполните в терминале:uv run lesson1_box.pyВ вашем браузере по умолчанию должна открыться новая вкладка с адресом
http://127.0.0.1:5000, где вы увидите свой куб. Сервер, запущенный скриптом, будет активен, пока вы не остановите его (Ctrl+C).
Этот подход работает, но он неудобен: после каждого изменения в коде нужно останавливать сервер, запускать скрипт заново и, возможно, обновлять страницу в браузере. Далее мы это автоматизируем.
Автоматизация рабочего процесса в tmux
Ваша связка tmux и Helix идеально подходит для создания интерактивного рабочего процесса. Мы настроим его так, чтобы при сохранении файла в Helix модель в браузере обновлялась автоматически. Для этого нам понадобится утилита для отслеживания изменений в файлах. Рекомендую использовать watchexec — это современный и быстрый инструмент, написанный на Rust, вполне в духе uv.
-
Установка
watchexec(если не установлен):
В Ubuntu/Debian его можно установить черезapt:sudo apt update sudo apt install watchexecИли, если у вас установлен
cargo, через него:cargo install watchexec-cli. -
Настройка
tmux:
Предлагаю следующую конфигурацию панелейtmux:- Левая панель: Редактор
Helix. - Правая панель:
watchexec, который будет следить за файлом и перезапускать скрипт.
Пошаговая инструкция:
- Запустите
tmux. - В первой панели откройте ваш файл для редактирования:
hx lesson1_box.py. - Разделите окно вертикально: нажмите
Ctrl+b, затем%. - В новой правой панели выполните команду:
Разберем команду:watchexec -c -r -- 'uv run lesson1_box.py'-c(--clear) очищает экран перед каждым запуском.-r(--restart) останавливает предыдущий процесс перед запуском нового. Это важно, чтобы старый веб-сервер вьювера освобождал порт.--отделяет опцииwatchexecот самой команды.
При первом запуске этой команды в браузere откроется вкладка с вьювером. Теперь вернитесь в
Helix(левая панель), измените размерыBox(например, наBox(40, 20, 10)), и сохраните файл (:w).Вы увидите, как
watchexecв правой панели моментально перезапустит скрипт. Вкладка в браузере обновится сама, и вы увидите измененную модель. Этот цикл "редактирование -> сохранение -> просмотр" — основа продуктивной работы в Code-First CAD. - Левая панель: Редактор
Улучшение визуализации
Функция show_object может принимать несколько полезных аргументов. Например, name позволяет задать имя объекта, которое будет отображаться в дереве модели в интерфейсе вьювера. Это очень удобно при работе со сложными сборками.
Измените ваш код:
# lesson1_box.py
from build123d import Box, show_object
my_box = Box(40, 20, 10)
# Добавляем имя для объекта
show_object(my_box, name="Мой первый бокс")
Сохраните файл и посмотрите, как в левой панели вьювера у объекта появится заданное имя.
Проверьте себя!
Задание:
Модифицируйте скрипт lesson1_box.py так, чтобы он отображал два объекта одновременно:
- Основной бокс размером 30x30x10.
- Второй, маленький бокс размером 5x5x20.
Назовите их "Основание" и "Стойка" соответственно.
Подсказка: show_object может принимать несколько объектов и список имен.
Показать решение
Нужно создать два объекта Box и передать их в show_object, а также передать список имен в аргумент names.
# lesson1_box.py
from build123d import Box, show_object
# Создаем два объекта
base = Box(30, 30, 10)
standoff = Box(5, 5, 20)
# Отображаем оба объекта с именами
show_object(base, standoff, names=["Основание", "Стойка"])
После сохранения этого кода вьювер покажет два объекта. В дереве модели слева они будут подписаны как "Основание" и "Стойка". Обратите внимание, что пока они находятся в одной и той же точке (их центры в начале координат), поэтому один частично перекрывает другой. Мы научимся их позиционировать в одном из следующих уроков.
Ключевые выводы
Поздравляю! Вы создали мощный, интерактивный рабочий цикл для 3D-моделирования. Сегодня мы:
- Поняли роль вьювера в парадигме "Code-First CAD".
- Установили OCP CAD Viewer как зависимость для разработки.
- Научились отображать 3D-объекты из кода с помощью функции
show_object. - Настроили автоматическое обновление модели при сохранении файла, интегрировав
watchexecв рабочий процесс сtmuxиHelix.
Что дальше?
Теперь, когда у нас есть мгновенная визуальная обратная связь, мы готовы сделать наши модели по-настоящему гибкими. В следующем уроке мы перейдем к параметризации: заменим фиксированные числовые значения в коде на переменные. Это позволит нам легко изменять размеры модели, что является ключевым шагом на пути к созданию универсального корпуса для ваших устройств.