ウィンドウの名前付け
 
 
 

ユーザ インタフェース スクリプトが複雑になるほど、構文エラーを起こしやすくなります。ユーザ インタフェース スクリプトが部分的に実行されてエラーで停止した場合は、ウィンドウ自体は存在しますが、表示されません。問題を修正して再度スクリプトを実行するには、ウィンドウに新しい名前を付けるか、非表示ウィンドウを削除する必要があります。

ネーミング コンフリクトを解決する

次のセクションでは、条件文を使用して、ウィンドウのネーミング コンフリクトを解決します。条件文を使用すれば、変数の値やシーン内のオブジェクトの状態に従って、一連のコードを実行することができます。

ウィンドウ名のコンフリクトを解決するには

  1. スクリプト エディタの MEL タブで次のように入力してスクリプティング エラーのあるウィンドウを作成し、showWindow コマンドの前に挿入します。
    window testwindow; fake_command; showWindow;

    エラーがスクリプト エディタに出力されます。

    // Error: line 2: Cannot find procedure "fake_command;". // 

    ウィンドウは非表示ですが、まだ存在しています。

  2. スクリプト エディタの MEL タブに次のように入力し、同じ名前で別のウィンドウを作成します。
    window testwindow; showWindow;

    エラーがスクリプト エディタに出力されます。

    // Error: line 1: Object's name is not unique: testwindow //

    Maya のすべてのオブジェクトとユーザ インタフェース要素には固有の名前が必要です。

ウィンドウの存在を照会するには

  1. スクリプト エディタの入力セクションに次のコマンドを入力し、非表示ウィンドウを削除します。
    deleteUI testwindow;
  2. 次のコマンドを入力して、ウィンドウが存在するかどうかチェックします。
    window -exists testwindow;

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

    // Result: 0 // 

    window コマンドの exists フラグは、ウィンドウが存在するかどうかによって、0 または 1 を返すようにコマンドを変更します。

  3. スクリプト エディタに次のように入力します。
    deleteUI non_existing_window; sphere;

    エラーがスクリプト エディタに出力されます。

    // Error: line 1: Object not found: non_existing_window

    スクリプトがスクリプティング エラーで停止しているので、sphere コマンドは実行されません。

既存のユーザ インタフェースが存在する場合のみ削除できるようにするには、条件文を使用します。

条件によってウィンドウを削除するには

  1. スクリプト エディタの MEL タブに次のように入力します。
    window testwindow; fake_command; showWindow;

    スクリプティング エラーがあるため、ウィンドウは非表示になり、showWindow コマンドは実行されません。

  2. スクリプト エディタの MEL タブに次のように入力します。
    if (`window -exists testwindow`==1) { deleteUI testwindow; } window -resizeToFitChildren 1 testwindow; columnLayout; 	text 		-label "This window deleted the other one"; showWindow;

    ここでは 2 つの概念が紹介されています。

コントロール名を格納する

ユーザ インタフェースのコントロールを参照するには、コントロールの名前が必要です。各ユーザ インタフェース要素に手動で名前を指定する代わりに、固有のデフォルト名を生成するコマンドを使用して、その名前を変数として格納することができます。

すべてのユーザ インタフェース コマンドは、作成時にフル ネームとパスを返します。戻り値を変数として格納しておけば、スクリプトのそれ以降のポイントでそれを参照できます。

コントロール名を変数として格納するには

  1. スクリプト エディタの MEL タブに次のように入力します。
    window -resizeToFitChildren 1 pick_me_window; columnLayout; 	$button_one=`button -label "Click Me!" 		-command "deleteUI $button_two"`; 	$button_two=`button -label "NO!, Click Me!!" 		-command "deleteUI $button_one"`; 	$button_close=`button -label "Close" 		-command "deleteUI pick_me_window"`; showWindow;

    ここでも再度評価にバックチックを使用していますが、この場合は 3 つの変数($button_one$button_two$button_close)を作成し、ボタン コマンドを呼び出すごとにこれに結果を入れています。

  2. ウィンドウのいずれかの「Click Me!」ボタンを押し、スクリプトをテストします。

    いずれかの「Click Me!」ボタンをクリックすると、ボタン コントロールの名前を引数(button_one または button_two)として格納している変数を使用して deleteUI コマンドを呼び出し、他のボタンを削除します。

    (二度目にボタンをクリックしたときには、削除しようとしたボタンはすでに削除されているため、エラーが発生します)。

  3. ウィンドウの閉じる(Close)ボタンを押して、ウィンドウを閉じます。

    ユーザ インタフェース ウィンドウを作成したときには、固有の名前を手動で割り当てました。これはユーザ インタフェースの複数のコピーは開けないということを確認するのには良い方法でしょう。より複雑なユーザ インタフェースでは、同じユーザ インタフェースの複数のコピーがあると、お互いに干渉したり、Maya の速度を遅くする可能性があります。

    注:コマンドを使用して変数を出力すると、ユーザ インタフェース要素のフルネームとパスを表示できます。

    print $button_one;

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

    pick_me_window|columnLayout2|button1

    これがユーザ インタフェース コントロールの完全なパスです。コントロールの名前とパスを格納した変数を使用すれば、ユーザ インタフェース要素を参照するのに名前とパス全体を入力する必要はありません。

このセクションでは、名前の付いたウィンドウの作成、削除、およびその存在チェックの方法について学習しました。次のセクションでは、より複雑なウィンドウのプロシージャに取り組みます。