« マークされたパラメータの取得。 | トップページ | 選択中のキーフレームを現在フレームにポン。 »

2012年4月24日 (火)

マークされたパラメータの取得2。

前回の記事の続きです。

前に書いた時のコメント欄でもらったアドバイスのうち、ガルさんが教えてくれたやつをまだ試していなかったので、やってみました。





JScript
---------------------------------------------------------------

var oMarkedParams = GetTheFuckMarkedParamsC( Selection )
if ( oMarkedParams )
{
    Logmessage( "マークされたパラメータ : " + oMarkedParams.count );
    for ( var i=0; i<oMarkedParams.count; i++ )
    {
        Logmessage( "  (" + (i+1) + ") " + oMarkedParams(i) );
    }
}
else
{
    Logmessage( "fuck you." );
}



function GetTheFuckMarkedParamsC( oObjects )
{
   
//    オブジェクト自身と、(カスタム)プロパティ上のパラメータを全部引っかき集める
    var oAllParams = XSIFactory.CreateObject( "XSI.Collection" );
    oAllParams.Unique = true;
    for( var i=0; i<oObjects.count; i++ )
    {
        var oObj =  oObjects(i);
        oAllParams.AddItems( oObj.Parameters );
        var oProps = oObj.Properties;
        for ( var j=0; j<oProps.count; j++ )
        {
            oAllParams.AddItems( oProps(j).Parameters );
        }
    }
   
    var oMarkedParams = XSIFactory.CreateObject( "XSI.Collection" );
    oMarkedParams.Unique = true;


 //    引っかき集めた全パラメータをループ
 //    Marked が true なら、マークされてるパラメータ
    for( var i=0; i<oAllParams.count; i++ )
    {
        var oParam = oAllParams(i);
        if ( oParam.Marked )
        {
            oMarkedParams.Add( oParam );
        }
    }
   
    if ( oMarkedParams.count != 0 )
    {
        return oMarkedParams;
    }
    else
    {
        return null;
    }
}

---------------------------------------------------------------


ううむ。 良いじゃないか。


実行スピードは測ってないけど、しくみで言うと、そのオブジェクトが持つ全パラメータをループしているので、しかもカスタムプロパティのパラメータまでループしているので、遅いはずだと思うんですよね。 でも今回の場合は、そのツールの内容上、そんなに速くなくてもいい処理ですこれは。 ドラッグしながら微調整、みたいなインタラクティブ性が重要な場合は速度のチューニングに気を遣うべきだと思うんですが、俺が書こうとしているツールではマークしたパラメータの取得ごときにそこまでのインタラクティブ性は求めない。全然求めない。一瞬待つくらいとか、なんなら1秒や2秒待ったって、困らない。


ということで、速度を求めないなら、コードの素直さとか、脆弱性が無い(どんな場合でも効く)ことの方がよっぽど重要な気がします。  まだ色んな場合で試していないので断言はできませんが、このガル方式は Parameter オブジェクトにインプリメントされている Marked プロパティを見ているだけなので、あまりコケようがないと思うんですよね。 つまり、Marked プロパティが効かないパラメータなんて、無いんじゃないかと。 ならば、どんな場合でも効くんじゃないかと。  もっとも素直であり、改造や移植もしやすく、良いのではないかと。



ってことでこれで行こうかなあ。
落とし穴あるかなあ。



xxx.Parameters とやると、カスタムプロパティ上にあるパラメータまでは引っかかりませんから、上記のコードではまずカスタムプロパティも含めた全パラメータを自前で引っかき集め、結果として引っかき集められたパラメータたちをもう一度ループして Marked をチェックしています。

ここが、自前ではなく既存の機能として引っかき集められると楽なんですけどねえ。 例えば、xxxx.Parameters プロパティではなく、xxxx.Parameters( true ) みたいにメソッドにしてしまって、 true ならカスタムパラメータも含める、false なら含めない、みたいな実装の仕方をしてくれると助かるんですよね。



っていうか、前から言ってますが、そのものズバリ、 X3DObject.MarkedParameters( true ) などというのが一番いいですね。 戻り値は ParameterCollection です。 true にするとカスタムプロパティ上のパラメータを含めます。 false だと含めません。 という感じで、SDKレベルで対応して欲しい。 嘔吐デスク様。




そのうちリクエスト送っておこう。




引き続き、ベターな方法があれば、どうか教えて下さい皆様。









.

|

« マークされたパラメータの取得。 | トップページ | 選択中のキーフレームを現在フレームにポン。 »

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: マークされたパラメータの取得2。:

« マークされたパラメータの取得。 | トップページ | 選択中のキーフレームを現在フレームにポン。 »