Как реализовать сборщик MObject в Maya - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть плагин, работающий внутри Maya, который должен выполнить тест «пипетка» для объектов на сцене.Мой плагин работает в качестве размещенного элемента управления WPF, поэтому у меня есть функция обратного вызова события C #, которая хочет работать в модальном режиме, пока не будет выполнено нажатие или нажатие escape.Это было действительно легко сделать в 3D Studio Max, но я не могу понять, как это сделать в Maya.

Любой совет?

1 Ответ

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

Мне не хватает этого в 3dsMax, но, насколько я знаю, нет, для этого нет встроенных функций.

Большинство инструментов в Maya уже работают с выбором перед выполнением, поэтому инструментможно использовать cmds.ls(sl=True), чтобы зафиксировать выделение и выполнить предварительную проверку.

Что вы можете сделать, это имитировать средство выбора объектов с помощью обратного вызова выбора.Есть cmds.scriptJob, но более эффективно использовать обратные вызовы OpenMaya.Вот пример, который использует класс для хранения идентификатора обратного вызова и автоматически управляет им:

import maya.cmds as cmds
import maya.OpenMaya as OpenMaya


class ObjectPicker():

    _id = None  # Store callback's id here.

    def __init__(self):
        # When this class is created, add the callback.
        OpenMaya.MGlobal.displayWarning("Please pick an object")
        ObjectPicker.add_callback()

    @staticmethod
    def on_selection_changed(*args):
        # This gets triggered from the callback when the user changes the selection.
        # Auto-remove the callaback afterwards.
        print "Selection:", cmds.ls(sl=True)
        ObjectPicker.remove_callback()

    @staticmethod
    def add_callback():
        # First remove any existing callback, then store the id in this class.
        ObjectPicker.remove_callback()
        ObjectPicker._id = OpenMaya.MEventMessage.addEventCallback("SelectionChanged", ObjectPicker.on_selection_changed)

    @staticmethod
    def remove_callback():
        # Remove the callback so it stops triggering the function.
        if ObjectPicker._id is not None:
            OpenMaya.MEventMessage.removeCallback(ObjectPicker._id)
            ObjectPicker._id = None


# After calling this, pick a new object then it will print it in the Script Editor.
picker = ObjectPicker()

После создания нового экземпляра класса с помощью picker = ObjectPicker() для пользователя появится всплывающее предупреждение:выбрать объект.После изменения выбора он запускает обратный вызов, который печатает выборку в Редакторе сценариев, а затем удаляет его собственный обратный вызов.

Я думаю, что это может сработать, но Maya не 3dsMax, и в конце дня этоможет быть лучше не заставлять одно программное обеспечение работать как другое.Поэтому я хотел бы просто придерживаться того, к чему все уже привыкли, и работать с текущим выбором пользователя.

Редактировать: Извините, только что заметил тег c ++, но должна применяться та же концепция.

...