« アエ~。 | トップページ | 友愛その4。 »

2010年7月 6日 (火)

友愛その3。

さらに続き。

 1.シーンに実体を残さない PPG にします
 2.パラメータの値に変化があったらアクションを起こすようにします
 3.パラメータをワクで囲みます
 4.パラメータを横並びにします
 5.パラメータの表示形式を、ドロップダウンメニューにします
 6.ボタンの大きさを変えます


まずは1と2からやりましょうかね。
前回のソースをちょこっと改造しています。

//    CustomProperty を 作るが Scene には実体を残さない
var oProp = XSIFactory.CreateObject ( "CustomProperty" );
oProp.name = "hoge";


//    oProp(さっき作った CustomProperty)に、パラメータを追加する
oProp.AddParameter2 ( "Icon",  siInt4,  1,  0,  10 );
oProp.AddParameter2 ( "Size",  siDouble,  1,  0.01,  100 );


//    PPGLayoutを作る

var oLayout = oProp.PPGLayout;

//    さっき作ったPPGLayout に、すでに作成してあるパラメータを登場させる
//    AddItem メソッドで、作成済みのパラメータ名、UI に登場させる時の名前を指定。

oLayout.AddItem ( "Icon", "愛根" );
oLayout.AddItem ( "Size",  "砕図" );


//    ボタンを作るときは AddButton メソッドを使う
oLayout.AddButton ( "Set",  "切吐" );

//  言語を指定しないといけない
oLayout.Language = "JScript";

//  ロジック設定

oLayout.Logic = Set_OnClicked.toString( ) +
                      Icon_OnChanged.toString( )+
                 Size_OnChanged.toString( );


//  クリックされた時に実行される Function

function Set_OnClicked( )
{
    Logmessage ( "愛根 = " + PPG.Icon.value );
    Logmessage ( "砕図 = " + PPG.Size.value );
}


//    Icon /Size パラメータが変更された時に実行される Function
function Icon_OnChanged( )
{
    Logmessage ( "愛根が変わりますた = " + PPG.Icon.value ); 
}
function Size_OnChanged( )
{
    Logmessage ( "砕図が変わりますた = " + PPG.Size.value ); 
}


//  表示しておしまい。
InspectObj ( oProp );



例によって赤い文字が変更部分です。
まずは実行してみましょう。

同じ PPG が表示されましたよね。
でも Explorer を見ても、シーンルートにプロパティは存在しないですよね。
愛根と砕図のスライダをいじると、結果がスクリプトエディタ内にログされますよね。
Ui_31

順に行きましょう。



まず最初のやつ。

//    CustomProperty を 作るが Scene には実体を残さない
var oProp = XSIFactory.CreateObject ( "CustomProperty" );
oProp.name = "hoge";


前回までは、ActiveSceneRoot.AddProperty の呪文を使ってシーンルートにプロパティを作っていました。実行するたびに新しいプロパティが作られるというものでした。
でも今回は、シーンに何も残さない形でプロパティを作っています

XSIFactory オブジェクトCreateObject の呪文を唱えてカスタムプロパティを作っているんですが、まあ、もう細かい説明は抜きにして暗記してしまえばいいんです。そうなんです。なぜならば、説明しようにも、俺自身が丸暗記しているだけなんで説明しようがないんです。そうなんです。

CreateObject の呪文は TypeName を与えてやることによって Object を生成するものですが、それゆえに汎用です。カスタムプロパティを作るときだけに使う呪文ではありません。最も一般的には XSI Collection を作る時などによく使います。 ともかく、汎用なので細かいオプションは存在せず、1行の中で名前を決めたりとかはできません。 なのでわざわざ次の行で oProp の名前は "hoge" だぞと指定しています。たぶんこれ以外に名前を決める方法はありません。たぶん。



次にロジックの設定の部分です。

//  ロジック設定

oLayout.Logic = Set_OnClicked.toString( ) +
                      Icon_OnChanged.toString( )+
                 Size_OnChanged.toString( );


Icon_OnChanged というものと、Size_OnChanged というものが追加されています。
この Icon や Size の部分は、AddParameter2 の呪文であらかじめパラメータを作ってあるので、その名前と完全に一致していないといけません。
そして OnChanged に続きます。 ボタンのクリックを検知する場合は OnClicked だったけど、パラメータの変化を検知するには OnChanged だと覚えてしまえばよろしいです。

ちなみに、今回の書き方のように、+ の後に改行を入れて、複数行に分けて記述することも可能です。改行コードを入れているわけではなく、スクリプトエディタ上で読みやすいように改行してインデントしているだけです。 ロジックをすんげぇ大量に書かなければいけない場合もあるので、1行で書いていたらひじょーーーーーに横長なドキュメントになってしまい、横スクロールで進めども進めども右の端が見えて来ず、またマウスの操作をちょっと間違ったりするとカーソル位置があっという間に先頭の行に戻されたりしてモニタを破壊します。 なのでガンガン改行して、タブスペースなどでインデントして読みやすくするべきだと思います。


で、このロジックに呼応するファンクションを書いてやればいいということです。

//    Icon /Size パラメータが変更された時に実行される Function
function Icon_OnChanged( )
{
    Logmessage ( "愛根が変わりますた = " + PPG.Icon.value ); 
}
function Size_OnChanged( )
{
    Logmessage ( "砕図が変わりますた = " + PPG.Size.value ); 
}

これで、スライダで値をいじった瞬間に何かが実行されるというスクリプトになりました。インタラクティブにシーンのブツに変更を加えるようなツールにもなり得るし、PPG 内の値さえもこれをトリガにして変更することができます。例えば X 解像度のパラメータを変えた瞬間にY解像度も一定の比率を保って自動的に変化する、なんてのがよくあるパターンです。

UI 構築とは関係ないですが、さすがに値を Logmessage するだけじゃつまらんので、ちょっとマトモっぽくしてみましょう。ロジックのファンクションの部分を以下のように書き換えてみます。


//    Icon /Size パラメータが変更された時に実行される Function
function Icon_OnChanged( )
{
    for ( var i = 0; i < Selection.count; i++ )
    {
        if ( Selection( i ).type == siNullPrimType )
        {
            Selection( i ).primary_icon.value = PPG.Icon.value;
        }
    }
}

function Size_OnChanged( )
{
    for ( var i = 0; i < Selection.count; i++ )
    {
        if ( Selection( i ).type == siNullPrimType )
        {
            Selection( i ).size.value = PPG.Size.value;
        }
    }
}



UI の話ではないので超簡単にだけ説明しておくと、

 for ループで Selection(現在選択中のオブジェクト)の数(count)だけ繰り返す
 選択中のものが null オブジェクトかどうかを調べる
 null だった場合は Icon と Size を PPG で指定した値に書き換える
 null じゃなかった場合の記述は無いので、null 以外のものが含まれていてもスルーされる
 何も選択されてなかったら count は 0 なので 0 回のループが発生する=つまりループが発生しない=何も起こらない

以上です。
適当に null を数個出して、適当に選んで、スクリプトを実行してみてください。

Ui_32
おおっ 選択してる null の Icon と Size がインタラクティブに変わる!
なんだかそれっぽい! (;゚∀゚)


と思ったのもつかの間、こんなもの、null を複数選んで Enter 押して、出てきたマルチモードの PPG で普通に Icon と Size いじってやりゃそれで済みます。わざわざスクリプトでやるようなことではありません。相変わらず役に立ちません。





と、ここまで書いてめんどくさくなりました。
それではごきげんよう。
1と2しか終わってねえじゃねえか。
気にしない。
ごきげんよう。





.

|

« アエ~。 | トップページ | 友愛その4。 »

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 友愛その3。:

« アエ~。 | トップページ | 友愛その4。 »