« EPS を吐く UVStamp。 | トップページ | 女房と畳と Scene は新しい方がいい。 »

2012年11月 8日 (木)

取得その 2002。シーン全体の ImageSource の取得。

最近よく使うので載せておくというだけのアレです。




JScript
------------------------------------------------------------------------

//    Scene オブジェクトには ImageClips プロパティがあるのでシーン全体のImageClipCollection の取得は容易
var oImageClips = ActiveProject.ActiveScene.ImageClips;

oImageClips.Unique = true; // ← 追記 これ重要

//    ImageSource は ImageClip の Source プロパティで取得できるからループして取得&格納
var oImageSources = XSIFactory.CreateObject( "XSI.Collection" );
for ( var i=0; i<oImageClips.count; i++ )
{
    oImageSources.Add( oImageClips(i).Source );
}

//    oImageSources に格納済み あとは煮るなり焼くなり Logmessage するなり自由
for ( var i=0; i<oImageSources.count; i++ )
{
    Logmessage( oImageSources(i) );
}

------------------------------------------------------------------------


ええと、こんなめんどくさいことしなくても、Scene オブジェクトに ImageSources というプロパティさえあればそれだけで済むことなんですけど。 1行で終わる。 嘔吐デスクさま?





というパターンはすげえ多い。
SDK周りをどんどん開発してくれないかなあ。
あるべきなのに無いプロパティやメソッド、いっぱいありますよ。
スクリプティングに詳しい多くの開発の人をクビにしちゃったり辞められちゃったりして、その辺あんまり期待できないのかなあ・・・?




嘔吐デスクさま?




------------------------------------------------------
追記:
コメント欄でマーティンが素敵なことを教えてくれました。

まず Unique の追加。これ重要ですね。忘れてました。 ひとつのイメージソースからいくつもイメージクリップを作れるわけで、そういう状態でクリップひとつひとつからソースを集めると、ソースはダブってコレクションに入ってしまう。 だから Unique フラグを立ててコレクション内からダブりを排除せねばなりません。



あと、1行でシーン内全てのイメージソースを取得する書き方として、NestedObjects を使ったやり方を教えてもらいました。


var ImgSources = ActiveProject.ActiveScene.NestedObjects("Sources").NestedObjects("Images").NestedObjects;


こう書けば、ImgSources の中にシーン内の全てのイメージソースがぶち込まれます(コレクションになる)。 スヴァらしい。

Explorer を Source/Clip モードにして見るとわかりやすいのかな、シーンがあって、その下に Sources があり、その下に Images があり、その下にイメージクリップがズラリと並んでいる。その階層構造で取得している感じですかね。

でも、NestedObjects ってはあるオブジェクト(プログラミング的なオブジェクト)にぶら下がる全てのものを返して来るので、ゲットしたいもの以外の余計なものがあると、そいつまで混じってゲットされるわけですね。 この場合、Images にぶら下がっているものは全部イメージソースだよ、他のものはぶらさがってないよ、という構造であればいいのですが、そうなのかどうかは、どうなんだろう、おそらくマニュアルには書いてないよね。 SDK Explorer などで色んなシーンを観察して、観察結果からおそらくこれで正しかろうということにするしかないのではないか。 ある条件下ではイメージソース以外のものが Images 以下に発生するかも知れず、そうなった場合はそれをはじくコードを追加しないといけないかも知れない。




とかなんとかやるくらいなら最初から Scene オブジェクトに ImageSources プロパティを付けてくれって言ってんだ嘔吐デスクさまゴルァ






.

|

« EPS を吐く UVStamp。 | トップページ | 女房と畳と Scene は新しい方がいい。 »

コメント

ImageClips から Clipのソースを取得すると、ソースがダブったりする可能性があります。
新しく作ったコレクションに Unique = 1 にすればいいだけですけど、

新しいコレクションを作らずにソースを取得したければこっちの方がいいかもしれません:
var ImgSou = ActiveProject.ActiveScene.NestedObjects("Sources").NestedObjects("Images")

長いけど一応 1行 です。

投稿: myara | 2012年11月 8日 (木) 20時52分

あー Unique 忘れてた


で、その後のその1行は、うーむ、取得できているのは Image オブジェクトというものだよね? 俺は 最終的には ImageSource を取得したいんだよな。Path(テクスチャ画像ファイルのパス)とかにアクセスしたいから。 で、そのためにはまず ImageSourceCollection を取得してループしようと思うんだが、マーティンのその1行では Image オブジェクトというものが取得されているように見えるんだ。

試しにもう1個深く Nested に潜って、

var ImgSources = ActiveProject.ActiveScene.NestedObjects("Sources").NestedObjects("Images").NestedObjects;

こう書いてみたら、ImageSourceCollection が取得できているように見える。
こっちの方が正しくないかな?

投稿: 潤樹 | 2012年11月 8日 (木) 21時50分

はい

ActiveProject.ActiveScene.NestedObjects("Sources").NestedObjects("Images").NestedObjects

は正しいです。間違ってました。

そして、

ImgSources(i).path.value でパスの取得も出来ます。

投稿: myara | 2012年11月 8日 (木) 22時04分

すげえ、1行でできちゃった。Nested 3連チャンかw
ありがとうね。 あとで本記事に追記しておく。

投稿: 潤樹 | 2012年11月 8日 (木) 22時10分

でも最後の NestedObjects は、ImageSourceCollectoin 以外の何かもネストされてないか、不安になるね。なんか、いつも、NestedObjects って色んなものがぶら下がってることが多いからなあ。

なのでやっぱり、Scene.ImageSrouces プロパティが欲しい! というのは変わらないね。 嘔吐デスクさま。

投稿: 潤樹 | 2012年11月 8日 (木) 22時13分

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 取得その 2002。シーン全体の ImageSource の取得。:

« EPS を吐く UVStamp。 | トップページ | 女房と畳と Scene は新しい方がいい。 »