UI・ダイアログ
MaxScript チートシート の章一覧
ユーザとのやり取りです。一行の確認や入力は組み込み関数で済み、本格的なツールパネルは rollout(ボタンやスピナーを並べた UI の定義)を書いて createDialog でウィンドウとして表示します。
メッセージ・確認ダイアログ
messageBox "処理が完了しました" -- OK だけの通知
messageBox "失敗しました" title:"エラー" icon:#warning
queryBox "続行しますか?" -- Yes/No → true/false
yesNoCancelBox "保存しますか?" -- #yes / #no / #cancel を返す
queryBoxはtrue/falseを返します。title:(既定は “MAXScript”)やicon:(#question#information#warning#critical)で見た目を変えられます。yesNoCancelBoxは#yes#no#cancelのどれかを返します。#で始まる値は Name 値 と呼ばれ、if r == #yes do ...のように==で比べます。- ⚠️ リスナーに複数行を貼って実行すると、
messageBoxの後の行が先に実行されることがあります。全体を( ... )で囲みます。
一行の値入力
どちらもダイアログは出ず、MAXScript リスナー(閉じているときは画面下のミニリスナー)にプロンプトが表示され、そこに入力します。
n = getKBValue prompt:"数値を入力" -- 式を入力して評価した値(数値に限らない)
s = getKBLine prompt:"文字を入力" -- 文字列入力
- 数値がほしいときは
classOf n == Integerなどで型を確かめます。 - ⚠️
getKBValueは Esc で中止すると#escapeを返します。getKBLineも中止すると特別な値を返すので、どちらも使う前にチェックします。
進行状況バー(プログレスバー)
進捗バーは 3ds Max 下部のステータスバーに表示されます。
progressStart "処理中..."
for i in 1 to 100 do
(
-- ...何か処理...
progressUpdate i -- 0〜100 の値。n 件なら 100.0 * i / n(整数同士で割ると 0 になる)
if getProgressCancel() then exit -- ユーザがキャンセルしたら中断
)
progressEnd()
progressUpdateの戻り値でも判定できます:if not (progressUpdate i) do exit(続行ならtrue、キャンセルならfalse)。exitはforループを抜ける意味です。- ⚠️
progressStartとprogressEndは 必ずペア にします。途中で抜けるときもprogressEndを忘れないようにします。例外で抜ける可能性があるならtry ( ... ) catch ( progressEnd(); throw )のように囲みます。
rollout(ツールパネル)
rollout myTool "My Tool" width:200
(
spinner spnCount "個数:" range:[1,100,5] type:#integer
checkbox chk "ランダム配置" checked:false
dropdownlist ddl "並び方:" items:#("横一列", "円形")
edittext edt "接頭辞:" text:"Box"
button btnRun "実行"
label lblInfo "待機中"
on btnRun pressed do
(
lblInfo.text = "実行中..."
for i in 1 to spnCount.value do box pos:[i*20,0,0]
lblInfo.text = "完了"
)
)
try (destroyDialog myTool) catch() -- 実行し直したとき、前のダイアログを閉じる
createDialog myTool -- フローティングダイアログとして表示
-- destroyDialog myTool -- 閉じる
- ボタン押下などは
on <コントロール名> <イベント> do (...)で処理します。 - 主なコントロール:
buttonspinnercheckboxdropdownlistedittextlabelradiobuttonscolorpicker。 listbox/multilistbox/pickbuttonなど、コントロールごとの書き方とイベントは 「rollout コントロール」章 にまとめています。- rollout 名(
myTool)はグローバル変数になるので、他のスクリプトとぶつからない名前にします。 - ボタン 1 回分を Ctrl+Z で戻せるようにするなら
undo "名前" on ( ... )で囲みます。
rollout の値を読む / 書く
myTool.spnCount.value -- スピナーの現在値
myTool.spnCount.value = 10 -- 値を設定
myTool.chk.checked -- チェックボックスの状態
myTool.ddl.selection -- ドロップダウンの選択インデックス
myTool.ddl.selected -- 選択中の文字列
myTool.edt.text -- エディットボックスの文字列
- rollout の外(リスナーなど)からは
rollout名.コントロール名で参照します。rollout 定義内のイベントハンドラの中では名前だけで書けます。
落とし穴まとめ
- 入力系(
getKBValue等)は Esc で中止すると特別な値(getKBValueは#escape)を返す。必ずチェックする。 progressStart/progressEndはペア。例外時も閉じる。- rollout のイベントは
on コントロール名 イベント do。コントロール名は一意にする。 - 長い処理中は画面が更新されない。進み具合を見せたいなら
progressStart/progressUpdateを使う。
関連
- コントロールごとの定義・プロパティ・イベント: 「rollout コントロール」章
- 入力値の整形・検証: 「文字列・配列」章
- 処理対象の選択: 「選択・取得」章
コメント