今のところ、ウィンドウのユーザ インタフェースはまったく動作せず、スライダを動かしてもチェック ボックスをクリックしても反応がありません。このセクションでは、ユーザ インタフェースを前に使用した makeRoll プロシージャにリンクする方法について学習します。
次の手順では、ユーザ インタフェース スクリプトを修正します。
ユーザ インタフェース スクリプトの完成版は、mel_Lesson_4_finished.mel という名前で、GettingStartedMaya2013LessonData¥MEL プロジェクト フォルダの mel サブフォルダ内にあります。
makeRoll プロシージャは、現在選択しているオブジェクトに作用するようになっていません。ここでは、textField コントロールが現在選択しているオブジェクトを表示するように、スクリプトを修正しましょう。
現在選択しているオブジェクトの名前を返すには、ls コマンド(list)を selection に付けて使用します。Maya では複数のオブジェクトを選択できるので、ls コマンドからの戻り値は、たとえ 1 つのオブジェクトしか選択されていなくても、文字列ではなく文字列配列になります。配列とは、同じデータ型の複数の項目を 1 つの変数に格納するために使用する、値を順序付けて入れたリストです。makeRoll プロシージャ文字列配列を引数にできないため、 ls -selection の戻り値を修正する必要があります。
この次のセクションでは、新規 tempMEL タブを作成して、学習するテスト コマンドを配置します。
select -allDagObjects;
$all_selected_objects =`ls -selection`;
print $all_selected_objects;
roll_Cube pPlane1
変数 $all_selected_objects は文字列配列です。つまり、変数内に複数の文字列が格納されています。配列内の値を要素と呼びます。
この例では、目的の操作は、roll_Cube プロシージャをシーンの 1 つのオブジェクトに適用するだけです。角括弧([ ])を使用すると、配列の個々の要素を指定できます。
select -allDagObjects; string $all_selected_objects[]=`ls -selection`;
$all_selected_objects[0]
$obj_name_text = `textField -editable 0 -width 400 -text $all_selected_objects[0]`;
配列の要素にアクセスするには、配列から抽出する要素のインデックス番号角カッコに入れます。配列のインデックス番号は 0 から開始します。
チェック ボックスもボタンと同様にコマンド フラグを使用できます。チェック ボックスはボタンよりも機能的なので、コマンド フラグが異なります。チェック ボックスは次の 3 つのコマンド フラグを使用できます。changeCommand、onCommand、offCommand
checkBox コマンドに edit フラグを付けて使用すれば、ユーザ インタフェースでチェックボックスの状態を変更できます。
checkBox -edit -value 0 $box_sim_checkbox;
実行前にオンであった Box Simulation チェック ボックスがオフになりました。このコマンドの値を 1 にして再度実行すると、チェックボックスはオンになります。
これは、edit フラグをコマンドに付けてコマンド フラグの引数として使用して、値の変更を可能にする方法を示しています。
次に、changeCommand フラグを使用して 2 つのチェック ボックスが同期するように設定しましょう。つまり、一方のチェック ボックスの状態を変更すると、他方のチェック ボックスがその反対の状態になるようにします。
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 プロシージャを実行します。
コントロールの値を取得するには、照会フラグを使用する必要があります。照会フラグを使用して、コマンドがシーン内の引数の値を返すようにすることができます。
print ("The diameter is: " + `floatSliderGrp -query -value $diameter_float`);
The diameter is: 10.1
スクリプトに新しいプロシージャを追加します。このプロシージャでは、makeRoll コマンドを使用し、ユーザ インタフェースから照会される引数値を指定します。 このプロシージャは実行(Execute)ボタンによって使用されます。
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`; }
これで作成したプロシージャをコールする実行(Execute)ボタンを設定できるようになりました。
-command ("makeRoll_calback "+$obj_name_text+" "+$ground_int+" "+$box_sim_checkbox+" "+$diameter_float);
パラメータ $obj_name_text、ground_int、box_sim_checkbox、および diameter_float により、プロシージャは makeRoll スクリプトの実行に必要な値を取得します。
ユーザ インタフェース スクリプトの完成版は、mel_Lesson_4_finished.mel という名前で GettingStartedMaya2013LessonData¥MEL プロジェクト フォルダにあります。