Итак, у меня есть этот файл, где есть вложенные ссылки, и те похожие ссылки, которые есть во вложенной, также упоминаются отдельно как ссылка верхнего уровня, так что в основном то, что произошло, есть дублирующие пространства имен с одинаковыми именами.Один находится внутри вложенной / родительской ссылки, а другой - индивидуальный.Поэтому, когда я отменяю родительскую ссылку, чтобы вывести всех детей на верхний уровень, возникает конфликт пространства имен
, например, для:
у меня есть ссылка под названием Sphere1 спространство имен Sphere1: Sphere1, и когда его часть родительской ссылки с именем nested, Sphere1 станет вложенной: Sphere1: Sphere1.У меня есть еще одна ссылка на сферу, которая является верхнего уровня.Теперь, когда я раскрою вложенные файлы: Sphere1: Sphere1, у меня получится два Sphere1: Sphere1, и мой код не будет знать, какой из них есть.unnesting, но есть одна проблема с перезагрузкой.После перезагрузки ссылки она теряет свои ссылки (любую анимацию или размещение или любые изменения, сделанные в файле сцены) и сбрасывается в положение по умолчанию.Поэтому я отказался от плана по перезагрузке ссылок.
Затем я попытался переименовать сам refNode, но даже после переименования refNode дочерние узлы этого узла не изменятся, поскольку они являются узлами только для чтения.
Это сценарий, который я написал для удаления родительского элемента.Я не уверен, где все идет не так.
Вот фиктивное изображение ссылки до того, как я бегу по сценарию
![Here is an dummy image of referencing](https://i.stack.imgur.com/hLVYl.png)
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](https://i.stack.imgur.com/Fhnhx.png)
, поскольку вы можете заметить, что refNode такой же, какПространство имен, хотя дочерние объекты ссылки все еще находятся в старом пространстве имен
Я не уверен, в чем дело, но если вы поможете мне, это будет очень полезно.
TL; DR
Все, что мне нужно, - это способ переименовать дочернее ссылочное пространство имен, которое также должно изменить его дочерние узлы без перезагрузки ссылки.