起動時にスクリプトを実行して下さい。の改良。scriptJobで行こう。
前に書いた記事2つ、やはりまだ不具合があるわけですよ。
起動時にスクリプトを実行して下さい。っていうか設定記憶して下さいMaya様。
↑ この記事では userSetup.mel に mel スクリプトを記述すればいいらしいぜ、という話でした。 グーグル検索して分かったことを再メモしただけですね。
で、userSetup.mel に記述するんだぜという話自体には何も問題はなかったのですが、問題が出たのは、この記事の中で、グラフエディタの Infinity をオンにするということをやった後ですね。
Maya様は、グラフエディタで Infinity の表示をオンにしてるのに、起動するたびにこれを勝手にオフにしやがるので(2015以降では記憶してくれるようになったそうです)、ならば起動するたびにスクリプトを実行してオンにしてやれと思ったわけですよ。 ということで、Infinity をオンにするスクリプトを userSetup.mel に書きました。
しかしここで問題発生。 Maya 起動直後、まだ UI がロードされてないタイミングでこのスクリプトが実行されているらしく、「グラフエディタで Infinity をオンにしろ」 というスクリプトを書いても 「グラフエディタなんてものはねえよ(まだロードされてないから)」 というアフォな事態が起こっていたようなのですね。
そこで、ちゃんと UI がロードされるまでスクリプトの実行を待ってもらおうということで、evalDeffered コマンドというものがあるということが判明したので、書きました。
それがこの記事 ↓
ちょっと待ってから実行。
これで解決したかのように見えました。
・・・・しかし、また問題が・・・・
これ、確かに起動時は Infinity をオンにしてくれるわけですが、起動時だけなんですね。 その後、新規シーンを実行したり、既存のシーンを開いたりすると、Maya様はまたご親切にも Infinity をオフにしやがって下さるのですよ。 本当に毎回毎回、懇切丁寧にありがとうございます Maya 様!! \(゚∀゚)\
ということで、起動時にどうこうするというのは忘れて、新規シーン実行時、あるいは既存のシーンを開いた時にスクリプトが実行される方法を探ったのです。 XSI ではセルフインストール型のスクリプトに event を記述すればできますね。 これに相当するものを探していたのです。
そしたら偶然それを見つけた気がしまして、なじみの空調屋さんに検証をお願いしちゃったりして、なんとか解決した気がするというのが本記事です。 ああ前振りがなげえ。
ってことで、scriptJob コマンド です。
「新規シーンの時に、このスクリプトを実行」 「既存シーンを開いたら実行」 「選択しているオブジェクトが変わったら実行」 みたいに、指定したイベントが起こった時にスクリプトを実行させるものですね。 これを userSetup.mel に記述します。 そしたら、起動後、新規シーン後、既存シーン開いた後、全ての状態でちゃんと Infinity オンに出来ました。やっとの思いで。 長い道のりだった。
Infinity をオンにするコマンドは
scriptJob -event "SceneOpened" "animCurveEditor -edit -displayInfinities true graphEditor1GraphEd;";
こうなりますね。
SceneOpened というイベントが検知された時、つまりシーンが開かれた時に、それに続く animCurveEditor コマンドが実行されるということになります。
新規シーンの場合は、「空っぽのシーンという既存シーンを開く」 という考え方になるようで、この SceneOpened でカバーされます。つまり、SceneOpened とだけ記述しておけば、新規シーンの時も既存シーンのときも、続くコードが実行されます。
一方、SceneOpened の代わりに NewSceneOpened と書くと、新規シーンの時だけ実行され、既存シーンを開くときは実行されないので注意が必要です。
SceneOpened や NewSceneOpened 以外にどんなイベントがあるのかは、
scriptJob -listEvents;
を実行すればズラズラと出てきますが、まあ、ドキュメントにも全部載っている みたいだからそっち見たほうがいいのかな。
関係ないけど、mel で -listなんちゃら ってオプションで表示させる時って、結果が改行もされずズラズラと長ったらしく表示されますよね。 これわかりにくいです Maya 様。 いつもテキストエディタにコピペして、スペースを改行に変換するとかアフォなことをやっているのですが、なんかもっと簡単にパッと全体を見れる方法ないものですかね。
ってことでもはや evalDeffered コマンドも使いません。この scriptJob コマンドだけで上手く行っているように見えます。しばらくこれで運用してみます。
scriptJob いいなあ。 XSI のイベントより遥かに手軽ですね。 XSI の方はセルフインストール型で記述することによってただのスクリプトではなくプラグインとして認識させて云々みたいな知識が必要だけど、Maya様のこれは、俺みたいにほとんど分かってない人間でも、こんな簡単な1行を書くだけで一応は出来ちゃうっぽい(分かってない故の落とし穴がたくさんありそうだが・・・)。 さすが Maya様です。ありがとうございます。
ちなみに Infinity だけじゃなく Buffer Curve も起動するたびにオフにされてしまうので、同じく scriptJob コマンドでオンにしてあげてます。
scriptJob -event "SceneOpened" "animCurveEditor -edit -showBufferCurves true graphEditor1GraphEd;";
あと、俺の Maya 様は、HeadsUp Display でワールド原点に軸が表示されちゃうんだよなあ。これデフォルトでこうでしたっけ? 邪魔なので、それをオフにするコードも scriptJob でやってます。
scriptJob -event "SceneOpened" "toggleAxis -o off;";
このように、起動時やら新規シーン時やら既存シーンを開いた時やらにやって欲しいことは全部、scriptJobコマンドで userSetup.mel にズラズラと記述してしまえばいいと思います。多分。
SelectionChanged イベントは、どうでしょう、重くならないかな。選択しているオブジェクトに変化があるとトリガになるわけですが、これも色々便利に使えそうですが、XSI でこれに相当することをやるとけっこう重くなってたんですよね。 選択状態を常に監視するわけですから、バックグラウンドに常駐してある程度プロセッサの処理を食ってしまっている的な感じでした。 今度 Maya 様でもやってみよう。
.
| 固定リンク
コメント