0

我一直在谷歌上搜索如何处理 Maya 中的命名空间,所有结果都是关于如何删除它们的。我不想删除它们。

我将我的角色引用到场景中,我需要在特定定位器上运行脚本,但由于被引用,它们都有命名空间。

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

这将获得世界空间中定位器的翻译值,这就是我想要的。但由于命名空间,它无法找到定位器。

如何让它忽略代码中的命名空间,但将它们保留在 Maya 中?

另一件很好的事情是让代码识别是否没有名称空间(例如,场景没有被引用)。

4

4 回答 4

3

解决此问题的另一种方法是跳过字符串命名的依赖关系,UUID而是采用检索节点 via。请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' # 
于 2016-10-18T14:02:36.287 回答
1

您可以使用cmds.namespaceInfo

该命令可以列出所有可用的命名空间及其包含的对象。

在此处阅读更多信息:namespaceInfo

于 2013-03-01T22:21:38.210 回答
0

当我编码类似的东西时,我通常使用一个星号来表示命名空间是这样的。

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

这取决于您是否要在场景中的其他名称空间下使用相同名称的其他东西,因为那样它就行不通了

于 2014-07-29T02:00:12.427 回答
0

我们需要一个包含所有名称空间的列表来找到正确的名称:

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)

仅当您的场景中只有一个角色时才有效。

于 2016-09-06T13:28:46.823 回答