チュートリアル - TrackView のアルファベット順のソート

チュートリアル > TrackView のアルファベット順のソート

通常、3ds Max では、オブジェクトの作成順に TrackView 内にシーンの階層が表示されます。単独のオブジェクトを上下に動かすキーボード ショートカットがある一方で、TrackView をソートし直す組み込み関数はありません。

親となるオブジェクトのリンクを解除するとそのオブジェクトが階層の最下位に移動することを利用して、TrackView 表示を思いどおりにソートする短いスクリプトを作成します。

次のスクリプトで、TrackView 内のオブジェクトをアルファベット順にソートします。

関連トピック:

Macro Script の定義

Parent_Node_Property

全体の流れ:

ボタン、メニュー項目またはショートカットとして使用できる macroScript としてコードをパッケージ化します。

シーン内のすべてのオブジェクトの名前を収集します。

名前をアルファベット順にソートします。

リンク用に一時的なヘルパーを作成します。

各オブジェクトのパスをその名前を使用して解決します。

オブジェクトに親がない場合は、一時ヘルパーにリンクし、再度リンクを解除して、そのオブジェクトをデータベースの最後に移動します。

一時オブジェクトを削除します。

MAXScript

macroScript AlphaSortTracks category:"HowTo"
(
 names_array = for i in $* collect i.name
 sort names_array
 d = dummy()
 for i = 1 to names_array.count by 1 do
 (
  node_by_name = getNodeByName names_array[i]
  if node_by_name.parent == undefined then
  (
   node_by_name.parent = d
   node_by_name.parent = undefined
  )
 )--end i loop
 delete d
)--end macroScript

ステップごとの解説

macroScript AlphaSortTracks category:"HowTo"
(

macroScript は AlphaSortTracks と呼ばれます。スクリプトを使用する場合は、[カスタマイズ...](Customize...)に移動してスクリプトを[HowTo]カテゴリからツールバー、メニュー、またはクアッド メニューにドラッグするか、キーボード ショートカットを割り当てることができます。

マクロ スクリプトの定義

names_array = for i in $* collect i.name

for ループを使用して、シーン内で検出されたすべてのオブジェクトの名前を names_array という配列内に収集します。

for ループ

Sort names_array

sort メソッドで、配列内のすべての名前がアルファベット順にソートされます。これで名前が正しい順序になったので、その名前を使用してオブジェクトを取り出し、同じ順序で配置します。

Sort_Array

d = dummy()

リンクおよびリンク解除をシミュレートしてノードを並べ直すために、親として使用する一時的なダミー オブジェクトを作成します。

Dummy: ヘルパー

for i = 1 to names_array.count by 1 do
(

for ループで、配列にある各名前のインデックスを変数 i の値に割り当てます。この例の場合、 by 1 オプションでは何も実行されませんが、これを -1 にし、始めの値と終わりの値の場所を入れ替えると、ソートが昇順(A-Z)から降順(Z-A)に逆転します。

for ループ

node_by_name = getNodeByName names_array[i]

getNodeByName 関数を使用して、オブジェクト名を nodePath 値に変換します。これで、オブジェクトが正しい順序になりました。変数 i は、名前の配列の i 番目の要素を取得するインデックスとして使用されます。

getNodeByName

配列の値

if node_by_name.parent == undefined then
(

「ワールドの子」、つまり親にリンクされていないトップ レベルのオブジェクトのみをソートします。これが、オブジェクトに親があるかどうかをチェックする必要がある理由です。何もない場合、つまり parent プロパティが undefined を返す場合には、先へ進むことができます。

node_by_name.parent = d
node_by_name.parent = undefined

ダミー オブジェクトを . parent プロパティに割り当てることによって、名前のソート後に作成した一時的なダミーにノードをリンクします。 undefined を同じプロパティに割り当てて再度リンクを解除し、それをシーンのノード データベースの最後に送ります。

Parent_Node_Property

Undefined 値

)
)--end i loop
delete d

ここで、ループが終了したので、一時的なダミーを削除することができます。

)--end macroScript

スクリプトの使い方

スクリプトを評価します。スクリプトを使用する場合は、[カスタマイズ...](Customize...)を使用してスクリプトを[HowTo]カテゴリからツールバー、メニュー、またはクアッド メニューにドラッグするか、キーボード ショートカットを割り当てることができます。オブジェクトをいくつか作成して TrackView を開き、現在のオブジェクトの順序を確認します。この macroScript を実行して、TrackView 内の順序と比較します。 現在、ノードはアルファベット順に表示されています。

関連項目

ステップごとの解説で既に説明したように、 for ループを次のように変更するだけで、

for i = names_array.count to 1 by -1 do

ソート順が逆になります。このスクリプトの 2 番目のバージョンには、次のような名前を付けることができます。

macroScript RevSortTracks category:"HowTo"

または、同じスクリプト内で、希望するソート順をユーザに尋ねるプロンプトを追加することもできます。

発展版の別なアイデアとして、たとえばクラスなどの追加のプロパティに基づいてオブジェクトをソートするような、スクリプトの変更があります。この場合、Geometry、Lights、Helpers などのクラス別にブロック化し、そのクラス ブロック内でアルファベット順にソートします。

戻る

「チュートリアル」のインデックス ページ