« 応答なし。 | トップページ | ほんとに来るんですか。 »

2009年2月20日 (金)

Expand。

XSI List で見つけたスクリプティングの話なんですがね。
http://groups.google.ca/group/xsi_list/browse_thread/thread/da2ea0f116a08368?hl=en


ブランチセレクトした階層の、その階層以下にぶら下がっている子供全てにループ処理をしたいってことはよくあるわけですよ。 でもブランチセレクトした状態のオブジェクトは、Selection オブジェクトの中には親しか格納されてないんですね。 だから子供たちにも何か処理をしようと思ったら、親からたどって全ての子供を取得し、その結果に対してループ処理をしなければいけない、と思うんですが。 おれ勘違いしてます? ・・・どきどき

でもその子供取得の部分を書くのがめんどくせえなあ、なんかいい方法ないかなあ、とずっと思っていたわけですよ。 問答無用で子供を含めるなら FindChildren とかもあるんですが、ノード選択の時はそのオブジェクトのみ、ブランチ選択の時だけは子供も含めたい、となると siBranchFlag とかも調べて処理を分岐することになるのかな? しかも FindChildren は X3DObject 限定だし、自分自身は含まれないし。  なんだかんだで細かい周辺のコードをいっぱい書かないとダメなんじゃなかろうか、と思っていたわけです。  おれ勘違いしてます? ・・・どきどき


ですが、上の XSI List の書き込みで Brad さん(Production Challenge で有名なサーカスの熊さんです)が、何やら Collection にいったんぶち込んだ後、Expand メソッドで展開してやりゃいいとかなんとか書いてるじゃないですか。 サッとマニュアル読んで、試しにやってみたら・・・。


  var oCol = XSIFactory.CreateObject( 'XSI.Collection' );
  oCol.items = Selection;
  var oExpanded = oCol.expand( );

  for (var i=0; i <
oExpanded.count; i++ )
  {
      Logmessage ( i + 1 + ' : ' +
oExpanded(i) );
  }



わっ、ほんとにできたっ。 しかもなんか処理速い気がするっ。

テキトーにノード選択したりブランチ選択して上のコードを走らせると、oExpanded の中にちゃんと想定したオブジェクトが格納されているのがわかると思います。


まさにこれ。これが欲しかったのですよ。ノード選択のみの場合は普通にそのオブジェクトが、ブランチ選択した場合は自分も含めてそれ以下の全オブジェクトが、ノード選択とブランチ選択が混じっている場合はその両方が、シンプルに XSICollection にぶち込まれています。 あとはこの Collection のアイテムひとつひとつにやりたい処理をかませばいいだけ。 

普通、ユーザがノード選択したらそのオブジェクトのみに処理したいですよね。ブランチ選択してたら子供にも処理したいですよね。 めんどくさいコード書かなくてもこの状態の Collection を作ってくれるということです。わあ、ラクだこれは。

さらに良いことには、この Expand メソッド、Group(Layer や Partition も含む)を選んでいると、その Group 自身は含めずにそのメンバをぶち込んでくれるんですね。 しかも先のノード/ブランチ選択された X3DObject と Group が混じっていてもOKなんですね。うーむかなりラクですよこれは。


Expand メソッドマニュアル
http://softimage.wiki.avid.com/sdkdocs/XSICollection_Expand.htm

どうでもいいけど、Softimage Wiki ってまだ avid.com 以下にあるんですか。


今後のスクリプト開発でガンガン使うことになりそうな気がします。
Brad さん、それとこの質問を投げてくれた人、ありがとう。


っていうか、この Expand って常識ですか? 定説ですか? あるいはもっと全然いい方法ありますか?  

なんせ俺は基礎的な勉強を省略した上での独学なもんで、たまたまマニュアルの当該ページに載っているサンプルに出てきたり、こういう WEB 上の情報に偶然めぐり合わない限り、何もできないんですよねー。 たまたま最初に見たサンプルに載っていたというだけで偶然に覚えた手法を、さらに調べまくって知識をアップデートするなどという努力を怠ったまま何年も何年も使い続けて、すっかり染み付いた頃に実はもっと効率的な方法があることを知るという、いつものパターンになるわけですね。 本職の人なら 「方法は色々あるだろうけど、普通はこうやるよね」 みたいな、いわば常識というか、合理的でナチュラルな考え方というものがあると思うんですが、自分にはそれが激しく欠如していると感じます。 「とりあえず目的は達成できているが、きっとこれ、すっげー幼稚な手法で、無駄なこといっぱいやってんだろうなあ」 って感じでね。 でもまあいいんです。そういう疑念と焦燥と自嘲を抱えながらやっていくしかないんです。そうなんです。






.

|

« 応答なし。 | トップページ | ほんとに来るんですか。 »

コメント

2009年2月20日 (金)Expand。を拝見しました。
私は同じようなスクリプトを書く場合以下のようにしております。
速度的にも早いと思いますし、シンプルなところが気に入ってます。

いつも素敵な情報をありがとうございます。尊敬してます!!
シロクマ

投稿: shirokuma | 2009年4月23日 (木) 02時02分

シロクマさん、せっかくコメント頂いたのになんだか1ヶ月以上も放置してたみたいですね・・・すいません。

わあほんとだ、そんな方法もあったんですね。コマンドモデルなので避けたい気分もありますが、var sl = みたいに格納すると実際にセレクションの内容を変えずに(ブランチ選択で実行すればブランチ選択のまま)実行できるんですね。知りませんでした。第2引数で指定するんですね。なるほどね。

だってほら、インターフェース右上の Select メニューの中から Select Child Nodes を実行したときは、実際にセレクションをノード選択に変えちゃうじゃないですか。だからそういうもんだと思ってスルーしてたんですが、これは第2引数がデフォルトの true で実行しているだけで、なるほど、false をくれてやればいいんですね。

ベンキョになります。

投稿: junki | 2009年6月 3日 (水) 03時19分

コメントを書く



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




トラックバック


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

« 応答なし。 | トップページ | ほんとに来るんですか。 »