如何在 Maya 中查看节点的所有属性?
How to see all attributes of a node in Maya?
我正在尝试通过代码更新 Maya 中的一些属性值,但我很难访问它们。
我需要显示名称的属性,(我很确定这应该是它们的 'Nice Name'),但我似乎无法以任何方式获得它们。使用 listAttr 或使用 OpenMaya 的 MFnAttribute 都没有给我我想要的东西 - 他们传回长名称和短名称并清理 'Nice Names' 但其中 none 是显示的 UI 名称属性。
例如,我的节点在标题为 'Advanced Anchor Controls.' 的下拉列表中包含一个名称为 'Horizontal Damping Factor' 的属性。 35=],但这不是显示的名称。其他 23 个属性也是如此。
你对正在发生的事情有什么想法吗?
(所有这些属性都位于两个下拉菜单深度的字段中,这有问题吗?)
编辑:这绝对是因为属性有两个深的下拉菜单...我仍然不知道这些下拉菜单叫什么或如何访问其中包含的属性。
编辑 2:好吧,我错了,属性的名称与显示的名称不同,(当我调整滑块时,编辑器 window 显示我刚刚更改的值的名称,这与显示的名称不同,而且它也不仅仅是它的 'Nice' 名称版本。)仍在尝试解决这个问题。
编辑 3:不确定这有多清楚,但它显示了属性的 UI 标签与 'Nice Name.' 之间的差异 属性列表中没有 'Horizontal Damping Factor'名字。
最终编辑:看起来不可能通过查询 UI 名称来更改属性的值,如果给属性指定的 UI 名称与权威名称不同创建时的名称。改为在代码中创建我自己的映射。
如果您知道相关属性的 longName
及其所属节点的名称,则可以将 attributeQuery
与 longName
、shortName
或 niceName
分别获取它的长名、短名和好听的名字。
据我从你的问题中了解到,你希望能够查看节点所有属性的所有信息,以便你可以正确决定选择哪个属性来执行你正在做的事情.这是我写的一个快速脚本,一个简单的查询,只是为了给你:(慷慨地穿插解释作为评论)
import maya.cmds as cmds
def printAttributes(node, like=''):
''' Convinience function to print all the attributes of the given node.
:param: node - Name of the Maya object.
:param: like - Optional parameter to print only the attributes that have this
string in their nice names.
'''
heading = 'Node: %s' % node
# Let's print out the fancy heading
print
print '*' * (len(heading)+6)
print '** %s **' % heading
print '*' * (len(heading)+6)
# Let's get all the attributes of the node
attributes = cmds.listAttr(node)
# Let's loop over the attributes now and get their name info
for attribute in attributes:
# Some attributes will have children. (like publishedNodeInfo)
# We make sure we split out their parent and only use the child's name
# because attributeQuery cannot handle attributes with the parentName.childName format.
attribute = attribute.split('.')[-1]
# Let's now get the long name, short name
# and nice name (UI name) of the atribute.
longName = cmds.attributeQuery(attribute, node=node, longName=True)
shortName = cmds.attributeQuery(attribute, node=node, shortName=True)
niceName = cmds.attributeQuery(attribute, node=node, niceName=True)
# if we the 'like' parameter has been set, we'll check if
# the nice name has that string in it;
# else we skip this attribute.
if like and like.lower() not in niceName.lower():
continue
# Now that we have all the info we need, let's print them out nicely
heading = '\nAttribute: %s' % attribute
print heading
print '-' * len(heading)
print 'Long name: %s\nShort name: %s\nNice name: %s\n' % (longName,
shortName,
niceName)
if __name__ == '__main__':
# Let us get a list of selected node(s)
mySelectedNodes = cmds.ls(sl=True)
# Let us do the printAttributes() for every selected node(s)
for node in mySelectedNodes:
# Just for example, just printing out attributes that
# contain the word 'damping' in their nice (UI) name.
printAttributes(node, like='damping')
注意,我们使用命令listAttr()
来获取节点所有属性的列表。请注意,我们也可以使用 attributeInfo()
来获取属性列表。 attributeInfo()
优于 listAttr()
的优点是 attributeInfo()
有更多的过滤标志,可以根据属性的各种参数和属性过滤出列表。
值得去查看这些文档:
attributeQuery
attributeInfo
listAttr
权威名称为listAttr
;您在 UI 中看到的名称不可靠,因为 AETemplate 可以按其希望的任何方式覆盖它们。 AE 经常呈现用于计算真实值的假属性——例如,相机在属性编辑器中有一个 angleOfView
,但设置它实际上改变了 focalLength
属性;相机节点上没有angleOfView
。
因此,您可能需要做一些侦探工作来弄清楚可见的 UI 到底在做什么。玩滑块和观看历史是通常的第一步。
FWIW
dict(zip(cmds.listAttr(), cmds.listAttr(sn=True)))
将为您提供一个将长名称映射到短名称的字典,这可以方便地提高内容的可读性。
我正在尝试通过代码更新 Maya 中的一些属性值,但我很难访问它们。
我需要显示名称的属性,(我很确定这应该是它们的 'Nice Name'),但我似乎无法以任何方式获得它们。使用 listAttr 或使用 OpenMaya 的 MFnAttribute 都没有给我我想要的东西 - 他们传回长名称和短名称并清理 'Nice Names' 但其中 none 是显示的 UI 名称属性。
例如,我的节点在标题为 'Advanced Anchor Controls.' 的下拉列表中包含一个名称为 'Horizontal Damping Factor' 的属性。 35=],但这不是显示的名称。其他 23 个属性也是如此。
你对正在发生的事情有什么想法吗?
(所有这些属性都位于两个下拉菜单深度的字段中,这有问题吗?)
编辑:这绝对是因为属性有两个深的下拉菜单...我仍然不知道这些下拉菜单叫什么或如何访问其中包含的属性。
编辑 2:好吧,我错了,属性的名称与显示的名称不同,(当我调整滑块时,编辑器 window 显示我刚刚更改的值的名称,这与显示的名称不同,而且它也不仅仅是它的 'Nice' 名称版本。)仍在尝试解决这个问题。
编辑 3:不确定这有多清楚,但它显示了属性的 UI 标签与 'Nice Name.' 之间的差异 属性列表中没有 'Horizontal Damping Factor'名字。
最终编辑:看起来不可能通过查询 UI 名称来更改属性的值,如果给属性指定的 UI 名称与权威名称不同创建时的名称。改为在代码中创建我自己的映射。
如果您知道相关属性的 longName
及其所属节点的名称,则可以将 attributeQuery
与 longName
、shortName
或 niceName
分别获取它的长名、短名和好听的名字。
据我从你的问题中了解到,你希望能够查看节点所有属性的所有信息,以便你可以正确决定选择哪个属性来执行你正在做的事情.这是我写的一个快速脚本,一个简单的查询,只是为了给你:(慷慨地穿插解释作为评论)
import maya.cmds as cmds
def printAttributes(node, like=''):
''' Convinience function to print all the attributes of the given node.
:param: node - Name of the Maya object.
:param: like - Optional parameter to print only the attributes that have this
string in their nice names.
'''
heading = 'Node: %s' % node
# Let's print out the fancy heading
print
print '*' * (len(heading)+6)
print '** %s **' % heading
print '*' * (len(heading)+6)
# Let's get all the attributes of the node
attributes = cmds.listAttr(node)
# Let's loop over the attributes now and get their name info
for attribute in attributes:
# Some attributes will have children. (like publishedNodeInfo)
# We make sure we split out their parent and only use the child's name
# because attributeQuery cannot handle attributes with the parentName.childName format.
attribute = attribute.split('.')[-1]
# Let's now get the long name, short name
# and nice name (UI name) of the atribute.
longName = cmds.attributeQuery(attribute, node=node, longName=True)
shortName = cmds.attributeQuery(attribute, node=node, shortName=True)
niceName = cmds.attributeQuery(attribute, node=node, niceName=True)
# if we the 'like' parameter has been set, we'll check if
# the nice name has that string in it;
# else we skip this attribute.
if like and like.lower() not in niceName.lower():
continue
# Now that we have all the info we need, let's print them out nicely
heading = '\nAttribute: %s' % attribute
print heading
print '-' * len(heading)
print 'Long name: %s\nShort name: %s\nNice name: %s\n' % (longName,
shortName,
niceName)
if __name__ == '__main__':
# Let us get a list of selected node(s)
mySelectedNodes = cmds.ls(sl=True)
# Let us do the printAttributes() for every selected node(s)
for node in mySelectedNodes:
# Just for example, just printing out attributes that
# contain the word 'damping' in their nice (UI) name.
printAttributes(node, like='damping')
注意,我们使用命令listAttr()
来获取节点所有属性的列表。请注意,我们也可以使用 attributeInfo()
来获取属性列表。 attributeInfo()
优于 listAttr()
的优点是 attributeInfo()
有更多的过滤标志,可以根据属性的各种参数和属性过滤出列表。
值得去查看这些文档: attributeQuery attributeInfo listAttr
权威名称为listAttr
;您在 UI 中看到的名称不可靠,因为 AETemplate 可以按其希望的任何方式覆盖它们。 AE 经常呈现用于计算真实值的假属性——例如,相机在属性编辑器中有一个 angleOfView
,但设置它实际上改变了 focalLength
属性;相机节点上没有angleOfView
。
因此,您可能需要做一些侦探工作来弄清楚可见的 UI 到底在做什么。玩滑块和观看历史是通常的第一步。
FWIW
dict(zip(cmds.listAttr(), cmds.listAttr(sn=True)))
将为您提供一个将长名称映射到短名称的字典,这可以方便地提高内容的可读性。