Maya中Python添加aiAreaLight至列表后命名不更新问题求助
问题原因&解决方案
嘿,这个问题我之前也碰到过!其实核心原因很简单:你往列表里存的是灯光节点的旧名称字符串,之后重命名节点只是改变了Maya里节点的实际名称,但列表里的那个旧字符串不会自动跟着更新,所以打印出来还是原来的名字~
咱们一步步看原代码的问题:
import maya.cmds as cmds lights=[] def Button_pressed (): lights.append(cmds.shadingNode('aiAreaLight', asLight=True)) cmds.rename(lights[len(lights)-1],'PainterLight_aiArealight'+'1') print(lights)
cmds.shadingNode()返回的是灯光初始的transform名称(比如transform1),你把这个字符串直接塞进了列表。然后你重命名节点,但列表里的元素还是那个旧的transform1字符串,自然打印出来不对。而且原代码里固定加'1',多次点击的话Maya会自动给名称加后缀(比如PainterLight_aiArealight11),这也不是你要的递增序号效果。
修正后的代码
我给你调整了逻辑,利用cmds.rename()会返回新名称的特性,把正确的名称存进列表,同时实现序号自动递增:
import maya.cmds as cmds lights = [] def Button_pressed(): # 先创建灯光,拿到初始的旧名称 old_light_name = cmds.shadingNode('aiAreaLight', asLight=True) # 根据当前列表长度生成递增序号(列表已有n个,新的就是n+1) new_light_name = f'PainterLight_aiArealight{len(lights) + 1}' # 重命名节点,同时获取返回的新名称 renamed_light = cmds.rename(old_light_name, new_light_name) # 把新名称添加到列表里 lights.append(renamed_light) # 现在打印列表就是正确的新名称啦 print(lights)
另一种调整思路(如果想保留先加列表的逻辑)
要是你习惯先把旧名称加进列表,之后再更新列表里的元素也可以:
import maya.cmds as cmds lights = [] def Button_pressed(): # 先把旧名称加入列表 lights.append(cmds.shadingNode('aiAreaLight', asLight=True)) # 生成对应序号的新名称 new_name = f'PainterLight_aiArealight{len(lights)}' # 重命名并拿到新名称 renamed = cmds.rename(lights[-1], new_name) # 更新列表最后一个元素为新名称 lights[-1] = renamed print(lights)
本质就是一句话:列表存的是字符串,不是节点本身,所以节点重命名后,必须手动把新的名称字符串更新到列表里才行~
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

