« 手動タイムラプス。 | トップページ | パーティクルディスプレイ。 »

2011年7月28日 (木)

空き家Groupを探す。

こんなスクリプト、きっと似たようなの今までもこのブログに載せたことあるかと思うんですが、さっき必要に駆られて書いたので、せっかくなので残しておきます。




シーン内の、中身が空っぽの Group を探して選択するという、そんだけのものです。






//    入れ物ヨーイ
var oEmptyGroups = XSIFactory.CreateObject( "XSI.Collection" );


//    Scene_Root 以下で全てのModelを取得(シーン内に存在する全てのModelを取得できる)
var oModels = ActiveSceneRoot.FindChildren( "", siModelType );


//    取得したModelのそれぞれ以下で、Groups を探す
for ( var i=0; i<oModels.count; i++ )
{
    var oModel = oModels(i);
    var oGroups = oModel.Groups;
    for ( var j=0; j<oGroups.count; j++ )
    {
        var oGroup = oGroups(j);
       
       
//    Group の members がゼロだったらそのGroupは空き家
        if ( oGroup.members.count == 0 )
        {
            oEmptyGroups.Add( oGroup ); 
//空き家をコレクションに追加
            Logmessage( oGroup.fullname + " は空っぽでつ。。(;´Д`)" );
        }
    }
}


//    空き家があれば選択、なければ無いと告知
if ( oEmptyGroups.count != 0 )
{
    SelectObj( oEmptyGroups );

    //    DeleteObj( oEmptyGroups );
   
//    この DeleteObj の行を非コメント化すれば、空き家Groupは即死
}
else
{
    Logmessage( "空っぽなGroupは無いでつ。。(;´Д`)" );
}







実行すると、空き家Gorup が選択されます(あれば)。 選択後は目的によって、削除してもいいだろうし、確認するだけでもいいだろうし。

DeleteObj の行の、行頭の // を取っ払って非コメント化すれば、空き家 Group は即座に削除されます。 危険なので一応コメントアウトしておきました。








スクリプティングな要点は、ううむ、大した要点らしきものはないか。 今までも何度もこのブログに書いたネタばかりな気がする。




var oModels = ActiveSceneRoot.FindChildren( "", siModelType );


↑シーン内の全ての Model を見つけるには FindChildren が一番簡単だと思います。階層をどこまでももぐって探してくれますから。 



var oGroups = oModel.Groups;


↑さっき全ての Model を取得済みなので、もうこっちのもんです。Group を探すには 取得済みの Model オブジェクトの Groups プロパティを使えばいいわけですから。



if ( oGroup.members.count == 0 )

↑さっきその Model 以下にある全てのGroup を取得済みなので、もうこっちのもんです。Group が取得できていれば、取得済みのGroup オブジェクトの members プロパティを利用できるので、その Group に何人入っているかがわかります。ゼロなら空き家です。





あとは、上の変数名で言えば oModelsoGroups はコレクションだし、その中から特定のひとりに注目しているときは( var oModel = oModels(i) など)、その対象はもはやコレクションではなく個人なのだ、という所を意識しておけばよいくらいですかね。






とかなんとか。



こういう感じのスクリプト、けっこういっぱい書いていますね。 というのは、最初から最後まで完全にひとりでやる仕事は滅多になくて、モデルデータなど人からデータをもらって作業する機会が多いわけですが、たいてい他人のデータってわけわかんないじゃないですか。 空っぽの Group や Layer があったりして、無駄に見えるんだけど、どういう意図でそうしてるのかわからず困る、とかね。

困るのはどのみち困るのでまあ変わらないんですが、せめて空っぽの Group をまずは見つけておこう、とか、どの Pass においても一度もレンダリングされないことになっているオブジェクトを見つけておこう、とか、サブDの設定を共有できるオブジェクトを見つけておこう、とか、スケールが 1 以外になっているオブジェクトを見つけておこう、とか、そんな感じですね。 シーンの中からある特定の状態にあるオブジェクトだけをかき集める系のスクリプト。 いっぱいあります。 他人が作った汚いデータを手作業で解析するのはつらいので、まずはスクリプトで分別するところからですよ。 分別して把握しておかないと、元のデータを作った人に質問すらできないじゃないですか。




とかなんとか。
ではまた会いましょう。
ごきげんよう。



.

|

« 手動タイムラプス。 | トップページ | パーティクルディスプレイ。 »

コメント

コメントを書く



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




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217974/52322826

この記事へのトラックバック一覧です: 空き家Groupを探す。:

« 手動タイムラプス。 | トップページ | パーティクルディスプレイ。 »