スクリプトで書かれたユーティリティでの複数のロールアウトの管理

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
   )