2019年7月29日月曜日

自作ツールでGUIの状態をプリファレンスへ保存する※応用

前回は、[Close]ボタンで optionVar を実行するプロシージャを実行すようにしていましたが、ウィンドウを閉じる [X] ではプリファレンスに保存できていない状態となっていました。これをなんとかして回避したい!

今回はサンプルとして、こんなウィンドウを作ります。

プロシージャに飛ばすための[Close]ボタンを無くしました。
さらに checkBox では分かりにくいので intSlider で値の変化がしっかり保存されているかを確認し易くします。


重要なのは scriptJob をうまく活用することです。

global proc optVarTestWindow.close()
{
    global int $gIntSliderValue;
    
    // 設定の保存
    optionVar -iv optVarTestWindow_intSliderValue $gIntSliderValue;
    
}


global proc optVarTest2()
{
    if(`window -ex "optVarTestWindow"`) deleteUI "optVarTestWindow";/* for debug. */
    
    window "optVarTestWindow";
        columnLayout;
            intSliderGrp -f 1 -l "value" "optVarTestWindow_intSlider";
    
    //------------------------------------------------------------------------------
    // スライダーの値を保存する変数
    global int $gIntSliderValue;
    
    // スライダーにコマンド追加
    intSliderGrp -e
        -cc ("$gIntSliderValue=`intSliderGrp -q -v optVarTestWindow_intSlider`")
        "optVarTestWindow_intSlider";
    
    // スライダーの値の復帰
    if(`optionVar -ex optVarTestWindow_intSliderValue`)
    {
        $gIntSliderValue =`optionVar -q optVarTestWindow_intSliderValue`;
        intSliderGrp -e -v $gIntSliderValue "optVarTestWindow_intSlider";
        
    }
    
    //------------------------------------------------------------------------------
    // スクリプトジョブ
    scriptJob -pro -ro true -uid "optVarTestWindow" "optVarTestWindow.close";
    
    showWindow "optVarTestWindow";
    
}

scriptJob がツールウィンドウの削除を監視し、削除された瞬間optionVarを実行するプロシージャに飛ばします。

ここで注意しなければいけないのは、ウィンドウが削除されているのでコントローラの値を query出来ないということ。

なので、値を記憶しておくグローバル変数を使用。

そして、intSlider の changeCommandにはグローバル変数に値を代入するコードを仕込んでおきます。
毎回、optionVarを実行してディスクにアクセスするよりもメモリにアクセスした方が精神衛生上良いのではないかな?

ちょっとスコープが怪しい感じになっていますが、うまく動いているので気にしないでおきましょう。


ただ、ツールを開いた状態で mayaが終了されるとプリファレンスに記録できないんですよねぇ・・・。

0 件のコメント:

コメントを投稿