Maya 実行中のスクリプトをESCキーで止める方法

今回もTwitterのTL上で「Mayaのpythonでスクリプトの実行時間が長すぎて途中で中止したい場合、

何か方法があるんでしょうか」と書かれている方がいて、ふと自分でもどうやるのか気になって調べてみたので

自分用のメモを兼ねて書いてみました。

 

また結論から書くと、処理時間が掛かってるイテレートのとこなどに

progressWindowコマンドを加えればPythonでもMELでも止められます。

 

公式のヘルプにはこんな事↓書いちゃってますw 

確かにスクリプトの処理内容によっては止められないので100%間違ってはいないですが、

ここにprogressWindow使った止め方も書いてあげてもいいんじゃないかと思ったり。

 

Maya ヘルプ: 実行中の MEL スクリプトを停止するにはどうすればいいですか?
http://help.autodesk.com/view/MAYAUL/2016/JPN/?guid=GUID-9D4860B5-4390-4D4F-B341-C4E0DE6C8252

>MEL スクリプトを実行中に中止することはできません。オペレーション終了後、取り消し(Undo)を実行するしかありません。


※注)このprogressWindowコマンドを追加して止められるのは

           あくまでご自身でそのスクリプトの中を書き換えられる場合です。

           ネットで拾ったスクリプトだけど途中で止めたくなる、けど書き換え方が分からない…って人は

     まわりのスクリプト書ける人に頼んでみてくださいw


まずはPythonの方を書いておきます。

参考にさせてもらったのはこちらのページです。

 

CGTalk - python - Killing a script with Esc
http://forums.cgsociety.org/archive/index.php?t-1074618.html

何やってるかというとイテレートの前にprogressWindowコマンドで

プログレスウィンドウを開いてから(4行目)何かの処理を走らせます。(タイトルはお好きな文字列で)

 

時間の掛かるイテレートの中に9行目のような記述をしておきます。

これがESCキーによるキャンセルをされたらbreakで抜けるという処理です。

 

そして12行目のendprosessのフラグをTrueをするのを忘れずに。

これしないと変にprogressWindowの処理が残ります。

# -*- coding: utf-8 -*-
import maya.cmds as mc

mc.progressWindow( isInterruptable = True , title="TEST" )

for i in range( 10000 ):
    print "kill me! " + str( i )
    
    if  mc.progressWindow( query = True, isCancelled = True ) :
        break

mc.progressWindow( endProgress = True )


一応これ↑のMELバージョンも書いておきます。

(シンタックスハイライトがMELに対応してないのでそのままテキストですみません)

progressWindow -isInterruptable true -title "TEST";
int $i;

for ($i = 0 ;  $i < 10000 ; $i++ ){
    print ("kill me! " +  $i + "\n");
   
    if ( `progressWindow -query -isCancelled` ) break;
}
progressWindow -endProgress;


もっと使う人に分かりやすくするならば、最初のprogressWindowコマンドのときに progress フラグも入れて

イテレートの中でそこの数値を加算していけばプログレスウィンドウの中に進捗のバーを出せて

視覚的にどのくらいで終わるのかが分かるので良いかもしれないですね。

(処理の内容によってはきちんとした進捗度が出しにくいものももちろんあると思いますが)