在一个容器中定义混合器属性

2024-09-26 18:17:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试定义一个数字混合器属性,该属性与立方体的面相同,而不需要手动对其进行解同步。你知道吗

比如说:

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

在面板绘制功能中分别调用它们,可以吗?你知道吗


Tags: toinfor属性定义range数字手动
1条回答
网友
1楼 · 发布于 2024-09-26 18:17:36

有两种方法可以向blender中的对象添加新属性。一种简单的动态方法是使用custom properties,将值赋给键,就像对象是字典一样。这与使用object properties中的自定义属性面板相同。要在脚本中访问此值,请继续使用dictionary样式-obj['myprop0']

import bpy
obj = bpy.context.object
for i in range(0,20):
    obj['myprop'+str(i)] = i

允许类型检查的一种更结构化的方法是添加property to the object class definition,它也显示在自定义属性面板中,但显示为“API Defined”。对生成的属性名执行此操作意味着您要执行生成的一段代码。此方法创建一个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定义覆盖字典样式属性。你知道吗

在面板中显示属性时,每种方法的访问方式略有不同。对于dictionary样式属性,您使用row.prop(obj,'["myprop'+str(i)+'"]'),而当使用bpy.props时,您使用row.prop(obj,'myprop'+str(i))—请注意,第一种方法使用的是[]中包含的属性名,就像访问任何dictionary值一样。你知道吗

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)

相关问题 更多 >

    热门问题