« ExportModel こうだったっけ。 | トップページ | 筋肉XSI男が街を行く。 »

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/





.



.

|

« ExportModel こうだったっけ。 | トップページ | 筋肉XSI男が街を行く。 »

コメント

確かに多少不便ですよね~。そして、Explorerリネームしている人も意外と多いからこういうスクリプトを書くことになっちゃいます。

因みにですね。ファイル名を取得する時に、最近この方法を使っています:

var f = ActiveProject.ActiveScene.Parameters( "Filename" ).value
var fname = f.substring(f.lastIndexOf("\\")+1, f.length))

この方がコードが短くて、splitとかarrayとか使わないで正確に名前を取得することが出来ます。
参考まで。

投稿: myara | 2012年10月15日 (月) 19時02分

なるほど、最後のフォルダ区切りの \\ が出てきたら、その次の1文字から、最後の文字までが、パスを除いたファイル名ってことね。 今度パクります。

JScript や JavaScript の文字列の操作ってなんかめんどうだなあ、っていつも思ってます。わかりにくくない? もっと直感的なメソッドを、種類もいっぱい欲しいなあと思ってます。

投稿: 潤樹 | 2012年10月19日 (金) 17時44分

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: シーンの名前とシーンのファイル名。:

« ExportModel こうだったっけ。 | トップページ | 筋肉XSI男が街を行く。 »