« バージョン違いで同時起動。 | トップページ | 飛び飛び連番調教。 »

2012年4月10日 (火)

XSIApplication.Interactive。

XSI は、GUI で起動する場合と、コマンドラインで起動する場合がありますよね。



GUI ってのは普通に XSI で作業する時のアレで、コマンドラインは主にレンダする時のアレですね。


ま、コマンドラインはレンダのためだけにあるわけではなく、スクリプトを使って普通にシーンの変更・保存もできるので、GUI を使わずに脳内だけでスクリプトによる XSI 作業をするという変態の人もいるかも知れません。テキストエディタでスクリプト書きながら、Fカーブも見ずに 「あー このモーション、難しいなあ」 とか言っている変態ですね。 まあ、大昔はCGってもんはそれに近かったのかな。  

一方、ライトの設定やレンダの設定なんかを複数のシーンで次々に変えていくとかであれば、変態でもなんでもなく、実用的なコマンドラインの使い道だと思います。 レンダするシーンが30個あって、サンプリングの Min を全部のシーンで -1 から 0 に変えていくだとか、そういう場面は割とあるわけですが、たった1箇所数値を打ち直すために全部のシーンを開いてられないじゃないですか。 そういう時に1つのシーンでだけ GUI 作業をし、履歴のスクリプトをコピーしておいて、残りのシーンはコマンドラインでそのスクリプトを食わせてバッチ処理、という感じですね。



ま、ともかくですね、コマンドラインは日常的に使います。 俺の場合は、上記のようなシーンのパラメータをバッチ処理でいじるという使い方をすることもあるというだけで、ほとんどはレンダですけどね。 




で、GUI の XSI とコマンドラインの XSI をスクリプトで判別したいときがあったので、サポートさんに聞いてみたら、 XSIApplicationオブジェクトの Interactive プロパティを調べればいいと教えてもらったので、それを記録しておこうと思っただけです。 そんだけ。



どういう時に判別したいかと言いますとですね、俺の場合、前にも書きましたが Softimage のちに~さんが書いた New Scene Options というプラグインを使っていまして、これは XSI を起動したり新規シーンした時などに自動的にスクリプトを実行できるというプラグインなんですね。 XSI の初期状態を、自分が作業しやすい、気に入った状態にしたいので、これを使っています。

このプラグインは当然、カスタムイベントという機能を使って出来ているわけですね。 XSI で何かが起きると、その変化をトリガとしてスクリプトを走らせるというものがカスタムイベントなので、このプラグインの場合は XSI が起動したとか新規シーンを実行したという変化を検知してスクリプトを実行させてるわけです。



問題なのは、XSI 様にとっては GUI な XSI もコマンドラインな XSI も同じなわけでして、つまり、レンダのためにコマンドラインから XSI を実行した場合でも、同じようにプラグインがそのアクションを検知して、スクリプトを実行してしまうわけです。 スクリプトの中身によっては、これが困るんです。 例えばフローティングの RenderTree ウインドウを開く、というような GUI なことをするスクリプトがコマンドラインから実行されると、高確率で XSI様がクラッシュなさいます。


XSI の起動と同時に(つまりレンダが始まる前に)プラグインによりスクリプトが実行され、そこに GUI なことをするコードが書かれているので XSI 様がクラッシュ。  つまりレンダされません。 レンダの前に XSI様がお逝きになるのです。 これが非常に困る。



起動された時に自動的に実行されるスクリプトは、XSI の作業がしやすいように、インターフェースのウインドウ状態や、各種 Visibility(例えばカメラの視野角コーンを表示オンオフとか、センターの表示オンオフとか)をいじるというものなので、コマンドラインで起動するときにはまず関係のないものばかりです。 だから、コマンドラインから起動された場合だけ、このスクリプトを実行されないようにしたかったのです。

New Scene Options というプラグイン側では、その機能は持っていません。 なので、実行されるスクリプト側でそれをやればいいと思ったんですよ。 スクリプトの中に、「今起動されてるこの XSI って、GUI ですか? それともコマンドラインですか?  GUI の時だけこれを実行して下さいね」 と書けばいいと思ったのです。 でもそんな方法は知らない。だからサポートさんに質問してみたら、一瞬で答えが返ってきました。 おじさま、ステキです。



で、教えてもらったのが、XSIApplicationInteractive というプロパティがあって、インタラクティブつまり GUI な状態かどうかを true か false で返すとのことでした。


マニュアル:
http://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/index.html?url=si_om/XSIApplication.Interactive.html,topicNumber=si_om_XSIApplication_Interactive_html


http://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/index.html?url=files/dev_batch-1.htm,topicNumber=d28e69308


日本語マニュアルって、リンクどこなんだろ。
WEB なヘルプになったのに、日本語と英語をパッと切り替えるボタンとかないんですか。例えば Wikipedia なんかは、現在の項目の各国語のページにすぐ飛べるじゃないですか。使いやすくして下さいよ嘔吐デスク様。年貢納めてるんだからさ。




JScript だと、

if ( Application.Interactive )
{
    ほにゃららん
}


って書くだけですね。ほにゃららんの所に実行したいコードを書きます。 Intereactive が true の時しか実行されません。 コマンドラインでは、スクリプトファイル自体は NewScenesOptionsプラグインによって普通に実行されるわけですが、 Interactive で false が返って来るために、肝心の部分はめでたくスルーされるということです。


ってことで、俺の場合は実行されるコード全てをほにゃららんにブチ込みました。
コマンドライン起動に無害なコードなら、別にほにゃららんの外にあってもいいと思います。






以上。
おじさま。ステキです。






.

|

« バージョン違いで同時起動。 | トップページ | 飛び飛び連番調教。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: XSIApplication.Interactive。:

« バージョン違いで同時起動。 | トップページ | 飛び飛び連番調教。 »