カテゴリー「XSI Plug-ins/Scripts (original)」の140件の記事

2014年12月27日 (土)

フレームレンジ様。

久々にツールを公開してみたり。
今さら、ねえ。

しかもほんのちょいツールなので、大したアレではないのですが。


フレームレンジ様

Framerangesama_menu

http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html




説明はビデオでどうぞ。



まああの、フレーム範囲をいじくるというか、セットするのに少しラクをしたかっただけです。 ほんの少しラクになります。



さて、もうすぐ XSI 男忘年会です。 20人ちょい集まるのかな。 もう何回目になるんだろう。たぶん7回とか。 皆様、当日会いましょう。 

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

2014年9月 9日 (火)

おっぴろげスケマチック。

スケマティックビューで、ノードを畳んだ状態にするってよくやりますけど、それを展開するときに面倒なこと多いですね。 特に人からもらったデータだとね。 


Nキーというショートカットがありますが、キーを押す前にまずはそのノードが選択されていることが前提ですからね。 あちこちに散っている畳まれたノード達。 畳んだ下の階層でさらに畳まれたりしてますからね。 どこがどう畳まれてるかも知らないのにどうやって選択すんのよ、 っていうか知ってても選択したくねえよ って話ですよ。 




例えば、パッと見こんなスケマティックが・・・・・、

Sss2


全部展開してみると・・・・・・

Sss3

実はこんなだったりとかね。 クリックするとでかい画像が出ます。


こんなツリーで、あちこちが畳まれていたら、そりゃブチ切れますよね。 全部おっぴろげろやゴルァ とモニタを窓から射出してしまいます。






・・・・という状況だったらしい。 俺もよくある。 実によくある。





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

//	おっぴろげスケマチック ver 2

var oGodDamnViews = Desktop.ActiveLayout.Views;

//	ドックビューを捜索 -> 浮遊ビューを捜索 -> それでもなきゃ作る
var oFuckinSchematicView = oGodDamnViews.Filter( "View Manager" )(0).Views.Filter( "Schematic" )(0);
if ( !oFuckinSchematicView ) {
	oFuckinSchematicView = oGodDamnViews.Filter( "Schematic" )(0);
	if ( !oFuckinSchematicView ) var oFuckinSchematicView = Desktop.ActiveLayout.CreateView( "Schematic", "おっぴろげスケマチック。" );
}

var oMotherFuckinNodes = oFuckinSchematicView.SelectedNodes;//	選択中のノード
if ( oMotherFuckinNodes.count == 0 ) oMotherFuckinNodes = oFuckinSchematicView.Nodes;//なんもなければ全ノード

for ( var i=0; i<oMotherFuckinNodes.count; i++ ) ExpandMotherFuckinSonOfABitchNode( oMotherFuckinNodes(i) );

function ExpandMotherFuckinSonOfABitchNode(oAssHoleNode){	//	再帰的というらしい
	oAssHoleNode.Expanded = true;//	おっぴろげ
	for ( var i=0; i<oAssHoleNode.Nodes.count; i++ ) ExpandMotherFuckinSonOfABitchNode( oAssHoleNode.Nodes(i) );
}

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

ダウンロードする


コピペでもダウンロードでもなく、手打ちが推奨なのですが(謎



何も選んでない状態で実行すると、シーンの中の全スケマティックノードが展開されます。 つまり、たたまれた状態のノードはなくなります。 何かを選んでいると、その選んでいるオブジェクトの階層以下全てが展開されます。 そんだけです。 以上。







スケマティックビュー関連は昔、全然スクリプタブルじゃなかったんですよね。 でもおそらく要望が多かったのでしょう、2012 になってようやく Schematic オブジェクトSchematicNode オブジェクトができたんですよね。 俺も 2006 年とかその頃からずーーーっと要望を出していたので、すげえ嬉しかったです。

でも、まだ全然できることが少ない。 必要なプロパティやメソッドがまだ全然整備されてないという印象です。 

でもまあ、最初はこんなものだろう、これからだんだん増やしていくんだなーとか思っていたら、廃村です。 Python じゃありません。 廃村です。  



これはもう、滅び行く村の方言であります。 幻の言語になります。 文化保存の目的で、ここに残します。 いつか XSI 博物館が建ったら収蔵して下さい。




.

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

2014年9月 3日 (水)

選択順で親子づらづら。

どうしたことかなかなか XSI 仕事が途切れなくて、日々 XSI 触ってます。 つまり日々スクリプト書いてます。


最近は、ヌルがたくさんあって直列に親子付けしたいとか、そういう場面が多いです。 


これ、XSI の標準の親子付けで連続的にやろうと思ったら、中クリックで子供から親をピックしていくしかないですよね? 

俺の場合、中クリックがけっこうツラいんですよ。 マウスだと指の筋肉のスジが痛くなってくる。 ペンタブのペンだと指を多く曲げるのがつらい。 

ちなみにペンのスイッチは人差し指で押す派で、かつ下側が右クリック、上側が中クリック派です。 つまり中クリックをしようとすると人差し指をぐりんと曲げた状態にせねばならず、これがつらく感じることもよくあるんですよ。 だから、中クリックや、できれば右クリックもなるべくしないで済むようなスクリプトを書くことがけっこう多いです。


今回もそういうスクリプトですね。


Jscript
------------------------------------------------

//	選択した順で親子づらづら
//
//	オブジェクトを 親 → 子 の順でいくでも選んで実行 → その順番で親子になる。

OpenUndo( "選択した順で親子づらづら" );
for ( var i=Selection.count-1; i>=0; i-- )
{
	if ( Selection(i).IsClassOf( siX3DObjectID ) )
	{
		var oChild = Selection(i);
		var oParent = Selection(i-1);	
		if ( oParent ) oParent.AddChild( oChild );
	}
}
CloseUndo();
------------------------------------------------

このスクリプトのダウンロード




いや、ほんと、毎回どうでもいい小スクリプトですよね・・・。 まあ、俺は便利に使ってますけどね。

親にしたいオブジェクトが最初、次に子供、次にその子供・・・・という順番で選択して行き、このスクリプトを実行すると、その順番で直列に親子関係ができます。  そんだけ。  中クリックとか要らないので、俺は楽なんです。


Zoolazoola



もうちょっと規模の大きな(って言っても大したことないですが)ツールもたくさん書いてるんですが、なかなかブログにアップできないな。 2~3日まとまった時間を作らないとなあ。




しぶとく続く XSI の日々。



.



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

2014年8月 6日 (水)

これ。 このModel。

this this_model ですよ。
エクスプレッションの話です。


PPG 上でドラッグ&ドロップしてエクスプレッションを作成すると、this や this_model で記述できる部分でもそのオブジェクトのフルネームが入ってしまいますね。 

それを this や this_model にイッキに置換してくれるツールが欲しかったのですが、たぶん無いだろうから急に書きました。


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

//	これ。このModel。 this. this Model.
//	エクスプレッションのあるオブジェクトを選んで実行。 
//	this や this_model に置換できる部分を置換

OpenUndo( "これ。このModel。" );
var oObjects = Selection;
for ( var i=0; i<oObjects.count; i++ )
{
	var oObj = oObjects(i);
	var oAnimParams = oObj.NodeAnimatedParameters(siExpressionSource);//Expression駆動のパラメータ取得
	for ( var j=0; j<oAnimParams.count; j++)
	{
		var oParam = oAnimParams(j);
		Hage( oParam );
	}
}
CloseUndo();

function Hage( oParam )
{
	var oObject = oParam.Parent3DObject;	//そのパラメータの所有者であるオブジェクト取得
	
	var oExpr = oParam.Source;	//Expression駆動で既にフィルタ済みなのでSourceで必ず Expression オブジェクトが取得される
	var oDefinitionParam = oExpr.Parameters( "Definition" );//なんか知らんがこれと次の1行でExpressionの中身を取得
	ExprDif = oDefinitionParam.Value;

	//	this
	var RE1 = new RegExp( oObject.FullName, "gi" );
	NewExprDif1 = ExprDif.replace( RE1, "this" );

	//	this_model
	var oModel = oObject.Model;
	var RE2 = new RegExp( oModel.Name, "gi" );
	NewExprDif2 = NewExprDif1.replace( RE2, "this_model" );

	if ( ExprDif.toLowerCase() != NewExprDif2.toLowerCase() )
	{
		oDefinitionParam.Value = NewExprDif2;
		Result = oDefinitionParam.Value;
		if ( ExprDif.toLowerCase() == Result.toLowerCase() ) Logmessage( "なぜか変わってねえっス : " + oParam.Fullname, siWarning );
		else
		{
			Logmessage( "置換しますた。 : " + oParam.Fullname );
			Logmessage( "	" + ExprDif  + " --> " + NewExprDif2 );
		}
	}
}

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

このスクリプトをダウンロード(右クリックで保存とか) Korekonomodel ほんと、それだけのものです。 これ、EKC に組み込めばいいかなあ。 っていうか EKC も長年メンテしてないな。色々不具合あったはず。もっとシンプルなものに書き直したい。昔書いたツールはどれも無駄に複雑で、現在の俺のワークフローに合わなくなってきたりしてますね。 2008年だって。すげえ昔だなあ。 ところでこういう小さいツールは、めんどくさがらずにチマチマ書き溜めていくと、俺様的ワークフローの中にだんだん溶け込んで、効率が上がるんですよねえ。 そのツールを使うために都合が良いようなフローに変わっていくこともよくあって、場合によっては本末転倒のこともあるけどね。  まあアレだ、俺の場合、最初に細かいことを気にせず作り散らして、後で綺麗に整理するというフローが好きなんだなきっと。そのためのツールをよく書いている気がする。 このツールも、ひとまず何も考えずエクスプレッションを書き散らして、あとで this とかに置換できる部分は自動でやってもらおうという発想だな。 毎日暑いですね。 明日は XSI な人と少人数で会って、パワーをもらってきますよ。 甘太郎でビールを吞もう。 .

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

2014年7月 7日 (月)

名前LR。

またもや脊髄反射スクリプトをロクにテストもせず上げてみるという・・・



オブジェクトのリネームをするスクリプトです。選択しているものを元に、L と R を置き換えてリネームするんですが、ええと、なんて言えばいいんだ、L R の片方だけ名前付けがもう済んでいて、反対側の名前を付けて行きたいという時に使うものです。

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

//	オブジェクト名を LR 置換で書き換えるスクリプト
//	リネームしたいブツ1 → そのリネームの元になるブツ1, リネームしたいブツ2 → そのリネームの元になるブツ2.....
//	の順で偶数個選択して実行。 奇数個選択してると最後のはシカトされます


//	↓ 検索置換ルール 手で書き換え
Search1 = "_L";	//	_L が出てきたら _R に置換、とか。
Replace1 = "_R";

Search2 = "_R";
Replace2 = "_L";


OpenUndo( "Rename LR" );
var RE1 = new RegExp( Search1, "gi" );
var RE2 = new RegExp( Search2, "gi" );

if ( Selection.count <2 ) Logmessage( "帰って下さい。", siError );
else{
	N = Selection.count % 2 == 0 ? 0 : 1; // 奇数選択されてたら最後の1個除外
	for ( var i=0; i<Selection.count-N; i+=2 ){
		var oSlave = Selection(i);
		var oMaster = Selection(i+1);
		OldName = oSlave.Name;
		NewName = oMaster.Name.replace( RE1, Replace1 );	//	置換1回目
		oSlave.Name = NewName;
		if ( oSlave.Name != NewName ){	//	1回目の置換で目指す名前になってなければ
			NewName = oMaster.Name.replace( RE2, Replace2 ); //	置換2回目
			oSlave.Name = NewName;
			if ( oSlave.Name != NewName ) oSlave.Name = OldName; //	それでもダメなら元に戻す
		}
	}
}

CloseUndo();
---------------------------------------------------------------


↓ こういうことなのですが、

Lr1

リネームしたいオブジェクトは 1 と 3 です。 すでに名前付けが完了しているオブジェクトは、 2 と 4 です。

1234の順に選択して実行します。

1.名前を変えたいブツ 2.その名前の元になるブツ、の順番で選択するということです。

すると、

Lr2

このようになります。


1 は 2 から取ってきた名前の文字列のうち、スクリプト内で指定された _L _R に置き換えてリネームしています。 3 と 4 も同様です。


一応2段階リネームするようにしていて、 L だったら R に置換、R だったら L に置換、というのを1回の処理できるようにしているつもりです。


どの文字をどの文字に置換するのかは、スクリプトの冒頭を手で書き換えます。 


この置換ルールに正規表現が使えるようにしたつもりなんだが、これでいいのかな・・・。 例えばオブジェクト名の先頭の文字の L_ だけを置換したい場合なら ^L_ などと書けば、途中で出てくる _L は無視されて先頭の _L だけが置換されます。 _L$ と書けば、末尾に出てきた _L だけが対象になります。  合ってるかな。いまだにこの呪文よくわかんねえよ。







いまだに XSI でスクリプトを書いている俺は終わってますか。
そんなことねえですよ。
まだなんとか仕事できてますよ。
嘔吐デスク様。
Epic とかどっかゲーム会社にでも村を譲渡して下さい。
こんな狭い領土、なくなっても別にいいでしょう?
嘔吐デスク様。





.

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

2014年2月24日 (月)

パッていしおん。

何年も前から、改造したり書き足したりしながら書いたツールなんですけどね。


パーティションのアレです。 複数の Pass で、次々にパーティションを作成しながらオブジェクトをブチ込んでいくとか、既にあるパーティションにズンドコ入れていくとか、そういうアレです。


それ以外にも、パーティションがらみのちょっとした機能がいろいろ付いてます。 あの Pass にあるあのパーティションをこちらの Pass でも再現したい、でもマテリアルアサインしたりオーバーライド作り直したりするのめんどくせえなあ、先に全部設定してから Pass を複製すれば良かったなあ、などという場面で役に立ってるんですが、どうですかね。

以前に単体でこのブログに載せたことがありましたね。  それを改良したり、色々付け加えたりしたものですね。







パッていしおん

http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html


Pa_menu


Pa_ppg







説明は全部ビデオです。 いっぱいツールが入ってるから、いちいちドキュメント書いてられない。 喋る方がずっとラクです。  HD にしないと文字読めないかも。














ではごきげんよう。





.

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

2014年2月18日 (火)

ソートします。

スケマティックビューでマウスドラッグして矩形選択しますよね。


Recsel

こういう風に。 四角を描いて選択します。


すると、選択したオブジェクトは、名前がちゃんと連番になっているにも関わらず、選択順は連番の順になってないんですよね。




なんでですか。アフォですか。昔から思ってました。


どういう時困るかと言うと、親子付けするときとかですね。このように矩形選択で選択したために選択の順番が名前順になってない時、誰かの子供にしたりすると、名前順ではないその順番で親子付けされてしまいます。 そうなると、スケマティックビューでノードを整列し直したとき、そのおかしい順番で並んでしまうんですよね。 なので I キーを押して並びを直してやらないと見づらい。 これがめんどくさい。

あとはリネームとかですよね。マルチモードの PPG を出して名前を入力してイッキに連番名にする時とか、もちろん選択順でリネームされますからね。




まあ最近の若僧はスケマティックを使わずエクスプローラばかり使うらしいから問題ないみたいだけど、あなた、人生の半分損してますよ。スケマティックは人生の半分です。 ええそうです。

っていうか最近の若僧は XSI を使わないよね。 うん、あなたの人生、ほぼ幸せのはずです。 今どき XSI と一緒にいると人生を棒に振ります。俺は知ってて一緒にいます。俺の人生そんなもんです。




ともかくですね、スケマティックで矩形選択したときでも、ちゃんと名前順にソートされた状態の選択にして欲しいんですよ。嘔吐デスク様。アフォですか。

と長年思っていたけどさっき条件反射的にスクリプト書きました。超シンプルスクリプト。 なんとなくちゃんと動いているように見えるが、きっと不都合な場面も多いだろうな。まあいいや。


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

var aItems = new Array();
for ( var i=0; i<Selection.count; i++ )	{
	aItems.push( Selection(i).Fullname );
}
aItems.sort();
SelectObj( aItems );
Logmessage( "ソートして選択し直しますた。 : " + Selection.GetAsText() );

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

こんだけなんですけどね。


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



何か選択して実行すると、その選択中のオブジェクトの名前を、内部的にソートします。そしてソート後の結果を使って改めて選択し直します。結果、名前順の選択が実現しているはずです。 このスクリプトがするのはここまでです。 後は、この状態で親子付けとかすれば、ちゃんと名前順で親子付けされます。 もちろんリネームも選択順でされます。 そんだけです。

ソートは、他に方法を知らないもんだから、JScript の Array に対する sort メソッドをよく挙動も知らないまま白痴的に使ってますが、これだと不十分だったりする場面も出てくるんでしょうね。 でも他に知らないの。 何かいいアイデアあったら教えて下さいね。







2014年にもなってまだ XSI のスクリプト書いてブログに載せたりしてる俺って・・・・ ゑへへ。俺の人生そんなもんです。よろしくお願い致します。


ごきげんよう

.

| | コメント (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)

より以前の記事一覧