Существует несколько правил, которым Майя должна следовать:
- Вы можете импортировать только ссылки верхнего уровня. Если это вложенная ссылка, она выдаст ошибку.
- Ссылка должна быть загружена, иначе она выдаст ошибку.
Проблема с вызовом 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)