Создаем кастомное окно в Blender при помощи PySide

Blender Python API предоставляет разработчикам аддонов достаточно широкие возможности в проектировании пользовательского интерфейса UI. Однако иногда встроенных возможностей Blender API может оказаться недостаточно. Создать полностью независимое от встроенного API окно с UI можно, подключив к Blender модуль PySide.

PySide не входит в дефолтный дистрибутив Blender, поэтому в первую очередь необходимо установить модуль PySide в Blender.

После успешной установки PySide давайте создадим для примера отдельное окно UI с кнопкой, по нажатию на которую в сцену будет добавляться какой-нибудь дефолтный меш.

Откроем текстовый редактор в Blender и начнем проектировать класс, отвечающий за создание и функционирование такого окна.

Мы определили класс MainWindow, а так же стандартную функцию __init__() внутри него. Эта функция будет вызвана самой первой при создании нашего окна UI.

Дополним функцию __init__() следующим кодом:

Здесь мы задаем для нашего окна режим отображения “всегда поверх всех остальных окон” и устанавливаем ширину окна равной 300 пикселей.

Добавим на форму нашего окна виджет wiget а для него определим макет layout, на котором мы далее сможем размещать различные элементы интерфейса (кнопки и т.п.).

Теперь создадим собственно кнопку для добавления меша в сцену.

Здесь мы создаем кнопку с лейблом “Add UVSphere”, устанавливаем для нее размеры 280 на 50 пикселей и помещаем ее на созданный ранее макет layout.

В третьей строке мы назначаем на кнопку обработчик нажатия, и связываем его с вызовом функции button_pressed(). Саму функцию мы распишем чуть позже.

Добавим так же пример обратной связи сцены Blender с нашим окном – сделаем так, чтобы в заголовке нашего окна всегда выводилось имя текущего активного объекта сцены.

Проще всего организовать обратную связь через вызов таймера.

Здесь мы определяем таймер, который будет срабатывать через каждые 100 миллисекунд и вызывать функцию update().

Полный код нашей функции __init__():

Перейдем к описанию функции, которая будет вызываться при нажатии на кнопку.

В первой строке мы определяем простой счетчик, который мы будем использовать для сдвига каждого нового добавляемого в сцену объекта вправо по оси X.

Далее мы вызываем оператор primitive_uv_sphere_add() из Blender API, который добавляет в сцену UV-сферу. В параметре location мы устанавливаем сдвиг на 2 единицы по оси X в соответствии с текущим значением счетчика.

Так как вызов оператора осуществляется из внешнего окна, не связанного с активным 3D вьюпортом, его нужно производить с переопределением контекста при помощи temp_override(), передавая в параметрах указатель на активное окно 3D вьюпорта.

В последней строке мы просто увеличиваем счетчик для учета сдвига меша при последующих нажатиях пользователем на кнопку.

Еще нам осталось определить функцию update(), которая вызывается по установленному таймеру и копирует в заголовок окна имя активного объекта сцены.

Чтобы получить имя активного объекта bpy.context.active_object.name, нам все так же нужно использовать temp_override() для указания на контекст 3D вьюпорта.

Последняя функция в нашем классе:

Будет отвечать за обработку закрытия окна – удаление созданного вначале таймера и очистку стека событий.

После того как мы полностью определили класс для нашего кастомного окна, мы можем создать экземпляр этого окна и отобразить его на экране.

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

Теперь окно отобразится на экране, а при нажатии на кнопку “Add UVSphere” в сцену Blender будет добавляться объект UVSphere, сдвигая каждую следующую сферу на 2 единицы вправо.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии