Для определения текущего активного объекта в сцене в Blender мы обычно используем контекст и его свойство context.object (или context.active_object). Точно так же и при работе с интерфейсом мы можем обратиться к контексту, чтобы получить текущее активное свойство – значение поля в Blender UI над которым мы позиционируем курсор или по которому мы сделали клик мышкой. Для этого служит свойство context.property.
Рассмотрим для примера, как можно получить значение текущего активного свойства из N-панели интерфейса Blender.
Для начала определим простейший класс для вывода в системную консоль значения context.property.
1 2 3 4 5 6 7 8 |
class TEST_OT_c_prop(bpy.types.Operator): bl_idname = 'test.c_prop' bl_label = 'Context Property' bl_options = {'REGISTER'} def execute(self, context): print(context.property) return {'FINISHED'} |
В исполняемой функции execute мы прописываем вывод в консоль значение context.property.
Зарегистрируем его в Blender Python API.
1 |
bpy.utils.register_class(TEST_OT_c_prop) |
При выполнении оператора будет использован текущий контекст, то есть контекст того элемента UI, над которым пользователь совершает текущее действие. Пусть, для примера, это будет вызов контекстного меню – которое открывается по клику правой кнопкой мышки.
Добавим в контекстное меню новый пункт, нажатие на который вызовет наш оператор. Для этого определим функцию extend_menu.
1 2 3 |
def extend_menu(self, context): self.layout.separator() self.layout.operator('test.c_prop') |
И добавим ее вызов в хендлер UI_MT_button_context_menu:
1 |
bpy.types.UI_MT_button_context_menu.append(extend_menu) |
Теперь при клике правой кнопкой мышки на поле любого свойства в N-панели в меню будет отображаться новый пункт “Context Property”.
При нажатии на этот пункт меню будет выполнен наш оператор.
Кликнем правой кнопкой мышки по свойству Location – X и выберем наш новый пункт “Context Property” в открывшимся меню. В системную консоль будет выведен следующий кортеж:
1 |
(bpy.data.objects['Suzanne'], 'location', 0) |
Первым элементом кортежа всегда будет ссылка на блок данных, которому принадлежит данное свойство.
На втором месте будет имя этого свойства.
А на третьем – порядковый индекс элемента, если свойство имеет тип массива.
Немного расширим выводимые нашим оператором данные, добавив в функцию execute еще несколько строчек:
1 2 3 4 5 6 7 8 9 |
def execute(self, context): print(context.property) print(getattr(context.property[0], context.property[1])) if context.property[2] != -1: print(getattr(context.property[0], context.property[1])[context.property[2]]) return {'FINISHED'} |
Здесь мы дополнительно получаем собственно данные активного свойства и, если оно имеет тип массива, конкретно значение текущего элемента.
Наш вывод в консоль теперь имеет следующий вид:
1 2 3 |
(bpy.data.objects['Suzanne'], 'location', 0) <Vector (0.8600, 1.3400, 1.4600)> 0.85999995470047 |