日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年12月26日土曜日

Fieldコントロール(3):floatField(2)

前回のフラグの検証では、目的の結果はえられなかった。

混乱したときや、道を見失いそうなときは目的を思い出すのが重要w
ここでもう一度、目的を明確にしてみました。

「フィールド入力値をスクリプトで利用する」 これが目的です。

具体的に、求めているのは

1)フィールド入力値を変数へ代入
2)または、フィールドをアトリビュートに接続

のどちらかが、起きれば良いと言うことになる。

その答えは意外と早く見つかりました。

----------------------------------------
変数へ値を代入する方法の段階的アプローチ
----------------------------------------
(1)-queryモード

まず「1)入力値を変数へ代入する」手順について
これのヒントはDigital Matrixの「スライダ」のページにヒントがありました。

スライダ」ページ→「スライダの使い方」→「2.スライダの値を取得
に書かれている「-query」フラグを使う方法がそのままフィールド・コントロールに使えます。

「-query」フラグについては、オンラインヘルプの「コマンド構文」→「作成、編集および照会モード 」にもう少し詳しく、書かれています。
「-query フラグを付記してコマンドを使用する場合、コマンドは指定されたオブジェクトのプロパティの値(他のフラグによって決まる)を返します。 」

結論から言えば「floatField」は、「-value」フラグを持っているので、「-query」フラグを使えば、その値を取得できます。


具体的には以下のようになります。

flatField -q -value フィールド名;


さて実際にこれが機能するかどうかをまずテストします。

まず以下のスクリプトで「testField」という名前のfloatFieldを作ります。

{
window name;
columnLayout;

floatField testField;
showWindow;
}


そして任意の値(例:0.8730)に変更し、以下のコマンドを実行。
floatField -q -value testField;
// Result: 0.873 //

ちゃんと値が返ってきました。


----------------------------------------
(2)値を変数へ代入

次のステップは、この値をどのように変数へ代入するかという話になります。

これも先ほどのオンラインヘルプの一番下にヒントがあります。
「戻り値を使用する: 関数構文とバッククォーテーション 」
命令構文を使用すると、コマンドはスクリプト エディタ(Script Editor)に戻り値を出力するだけで、使用できる戻り値は提供されません。
エクスプレッションの照会モードでコマンドの戻り値を使用する場合には、よくバッククォーテーションが使用されます。
if (`sphere -query -radius "mySphere"` == 5)
print("This sphere has a radius of 5!";


この例のif文の条件式だけをみると以下のようにクエリーモードでスフィアの半径を照会している。
`クエリーモードのsphereコマンド` == 5)

もっと短くすると以下のようになる。
(半径の値==5)

ここから解釈すると、いかが成り立つ
「半径の値」=(イコール)「`sphere -query -radius "mySphere"`」


これを応用して、「半径の値」を変数「$a」へ代入する式は以下のようになる。
$a=半径の値

この右辺を上記のコマンドと置き換えると、以下のようになる。
$a=`sphere -query -radius "mySphere"`;


Digital Matrixの同ページ「スライダの使用例」でも同じ方法が使われている。


-------------
ではこれを早速使ってみます。
{
window name;
columnLayout;

floatField -value 0.8555 testField;
showWindow;

float $a;
$a =`floatField -q -value testField`;
print $a;
}

これできちんと
0.8555
と表示されました。


----------------------------------------
(3)値を取得するタイミングを設定する。

変数へ代入することはできましたが、このままではスクリプトを実行した最初に値を取得するだけで、後の変更については反映されません。

反映させるためには以下のステップを踏む必要があります。
A)フィールドを持ったウインドウが表示される。
B)フィールドの値をユーザーが変更する。
C)値を取得する。

ステップBは、ユーザーの行う操作なので、コンピュータの自動的な処理はいったん停止している必要があります。
そしてステップCでは再びコンピュータの自動的な処理を開始します。
ようするに、ユーザーが自分の入力作業が終了した段階で、コンピュータに続きの処理を開始させる必要があります。


上記のスクリプトでは、それがありません。

もう少しわかりやすくステップを書き直すと
A)フィールドを持ったウインドウが表示される。
B)スクリプトの処理を停止
C)フィールドの値をユーザーが変更する。
D)スクリプトの処理を再開
E)値を取得する。


これを行うには、ステップD以降の処理を「別のスクリプト」すなわち、「プロシージャ」としてまとめておけば、明確に処理を分けることが出来、考えるのも簡単になります。

そのプロシージャに含めるべき物は以下のものです。
●-queryフラグで値を取得するステップ
●その値を利用したアクション


そのプロシージャを実行するタイミングですが
二つの方法が有効だと思われます。
●ボタン・コントロールを使いボタンを押したときに-commandフラグでプロシージャを実行。
●floatfiledコマンドの-enterCommandフラグを使い、Enterを押した時、プロシージャーを自動実行


まず両方に共通している要素、「プロシージャ」部分を作成します。
ポリゴン・プレーンをスケールを変えて作成するプロシージャです。

global proc testPlane()
{
float $a;
$a = `floatField -query -value testField`;
polyPlane;
scale $a $a $a;
}



次にボタンとフィールドをもつウインドウを作成。

window name;
columnLayout;

floatField testField;

button -label Create -command "testPlane()";

showWindow;

}


--------
これを一つにまとめます。
{
global proc testPlane()
{
float $a;
$a = `floatField -query -value testField`;
polyPlane;
scale $a $a $a;
}

window name;
columnLayout;

floatField testField;

button -label Create -command "testPlane()";

showWindow;
}


これで、スケールの異なる、プレーンを作成するウインドウができました。



----------------------------------------
(おまけ)-enterCommandフラグを使った方法。

いちいちボタンをおさなくても良いのでボタン・コマンドを使う必要はありません。
しかし、ミスも起きやすいかと思いますので、オブジェクトの作成に使うには向いてない方法かもしれません。


{
global proc testPlane()
{
float $a;
$a = `floatField -q -value testField`;
polyPlane;
scale $a $a $a;
}

window name;
columnLayout;

floatField -enterCommand "testPlane()" testField;

showWindow;
}


----------------------------------------
まとめ
----------------------------------------
フィールドに値を入力し、それをスクリプトで活用するには、

(1)-queryフラグをフィールド・コマンドに使い値を取得する。
(例)floatField -q -value testField

(2)``を使ってそのクエリーコマンドから変数へ値を代入する。
(例)$a = `floatField -q -value testField`;

(3)値の取得と、その後の処理はプロシージャにまとめる。
   「プロシージャ」+「ウインドウ作成」とブロック分けして考える。

(4)値を入力後に、プロシージャを実行する。(buttonコマンドを使うと良い)

0 件のコメント:

コメントを投稿