在循环中定义搅拌器属性

Define blender Propertys in a Cycle

我正在尝试定义一个数字搅拌器 属性,它与立方体的表面相同,无需手动定义它们。

所以像这样:

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

并且在面板绘制函数中分别调用它们,可以吗?

有两种方法可以在 Blender 中为对象添加新属性。一个简单的动态方法是使用 custom properties by assigning a value to a key as if the object was a dictionary. This is the same as using the custom properties panel in the 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 Defined"。使用生成的 属性 名称执行此操作意味着您要执行一段您生成的代码。此方法创建一个真正的 属性,您可以访问与 class 定义中的其他属性相同的属性 - 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'))

请注意,这两种方法占用相同的命名空间,因此如果您在两种方法中使用相同的 属性 名称,您将访问相同的 属性 以及显示 [=32] 的两种方法=] 将工作。 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)