« 乗り換えPathCns。 | トップページ | 即ワイからさん。 »

2013年11月14日 (木)

複数グループイッキブッ込み。

ついカッとなって書いたのですが、どうだろう。汎用的に使えるかな。

Hooksoogroupickibookowmi


JScript:
------------------------------------------------------------------

//	複数グループイッキブッ込み
//
//	順番はなんでもいいから、ブツとグループを複数選択して実行 → 選択に含まれるブツすべてが、選択に含まれる全てのグループにブッ込まれる

var oNewMembers = XSIFactory.CreateObject( "XSI.Collection" );
oNewMembers.Unique = true;
var oGroups = XSIFactory.CreateObject( "XSI.Collection" );
oGroups.Unique = true;

for ( var i=0; i<Selection.count; i++ )
{
	//	Group に入れるのって、3Dオブジェクトとクラスタだけ? 他にありますかね?
	if ( Selection(i).IsClassOf( siX3DObjectID ) || Selection(i).IsClassOf( siClusterID ) ) oNewMembers.Add( Selection(i) );
	
	//	siClassID を使っても Type を使っても、Group/Layer/Partiton は同じに扱われてしまうように見える。いまだに。嘔吐デスクさま?
	else if ( Selection(i).IsClassOf( siGroupID ) && !Selection(i).IsClassOf( siPartitionID ) && !Selection(i).IsClassOf( siLayerID ) ) oGroups.Add( Selection(i) );
}

if ( oNewMembers.count == 0 || oGroups.count == 0 ) Logmessage( "Group とそこに入れたいブツが選ばれてないようですので、お早めにお死に下さい。", siError ); 
else
{
	Logmessage( "ブッ込まれるブツの数 : " +  oNewMembers.count + " -- " + oNewMembers.GetAsText() );
	for ( var i=0; i<oGroups.count; i++ )
	{
		oGroups(i).AddMember( oNewMembers );
		Logmessage( "(" + (i+1) + "/" + oGroups.count + ") " + oGroups(i).Fullname + " にブッ込みますたー(゚∀゚)" );
	}
}

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

このスクリプトのダウンロード(右クリックで保存とか)




ブツ(複数可)を、複数のグループにイッキに放り込むスクリプトです。

順番はなんでもいいので、とにかくブツとグループを選択します。グループは複数選択してないとこのスクリプトを使う意味はないですよね。 で、実行すると、そのとき選択に含まれていたブツ全部が、そのとき選択に含まれていたグループ全部ブチ込まれます。





ICE でインスタンスを散らすとき、Group を作ってその Group を ICETree から指定したり、よくするじゃないですか。 で、いろいろやってるうちに、既に用意してあった多くの Gorup に対し、新規のオブジェクトをいちいち Add to Group とかしていくのが面倒で、ってよりもミスを連発してブチ切れてしまい、書きました。 手作業が面倒というより、ミスを避けるために書いているようなもんかも知れません。


あ、そうだ、通常のオペレーションでは Group を Group に入れることもできちゃうわけですが、このスクリプトではそれには対応してません。あくまでも 3Dオブジェクト(とクラスタ)のみを対象にしています。





スクリプティング的な話をすると、ええと、siClassID Type を使うと、やっぱり Group と Layer と Partition は同じに扱われてしまうんですね。 この3つは全部 Group というカテゴリに含まれているようです。 

Layer と Partition が目的なら、siPartitionID とか siLayerID ってのがあるのでその判別は付けられますが、Group のみをターゲットにしようとすると、この3つの全部がsiGroupID に含まれるもんだから、困ります。

だから、「Group であって、かつ、Layer でも Partition でもなければ、それは Group 」 という判別をやっています。まどろっこしい。



でも、大昔にこのブログで話題にしたような GUID とか意味不明の呪文による判別よりはまだマシかなあ。 なんかいい方法ありましたっけ? 最近その辺のオベンキョというかリサーチが足りなくていかんなあ俺。




あ、このスクリプトの逆バージョンも欲しいな。 選択している全部のブツを、選択している全部のグループから脱退させるという。  「シーン中の全てのグループから脱退させる」 のスクリプトは書いたことありましたが、脱退対象グループを選択したものに限定するスクリプトは、たぶん書いてない。そのうち書きます。





.

|

« 乗り換えPathCns。 | トップページ | 即ワイからさん。 »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: 複数グループイッキブッ込み。:

« 乗り換えPathCns。 | トップページ | 即ワイからさん。 »