« 木馬責めの彼。 | トップページ | 頂点上にパーティクルを発生させる。 »

2012年6月 5日 (火)

FindObjects2。

FindObjects2 を使ったのは初めてかも知れない。 便利でした。

2011 からの新機能のようです。






↓現在開いているシーンの中にある全てのカスタムプロパティを引っかき集める

 var oProps = FindObjects2( siCustomPropertyID );




一発でかき集めることができました。 これは便利です。 siClassID を渡してあげるだけでいい。カスタムプロパティでも、カメラでも、Model でも、何でも。

今までもたくさん方法はあったけど、これが一番ラクなのではないかなあ。 例えば FindChildren というメソッドは前からありましたが、返って来るのが 3Dオブジェクト(X3DObjectCollection)限定なんですよね。 そのため、この例のようにカスタムプロパティを引っかき集めたいなどという場合には使えなかったんですよね。 この FindObjects2 は SIObjectCollection が返って来ますから、引数として渡してあげる ClassID で選別できるものは何でも取得できます。 Group でも Pass でも何でもです。 ClassID で取得してもまだ選り分ける必要があるような場合は、取得したコレクションをループしてひとつひとつの Type などをチェックしていくしかないでしょう。


ちなみに上のような書き方をすると一見コマンドように見えますが、、実は XSIApplication オブジェクトのメソッドなのですね。 なので正確には、

var oProps = Application.FindObjects2( siCustomPropertyID );



と書くのかな? 合ってますか?
Python では省略できないんだっけ? 
頓珍漢なこと言っていたら、どうか突っ込んで下さい。
というか教えて下さい。

ま、こういう場合は省略できてもあまり省略すべきじゃないかも知れませんね。 後で自分で読むときにわかり易いように。 フルで書かないと、1週間もするとすぐ忘れて意味不明になっちゃいますからね。







それにしても、今まで無かったのが不思議なくらいの基本的な機能ですよね。 

こういう基本機能が欠如していた場合、取得したいブツを選り分けるのはとても苦労します。 確実にユニークな特徴をひたすら探して、いっぱい条件分岐を付けて、ふるいを何段階もかけて、それでも選別できない時は例えば値を変えてみた時の振る舞いを観察するとか。 こうなるともはや邪教の呪文です。 値を変えたいわけじゃないのに、種類を判別するだけのために、一度値を変えちゃうという。 もちろん判別後はその値を元に戻してあげないといけないですね。 

あるべきプロパティやメソッドがないために無理やり変なコードを書いて実現することを、黒魔術と呼ぶようです。 黒魔術でしかできないことは黒魔術でやるしかないので、別に否定するものではありませんが、非常にメンテのしづらいスクリプトになるし、できれば避けたいですね。 

まあ、Type でもなんでもいいのでブツの種類によってなんらかのタグになるものがプロパティなどの形でインプリされていれば、最悪総当りループで調べられます。 そういう意味では XSI は、最低限必要なものは前からそろっていたというか、極悪な黒魔術は使わなくても済んでいたかもしれません。




FindObjectsコマンドというものは以前からありましたが、あれはいわゆる siClassID とは違う、 ClassID だか GUID だかという、ヒエログリフのような解読不能の長~い識別コードを渡してやらねばならず、これはこれでかなり黒い方法でした。
{76332571-D242-11d0-B69C-00AA003B3EA6} ← これ読んで、ああ、カスタムプロパティのことね、とかすぐわかるあなたは、黒魔術のミサに今すぐ参加して下さい。そして将来俺に話しかけることがあれば、どうか人間語でお願いします。




.

|

« 木馬責めの彼。 | トップページ | 頂点上にパーティクルを発生させる。 »

コメント

コメントを書く



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




トラックバック


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

« 木馬責めの彼。 | トップページ | 頂点上にパーティクルを発生させる。 »