Maya Python字典使用问题:存储物体旋转值后调用返回None
解决Maya Python字典调用返回'none'的问题
Hey,我看了你的Maya Python代码,问题出在几个容易忽略的细节上,咱们一步步来排查和修复:
问题根源分析
1. 全局字典被重复初始化
你在脚本最外层定义了myDic = {},这意味着每次重新运行整个脚本时,字典都会被重置为空。比如你先按住Ctrl运行脚本存了数据,接着又重新运行脚本(没按Ctrl)想读取,这时候myDic已经被清空,自然会返回'none'。
2. 快捷键触发的准确性
cmds.getModifiers() == 4对应的是单独按住Ctrl键,如果同时按下了其他键(比如Ctrl+Shift),mods的值会变成5,这时候就不会进入存储分支。你可以加个打印语句验证是否真的触发了存储逻辑。
3. 物体名称匹配问题
cmds.ls(sl=1)默认返回短名称,但若场景中有重名物体,Maya会自动返回长名称(比如|group1|pCube1)。如果存储时用的是短名,读取时却变成了长名,就会出现匹配失败,返回'none'。
修改后的完整代码
把上述问题修复后,代码可以正常工作:
import maya.cmds as cmds # 用try-except避免每次运行脚本都重置字典 try: myDic except NameError: myDic = {} def test(): mods = cmds.getModifiers() # 强制使用长名称,保证存储和读取时名称一致 SELlis = cmds.ls(sl=1, long=True) if mods == 4: print("正在存储选中物体的旋转值...") for obj in SELlis: # 直接提取旋转值的元组(原getAttr返回[(x,y,z)],加[0]拿到(x,y,z)) myDic[obj] = cmds.getAttr(obj+'.rotate')[0] else: for obj in SELlis: if obj in myDic: print(f"{obj} 的旋转值: {myDic.get(obj)}") else: print(f"{obj} 不存在于字典中,返回'none'") test()
使用说明
- 第一次运行脚本时,字典会自动初始化;之后重复运行脚本不会清空已存储的数据。
- 单独按住Ctrl键运行脚本,会把当前选中物体的旋转值存入字典。
- 不按Ctrl键运行脚本,会打印选中物体的存储值,或提示该物体未被存储。
内容的提问来源于stack exchange,提问作者Angga
相关产品推荐
相关产品推荐

