カテゴリー「XSI Scripting」の97件の記事

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年6月23日 (月)

ICETreeビューの取得。

書きかけで保存したまま放置されている記事もけっこうあるんですよね。 


さっきサッと見てみたらこんなものが出てきた。 2012年8月とからしい。 ICETree ビューを取得するスクリプトですね。 ドックされたもの、フローティングのもの、両方取得できるようです。 選択中のオブジェクトからたどるとかではなく、現在開いている ICETreeビューからたどるというアプローチをしようとしたのでしょう。  2年も前なので忘れちゃったけど。



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

var oViews = Desktop.ActiveLayout.Views;

// ドックICETreeビューを捜索
var oICETreeViews = oViews.Filter( "View Manager" )(0).Views.Filter( "ICE Tree" );

// なければ浮遊ICETreeビューを捜索
if ( oICETreeViews.Count == 0 ) oICETreeViews = oViews.Filter( "ICE Tree" );

Logmessage( "見つかった ICETree ビューの数 : " + oICETreeViews.count );

// 見つかったビューのうち、最初のビューから、container アトリビュートをゲット=これが ICETree オブジェクト
var oICETree = oICETreeViews(0).GetAttributeValue( "container" );

// 対象になる ICETree が特定できたので、あとは何をしようが自由
var oICENode = AddICENode("$XSI_DSPRESETS\\ICENodes\\GetDataNode.Preset", oICETree );

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


あ、これだとドックされたものが無ければフローティングを探すという風になってるのか・・・・・まあいいや。




今さら役に立つことも、まあ、なかろうて 。・゚・(ノД`)・゚・。

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

2013年9月28日 (土)

オーマイグループ。

いや、別にどってことないんですが、実は昔から不満だったんです。



GUI 上にある Group ボタンを押してグループを作ると、自動で PPG が表示されますよね。

こういう風に。

Groupbutton

大抵の場合、すぐにグループに名前を付けようとしますから、PPG が出てきてくれた方が便利ですね。 エキスプローラからもリネームできるけど、いつもエキスプローラ開いているとは限らないですからね。



で、これは良いのですが、一方、ショートカット Ctrl + G でグループを作ると、PPG を自動で表示してくれないんですよね。 これが長年不満だったんですよ。 いちいち Group ボタンを押しに行くより Ctrl + G の方が大抵早い。 だから Ctrl + G を使いたい。 でもこれだと、PPG を表示してくれないので不満、という。



そんなに不満ならさっさと工夫しろよ、と長年自分に言い続けてきて、2013年の秋、ついにやったのです。

2行スクリプト書きますた。


 var oGroup = CreateGroup( null, null, null );
 InspectObj( oGroup );


これだけ。 JScript です。

Group ボタンを押した時は、この2行に相当する挙動ですね。  Ctrl + G だと、1行目だけに相当していた感じです。



で、ショートカットにしなきゃ意味無いわけですが、ショートカットにするためにはコマンド化しないといけません。 ただのスクリプトではダメで、 XSI に登録されたコマンドなければショートカットは割り振れないわけです。 なのでコマンドにしました。

ダウンロード OhMyGroupPlugin.js

これをプラグインフォルダにぶち込めば、OhMyGroup というコマンドができるので、あとは好きにショートカットをくれてやればいいです。 俺は当然、もともとの Ctrl + G を殺してこの OhMyGroup コマンドに Ctrl + G をくれてやりました。





ほんとそんだけです。チョイネタ過ぎてすいません。

大したものではないとは言え、ブログに書きたいネタはいっぱいあるんですよ。 でも、なかなかブログ書く時間とエネルギーを捻出するのは難しいですね。

いつものパターンだと、もっとブチ切れるくらい忙しくなれば、途中でヤケクソになってブログ書き始めるんですけどね。 仕事が忙しいほど意地になって仕事以外のことをやろうとするという。 

ってことは忙しさが足りないんですかね俺。 
じゃ仕事下さい。

いや、やっぱいいや。



そんなことより曲行きましょう。

最近の KISS はまるで大昔のように、エースとジーン以外もボーカルを取る曲があっていいですね。 これはドラムのエリックくんですね。 ピーターに似た感じで歌っている気がするな。 意識して似せているのかな。



そして、もうすぐ日本に来ますよ KISS !! (゜∀゜)

俺は武道館まで会いに行ってきますよ !!
(゜∀゜)


いやあ、あの富士スピードウェイで行われた伝説のグダグダライブから、もう何年経ったんだろう。 まるで KISS は日本では人気がないとでも思われそうな、あんなひどいフェスになっちまって、もう来てくれないのかと思いきや、こうしてもう一度会えるとは。 夢にも思っていなかったよ俺は。ほんとに。 

いや、でも、追加公演をネットで試しに申し込んでみたらソッコーでチケット取れたから、もしかしてほんとに人気は翳りつつあるのか・・・?



問題は、チケットが2枚あるのだが、ええと、誰と行こうかな・・・・。  ヤローとよりも、おねいちゃんと行きたいなあ・・・。  KISS が好きでノリが良くてかわいいおねいちゃん、身近にいないかな。 


いないな orz

.

.

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

2013年2月28日 (木)

GetFullChinPath。

某所で話が出ていて俺も脊髄反射的に書き始めたが出遅れてしまい、そしてあまりにも気品があり過ぎるスクリプトであるためにここでしか書けないから書いておきますとかなんとか。




GetFullChinPath (JScript )
-----------------------------------------------------------------

//フルチンパス表示ループ

for ( var i=0; i<Selection.count; i++ )
{
    var oObj = Selection(i);
    FullChinPath = GetFullChinPath( oObj );
    Logmessage( oObj.Name + " --> " + FullChinPath ); // べろ~ん
}



//    シーンルートにたどり付くまでさかのぼる
function GetFullChinPath( oObj )
{
    var oParent = oObj.Parent;
    FullChinPath = oObj.Name;
    while( oParent.Name != ActiveSceneRoot.Name )
    {
        FullChinPath = oParent.Name + "." + FullChinPath;
        if ( oParent.Name == ActiveSceneRoot.Name )    break;
        else var oParent = oParent.Parent;
    }

    FullChinPath = ActiveSceneRoot.Name + "." + FullChinPath;
    return FullChinPath;
}


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

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





オブジェクトを選んで(複数可)実行すると、そのオブジェクトのフルパス(シーンルートからの親子構造をたどったパス)がスクリプトエディタに表示されます。 フルですよ。 べろ~んと、恥ずかしげもなく、いつぞやの草薙くんのように、フルフルで表示されます。実に男らしい。 


そんだけのスクリプトです。




このような感じ↓

Full1





3Dオブジェクトじゃなくとも、プロパティとかオペレータとかでも効くみたい。

Full2

要は Parent プロパティが効けばなんでもいいってことね。たぶん。







今日はなんだかブログをよく書く日だなあ。
仕事の進捗とは逆2乗則ですね。 ええ。





べろ~ん





.

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

オブジェクトをぬるる~んとヌルに置き換える。

Mox さんが、アニメーションやらコンストレインやらを保持したままオブジェクトを全てヌルに置き換えるスクリプトを開発なさったそうです。

http://mox-motion.com/info/moxreplacenull.html




で、けっこう難儀して開発したという話を開発が終わってから読んだんですが、もしかしたらあの現象を利用すれば意外と簡単にできるんじゃないのかな、とふと思いついて書いてみたというだけのアレです。


あの現象とは、子供がいるオブジェクトを削除しようとすると削除されずにヌルに置き換わるという現象です。 手動で削除しようとすると、子供がいるときは削除できませんよね。 この現象です。 現象というより仕様ですわね。 だって親を亡くしたら子供は生きていけませんもの。 子供が階層からカットされるまでは、つまり親から自立するまでは親は死ぬことを許されず、責任持って子供を養育せねばなりません。 子供思いの XSI 様の慈悲仕様です。 



というのをスクリプトでやってみたら、できたように見える、というアレです。



ぬるるん
(JScript)
------------------------------------------------------------------------

//    処理対象になるオブジェクトを oAll にブチ込む(ブランチ選択なら階層全て)
var oCol = XSIFactory.CreateObject( "XSI.Collection" );
oCol.items = Selection;
var oAll = oCol.expand();

//    ダミー子供ヌル格納容器
oDummyChildNulls = XSIFactory.CreateObject( "XSI.Collection" );

//    処理対象オブジェクトをループ
for ( var i=0; i<oAll.count; i++ )
{

    var oObj = oAll(i);
    var oFurtherChildren = oObj.Children;//    更に子供がいるかどうか

   

//    子供が居ない → つまり階層の一番下 → 削除されてしまう → (゚д゚)マズー → ダミーの子供を出産
    if ( oFurtherChildren.count == 0 )    oDummyChildNulls.Add( oObj.AddNull() );

   

//この時点で必ず子供がいる状態になっているので、安心して親ブチ殺し→子供がいるから削除されずヌルに変身
    DeleteObj( oObj );
}

//    最後にダミーの子供を殺害して終了
DeleteObj( oDummyChildNulls );

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

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





例えばこういう状態。

Nulllun1

階層があって、それぞれFカーブを持っていたり、エクスプレッションが入っていたり、コンストレインされていたりします。カスタムパラメータを持っているものもあります。


次にブランチ選択します。

Nulllun2

ブランチセレクトしているとその階層に含まれるオブジェクト全てが対象になります。 グループを選択しているとグループのメンバが対象になります。

で、スクリプトを実行すると、

Nulllun3

ヌルに置き換わりました。スケマティックやエクスプローラのアイコンがヌルに変わっているのがわかると思います。 PPG を表示させても、ちゃんとヌルが持つプロパティを持っています。

で、Fカーブもエクスプレッションもコンストレインもカスタムプロパティもそのまんま保持されているように見えます。 もちろんオブジェクトの名前もです。 Mox さんの方では再現できてないというワイヤカラーも保持されてますね。 ほんと、すべてそのままで、単にジオメトリがヌルに置き換わっただけという風に見えます。 どうでしょうか Mox さん。 これで目的のことはできますかね・・・・?


スケルトン階層や Model やカメラがヌルに置き換えられないというのは、Mox さんのと同じですね。 これはもう仕方ないと思います。 その部分だけ違う方法で特別にヌルに置き換えていくルーチンを書かなければいけませんね。




スクリプト的には、解説する必要もないほどシンプルだと思います。


冒頭、Expand の魔法でブランチ選択とかノード選択とかによる対象オブジェクトの選別をやっています。

あとは、対象オブジェクトをループして、子供がいるかどうかを調べます。子供がいれば、何もせずただ削除します。 削除と言っても、上で書いたように子供がいるなら親は殺されないという現象を利用した削除ですので、実際は削除されずにヌルに置き換わります。

子供がいなかった場合は、そいつは階層の一番下にいるオブジェクトだということですね。 こいつを削除しようとすると、そのまんま削除されます。 養育すべき子供を持たない奴であれば死んで良しという、XSI 様による悪魔仕様です。 でも死なれたら困るので、ダミー子供としてヌルを出産させます。 こうして養育すべき子供を持ったので、安心して削除にかけることができます。もう子供がいるから、削除されずにヌルに変身します。

そして最後にダミーの子供達は丸ごと殺害します。用済みだからです。


という風に、子供がいると削除されずにヌルに置き換わり、もろもろの属性はそのまんま保持されているらしいという現象に100%依存したスクリプトです。 5分かそこらで書けましたが、Mox さんの話も聞かずに勝手に書いたものですから、これが Mox さんのやりたかったことと合致するかどうかは XSI 様のみぞ汁です。


どうでしょうかね。

.

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

2013年2月18日 (月)

命名カメラリグ。

カメラの名前に合わせてカメラリグ(カメラルート、インタレスト)の名前をリネームするスクリプトなんですがね。


JScript
---------------------------------------------------------------------
//    命名カメラリグ


//    ここを好みに差し替える
PrefixRoot = "";
PostfixRoot = "_CamRoot";
PrefixInt = "";
PostfixInt = "_Int";


//    リネームしたオブジェクトを格納する箱
var oResults = XSIFactory.CreateObject( "XSI.Collection" );
oResults.Unique = true;

for ( var i=0; i<Selection.count; i++ )
{

    // 選択していたものがカメラじゃなきゃ警告  カメラなら処理
    if ( Selection(i).type != "camera" ) Logmessage( Selection(i).Name + " --> それはカメラじゃないくさい", siError );
    else
    {
        var oCam = Selection(i);

       
        //    CamRoot 見つけるって親の Type を調べるくらいしか方法ないんじゃない?
        var oParent = oCam.Parent;
        if ( oParent.type == "CameraRoot" )
        {
            oParent.Name = PrefixRoot + oCam.Name + PostfixRoot;
            oResults.Add( oParent );
        }
        else Logmessage( oCam.Name + " --> CameraRoot 見つかんないくさい", siWarning );

       
        //    Interest の方は Interest プロパティの戻り値が null かどうかで判断できそう
        var oInt = oCam.Interest;
        if ( oInt )
        {
            oInt.Name = PrefixInt + oCam.Name + PostfixInt;
            oResults.Add( oInt );
        }
        else Logmessage( oCam.Name + " --> Interest が無いくさい", siWarning );
    }
}


//    結果を選択  なんもなければ警告
if ( oResults.count != 0 ) SelectObj( oResults );
else Logmessage( "何も仕事してないくさい", siError );

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

このスクリプトファイルのダウンロード MeiMeiCameraRig.js




カメラを選んで実行すると、インタレストやルートの名前がリネームされ、リネームされた子たちは選択状態になります。 

名前の法則はスクリプト冒頭を好みに合わせて書き換えるというものです。 Prefix + もとのカメラの名前 + Postfix という、3つを連結した名前になります。 無文字のままにすると無文字が連結されます(つまり何も足されない)。 ルートとインタレスト別々に指定します。


以上。





スクリプティング的にちと疑問なんですが、 カメラオブジェクトからカメラルートにたどり着くことはできるんでしょうかね? 

上のスクリプトの場合、カメラの Parent を取得し、その Type が "CameraRoot" かどうかで判断しています。 しかし、カメラの親子をカメラルートから切り離してしまった場合、もはや手がかりがないと思うんです。 親子が切り離されてシーンの全然違うところに居るルートと、もとのカメラをリンクさせる情報が、見つからない。 知っている方教えて下さい。



また、親子が生きている間は、ルート側からカメラをたどることができるように見えます。 カメラルートに対し Camera プロパティを使ってやると、カメラオブジェクトが返って来るからです。

  Logmessage( CamerRoot.Camera );

などと書けばOK。

しかし、これも親子が切り離されてしまうと効かなくなってしまいます。ルートとカメラの親子間に別オブジェクトが挟まってもダメです。カメラがルートの直近の子供の時しか効きません。

ってことで、ルートとカメラの関係を、親子に関係なくリンク付けられる方法を知っている方がいらっしゃいましたら、どうぞその方法をご教示くださいませ。





.

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

2012年12月27日 (木)

Fカーブの最小最大フレームをシーンのフレーム範囲に反映させちゃう。

というスクリプトが突如湧いてくる。





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

// Fカーブで駆動された全てのパラメータを引っかき集める箱ヨーイ
var oAllFcvAnimatedParams = XSIFactory.CreateObject( "XSI.Collection" );

// 現在選択中のものをループし、Fカーブ駆動のパラメータを見つけたら箱にブチ込んで行く
for ( var i=0; i<Selection.count; i++ )
{
 var oObj = Selection(i);
 var oFcvAnimatedParams = oObj.NodeAnimatedParameters( siFCurveSource );
 if ( oFcvAnimatedParams.count != 0 ) oAllFcvAnimatedParams.AddItems( oFcvAnimatedParams );
}

// 最小最大フレームをズラズラと入れる配列ヨーイ
var aMin = new Array;
var aMax = new Array;

// 先に引っかき集めたFカーブ駆動なパラメータたちをループして最小最大フレームを配列にブチ込んで行く 
for ( var i=0; i<oAllFcvAnimatedParams.count; i++ )
{
 var oSources = oAllFcvAnimatedParams(i).Sources;
 for ( var j=0; j<oSources.count; j++ )//このチェック冗長かも。要らんかも。
 {
 if ( oSources(j).Name == "FCurve" )
 {
 var oFcurve = oSources(j);
 MinFrame = oFcurve.GetMinKeyFrame();//Fカーブのうち最小フレーム
 aMin.push( MinFrame );//配列に押し込む
 MaxFrame = oFcurve.GetMaxKeyFrame();//Fカーブのうち最大フレーム
 aMax.push( MaxFrame );//配列に押し込む
 }
 }
}

Min = Math.min.apply( null, aMin );
//配列のうち最小の値をゲット
Max = Math.max.apply( null, aMax );//配列のうち最大の値をゲット
// シーンのフレーム範囲に反映させておしまい
var oPC = Dictionary.GetObject( "PlayControl" );
oPC.GlobalIn.value = Min;
oPC.In.value = Min;
oPC.GlobalOut.value = Max;
oPC.Out.value = Max;

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

↓スクリプトのダウンロード
フレームレンジ様


オブジェクトをいくつでもいいので選択して実行します。すると、それらのオブジェクトが持つFカーブのアニメーションのうち、最小フレームと最大フレームをそれぞれシーンのスタートフレームとエンドフレームに設定します。

モーションキャプチャのデータを受け取ってシーンに読み込んだ時などに、Fカーブのキーがある範囲を目視で調べてからシーンのフレーム範囲を手打ちで設定するなどという煩雑な作業を避けるために書いたというのが、当初の目的でした。




とりあえずこんな感じでどないでせうか





.

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

2012年11月 8日 (木)

取得その 2002。シーン全体の ImageSource の取得。

最近よく使うので載せておくというだけのアレです。




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

//    Scene オブジェクトには ImageClips プロパティがあるのでシーン全体のImageClipCollection の取得は容易
var oImageClips = ActiveProject.ActiveScene.ImageClips;

oImageClips.Unique = true; // ← 追記 これ重要

//    ImageSource は ImageClip の Source プロパティで取得できるからループして取得&格納
var oImageSources = XSIFactory.CreateObject( "XSI.Collection" );
for ( var i=0; i<oImageClips.count; i++ )
{
    oImageSources.Add( oImageClips(i).Source );
}

//    oImageSources に格納済み あとは煮るなり焼くなり Logmessage するなり自由
for ( var i=0; i<oImageSources.count; i++ )
{
    Logmessage( oImageSources(i) );
}

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


ええと、こんなめんどくさいことしなくても、Scene オブジェクトに ImageSources というプロパティさえあればそれだけで済むことなんですけど。 1行で終わる。 嘔吐デスクさま?





というパターンはすげえ多い。
SDK周りをどんどん開発してくれないかなあ。
あるべきなのに無いプロパティやメソッド、いっぱいありますよ。
スクリプティングに詳しい多くの開発の人をクビにしちゃったり辞められちゃったりして、その辺あんまり期待できないのかなあ・・・?




嘔吐デスクさま?




------------------------------------------------------
追記:
コメント欄でマーティンが素敵なことを教えてくれました。

まず Unique の追加。これ重要ですね。忘れてました。 ひとつのイメージソースからいくつもイメージクリップを作れるわけで、そういう状態でクリップひとつひとつからソースを集めると、ソースはダブってコレクションに入ってしまう。 だから Unique フラグを立ててコレクション内からダブりを排除せねばなりません。



あと、1行でシーン内全てのイメージソースを取得する書き方として、NestedObjects を使ったやり方を教えてもらいました。


var ImgSources = ActiveProject.ActiveScene.NestedObjects("Sources").NestedObjects("Images").NestedObjects;


こう書けば、ImgSources の中にシーン内の全てのイメージソースがぶち込まれます(コレクションになる)。 スヴァらしい。

Explorer を Source/Clip モードにして見るとわかりやすいのかな、シーンがあって、その下に Sources があり、その下に Images があり、その下にイメージクリップがズラリと並んでいる。その階層構造で取得している感じですかね。

でも、NestedObjects ってはあるオブジェクト(プログラミング的なオブジェクト)にぶら下がる全てのものを返して来るので、ゲットしたいもの以外の余計なものがあると、そいつまで混じってゲットされるわけですね。 この場合、Images にぶら下がっているものは全部イメージソースだよ、他のものはぶらさがってないよ、という構造であればいいのですが、そうなのかどうかは、どうなんだろう、おそらくマニュアルには書いてないよね。 SDK Explorer などで色んなシーンを観察して、観察結果からおそらくこれで正しかろうということにするしかないのではないか。 ある条件下ではイメージソース以外のものが Images 以下に発生するかも知れず、そうなった場合はそれをはじくコードを追加しないといけないかも知れない。




とかなんとかやるくらいなら最初から Scene オブジェクトに ImageSources プロパティを付けてくれって言ってんだ嘔吐デスクさまゴルァ






.

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

2012年10月30日 (火)

空っぽの MatLib を殲滅セヨ。

最近よく使ってるんですがね。


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

//    削除ターゲットの格納容器ヨーイ
var oFuckinLibs = XSIFactory.CreateObject( "XSI.Collection" );

//    全 MatLib 取得
var oMatLibs = ActiveProject.ActiveScene.MaterialLibraries;

//    ループして空のLibを見つける
for ( var i=0; i<oMatLibs.count; i++ )
{
    var oMatLib = oMatLibs(i);
    var oItems = oMatLib.Items;//    その Lib 以下のマテリアルを取得

    Logmessage( "MatLib : " + oMatLib.Name + " -- Materials : " + oItems.count );

    if ( oItems.count == 0 ) oFuckinLibs.Add( oMatLib );//マテリアル数がゼロなら削除ターゲット
    else var oMatLibWithItems = oMatLib;//    ゼロじゃないならバッファに保存(後で使う)
}

if ( oFuckinLibs.count != 0 )
{
   
//    ユーザに確認
    Str = "以下のマテリアルライブラリはすっからかんの模様です。\r\n\r\n";
    for ( var i=0; i<oFuckinLibs.count; i++ )
    {
        Str += "(" + ( i+1 ) + ") " + oFuckinLibs(i).Name + "\r\n";
    }
    Str += "\r\n殲滅します。よろしいか?";
    oReturn = XSIUIToolkit.MsgBox( Str, siMsgYesNo, "殲滅MatLib"  );

    if ( oReturn == siMsgYes )//    OK した場合
    {
 //    アクティブLibは削除できないから、バッファに格納したマテリアル数がゼロではないLib をアクティブにしてから削除
        var oActiveMatLib = ActiveProject.ActiveScene.ActiveMaterialLibrary;
        if ( oActiveMatLib.Items.count == 0 )
        {
            SetCurrentMaterialLibrary( oMatLibWithItems.Fullname );
        }
 //    告知&殲滅実行
        Logmessage( oFuckinLibs.count + "個のすっからかん MatLib を殲滅しました。" );
        DeleteObj( oFuckinLibs );
    }
    else    //    キャンセルした場合
    {
        Logmessage( "どうか死んで下さい。", siError  );
    }
}
else    //    空っぽなマテリアルライブラリが見つからなかった場合
{
    Logmessage( "空っぽのマテリアルライブラリがねえっす。", siWarning );
}


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

Senmetzmatlib



スクリプティング的には、んー、特筆すべきこともないか?全てのマテリアルライブラリをループして、アイテム数(つまりマテリアル数)がゼロなら消すぜ、ということをやってるだけですね。 もし消したいマテリアルライブラリがアクティブになっていたら消せないということに気付いたので、その場合はゼロじゃないマテリアルライブラリをアクティブにしてから消すという。



マテリアルライブラリも、放っておくと荒れ放題になる場所ですよね。 しっかりお掃除しましょうね。





.

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

2012年10月20日 (土)

取得 その2001。 シーンの中の全てのマテリアルを取得。

最近やたらよく使うんですが、こんな感じでどうでしょうかね。
このファンクション部分をコピペしてひたすら使ってます。


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

var oAllMats = GetAllMaterialsInThisScene();
Logmessage( oAllMats.count );

function GetAllMaterialsInThisScene()
{
 var oMats = XSIFactory.CreateObject( "XSI.Collection" );
 var oMatLibs = ActiveProject.ActiveScene.MaterialLibraries;
 for ( var i=0; i<oMatLibs.count; i++ )
 {
 oMats.AddItems( oMatLibs(i).Items );
 }
 return oMats;
}

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


ごきげんよう。

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

より以前の記事一覧