前回のフラグの検証では、目的の結果はえられなかった。
混乱したときや、道を見失いそうなときは目的を思い出すのが重要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 件のコメント:
コメントを投稿