Мы можем привязывать к кнопкам на панели инструментов (T-Панель) не только системные операторы, но и пользовательские, созданные нами. Принцип подключения в Blender Python API – одинаковый, как для системных, так и для пользовательских операторов.
Для примера определим пользовательский оператор, добавляющий в сцену UV-Сферу в случайное место в пределах от 0 до 10.
1 2 3 4 5 6 7 8 9 10 |
class TEST_OT_test(bpy.types.Operator): bl_idname = 'test.test' bl_label = 'TEST' bl_options = {'REGISTER'} def execute(self, context): bpy.ops.mesh.primitive_uv_sphere_add( location=(random.uniform(0, 10), random.uniform(0, 10), random.uniform(0, 10)) ) return {'FINISHED'} |
Внутри функции execute() мы вызываем оператор добавления сферы в сцену, указывая в параметре location рандомные координаты от 0 до 10, однако здесь может быть любой ваш код.
Зарегистрируем наш пользовательский оператор в Blender API.
1 |
bpy.utils.register_class(TEST_OT_test) |
Далее определим класс для инструмента и его кнопки в T-панели.
1 2 3 4 5 6 7 8 9 |
class TestTool(bpy.types.WorkSpaceTool): bl_space_type = 'VIEW_3D' bl_context_mode = 'OBJECT' bl_idname = 'test_tool.test_tool_select' bl_label = 'Call user operator' bl_icon = 'ops.mesh.primitive_sphere_add_gizmo' bl_keymap = ( ('test.test', {'type': 'LEFTMOUSE', 'value': 'CLICK'}, None), ) |
Здесь для нас самое главное – кортеж bl_keymap, в котором мы прописываем привязку операторов к данному инструменту, и назначаем условия их срабатывания.
В нашем bl_keymap только один элемент, тоже кортеж, состоящий из трех элементов. Первый элемент – здесь мы указываем bl_idname нашего пользовательского оператора. Вторым элементом мы задаем действие при котором указанный оператор будет выполнен – клик левой кнопкой мышки. Третий элемент служит для передачи параметров в оператор, он нам сейчас не нужен, поэтому ставим None.
Регистрируем класс нашего инструмента в Blender Python API.
1 |
bpy.utils.register_tool(TestTool, after={'builtin.scale_cage'}, separator=True, group=True) |
Вызовем принудительную перерисовку всех рабочих областей, чтобы кнопка сразу же отобразилась в панели инструментов.
1 2 |
for area in bpy.context.screen.areas: area.tag_redraw() |
Теперь, когда в панели инструментов выбран наш инструмент TestTool и пользователь кликает левой кнопкой мышки по экрану вьюпорта, при каждом клике будет вызываться наш пользовательский оператор test.test, в результате выполнения которого в участок сцены с координатами от 0 до 10 будет добавляться UV-Сфера.