You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:36:28