[英]How do I get a Blender exporter script to run from the command line?
我试图将一些来自blender的对象导出为专有格式。 我希望我编写的脚本能够从文件下拉列表和命令行从blender导出对象。 我在ubuntu 12.04 LTS上使用了搅拌机2.66。 下面是我目前正试图运行的文件。
# Required Blender information.
bl_info = {
"name": "My Exporter",
"author": "",
"version": (1, 0),
"blender": (2, 65, 0),
"location": "File > Export > Test (.tst)",
"description": "",
"warning": "",
"wiki_url": "",
"tracker_url": "",
"category": "Import-Export"
}
# Import the Blender required namespaces.
import bpy
from bpy_extras.io_utils import ExportHelper
# The main exporter class.
class MyExporter(bpy.types.Operator, ExportHelper):
bl_idname = "test.tst";
bl_label = "My Exporter";
bl_options = {'PRESET'};
filename_ext = ".tst";
object_count = 0;
def __init__(self):
pass
def execute(self, context):
print("Execute was called.");
# Parse all the objects in the scene.
return {'FINISHED'};
def export_object(self, gameObject):
if (gameObject.type != "MESH"):
print("Object was not of type mesh.");
else:
object_count += 1;
return;
# Define a function to create the menu option for exporting.
def create_menu(self, context):
self.layout.operator(MyExporter.bl_idname,text="test (.tst)");
# Define the Blender required registration functions.
def register():
"""
Handles the registration of the Blender Addon.
"""
bpy.utils.register_module(__name__);
bpy.types.INFO_MT_file_export.append(create_menu);
def unregister():
"""
Handles the unregistering of this Blender Addon.
"""
bpy.utils.unregister_module(__name__);
bpy.types.INFO_MT_file_export.remove(create_menu);
# Handle running the script from Blender's text editor.
if (__name__ == "__main__"):
print("Registering.");
register();
print("Executing.");
# I have tried with these lines uncommented to force it to run
# the execute function, but I get an error saying:
# exporter = MyExporter();
# TypeError: bpy_struct.__new__(type): expected a single argument
#exporter = MyExporter();
#exporter.execute(bpy.context.scene);
我尝试了以下命令:
blender model.blend --background --python myexporter.py
从中我得到以下输出:
Note: No (valid) '~/.config/blender/2.66/config/startup.blend' found,
fall back to built-in default.
Read new prefs: ~/.config/blender/2.66/config/userpref.blend
found bundled python: ~/blender/2.66/python
read blend: ~/model.blend
Registering.
Executing.
Blender quit
似乎永远不会调用MyExporter类的execute函数。 我甚至尝试直接调用execute函数,但如果你阅读上面那个区域的注释,我似乎也错过了那里的东西。
将脚本作为附加组件添加到blender时,一切正常。 它完美地调用执行。 所以至少我有一半的工作。
提前感谢您提供给我的任何帮助。 如果我犯了一个愚蠢的错误,我道歉,我在写这个脚本的同时学习python。
我终于弄明白这一点,并认为回来分享答案是个好主意。 首先,这是有效的文件。
# Required Blender information.
bl_info = {
"name": "My Exporter",
"author": "",
"version": (1, 0),
"blender": (2, 65, 0),
"location": "File > Export > Test (.tst)",
"description": "",
"warning": "",
"wiki_url": "",
"tracker_url": "",
"category": "Import-Export"
}
# Import the Blender required namespaces.
import sys, getopt
import bpy
from bpy_extras.io_utils import ExportHelper
# The main exporter class.
class MyExporter(bpy.types.Operator, ExportHelper):
bl_idname = "export_scene.my_exporter";
bl_label = "My Exporter";
bl_options = {'PRESET'};
filename_ext = ".tst";
object_count = 0;
def __init__(self):
pass
def execute(self, context):
print("Execute was called.");
self.parse_command_line_options();
if (self.filepath == ""):
print("No sutable filename was provided to save to.");
return {'FINISHED'};
# Get all the mesh objects in the scene.
objList = [object for object in bpy.context.scene.objects if object.type == 'MESH'];
# Now process all the objects that we found.
for gameObject in objList:
self.export_object(gameObject);
# Parse all the objects in the scene.
return {'FINISHED'};
def export_object(self, gameObject):
if (gameObject.type != "MESH"):
print("Object was not of type mesh.");
else:
self.object_count += 1;
return;
def parse_command_line_options(self):
modelFile = "";
myArgs = [];
argsStartPos = 0;
if (("--" in sys.argv) == False):
return;
argsStartPos = sys.argv.index("--");
argsStartPos += 1;
myArgs = sys.argv[argsStartPos:];
try:
opts, args = getopt.getopt(myArgs, 'hm:', ["help", "model-file="]);
except getOpt.GetoptError:
print("Opt Error.");
return;
for opt, arg in opts:
if (opt in ("-h", "--help")):
print("Run this as the following blender command.");
print("\tblender <blend file> --background --python <script file> -- -m <output file>");
elif (opt in ("-m", "--model-file")):
modelFile = arg;
if (modelFile != ""):
self.filepath = modelFile;
# Define a function to create the menu option for exporting.
def create_menu(self, context):
self.layout.operator(MyExporter.bl_idname,text="test (.tst)");
# Define the Blender required registration functions.
def register():
"""
Handles the registration of the Blender Addon.
"""
bpy.utils.register_module(__name__);
bpy.types.INFO_MT_file_export.append(create_menu);
def unregister():
"""
Handles the unregistering of this Blender Addon.
"""
bpy.utils.unregister_module(__name__);
bpy.types.INFO_MT_file_export.remove(create_menu);
# Handle running the script from Blender's text editor.
if (__name__ == "__main__"):
print("Registering.");
register();
print("Executing.");
bpy.ops.export_scene.my_exporter();
我错过的关键是错误地为我的导出器类设置bl_idname,然后调用bpy.ops.export_scene.my_exporter();
有关我搞砸了的更多信息,请访问: http : //www.blender.org/documentation/blender_python_api_2_66_release/bpy.ops.html
既然我也希望从命令行运行而不仅仅是文件下拉菜单,我添加了一个解析函数来解析发送给Blender的命令行选项。 Blender有一个开关' - ',它定义了blender参数输入的结束,所以如果检测到那个开关,那么我会在它之后获取任何参数并将它们解析为我的脚本参数。 到目前为止,这似乎完美无缺。
目前,模型文件支持-h打印一些帮助信息,-m指定用于保存转换数据的文件。
好吧,我希望这些信息可以帮助其他人。 祝好运。
更新:如果在运行脚本时在命令行中看到如下所示的一条或多条消息,请使用此问题的答案来解决该问题。
skipping driver 'alpha * auto', automatic scripts are disabled
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.