在Cycle中定义blender Propertys

时间:2016-08-26 11:08:36

标签: python properties blender

我正在尝试定义一个与多维数据集的面相同的数字blender属性,而不是手动对它们进行defyning。

这样的事情:

atr = bpy.types.Scene
for i in range(0,20):
    //Define a intProperty to do stuffs.

并且在面板绘制功能中单独调用它们,是否可能?

1 个答案:

答案 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)