Создание переключателя Radiobutton в интерфейсе аддона Blender

Переключатели состояний или так называемые Radio button — «радиокнопки» используют в случае, если нужно ограничить выбор какого-либо значения одним вариантом из нескольких имеющихся. В интерфейсе Blender есть множество подобных кнопок, например переключение между цветным и черно-белым режимами рендера или назначение режима маппинга текстуры к объекту. Подобные кнопки можно создавать и в интерфейсе разрабатываемых для Blender аддонов.

Рассмотрим, как можно создать свою собственную кнопку-переключатель с выбором одного из нескольких заданных значений.

Для начала нужно определить доступный для выбора список значений.

Например мы хотим поворачивать выделенные объекты сцены на 15, 30, 60, 90 и 120 градусов по часовой и против часовой стрелки, а выбор угла и направления поворота предоставить пользователю через наборы радиокнопок.

Каждый набор будущих радиокнопок нужно определить как перечислимое свойство EnumProperty и заполнить его нужными данными.

Для углов поворота:

Здесь мы определили перечислимое свойство EnumProperty с именем angles, каждый элемент которого представляет собой кортеж, имеющий следующий формат:

(уникальный идентификатор, название свойства, описание свойства, идентификатор иконки, порядковый номер)

На радиокнопке, созданной по такому перечислимому свойству,  будет отображено название и иконка, а также описание при наведении на нее курсора мышки.

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

Параметр default задается равным идентификатору значения, которое будет выбрано по молчанию. В данном случае «15» градусов.

По аналогии создадим перечислимое свойство для выбора направления поворота:

Мы задали два элемента для вращения по и против часовой стрелки. Пустое название означает, что на кнопке не будет выводится текст, а только иконка в соответствии с указанным идентификатором.

Для того, чтобы созданные перечислимые свойства стали доступны API Blender их нужно обернуть в класс, наследующий от PropertyGroup

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

В функции unregister нужно подчистить за собой, удалив созданную переменную и разрегистрировав класс:

Создадим класс-оператор, который будет осуществлять поворот выделенных объектов.

Угол поворота мы получаем из зарегистрированой ранее переменой interface_vars через context.window_manager.interface_vars.angles, направление поворота — через context.window_manager.interface_vars.direction. Переменная возвращает идентификатор текущего выделенного элемента. Вращение производится вокруг оси Z.

Создадим в окне 3D_View в T-панели подпанель, на которой разместим созданный интерфейс.

Через context.window_manager.interface_vars с указанием конкретного свойства (angles и direction) наборы кнопок выводятся на панель. Параметр expand = True указывает на то, что кнопки нужно выводить в виде радиокнопок, а не выпадающего списка.

Класс для вращения и класс панели так же необходимо зарегистрировать в API.

Полный код:

После выполнения скрипта можно вращать выделенные объекты в соответствии с задаваемыми условиями.