在循环中定义搅拌器属性
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)
我正在尝试定义一个数字搅拌器 属性,它与立方体的表面相同,无需手动定义它们。
所以像这样:
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)