MAXScript では、1 つのユーティリティで複数のロールアウトを管理する機能が提供されています。これは 1 つのロールアウトでは扱いにくい大きなスクリプトで書かれたユーティリティなどで有用です。ユーティリティ定義自体に、ユーザ インタフェース項目によって定義される 1 つのメイン ロールアウトがあります。他のロールアウトは、ユーティリティ定義本体の中でネストされたロールアウトとして定義されます。後者のロールアウトは、スクリプト コントロール内の[ユーティリティ] (Utilities)パネルに追加したり、パネルから削除したりすることができます。
ユーティリティ定義内の rollout
句で追加ロールアウトを定義します。
utility foo "name"
(
local ...
spinner ...
...
rollout baz "name"
(
local ...
checkbox ..
on ...
)
...
)
ネストされたロールアウトには、ユーティリティ定義に含めることができる、さらに深くネストされたロールアウト以外のすべての定義を含めることができます。ネストされたロールアウトは、親ユーティリティのロールアウトが開いたり閉じたりするときに自動的に開閉するわけでありません。ユーティリティのオープン ハンドラおよびクローズ ハンドラや関数で明示的に開閉する必要があります。
これには 2 つの関数があります。
addRollout <rollout> [ rolledUp:<boolean> ] removeRollout <rollout>
addRollout()
関数の rolledUp:
パラメータでは、ロールアップされた状態でロールアウトが追加されるかどうかを指定します。この既定値は false
で、ロールアウトは完全に開いた状態で追加されます。追加のロールアウトは、addRollout()
呼び出し順に整理されるので、呼び出す順番に注意して、希望する順序を確保してください。
ネストされたロールアウトは、メイン ユーティリティのロールアウトが閉じられたときにも自動的には削除されません。通常、メイン ユーティリティのクローズ ハンドラで明示的に削除する必要があります。
メイン ユーティリティが開かれたり、閉じられるときに、常に追加のロールアウトを開閉するには、メイン ユーティリティ オープンおよびクローズ ハンドラに addRollout()
および removeRollout()
呼び出しを記述します。
例
on foo open do ( ... addRollout panel_1 addRollout panel_2 rolledUp:true ... ) on foo close do ( ... removeRollout panel_1 removeRollout panel_2 ... )
既に閉じられたロールアウトでの removeRollout()
呼び出しは可能ですが、何も実行しません。ユーティリティ開発中にネストしたロールアウトを閉じることを忘れた場合、MAXScript ユーティリティ全体を閉じると、残りの開いているスクリプトで書かれたロールアウトはすべて削除されます。
ロールアウト定義がユーティリティ内でネストされているため、すべてのローカルおよび関数そしてユーティリティ内の他の項目はネストされたロールアウトに対しては可視で、MAXScript 内の標準のネストされたスコープの後に続きます。つまり、ユーティリティのローカル、ユーザ インタフェース項目および関数に「リーチ アウト」してアクセスします。
逆に、ネストされたロールアウトのユーザ インタフェース項目とローカルはそのロールアウトのプロパティとして示されるので、メイン ユーティリティや他のロールアウト内のコードはその項目およびローカルに「リーチ イン」して、アクセスできます。次の例では、スピナーの bar
変更ハンドラが、ネストされたロールアウト baz
のチェック ボックスの状態を参照します。
例
utility foo "name" ( local ... local ... spinner bar ... ... rollout baz "name" ( local ... checkbox baz_enable ... on ... ) ... on bar changed val do if baz.baz_enable.checked == true then...
ロールアウト ボディのカッコの前に category:<integer>
ヘッダー パラメータを指定すれば、ロールアウトのグループ化をコントロールできます。カテゴリ番号によって、ロールアウトが並べ替えられます。以下の例では、ロールアウトは特定の順番で定義および追加されます。ただし、表示されるときは、そのカテゴリ番号の順番に並べ替えられます。
例
( rollout first_rollout "1st Rollout" category:2 ( label rights "First" ) rollout second_rollout "2nd Rollout" category:1 ( label second "Second" ) rf = newRolloutFloater "Rollout Order Test" 200 140 addRollout first_rollout rf addRollout second_rollout rf )