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

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

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

ユーザ インタフェース スクリプトの完成版は、Mel_UI_Final.mel という名前で、GettingStarted プロジェクト ディレクトリの mel サブディレクトリ内にあります。

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

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

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

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

配列の詳細については、『MEL とエクスプレッション』マニュアルの「 配列」を参照してください。

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

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

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

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

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

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

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

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

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

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

    roll_Cube pPlane1

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

注:配列は、プログラムでは大きなデータ セットを扱う場合によく使用されます。配列を使わないで大きいデータ セットを格納しようとすると、データの要素ごとに変数が必要になってしまい、スクリプトの維持が困難になるうえに、メモリ消費も多くなります。配列の詳細については、『MEL とエクスプレッション』マニュアルの「 配列」を参照してください。

配列のインデックスを使用して配列から 1 つの値を抽出し、選択項目を減らします。

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

  1. tempMEL タブで、次のように入力します。
    $first_selected_object=$all_selected_objects[0];
    select $first_selected_object;

    配列の最初の要素、roll_Cube が選択されています。

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

  2. MEL2 タブのユーザ インタフェース スクリプトの最上部に次のコマンドを追加します。
    $all_selected_objects=`ls -selection`;
    $first_selected_object=$all_selected_objects[0];
    select $first_selected_object;

    このコマンドは、選択項目を最初に選択したオブジェクトに変更します。

  3. MEL2 タブで、オリジナル スクリプトの 14 行目(MEL タブを参照)にある text フラグの引数を、name_of_object から次のように修正します。
    $first_selected_object

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

    $obj_name_text = 	`textField 	-editable 0 	-width 400 	-text $first_selected_object`;

    テキスト フィールドには現在選択されているオブジェクトが表示されるようになりました。

    オブジェクトを選択せずに、修正したユーザ インタフェース作成用スクリプトを実行しようとすると、文字列配列 $all_selected_objects に要素が存在しないため、エラーが発生します。

    ヒント:MEL2 タブ からスクリプトを実行しないでください。まだスクリプトの修正を続けますが、実行するとタブが消去されてしまいます。途中でどうしてもスクリプトを実行したい場合は、新規 MEL タブを作成し、そこにスクリプトをコピーして実行してください。

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

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

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

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

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

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

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

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

  2. MEL2 タブにあるチェック ボックス コマンド($box_sim_checkbox と $sphere_sim_checkbox)を置き換えます。このコマンドは、ファイルの先頭に行を追加したかどうかによって異なりますが、38 ~ 46 行目あたりにあるはずです。この 2 つのコマンドを次のように置き換えます。
    $box_sim_checkbox = 	`checkBox 	-value 1 	-label "Box Simulation" 	-onCommand "checkBox -edit -value 0 $sphere_sim_checkbox;" 	-offCommand "checkBox -edit -value 1 $sphere_sim_checkbox;"`; $sphere_sim_checkbox = 	`checkBox -value 0 	-label "Sphere Simulation" 	-onCommand "checkBox -edit -value 0 $box_sim_checkbox;" 	-offCommand "checkBox -edit -value 1 $box_sim_checkbox;"`;

    置き換えたコマンドは、オリジナル スクリプト ファイルの 35 ~ 43 行目に配置されます。

プロシージャを実行する

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

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

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

  1. 直径スライダを右側にドラッグするか、スライダのテキスト フィールドに値を入力して、直径スライダの値を 10.01 に変更します。

  2. tempMEL タブで次のように入力し、直径スライダの値を出力します。
    print ("The diameter is: " + `floatSliderGrp -query -value $diameter_float`);

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

    The diameter is: 10.01

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

ボタンのコマンド フラグを変更し、makeRoll コマンドをユーザ インタフェースで指定した値と同じ引数の値で呼び出します。

ボタンを makeRoll プロシージャにリンクするには

  1. MEL2 タブにある実行ボタン ブロックのコマンド フラグ(57 行目あたり)を次のように置き換えます。
    	-command "makeRoll \ `textField -query -text $obj_name_text` \ `intSliderGrp -query -value $ground_int` \ `checkBox -query -value $box_sim_checkbox` \ `floatSliderGrp -query -value $diameter_float`;"`;

    ユーザ インタフェースのすべての引数がユーザ インタフェース要素を照会することにより定義されます。行末にバックスラッシュを付けると、コマンド フラグの引数を複数行にまたがって記述できます。

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

ユーザ インタフェース スクリプトの完成版は、Mel_UI_Final.mel という名前で GettingStarted プロジェクト ディレクトリ(GettingStarted/mel)にあります。