« 2012年9月 | トップページ | 2012年11月 »

2012年10月

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)

2012年10月13日 (土)

筋肉XSI男が街を行く。

超カオス。

going to the store. from dlew on Vimeo.

なんともカオス。

我らの XSI 男ではなく、筋肉バージョンの方ですね。




いつか実験や練習を兼ねて我らの XSI 男を使ってやろうと思ってたことを、先にやられちゃった感じですw







.

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

2012年10月12日 (金)

シーンの名前とシーンのファイル名。

まあ、今さらどうこうという話でもないのですが、
たまたま今日、親分とそんな話をしたので。


 XSI のシーンの名前というのは、
 シーンのファイル名とは必ずしも一致しない。



という話です。

まあ、だからどうだという話でもないのですが。




XSI からは、HOGE.scn としてセーブしたとします。
でも、OS のファイルシステム上でそれを Hage.scn にリネームしたとします。


このシーンを XSI にロードすると、

Scenename

こうなってますね。

まあ、この不一致がワークフロー上問題がないならば、それでいいですよね。新たにセーブすればその時に一致しますしね。


でも、混乱のもとにはなりやすい。 わかにくい。 間違ったシーンを開いていると勘違いするようなことが起こらないとは言い切れない。 [Scene] トークンで拾ってくるシーン名も、ファイル名と違ってしまっていていいのか。 シーンから Model をぶっこ抜いたりみたいなバッチ処理をする自作ツールを書く場合とかでも、気にする部分が増えてしまう。 etc


なので、ファイル名を変えたいならば、できればもう一度そのシーンをロードして新たな名前で Save As して欲しい。 

ファイルシステム上で気軽に名前を変えんじゃねえ(゚Д゚)ゴルァ


と言いたいのをぐっとこらえて今日も業務に励みます。




一応、それを検出するというか修正するというか、そんなスクリプトを書いてみたり。 便利だというわけではなく、どちらかというと、シーンオブジェクトの Name プロパティと Filename プロパティは違うんだぜという認識を確認するためのスクリプトです。

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

//    現在シーンをシーンオブジェクトとして取得

var oScene = ActiveProject.ActiveScene;   


//    シーンオブジェクトが持つ filename パラメータの値(ファイルシステム上のフルパス)を取得
SceneFileFullPath = oScene.Parameters( "Filename" ).value;


//    フルパスを加工してパスを取っ払い最後のファイル名だけを抽出
aSceneFileNme = SceneFileFullPath.split( "\\" );//    バックスラッシュ区切りで分割してアレイにぶち込む
SceneFileName = aSceneFileNme[ aSceneFileNme.length -1 ];
//    アレイの一番最後の部屋がパスを取っ払ったファイル名
SceneFileName = SceneFileName.replace( ".scn", "" );
//    拡張子削除

//    ご報告
Logmessage( "このシーンのファイル名は : " + SceneFileName + "(.scn)" );
Logmessage( "このシーンの Name は : " + oScene.Name );
//   Scene.Name =  シーンオブジェクトが持つ名前(ファイル名とは必ずしも一致しない)

//    もし一致してなかった場合は
if ( SceneFileName != oScene.Name )
{

    //    ご警告
    Logmessage( "一致しねえぞゴルァ", siError );
    Message =    "このシーンのファイル名は : " + SceneFileName + "(.scn)\r\n"+
                "このシーンの Name は : " + oScene.Name + "\r\n\r\n"+
                "ファイル名に合わせて一致させますか? させますよね?";
               
   
//    ご脅迫
    RET = XSIUIToolkit.MsgBox( Message, siMsgYesNo, "当然ですよね?" );
   
   
//    ご改名
    if ( RET == siMsgYes )
    {
        oScene.Name = SceneFileName;
        Logmessage( "スヴァらしく一致させました。っス。 : " +  oScene.Name );
    }
   
//    ご叱責
    else
    {
        Logmessage( "帰って下さい。っス。", siError );
    }
}
else   
//    一致してた場合は、
{

    Logmessage( "一致してます。っス。" );
//    ご終了
}


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

Scenename2

シーン名とシーンのファイル名が違っていた場合に警告を出し、一致させるよう脅迫します。 そんだけ。

シーンのロードをトリガにしたカスタムイベントに組み込んだら、シーンをロードするたびにシーン名を強制的にファイル名に合わせて変えてしまうということもできますね。





ともかく、まあ、やはり、ファイルシステム上ではあんまり気楽に名前変えない方がいいと思いますよ。  そのデータを扱うのが自分だけならともかく、他所に渡すデータなら、あんまりわかりにくいことはしない方がいいですよ。 わかりましたか。 あなた。 そう、あなたです。 よろしくお願い致します。






と、ここまで書いて、マーティンが全く同じネタで記事を書いていたことが判明しました。 ごめんマーティン、忘れていたよ。 なんかそんな記事あったよなーと今さら思い出して検索したら一発で出てきた。 全く同じじゃないか。 ネタかぶりごめんね。

http://myara.blog.fc2.com/blog-entry-111.html


しかもマーティンは、Model 名とのダブりまで考慮に入れている。スヴァらしい。


しかしほんと、Model 名とシーン名が一緒なのはダメって、不便だよねえ。 キャラやプロップなどを扱うことが多いと思われるマーティンは、さぞかし不便していることでしょう。 1キャラにつき1 Model で、作業中のシーンと、そこから最終的に吐き出す EMDL は、同じ名前にしたいもんねえ。



あ。 そうか。 今手元にあるこの大量の名前不一致シーンは、もしかして、そのためか。 Model と同じ名前にできないから、違う名前でシーンをセーブしておいて、その後で Model の名前に一致させるように手で .scn ファイルをリネームしてるのかな。

ううむ、それもどうかと思いますよ。 Model とシーンで名前を一緒にできない XSI の仕様は気に入らないけど、だからと言って手で変えちゃうのは、その後の不具合や事故が起こりやすい気がするなあ。どうだろうなあ。 あまり賛成しないなあ。



まあいいや。


もういっちょ参考リンク。
http://xsisupport.com/2012/08/29/scene-names-and-scn-file-names/





.



.

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

2012年10月 5日 (金)

ExportModel こうだったっけ。

あれえ?

今やってみたら、びっくりした。
こうだったっけ。




XSI って、ブツを他のシーンに持っていく時とか、EMDL ファイルに書き出すじゃないですか。そして Model 単位での書き出しになるじゃないですか。 だから書き出すときはいつも Model の子供にしてから Model 階層を選んで File > Export > Model ってやってたんですよ。 そうしなければいけなかった。はず。 ですよね。


でもさっき、手元が狂って、Model ではなく通常の3Dオブジェクトを直接選択した状態で Export Model してみたら、あれれ? できちゃった。


シーン上のブツは、勝手に新規 Model の子供になって Export されるとかではなく、そのままです。 でもディスク上にある EMDL には XSI が勝手に Model を足しているようで、その EMDL をインポートすると XSI が追加したと思われる Model にぶら下がってブツがインポートされます。



あれえ?
昔はこうじゃなかったですよね?
いつから変わったんですか?
これ、2012 SAP です。
あなた、昔からこうでした?



俺なんかわざわざ えくすぽいんぽ という Model の出し入れ系プラグインを書いて、自動で Model を挟んですぐさま書き出し、書き出し後は何事もなかったように元の状態に戻しておく機能を付けたりしてましたからね。 でももう、それ要らないじゃないですか。標準でできるんなら。 あれえ。おかしいなあ。いつからこうだったんだろう。




まあいいとして、
Export Model でもひとつ罵倒したいのですが、
何も選んでいない状態で Export Model を実行するとどうなるか。

マトモに考えれば、「何か選んでから実行して下さい」 だとか、警告を出しますよね。 何がいかんのかをユーザに伝えなくてはいけません。

でも、やってみて下さいよ。
こんな風になってます。

Fuckexportmodel

ええと、日本語版だと、なんていうエラーになるんですか。


もうちょっとマトモなエラー出せや (゚Д゚)


こんなんじゃ、何がいけないのかわからなんではないか。

俺が書くスクリプトの方がよっぽどわかりやすいよ。
さっとエラー処理書けばいいだけじゃない。
警告コメント用意すればいいだけじゃない。
シロートでもできるぜそんなの。


っていうかこれ、もしかして XSI がユーザに出しているエラーじゃなくて、スクリプトエンジンが出している実行エラーですかね?  ユーザが Export Model を実行した時に走るスクリプトが、途中で止まっちゃってるって状態じゃないのかな? 違う?  もしそうだとしたらアホですよね。 ユーザに警告出して終了するならその操作は完結しますが、途中で実行エラーで止まってるとしたら、それ、完結してないというか、操作が終了できなかったということですからね。 まあこんなの、XSI の至るところにありますがね。



.

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

« 2012年9月 | トップページ | 2012年11月 »