目标
我想尝试在一个Windows窗口中启动blender之后运行一个脚本。在之前的博客中已经说明了如何创建一个能启动其他程序的Windows窗口。
这个测试脚本的功能是对模型进行细分,最终程序的效果如下:
Test.obj
Test_high.obj
实践步骤以及问题
1.python脚本参数
整体步骤很简单,但是有一点需要注意的是传参数的问题
关于blender的启动参数,官方文档有说明。其中说明了--python
可以启动python脚本。但问题是,python脚本也需要参数。
一开始,我尝试在--python
后跟的python文件名后接上python脚本的参数,然后在python脚本中用fileName = sys.argv[1]
获取。可惜失败了。
之后,我查到有其他人也在关注这个问题(https://www.it1352.com/328534.html)。并且给出了正确的格式:
启动时:
blender -b "demo.blend" -P script.py -- 50
其中50是给python脚本的参数。
然后,在python脚本中:
fov = float(sys.argv[-1])
它使用了下标-1,表示最后一个参数。
我尝试使用了它,成功了。不过关于这个格式还有待更进一步的研究。
2.python脚本如下:
import bpy
import sys
fileName = sys.argv[-1]
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
bpy.ops.import_scene.obj(filepath=fileName)
view_layer = bpy.context.view_layer
bpy.ops.object.select_all(action="SELECT")
selection = bpy.context.selected_objects
for obj in selection:
view_layer.objects.active = obj
bpy.ops.object.editmode_toggle()
bpy.ops.mesh.subdivide(number_cuts=3, smoothness=0.5)
bpy.ops.export_scene.obj(filepath=fileName.replace(".obj","_high.obj"))
它做的事就是导入一个模型,执行bpy.ops.mesh.subdivide
操作,之后导出。
3.C#代码中按钮的回调函数如下:
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
//标题
dialog.Title = "选择obj模型";
//过滤器
dialog.Filter = "Obj文件(*.obj)|*.obj";
//检测是否存在
dialog.CheckFileExists = true;
if (dialog.ShowDialog() == DialogResult.OK)//成功打开:
{
string MeshPath = System.IO.Path.GetFullPath(dialog.FileName);//获得模型路径
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "C:/Program Files/Blender Foundation/Blender 2.81/blender.exe"; //程序exe路径,这里暂时写死
process.StartInfo.Arguments = "--background --python D:/Temp/HighRez2.py -- " + MeshPath; //启动参数,暂时硬编码python脚本路径
process.Start();
}
}
值得优化的部分是:
3.1.blender程序路径
这里是写死的,理想状态下应该能从注册表中获取,只是我这里没有能从注册表中找到blender的安装路径。如果找不到,那提供一个配置文件来指明本机的blender安装路径也是个解决方法。
3.2.脚本路径
这里是写死的绝对路径,如果要做正式的工具,可能会协同exe放在一起并使用相对路径,又或者有配置文件。