ロールアウト句

 

   

ユーザ インタフェースの作成 - クイック ナビゲーション

ロールアウト句は、ロールアウト(ユーティリティはロールアウトの特別な形であるとみなされます)を定義します。次の基本的な 4 つの項目のいずれかになります。

<rollout_clause> は、次のように定義されます。

<rollout_clause> ::= <local_variable_decl> | <local_function_decl> | <local_struct_decl> | <global_variable_decl> | <mousetool> | <user_interface_item> | <item_group> | <event_handler>

ローカル

<local_variable_decl> <global_variable_decl> <local_function_decl> 、および <local_struct_decl> は、MAXScript 内のローカルおよびグローバル変数、ローカル関数、ローカル構造体の定義とまったく同義です。

<local_variable_decl> ::= local <decl> { , <decl> } 
<decl> ::= <name> [ = <expr> ] -- optional initial value
<global_variable_decl> ::= global <decl> { , <decl> } 
<decl> ::= <name> [ = <expr> ] -- optional initial value
<local_function_decl> ::= [ mapped ](function | fn) <name> { <argument> } = <expr>
<local_struct_decl> ::= struct <name> ( <member> { , <member> } )
<member> ::= ( <name> [ =<expr> ] | <local_function_decl> )

上記の例を、次に順番に示します。

local numSelected
global foo
local numSelected = 0
fn onlyOneSelected = (selection.count == 1)
struct parents (mother="", father="")

スクリプトを作成するときは、ローカル変数およびグローバル変数を明示的に宣言することをお勧めします。暗示的な宣言は簡易的に提供されるものであり、通常、リスナーでインタラクティブに作業する場合や短いスクリプトを作成する場合に使用します。長いスクリプトを作成する場合は、変数を明示的に宣言するとエラーを軽減し、コードが読みやすくなります。また、グローバル変数がどうしても必要な場合を除き、すべての変数をローカルとして宣言することをお勧めします。この理由については、「変数のスコープ」を参照してください。

ユーザ インタフェース項目

<user_interface_item> では、個々のボタン、チェック ボックス、スピナー、またはその他のロールアウトに表示されるユーザ インタフェース コントロール項目を定義します。これらのユーザ インタフェース コントロール項目については、「ロールアウト ユーザ インタフェース コントロール」を参照してください。

<item_group> は、一連のユーザ インタフェース項目をロールアウトのラベルのついたボックス内に配置し、大きなロールアウトを意味のあるグループに整理するために使用します。

構文を次に示します。

group <group_label_string> 
( 
{ <user_interface_item> } 
) 

group の使用例を次のスクリプトに示します。

例:

utility Infinity "Game Utilities"
(
group "Lighting"
(
label label1d "Number of Day lights:" across:2 offset:[10,0]
label label2d "0" offset:[10,0]
label label1n "Number of Night lights:" across:2 offset:[13,0]
label label2n "0" offset:[10,0]
label label3
Radiobuttons WhichOn "Active Lights:" labels:#("Day","Night")
)
group "Scene Data Dump"
(
Button scenedump "Dump Scene Data"
)
group "Exclusions/Inclusions"
(
Button DispExcl "Unhide Exclusions&Inclusions"
)
group "Camera Mattes"
(
radiobuttons CamMatte labels:#("None","1","2","3","4") columns:3
)
Button resetb "Reset"
)
createDialog infinity

上記のスクリプトが生成するユーティリティ パネル ロールアウトは、次の図のようになります。

グループ ユーザ インタフェース項目を使用したゲーム ユーティリティのロールアウト

注:グループは、技術的にはユーザ インタフェース コントロールではありません。インタフェース コントロールであるグループを使用する場合は、GroupBox ユーザ インタフェース コントロールの使用を考えてみてください。

内部的には、グループは GroupStartControl クラスと GroupEndControl クラスの 2 つのコントロールとして実装され、グループ化されたユーザ インタフェースをカッコのように取り囲みます。

3ds Max 8 以降では、ロールアウトの .controls プロパティを使用してアクセスすれば、 .caption プロパティにアクセスして、これらを変更することができます。この機能は以前のバージョンにはなかったものです。

例:

rollout test "Test"
(
group "Group"
(
button pressme "Press Me"
)
)
createDialog test
test.controls
test.controls[1].caption = "XXX" --this is the GroupStartControl
test.controls[3].caption = "Test me" --this is the GroupEndControl
--Both change the group's caption!

3ds Max 2010 以降では、ユーザ インタフェース コントロールのイベント ハンドラは、グループの本体に含めることができます。旧バージョンの 3ds Max では、イベント ハンドラをグループ内部に含めると、構文エラーが発生していました。

例:

rollout test "Test"
(
group "Group"
(
button pressme "Press Me"
--In versions prior to 3ds Max 2010,
--this would have caused a Syntax Error:
on pressme pressed do print "Pressed!"
) --because the handler is inside the group's body.Now allowed.
)
createDialog test

イベント ハンドラ

<event_handler> は、ユーティリティまたはロールアウトに対する特殊な関数定義ローカルで、ユーザがユーザ インタフェース項目を操作したときに処理を実行するために使用します。たとえば、イベント ハンドラはユーザによるボタンの操作、スピナーの調整、ユーティリティやロールアウトの起動/終了、ロールアウト フロータ ウィンドウのリサイズや移動の際に呼び出されます。これらのユーザ アクションは名前付きのイベントを生成し、アクションが発生するとそのイベントに設定されたイベント ハンドラが呼び出されます。イベント ハンドラを定義する構文を次に示します。

on <item_name> <event_name> [ <argument> ] do <expr>

<item_name> には、このハンドラが結びついている項目の名前を指定します。 <event_name> には、処理するイベントのタイプを指定し、ハンドラにさまざまな値を渡すためにオプションの <argument> を使用します。指定できるイベントは、項目のタイプによって異なります。指定可能なイベントを次に示します。

pressed changed picked entered selected resized moved open close

各ユーザ インタフェース項目のタイプに対して使用できるイベントと渡される引数については、各タイプの説明で定義されています。詳細は、「ロールアウト ユーザ インタフェース コントロール」を参照してください。ユーティリティやロールアウトで使用できるイベントと渡される引数については、「ユーティリティおよびロールアウトのプロパティ、メソッド、およびイベント ハンドラ」を参照してください。

スクリプト化されたロールアウト内のイベント ハンドラ関数は、ハンドラをユーザ インタフェース項目のプロパティとして参照することでアクセスや呼び出しができます。イベント ハンドラ関数は、イベント名をサブプロパティ名として使用して、該当項目のサブプロパティとしてアクセスされます。たとえば、スプリプト化されたロールアウトに foo という名前のチェックボックス項目があり、 on foo changed イベント ハンドラを定義した場合は、次のようにイベント ハンドラを呼び出すことができます。

foo.changed true -- call foo's 'changed' handler function, passing argument of true

または、スプリプト ロールアウトに apply という名前のボタン項目があり、 on apply pressed イベント ハンドラを定義した場合は、次のようにイベント ハンドラを呼び出すことができます。

apply.pressed() -- call apply’s 'pressed' handler function, no argument.

イベント ハンドラ関数は、項目のサブプロパティとしてアクセスできます。

ApplyPressedEH = apply.pressed

変数 ApplyPressedEH に対する on apply pressed イベント ハンドラ関数値のコピーを保存します。イベント ハンドラ関数は、この方法でのみ読み込むことができます。このハンドラ関数を別のユーザ定義関数に設定することはできません