チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第39回:ポリゴン数をリストアップしよう!(3/4)GUIにリストを表示しよう

2013.03.13

  • Maya
  • ゲーム
  • コラム
  • チュートリアル
  • モデリング
  • 中級者
  • 学生・初心者
  • 教育
  • 映画・TV

…なんとなく記事に華やかさがないですが、着実にツールは出来てきております。前回まででシーン内のモデルのリストを、ポリゴン数の多い順に得られるようになりました。

あとはこれをGUIに出すだけです。このツールが出来ればきっとプロジェクトのみんなが恩恵を得られること間違いなし!テクニカルアーティストの階段をまた一歩登るために、もう一息頑張って行きましょう。

GUIの作成

まずは中身がなくてもいいので、GUIを作りましょう。

Mayaでウインドウを作るのにお決まりのパターンがあります。次のスクリプトの様な3行のコマンドが「お決まりパターン」です。スクリプトを実行すると空のウインドウが表示されます。

window -title "Tool Name" myToolGUI;
columnLayout;
showWindow myToolGUI;





多分ウインドウが小さく潰れているので、図のようにウインドウを広げて下さい…。

これが、どういう仕組なのか理解するのが複雑でして、ちょっと詳しく説明します。普段ウインドウを作るけど、具体的に何が起きているかイマイチ把握されていない方は、知るとよりうまくコントロールできるようになると思います。

あとMELはいろいろな書き方があります。混乱のもとになるので大抵MELの説明をする時に深く言及しないのですが、たまにはいいだろうということで、いろいろ追加で説明してみます。

まず

window -title "Tool Name" myToolGUI;



の説明を。

「window」はウインドウを作るコマンドです。

「-title」はタイトル名です。ウインドウバーに表示される名前を指定します。
もしこれが指定されていなければ「ウインドウの内部名」がタイトル名になります。ダブルクオーテーションで文字をくくってなくても大丈夫ですが、タイトル名に空欄を入れたりするでしょうから、念のためいつも「””」でくくっておくほうが良いです。

「myToolGUI」は「ウインドウの内部名」です。「”myToolGUI”」とダブルクオーテーションでくくってもOKです。でも空欄をいれちゃダメです。「内部的な…」というものに空欄を使うと大体危ないです。
Mayaは作られるウインドウやボタンなどの全てのGUIに個別の内部名を持たせて管理しています。必ず名前の指定が必要です。もし名前を指定していなければ、自動で適当な名前が付きます。

自動で名前がつくので、あとでウインドウにアクセスしないなら「window;」だけで実行して問題ありません。ボタンなど他のGUI要素も同じで、名前を指定しなければ勝手に名前がつきます。いちいち全てのGUI要素に名前をつけるのは大変ですから。

GUI要素を作って、あとからアクセスするなら、

string $win = `window`;



として一旦自動でつく名前を保存しておいて、

window -e -w 200 $win;



という風にアクセスするのもありです。上の例ではウインドウの幅をあとから変更しています。まああとでアクセスするなら、念のため何かツールにちなんだ名前をつけておくと良いです。

ただし既に使われている名前とかぶってしまうと、誤作動をする元になってしまいます。現実的に名前が重複することは稀ですから特に気にすることはありません。名前がかぶってしまったらその時に変更すればよいのです。

「window」コマンドを実行すると、メモリ内にウインドウが作られます。表示はされません。ウインドウを実際に表示するには「showWindow」を実行します。

イメージとしては、次の図のような感じです。
「window」コマンドを実行して、Mayaのメモリ内にGUIを作ります。ここぞという時に「showWindow」を実行すると、Mayaのメインビューにポッと現れます。



「showWindow」を呼ぶまでウインドウは表示されていませんので、その間にボタンやらなにやらを作れば、画面がちらつくことなく、高速にGUI要素を設定できるわけです。

「showWindow myToolGUI」(もしくは「”myToolGUI”」)という風にウインドウ名を指定するのが正式な実行方法です。とはいえ「window」コマンドの後に別のウインドウが作られていなければ、どのウインドウを表示すべきかおのずとわかりますので、特にウインドウ名を指定しなくてもMayaが勝手に適切なウインドウを表示してくれます。

「columnLayout」 はウインドウ内にどんな順でボタンなどを配置するか決めます。コラムレイアウトは、縦方向にGUI要素を並べていきます。図にするとこんな感じです。



リスト表示用GUI

さてウインドウにリストを表示するのに、どうやって表示しましょうか?「text」コントロールを並べて表示するのはちょっと大変そうですね。リスト数が多い時にスクロールができませんし。

Mayaではリスト表示するために「textScrollList」というGUIが用意されています。今回はこれを使いましょう。

例えば次のようなスクリプトを用意して実行してみましょう。

window -title "Tool Name" myToolGUI;
columnLayout;
textScrollList myScrollList;
showWindow myToolGUI;

textScrollList -e -a "Hello everyone!" myScrollList;
textScrollList -e -a "This is a pen!" myScrollList;
textScrollList -e -a "I love Maya!" myScrollList;



もしエラーが出たら、ウインドウを一度閉じるか、

deleteUI myToolGUI;



を実行してメモリに残っているウインドウを削除して、再実行してみて下さい。(ウインドウ作成時にエラーが起きるとよくこんな問題が起きます。慌てず騒がず「deleteUI」です。)



こんな感じのウインドウが表示されましたでしょうか?
「textScrollList」コマンドでテキストスクロールリストを作った後で、改めて項目を追加しています。こういう時にGUIの名前が重要になってきます。項目追加の部分では、「textScrollList」を「-e」(編集モード)で「-a」(項目追加)しています。

さてウインドウが出来ましたから、ちょっといじくってみましょう。ウインドウの端をドラッグしてウインドウサイズを変更すると、あら、リストの大きさが変わりません…。



「columnLayout」だとこうなります。ウインドウにしっかり大きさを合わせたい時は「formLayout」を使います。でも「formLayout」は設定が面倒なんですよね…。今回は代わりに「frameLayout」を使うことにします。「frameLayout」ならウインドウのサイズ変更に伴って、リストのサイズも変更してくれます。

「columnLayout」を「frameLayout」に書き換えて見ましょう。こんな感じでウインドウサイズを変えても変な隙間が出来ないように表示されます。



前回までのスクリプトと一緒にすると次の様なコードになります。

proc string[] getMeshList(){
string $meshes[] = `ls -type mesh`;
int $nums[];
string $data[];
for ( $mesh in $meshes ){
int $numTris[] = `polyEvaluate -t $mesh`;
$nums[ size($nums) ] = $numTris[0];

$data[ size($data) ] = $mesh + "-" + $numTris[0];
}
// ソート
$nums = sort($nums);

//ソートした配列を逆順で辿る
//(数字の大きな方から表示するため)
string $results[];
for ( $i = size($nums)-1; $i >= 0; $i-- ){

string $num = $nums[$i];

// 該当のメッシュを探す。
// 見つかったら値を空""にして、二重に見つからないようにしておく。
//
for ( $j = 0; $j < size($data); $j++ ){
if ( `gmatch $data[$j] ( "*-" + $num )` ){
$results[size($results)] = $data[$j];
$data[$j] = "";
}
}
}
return $results;
}

proc gui(){
string $win = "listNumberOfPolygonWin";
if ( `window -q -ex $win` ){ // 既にウインドウがあれば削除
deleteUI $win;
}
window -t "List Num of Polygon" $win;
frameLayout -l "List of mesh"; // frameLayoutはウインドウのサイズ変更に自動で対応出来る
textScrollList -ams true lnp_slist; // テキストのリストはこれ。-amsは複数選択可かどうか。
string $data[] = getMeshList();
for ( $item in $data ){
textScrollList -e -a $item lnp_slist; // 項目追加
}
showWindow $win;
}
gui();



GUI作成部分を「gui()」という関数にまとめました。
「getMeshList()」でモデルのリストを取得し、順に「textScrollList」に追加しています。

実行するとこんな感じのウインドウが表示されます。



シーン内のモデルが、ポリゴン数の多い順にリスト表示されました!なんとかここまで出来ました。ちょっと感動。

まとめ

今回は簡単なウインドウを作ってみて、その仕組を見てみました。何度も作っていると段々理解できてくるのですが、なんだかGUI作るのは、謎なマイルールが沢山あってわかりにくいので難しいですね。ドキュメントもあまりないですし。そのうち詳しく解説したいと思っています。

他、今回は「textScrollList」を使ってみました。これは様々な所で使える便利なGUIです。項目を追加するだけでなく、削除することも出来ます。いろいろ試してみて下さい。

GUIにリストを表示出来ましたので、ほとんどツールは完成です。次回は更に便利にするため、リストの項目を選択したら該当のモデルが選択されるよう、GUIにコマンドを仕込んでみたいと思います。

Maya Learning Channel
製品購入に関するお問い合わせ
オートデスク メディア&エンターテインメント 製品のご購入に関してご連絡を希望される場合は、こちらからお問い合わせください。