Python:在整个脚本中保持选择对象

时间:2013-12-27 21:36:36

标签: python maya

我对编程很陌生。我上学了。 它必须做的是:

通过选择2个随机对象,沿着它的旋转平面克隆第一个选定对象周围的第二个选定对象。 这必须通过一个有2个选项的窗口来完成。 1选项调整克隆对象的半径大小。第二个选项是您想要的克隆数。按下按钮可创建克隆的对象。

import maya.cmds as cmds

def setRadius(circleRadius):
    selected = cmds.ls( sl=True)         
    #selected = cmds.ls ('pCube1') + cmds.ls ('pCube2') #used for testing
    pivotcube = cmds.xform(selected[0], ws=True, q=True, t=True)
    satellite = cmds.xform(selected[1], ws=True, q=True, t=True)

def circularDuplicate(nrOfObjects):
    selected = cmds.ls( sl=True)         
    #selected = cmds.ls ('pCube1') + cmds.ls ('pCube2') #used for testing

目前我实际上有几个问题。首先,我在场景中艰难选择了2个对象以方便测试。将代码更改为手动选择的对象并将其存储在列表中,引入了一个问题。调用第一个Function后,脚本会出现列表索引超出范围的错误。显然在第一个功能(调整第二个选定对象的位置以固定半径)之后,取消选择对象。现在我可以把

selected = cmds.ls( sl=True) 

在函数之外,但我希望能够选择2个不同的对象并克隆对象,而无需关闭窗口并再次运行脚本。

第二个问题是克隆对象都具有相同的翻译值.... 所以我不能使用任何克隆的对象并再次运行脚本,因为测量将返回错误。我怎样才能以一种体面的方式克隆所有克隆都有自己正确的平移和旋转值?

1 个答案:

答案 0 :(得分:1)

这里有三件事你错了。

选择

只要您不删除或重命名单个脚本代码块中的对象,就可以通过重新选择原始列表来“恢复”选择。在您的示例中:

def setRadius(circleRadius):
    selected = cmds.ls( sl=True)         
    pivotcube = cmds.xform(selected[0], ws=True, q=True, t=True)
    satellite = cmds.xform(selected[1], ws=True, q=True, t=True)
    cmds.select(selected)  # reselect the original objects

将恢复您的选择。

随着你越来越好,你会发现仍有很多方法可能出错 - 重命名,删除甚至创建对象都会使作为名称列表存储的选择无效。对于更复杂的示例,您可以创建集(使用cmds.set),这些集将在名称更改后继续存在。

如果切换到PyMel,ls等命令的返回值将是实际maya场景节点的句柄(而不仅仅是字符串名称,这是你从cmds版本获得的)。 Pymel对象将其集合保留在原始场景节点中,因此它们可以在名称更改等方面存活。

获取/设置值

您的setRadius函数不执行任何操作。您要求的是世界空间枢轴和目标位置 - 但您没有对它们做任何事情。你想要退货吗?或者你是否试图将它们设置为def建议的名称?如果您正在获取它们,请添加

return pivotcube, satellite 

到def的结尾。如果你正在设置它们,你需要调用xform 而不用 q标志,并提供你想要的值,比如

pivotpos = (0,0,0)
cmds.xform(selected[0], t=pivotpos, ws=True)

进行复制

提供的代码中没有任何内容实际上是径向复制。你想要这样的东西:

  1. 选择目标对象
  2. 将其移动到pivot对象的(0,0, radius )。您可以通过获取枢轴的变换矩阵并对其进行乘法(0,0,半径)来完成此操作。但是,将重复对象暂时父级到枢轴对象并将其 local 位置设置为(0,0, radius )会更简单。对于这个例子,我假设你想围绕枢轴对象的局部Y旋转 - 你可以根据需要交换坐标。
  3. 将目标对象的局部旋转归零
  4. 将目标的世界空间枢轴设置为数据透视的世界空间枢轴
  5. 根据需要多次:复制对象,将其旋转(0,360 /份数,0)
  6. (如果需要)重置副本的轴心
  7. 如果您在GUI中完成此操作并注意命令输出,您应该能够看到实际脚本的运行方式。