嘔吐 Actions。
Action の Export って、複数をイッキにできないですよね。
XSI のモーションモジュールで、 Tools > Import/Export > Export Action ってのがあって俺はよく使うのですが、一度にひとつの Action Source しか吐き出せません。 複数の Action Source をイッキに吐き出してはくれないわけです。 それどころか、複数の Action を選んだ状態で ExportAction を実行すると、意味不明のエラーを吐きます。
ほら。
「すいませんが、アクションは、ひとつだけ選んでおいてもらえますかね」 とかエラーを出すならまだしも、Unexpected failure ですからね。 予期せぬ失敗だそうです。 いわゆるソーテーガイってやつですね。 複数選んでいる状態はソーテーできなかったということでしょうか。
それくらいソーテーしろよ( ^∀^)ゲラゲラ
ほんと XSI って、値段高いくせに、こういう細かいところで不親切ですよね。不親切というより、なんつうか、頭弱いですよね。 アクションの吐き出し機能を付けるなら、普通、複数いっぺんに出来るようにするでしょう? 俺でも気付くよそんなこと。 まあ、そこは置いといたとしても、このエラーメッセージは無いでしょう。ちゃんとエラー処理しなさいよもう。
まあ、XSI は Maya 様や Max 様のプラグインなのだから、仕方ないとは思いますけどね。
別にバグとかそういうわけではないでしょうね。一度に1つしか書き出せない仕様なわけですよ。 「マニュアルにもいっぺんに複数吐き出せるとは書いてないので、マニュアルに反してないという意味で、不具合ではありません」 とか、 「メニューの表記も Export Action であって Export Actions ではないから、これでいいのです」 とか言うのかな嘔吐デスク様は。 まあ、いいです。 普通に仕様です。 何もおかしくはありません。 実に興味深い仕様ですけどね。
ちなみにアクションのインポートも、ファイルダイアログを通すと一度に1つしか実行できないという謎仕様です。 これって、もしかして XSI のダイアログの設計上の制限かな? XSI 作業の他の場面でも、複数のファイルをいっぺんに選択できるってのは無いですよね? あの XSI 専用入出力ダイアログが、ファイルの複数選択に対応してないということなんでしょうか? どうなのでしょう。
ま、アクションのインポートは Windows の Explorer から複数をいっぺんにドラッグ&ドロップできるので、そんなには困りませんけどね。
ともかくだ、複数の Action Source をいっぺんに吐き出すスクリプトは、過去に数回書きました。 昨日またそれが必要になって、いつものクセでスクリプトエディタを開いて書き始めたら、過去に何回か書いたことをふと思い出してHDD をひっくり返してみたら出てきたので、今回は無駄なコード書きを避けられました。 あ、これ、タコ親父のアクションを吐き出す時に書いたやつだな。 リグの都合上、触手1本ごとに違う Model だったので、アクションのストアもいっぺんにできないし、書き出しもいっぺんにできない。しかたないから色々ツールを書いたんだった。 龍司、今日もちゃんとタコ焼いてるか。 目と目の間をひと突きだぞ。
ま、ともかくそのスクリプトにちょっと改良を加えたので、一応載せておきます。
JScript
------------------------------------------------------------------
// 嘔吐 Actions
// デフォルト値取得
DefRemove = GetGlobal( "bOutoActions_RemoveEani" );
if ( DefRemove == null ) DefRemove = true;
DefModelName = GetGlobal( "bOutoActions_ModelName" );
if ( DefRemove == null ) DefRemove = true;
DefPath = GetGlobal( "sOutoActions_Path" );
if ( DefPath == null ) DefPath = Application.ActiveProject2.path + "\\Actions\\";
// PPG
var oP = XSIFactory.CreateObject( "CustomProperty" );
oP.name = "嘔吐Actions";
oP.AddParameter2( "bRemoveEani", siBool, DefRemove );
oP.AddParameter2( "bAddModelName", siBool, DefModelName );
oP.AddParameter2( "sPath", siString, DefPath );
var oL, oItem;
oL = oP.PPGLayout;
oL.AddGroup();
oL.AddRow();
oL.AddGroup( "", false, 55 );
oItem = oL.AddItem( "bRemoveEani", "Remove " + '"' + "eani" + '"' + " from Name" );
oL.EndGroup();
oL.AddGroup( "", false, 45 );
oItem = oL.AddItem( "bAddModelName", "Add Model Name");
oL.EndGroup();
oL.EndRow();
oL.AddRow();
oItem = oL.AddItem( "sPath", "Path", siControlFolder );
oItem.SetAttribute( siUINoLabel, true );
oItem = oL.AddButton( "OpenExplorer", "Explorer" )
oL.EndRow();
oL.EndGroup();
oL.AddSpacer( 0, 10 );
oItem = oL.AddButton( "Export", "げろっ" );
oItem.SetAttribute( siUICX, 0 );
oL.Language = "JScript";
oL.Logic = Export_OnClicked.toString( ) +
OpenExplorer_OnClicked.toString( ) +
FilterAction.toString( ) +
DoTheFuckExport.toString( );
function OpenExplorer_OnClicked()
{
var oFSO = new ActiveXObject( 'Scripting.FileSystemObject' );
FolderPath = PPG.sPath.value;
if ( oFSO.FolderExists( FolderPath ) )// フォルダ存在
{
XSIUtils.LaunchProcess ( "explorer /e," + FolderPath);
}
else
{
Logmessage( "そんなフォルダは無いので帰って下さい。", siError );
}
}
function Export_OnClicked( )
{
var oFSO = new ActiveXObject( 'Scripting.FileSystemObject' );
FolderPath = PPG.sPath.value;
if ( oFSO.FolderExists( FolderPath ) )// フォルダ存在
{
var oExportingActions = FilterAction( Selection );//ActionSource収集
if ( oExportingActions.count == 0 )
{
Logmessage( "Action Source が選択されてなかったので帰って下さい。", siError );
}
else
{
for ( i=0; i<oExportingActions.count; i++ )
{
DoTheFuckExport( oExportingActions(i) );//Action嘔吐実行
}
SelectObj( oExportingActions );
// デフォルト値上書き
SetGlobal( "bOutoActions_RemoveEani", PPG.bRemoveEani.value );
SetGlobal( "bOutoActions_ModelName", PPG.bAddModelName.value );
SetGlobal( "sOutoActions_Path", PPG.sPath.value );
}
}
else
{
Logmessage( "そんなフォルダは無いので帰って下さい。", siError );
}
}
// 嘔吐実行ファンクション
function DoTheFuckExport( oAction )
{
ActionName = oAction.name;
if ( PPG.bRemoveEani.value ) // 名前から _eani 削除
{
ActionName = ActionName.replace( "_eani", "" );
}
if ( PPG.bAddModelName.value ) // 名前に Model名を付加
{
ActionName = oAction.Model.name + "_" + ActionName;
}
Path = FolderPath + "\\" + ActionName + ".eani";
ExportAction( oAction, Path );
Logmessage( "Action ゲロ完了す。 --> " + Path );
}
// Action のみを返すファンクション
function FilterAction( in_Objs ){
var oCol = XSIFactory.CreateObject( "XSI.Collection" );
for ( var i=0; i<in_Objs.count; i++ ){
if ( in_Objs(i).type == "Action" ){
oCol.Add( in_Objs(i) );
}
}
return oCol;
}
InspectObj( oP, null, null, siLock );
------------------------------------------------------------------
Explorer から、ActionSource を選びます。もちろん複数可能。 っていうか複数じゃないときはこのツールを使う意味は全くないと思います。
で、スクリプトエディタにこのコードをペーストして起動し、PPG の中で嘔吐先の Path を入力してゲロボタンを押すと、そのフォルダに Action を全部ゲロします。
Explorer ボタンを押すと、嘔吐先の Path を Windows の Explorer で開きます。
Remove "eani" from Name をチェックしておくと、もともとのアクション名に "_eani" が含まれていた場合、それを削除した名前にします。 インポートによって作られた Action Source って、その名前にファイルの拡張子が付いちゃうんですよね。 eani ファイルをよくインポートするので、xxxx_eani という名前のアクションになることが多いです。 普段は放置したりもするけど、改めて書き出すときは削除したいので、この機能を付けました。
Add Model Name をチェックしておくと、ゲロするファイルの名前の冒頭に "Model名_" が付加されます。 これは、複数 Model 以下で同じ名前の Action Source を書き出そうとした場合、このスクリプトは次々に上書きして行ってしまうため、ゲロしたはずのファイルが見当たらない、という事態になります。単に同じ名前で上書きされていただけなんですがね。 これを避けるために、 Model 名を付加する機能を付けました。
スクリプティング的に特筆するべきことは、まあ、ないですかね。
Get / SetGlobal を使ってその XSI セッション中は PPG に入力した値を覚えていて、次に起動したときに前回の設定がデフォルト値として入っているようにしています。 最近の自分の中での流行りですね。 Preference に残すほどでもないけど、起動するたびに設定がスクリプトにハードコーディングされた固定値に戻ってしまうのは嫌だ、という場合にこうしています。
しかし、もともとはすごく小さいスクリプトだったのに、ちょっとした機能を付けようとしただけで、なんか長くなっちゃいますねえ。
アクションがらみの細かいスクリプトも溜まってきているので、そのうちまとめたツールセットにしたいんだけど、今のところとっ散らかってます。
それではごきげんよう。
.
| 固定リンク
コメント