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

OCP CAD Viewer: Интеграция с tmux и Helix

Здравствуйте! В предыдущем уроке мы успешно настроили проект с build123d и uv, написав скрипт, который создаёт объект Box в памяти компьютера. Однако мы пока не могли его увидеть. Сегодня мы это исправим.

Цель этого урока — интегрировать 3D-вьювер в ваш рабочий процесс. Мы установим OCP CAD Viewer и настроим его так, чтобы он автоматически обновлял модель при каждом сохранении кода в Helix. Это позволит создать удобный и эффективный цикл разработки, который идеально впишется в вашу рабочую связку tmux и Helix.

Парадигма "Code-First" и роль вьювера

build123d работает по принципу "Code-First CAD": вы описываете геометрию кодом на Python, а затем программа генерирует на его основе 3D-модель. Такой подход требует отдельного инструмента для визуализации результата. OCP CAD Viewer — это легковесный, работающий в браузере вьювер, который стал стандартом для build123d и его "родителя" CadQuery.

Он позволяет не только просматривать модель, но и инспектировать ее: измерять расстояния, видеть иерархию объектов и управлять отображением.

OCP CAD Viewer Interface with Fox Model and Text Overlay
Интерфейс OCP CAD Viewer. Слева — дерево объектов, справа — инструменты, в центре — сама 3D-модель.

Установка и первый запуск

Вьювер является пакетом Python, который мы установим как зависимость для разработки.

  1. Установите ocp-cad-viewer:
    В терминале, находясь в директории вашего проекта (b3d-enclosures), выполните:

    uv add ocp-cad-viewer --dev
    

    Как и в прошлый раз, uv добавит пакет в ваше виртуальное окружение и зафиксирует его в файле pyproject.toml, но на этот раз в секции [tool.uv.dev-dependencies], так как вьювер нужен только на этапе разработки.

  2. Модифицируйте скрипт для отображения объекта:
    Откройте файл 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.

  3. Запустите скрипт:
    Выполните в терминале:

    uv run lesson1_box.py
    

    В вашем браузере по умолчанию должна открыться новая вкладка с адресом http://127.0.0.1:5000, где вы увидите свой куб. Сервер, запущенный скриптом, будет активен, пока вы не остановите его (Ctrl+C).

Этот подход работает, но он неудобен: после каждого изменения в коде нужно останавливать сервер, запускать скрипт заново и, возможно, обновлять страницу в браузере. Далее мы это автоматизируем.

Автоматизация рабочего процесса в tmux

Ваша связка tmux и Helix идеально подходит для создания интерактивного рабочего процесса. Мы настроим его так, чтобы при сохранении файла в Helix модель в браузере обновлялась автоматически. Для этого нам понадобится утилита для отслеживания изменений в файлах. Рекомендую использовать watchexec — это современный и быстрый инструмент, написанный на Rust, вполне в духе uv.

  1. Установка watchexec (если не установлен):
    В Ubuntu/Debian его можно установить через apt:

    sudo apt update
    sudo apt install watchexec
    

    Или, если у вас установлен cargo, через него: cargo install watchexec-cli.

  2. Настройка tmux:
    Предлагаю следующую конфигурацию панелей tmux:

    • Левая панель: Редактор Helix.
    • Правая панель: watchexec, который будет следить за файлом и перезапускать скрипт.

    Пошаговая инструкция:

    1. Запустите tmux.
    2. В первой панели откройте ваш файл для редактирования: hx lesson1_box.py.
    3. Разделите окно вертикально: нажмите Ctrl+b, затем %.
    4. В новой правой панели выполните команду:
      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 так, чтобы он отображал два объекта одновременно:

  1. Основной бокс размером 30x30x10.
  2. Второй, маленький бокс размером 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.

Что дальше?

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

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

Sign up