在Maya中更改引用命名空间后,子节点中的refNode仍具有旧的命名空间

时间:2019-03-03 06:47:09

标签: python maya maya-api

因此,我在此文件中有嵌套的引用,并且嵌套引用中的类似引用也被分别引用为顶级引用,因此基本上发生的是,存在重复的同名命名空间。一个在嵌套/父引用内部,另一个是单个引用。因此,当我取消嵌套父级引用以带出顶层所有子级时,就会发生命名空间冲突

例如:

我有一个名为Sphere1的引用,其名称空间为Sphere1:Sphere1,当其父引用的一部分嵌套时,Sphere1将变为nested:Sphere1:Sphere1。我还有另一个关于Sphere的参考。现在,一旦我将nested:Sphere1:Sphere1嵌套,我最终将拥有两个Sphere1:Sphere1,而我的代码将不知道哪个是哪个。

因此,为了解决这一问题,我尝试在取消嵌套后重新加载引用,但是重新加载存在一个问题。重新加载参考后,它将失去参考编辑(场景文件中的任何动画或放置或任何类型的更改),并将其重置为默认位置。所以我放弃了重新加载引用的计划。

然后,我尝试重命名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

我所需要的只是重命名子引用名称空间的一种方法,该名称空间也应该更改其子节点,而无需重新加载引用。

0 个答案:

没有答案