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

Maya Python问题:嵌套函数调用时nodeType返回值为何不一致?

问题分析与修复

你的代码核心问题在于pjc_auto_rename_selection函数:它内部循环调用pjc_object_suffix,但既没有保存每次调用的返回值,也没有定义自身的返回逻辑,所以Python默认会返回None。而直接调用pjc_object_suffix时,函数有明确的return语句,因此能正常返回shape节点类型。

修复方案

根据你的需求,提供两种常用修复方式:

方式1:返回所有选中对象的shape类型列表

如果需要获取所有选中对象的shape节点类型,修改pjc_auto_rename_selection函数:

def pjc_auto_rename_selection(): 
    sel = pm.selected()
    shape_types = []
    for each in sel:
        # 保存每个对象的shape类型
        shape_type = pjc_object_suffix(each)
        shape_types.append(shape_type)
    # 返回收集到的结果列表
    return shape_types

方式2:返回单个选中对象的shape类型

如果只处理单个选中对象,或需要返回第一个选中对象的结果:

def pjc_auto_rename_selection(): 
    sel = pm.selected()
    if not sel:  # 先判断是否有选中对象,避免空列表报错
        return None
    # 返回第一个选中对象的shape类型
    return pjc_object_suffix(sel[0])

额外优化建议

  • 代码中混用了pm(Pymel)和mc(cmds)两种Maya Python API,建议统一使用其中一种,减少潜在问题。比如将所有mc.xxx替换为pm.xxx。
  • pjc_object_suffix中直接取listRelatives结果的第一个元素可能报错(比如transform节点没有关联shape节点时),可以增加判断逻辑:
def pjc_object_suffix(obj):       
    print("OBJ is {}".format(obj) )
    theNodeType = pm.nodeType(obj)
    print("OBJ nodeType is {}".format(theNodeType) )

    if theNodeType == "transform":
        shapeNodes = pm.listRelatives(obj, s=True, f=True)
        if shapeNodes:  # 检查是否存在shape节点
            theShapeNodeType = pm.nodeType(shapeNodes[0])
            print("theShapeNodeType is {}".format(theShapeNodeType))    
            return theShapeNodeType
        else:
            print("该transform节点没有关联的shape节点")
            return None

内容的提问来源于stack exchange,提问作者decoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:48:17