« 2013年10月 | トップページ | 2013年12月 »

2013年11月

2013年11月29日 (金)

XSI男忘年会2013(略称)

ついカッと・・・・・じゃないや、恒例なのでついうっかり、ですね。 ついうっかり忘年会をします。



http://tweetvite.com/event/XSIManParty2013

XSI男忘年会2013(略称)
2013年12月29日(日)
18:00 ~ 20:00
手作り居酒屋甘太郎 新宿歌舞伎町店
3,500円


去年のようすはこちら




なんてことないただの呑み会です。
どなたでもお気軽に参加してください。

上記の Teetvite のページで参加表明してもらうのがいちばん簡単ですが、なんなら個人的に俺に連絡くれてもいいです。


なんの仕込みもないですけど、いつかやったみたいな ICE 抽選会とか無いとは思いますけど、まあ、ダラダラと気楽に呑みましょうよ。 お久しぶりのあなた、まだお会いしたことの無いあなた、どうぞいらして下さい。 CGの話しましょうよ。 あなたどんな仕事してるんですか。 今までどういうのやってきたんですか。 こんなの作ったら、どれくらいの時間かかります? ディレクションってどうしてるんですか。 誰か教えてくれる人とかいます? 毎日普通に家に帰れてますか? Maya 様ってやりやすい? スケマティックって使いますか? 休みの日もCGいじくったりとかするんですか。 とかなんとか。 あなたと話がしたいです。 ほんとに。  いや、CGの話じゃなくてもいいですよ。女とか男とかの話も。 あなた見た目は男らしい感じだけど、ほんとは男の方が好きなんでしたっけ? とかなんとか。


あなたとお話したいです。よかったら、ぜひいらして下さい。





.

| | コメント (0) | トラックバック (0)

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 を頼りに総当りで接続先を探すという、非常に効率の悪いスクリプトになっています。規模のでかいシーンとかだと実行が遅いかもしれません。 他になんかいい方法ないですかねえ。





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







.



| | コメント (0) | トラックバック (0)

2013年11月27日 (水)

連番打ち直し2013。

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


Renbanuchinaoshi



JScript

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

//	連番打ち直し2013
//
//	複数のオブジェクトを選んで実行 → 番号を振り直してリネーム。

if ( Selection.count == 0 )	Logmessage( "帰って下さい。", siError );
else Main();

function Main()
{
	OpenUndo( "連番打ち直し2013。" );
	OriginalName = Selection(0).name;
	
	//	名前の文字列の最後の文字から逆方向検索 数値じゃない文字が出てきたらそこまでを名前のボディとする
	for ( var i=0; i<OriginalName.length; i++ )
	{
		Str = OriginalName.charAt( OriginalName.length - 1 - i );
		if ( isNaN( parseInt(Str) ) ) //数値か否かって、こんなんでいいのん?
		{
			NumPointer = i;
			break;
		}
	}
	DefNameBody = OriginalName.substring( 0, OriginalName.length - NumPointer );//名前ボディ

	var oProp = XSIFactory.CreateObject( "CustomProperty" );
	oProp.name = "連番打ち直し2013。";
	var oL = oProp.PPGLayout;

	oProp.AddParameter2( "sNameBody", siString, DefNameBody );
	oProp.AddParameter2( "iStart", siInt4, 1, 0, 999999 );
	oProp.AddParameter2( "iStep", siInt4, 1, 1, 999999 );

	var oItem;

	oL.AddSpacer( 0, 100 );

	oL.AddRow();	
	
		oL.AddGroup( "", false, 30 );
		oL.EndGroup();

		oL.AddGroup( "", true, 40 );
			oItem = oL.AddItem( "sNameBody", "Name Body" );
			oL.AddSpacer( 0, 20 );
			oItem = oL.AddItem( "iStart", "Start Index" );
			oItem.SetAttribute( siUINoSlider, true );
			oL.AddSpacer( 0, 20 );
			oItem = oL.AddItem( "iStep", "Step" );
			oItem.SetAttribute( siUINoSlider, true );
		oL.EndGroup();

		oL.AddGroup( "", false, 30 );
		oL.EndGroup();

	oL.EndRow();
	
	Inspect = InspectObj( oProp, null, null, siModal, false );

	if ( !Inspect )
	{
		for ( var i=0; i<Selection.count; i++ )
		{
			Selection(i).name = "AnybodyFuckMeRightNowPlease.";//一度無関係の名前にリネーム
		}
		Index = oProp.iStart.value;
		for ( var i=0; i<Selection.count; i++ )
		{
			Selection(i).name = oProp.sNameBody.value + Index;
			Index += oProp.iStep.value;
		}	
	}
	CloseUndo();
}

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

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



カッとなって書いたのは、どうやら2009年ごろか? 入っていたフォルダを見ると、真田さんの親方さんが死ぬときに書いたようです。 大量のザコ兵インスタンスのリネームにでも使ったのか。 六文銭のボーンのリネームとかそういうショボいアレじゃないよな・・・?



まあどうでもいいのですが、ちょっと必要になったのでそれをほじくり出してきて、若干書き直したものです。 オブジェクトの名前を連番にしたい時に、既に存在するオブジェクトの名前とカブってしまうために意図通りの番号にできない時に使います。 あと、2つおきとか3つおきの番号にしたい時に使います。



例えば、 hage1, hage2, hage3, hage4 というオブジェクトがある時に、これを hage3, hage4, hage5, hage6 という風に、スタートを3にしたいとしますよね。 

リネーム後の名前が現存する名前とカブらない、つまり完全に新規の名前にするのであれば、問題ないですよね。 全部を順に選んで PPG を表示させ、マルチモード(複数編集モード)の PPG になっているので名前の入力フィールドに hage3 とか入力してやれば、以降のオブジェクトは数値が1つずつ加算されて望みの連番になります。



しかしこの例では、リネーム後の名前のうち、 hage3, hage4  という2つは既に存在してしまっています。こういう時、XSI 様は hage5 を起点にして連番にしますよね。そりゃそうですよね。


なのでしかたなく、一度無関係の名前にリネームしてカブる名前を無くした状態で、再度 hage3 などと入力すればいいのですが、これがめんどくさいじゃないですか。 だからこのスクリプト書いたんです。



あとは、ステップ2とかにしたい場合があったので、その時も使いましたね。




すいません、そんだけです。






これは、名前。  にでも組み込んだ方がいいかしらん?

名前。 は毎日使うくせに、中身はずいぶん長いこといじってないからなあ。 いろいろ改造したいポイントもあるんだが。。。。。。






..

| | コメント (0) | トラックバック (0)

2013年11月20日 (水)

即ワイからさん。

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


Sokuwaikarasan

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

//	即ワイからさん
//	ブツを選び(複数可)実行
//	実行時に押していたキーによって色が変わる(8色)


var rtn = GetKeyboardState( );
ModKey = rtn(1);

switch( ModKey )
{
	case 0:Index = 0; break;	//		none	= red
	case 1:Index = 1; break;	//		shift	= green
	case 2:Index = 2; break;	//		ctrl	= blue
	case 3:Index = 3; break;	//	ctrl + shift	= purple
	case 4:Index = 4; break;	//		alt	= orange
	case 5:Index = 5; break;	//	alt + shift	= cyan
	case 6:Index = 6; break;	//	ctrl + alt	= Pink
	case 7:Index = 7; break;	//	ctrl + alt + shift= Yellow
}

var aR = Array( 0.878,	0.125,	0,		0.376,	0.878,	0.125,	0.878,	0.878	);
var aG = Array( 0,		0.878,	0.125,	0	,	0.251,	0.878,	0.251,	0.878	);
var aB = Array( 0,		0.125,	0.627,	0.251,	0,		0.753,	0.627,	0		);
var aCol = Array( "none = 赤","shift = 緑","ctrl = 青","ctrl + shift = 紫","alt = 橙","alt + shift = 水","ctrl + alt = 桃","ctrl + shift + alt = 黄");

var oObjects = XSIFactory.CreateObject( "XSI.Collection" );
for ( var i=0; i<Selection.count; i++ )
{
	var oObj = Selection(i);
	if ( oObj.IsClassOf( siGroupID ) || oObj.IsClassOf( siX3DObjectID ) ) oObjects.Add( oObj );
}

if ( oObjects.count == 0 ) Logmessage( "ちゃんとしたものが選ばれてないので師んで下さい。", siError );
else
{
	OpenUndo( "SokuWaikaraSan" );
	for ( var i=0; i<oObjects.count; i++ )
	{
		var oObj = oObjects(i);
		var oDisp = oObj.LocalProperties( "display" );
		if ( !oDisp ) var oDisp = oObj.AddProperty( "Display Property" );

		oDisp.wirecolorr.value = aR[ Index ];
		oDisp.wirecolorg.value = aG[ Index ];
		oDisp.wirecolorb.value = aB[ Index ];
	}

	Logmessage( aCol[ Index ] + " (・∀・;)" );
	DeselectAll();
	CloseUndo();
}

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

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



以前からワイからさんという、ワイヤカラーをイッキに設定するツールがあったんですが、これを使ってもやっぱり面倒くさいと感じることがあるんですよね。 何でもいいから今この場でパパっと色をつけたい、とかそういうときは、いちいち PPG 出すまでもない。 標準機能にあるパレットからピックするやつは、複数のオブジェクトにイッキにできないし、俺はピックセッションが必ずしも好きではないんですね。


なので、選択しているオブジェクトに即時にワイヤカラーを付けるスクリプトを書きました。


あらかじめ8色仕込んであって、何色が付くかは実行時にモディファイヤキーのどれを押していたかどうかによって変わります。


付けた色が気に食わない場合もあるので、ワイヤカラー設定の実行後に選択を解除するようにしてあります。 つまり、選択ハイライト無しの状態 = たった今与えたワイヤカラーが確認できる状態 になるということです。




また脊髄反射的に書いて即アップしてます。ロクにテストしてません。






.

| | コメント (0) | トラックバック (0)

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 とか意味不明の呪文による判別よりはまだマシかなあ。 なんかいい方法ありましたっけ? 最近その辺のオベンキョというかリサーチが足りなくていかんなあ俺。




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





.

| | コメント (0) | トラックバック (0)

2013年11月13日 (水)

乗り換えPathCns。

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

Norrykae

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

//	乗り換えPathCns
//	1.Path コンストレインがあるオブジェクトを選択
//	2.乗り換え先の Path Curve オブジェクトを選択
//	3.実行 → 古い Path に別れを告げ、新しい Path に乗っかって終了

if ( Selection.count != 2 || Selection(1).type != "crvlist" ) Logmessage( "Pathコンストがあるオブジェクトと、乗り換え先のカーブの2つが選択されてないくさいので、何卒お死に下さい。", siError );
else
{
	var oObj = Selection(0);
	var oOldPathCns = oObj.Kinematics.Constraints.Filter( siPathCnsType )(0);
	if ( !oOldPathCns ) Logmessage( "Path コンストが見つからないので、何卒お死に下さい。", siError );
	else if ( oOldPathCns.Constraining(0).Fullname == Selection(1).Fullname ) Logmessage( "それは同じ Path Curve ですので何卒お死に下さい。", siError );
	else
	{
		var oOldParams = oOldPathCns.Parameters;
		var oNewPath = Selection(1);

		var oNewPathCns = oObj.Kinematics.AddConstraint( "Path", oNewPath );//元のコンストは残したまま、新たにコンスト
		var oNewParams = oNewPathCns.Parameters;
		for ( var j=0; j<oOldParams.count; j++ )
		{
			var oOldParam = oOldParams(j);	
			var oNewParam = FindParam( oNewParams, oOldParam ); //	一致するパラメータを探す
			if ( oNewParam )
			{
				oNewParam.value = oOldParam.value;		//	値コピー
				if ( oOldParam.IsAnimated( siAnySource ) )	//	アニメーションあればコピー
				{
					CopyAnimation( oOldParam );
					PasteAnimation(  oNewParam );					
				}
			}
		}
		DeleteObj( oOldPathCns );//	元のコンスト殺害
	}	
}

//	名前の一致するパラメータを探す
function FindParam( oNewParams, oParam )
{
	for ( var i=0; i<oNewParams.count; i++ )
	{
		if ( oNewParams(i).ScriptName == oParam.ScriptName ) return oNewParams(i);
	}
}

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

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




Path コンストレイン先のカーブを別のカーブに変更するスクリプトです。

現在カーブAにコンストしてあるけど、もろもろのパラメータの値やアニメーションは保持したまま、コンスト先をカーブBに変えたい、とかそういう時に使います。 さっきそれを手でやっててミス連発してブチ切れて書きました。 コンストがあるオブジェクトを最初に選び、次に変更先のカーブを選んでから実行します。




・・・・これ、標準機能で無いよね?
無いと言ってくれ



もしアップベクタ先のオブジェクトを指定していた場合ですが、このスクリプトはそこは考慮してません。 なのでアップベクタ先の指定は、新しいカーブに乗り換えた後、手でし直さねばなりません。 もし今後も使えそうだったりしたら、ここら辺を改良しますかね。

あと、複数のオブジェクトには効きません。 また、1つのオブジェクトに Path コンストが複数あっても、最初の1個しか処理対象にしてません。





値やアニメーションをコピーするために、ターゲットのパラメータを探すやり方ですが、全パラメータをループして名前で順番に探しているので非常にダサい気がしますが、ParameterColleciton.Filter で名前を食わせても上手く抽出できなかったんです。なんでだろ。深く検証してない。 なんかいい方法あるでしょうか。








あと、カーブデフォーム乗り換えも欲しいなあ。 そのうち。

この機能、SI|3D の頃は、あったような気がするんだよなあ。 Path > Substitute とか、そんなのなかったっけ?






.

| | コメント (0) | トラックバック (0)

2013年11月 4日 (月)

ガッデムMatLib。

マテリアルライブラリを整理するツールを書きますた。
だいぶ前に書いて、今でもよく使ってます。


複数のマテリアルライブラリを合体させる機能と、空っぽのマテリアルライブラリを削除する機能の2つしかないんですけどね。



マテリアルライブラリ整理ツール
ガッデム MatLib
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

Goddamnmatlib



人からもらったシーンを整理したり、シーンのマージをしたり、emdl のインポートをしたり、いろんなことするうちにマテリアルライブラリってけっこうぐちゃぐちゃになってガッデーーム! になるじゃないですか。 閣下がお怒りなのも無理もないことです。 だから整理ツールを書いてみたという。



空っぽのマテリアルライブラリを削除する方のスクリプトは、書きたてほやほやの時に一度ブログに書いてましたね。 これ ですね。 その後、合体機能を追加したのかな。

あともうひとつ、なんだっけ、マテリアルライブラリ関係で欲しい機能があったんだけど、忘れちまったよ。 思い出したら機能追加しておきます。







( ´・ω) ガッデーム



.

| | コメント (0) | トラックバック (0)

2013年11月 1日 (金)

複製レンダ真っ裸(ぱ)。

レンダマッププロパティって、複製できないんですね。 Ctrl + D しても Unsupported Input Parameters などというエラーが出やがる。 なんですかそのはしたないエラーメッセージの言い方は。 意味不明ですよ。 出来ないなら出来ないで、「レンダマップの複製は出来ないんです」 という言い方で警告を出しなさいよ XSI 様。






なのでカッとなって書きました。 今書きたてホヤホヤ。 ひとつのシーンでしか実験してません。




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

// レンダマッププロパティを複製するスクリプト。
// Rendermap プロパティ(複数可)を選んで実行。
oNewRenderMaps = XSIFactory.CreateObject( "XSI.Collection" );
for ( var i=0; i<Selection.count; i++ )
{
 if ( Selection(i).Type == "rendermap" )
 {
 var oRenderMap = Selection(i);
 var oObj = oRenderMap.Parent3DObject;
 var oNewRenderMap = oObj.AddProperty( "rendermap" );// 新しいレンダマッププロパティ降臨
 
 //新しいレンダマッププロパティにパラメータをコピー
 for ( var j=0; j<oRenderMap.Parameters.count; j++ )
 {
 if ( oNewRenderMap.Parameters(j).Name == oRenderMap.Parameters(j).Name )
 {
 //Logmessage( (j) + " :: " + oRenderMap.Parameters(j).Name + " : " + oRenderMap.Parameters(j).value );
 if ( oRenderMap.Parameters(j).value != undefined )// undefined の場合はじく
 {
 oNewRenderMap.Parameters(j).value = oRenderMap.Parameters(j).value;
 }
 else Logmessage( oRenderMap.Parameters(j).Name + " -->  undefined なのでスッ飛ばす", siWarning );
 }
 else
 {
 Logmessage( "パラメータ名不一致くさいっス。 --> " + oNewRenderMap.Parameters(j).Name + " : " + oRenderMap.Parameters(j).Name, siError );
 }
 }
 oNewRenderMap.Name = oRenderMap.Name + "_dup";
 oNewRenderMaps.Add( oNewRenderMap );
 }
}
if ( oNewRenderMaps.count != 0 ) SelectObj( oNewRenderMaps );
else Logmessage( "なんもしてねえっス。", siError );

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

↓複製レンダ真っ裸 のダウンロード
HookSayRenderMappa.js



複製できないなら、新規でプロパティ出してパラメータ全部コピーしてやればいいじゃねえかというアレです。

でも XSI のパラメータって、何かのパラメータのオンオフをトリガにしてパラメータの構成が変わってしまったりとか、ありますよね。 Rotoscope とかだっけ。 なのでこのスクリプトのように総当りせずインデックス順に名前の一致だけを見てコピーしてしまうってのが常に安全かどうかは分かりませんが、まあとりあえず動いているからいいんじゃねえの。


レンダマップに限らずそもそもプロパティって、複製できないもんだったっけ? そのオブジェクトにとって1つしか持てない種類のプロパティはもちろんそれでいいけど、レンダマッププロパティのように複数持てちゃうものは、普通に複製できて欲しいですよねえ。 嘔吐デスクさま?


2013.11.06 追記:

Ctrl + D で複製はできなくとも、Ctrl + C と Ctrl + V のコピペで複製できるということを教えて頂きました。 コメント欄参照。

こうしてこの記事のスクリプトは、ちっとも要らないスクリプトになりますた orz
いつものことです。

今後も、どなた様でも、どうかこのようなツッコミをガンガンお願いします。


\(^ω^\)イエーイ

.

| | コメント (3) | トラックバック (0)

« 2013年10月 | トップページ | 2013年12月 »