Katana用Python设置PxrTexture节点参数报NoneType错误问题
问题原因
PrmanShadingNode的parameters参数组是动态生成内容:当修改nodeType属性时,Katana不会同步立即构建对应节点类型的子参数结构,你在设置完nodeType后立刻读取parameters路径下的子参数时,这些参数还未被创建,因此getParameter返回None,触发报错。
- 手动创建并切换节点类型时,UI操作会自动触发Katana事件队列刷新,等你执行参数赋值代码时,子参数结构已经生成完毕,因此可以正常运行。
- 第一次脚本运行结束后,待处理的节点更新事件执行完成,子参数被正确生成,因此第二次运行脚本时可以正常赋值。
- 你之前尝试的
finalizeValue接口仅对已存在的参数生效,无法触发动态参数的构建流程,因此没有效果,该问题和Group参数类型本身无关。
修复方法
两种方案均可解决问题,优先推荐第一种:
- 方案1:设置完
nodeType属性后,主动调用节点的checkDynamicParameters()方法,强制触发节点刷新动态参数结构,之后再执行子参数赋值操作。 - 方案2:设置完
nodeType属性后,调用NodegraphAPI.Events.processEvents()清空待处理的事件队列,等待节点参数结构构建完成后再执行后续操作。
另外你原代码中newTexNode = NodegraphAPI.GetNode(assetCode + '_' + textureNode)属于冗余操作:NodegraphAPI.CreateNode本身会直接返回新创建的节点对象,不需要再通过名称二次查找,该操作在存在重名节点时还可能拿到错误的节点引用,建议删除。
修复后的完整代码示例:
def createTextureNode(textureNode): keyword = textureNode for fname in os.listdir(assetFilePath): if keyword in fname: texFilename = fname + ".tex" newTexNode = NodegraphAPI.CreateNode("PrmanShadingNode", rootNode) newTexNode.getParameter('name').setValue(assetCode + '_' + textureNode, 0) newTexNode.getParameter('nodeType').setValue("PxrTexture", 0) # 强制刷新动态参数结构 newTexNode.checkDynamicParameters() if textureNode == "Albedo": newTexNode.getParameter("parameters.linearize.enable").setValue(True, 0) newTexNode.getParameter("parameters.linearize.value").setValue(True, 0)
注:该处理逻辑同样适用于其他带动态参数的节点,比如Arnold着色器节点、USD材质节点等,只要出现修改节点类型后子参数读取为空的问题,都可以通过主动刷新动态参数的方式解决。
内容的提问来源于stack exchange,提问作者David Tonkin
相关产品推荐
相关产品推荐

