ユーザ インタフェースをリンクする

 
 
 

今のところ、ウィンドウのユーザ インタフェースはまったく動作せず、スライダを動かしてもチェック ボックスをクリックしても反応がありません。このセクションでは、ユーザ インタフェースを前に使用した makeRoll プロシージャにリンクする方法について学習します。

次の手順では、ユーザ インタフェース スクリプトを修正します。

ユーザ インタフェース スクリプトの完成版は、mel_Lesson_4_finished.mel という名前で、GettingStarted2014LessonData¥MEL プロジェクト フォルダの mel サブフォルダ内にあります。

現在選択しているオブジェクトを表示する

makeRoll プロシージャは、現在選択しているオブジェクトに作用するようになっていません。ここでは、textField コントロールが現在選択しているオブジェクトを表示するように、スクリプトを修正しましょう。

現在選択しているオブジェクトの名前を返すには、ls コマンド(list)を selection に付けて使用します。Maya では複数のオブジェクトを選択できるので、ls コマンドからの戻り値は、たとえ 1 つのオブジェクトしか選択されていなくても、文字列ではなく文字列配列になります。配列とは、同じデータ型の複数の項目を 1 つの変数に格納するために使用する、値を順序付けて入れたリストです。makeRoll プロシージャ文字列配列を引数にできないため、 ls -selection の戻り値を修正する必要があります。

注:ls コマンドに関する詳細については、MEL コマンド リファレンスの ls を参照してください。

配列の詳細については、配列(Maya ユーザ ガイド)を参照してください。

この次のセクションでは、新規 tempMEL タブを作成して、学習するテスト コマンドを配置します。

現在選択しているオブジェクトの名前を変数として格納するには

  1. 新規 MEL タブを作成します(スクリプト エディタ(Script Editor)コマンド > 新規タブ(Command > New Tab))。
  2. タブ名を tempMEL に変更します(スクリプト エディタ(Script Editor)コマンド > タブの名前の変更(Command > Rename Tab))。
  3. tempMEL タブで次のように入力します。
    select -allDagObjects;
    

    これはすべてのシーン オブジェクトを選択するコマンドです。

  4. tempMEL タブで次のように入力します。
    $all_selected_objects =`ls -selection`;
    

    これは現在選択されているオブジェクトをリストし、その名前を変数に出力するコマンドです。

  5. tempMEL タブで次のように入力します。
    print $all_selected_objects;
    

    このコマンドは、格納されたオブジェクトのリストをスクリプト エディタ(Script Editor)に出力します。

  6. tempMEL タブでコマンドを実行します。

    スクリプト エディタ(Script Editor)に次の行が出力されます。

    roll_Cube pPlane1
    

変数 $all_selected_objects は文字列配列です。つまり、変数内に複数の文字列が格納されています。配列内の値を要素と呼びます。

注:

配列は、プログラムでは大きなデータ セットを扱う場合によく使用されます。配列を使わないで大きいデータ セットを格納しようとすると、データの要素ごとに変数が必要になってしまい、スクリプトの維持が困難になるうえに、メモリ消費も多くなります。配列の詳細については、配列(Maya ユーザ ガイド)を参照してください。

この例では、目的の操作は、roll_Cube プロシージャをシーンの 1 つのオブジェクトに適用するだけです。角括弧([ ])を使用すると、配列の個々の要素を指定できます。

選択項目を 1 つのオブジェクトに減らすには

  1. MEL2 タブのユーザ インタフェース スクリプトの最上部に次のコマンドを追加します。
    select -allDagObjects;
    string $all_selected_objects[]=`ls -selection`;
    
  2. MEL2 タブで、オリジナル スクリプトの 14 行目(MEL タブを参照)にある text フラグの引数を、“name_of_object” から次のように修正します。
    $all_selected_objects[0]
    

    これでコマンドは次のようになりました。

    $obj_name_text = 	`textField 	-editable 0 	-width 400 	-text $all_selected_objects[0]`;
    

    配列の要素にアクセスするには、配列から抽出する要素のインデックス番号角カッコに入れます。配列のインデックス番号は 0 から開始します。

    テキスト フィールドにはシーンで最初に作成されたオブジェクトが表示されるようになりました。

チェック ボックスをリンクする

チェック ボックスもボタンと同様にコマンド フラグを使用できます。チェック ボックスはボタンよりも機能的なので、コマンド フラグが異なります。チェック ボックスは次の 3 つのコマンド フラグを使用できます。changeCommandonCommandoffCommand

checkBox コマンドに edit フラグを付けて使用すれば、ユーザ インタフェースでチェックボックスの状態を変更できます。

ユーザ インタフェースで要素の値を変更するには

  1. tempMEL タブで次のとおりに実行し、make roll ウィンドウのチェック ボックスの状態を変更します。
    checkBox -edit -value 0 $box_sim_checkbox;
    

    実行前にオンであった Box Simulation チェック ボックスがオフになりました。このコマンドの値を 1 にして再度実行すると、チェックボックスはオンになります。

    これは、edit フラグをコマンドに付けてコマンド フラグの引数として使用して、値の変更を可能にする方法を示しています。

    次に、changeCommand フラグを使用して 2 つのチェック ボックスが同期するように設定しましょう。つまり、一方のチェック ボックスの状態を変更すると、他方のチェック ボックスがその反対の状態になるようにします。

  2. MEL2 タブにあるチェック ボックス宣言(string $box_sim_checkbox と string $sphere_sim_checkbox)の下に以下を追加します。これは、ファイルの先頭に行を追加したかどうかによって異なりますが、34 ~ 35 行目あたりにあるはずです。
    checkBox -edit -changeCommand ("checkBox -edit -value (!#1) "+ $sphere_sim_checkbox)
    $box_sim_checkbox;
    

    このブロックは、changeCommand フラグが “Box Simulation” チェック ボックスでトリガされる場合に、“Sphere Simulation” チェック ボックスがその現在値と反対の状態に編集されることを示します(したがって、“Box Simulation” をオフにすると、“Sphere Simulation” は自動的にオンになります)。

    MEL では、#1 がチェック ボックスの値を表す代用文字です。この行のコードを実行すると、#1 はチェック ボックスの値に置き換えられます。 プログラミングでは、記号 ! は、「not」を意味します。したがって、上記コードでは、“Sphere Simulation” チェック ボックスは現在値ではない(!)値(#1)に変更されます。

    最後に、以下を追加します。

    checkBox -edit -changeCommand ("checkBox -edit -value (!#1) "+ $box_sim_checkbox) 
    $sphere_sim_checkbox;
    

    これは、“Box Simulation” チェック ボックスが “Sphere Simulation” の変更時に変更される点を除いては、前述の行と同じです。

プロシージャを実行する

makeRoll プロシージャを実行するには引数が必要です。プロシージャをウィンドウにリンクするには、ユーザ インタフェースのコントロールから引数の値を取得し、この引数を使用して makeRoll プロシージャを実行します。

コントロールの値を取得するには、照会フラグを使用する必要があります。照会フラグを使用して、コマンドがシーン内の引数の値を返すようにすることができます。

ユーザ インタフェースで値を照会するには

  1. 直径スライダを右側にドラッグするか、スライダのテキスト フィールドに値を入力して、直径スライダの値を 10.1 に変更します。
  2. tempMEL タブで次のように入力し、直径スライダの値を出力します。
    print ("The diameter is: " + `floatSliderGrp -query -value $diameter_float`);
    

    スクリプト エディタ(Script Editor)に次のように出力されます。

    The diameter is: 10.1
    

    照会フラグを使用して、スクリプト エディタ(Script Editor)に値を出力することができます。

スクリプトに新しいプロシージャを追加します。このプロシージャでは、makeRoll コマンドを使用し、ユーザ インタフェースから照会される引数値を指定します。 このプロシージャは実行(Execute)ボタンによって使用されます。

実行(Execute)ボタンのプロシージャを作成するには

  1. MEL2 タブの最上部に以下を追加します。
    global proc makeRoll_calback (string $obj_name_text, string $ground_int, string $box_sim_checkbox, string $diameter_float)
    {
    makeRoll 
     `textField -query -text $obj_name_text` 
     `intSliderGrp -query -value $ground_int` 
     `checkBox -query -value $box_sim_checkbox` 
     `floatSliderGrp -query -value $diameter_float`;
    }
    
  2. ユーザ インタフェースのすべての引数がユーザ インタフェース要素を照会することにより定義されます。

これで作成したプロシージャをコールする実行(Execute)ボタンを設定できるようになりました。

Execute コマンドをプロシージャにリンクするには

  1. MEL2 タブで、-command "print (¥"something¥") ;"; 行を次の行に置き換えます。
    -command ("makeRoll_calback "+$obj_name_text+" "+$ground_int+" "+$box_sim_checkbox+" "+$diameter_float);
    

パラメータ $obj_name_textground_intbox_sim_checkbox、および diameter_float により、プロシージャは makeRoll スクリプトの実行に必要な値を取得します。

これでユーザ インタフェースは完全に機能的になりました。

ユーザ インタフェース スクリプトの完成版は、mel_Lesson_4_finished.mel という名前で GettingStarted2014LessonData¥MEL プロジェクト フォルダにあります。