« クラスタマテリアルの名前をクラスタの名前にしてみる。 | トップページ | 悲しみのローカルシンメトリ。 »

2011年2月14日 (月)

クラスタの名前をクラスタマテリアルの名前にしてみる。

前回書いた記事ですが、タイトルがテレコとも取れるわかりにくさです。 今回のが正しいような気がするんですがどうですか。 酩酊状態だったので、何も考えずにタイトルを書いていたんだと思います。きっと八海山の生酒が大して美味くなくて不貞腐れていたのだと思います。 ま、今回タイトルはテレコになりましたが内容は同じです。 クラスタの名前を、クラスタマテリアルの名前から取ってこようというスクリプトです。


某さんの御所望で書いたようなカタチになってますが、実は俺自身がまさにこの機能を数週間前から御所望だったのです。偶然にも某さんが御所望してくれたので、いきなり書き始めたのでした。日曜の夜、しかも酩酊状態だったので、最低限しか書いてませんでした。


今日仕事で使ったら、少し不満が出てきたので書き直しました。
スクリプト起動前の選択の方法が広がりました。
ちなみに酩酊状態じゃありません。仕事中です。



//    クラスタの名前に付けたい Prefix と Postfix
//    最終的なクラスタの名前 = Prefix + マテリアル名 + Postfix

Prefix = "";
Postfix = "";

//    Expand = 恐るべき邪教の呪文
//    ノード選択・ツリー選択・ブランチ選択・グループ/レイヤ/パーティション選択が可能になる

var oCol = XSIFactory.CreateObject( "XSI.Collection" );
oCol.items = Selection;
var oTargets = oCol.Expand( );

//    まずはクラスタ全部を引っかき集める
var oClusters = XSIFactory.CreateObject( "XSI.Collection" );
oClusters.Unique = true;
for ( var i=0; i<oTargets.count; i++ )
{
    if ( oTargets(i).type == "polymsh" )
    {
        oClusters.AddItems( oTargets(i).ActivePrimitive.Geometry.Clusters );
    }
    else if ( oTargets(i).IsClassOf( siClusterID ) )
    {
        oClusters.Add( oTargets(i) );    //    クラスタそのものの選択にも対応
    }
}

//    引っかき集めたクラスタに対し本処理
for ( var i=0; i<oClusters.count; i++ )
{
    if ( oClusters(i).type == "poly" )
    {
        for ( var j=0; j<oClusters(i).LocalProperties.count; j++ )
        {
            if ( oClusters(i).LocalProperties(j).IsClassOf( siMaterialID ) )
            {
                 oClusters(i).name = Prefix + oClusters(i).LocalProperties(j).name + Postfix;
                 break;
            }
        }
    }
}


以前はオブジェクトをノード選択した状態しか想定していませんでした。 今回は Expand という呪文を使ったため、ブランチ選択していればその階層内の全部のオブジェクトが対象になります。グループ選択していれば、グループに所属する全てのオブジェクトが対象になります。 レイヤでもパーティションでも何でも来いです。 ついでにクラスタそのものを直接選択していてもいいことにしました。 また、これらの選択状態が混在していてもかまいません。

例えばシーン全体で処理したい時は、Scene_Root からブランチ/ツリー選択して実行すれば良いでしょう。


また、スクリプトの冒頭で PostfixPrefix を書き換えられるようにしておきました。 デフォルトでは "" = つまり無文字ですので何も追加されません。結果、クラスタの名前はクラスタマテリアルの名前そのものになります。 もし Prefix に "Mat_" を設定していたら、Mat_マテリアル名 という名前のクラスタになります。 Postfix に "_mat" とか設定していたら、マテリアル名_mat という名前のクラスタになります。もちろん両方指定してもかまいません。 自分の命名ルールに合わせて書き換えて使うと良いでしょう。


スクリプティング的な要点は、クラスタの取得方法がわかるということと、Expand と、LocalProperties を使っていることでしょうか。 そのうち説明するかも知れません。しないかも知れません。知りません。




なんだか少しマトモなツールになってきたように見える。酩酊から生まれたにしては上出来じゃないか。


ここに Prefix や Postfix などを決定する PPG を付けたり、前回の設定を覚えているようにしたり、マテリアルの名前から特定の文字を検索置換した後にクラスタ名に反映させるような仕組みにしたり、とかなんとか付け加えたりすると、セルフインストール型のプラグインに昇格させてビールウェアの仲間入りをしたりします。酩酊からスタートするかどうかはともかく、典型的な小ツール開発の過程です。


でもこのスクリプトをさらにいじるかどうかはわかりません。神の味噌汁です。






.

|

« クラスタマテリアルの名前をクラスタの名前にしてみる。 | トップページ | 悲しみのローカルシンメトリ。 »

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: クラスタの名前をクラスタマテリアルの名前にしてみる。:

« クラスタマテリアルの名前をクラスタの名前にしてみる。 | トップページ | 悲しみのローカルシンメトリ。 »