まだまだ続くMaxScript勉強。
MenuMan コア インタフェース を使用すると、メニュー マネージャへのアクセスが可能になり、メニューを新規に作成したり、既存のメニューやクアッドメニュー、
およびそれらのサブメニューやメニュー項目にアクセスしたり、それらのメニューのロード、保存、登録、および登録解除を行うこともできます。
とのことなので、いろいろ試してみた。
maxのMenuは、インストールされているフォルダのなかのUIフォルダ内に、メニューの設定ファイルが置いてあり、そのファイルを読み込んでメニューを作成しているようだ。
menuMan.getMenuFile()
で、現在読み込まれている .mnuファイルがフルパスで取得できる。
弄りたいメニューを探す
<Interface:menu> = menuMan.findMenu <menuName>
戻り値はmixinインターフェースのポインタ ない場合はundefined
操作方法は、<Interface>のメソッドを使う。詳細はHelpのMenuMan コア インタフェース > Mixin インタフェース: menuMan.getMenu(…)
menuを作る
<Interface:menuItem> = menuMan.createActionItem macroScriptName macroScriptCategory
押した時に、何かしらのアクションを起こしたい場合、 アクションの内容を macroScriptで記述してセットして
上記のコマンドでボタンに対してBindする。
マクロの書き方は
macroScript macroScriptNamecategory:”macroScriptCategory“(…)
マクロの記述自体は、基本MaxScriptと共通
.msファイル内に一緒にmacroScriptを記述することもできる。
(その他オプションやら細かいことはまたいずれちゃんと勉強)
作ったメニューを追加する
<Interface:menu>.addItem <Interface:menuItem> position
ポジションは、<Interface:menu>の何番目に挿入するかを指定する。
一番最後なら -1
menu内に含まれるmenuItemのPositionIDを調べるコマンドを書いてみた。
見つからないときは -1 を返す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
fn getMenuPosition menuName menuItemName = ( menuInterface = menuMan.findMenu menuName if menuInterface != undefined then ( local returnVal = -1 num = menuInterface.numItems() for i = 1 to num do ( menuItemObj = menuInterface.getItem i if menuItemObj.getTitle() == menuItemName then ( returnVal = i exit ) ) ) returnVal ) |
if のところを return i とかにすると ** system exception **になるのの原因がいまいちよくわからない(´・ω・`)
けどとりあえずできたのでよし。
menuの再描画
menuMan.updateMenuBar()
addItemしたら、再描画。
再描画すると addItemで追加したItemが指定のMenuに追加される。
Installフォルダ/Scripts/Startup 直下に msファイルを入れておくと、Maxが起動した時にスクリプトがロードできるっぽいので
追加するコマンド類をmsファイルに入れてここに突っ込んでおいてロードするか
MacroScriptをセットして、Max起動時にMacroが動くようにするかすれば良い…のかな。このへんはまた明日調べる予定。
maxscriptは、mel以上に資料が少ない(´・ω・`)
すみません、最近maxscriptを仕事でちょっと使っていて、こちらをだいぶ参考に
させて頂いてます。ありがとうございます!!
真ん中あたりにある** system exception **がでるという部分の
原因がわかりました。というか僕もこの件でちょっとはまっていたので。。。
原因は恐らくforの途中でreturnしてるのが原因と考えられます。
ifのなかに入った際、iを別の変数に代入して、forの出た後、つまり最後に
その変数をreturnしてあげるとエラーは出なくなりました。
恐らく途中で抜けるのではなく最後まで処理しなさいというちょっと厳しめの制約があったのではと。
ちなみに、max2012だとエラーなのにmax2013では普通に通りました。
ここらへんが余計にはまった原因でもあります。恐らく2013で緩くなったのかもしれません。。
もし、間違いでしたら申し訳ございません。
今後も参考にさせて頂きたいと思います。よろしくお願いします。
わざわざ有り難うございます!
たしかに私も、他のバージョンならいけたのになんでだろうなーと思った記憶があります。
returnまわりが他の言語とちょっと様子が違うのもわかりにくい原因の一つですね(汗
あんまりMAXは使わないので、maxscriptの記事出現頻度は少ないですが
よろしくお願いします!