« 連番打ち直し2013。 | トップページ | XSI男忘年会2013(略称) »

2013年11月28日 (木)

クローン選択。

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


Clone

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

//	くろマス
//	クローンオブジェクト(複数可)を選択して実行 → クローンのマスタオブジェクト(クローン元)が選択される

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

for ( var i=0; i<Selection.count; i++ )
{
	var oObj = Selection(i);
	if ( oObj.IsClassOf( siX3DObjectID ) )
	{
		var e = new Enumerator( oObj.ActivePrimitive.ConstructionHistory );
		for ( ; !e.atEnd(); e.moveNext() ) 
		{
			var oOp = e.item();
			if ( oOp.Name == "CopyOp" )
			{
				var oTarget = oOp.InputPorts(0).Target2.Parent3DObject;
				oMasters.Add( oTarget );
				Logmessage( oObj.Fullname + " -- クローン元 --> " + oTarget.Fullname );
			}
		}
	}
}

if ( oMasters.count == 0 ) Logmessage( "腹立たしいことに、クローンが選ばれていません。去って下さい。", siError );
else SelectObj( oMasters );Logmessage( "クローンのマスタ(クローン元)を選択しますた : " + oMasters.count );
---------------------------------------------------------------------------

↑ くろマスのダウンロード(右クリックとか)





JScript
---------------------------------------------------------------------------
//	マスくろ
//	クローンのマスタオブジェクト(複数可)を選択して実行 → クローン先が選択される

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

var oAllObjects = ActiveSceneRoot.FindChildren();
for ( var i=0; i<oAllObjects.count; i++ )
{
	var oObj = oAllObjects(i);
	var e = new Enumerator( oObj.ActivePrimitive.ConstructionHistory );
	for ( ; !e.atEnd(); e.moveNext() ) 
	{
		var oOp = e.item();
		if ( oOp.Name == "CopyOp" )	oAllCloneOps.Add( oOp );
	}
}

if ( oAllCloneOps.count == 0 ) Logmessage( "こともあろうに、シーンにクローンが存在しません。去って下さい。", siError );
else
{
	var oResults = XSIFactory.CreateObject( "XSI.Collection" );
	oResults.Unique = true;

	for ( var i=0; i<Selection.count; i++ )
	{
		for ( var j=0; j<oAllCloneOps.count; j++ )
		{
			var oCloneOp = oAllCloneOps(j);
			var oCloneMaster = oCloneOp.InputPorts(0).Target2.Parent3DObject;
			if ( Selection(i).Fullname == oCloneMaster.Fullname ) oResults.Add( oCloneOp.Parent3DObject );
		}
	}
	if ( oResults.count == 0 ) Logmessage( "呆れたことに、そんなやつのクローンは存在しません。去って下さい。", siError );
	else SelectObj( oResults );Logmessage( "クローン先を選択しますた : " + oResults.count );
}
---------------------------------------------------------------------------

↑ マスくろのダウンロード(右クリックとか)





クローンからクローン元を選択する。
クローン元からクローン先を選択する。

というスクリプトです。

くろマスの方は、クローンを選択して実行すると、クローンのマスタ(クローン元)のオブジェクトが選択されます。  マスくろの方は逆で、クローン元を選んで実行すると、そのオブジェクトからクローンされたクローンオブジェクトが選択されます。


ありそでなさそなこの機能。 何年も前からずっと欲しかったんです。 空調屋のステキなおじさまに助けて頂いてとうとう書きました。





くろマスの方はですね、 CopyOp というオペレータの有無を調べて、あったらその InputPort を探って接続されているオブジェクト(クローン元)を探すので、まあシンプルだし、問題ないです。

しかしマスくろの方は、これを逆にやる良い方方が見つかりませんで、結局シーン全体のオブジェクトに対し検索をかけ、前述と同じ CopyOp を頼りに総当りで接続先を探すという、非常に効率の悪いスクリプトになっています。規模のでかいシーンとかだと実行が遅いかもしれません。 他になんかいい方法ないですかねえ。





同じようなことを、クローンではなくインスタンスでやるツールは昔書いていて、淫さま  と言います。  これもずいぶん古いスクリプトだな・・・。 今でもけっこう使うけど。







.



|

« 連番打ち直し2013。 | トップページ | XSI男忘年会2013(略称) »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: クローン選択。:

« 連番打ち直し2013。 | トップページ | XSI男忘年会2013(略称) »