импортировать объекты из ссылок в Maya - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть сцены с несколькими ссылками, которые я хочу импортировать в текущую сцену
Я нашел, как это сделать, когда у меня есть только 1 уровень ссылок, например:

сцена
... | _reference

, но он не работает, когда у меня несколько уровней ссылок, потому что иерархия не соблюдается

моя иерархия:

сцена
. .. | _reference
......... | _reference1
.............. | _reference2

вот мой код:

import maya.cmds as cmds
refs = cmds.ls(type='reference')
print refs
for ref in refs:
    rFile = cmds.referenceQuery(ref, f=True)
    cmds.file(rFile, importReference=True)

это возвращает это в нескольких уровнях ссылок:

line 8: The specified reference file cannot be imported because its parent file is not the top-level scene file. # 

как я могу импортировать все мои ссылки в моей сцене с python, с несколькими уровнями ссылок?

спасибо

1 Ответ

1 голос
/ 20 апреля 2020

Существует несколько правил, которым Майя должна следовать:

  1. Вы можете импортировать только ссылки верхнего уровня. Если это вложенная ссылка, она выдаст ошибку.
  2. Ссылка должна быть загружена, иначе она выдаст ошибку.

Проблема с вызовом cmds.ls(type='reference') заключается в том, что она вернется ВСЕ ссылки, включая вложенные, нарушающие правило №1.

Немного неясно заставить его работать, потому что я думал, что есть простой параметр, который можно передать в importReference для импорта всего объекта. цепочка вложенных ссылок, но, похоже, их нет. Вот как это сделать: перебирайте только все ссылки верхнего уровня и импортируйте их. Это приведет к тому, что все прямые дочерние ссылки станут на верхнем уровне, поэтому повторите их для импорта. Промойте и повторяйте, пока больше не будет повторяться.

Вот как это можно сделать (это пропустит все незагруженные ссылки):

import maya.cmds as cmds


all_ref_paths = cmds.file(q=True, reference=True) or []  # Get a list of all top-level references in the scene.

for ref_path in all_ref_paths:
    if cmds.referenceQuery(ref_path, isLoaded=True):  # Only import it if it's loaded, otherwise it would throw an error.
        cmds.file(ref_path, importReference=True)  # Import the reference.

        new_ref_paths = cmds.file(q=True, reference=True)  # If the reference had any nested references they will now become top-level references, so recollect them.
        if new_ref_paths:
            for new_ref_path in new_ref_paths:
                if new_ref_path not in all_ref_paths:  # Only add on ones that we don't already have.
                    all_ref_paths.append(new_ref_path)
...