【问题标题】:Nested namespace deletion嵌套命名空间删除
【发布时间】:2015-07-13 18:01:27
【问题描述】:

我正在编写脚本以在不使用/打开命名空间编辑器的情况下删除命名空间(嵌套或非嵌套),假设在其中没有内容的情况下满足条件。

这样做时,我遇到了无法使用 cmds.namespace(rm="<string of the namespace>") 删除嵌套命名空间的问题

我找到了一个更长的解决方法,但我被卡住了,因为输出是列表中的 unicode,我似乎无法将其转换为字符串。

nsLs = cmds.namespaceInfo( lon=True)
# nsLs Result: [u'UI', u'camera01',  u'shared', u'v02', u'v03']

defaultNs = ["UI", "shared", "camera01"]

diffLs = [item for item in nsLs if item not in defaultNs]
# diffLs Result: [u'v02', u'v03']

for ns in diffLs:
    nsNest = cmds.namespaceInfo(ns, lon=True)
    # nsNest Result:    [u'v02:new_run01']
    #                   [u'v03:new_run01']
    cmds.namespace(rm=str(nsNest))

因此,我使用的“删除”标志不起作用,因为遇到以下错误:

# Error: No namespace matches name: '[u'v02:new_run01']'.
# Traceback (most recent call last):
#   File "<maya console>", line 13, in <module>
# RuntimeError: No namespace matches name: '[u'v02:new_run01']'. #

我输入的上述代码仅适用于嵌套命名空间,虽然它仍然不是'那里'来实现结果并且也不是很灵活(假设场景中只有1个嵌套级别),有没有有什么办法解决这个问题?

此外,如果有人有任何解决方案/方法来删除命名空间而不使用命名空间编辑器,当然......

【问题讨论】:

    标签: python namespaces maya


    【解决方案1】:

    如果namespace 命令需要一个字符串(在本例中为'v02:new_run01'),您将向它传递字符串列表本身(在本例中为'[u'v02:new_run01']')。由于您有lon=True 标志,该命令将始终返回一个列表。您应该确保从中提取元素并将其发送到namespace 命令。

    您所要做的就是从列表中传递元素而不是整个列表:

    for ns in diffLs:
        nsNest = cmds.namespaceInfo(ns, lon=True)
        # nsNest Result:    [u'v02:new_run01']
        #                   [u'v03:new_run01']
        if nsNest:
            cmds.namespace(rm=nsNest[0])
    

    希望对您有所帮助。

    【讨论】:

    • 它正在工作。想知道您是否知道任何方法来确定命名空间的嵌套级别?
    • 然后在这里发布。如果您认为答案有帮助,请考虑投票。
    【解决方案2】:

    这是下面的代码,它删除任何级别的嵌套命名空间,假设它包含空内容。

    import maya.cmds as mc
    
    defaults = ['UI', 'shared']
    
    def num_children(ns):
        return ns.count(':')
    
    namespaces = [ns for ns in mc.namespaceInfo(lon=True, r=True) if ns not in defaults]
    sorted_ns = sorted(namespaces, key=num_children, reversed=True)
    for ns in sorted_ns:
        try:
            mc.namespace(rm=ns)
        except RuntimeError as e:
            pass
    

    感谢一位为此提供帮助的特定朋友 :)

    【讨论】:

      【解决方案3】:

      要删除所有 namespaces,您可能需要使用 recursemergeNamespaceWithParent 标志。这样,它会删除所有的命名空间,并将其作为 root 的父级。

      # Gathering and deleting all namespaces
      name_space = [item for item in pm.namespaceInfo(lon=True, recurse=True) if item not in ["UI", "shared"]]
      # Sort them from child to parent, That's order we need to delete
      sorted_ns_namespace = sorted(name_space, key=lambda ns: ns.count(':'), reverse=True)
      
      for ns in sorted_ns_namespace:
          pm.namespace(removeNamespace=ns, mergeNamespaceWithParent=True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-08
        • 2010-12-14
        • 1970-01-01
        相关资源
        最近更新 更多