Python & Maya: пространства имен

Я искал в Google, как обращаться с пространствами имен в Maya, и все результаты показывают, как их удалить. Я не хочу их удалять.

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

Например: shldr = cmds.xform('L_shldrFK_match_LOC', ws = True, t = True, q = True)

Это получит значение перевода локатора в worldspace, чего я и хочу. Но он не сможет найти локатор из-за пространства имен.

Как мне заставить его игнорировать пространства имен в коде, но сохранять их внутри Maya?

Другая вещь, которая была бы хороша, - это чтобы код распознавал, если нет пространств имен (например, сцена не была указана в).

4 ответа

Еще один способ сделать это - пропустить зависимость имен строк и принять извлечение узлов через UUID вместо. Увидеть cmds.ls в сочетании с -uuid флаг найден здесь.

Пространство имен - это на самом деле просто префиксы имен строк, добавленные к имени объекта. Пока пространство имен существует, вы можете переименовать объект, чтобы добавить / удалить его из пространства имен. Например:

import maya.cmds as cmds

loc = cmds.spaceLocator()
cmds.ls(loc)[0]  # Result: u'locator1' # 

cmds.namespace(add='foobar')  # Result: u'foobar' # 
loc = cmds.rename(loc, ':foobar:{}'.format(loc))  # Result: u'foobar:my_locator' #

cmds.rename(loc, ':my_locator')  # Result: u'my_locator' # 

Идея позади UUID заключается в том, что узлы помечаются специальным строковым атрибутом, который уникален для узла и не изменяется при переименовании узла. Например, обратите внимание, что имя меняется, а UUID остается прежним:

import maya.cmds as cmds

loc = cmds.spaceLocator()
cmds.ls(loc, uuid=True)[0]  # u'60446AC7-4398-E3CB-4C27-6BA417626E41' # 
cmds.ls(loc)[0]  # Result: u'locator1' # 


loc = cmds.rename(loc, 'my_locator')
cmds.ls(loc, uuid=True)[0]  # Result: u'60446AC7-4398-E3CB-4C27-6BA417626E41' #
cmds.ls(loc)[0]  # Result: u'my_locator' # 

Вооружившись этой информацией, мы теперь знаем, что узел всегда будет одинаковым, неизменным UUID на протяжении всей своей жизни, независимо от того, из какого пространства имен он перемещается (посредством именования) в / из.

Собирая все это вместе, вот как мы используем ls команда в сочетании с uuid:

# Query the UUID of our locator
cmds.ls(loc, uuid=True)[0]  # Result: u'60446AC7-4398-E3CB-4C27-6BA417626E41' #

# Retrieve the locator name string via UUID
cmds.ls(u'60446AC7-4398-E3CB-4C27-6BA417626E41')[0]  # Result: u'my_locator' # 

Ты можешь использовать cmds.namespaceInfo

Эта команда может перечислить все доступные пространства имен и содержащиеся в них объекты.

Узнайте больше о здесь: namespaceInfo

Нам нужен список со всеми пространствами имен, чтобы найти правильное:

namespaces = cmds.namespaceInfo(lon=True)
current_namespace = cmds.namespaceInfo(currentNamespace=True)
references = cmds.ls(type="reference")

Вы можете работать с этой информацией, но игнорировать пространство имен не очень хорошо, потому что основная функция ссылки - это умножение ресурсов среды / персонажа / пропуска на последнее обновление в вашей сцене... так

shldr = cmds.xform('*:L_shldrFK_match_LOC', ws = True, t = True, q = True)

будет работать, только если у вас есть только один персонаж в вашей сцене.

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

shldr = cmds.xform('*:L_shldrFK_match_LOC', ws = True, t = True, q = True)

это зависит от того, будете ли вы иметь другие вещи в вашей сцене под другим пространством имен с тем же именем, потому что тогда это не будет работать

Другие вопросы по тегам