myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

SI | 保存する前にシーンファイルバージョンの確認

前回にも書いたんですが、自分はSIの色んなバージョンを使うことが多いです。
それで忙しい時にわけが分からなくなって、2010 のファイルを 2011 で開いて上書きしちゃったりすることもあります。

そうすると元に戻すことはもう不可能ですね。
SIにはMAXみたいに古いバージョンで保存するオプションなんてないし、MAYAみたいにASCIIで編集することも出来ません。
こういうところはSIはとても不便です。
多分これからも変わらないと思います。

2011 で 保存されたファイルは 2011 以降のSIでしか開けません
でも、2011SP2 で保存されたファイルは 2011で開くことは可能です。

つまり、メジャーバージョン(一番左の番号)が変わるとSoftimageに「前方互換がありませんが、マイナーバージョン(右の番号、例 x.1, x.5, SP1, SAP, 等)が変わっても大丈夫です。

いつもバックアップをとっているので今までは特に大きな問題がなかったんですが、やっぱり怖いですね。

なのでこのイベントプラグインを書いてみました:

mCheckFileVer

DOWNLOAD

機能内容:
シーンを保存する時にこのプラグインが実行されます。
シーンファイルのバージョンを確認して、Softimageのバージョンと比べます。
シーンファイルのメージャーバージョンが違ったらメッセージボックスが出てきます
上書きするか・キャンセルするかは選べます。

インストール方法:
SIのユーザーか、ワークグループのPluginフォルダに入れるだけです。

checkver.gif




プラグインの解説

保存する前にシーンのバージョンを確認出来たら良いな~と思ってたら、保存する前にイベント起動させればいいじゃない?と思いつきました。

しかしシーンファイルのバージョンの取得方法が分からなくて、マニュアルを探っても何も見つかりません。

Windowsのコマンドプロンプトで「printver.exe」というスタンドアロンコマンドがありますが、
これ以外にもっと便利な方法があるんじゃないかな?

だって、ファイルを開くときにスクリプトエディターにちゃんと出てきますね。

INFO : 4034 - Loaded scene was created with build number: 8.0.201.0

みたいな。

残念ながらSIメールリストで聞いても、printver か scntoc を読む しか方法がないと言われました。

scntocファイルがあると限らないから、この方法はNGなので printver を使うことにした。

printver.exe 「開いているシーン」 でバージョンが出てきますが、SIから返ってくる情報が取得出来ない。
(出来るかもしれないけど、その方法が知らない)


僕の少ない知識でなんとか出来ないかと思い、printverの結果をテキストに書き出して、
その後にそのテキストを読みこむことを思いつきました。

printver.exe scene.scn > text.txt

あとは、アプリバージョンと比べれば良いだけですね。


これにFSOとWSHを使えばやりやすいかなと思ってVBSで書くことにしました。

パスの取得:
ファイルパス+ファイル名 = Application.ActiveProject2.ActiveScene.filename.value
テンポラリフォルダ = XSIUtils.Environment("TEMP")

WSH の run を使って printver で ファイルのバージョンを テンポラリフォルダに テキストで書き出します。

ここのポイントは 「Program Files」とかにはスペースが入っている為クォーテーションマークを入れる必要があります。
現在のシーンファイルのフォルダにも、テンポラリフォルダにもスペースが入ってるかもしれないので
全部にクォーテーションマークを入れた方が安全です。

クォーテーションマークを入れるには 「""」 を使います。これはストリングのなかににれると「" "" "」になります。
例:「"""" & テンポラリフォルダ & """" 」
→ 「  " テンポラリフォルダ " 」になります。


これでテキストが出来てるから、FSO の OpenTextFile と .ReadLine を使ってそのテキストを読み込みます。

スプリットとかでメージャーバージョンだけをとります。
上にも書いたとおり、マイナーバージョンが違っても特に問題ないからね。

で、メージャーバージョンを取得して、アプリバージョンと比較してマッチしなければ:

「上書きする?、保存をキャンセルする?」という注意msgboxが出てきます。


よし、これでもう保存失敗はしないでしょうね


因みに、Stephen Blair氏はeX SI blogでPythonでの取得方法を書いてくれましたが、
これを使うとコマンドプロンプトの画面が一瞬出てくるからちょっと嫌だから結局 > txt を使っています。

function siOnBeginSceneSaveEvent_OnEvent( in_ctxt )
Application.LogMessage "siOnBeginSceneSaveEvent_OnEvent called",siVerbose

' TODO: Put your code here.
FilePath = Application.ActiveProject2.ActiveScene.filename.value

splitFilePath = Split(FilePath, "\")
ScnName = splitFilePath(Ubound(splitFilePath))

if ScnName <> "Untitled.scn" then
TempPath = XSIUtils.Environment("TEMP")
BinPath = XSIUtils.Environment("XSI_BINDIR")

set FSO = CreateObject( "Scripting.FileSystemObject" )
set WshShell = CreateObject( "WScript.Shell" )

'Run PrintVer and print result to a txt file
' note the last 1 number is make SI wait
WshShell.run "cmd /c printver.exe " & """" & FilePath & """" & " > """ & TempPath & "\ver.txt" & """", 0, 1

'Get File Version (Read Text)
GetVer = FSO.OpenTextFile(TempPath & "\ver.txt", 1).ReadLine
FileVer = Right(GetVer, Len(GetVer) - InStr(GetVer, ": ") -1)
FileVerMaj = Split(FileVer, ".")(0)
'Delete Text
FSO.DeleteFile TempPath & "\ver.txt"

'Get App Version and Compare
AppVer = Application.Version
AppVerMaj = Split(AppVer, ".")(0)

if AppVerMaj <> FileVerMaj then
logmessage "------------------------------------------------------------"
logmessage "Current Scene File Version : " & FileVer
logmessage "Softimage Version : " & AppVer
logmessage "------------------------------------------------------------"
SaveQuestion = Msgbox ("You are going to save in a newer Softimage version." & vbNewline & vbNewline & "Are you sure?", 1 + 48, "Different Version Warning")
end if

if SaveQuestion = 2 then
logmessage "Scene not saved - Command was cancelled.", siWarning
siOnBeginSceneSaveEvent_OnEvent = True
else
logmessage "Scene Saved"
siOnBeginSceneSaveEvent_OnEvent = False
end if

else
siOnBeginSceneSaveEvent_OnEvent = False
end if

end function

Comments

こんにちは。始めまして。
ブログいつも楽しく拝見させて頂いています。

今回の内容で一点、「これにFSOとWSHを使えばやりやすいかなと思ってVBSで書くことにしました。」と言う
部分で「JscriptでもFSOとWSHは使えるのでは?」と単純に疑問に思ったのでコメント書かせて頂きました。
JScriptではなくVBSで書きやすい理由がなにかあったんでしょうか??
…なぜか非常に気になってしまいまして…いきなり現れて変なこと聞いてすいません。

ちなみに、自分も仕事でSoftimageを使っていて何時もバージョン違いでシーンが
開けなくなるのは不便だなーと感じてます。
「全部完璧に再現できなくていいから、とりあえず開くだけ開いてよ!」なんて事あるごとに思ったり…。

  • 2012/05/16(水) 00:03:34 |
  • URL |
  • モチオ #aw4c/rTE
  • [ Edit ]

Re: No title

モチオさん、コメントありがとうございます!

実はですね、深い意味がなかったんです。ただの好みです。
ブログを書いてた時もそんなに考えてませんでした。紛らわしいこと書いちゃってすみません。

確かにJScript でも new ActiveXObject を使えば良いだけですけど、JScript の ダブルバックスラッシュ \\ が嫌だし、JScriptでループするとEnumeratorを使わなきゃいけないところも嫌だし(今回使ってないけど)。
まー要するにこんなスクリプトはVBSの方がなんとなく楽かな~とあの時思っただけです。

Msgboxも欲しいと思ったんですけど、XSIでしか使わないスクリプトなので XSIUIToolkit の Msgbox を使えば良かっただけですし。VBSにしか出来ないことは結局使っていないから JScript でも良かったです。

こんな適当なブログなんですけど、また遊びに来てください!

  • 2012/05/16(水) 02:16:51 |
  • URL |
  • myara #-
  • [ Edit ]

Re: Re: No title

あとは、JScriptはFSO使えるけどJavascriptではFSOは使えないから、FSOを使いたい時にVBSでやっていたからFSOならVBSの方になれているところもあります。

例えば、PhotoshopのスクリプトではVBSでじゃないとFSOが使えません。でもJavascriptじゃないとGUIに出てこない、面倒くさいスクリプトシステム。最近なにか変わったのかな?

  • 2012/05/16(水) 12:32:58 |
  • URL |
  • myara #-
  • [ Edit ]

説明有難うございました!
好み、大事ですよねー。

確かにダブルバックスラッシュはJScriptの嫌なところの一つですよね。
ただ c:\\aaaa\\bbbb.txt って書くのと c:/aaaa/bbbb.txt って同じってことを最近知りました。
まぁ、そんなに変わらないですけども (^^;

JavaScriptってFSO使えないんですか??
なんかフォルダの中身とか調べてたような…と思ってみてみたらFSOではなかったですね。
違うやり方で処理してました。

Photoshopのスクリプトシステムちょっと宜しくないですよねー。
メニューに登録出来ないし、ワークグループみたいな仕組みないし…。
あと、GUIがかなり作りにくかった記憶が…。
と、これでは愚痴ですね。すいません(^^;

またお邪魔させて頂きます!
でもって、自分もなにかお役に立てる情報があればコメント書かせて頂きますです。

  • 2012/05/17(木) 00:24:54 |
  • URL |
  • モチオ #aw4c/rTE
  • [ Edit ]

Re: No title

> JavaScriptってFSO使えないんですか??

使えなくはないけど、セキュリティーなんちゃらで色々ややこしくなってしまいます。特にブラウザー系で。
そして、SIのNetViewを使うときに new ActiveXObject ではなく XSIFactory.CreateObject でやらないとセキュリティの問題が発生するらしい。
正確言うと、FSOではなく ActiveXObject は問題です。

そして、Adobe系のJavascriptも ActiveXObject 対応していません。なのでPSのスクリプトでFSOを使いたければ、VBSしかありません。最近のバージョンは知りません。

※ 自分もそんなに詳しくないけど。

是非、また来てください!

  • 2012/05/17(木) 00:38:03 |
  • URL |
  • myara #-
  • [ Edit ]

そうなのですねー!!
NetView経由でツールをあまり作らないので知らなかったです。
(webツールとか作るんですが、知らないのは問題ですね…)
JscriptとJavascriptって似て非なるものってのがよくわかりますね。
勉強になりました!!


そうそう!
早速なのですが、ツイッタ―を盗み見ててお役に立てそうなことがありました!

潤樹さん達とお話されてたCustamPropertyをViewに埋め込む事でViewとして
サイズ指定できるって話題なんですが、OnTabイベントを使うとサイズ変更可能ですよ!!
(既に試してたらスイマセン)
自分はいつもこれでビューの大きさを変えております。

ただ、Softimageらしい使えないバグがOnTabイベントにはあるので注意しないといけないです。

・タブ名が関数名に直結するんで日本語のタブでは駄目
・Softimageを日本語モードで使っていた場合タブの名前まで日本語化されてしまい正常に動作しないことがある

という二点ですね。
1点目は内部的と表示を分けられる仕様にしてくれればいいんですけどね~。
2点目は「hand」というタブを作ったら「手」という日本語名に書き変わってしまい、
hand_OnTabが動作しなくなるという、実にSoftimageらしいバグです(^^
なので自動変換されないように「hand_」とかにしとかないといけません…。

あ、あとCustamPropertyをViewに埋め込むとCustamPropertyの作り方によっては
Softimageを最小化して戻すとViewの中が真っ白になってしまうことがありますね。


既にご存知の事だったらスイマセン。

  • 2012/05/17(木) 00:45:17 |
  • URL |
  • モチオ #aw4c/rTE
  • [ Edit ]

Re: No title

参考になることばかりで、ありがとうございます。

自分はツールを書く時に日本語あんまり使わないけど、その自動翻訳に気をつけないといけないですね。

View+OnTabは思いついただけでまだ試していませんが、次のツール開発、またはバグ修理・更新で使ってみます。
ありがとうございます。

Twitterってことは僕をフォローして下さっているんですか?どなたか分からないので、メッセージをお願いします。

  • 2012/05/17(木) 03:07:11 |
  • URL |
  • myara #-
  • [ Edit ]

すいません。
Twitterのアカウントは持ってなくて、たまにフラフラと
ブロガーさん達のアカウントを渡り歩いてるくらいなんです。

でもこのご時世Twitterアカウントくらい持っては方がいい気がしてきました…。
主要なSI系ブログの方たちも大体お持ちのようで、
勉強になりそうですし。
アカウントとったら是非フォロー&メッセージ送らせてください。m(_ _)m

  • 2012/05/17(木) 05:59:02 |
  • URL |
  • モチオ #aw4c/rTE
  • [ Edit ]

Post a comment


Only the blog author may view the comment.

Trackbacks

Trackbacks URL
http://myara.blog.fc2.com/tb.php/123-64fbea40
Use trackback on this entry.

まとめtyaiました【SI | 保存する前にシーンファイルバージョンの確認】

前回にも書いたんですが、自分はSIの色んなバージョンを使うことが多いです。それで忙しい時にわけが分からなくなって、2010 のファイルを 2011 で開いて上書きしちゃったりすることも...

  • 2012/05/15(火) 06:51:35 |
  • まとめwoネタ速neo