12

我正在尝试为 Blender 2.73 创建一个自动构建系统,它读取具有大量路径的 XML 文件,一个一个地打开文件,然后呈现它们。

我正在使用以下代码打开:

bpy.ops.wm.open_mainfile("file_path")

我的问题是我收到以下错误:

Traceback (most recent call last):
  File "<blender_console>", line 1, in <module>
  File "<BLENDER_PATH>/scripts/modules/bpy/ops.py", line 186, in __call__
    ret = op_call(self.idname_py(), C_dict, kw, C_exec, C_undo)
TypeError: Calling operator "bpy.ops.wm.open_mainfile" error, expected a string enum in ('INVOKE_DEFAULT', 'INVOKE_REGION_WIN', 'INVOKE_REGION_CHANNELS', 'INVOKE_REGION_PREVIEW', 'INVOKE_AREA', 'INVOKE_SCREEN', 'EXEC_DEFAULT', 'EXEC_REGION_WIN', 'EXEC_REGION_CHANNELS', 'EXEC_REGION_PREVIE)
4

1 回答 1

18

您的操作员调用的问题是它不接受位置参数,您需要命名每个参数 -

bpy.ops.wm.open_mainfile(filepath="file_path")

Blender 一次只允许打开一个文件,当您打开另一个混合文件时,现有数据会从 ram 中刷新,这通常包括您正在运行的脚本。

如果您查看bpy.app.handlers,您可以设置一个持久的处理程序,因为它会在加载新的混合文件后保留在内存中。这可以让您在打开新的混合文件后运行您的代码。

import bpy
from bpy.app.handlers import persistent

@persistent
def load_handler(dummy):
    print("Load Handler:", bpy.data.filepath)

bpy.app.handlers.load_post.append(load_handler)

您可能还想考虑在搅拌机之外做主要工作,循环遍历每个文件并告诉搅拌机打开和渲染每个文件

blender --background thefile.blend -a

将根据混合文件中的设置渲染动画。

为了获得更多控制,您还可以指定打开混合文件后要运行的 python 脚本。这个问题可以为您扩展。

于 2015-01-22T07:42:45.760 回答