« 第2次XSI男Tシャツ発送しますた。 | トップページ | 女~るFcurve。 »

2011年8月22日 (月)

対象複製同時名前健作痴漢。

ぶしつけにスクリプトを載せる。

とうとうブチ切れて急いで書きました系。




//名前変換ルール
SearchL1 = "L_";
SearchL2 = "_L";
SearchR1 = "R_";
SearchR2 = "_R";

ReplaceL1 = "R_";
ReplaceL2 = "_R";
ReplaceR1 = "L_";
ReplaceR2 = "_L";


// 相変わらずよく分からないまま使う正規表現
var RE_L1 = new RegExp( SearchL1, "gi" );
var RE_L2 = new RegExp( SearchL2, "gi" );
var RE_R1 = new RegExp( SearchR1, "gi" );
var RE_R2 = new RegExp( SearchR2, "gi" );

//性器表現ならもちろんよく ry


var oObjects = FilterX3D( Selection );   
//    変なもの(3Dオブジェクト以外)をはじく
if ( oObjects.count != 0 )
{
   
//  名前置換の元にするので複製元のオブジェクトを格納しておく
    var oSourceNodes = XSIFactory.CreateObject( "XSI.Collection" );
    for ( var i=0; i<oObjects.count; i++ )
    {
        oSourceNodes.Add( oObjects(i) );
        oSourceNodes.AddItems( oObjects(i).FindChildren() );
    }


//    デバッグ用
//    for ( var i=0; i<oSourceNodes.count; i++ )
//    {   
//        Logmessage( i + " - " + oSourceNodes(i) );
//    }
//    Logmessage( "----" );



    var oDups = DuplicateSymmetry( oObjects, null, true, 1, 0, 0, 0, null);   
//俺様設定で複製実行

    //複製されたブツを格納しておく 複製元と格納順が同じである(らしい)性質を利用している
    var oTargetNodes = XSIFactory.CreateObject( "XSI.Collection" );
    for ( var i=0; i<oDups.count; i++ )
    {
        oTargetNodes.Add( oDups(i) );
        oTargetNodes.AddItems(  oDups(i).FindChildren() );
    }


    //    複製ブツをループして、置換ルールに一致すれば置換する  複製元と格納順が同じだからこそ可能
    for ( var i=0; i<oTargetNodes.count; i++ )
    {   
        OriginalName = oTargetNodes(i).name;
        if ( OriginalName.match( RE_L1 ) )
        {
            oTargetNodes(i).name = oSourceNodes(i).name.replace( RE_L1, ReplaceL1 );
        }
        else if (  OriginalName.match( RE_L2 ) )
        {
            oTargetNodes(i).name = oSourceNodes(i).name.replace( RE_L2, ReplaceL2 );
        }
       
        else if ( OriginalName.match( RE_R1 ) )
        {
            oTargetNodes(i).name = oSourceNodes(i).name.replace( RE_R1, ReplaceR1 );
        }
        else if (  OriginalName.match( RE_R2 ) )
        {
            oTargetNodes(i).name = oSourceNodes(i).name.replace( RE_R2, ReplaceR2 );
        }

       
       
//logmessage( i + " - " + oTargetNodes(i).name )       
    }
}



// 3Dオブジェクト以外をはじくファンクション

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



Duplicate Symmetry するときに、名前の L_ とか _LR_ とか _R に勝手にリネームするスクリプトです。 シンメトリに複製するんだから、L と R の名前の書き換えとかよく発生するじゃないですか。 標準機能で欲しいなあ。



通常の Duplicate Symmetry を実行した時に出てくる PPG は出てきません。 俺様設定で有無を言わさずシンメトリ複製します。 スクリプトを書き換えてオプションを変えるしかありません。 L R の名前の変換ルールも、スクリプト冒頭部分を手で書き換えるしかありません。

また、名前の中に同じパターンが出てきたら全部置換してしまうので、例えば L_arm_Link などという名前のオブジェクトは R_arm_Rink になってしまうと思われます。冒頭や末尾だけの場合に反応するだとか、そういう高級なこともしていません。





使い勝手が良くて今後も使いそうだと思った場合のみ、様々なオプションを変えられる PPG を付けたり、置換がもう少し便利にならないか改良してみたりするわけです。






っていうか、すでにこういう機能のスクリプトがどこかに存在していたような気もする。






ごきげんよう。



.

|

« 第2次XSI男Tシャツ発送しますた。 | トップページ | 女~るFcurve。 »

コメント

先頭 "^L_"、末尾 "_L$" な感じでどうでしょう?

投稿: | 2011年8月22日 (月) 23時14分

わっ えっと、その ^ とか $ とかが、頭とか尻とかを表す性器表現なんでしょうか? それを付けると、頭とか尻でそのパターンが出てきた時しかヒットしないということなんでしょうか?  やってみます。 どなたか存じ上げませんがありがとうございます。

なんか、性器表現って悪魔の言葉のようで怖いです。 性器表現が分かる人って、その ^ とか $ で会話ができるんでしょうか。プログラマの呑み会とかで、「今日の会話は正規表現縛りね~ じゃ、君は ^abdc/gi。」とか言うんでしょうか。 怖くて眠れません。

投稿: junki | 2011年8月22日 (月) 23時27分

var re = /^([LR])[0-9]*_|_([LR])[0-9]*_|_([LR])[0-9]*$/g;

oTargetNodes(i).name = oSourceNodes(i).name.replace(re, function(m, $0, $1, $2){
var side = m.match("R") ? "L" : "R";
return m.replace($0||$1||$2, side);
});


名前置換はこんなかんじで書けますね。

やろうと思えばL, R以外(Left | Rightとか)や
他のデリミッタ(_とか-とか ←スペースとか)にも対応可ですが
そこ頑張るより命名規則どうにかしたほうが幸せになれますね

投稿: anamorph | 2011年8月23日 (火) 03時27分

anamorphさん、その悪魔の言葉、俺にはさっぱりわかりません。 朝起きて、家族に /^([LR])[0-9]*_|_([LR])[0-9]*_|_([LR])[0-9]*$/g; とか挨拶されたら、俺はきっと怖くて逃げ出します。


その後の部分も、replace メソッドの引数の中にファンクションを入れ込んでいるんですかこれは。JScript や JavaScript って、よくこういうことするみたいに見えるんですが、普通なんでしょうかね? どういうメリットがあるのだろう。読みにくいので普通に外に出した方がいいような気もするんですが、読みにくいとかそういう問題ではない、運用方法上のメリットもしくは必要性があるんでしょうなあ。


なんつうか、いつも言っていますが、俺はプログラマでもスクリプタでも何でもなく、XSI に自分が望む挙動をさせるためだけに各種の呪文を唱えているという気がしています。どこかで覚えたスクリプティングの知識を XSI で使っているのではなく、ほぼ100% XSI で覚えましたからね。 XSI がある挙動をしてくれさえすればそれで良く、それ以上のことを考えもしません。なので正規表現もそうだし、引数の中にファンクション書くとどうなるだとか、クラスがどうしたとかスコープがどうしたとか、おそらくは JScript/JavaScript を使う人なら普通に通過するであろう構造上の理解過程を全く経ずに、この仕事が楽になればそれでいい的なことを繰り返してコードを書いております。こうして、毎日なにかしらスクリプト書いているくせに言語の構造はちっともわかってないという、実にイビツなインチキスクリプタが出来上がるのだと思います。

別にいいじゃんちゃんと仕事できているんだから。 という思いと、 それを打破してもっと根元の部分を理解すればさらに仕事が楽になるぜ、という思いが、いつもせめぎ合っています。

投稿: junki | 2011年8月27日 (土) 11時05分

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: 対象複製同時名前健作痴漢。:

« 第2次XSI男Tシャツ発送しますた。 | トップページ | 女~るFcurve。 »