Создание панелей для размещения интерфейса пользователя (UI) в аддонах Blender

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

Весь доступный интерфейс пользователя Blender располагается на панелях, три из которых используются в работе чаще всего. Это T-панель — открывается и скрывается по нажатию клавиши t, N-панель — открывается и скрывается по нажатию на клавишу n, и панель свойств Properties — вызывается в главном меню любого окна выбором его типа как Properties.

API Blender предоставляет возможность определить свою пользовательскую панель для размещения кнопок вызова функционала аддона в любой из этих главных панелей.

Рассмотрим размещение кнопок вызова функционала на примере простейшего демонстрационного аддона, который добавляет в сцену куб. Тот самый дефолтный куб, должна же от него быть хоть какая-то польза ).

Код такого аддона выглядит следующим образом:

В данном примере мы взяли системный оператор bpy.ops.mesh.primitive_cube_add() и обернули его вызов в собственный класс, сделав его собственным оператором.

Функционал уже нашего оператора можно вызывать, открыв окно Python Console и набрав команду bpy.ops.mesh.add_cube_sample(). Но, конечно, это неудобно.

Добавим в каждую из основных панелей Blender собственные панели, на которых разместим кнопки вызова нашего аддона. Всего создадим 4 панели — две в разных областях T-панели, одну в N-панели и одну в одной из вкладок окна Properties — вкладке Render.

Размещение панелей для вызова функций пользовательского аддона
Размещение панелей для вызова функций пользовательского аддона

Как и пользовательские операторы, панели в API Blender создаются в форме классов. Классы панелей необходимо наследовать от bpy.types.Panel.

Внутри класса-панели необходимо переопределить родительскую функцию draw, которая отвечает за вывод панели. Функция draw выполняется в момент регистрации класса функцией register_class. Внутри функции draw необходимо заполнить объект layot структурой выводимого на панель интерфейса: кнопками, полями, переключателями, всем тем, что нужно для работы аддона.

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

Как и для операторов, внутри класса-панели необходимо определить константу — идентификатор класса с предопределенным именем bl_idname. Текстовая переменная bl_label служит для хранения текста с заголовком панели.

Для определения места, где будет располагаться панель в интерфейсе Blender служат еще несколько переменных с предопределенными именами, которые нужно определить внутри класса панели:

  1. bl_space_type
    • Указывает на пространство (по сути — на окно), где будет расположена панель. Может принимать следующие значения: EMPTY, VIEW_3D, TIMELINE, GRAPH_EDITOR, DOPESHEET_EDITOR, NLA_EDITOR, IMAGE_EDITOR, SEQUENCE_EDITOR, CLIP_EDITOR, TEXT_EDITOR, NODE_EDITOR, LOGIC_EDITOR, PROPERTIES, OUTLINER, USER_PREFERENCES, INFO, FILE_BROWSER, CONSOLE.
  2. bl_region_type
    • Указывает регион внутри пространства, в котором будет размещаться панель. Может принимать значения: WINDOW, HEADER, CHANNELS, TEMPORARY, UI, TOOLS, TOOL_PROPS, PREVIEW.
  3. bl_context
    • Указывает контекст размещения панели.
  4. bl_category
    • Указывает на группу размещения панели.

Пользуясь перечисленными правилами создадим 4 класса для размещения пользовательских панелей в нужных местах. На всех панелях выведем одну кнопку, привязанную к вызову созданного ранее оператора с идентификатором add_cube_sample.

  1. T-панель, область инструментов:

Для bl_space_type укажем пространство ‘VIEW_3D’ — окно 3D View. Регионом служит Т-панель, область инструментов, поэтому в bl_region_type укажем ‘TOOLS’. Если размещать нашу панель на одной из уже имеющихся системных вкладок, в качестве категории нужно указать эту вкладку, например ‘Tools’ — верхняя вкладка Tools с кнопками основных инструментов моделирования. Или же можно создать свою вкладку, если указать не предопределенное значение категории.

Класс требуемой панели выглядит следующим образом:

  1. T-панель, область свойств:

Все так же, как и для области инструментов T-панели, только в качестве региона нужно указать ‘TOOLS_PROPS’. Категорию указывать не нужно.

  1. N-панель

Регион — ‘UI’.

  1. Окно Properties, для примера используем вкладку Render.

Пространство — ‘PROPERTIES’, регион — ‘WINDOW’, а чтобы определить вкладку, нужно указать контекст — ‘render’ (строчными буквами).

Классы для панелей готовы.  Для того, чтобы панели корректно создавались и удалялись в момент инициализации аддона и при его завершении, проведем их регистрацию внутри функции register и разрегистрацию в unregister.

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

Полный текст демонстрационного аддона: