myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

Custom Preferences

昨日からPreferencesを残すスクリプトを作ろうとしていました。

作ったことがなかったので、色々読みながら、やっていました。なかなか難しいですね。

まずはPPGを作って、CPWizardでやってみました。
結果はなぜかレイアウトがめちゃくちゃになってしまいました。

このCPWizardはカスタムプロパティまでは作ってくれるけど、プリファレンスまでは登録してくれないので、色んなプラグインを参考にしながら手動で作っていましたが、なかなか上手く行かないんですね。意外と難しいし、ググっても役に立つ情報があんまり出てこないんです。もちろんStep by Step的なチュートリアルがありません。(あったら教えて下さい!)

Trial & Error で少しずつこの init, define, definelayout 等 の仕組みが分かってきました。
そして、基本的にSceneRootにカスタムパラメーターを作って、InstallCustomPreferencesというコマンドでこのパラメーターをプロパティに変更することが分かりました。

ここまではそう難しくはなさそうですね。PPGを作ってをのままプロパティに変えるだけですからね。

すると、なんかのエラーが出てました。

ヘルプに載っていなかったけど、

siInt4, siString, siBool and siDouble しか対応していない。

Preferencesのヘルプには載ってるけど、InstallCustomPreferencesには何も書いてないからこれに気づくのは少し時間が掛かってしまいました。マニュアル担当の方:書いてくださいよ~。

その他、あっちこっち直してて、やっとプリファレンスにプロパティを登録することが出来ました。

問題はですね、ちゃんとプリファレンスにはなっていたけど、なぜか空っぽでした!

DefineLayoutとか何回も読みなおして、2列ぐらいのシンプルなレイアウトに変えてみたけど、なぜか空っぽのまま。

Custom Preferenceを作る時に、「Softimage\Data\Preferences」にPresetファイルが作成されます。
なので、まずはこのファイルを消しておいたほうが良さそう。
よし、削除。

もーっかい・・・ また空っぽか。


じゃあ、まずはちゃんとしたPPGが出るようにしないと上手く行く分けないんですね。で、プリファレンス登録コマンドを外して、シーンにプロパティを作るようにしてみました。


この流れでもうお分かりでしょうね。


そう!空っぽだぁ!


なにがいけないんだよー!!

やっぱ俺のコードがどこか可笑しいのかな。エラーが出ないけど。

じゃあ、コードの問題だったらSoftimageのサンプルをそのままコピーペーにしてみたら・・・


まさかの?


そう!

空っぽだ!!



もう頭まで空っぽになっちゃったから、あきらめてXSIを閉じました。

ネットサーフィンやって、ハリーポッターのハーマイオニーより好きだったルーナちゃん可愛くなくなっちゃったことに驚いて少しテンションが下がりました。
アナキン写真で少し笑っちゃって元気が出たからまたXSIをたちなおしてみることにしました。

失礼でした。ファンの皆様すみませんでした。

話に戻ります。

すると、なにかいじる前にそのままコマンドを実行してみようと

サンプルのPPGが開いた!

なんなんだよーーーー!!

自分のコードを入れ替えてすべて上手くいきました。
めでたしめでたし。



これで学んだことをまとめると:

● 自動インストールプラグインでプリファレンスをいじってる時にXSIがなんか可笑しくなっちゃうようなので、上手く行かない時に再起動でリセットしたほうが良い。
● レイアウトのアイテムは siInt4, siString, siBool と siDouble だけにしましょう。
● PPG を Refresh すれば、上手くいくはずですが、やはり、上手くいかない時もあります。
そういう時に、プリファレンスプロパティ(プリファレンスメニューにある)、プリセットファイル(Data\Preferencesフォルダの中にあるファイル)とカスタムパラメーター(Scene_RootにあるPPG)を削除してからもう一回試してみましょう。それでもダメでしたら、XSI再起動するしかないかもしれません。

お疲れ様でした、俺。


一応コードをメモっておく (JScript):

function XSILoadPlugin( in_reg ) {
in_reg.Author = "myara";
in_reg.Name = "sample";
in_reg.Major = 1;
in_reg.Minor = 0;

in_reg.RegisterProperty( "sample_Prop" );
in_reg.RegisterCommand( "sample","sample" );
in_reg.RegisterMenu ( siMenuMCPEditID, "sample_Menu", false, false );

//RegistrationInsertionPoint - do not remove this line

return true;
}

function XSIUnloadPlugin( in_reg ) {
var strPluginName;
strPluginName = in_reg.Name;
Application.LogMessage(strPluginName + " has been unloaded.",siVerbose);
return true;
}


function sample_Menu_Init( in_ctxt ) { // メニューにコマンドを登録するFunction

var oMenu = in_ctxt.Source
oMenu.AddCommandItem ("sample","sample")
return true;
}

function sample_Init( in_ctxt ) {
var oCmd;
oCmd = in_ctxt.Source;
oCmd.Description = "";
oCmd.ReturnValue = true;
return true;
}

function sample_Prop_Define( in_ctxt ) {
//RegisterPropertyで決めたプロパティ名にして、そのプロパティのパラメータ設定になるFunction。

var oPSet = in_ctxt.Source;
oPSet.AddParameter2( "opt1", siBool,1);
oPSet.AddParameter2( "opt2", siString, "sample");

return true;
}

function sample_Prop_DefineLayout( in_ctxt ) {

var oLayout = in_ctxt.Source
oLayout.Clear() ;

//そのプロパティのレイアウト

oLayout.AddGroup("Test", true, 100)
var oItem = oLayout.AddItem( "opt2", "opt 2" );
var oItem = oLayout.AddItem( "opt1", "" );
oLayout.EndGroup();

return true;
}

function sample_Execute( in_ctxt ) { // プリファレンスを作って開くコマンド。(sample_Menu_Initでメニューに登録されました。)

// プリファレンスが既に存在する場合:プリファレンスを開く
var oPref = Application.Preferences
var oProp = oPref.Categories( "sample_Prop" );

// Prefがない場合、Rootにプロパティを作成し、プロパティに変更:
if( oProp == null )
{
// ここでシーンでカスタムパラメーター作成ではなく、RegisterPropertyで登録したプロパティ名で作ります:
var oProp = ActiveSceneRoot.AddProperty( "sample_Prop" );
InstallCustomPreferences( oProp, "sample_Prop" );
var oProp = oPref.Categories( "sample_Prop" );
}

inspectobj(oProp,null, null, siLock)
return true;
}

Comments

Post a comment


Only the blog author may view the comment.

Trackbacks

Trackbacks URL
http://myara.blog.fc2.com/tb.php/45-2d8d567c
Use trackback on this entry.