リファレンス / 3ds Max / MaxScript チートシート

UI・ダイアログ

  • 3dsMax
  • MaxScript
  • チートシート
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 (...) で処理します。
  • 主なコントロール: button spinner checkbox dropdownlist edittext label radiobuttons colorpicker。
  • 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 を使う。

関連

← MaxScript チートシート へ