引き続きMaxScriptの勉強。
UIを作るときは、 MaxScript > Visual MAXScriptを使うと GUIで、手軽にUIを作成することができる。
ただ、UIがおおかったりする場合は、手で書いたほうが早いのかもしれない。
Rolloutを作る
melでいうところのLayoutのようなもの(だと解釈)
この中に、Widgetや Eventコマンドなどを記述する。
rollout <rolloutName> “rolloutTitle” width:val height:val
(
<widget>
<EventCommand>
)
<widget> 部分には、 Button や Label editText のようなWidgetを記述してRollout上に配置する。
例はbuttonだが、基本どのwidgetも引数は同じ。
button <widgetName> <Caption> pos:[x,y] width:val height:val
widgetNameは、値をSetしたりGetしたりするときに使用するWidgetの名前。
Captionは、見出し posは配置する座標 widget height は widget自体の大きさを設定する。
<eventCommand>は、押した時 値が変わった時 などに実行されるコマンドを記述する。
例として、checkboxが変わった時の書き方
on <objectName> changed <state> do ( command)
<objectName> は、イベントを指定したいWidgetの名前
<state> は、イベントの返り値(changedの場合は、checkButtonのOn Offが Boolで帰ってくる)
イベントの種類は、各Widgetごとに異なるので、 Visual MAXScriptのEventタブで対応しているものを確認する。
または、VisualMaxScriptでも EventScriptは記述できる。
Windowを作る
UI = newRolloutFloater “<windowTitle>” width:val height:val
を実行すると、widthとheightで指定した大きさの 空のUIが作成される。
そこに rollout(mayaで言うところのLayout?)を配置する。
addRollout <rolloutName> <uiName>
uiName は、Rolloutを載せたいWindowを指定
<rolloutName> は、予め設定しておいたRolloutの名前を入れる。
<rolloutName> 含めて、Widgetの名前は重複できないので かならずかぶらない名前をそれぞれ指定する。
Widgetの値を取得・設定する
Widgetの値を取ってきたい場合は、アトリビュートへの値のセット同様に
<rolloutName>.<widgetName>.<attribute> = val
のようにする。
Eventを書くときは
<widgetName>.<attibute> = val
値を取得したい場合は、 = の左右が逆になる。
(maxscriptの場合、何かの値にアクセスする場合、フォルダの階層をたどるように . で、取得したいAttributeにアクセスしにいく。
eventは rolloutを記述している階層からになるので <widget>.<attribute> その外側からだと、 階層がひとつ上がるので <rolloutName>.<widget>.<attribute>に。
. を 「~の中にある」 と言い換えるとわかりやすいのかも。)
記述的には、melよりはるかに楽でわかりやすいけど デフォルトで使えるwidgetの数があんまりないのが玉に瑕。
例) ファイルを選択して editTextにセットする セットされた値を取得して、Labelに表示するSample。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
rollout saveFile "sampleUI" width:344 height:91 ( button saveBtn "Save File" pos:[248,11] width:81 height:25 editText filePath "" pos:[15,11] width:217 height:25 label showFilePath "" pos:[10,49] width:222 height:32 button printBtn "print Path" pos:[248,56] width:81 height:25 on saveBtn pressed do filePath.text = substituteString (getSaveFileName types:"All(*.*)|*.*|") "\" "/" on printBtn pressed do showFilePath.text = filePath.text ) mainUI = newRolloutFloater "sampleWindow" 360 120 -- add Rollout -- addRollout saveFile mainUI |
getSaveFileName が、Dialogを表示してSaveフォルダとファイル名を設定して返すコマンド、 types: ~ で、保存できる形式を限定。
substituteString は、正規表現を使用して文字列を置換する。
getSaveFileName の戻り値は C:abcd.bat のように で帰ってきてしまうのでプログラム的に都合が悪いので / に変換。
VisualMAXScriptも、はじめは使いにくいと思ったけど、なれるとサクサクUI作れるのが良いね。