2017-10-14 1 views
0

Kann ich eine MProgressWindow innerhalb MPxNode::compute Methode verwenden? Meine Plug-in-Implementierung reserviert MProgressWindow nicht, auch wenn sie nicht von einem anderen Prozess verwendet wird.Verwenden von MProgressWindow in MPxNode :: compute

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; 
} 

Hinweis: Wenn der Knoten gelöscht wird, MProgressWindow wird angezeigt (seltsames Verhalten).

Ich schätze jede Hilfe.

Antwort

0

Vor Maya 2016 Plugin-Code läuft im selben Thread wie Maya UI. Das bedeutet, dass jedes Mal, wenn Ihr Plugin etwas tut, die Benutzeroberfläche von Maya eingefroren ist.

In Ihrem compute() stehen die MProgressWindow-Aufrufe in einer Reihe von UI-Aktionen, aber sie werden erst verarbeitet, nachdem compute() zurückgegeben wurde und der Thread die Steuerung wieder an die Benutzeroberfläche übergeben kann.

Ab Maya 2016 wird es komplizierter. Ob Ihr Plugin-Code im selben Thread läuft wie die Benutzeroberfläche von Maya, hängt von den Einstellungen Evaluation Manager und node type ab.

Verwenden Sie MComputation anstelle von MProgressWindow. Ich habe MComputation nicht aus einer compute() -Methode heraus versucht, so dass es nicht funktioniert, aber das Design ist zumindest besser für diese Verwendung geeignet.