Katana 5.0中Python创建节点后Backdrop无法正确更新适配问题
以下Katana/Python代码可创建Backdrop节点,并自动调整尺寸适配选中的任意节点:
nodeGraphTab = UI4.App.Tabs.FindTopTab('Node Graph') nodeGraphTab._NodegraphPanel__fitBackdropNode()
手动创建节点、选中后运行上述代码,可正常生成尺寸适配的Backdrop节点,效果参考:
通过代码程序化创建节点、程序化选中后运行上述代码,仅能创建Backdrop节点,无法完成尺寸调整与位置移动。
复现代码如下(运行环境Katana 5.0v1):
import NodegraphAPI # 获取根节点 rootNode = NodegraphAPI.GetRootNode() # 创建节点 node = NodegraphAPI.CreateNode("Alembic_In", rootNode) # 在视口中选中节点 NodegraphAPI.SetNodeSelected(node, True) nodeGraphTab = UI4.App.Tabs.FindTopTab('Node Graph') nodeGraphTab._NodegraphPanel__fitBackdropNode()
上述代码运行后的错误效果参考:
_NodegraphPanel__fitBackdropNode()是Node Graph面板的名称修饰私有方法,计算适配尺寸时读取的是节点图视图层缓存的节点位置、包围盒数据,并非直接从NodegraphAPI拉取节点属性。
通过NodegraphAPI.CreateNode创建节点时,节点核心属性会立即写入Katana的节点图数据模型,但视图层缓存不会同步更新。此时调用适配方法,视图层无法获取新节点的有效位置、尺寸数据,会按空选中的默认状态生成Backdrop,自然无法完成尺寸适配和位置对齐。
手动创建节点的操作本身走视图层交互流程,创建完成后视图缓存已自动同步,因此不会出现该问题。
在调用适配方法前,强制刷新Node Graph面板的视图缓存,同步最新节点状态到视图层即可,修正后代码如下:
import NodegraphAPI from UI4.Util import ProcessEvents # 获取根节点 rootNode = NodegraphAPI.GetRootNode() # 创建节点 node = NodegraphAPI.CreateNode("Alembic_In", rootNode) # 选中目标节点 NodegraphAPI.SetNodeSelected(node, True) nodeGraphTab = UI4.App.Tabs.FindTopTab('Node Graph') # 强制刷新节点图视图,同步最新节点数据到视图缓存 nodeGraphTab.getNodeGraphView().updateAll() # 处理UI事件队列,等待视图刷新完成 ProcessEvents() # 执行Backdrop自适应创建 nodeGraphTab._NodegraphPanel__fitBackdropNode()
批量创建多个节点的场景下,仅需在所有节点创建、选中操作完成后,统一执行一次视图刷新和事件处理即可,无需逐个节点刷新。
注意:
_NodegraphPanel__fitBackdropNode为非公开的私有方法,不同Katana版本可能存在方法名调整,若后续版本运行报错,可通过dir(nodeGraphTab)查找对应Backdrop自适应功能的内部方法名。
内容的提问来源于stack exchange,提问作者David Tonkin

