如何获取在场景中创建的根父级列表-Autodesk Maya / Python?

时间:2019-03-16 12:34:19

标签: python maya

我对python有点陌生,我试图获取一个列表,其中包含场景joint中存在的所有根父级。 例如,我的场景轮廓绘制器就是这样的:

  

group1 >> group2 >> joint1 >> joint2 >> joint3

     

group3 >> joint4 >> joint5

     

joint16 >> joint17 >> joint18

在我的示例中,我想要一个脚本,该脚本通过大纲视图并返回列表:

[joint1, joint4, joint16]

任何提示将不胜感激。非常感谢。

4 个答案:

答案 0 :(得分:1)

我不确定Haggi Krey解决方案是否可以正常使用,但是 您还可以使用标志:cmds.ls中的-long

# list all the joints from the scene
mjoints = cmds.ls(type='joint', l=True)
# list of the top joints from chain
output = []
# list to optimise the loop counter
exclusion = []
# lets iterate joints
for jnt in mjoints:
    # convert all hierarchy into a list
    pars = jnt.split('|')[1:]
    # lets see if our hierarchy is in the exclusion list
    # we put [1:] because maya root is represented by ''
    if not set(pars) & set(exclusion):
        # we parse the hierarchy until we reach the top joint
        # then we add it to the output
        # we add everything else to the exclusion list to avoid 
        for p in pars:
            if cmds.nodeType(p) == 'joint':
                output.append(p)
                exclusion+=pars
                break
print(output)

我之所以这样说,是因为没有一条路可走。我希望这段代码的构建可以帮助您提高python的技能。完全相同,只是找到父节点的方式不同!

答案 1 :(得分:1)

在使用对象的长名称遍历层次结构之前,我已经使用过DrWeeny的想法。这个答案的区别在于,如果场景中存在名称重复的对象,脚本不会崩溃。我的意思是说您有两种情况:

group1>>joint1>>joint2>>group2>>joint3

group3>>joint1>>joint2>>group2>>joint3

Maya很容易允许这种情况,就像在复制顶部节点时一样,因此在这种情况下,我们需要防止脚本崩溃。当存在多个名称重复的对象时,如果尝试访问该对象的短名称(它不知道您指的是哪一个!),Maya将会崩溃,因此我们必须始终使用其长名称:

import maya.cmds as cmds


jnts = cmds.ls(type="joint", l=True)  # Collect all joints in the scene by their long names.
output = set()  # Use a set to avoid adding the same joint.

for jnt in jnts:
    pars = jnt.split("|")  # Split long name so we can traverse its hierarchy.

    root_jnt = None

    while pars:
        obj = "|".join(pars)
        del pars[-1]  # Remove last word to "traverse" up hierarchy on next loop.

        # If this is a joint, mark it as the new root joint.
        if obj and cmds.nodeType(obj) == "joint":
            root_jnt = obj

    # If a root joint was found, append it to our final list.
    if root_jnt is not None:
        output.add(root_jnt)

print(list(output))

在上面的层次结构上使用此脚本将返回

[u'|group1|joint1', u'|group3|joint1']

答案 2 :(得分:0)

我建议列出所有关节,对于每个关节,您都可以检查其父关节是否不是关节。在您的定义中,这些关节应该是您的根关节。

答案 3 :(得分:0)

我使用这种方法来获取联合层次结构。我已经放弃尝试寻找一种更性感的方式来做到这一点。

myItems = cmds.ls(selection = True, type='joint') 
theParentJnt = cmds.listRelatives(myItems, parent = True)
jntRel = cmds.listRelatives(myItems, allDescendents = True)
allJnt = jntRel + myItems

@Green Cell

您的方法只能工作一次,而不能再工作了。重新启动maya 2020超过5次,并且仅显示到顶部节点关节,再也不会在列表中返回所有关节。