Как получить список созданных в сцене корневых родителей - Autodesk Maya / Python? - PullRequest
1 голос
/ 16 марта 2019

Я немного новичок в python и пытаюсь получить список, содержащий все корневые родительские объекты, существующие в сцене типа joint.например, мой планировщик сцены выглядит примерно так:

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

group3>> joint4 >> joint5

joint16 >> joint17 >> joint18

Мне нужен скрипт, который проходит через планировщик и возвращает список,в моем примере:

[joint1, joint4, joint16]

Любые советы будут очень признательны.Большое спасибо.

Ответы [ 3 ]

1 голос
/ 17 марта 2019

Я не уверен, что если он используется, решение Haggi Krey работает нормально Вы также можете использовать флаг: -long из cmds.ls

# 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 голос
/ 18 марта 2019

Я уже использовал идею DrWeeny, когда вы пересекаете иерархию по длинному имени объекта.Разница в этом ответе заключается в том, что сценарий не будет аварийно завершать работу, если в сцене присутствуют объекты с повторяющимися именами.Я имею в виду, что у вас есть две ситуации:

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

и

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

Майяэто легко разрешить, как при дублировании верхнего узла, поэтому в этом случае мы должны предотвратить сбой скрипта.Когда есть несколько объектов с повторяющимися именами, 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']

0 голосов
/ 16 марта 2019

Я бы предложил перечислить все суставы, и для каждого сустава вы можете проверить, не является ли его родительский сустав суставом.По вашему определению, эти суставы должны быть вашими корневыми суставами.

...