Python与Maya:命名空间

0 投票
4 回答
12018 浏览
提问于 2025-04-17 17:38

我在谷歌上搜索如何处理Maya中的命名空间,但找到的结果都是关于如何去掉它们的。我并不想去掉它们。

我正在把我的角色引入场景中,我需要在一个特定的定位器上运行一个脚本,但因为它们是被引用进来的,所以都有命名空间。

比如说:shldr = cmds.xform('L_shldrFK_match_LOC', ws = True, t = True, q = True)

这段代码可以获取定位器在世界空间中的位置值,这正是我想要的。但是因为有命名空间,代码找不到这个定位器。

我该如何让代码忽略命名空间,但在Maya内部保留它们呢?

另外,如果代码能识别出没有命名空间的情况(比如场景没有被引用进来),那就更好了。

4 个回答

0

当我写代码的时候,通常会用一个星号来表示命名空间,就像这样。

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

不过,这要看你在场景中是否会有其他东西使用相同名字但在不同的命名空间下,因为那样的话就会出问题。

1

你可以使用 cmds.namespaceInfo 这个命令。

这个命令可以列出所有可用的命名空间以及里面包含的对象。

想了解更多,可以查看这里: namespaceInfo

3

另一种方法是跳过字符串命名的依赖,改为通过 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' # 

撰写回答