2015年6月13日土曜日

fileinのナゾ

MAXscriptには、「filein」という別のmsファイルをスクリプト内に読んでくる物があります。
例えば、

main.ms

    aaa = undefined
    filein "C:\\Program Files\\Autodesk\\3ds Max 2015\\scripts\\testA.ms"
    print aaa


testA.ms
(
aaa = "fileinのナゾ。"
)

こういった2つのscriptがあるとします。
testA.msをmain.msで記述されているパスに置いて、main.msをMAXscriptエディタ実行すると、testAは実行せずとも、main.msはtestA.msの内容を読んで、変数aaaは”fileinのナゾ。”というstring値に置き換えられます。

しかし、main.msを
macroScript testmain category:"test" internalCategory:"test" toolTip:"testmain" buttonText:"testmain"

    aaa = undefined
    filein "C:\\Program Files\\Autodesk\\3ds Max 2015\\scripts\\testA.ms"
    print aaa

と書き換えてツールバーに登録して実行すると、変数aaaはundefinedのまま、置き換わってくれません。
なんでや。


・・・しばらくナゾだったんですが、
こちらの記事で多分こういうことだろうと納得しました。
http://0303.blogspot.jp/2012/12/blog-post_5.html

はじめに、macroscript宣言をして、エディタからCtrl+Eで実行すると、usermacrosフォルダに登録されます。
なので、上記記事の5のところで、main.msは評価されているということになります。
しかしながら、fileinについては、ここでコンパイルされなんじゃないかと予想。

次に、上記6のスタートアップスクリプトにmain.msを入れてMAXを再起動。
結果としてはこちらもダメでした。

どうやらMAXのGUI構築前に、fileinは実行しとかないとダメなようですね・・・。

というわけで、stdscriptsにmain.msを入れて、testA.msを読むことが出来ました。

実際にツールを作るときには、ツール本体、filein宣言のみのmsファイル(stdscriptsにいれる)読み込む対象のmsファイル(場所はどこでもいい)
と、3つのmsファイルに分けて運用することになるかと思います。

これで、ツール本体をコンパイルしなおさなくても、対象ファイルを書き換えるだけでツールの内容を更新出来ますね。
問題があるとすれば、stdscritsで読んだ変数はグローバル変数になるというところです。
上記例でいうと、変数aaaがグローバル変数に・・・。

でも実際には読み込む対象は構造体などだと思うので、ほとんど問題無いんじゃないでしょうか。