2015-05-04 98 views
1

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

虽然这样做,我得到了这个问题,在我无法使用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个嵌套级别),是否有任何方法可以纠正这种情况?

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

nestedNs

回答

0

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

希望有所帮助。

+0

这是工作。想知道是否知道任何方法来确定名称空间的嵌套级别? – yan

+0

然后张贴在这里。如果您发现答案有帮助,请考虑投票。 – kartikg3

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 

由于某个特定的朋友谁帮助了这个:)