« さわやかな朝に Group Layer Partition。 | トップページ | パッていしょん。 »

2011年5月17日 (火)

あなたと一緒にいさせて( *゚д゚)♂ 。

先日書いた Partition.AddMember やら Group Layer Partition の取得やらを組み合わせたスクリプトを書きました。 


var oObjects = FilterX3D( Selection );    //    X3DObject 以外排除
if ( oObjects.count != 0 )
{
    LetMeBeWithYouPPG( oObjects );
}
else
{
    Logmessage( "ドルァ" );   
//    X3DObject がひとつもなかった場合
}

function LetMeBeWithYouPPG( oObjects )
{
   
//    PPG 作成
    var oP = XSIFactory.CreateObject( "CustomProperty" );
    oP.name = "あなたと一緒にいさせて( *゚д゚)♂";
   
   
//    パラメータ3つ
    oP.AddParameter2( "bPartitions", siBool, true );
    oP.AddParameter2( "bLayer", siBool, false );
    oP.AddParameter2( "bGroups", siBool, false );
   
   
//    PPG の UI 作成
    var oL = oP.PPGLayout;
    oL.AddSpacer(0,50);
    oL.AddRow( );
        oL.AddGroup( "", false, 25 );
            oL.AddItem( "bPartitions", "Partitions" );
        oL.EndGroup( );
        oL.AddGroup( "", false, 75 );
        oL.EndGroup( );
    oL.EndRow( );
    oL.AddSpacer(0,50);
    oL.AddRow( );
        oL.AddGroup( "", false, 37 );
        oL.EndGroup( );
        oL.AddGroup( "", false, 25 );
            oL.AddItem( "bLayer", "Layer" );
        oL.EndGroup( );
        oL.AddGroup( "", false, 37 );
        oL.EndGroup( );
    oL.EndRow( );
    oL.AddSpacer(0,50);
    oL.AddRow( );
        oL.AddGroup( "", false, 75 );
        oL.EndGroup( );
        oL.AddGroup( "", false, 25 );
            oL.AddItem( "bGroups", "Groups" );
        oL.EndGroup( );
    oL.EndRow( );
       
   
//    作成した PPG をモーダル表示、キャンセルじゃなければファンクションに飛ばす
    Inspect = InspectObj( oP, null, null, siModal, false );
    if ( !Inspect )
    {
        LetMeBeWithYou( oP, oObjects );
    }
    else
    {
        Logmessage( "ウルァ" );   
//    PPG がキャンセルされた場合
    }
}


function LetMeBeWithYou( oP, oObjects )
{

   
//    目的のオブジェクトをピック
    var rtn = PickElement( siObjectFilter, "一緒に居たい人をピックして。", "ピックしてよん。" );
    var oMasterObj = rtn.Value( "PickedElement" );
    var button = rtn.Value( "ButtonPressed" );

    if ( button == 0 )
    {
        Logmessage( "モルァ" );   
//    button が 0 =ピックセッションがキャンセルされた場合
    }
    else
    {
      
//    ピックされたオブジェクトの Partition, Layer, Group を取得
        var oOwners = oMasterObj.Owners;
        var oPartitions =    GetPartitionLayerGroup( oOwners, "Partition" );
        var oLayer =        GetPartitionLayerGroup( oOwners, "Layer" );
        var oGroups =        GetPartitionLayerGroup( oOwners, "#Group" );   
   
       
//    Partition 一緒にいさせて( *゚д゚)♂
        if ( oP.bPartitions.value )
        {
            for ( var i=0; i<oObjects.count; i++ )
            {
                for ( var j=0; j<oPartitions.count; j++ )
                {
                    if ( !oPartitions(j).IsMember( oObjects(i) ) )
//既にメンバだった場合に止まってしまうのを回避
                    {
                        oPartitions(j).AddMember( oObjects(i) );
                    }
                }
            }   
        }
       
       
//    Layer 一緒にいさせて( *゚д゚)♂
        if ( oP.bLayer.value )
        {
            
//    Primitive オブジェクトをピックできてしまったりするんだが MoveToLayerコマンドではエラーが出るので一応トラップ
            try
            {
                MoveToLayer( oLayer, oObjects );   
// Layer は OM 効かない。コマンドのみ
            }
            catch (e)
            {
                Logmessage( "Layer でオルァ" );
            }
        }
       
       
//    Group 一緒にいさせて( *゚д゚)♂
        if ( oP.bGroups.value )
        {
            for ( var i=0; i<oGroups.count; i++ )
            {
                oGroups(i).AddMember( oObjects );   
//    Group は Partition と違って既にメンバだった場合でも何もしなくて桶
            }

        }
    }
}


//    以下ヘルパーファンクション

//    Partition, Layer, Group を返すファンクション

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;   
//    コレクションを返す
}


//    X3DObjects のみを返すファンクション

function FilterX3D( oObjects )
{
    var oX3DObjects = XSIFactory.CreateObject( "XSI.Collection" )
    for ( var j=0; j<oObjects.count; j++ )
    {
        if ( oObjects(j).IsClassOf( siX3DObjectID ) )
        {
            oX3DObjects.Add( oObjects(j) );
        }
    }
    return oX3DObjects;
}





何をするスクリプトかと言いますと、現在選択中のオブジェクトの Layer Group Partition をピックしたオブジェクトに一致させるというものです。

シーンを作り進めて、Layer も Group も Partition もある程度できてしまっているとするじゃないですか。 そこに、何らかの都合で新しいオブジェクトが加わった場合などに使うことを想定しています。 オブジェクトが差し替えになった場合なども典型的な場面ですね。 こういう時に、その新規オブジェクトに対して、これまでこのシーンを構築してきたルールに従って正しい Group や Partition に入れていったりするのって、すんげえ大変じゃないですか。

でも、その新規オブジェクトと同じ法則で分類して良いオブジェクトが既にシーンの中にあったとしたら、Group Layer Partition は全部そいつに従えって指定してあげることができればラクですよね。 そういうスクリプトです。



こんな状態。
Letmebewithyou1
現在、sphere1~4 を選択しています。
この4つは、全ての Layer Group Partition において、赤矢印で示した cube 様と一緒に居たいとします。


なので、この4つを選択した状態でスクリプトを起動します。
すると PPG が立ち上がります。
Letmebewithyou2

今回は全ての Layer Group Partition において一緒に居たいので全部チェックオンにしますが、Layer は一緒でなくてよいとかそういう時はチェックを外します。


OKを押すとピックを促されます。
ここで cube 様をピックします。


すると、Layer Group Partition が cube 様と一緒になります。
Letmebewithyou3

以上。


Layer は1つにしか所属できないわけですが、cube 様の Layer に入ります。

Partition は全 Pass において、cube 様と同じ Partition に入ります。 当たり前ですが全Pass という所が重要です。

Group は複数に所属できるわけですが、cube 様が所属する Group に全部入ります。 ただし、cube 様とは関係なく sphere 達が独自に加入していた Group があった場合、その Group から追い出されるわけではありません。

Light Partition のことはあんまり考慮してませんでした。 ただ、ライトを選択した状態でライトではないオブジェクトをピックしても、別にエラーで止まらないようなので、このまんまでもいいかなと思います。 その他、例えば null など Partition に入れないオブジェクト( Layer や Group には入れる)に対して Partition の一致を指示した場合などでも、特にエラーで止まることなく無視されるようなので、ひとまず放置します。





まあいつものごとく、ベータ版のようなものです。 どなたか使ってみて、不具合とか改良案とか教えてくれませんかね。



Partition が一番使いますね。 Pass分けがかなり進んでしまってから、Pass をいちいち切り替えて Partition に追加とか、手でやってらんないですからね。 

最近はこれ以外にも似たような Partition がらみのスクリプトをちょこちょこ書いてます。





ごきげんよう。




.

|

« さわやかな朝に Group Layer Partition。 | トップページ | パッていしょん。 »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: あなたと一緒にいさせて( *゚д゚)♂ 。:

« さわやかな朝に Group Layer Partition。 | トップページ | パッていしょん。 »