【问题标题】:Selecting Maya objects through memory using classes使用类通过内存选择 Maya 对象
【发布时间】:2019-09-27 10:21:53
【问题描述】:

使用类通过内存选择 Maya 对象

以下代码有什么问题:

import maya.cmds as cmds 

class MakeObject:
    def __init__(self):
        self.grp = cmds.createNode('transform')

    def make_cube(self):
        self.cube = cmds.polyCube(n='cube')[0]
        cmds.parent(self.cube, self.grp)
    def selection(self):
        cmds.select(self.cube)


x = MakeObject()
x.make_cube()

y = MakeObject()
y.make_cube()

x.selection()

【问题讨论】:

  • 尝试在 Maya 中选择两个具有相同名称的对象,基于内存而不是基于通过完整路径选择对象。我创建了一个应该具有创建多维数据集的函数的类,当您使用不同的实例变量再次创建它时,您还可以根据实例变量选择多维数据集,而不是基于完整路径,但它会发送和错误有多个对象具有相同的名称。
  • 这里是完整的代码:
  • import maya.cmds as cmds class MakeObject: def __init__(self): self.grp = cmds.createNode('transform') def make_cube(self): self.cube = cmds.polyCube(n ='cube')[0] cmds.parent(self.cube, self.grp) def selection(self): cmds.select(self.cube) x = MakeObject() x.make_cube() # 创建一个立方体与第一个立方体同名 y = MakeObject() y.make_cube() x.selection()
  • 您好,欢迎来到 SO。您可以使用编辑链接来更新您的问题,而不是发布 cmets。它将帮助人们更好地理解您的要求。

标签: python class memory selection maya


【解决方案1】:

pymel 不同,cmds 不使用包装器来处理节点。相反,它使用的字符串可能会出现问题,因为它们不会动态更新。例如,如果您创建一个新节点 my_cube = cmds.polyCube(n='cube')[0] 然后重命名它,my_cube 变量仍将指向对象的旧名称。

如果场景中有多个对象共享相同的重复名称,这也可能是一个问题。 Maya 通常会自动重命名重复命名以避免冲突,但在不同层次结构中具有重复名称是有效的。在这种情况下,您必须使用节点的长名称来访问它。例如,一个名为 "cube" 的对象在另一个名为 "root" 的对象下的父级将具有一个长名称 "|root|cube"

说了这么多,是的,这段代码有问题。它正在制作 2 个具有相同名称的立方体并将它们重新设置为不同的层次结构。因此将有 2 个名称为 "cube" 的节点。当调用select 命令时,它实际上是在调用cmds.select("cube"),但由于"cube" 不止一个,Maya 不知道如何解释它,然后引发错误。

可以做的是通过在它的父对象之后执行以下操作来捕获对象的新长名称:self.cube = cmds.ls(sl=True, long=True)[0]

现在它可以按预期选择第一个立方体了。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 2019-08-10
    • 2011-12-04
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多