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)
это зависит от того, будете ли вы иметь другие вещи в вашей сцене под другим пространством имен с тем же именем, потому что тогда это не будет работать