В Maya после изменения Reference namespace и refNode в дочерних узлах все еще остается старое пространство имен - PullRequest
0 голосов
/ 03 марта 2019

Итак, у меня есть этот файл, где есть вложенные ссылки, и те похожие ссылки, которые есть во вложенной, также упоминаются отдельно как ссылка верхнего уровня, так что в основном то, что произошло, есть дублирующие пространства имен с одинаковыми именами.Один находится внутри вложенной / родительской ссылки, а другой - индивидуальный.Поэтому, когда я отменяю родительскую ссылку, чтобы вывести всех детей на верхний уровень, возникает конфликт пространства имен

, например, для:

у меня есть ссылка под названием Sphere1 спространство имен Sphere1: Sphere1, и когда его часть родительской ссылки с именем nested, Sphere1 станет вложенной: Sphere1: Sphere1.У меня есть еще одна ссылка на сферу, которая является верхнего уровня.Теперь, когда я раскрою вложенные файлы: Sphere1: Sphere1, у меня получится два Sphere1: Sphere1, и мой код не будет знать, какой из них есть.unnesting, но есть одна проблема с перезагрузкой.После перезагрузки ссылки она теряет свои ссылки (любую анимацию или размещение или любые изменения, сделанные в файле сцены) и сбрасывается в положение по умолчанию.Поэтому я отказался от плана по перезагрузке ссылок.

Затем я попытался переименовать сам refNode, но даже после переименования refNode дочерние узлы этого узла не изменятся, поскольку они являются узлами только для чтения.

Это сценарий, который я написал для удаления родительского элемента.Я не уверен, где все идет не так.

Вот фиктивное изображение ссылки до того, как я бегу по сценарию

Here is an dummy image of referencing

import pymel.core as pm
# list the references which has parent references i.e. sub references.
references = [i for i in pm.listReferences(recursive=True) if i.refNode.parentReference()]

for ref in references:
    # check how many copies of those references are there in the scene file if more than one then go forward
    if len(ref.copyNumberList()) == 1:
        continue

    unused_namespace = get_unused_namespace(ref)
    clean_name = get_clean_name(ref)
    parent_reference = ref.refNode.parentReference()
    if parent_reference:
        parent_namespace = parent_reference.referenceFile().namespace
    if parent_reference:
        parent_reference.referenceFile().importContents()
        pm.lockNode(ref.refNode, lock=False)
        ref.refNode.rename("{}:{}RN".format(parent_namespace, unused_namespace))
        pm.lockNode(ref.refNode, lock=True)
        pm.namespace(mv=(parent_namespace, ":"), force=True)
        pm.namespace(rm=parent_namespace, force=True)

    old_ns = ref.namespace
    cmds.file(ref.withCopyNumber(), e=True, ns=unused_namespace)
    pm.lockNode(ref.refNode, lock=False)
    ref.refNode.rename("{}:{}RN".format(ref.namespace, clean_name))
    pm.lockNode(ref.refNode, lock=True)
    cmds.namespace(set=':')


def get_unused_namespace(ref):

    clean_name = get_clean_name(ref)
    # list out all the references with similar path to check how many times this kind of reference is referenced.
    number_of_refs = sorted([i for i in pm.listReferences(recursive=True) if ref.path in i.path])
    # check the last copy number of last reference to predict next possible number.
    last_ref_number = number_of_refs[-1].withCopyNumber().replace(ref.path, "").replace("{", "").replace("}", "")
    unused_namespace = clean_name+str(int(last_ref_number)+1)

    return unused_namespace


def get_clean_name(ref):
    return ref.path.basename().splitext()[0]

Это изображение после запуска сценариев

This image is after the scripts runs

, поскольку вы можете заметить, что refNode такой же, какПространство имен, хотя дочерние объекты ссылки все еще находятся в старом пространстве имен

Я не уверен, в чем дело, но если вы поможете мне, это будет очень полезно.

TL; DR

Все, что мне нужно, - это способ переименовать дочернее ссылочное пространство имен, которое также должно изменить его дочерние узлы без перезагрузки ссылки.

...