如何在工作区工具更改时运行bpy回调



如何将预绘制挂钩添加到当前上下文工作区。工具更改?

我试图使用bpy.types.SpaceView3D.draw_handler_add(...)到达那里,因为它在每次绘制时都会运行,检查workspace.tools是否更改,如果更改了,则运行我的回调,但我的回调想要添加自己的SpaceView3D.draw_handler_add,这样做会给它添加一个帧,太晚了,在用户事件重新绘制屏幕之前,不提取视图端口。

我在网上找到了这篇文章https://devtalk.blender.org/t/update-property-when-active-tool-changes/11467/12

总结:也许有一个主线回调newhttps://developer.blender.org/D10635

AFWS Jan'20

@kaio

这似乎是一个更好的解决方案。这是一个神秘的密码,因为我不知道你从哪里得到的代码信息,但随后开始查看space_toolsystem_common.py文件。kaio AFWS Jan’20

刚刚意识到可能有一种更干净的方式来获得使用msgbus的活动工具。由于工作区工具不是rna属性本身,认为可以监控bpy_prop_collection,它随工具而更改。

句柄本身就是工作区,所以不必担心保留参考资料。订阅将持续到新文件已加载,因此添加一个load_post回调来重新应用它。

请注意,这不会主动订阅添加的工作区之后可能需要单独回调:joy:

import bpy
def rna_callback(workspace):
idname = workspace.tools[-1].idname
print(idname)
def subscribe(workspace):
bpy.msgbus.subscribe_rna(
key=ws.path_resolve("tools", False),
owner=workspace,
args=(workspace,),
notify=rna_callback)
if __name__ == "__main__":
ws = bpy.context.workspace
subscribe(bpy.context.workspace)
# Subscribe to all workspaces: if 0:
for ws in bpy.data.workspaces:
subscribe(bpy.context.workspace)
# Clear all workspace subscriptions if 0:
for ws in bpy.data.workspaces:
bpy.msgbus.clear_by_owner(ws)

相关内容

  • 没有找到相关文章