嵌套命名空间删除

2024-06-15 21:50:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在这样做的时候,我遇到了一个问题,我无法使用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))

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

^{pr2}$

我输入的上面的代码只用于嵌套的名称空间,尽管它仍然没有实现结果的“那里”,也不是很灵活(假设场景中只有一个嵌套级别),有什么方法可以纠正这一点吗?在

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

nestedNs


Tags: 方法rmin名称空间result编辑器item
3条回答

如果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])

希望有帮助。在

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

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

感谢一位特别的朋友在这方面提供了帮助:)

要删除所有namespaces,您可能需要使用recursemergeNamespaceWithParent标志。这样,它将删除所有名称空间并将其作为根目录的父级。在

# 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)

相关问题 更多 >