MaxScriptを書こう ~その8

2021年9月3日

UIをつけてツール化しよう

UIというのはユーザインタフェースのことです。ここではグラフィカルなものを指しているので厳密にはGUI(グラフィカルユーザインタフェース)と呼んだほうが良いのですが、3dsmaxでは「ユーザインタフェースのカスタマイズ」という具合に使われているのでそれに習うことにします。

※余談ですが私は「ユーザインタフェイス」と表記する方が好きです

さて、MaxScriptでグラフィカルなUI、つまりボタンやスピナー、スライダやリストなど、視覚的に操作できるインタフェースを作る方法は大きく分けて2つあります。ロールアウトと呼ばれる要素を作ってそれをダイアログとして表示する方法と、複数のロールアウトを組み合わせてロールアウトフロータと呼ばれる小窓を生成する方法です。

まずはロールアウトダイアログを作る方法でやってみましょう。

ロールアウトを作る

ロールアウトというのは3dsmaxのパネル上でも使用されているものです。百聞は一見にしかず、とにかく作ってみましょう。

rollout ro_adjust_pos "位置の値を丸めるツール" (

)

ロールアウトはrolloutというキーワードを使って次のように定義します。

rollout (ロールアウトオブジェクトを格納する変数名) "(ロールアウトに表示するタイトル)" (
    ロールアウトの中身
)

これを踏まえると今定義したロールアウトは、ro_adjust_posという名前の変数に格納され、タイトルとして「位置の値を丸めるツール」という文字列が表示されますよ、ということになります。

中身の部分は何もないので空っぽのものができます。このロールアウトを生成するには、次のようにcreateDialog()というビルトイン関数を使用します。createDialogには引数としてロールアウトオブジェクトを渡します。ここでロールアウトの宣言に使用した変数を使います。

createDialog ro_adjust_pos

実行してみてください。rolloutの定義をエディタに書いて評価し、その上でcreateDialogをリスナーから実行しても構いません。エディタのrollout定義の下にcreateDialogを書いても構いません。rollout定義がcreateDialogより先に評価されていれば問題なくロールアウトが表示されます。

ボタンを作る

空のロールアウトを生成できたので、次はこれにボタンを乗せてみましょう。ボタンは次のようにして定義します。

button (ボタンオブジェクトを格納する変数名) "ボタンに表示する文字列"

これに習って実行ボタンを作りましょう。

rollout ro_adjust_pos "位置の値を丸めるツール" (
    button btn_exec "実行!"
)

createDialog ro_adjust_pos

createDialogまでエディタに書いてしまってまとめて実行されるようにしました。書けたら評価(Ctrl+E)してみてください。

ボタンができました。もちろん、押しても何も起こりません。ボタンを押した時どうなるか、という処理をまだ実装していないからです。その「ボタンが押されたときに行う処理」のことをイベントハンドラと呼びます。「ボタンが押された」というような状況のことをイベントと呼び、他にも「テキストが入力された」「ラジオボタンが押された」「チェックボックスにチェックがつけられた」「スライダが動かされた」などの操作のほか、「ロールアウトがドラッグされた」「サイズが変更された」などもイベントです。それらのイベントが検知されたときに呼ばれる処理がイベントハンドラです。

あまり難しく考えず、「ボタンが押されたときに実行される処理」ぐらいに思っておけば大丈夫です。

ではその処理を書いていきましょう。ボタンが押された、というイベントのハンドラはpressedというキーワードで定義します。まずは仮で、リスナーに文字列を出力してみましょう。

rollout ro_adjust_pos "位置の値を丸めるツール" (
    button btn_exec "実行!"

    on btn_exec pressed do (
        print "ボタンが押されたよ"
    )
)

createDialog ro_adjust_pos

スクリプトを評価してUIの実行ボタンを押してみてください。

リスナーに「ボタンが押されたよ」と表示されれば成功です。

あとはこのイベントハンドラの中に、ボタンを押した時に実行したい内容を書けば良いだけです。今回は「選択されているオブジェクトすべてに対してadjustPos()を実行する」という処理を実装してみましょう。

rollout ro_adjust_pos "位置の値を丸めるツール" (
    button btn_exec "実行!"

    on btn_exec pressed do (
        for sel in selection do (
            adjustPos sel
        )
    )
)

createDialog ro_adjust_pos

評価してシーン内のオブジェクトを適当に選択し、実行ボタンを押してみましょう。

※このロールアウトを評価する前にadjustPos()の関数定義を評価しておかないとエラーになります。先にadjustPos()を評価しておいてからロールアウトを評価してください。

選択したオブジェクトに対して「位置の値を丸める」という操作を実行するツールができました。

次回はこのツールを少し改良しましょう。

今回のまとめ

  • ロールアウトを定義し、createDialogすることでユーザインタフェースを表示することができる
  • ボタンが押されたときに何か処理をするにはイベントハンドラを定義する必要がある
  • ツール内で使用する関数は使用する前に評価されている必要がある

前:MaxScriptを書こう ~その7

次:MaxScriptを書こう ~その9