在大纲视图Maya中将对象类型分组

时间:2019-01-07 01:40:05

标签: python maya

我尝试将每个元素的所有对象类型放入Outliner的组中。

这是我的代码。

from maya import cmds

objects = cmds.ls(selection=True, dag=True)

objects.sort(key=len, reverse=True)

# Now we loop through all the objects we have
for obj in objects:
    # We get the shortname again by splitting at the last |
    shortName = obj.split('|')[-1]

    children = cmds.listRelatives(obj, children=True) or []

    if len(children) > 0:
        for current in children:
            objType = cmds.objectType(current)
            print(objType)

我收到此错误:

  

错误:RuntimeError:文件/Users/jhgonzalez/Library/Preferences/Autodesk/maya/2018/scripts/AssigMaterialForEachMesh.py第26行:没有对象与名称匹配:SafetyHandle_019_allFromGun:pCylinderShape21   找不到对象'SafetyHandle_019_allFromGun:pCylinderShape21'。

我正在用

测试此代码

enter image description here

1 个答案:

答案 0 :(得分:1)

问题是您没有使用长名称,因此如果存在名称重复的对象,则脚本将崩溃,因为Maya不知道如何解决它。

例如,假设您有3个节点的层次结构:

|a
  |b
    |c

另一个具有2个节点的层次结构:

|d
  |a

由于您使用的是短名称,因此当您尝试从objectType查询a时,它不知道要从哪个层次中查询它,因此只使用长名称:

from maya import cmds

objects = cmds.ls(selection=True, dag=True, l=True) # Use long parameter.

objects.sort(key=len, reverse=True)

# Now we loop through all the objects we have
for obj in objects:
    children = cmds.listRelatives(obj, f=True, children=True) or [] # Use full parameter.

    if len(children) > 0:
        for current in children:
            objType = cmds.objectType(current)
            print(objType)

现在,尽管场景中有重复的名称,它仍可以按预期工作。