我可以在方法中使用MProgressWindow
吗MPxNode::compute
?我的插件实现不会保留MProgressWindow
即使它未被另一个进程使用。
MStatus Node::compute(const MPlug & plug, MDataBlock & data) {
if (!MProgressWindow::reserve())
return MS::kFailure;
MProgressWindow::setTitle(this->typeName);
MProgressWindow::setInterruptable(true);
MProgressWindow::setProgressRange(0, 100);
MProgressWindow::setProgressStatus("Initializing: 0%");
MProgressWindow::setProgress(0);
MProgressWindow::startProgress();
// Some expensive operation.
// If the user presses ESC key, this ends the progress window and returns failure.
MProgressWindow::endProgress();
return MS::kSuccess;
}
注意:删除节点时,会显示MProgressWindow
(行为奇怪)。
我感谢任何帮助。
在 Maya 2016 之前,插件代码与 Maya 的 UI 在同一线程中运行。这意味着只要你的插件在做任何事情,Maya 的 UI 就会被冻结。
在你的 compute() 中,MProgressWindow 调用正在排队一堆 UI 操作,但在 compute() 返回并且线程可以将控制权交回 UI 之前,它们不会被处理。
从 Maya 2016 开始,情况变得更加复杂。插件代码是否与 Maya 的 UI 在同一线程中运行取决于评估管理器和节点类型设置。
尝试使用 MComputation 而不是 MProgressWindow。我没有在 compute() 方法中尝试过 MComputation,所以它可能不起作用,但它的设计至少更适合这种用法。