发布时间:2019/10/17 16:50:39   更新时间:2020/07/31 19:49:20
本文官网地址:https://docs.blender.org/api/current/info_tips_and_tricks.html
本文基于Blender2.80。
提示:译解是指翻译和注解。【注解】是作者的一些个人解释,用【】符号括起来。
以下是编写脚本时可能会发现有用的各种建议。
其中一些只是脚本编写者可能未想到要与Blender一起使用的Python功能,另一些则是特定于Blender的。
编写Python脚本时,打开终端很有用,这不是内置的Python控制台,而是用于启动Blender的终端应用程序。
终端有3种主要用途,它们是:
* 您可以在print()脚本运行时看到的输出,这对于查看调试信息很有用。
* 错误回溯被完整地打印到终端上,这不会总是在Blender的用户界面中生成错误弹出窗口(取决于脚本的执行方式)。
* 如果脚本运行时间过长,或者您不小心输入了无限循环, Ctrl-C则终端(Ctrl-Break在Windows上)将提前退出脚本。
注意
对于Linux和macOS用户,这意味着首先启动终端,然后从终端中运行Blender。在Windows上,可以从帮助菜单启用终端。
您可能已经注意到,菜单项和按钮的工具提示包括bpy.ops.[...])运行该按钮的命令,一个方便的(隐藏)功能是您可以按Ctrl-C任意菜单项/按钮,以将该命令复制到剪贴板中。
查找从ID数据块到其设置的路径并不总是那么简单,因为它可能被嵌套了。要快速获得此权限,您可以右键单击该设置,然后选择“ 复制数据路径”,如果无法生成,则仅复制属性名称。
注意
这使用bpy.types.FCurve.data_path与 bpy.types.DriverTarget.data_path驱动程序相同的方法来创建动画路径 。
Blender将操作员记录在“信息”空间中时,这只会报告带有REGISTER选项enabeld的运算符,以免调用bpy.ops.view3d.smoothview和bpy.ops.view3d.zoom淹没信息视图。
但是,对于测试而言,查看终端中调用的每个运算符可能很有用,可以通过启用调试选项来实现此目的,方法是--debug-wm在启动Blender时传递参数,或者在Blender运行时将其设置bpy.app.debug_wm为True。
Blenders文本编辑器适用于较小的更改和编写测试,但它不具有完整功能,对于大型项目,您可能需要使用独立的编辑器或Python IDE。
在外部编辑文本文件并在Blender中打开相同的文本确实可以,但并不是最佳选择,因此您可以通过以下两种方式轻松使用Blender中的外部文件。
使用以下示例,您仍将需要Blender中的textblock来执行,但要引用一个外部文件而不是直接包含它。
这等效于直接运行脚本,从2行文本块引用脚本路径。
filename = "/full/path/to/myscript.py"
exec(compile(open(filename).read(), filename, 'exec'))
您可能要引用相对于blend文件的脚本。
import bpy
import os
filename = os.path.join(os.path.dirname(bpy.data.filepath), "myscript.py")
exec(compile(open(filename).read(), filename, 'exec'))
此示例显示了将脚本作为模块加载并执行模块功能。
import myscript
import importlib
importlib.reload(myscript)
myscript.main()
请注意,每次都会重新加载脚本,这会强制使用修改后的版本,否则将使用缓存的版本,sys.modules直到Blender重新启动。
这和直接执行脚本之间的重要区别在于,它必须在模块中调用一个函数,在这种情况下main(),它可以是任何函数,它的一个优点是您可以从这个小脚本中将参数传递给函数用于快速测试不同的设置。
与此相关的另一个问题是脚本必须位于Pythons模块的搜索路径中。虽然这不是最佳实践-为了进行测试,您可以扩展搜索路径,但是本示例将当前的blend文件目录添加到搜索路径,然后将脚本作为模块加载。
import sys
import os
import bpy
blend_dir = os.path.dirname(bpy.data.filepath)
if blend_dir not in sys.path:
sys.path.append(blend_dir)
import myscript
import importlib
importlib.reload(myscript)
myscript.main()
在开发自己的脚本时,Blenders接口可能会妨碍您的工作,手动重新加载,运行脚本,打开文件导入等会增加开销。
对于非交互式脚本,最终完全不使用Blenders界面,而是在命令行上执行脚本,可能会更有效率。
blender --background --python myscript.py
您可能要使用blend文件来运行此文件,以便脚本具有一些可操作的数据。
blender myscene.blend --background --python myscript.py
注意
根据您的设置,您可能必须输入Blender可执行文件的完整路径。
一旦脚本在后台模式下正常运行,您将需要检查脚本的输出,这完全取决于手头的任务,但是这里有一些建议。
* 将输出呈现为图像,使用图像查看器,并每次都覆盖同一图像。
* 保存新的吧blend文件,或使用Blenders导出器之一导出文件。
* 如果结果可以显示为文本-打印它们或将其写入文件。
虽然这可能需要一些时间来设置,但减少测试变更所花费的时间还是值得的-您甚至可以让Blender每隔几秒钟运行一次脚本,并由查看器更新结果,因此无需离开您的文本编辑器以查看更改。
当没有可用的Python模块来执行特定任务时,请记住,您可以让Python对数据执行外部命令并读回结果。
使用外部程序会增加额外的依赖性,并且可能会限制谁可以使用该脚本,但是要快速设置自己的自定义管道或编写一次性脚本,这会很方便。
示例包括:
* 以批处理模式运行Gimp以执行自定义脚本以进行高级图像处理。
* 编写3D模型以使用外部网格处理工具并读回结果。
* 阅读之前将文件转换为可识别的格式。
从blender.org发行的Blender版本在所有平台上都包含完整的Python安装,这具有以下缺点:Blender找不到系统中安装的任何扩展。
有两种解决方法:
* 删除Blender Python子目录,然后Blender将退回到系统Python上并使用它。
根据您的平台,您可能需要使用PYTHONPATH环境变量来显式引用Python安装的位置 ,例如:
PYTHONPATH=/usr/lib/python3.5 ./blender
警告
Python版本必须与Blender随附的版本匹配。
* 将扩展复制或链接到Blender的Python子目录中,以便Blender可以访问它们,也可以将整个Python安装复制到Blenders子目录中,以替换一个Blender。只要Python版本匹配且在相同的相对位置创建路径,此方法就起作用。这样做的好处是,您可以使用Blender将此捆绑包重新分发给其他人,包括您依赖的任何扩展。
在脚本中间,您可能需要检查一些变量,运行一些函数,并通常进行深入研究以了解发生了什么情况。
import code
code.interact(local=locals())
如果要访问全局变量和局部变量,请执行此操作…
import code
namespace = globals().copy()
namespace.update(locals())
code.interact(local=namespace)
下一个示例是上面脚本的等效单行版本,可以更轻松地粘贴到您的代码中:
__import__('code').interact(local=dict(globals(), **locals()))
code.interact 可以在脚本的任何行中添加,并会暂停脚本并在终端中启动交互式解释器,完成后,您可以退出解释器,脚本将继续执行。
如果安装了IPython,则可以使用其embed()功能,该功能使用当前的名称空间。IPython提示具有自动完成功能和一些标准Python eval循环所没有的有用功能。
import IPython
IPython.embed()
诚然,这突显了Blender内置的任何Python调试支持的不足,但是仍然很容易知道。
从Python的角度来看,最好将所有内容都作为扩展,使Python脚本可以组合许多组件。
优势包括:
* 您可以将外部编辑器/ IDE与Blenders Python API结合使用,并在IDE中执行脚本(跳过代码,在脚本运行时检查变量)。
* 编辑者/ IDE可以自动完成Blender模块和变量。
* 现有脚本可以导入Blender API,而无需在Blender中运行。
标记为“高级”是因为将Blender作为Python模块运行需要特殊的构建选项。
有关构建的说明,请参见将 Blender构建为Python模块
由于可以访问已删除的数据(请参阅Gotcha的数据),因此很难确定崩溃的原因。
要在访问释放的数据(而不是崩溃)时引发Python异常,请启用CMake build选项WITH_PYTHON_SAFETY。
这样可以进行数据跟踪,从而使数据访问速度降低约2倍,这就是为什么在发行版本中未启用该选项的原因。