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

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()

使用说明

  1. 第一次运行脚本时,字典会自动初始化;之后重复运行脚本不会清空已存储的数据。
  2. 单独按住Ctrl键运行脚本,会把当前选中物体的旋转值存入字典。
  3. 不按Ctrl键运行脚本,会打印选中物体的存储值,或提示该物体未被存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:44:01