Step2-4の最後に関数と「window」という命令のお話をしました。今回はそれを使ってみます。ユーザインタフェースを作成するのです。
早速Mayaを起動して、スクリプトエディタでWindowの意味を調べてみましょう。「Window」とキーで入力して右ドラッグからマニュアルを見ます。
やはり、これはウインドウを作成する命令のようです。「Mel例」というところをクリックしましょう。
これをPymelに変換します。
import pymel.core as pm
window=str(pm.window(widthHeight=(200, 55), iconName="Short Name", title="Long Name"))
# Make a new window //
pm.columnLayout(adjustableColumn=True)
pm.button(label="Do Nothing")
pm.button(command=lambda *args: pm.mel.eval*1, label="Close")
pm.setParent('..')
pm.showWindow(window)
実行すると、こんなウインドウが出ます。
ボタンをクリックはできますが、「Do Nothing」なので何も起こらないですね。「Close」でウインドウが閉じます。
さて、仕組みを見てみましょう。
window=str(pm.window(widthHeight=(200, 55), iconName="Short Name", title="Long Name"))
いきなり長いですね。でも過去に
X=1
とかやりましたね。Windowという変数を作って、それに値を代入しているようです。
=str()は数値を文字に変換するPythonの命令です。以下など参考にしましょう。
この行ではMayaのウインドウを生成(データみたいなもの)して、windowという名前の変数に入れているのです。ちょっと判り難いですが、ここでは「そういうもの」で構いません。これは別の機会に改めて説明します。
マニュアルには、pm.windowが「ウインドウを作成する」とあります。()の中はCubeとかでやりました「オプション」です。
widthHeightはウインドウの大きさ、title=はウインドウのタイトルで、iconName=はウインドウの左上のアイコンを決める、ようです。
こうやってマニュアルを見て流れを研究します。
でもマニュアル最初に「作成されたウィンドウは非表示のままになります。最も効率的なのは、ウィンドウの要素を追加してから showWindow コマンドを使用してウィンドウを可視化する」とあります。
一番最後の行でpm.showWindow(window)がありますから、これとセットで使うようです。
次のpm.columnLayout(adjustableColumn=True)はここのマニュアルにないので、再度調べます。
これは縦に並べる命令のようです。「子を」がpm.setParent('..')です。
その下のpm.buttonはボタンを作成する命令で、上のcolumnLayoutがあるので、ボタンが縦に並ぶ、ということですね。
(label="Do Nothing")はボタンの表示のようです。
上のボタンは"Do Nothing"で何も起きないで、下は動作する、ということは、違いを見ると、 pm.button(command=lambda *args: ???)が怪しいですね。
???はウインドウを閉じる機能と思われます。そう思ったら、すぐに実験です。
polyCylinder()で円柱が表示されるので、pm.button(command="pm.polyCylinder()", label="Cylinder")ではないか?と考えます。
"Do Nothing"の行と入れ替えて実行します。
ちゃんとボタンをクリックすると、円柱が出ました!正解だったようです。
このようにマニュアルを見ながらサンプルプログラムの意味を分析すると、学習効果が高いです。面倒とか思わずにすぐにチェックしましょう。
さて、でも円柱出すなら、普通にやったほうが早いですよね?しかし、command="pm.polyCylinder()"みたいのコマンドは1つしかボタンに入れられません。そこで前回の「関数」が再登場なのです。
前回の
def TreeObject():
pm.polyCylinder()
pm.polySphere()
pm.cmds.move(2, 0, 0)
pm.polyCube()
pm.cmds.move(-2, 0, 0)
を実行して関数を定義します。
ボタンを出す命令を以下に変更します。
pm.button(command="TreeObject()", label="Tree")
ボタンで関数を呼び出せば、長い処理をボタン1つで処理ができる訳です。
いかがですか?次回もUIをやって、オリジナルなMayaツールを作成します。
*1:"deleteUI -window " + window