【问题标题】:Two Questions about Python Dictionaries in Maya关于 Maya 中 Python 字典的两个问题
【发布时间】:2018-07-04 02:25:37
【问题描述】:

感谢您抽出时间阅读本文!所以,我的第一个问题是我正在尝试创建一个函数“selectionData()”,以获取对象的平移、旋转和缩放值,然后将它们作为字典返回,但发现自己有点挣扎。使用下面列出的代码,我得到的只是对象的名称。如何修改它以使其平移、旋转和缩放值作为字典返回?

我的第二个问题是我正在尝试创建一个函数“setData(data)”,该函数将上述使用 selectionData() 构建的字典作为输入,并将字典中的数据恢复到所选对象。我该怎么做?

如果这些问题中的任何一个问题很愚蠢,我深表歉意,但无论如何,感谢您的宝贵时间!干杯!

当前代码如下:

from maya import cmds

sel = cmds.ls(sl = 1)
meshes =[]
for s in sel :
    shape = cmds.listRelatives(s , shapes = 1 ) 
    if shape :
        if cmds.nodeType(shape[0]) == "mesh" :
            meshes.append(s )

meshData = {}            
for m in meshes :
    pos = cmds.xform ( m , q =1 , ws = 1 , t = 1)
    rot = cmds.xform( m , q =1  , ws = 1 , rotation =  1 )
    scl = cmds.getAttr ( m  + '.s' )[0]

    currentDict = {
                    "pos" : pos ,
                    "rot" : rot ,
                    "scl" : scl ,

                    }

    meshData[m] = currentDict

def selectionData( selectionDict):


    for k in selectionDict :
        print k

selectionData(meshData)

【问题讨论】:

  • 最后一个打印语句出现错误。应该是print(selectionDict[k]) 吗?
  • 嵌套字典是故意的吗?在您的示例中应该像这样使用 selectionDict : for k in selectionDict.keys() : ///// print( selectionDict[k]['pos'] ) #### 其中 k 将是网格名称
  • 哎呀,感谢您的保存!您可能还知道如何将平移、旋转和缩放值作为字典返回吗?

标签: python dictionary scripting maya


【解决方案1】:

首先,要列出所有带有变换的对象,您可以使用以下命令:

cmds.ls(selection=True, transforms=True, dagObjects=True)

如果你想读/写变换,你不需要得到平移,然后分别旋转和缩放。您可以像这样读取复合变换矩阵:

xform_matrix = cmds.xform(source_object, query=True, matrix=True)

您将获得一个包含 16 个浮点数的列表,这些数字已准备好应用于其他对象:

cmds.xform(destination_object, matrix=xform_matrix)

我不确定你想如何将一组选定对象的变换映射到另一组。如果您描述,我将能够发布完整的代码。

以下脚本将收集字典中所有选定对象的复合变换矩阵,以长对象名称为键:

selected_objects_matrix = {}
for current_object in cmds.ls(selection=True, transforms=True, dagObjects=True):
    selected_objects_matrix[cmds.ls(current_object, long=True)] = cmds.xform(
        current_object,
        query=True,
        matrix=True)

然后,如果您在 Maya 中移动/旋转/缩放对象,您可以像这样还原:

for current_object in selected_objects_matrix:
    cmds.xform(
        current_object,
        matrix=selected_objects_matrix[current_object])

【讨论】:

    【解决方案2】:

    你真的只想做你想做的事 设置q=1 将命令设置为query mode。 删除此标志会将命令默认为edit mode

    getAttrsetAttr 是它们各自的命令,但是您需要注意您正在设置的数据。即使您正在抓取上面的 s 属性,也只会抓取 x 值,因此当您设置它时,您需要指定 sx

    cmds.xform ( m , ws = 1 , t = posValues)
    cmds.xform( m , ws = 1 , rotation = rotValues )
    cmds.setAttr ( m  + '.sx', scaleValue) # sx because you are only grabbing the X Value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2014-02-13
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      相关资源
      最近更新 更多