blender bpy监听数值变化的4种方法
适用于blender≥4.5.0
bpy.app.handlers
https://docs.blender.org/api/current/bpy.app.handlers.html#bpy.app.handlers.depsgraph_update_post
如加载文件等hooks可以用这个。
def on_update(scene, depsgraph): ... # 监听依赖图更新
def register():
bpy.app.handlers.depsgraph_update_post.append(on_update)
def unregister():
bpy.app.handlers.depsgraph_update_post.remove(on_update)
消息总线 bpy.msgbus.subscribe_rna
https://docs.blender.org/api/current/bpy.msgbus.html#bpy.msgbus.subscribe_rna
当app.handers无效时使用。频繁会变动的属性(如当前选择的物体active_obj)就会用到这个。
OWNER = object()
def on_change(): ...
@bpy.app.handlers.persistent
def register_msgbus():
bpy.msgbus.clear_by_owner(OWNER)
bpy.msgbus.subscribe_rna(
key=(bpy.types.LayerObjects, "active"),
owner=OWNER,
args=(),
notify=on_change
)
def register():
bpy.app.handlers.load_post.append(register_msgbus)
def unregister():
bpy.app.handlers.load_post.remove(register_msgbus)
UI更改 bl_ui.space_toolsystem_common.item_from_id.handlers.set.append
https://archive.blender.org/developer/D10635
modal()
最复杂,最灵活,且modal在持续运行时会禁用自动保存。我用modal()+yield Gernator实现了一个暂停可恢复的Operator,用于耗时操作(如fk转ik)
class Operator(bpy.types.Operator):
def modal(self, context):
...

浙公网安备 33010602011771号