2015-05-04 145 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 

由於某個特定的朋友誰幫助了這個:)