В Blender API рекомендуется задавать дополнительные свойства для объектов через классы, предопределенные в bpy.props. Например для добавления целочисленного свойства используется класс bpy.props.IntProperty. Такие свойства удобны, хорошо работают и легко выносятся на панели пользовательского интерфейса.
Однако они регистрируются в bpy.types и новое свойство становится доступным сразу для всех объектов определенного типа, а не только для какого-то конкретного объекта. Иногда, при написании скрипта, гораздо удобнее добавить нужное динамическое свойство только одному или нескольким конкретным объектам в сцене.
Такое динамическое свойство добавляется к объекту очень просто – например, добавим целочисленное свойство с именем “dynamic_prop1” текущему активному объекту и присвоим ему значение 35.
1 |
bpy.context.active_object['dynamic_prop1'] = 35 |
Теперь мы можем обращаться к этому свойству объекта в коде скрипта:
1 2 |
bpy.context.active_object['dynamic_prop1'] # 35 |
Однако, если мы попытаемся вынести его на пользовательскую панель привычным образом,
1 2 3 4 5 6 |
class TEST_PT_panel(Panel): def draw(self, context): self.layout.prop( data=context.active_object, property='dynamic_prop1' ) |
Blender выдаст ошибку:
RnaUiIremR: property not found: Object.dynamic_prop1
Для того, чтобы вывести такое свойство на пользовательскую панель, нужно немного изменить формат записи имени свойства в параметре “property” функции “prop”. Имя динамического свойства нужно записать в квадратных скобках и взять в кавычки:
1 2 3 4 5 6 |
class TEST_PT_panel(Panel): def draw(self, context): self.layout.prop( data=context.active_object, property='["dynamic_prop1"]', ) |
В этом случае динамическое свойство будет корректно отрисовано на панели, и его можно будет менять через пользовательский интерфейс.
*.blend файл с примером выноса динамического свойства объекта на пользовательскую панель