如何使用Python在Blender中读取自定义属性?

10

我希望能够在Blender的脚本模式下读取Blender对象的自定义属性。目前我只发现了在脚本模式下读取您自己创建的自定义属性的可能性。但是我想要读取我手动标记的自定义属性。这意味着我没有可用的局部变量。

我希望在以下上下文中实现此目的: 我正在循环遍历所有对象:

for obj in bpy.data.objects:
if not 'Camera' in obj.name and not 'Lamp' in obj.name and not 'Armature' in obj.name:
    #here I get the location of the current Object
    loc.append(obj.location)

现在完美的情况是,类似于以下内容:

obj.getCustomProperties

有没有一种方法可以使用Blender Python模式来完成这个任务?

谢谢, 丹尼尔


相关:这个 github 有一个Python脚本,可以从csv文件中读取数据,并更新网格的自定义属性。 - UberMario
1个回答

13

假设我们为对象“Cube”添加了一个名为“testprop”的自定义属性- 您可以在python中通过bpy.data.objects['Cube']['testprop']访问该属性。

如果您不知道属性名称,可以调用对象的keys()获取可用自定义属性列表。

这将导致以下内容打印自定义属性-

bad_obj_types = ['CAMERA','LAMP','ARMATURE']
for obj in bpy.data.objects:
    if obj.type not in bad_obj_types:
        if len(obj.keys()) > 1:
            # First item is _RNA_UI
            print("Object",obj.name,"custom properties:")
            for K in obj.keys():
                if K not in '_RNA_UI':
                    print( K , "-" , obj[K] )

您可能还注意到,我测试的是 obj.type 而不是 obj.name,因为 obj.name 可能会被用户更改,并且名称中可能存在数字扩展的多个项。


谢谢你,sambler!这个几乎完美地运行了。你给我的命令正好做到了我想要的。但是似乎对于自定义属性有一些要求,因为他不会为每个自定义属性执行此操作,或者如果没有一个符合要求,他甚至不会运行脚本。你知道这些要求吗? - Daniel Töws
1
哦,谢谢你的提示,检查对象类型比检查它们的名称更好;) - Daniel Töws
1
我认为你所指的是只有在添加了自定义属性时,_RNA_UI才存在。最好的做法是在for循环之前使用if hasattr(obj,'_RNA_UI'):进行检查。在执行任何操作之前,测试K的值也可能是值得的。例如:cycles_visibility是一个常见的属性,您可能想要跳过它。 - sambler
你可能已经发现 hasattr() 对于自定义属性不起作用。另外,从 obj['_RNA_UI'] 返回的列表会在删除后保留项名称。对于对象来说,keys() 函数可以列出自定义属性,并且是可靠的。 - sambler
@sambler,你能帮忙看一下这个吗:https://stackoverflow.com/documentation/blender?你不需要贡献,我们只需要再找一个人来提交。 - 10 Replies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接