我正在尝试定义一个与多维数据集的面相同的数字blender属性,而不是手动对它们进行defyning。
这样的事情:
atr = bpy.types.Scene
for i in range(0,20):
//Define a intProperty to do stuffs.
并且在面板绘制功能中单独调用它们,是否可能?
答案 0 :(得分:0)
有两种方法可以在blender中为对象添加新属性。一种简单的动态方法是通过为键指定值来使用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定义"。要使用生成的属性名称执行此操作,意味着您要执行生成的一段代码。此方法创建一个true属性,您可以访问类定义中的其他属性 - 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)