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
相关产品推荐
相关产品推荐

