チュートリアル > TrackView のアルファベット順のソート |
通常、3ds Max では、オブジェクトの作成順に TrackView 内にシーンの階層が表示されます。単独のオブジェクトを上下に動かすキーボード ショートカットがある一方で、TrackView をソートし直す組み込み関数はありません。
親となるオブジェクトのリンクを解除するとそのオブジェクトが階層の最下位に移動することを利用して、TrackView 表示を思いどおりにソートする短いスクリプトを作成します。
次のスクリプトで、TrackView 内のオブジェクトをアルファベット順にソートします。
macroScript は AlphaSortTracks と呼ばれます。スクリプトを使用する場合は、[カスタマイズ...](Customize...)に移動してスクリプトを[HowTo]カテゴリからツールバー、メニュー、またはクアッド メニューにドラッグするか、キーボード ショートカットを割り当てることができます。
for ループを使用して、シーン内で検出されたすべてのオブジェクトの名前を names_array という配列内に収集します。
sort メソッドで、配列内のすべての名前がアルファベット順にソートされます。これで名前が正しい順序になったので、その名前を使用してオブジェクトを取り出し、同じ順序で配置します。
リンクおよびリンク解除をシミュレートしてノードを並べ直すために、親として使用する一時的なダミー オブジェクトを作成します。
for ループで、配列にある各名前のインデックスを変数 i の値に割り当てます。この例の場合、 by 1 オプションでは何も実行されませんが、これを -1 にし、始めの値と終わりの値の場所を入れ替えると、ソートが昇順(A-Z)から降順(Z-A)に逆転します。
getNodeByName 関数を使用して、オブジェクト名を nodePath 値に変換します。これで、オブジェクトが正しい順序になりました。変数 i は、名前の配列の i 番目の要素を取得するインデックスとして使用されます。
「ワールドの子」、つまり親にリンクされていないトップ レベルのオブジェクトのみをソートします。これが、オブジェクトに親があるかどうかをチェックする必要がある理由です。何もない場合、つまり parent プロパティが undefined を返す場合には、先へ進むことができます。
ダミー オブジェクトを . parent プロパティに割り当てることによって、名前のソート後に作成した一時的なダミーにノードをリンクします。 undefined を同じプロパティに割り当てて再度リンクを解除し、それをシーンのノード データベースの最後に送ります。
スクリプトを評価します。スクリプトを使用する場合は、[カスタマイズ...](Customize...)を使用してスクリプトを[HowTo]カテゴリからツールバー、メニュー、またはクアッド メニューにドラッグするか、キーボード ショートカットを割り当てることができます。オブジェクトをいくつか作成して TrackView を開き、現在のオブジェクトの順序を確認します。この macroScript を実行して、TrackView 内の順序と比較します。 現在、ノードはアルファベット順に表示されています。
ステップごとの解説で既に説明したように、 for ループを次のように変更するだけで、
ソート順が逆になります。このスクリプトの 2 番目のバージョンには、次のような名前を付けることができます。
または、同じスクリプト内で、希望するソート順をユーザに尋ねるプロンプトを追加することもできます。
発展版の別なアイデアとして、たとえばクラスなどの追加のプロパティに基づいてオブジェクトをソートするような、スクリプトの変更があります。この場合、Geometry、Lights、Helpers などのクラス別にブロック化し、そのクラス ブロック内でアルファベット順にソートします。