c# - 如何在 Maya 中实现 MObject 选择器
问题描述
我有一个在 Maya 中运行的插件,需要对场景中的对象执行“滴管”测试。我的插件作为托管 WPF 控件运行,因此我有一个 C# 按钮事件回调,它希望以模式方式运行,直到执行命中或按下转义。这在 3D Studio Max 中真的很容易做到,但我不知道如何在 Maya 中做到这一点。
有什么建议吗?
解决方案
我确实想念 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 并且实现感觉不是很好。如果您想了解更多信息,请查看我对另一个问题的回答。
推荐阅读
- .net - 带有 .NET Core 2.1 的 Angular 5 - 找不到模块,但可以
- r - 如何从 R 中的多个(数千个)netcdf 文件中写入单个 CSV 文件
- amazon-web-services - 在 AWS CodeBuild 期间安装 Docker
- r-markdown - 绘图在降价中无法正确呈现
- java - 将 Logback 消息附加到存档文件
- vbscript - 基于输入日期的 VBScript 中的 SQL 查询
- css - Angular 7 熔岩效果动画
- javascript - 为什么在 location.hash 上不自动输出刷新?
- node.js - 部署到 now.sh 后无法浏览环回 api
- android - 如何查看 Android 支持库的源代码?