2015-05-04 2 views
1

Я использую скрипты для удаления пространств имен (вложенных или не вложенных) без использования/открытия редактора пространства имен, при условии, что критерии выполняются там, где в них нет содержимого.Вложенное удаление пространства имен

Делая это, я попал в эту проблему, где я не смог удалить вложенное пространство имен с помощью cmds.namespace(rm="<string of the namespace>")

я вроде нашел длинный обходной путь, но я застрял, как выход был юникода в списке, и я не могу похоже, преобразуют его в строку.

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']'. # 

Приведенный выше код я вводится исключительно для вложенных пространств имен, хотя это по-прежнему не «там» для достижения результатов и не очень гибкий (при условии, что внутри сцены есть только один вложенный уровень), есть ли способы исправить это?

Кроме того, оценить, если кто-нибудь есть какие-либо решения/методы для удаления пространств имен без использования, если пространство имен редактора, конечно ...

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 

Благодаря определенному другу, который помогает на это :)

Смежные вопросы