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

2010年1月3日日曜日

その他のコントロール(2): checkBox

チェックボックスの種類は二つだけ
checkBox , checkBoxGrp

checkBox:一つのチェックボックスのみ、-alignフラグでラベルの表示位置を変更できる。
checkBoxGrp1~4個のチェックボックス。複数の場合は横に並ぶ。チェックボックス全体のグループラベルを持っている。


----------------------------------------
(1)checkBox

まずフラグ無しで使った場合。
{
window name;
columnLayout;

checkBox;

showWindow;
}

チェックボックスのラベル名が自動的に作られ「checkBox1」と表示されます。


次に、このチェックボックスの状態を利用する方法を考えます。
値としてはTrue かFalseの二値であることはわかります。
それを利用するには、フラグを使う方法と、-queryを使った戻り値を使う方法の2種類があります。

まずこのチェックボックスの状態が変わったときに実行されるコマンドがある。
-onCommandフラグ:チェックボックスがオンになった時にコマンドを自動実行。
-offCommnandフラグ:チェックボックスがオフになった時にコマンドを自動実行。
{
window name;
columnLayout;

checkBox -onCommand sphere -offCommand cone;

showWindow;
}
チェックボックスが
オンになったときにNurbsスフィアが作られ、
オフになったときにNurbsコーンが作られます。


では、スライダなどと同じく、ユーザー任意のタイミングでこの値を取得してみる。
これにはプロシージャの中で-queryを使うしかないと思う。

まず今までと同じようにボタンを押したタイミングで、戻り値を取得する方法
{
global proc printValue()
{
int $a;
$a = `checkBox -query -value Box`;

if ($a==1)
{print "True" ;}
else
{print "False";}

}
window name;
columnLayout;

checkBox Box;

button -label check -command "printValue()";

showWindow;
}

チェックボックスがオンになっている場合、ボタンを押すとTrueと出力され、
チェックボックスがオフになっている場合、ボタンを押すとFalseと出力される。


----------------------------------------
(2)アサインを使う

DigitalMatrixの「チェックボックスの状態を調べる方法 」をみると、このスクリプトはもっと単純化できることがわかる。

実は、このページをみていて初めて知ったのだが「`MELコマンド`」(過去のエントリでは「`命令構文`」と表記していた」は「アサイン」と呼ばれることがわかった。

使い方などは、今まで見てきたこととほぼ同じなのだが、、この技法に名前があることがわかった。
そして同じくDigital Matrixの「アサインとは」の説明を読むと、よりすっきりと頭を整理することが出来る。

アサインとは:
● MEL コマンド を ` (バッククォート)で囲んだもの
●これによってコマンドからの返り値を変数に代入することができます。
●返り値を他のコマンドの一部などで利用する。



さてこのアサインを「チェックボックスを使ったスクリプト」に適用してみたい。
DigitalMatrixの「チェックボックスの状態を調べる方法 」では以下のように説明されている。
if(`checkBox -q -value sampleCheckBox`)
{チェックされている場合に実行したい MEL 文;}

ここで、通常のif文について考えてみる。
●( )内がエクスプレッションである。
●通常は( )内で、比較演算子を使ったエクスプレッションが用いられる。

しかしこの例では比較演算子を使っていない。
if文の働きは
結果がTrue(1)であれば{ }ブロック内を実行する。
であることに注目すれば、必ずしもその中で比較演算子を使う必要はないということだろう。

そのことを確認してみたい。
{
if(1)
{print"true";}
}

true
ちゃんと表示されたので、この仮説は正しいと言うことだろう。

念のため、もうひとつ
{
if(0)
{print"true";}
else
{print "false";}
}

false
これで、if文の( )内がただのブーリアン値であっても、正しく動作すると言うことが確認された。
「ブーリアン値」と書いたが( )内を数値ではなく、「true」もしくは「false」と書いても正常に動作する。


`checkBox -query -value Box`
このばあいは -valueの値であるブーリアン値を返してくる。
さて、先ほどの説明に従えば「`MELコマンド`」=「戻り値」である。
よって上記if文の例で、( )内の数字をこの「アサイン」と入れ替えることが出来るということになる。
{
if(`checkBox -query -value Box`)
{print"true";}
}
(注意:このスクリプトは考えをそのまま書いた物であり正常に動作はしません)


では、この考えで先ほどcheckBoxを使ったウインドウのスクリプトを修正してみたい。
先ほどの物では変数「$a」を使用していたが、その使用目的はif文の中で真偽を判定するだけのためであった。
アサインを使う事で、この部分を省略できる。

{
global proc printValue()
{

if (`checkBox -query -value Box`)
{print "True" ;}
else
{print "False";}

}
window name;
columnLayout;

checkBox Box;

button -label check -command "printValue()";

showWindow;
}


こうしてみるとアサインは、Trueであるときに動作をする条件文しか作れないようにみえますが、Falseで動作するようにも出来ます。

アサイン=戻り値=値=変数
と相互に入れ替え可能であることを考えれば、通常の
if(変数==値)
という比較演算子を使ったエクスプレッションが使えることがわかります。

この「変数」の部分を「アサイン」と入れ替えます。
今回はチェックが入っていない状態のときに、IF条件文がTrueになります。

{
global proc printValue()
{

if (`checkBox -query -value Box`== false)
{print "Not True" ;}
else
{print "Not False";}

}
window name;
columnLayout;

checkBox Box;

button -label check -command "printValue()";

showWindow;
}


----------------------------------------
(3)-changeCommandフラグ

Mayaのオプション・メニューでは、時々チェックボックスと他の項目が連動していることがある。
いくつかのコントロールがグレイになって使用不可になっているが、あるチェックボックスをオンにすることで、それが使用可能になるというケースだ。
(「Attach Surface」の「Insert Knot」チェックボックスをオンにすると「Insert parameter」スライダが使用可能になる。)

他にもラジオボタンで同様の切り替えを行っていたり、
(同じく「Attach Surface」の「connect」ラジオボタンをオンにすると「Multiple Knots」ラジオボタンが使用可能になり、「Blend bias」スライダ、「Insert Knot」チェックボックスが使用不可になる。)

ラジオボタンの場合は、コントロールの表示やレイアウトが切り替わるケースもある。
(Rebuild Surfaceなど)


これらは、チェックボックスの状態により、各コントロールの-enableフラグのオンオフを切り替えていると思われる。

この手法は、
使う側からすると、ウインドウの表示から、
ある条件とそれに準ずる設定値との関連がわかりやすい。
またグレイアウトしていても、表示されているので。
自分がどんな選択肢を持っているのかが推測しやすい。


これを利用できるようにするにはbuttonコマンドを押すまで待つのではなく、
チェックボックスの状態が変化した瞬間に自動的に動作する必要がある
そして、
値(True またはfalse)によってことなる動作をする必要がある。


それを行えるもののは先ほどの-onCommandフラグ,-offCommnandフラグがある。
しかしこれらを使うとオンの場合とオフの場合に似たようなコマンドもしくはプロシージャをそれぞれ書く必要がある。

●チェックボックスの状態が変化したことを検出し
●チェックボックスのブーリアン値を取得し、
●それに応じて、-editモードで該当コントロールの-enableフラグを切り替える。

ができれば、if条件文を使い、ひとつにまとめることができる。
「チェックボックス」が変化したことを検出し、トリガーとなれるのが
-changeCommandフラグである。

これにより特定のコマンドを実行できる。
ブーリアン値を取得し、-enableフラグを切り替えるという一連の手順を-changeCommandの引数に納めるのは難しい(たぶんできない)と思われるので、この処理部分はプロシージャにまとめるほうが無難だろう。
{

global proc printValue()
{
if (`checkBox -query -value Box`)
{print "True" ;}
else
{print "False";}
}


global proc toggleEnable()
{
if (`checkBox -query -value Box`)
{button -edit -enable false button1;}
else
{button -edit -enable true button1:}
}

window name;
columnLayout;

checkBox -changeCommand toggleEnable Box;

button -label check -command "printValue()" button1;

showWindow;
}

この例では
チェックボックスをオンにするとボタンがグレイになり
チェックボックスをオフにするとボタンが有効になる。
当然ながらボタンを押せるのは値が「false」の時のみである。


  

0 件のコメント:

コメントを投稿