Выбор объектов Maya через память с использованием классов - PullRequest
0 голосов
/ 27 сентября 2019

Выбор объектов 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()

1 Ответ

1 голос
/ 27 сентября 2019

В отличие от pymel, cmds не использует оболочку для работы с узлами.Вместо этого он использует строки, которые могут быть проблематичными, поскольку они не обновляются динамически.Например, если вы создаете новый узел my_cube = cmds.polyCube(n='cube')[0], а затем переименовываете его, переменная my_cube будет по-прежнему указывать старое имя объекта.

Это также может быть проблемой, если в сцене несколько объектовкоторые имеют одинаковое повторяющееся имя.Maya обычно автоматически переименовывает дубликаты имен, чтобы избежать конфликтов, но допустимо иметь дубликаты имен в разных иерархиях.В этом случае вам нужно будет получить к нему доступ, используя длинное имя узла.Например, объект с именем "cube", который связан с другим объектом с именем "root", будет иметь длинное имя "|root|cube".

При всем этом, да, есть проблема с этим кодом.Он создает 2 куба с одинаковыми именами и помещает их в другую иерархию.Таким образом, будет 2 узла с именем "cube".Когда вызывается команда select, она буквально вызывает cmds.select("cube"), но поскольку существует более одного "cube", Майя не знает, как это интерпретировать, а затем выдает ошибку.

Что может нужно сделать, чтобы захватить новое длинное имя объекта, выполнив это после того, как его родители: self.cube = cmds.ls(sl=True, long=True)[0]

Теперь он может выбрать первый куб, как и ожидалось.

...