如何将预绘制挂钩添加到当前上下文工作区。工具更改?
我试图使用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)