Есть два способа добавить новые объекты к объектам в блендере. Простым динамическим способом является использование custom properties путем присвоения значения ключу, как если бы объектом был словарь. Это то же самое, что использовать панель пользовательских свойств в object properties. Чтобы получить это значение в сценарии вы продолжаете с помощью словаря стиль - obj['myprop0']
import bpy
obj = bpy.context.object
for i in range(0,20):
obj['myprop'+str(i)] = i
Более структурированный способ, который позволяет ввести проверку, так что вы можете, например, только присвоить Int свойству, которое добавить property to the object class definition, они также отображаются в панели настраиваемых свойств, но отображаются как «Определенный API». Чтобы сделать это с помощью сгенерированных имен свойств, вы хотите выполнить часть кода, который вы создаете. Этот метод создает истинное свойство, доступ к таким же, как и другие свойства в определении класса - obj.myprop0
import bpy
for i in range(0,20):
cmd = 'bpy.types.Object.myprop{} = bpy.props.IntProperty()'.format(i)
exec(compile(cmd, 'myprops', 'exec'))
Имейте в виду, что оба подхода занимают то же пространство имен, так что если вы используете то же имя свойства в обоих методах вы будете получить доступ к одному и тому же свойству, и оба способа отображения свойства будут работать. Определения bpy.props
переопределяют свойства стиля словаря.
Каждый подход к доступу осуществляется несколько иначе при отображении свойства в панели. Для свойства словарного стиля вы используете row.prop(obj,'["myprop'+str(i)+'"]')
, а при использовании bpy.props
вы используете row.prop(obj,'myprop'+str(i))
- обратите внимание, что в первом подходе вы используете имя свойства, содержащееся в []
, как доступ к любому значению словаря.
import bpy
class myPanel(bpy.types.Panel):
"""Creates a Panel in the Object properties window"""
bl_label = "My properties Panel"
bl_idname = "OBJECT_PT_myprops"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "object"
def draw(self, context):
layout = self.layout
obj = context.object
row = layout.row()
row.label('dynamic properties')
for i in range(0,20):
row = layout.row()
row.prop(obj,'["myprop'+str(i)+'"]')
row = layout.row()
row.label('structured properties')
for i in range(0,20):
row = layout.row()
row.prop(obj,'myprop'+str(i))
bpy.utils.register_class(myPanel)
[Этот вопрос] (http://blender.stackexchange.com/q/54038/935) содержит примеры создания новых свойств. – sambler
Мне было интересно, как я могу создавать свойства в цикле, я посмотрел на вопрос, но я никак не могу найти ответ, любое предложение? – Fabrizio