因此,我在此文件中有嵌套的引用,并且嵌套引用中的类似引用也被分别引用为顶级引用,因此基本上发生的是,存在重复的同名命名空间。一个在嵌套/父引用内部,另一个是单个引用。因此,当我取消嵌套父级引用以带出顶层所有子级时,就会发生命名空间冲突
例如:
我有一个名为Sphere1的引用,其名称空间为Sphere1:Sphere1,当其父引用的一部分嵌套时,Sphere1将变为nested:Sphere1:Sphere1。我还有另一个关于Sphere的参考。现在,一旦我将nested:Sphere1:Sphere1嵌套,我最终将拥有两个Sphere1:Sphere1,而我的代码将不知道哪个是哪个。
因此,为了解决这一问题,我尝试在取消嵌套后重新加载引用,但是重新加载存在一个问题。重新加载参考后,它将失去参考编辑(场景文件中的任何动画或放置或任何类型的更改),并将其重置为默认位置。所以我放弃了重新加载引用的计划。
然后,我尝试重命名refNode本身,但是即使在重命名refNode之后,该节点的子节点也不会更改,因为它们是只读节点。
这是我写给不必要的父母的脚本。我不确定哪里出了问题。
这是我在脚本下运行之前引用的虚拟图像
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]
此图像在脚本运行之后
您会注意到refNode与名称空间相同,尽管引用的子代仍在旧名称空间中
我不确定问题出在哪里,但是如果您能指导我,那将是很大的帮助。
TL; DR
我所需要的只是重命名子引用名称空间的一种方法,该名称空间也应该更改其子节点,而无需重新加载引用。