« Partition.AddMember の罠。 | トップページ | あなたと一緒にいさせて( *゚д゚)♂ 。 »

2011年5月15日 (日)

さわやかな朝に Group Layer Partition。

日曜日の朝。

自然と目が覚めてみたれば、時刻は6時半でした。

二度寝するにはもったいないほどの、さわやかな朝でした。

自室の窓からは、久しぶりに綺麗に富士山が見えました。

Img_0012

こんな気持ちのいい朝は、スクリプティングです。



以前も Group と Layer と Partition の判別の話を書いたことがありましたが、XSI 七ちゃん以降であれば、もっと単純にできるかなと思って書いてみたものです。 目覚ましにちょうど良い頭脳労働でした。20分くらいで書きました。すっかり目が覚めて、5月の朝の風を満喫しています。




for ( var i=0; i<Selection.count; i++ )
{
    if ( Selection(i).IsClassOf( siX3DObjectID ) )   
//    対象は3Dオブジェクトのみに限定
    {
        var oOwners = Selection(i).Owners;   
//    Owners を取得
        var oPartitions =    GetPartitionLayerGroup( oOwners, "Partition" );
   //ファンクションに飛ばしてパーティション取得
        var oLayer =        GetPartitionLayerGroup( oOwners, "Layer" );
        //ファンクションに飛ばしてレイヤ取得
        var oGroups =        GetPartitionLayerGroup( oOwners, "#Group" );
        //ファンクションに飛ばしてグループ取得

        logmessage( Selection(i) + " ##############" );
        logmessage( "Partitions : " + oPartitions );
        logmessage( "Layer : " + oLayer );
        logmessage( "Groups : " + oGroups );
    }
}

 

function GetPartitionLayerGroup( oOwners, TargetType )
{

    //    カラのコレクションを作り、指定のタイプのものを見つけたらコレクションにブチ込み、最後にそれを返す
    var oHogehoges = XSIFactory.CreateObject( "XSI.Collection" );
//コレクション(入れ物)用意
    for ( var j=0; j<oOwners.count; j++ )
    {
        if ( oOwners(j).type == TargetType )
    //oOwners のうち、指定されたタイプのものだけをコレクションに追加
        {
            oHogehoges.Add( oOwners(j) );
        }   
    }
    return oHogehoges;
    //    コレクションを返す
}





一応ちゃんと動いているように見える。
A

適当に3Dオブジェクト(複数可)を選んで実行します。
するとそのブツが所属する Group Layer Partition がログされます。


スクリプティング的には、Owners を使っているところが味噌になるでしょうか。 オブジェクトには Owners というプロパティがあって、「自分を所有しているもの」が入ったコレクションが返ってきます。 「自分を所有しているもの」とは、言い換えれば自分が所属している先ということになります。 従って所属する Group Layer Partition などを調べるには最適の方法だと思います。 

あとは Owners の中にごっちゃになって入っている Group Layer Partition その他の中から、目的のものをより分けられれば良いだけ。 昔と違って Partition がオブジェクトとして独立したので、単に siType を Layer #Group Partition のいずれかに指定してやるだけで、簡単に分けられました。


しかし、本来効くはずの Owners.Filter ( "Partition" ) などが効きやがりません。 Owners の戻り値は ProjectItemCollection なので Filter メソッドが効くのですが、siType の部分に Partition や #Group と入れると空っぽのコレクションが返ってきてしまいます。これ不具合だと思います。誰か追試して下さい。


ともかく、この Group Layer Partition より分けは汎用的に何にでも使えそうです。
まずは前から考えていたアレを作ってみよう。
いや、大したものではないのですが。




ではごきげんよう。






.

|

« Partition.AddMember の罠。 | トップページ | あなたと一緒にいさせて( *゚д゚)♂ 。 »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: さわやかな朝に Group Layer Partition。:

« Partition.AddMember の罠。 | トップページ | あなたと一緒にいさせて( *゚д゚)♂ 。 »