2017-10-14 5 views
0

Puis-je utiliser un MProgressWindow à l'intérieur de la méthode MPxNode::compute? Mon implémentation de plug-in ne réserve pas MProgressWindow même s'il n'est pas utilisé par un autre processus.Utilisation de MProgressWindow dans 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; 
} 

Note: Lorsque le nœud est supprimé, MProgressWindow est affiché (comportement étrange).

J'apprécie toute aide.

Répondre

0

Avant le code de plug-in Maya 2016 s'exécute dans le même thread que l'interface utilisateur de Maya. Cela signifie que chaque fois que votre plugin fait quoi que ce soit, l'interface utilisateur de Maya est gelée.

Dans votre calcul(), les appels MProgressWindow mettent en file d'attente un certain nombre d'actions de l'interface utilisateur, mais elles ne seront traitées qu'après le retour de calcul() et le thread peut ramener le contrôle à l'interface utilisateur.

À partir de mai 2016, cela devient plus compliqué. Que votre code d'extension s'exécute dans le même thread que l'interface utilisateur de Maya dépend des paramètres Evaluation Manager et node type. Essayez le MComputation au lieu de MProgressWindow. Je n'ai pas essayé MComputation à partir d'une méthode de calcul(), donc cela peut ne pas fonctionner, mais sa conception est au moins mieux adaptée à cette utilisation.