首页 > 解决方案 > 如何在 Maya 中实现 MObject 选择器

问题描述

我有一个在 Maya 中运行的插件,需要对场景中的对象执行“滴管”测试。我的插件作为托管 WPF 控件运行,因此我有一个 C# 按钮事件回调,它希望以模式方式运行,直到执行命中或按下转义。这在 3D Studio Max 中真的很容易做到,但我不知道如何在 Maya 中做到这一点。

有什么建议吗?

标签: c#c++apimayapicking

解决方案


我确实想念 3dsMax 中的这一点,但据我所知,不,没有内置功能可以做到这一点。

Maya 中的大多数工具在执行之前已经有了一个选择,因此该工具可以cmds.ls(sl=True)用来捕获选择并执行您的验证。

可以做的是通过使用选择回调来模仿对象选择器。有cmds.scriptJob,但使用OpenMaya' 回调更有效。这是一个使用类来存储回调的 id 并自动管理它的示例:

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++ 标签,但同样的概念应该适用。

编辑#2:我刚刚了解了 command cmds.scriptCtx,所以确实存在选择器!我认为这是一个较旧的命令,因为它似乎只支持 MEL 并且实现感觉不是很好。如果您想了解更多信息,请查看我对另一个问题的回答。


推荐阅读