通常、3ds Max では、オブジェクトの作成順に TrackView 内にシーンの階層が表示されます。単独のオブジェクトを上下に動かすキーボード ショートカットがある一方で、TrackView をソートし直す組み込み関数はありません。
親となるオブジェクトのリンクを解除するとそのオブジェクトが階層の最下位に移動することを利用して、TrackView 表示を思いどおりにソートする短いスクリプトを作成します。
次のスクリプトで、TrackView 内のオブジェクトをアルファベット順にソートします。
関連トピック:
全体の流れ:
ボタン、メニュー項目またはショートカットとして使用できる 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
という配列内に収集します。
Sort names_array
sort
メソッドで、配列内のすべての名前がアルファベット順にソートされます。これで名前が正しい順序になったので、その名前を使用してオブジェクトを取り出し、同じ順序で配置します。
d = dummy()
リンクおよびリンク解除をシミュレートしてノードを並べ直すために、親として使用する一時的なダミー オブジェクトを作成します。
for i = 1 to names_array.count by 1 do
(
for ループで、配列にある各名前のインデックスを変数 i.
の値に割り当てます。この例の場合、by 1
オプションでは何も実行されませんが、これを –1
にし、始めの値と終わりの値の場所を入れ替えると、ソートが昇順(A-Z)から降順(Z-A)に逆転します。
node_by_name = getNodeByName names_array[i]
getNodeByName
関数を使用して、オブジェクト名を nodePath 値に変換します。これで、オブジェクトが正しい順序になりました。変数 i
は、名前の配列の i 番目の要素を取得するインデックスとして使用されます。
if node_by_name.parent == undefined then
(
「ワールドの子」、つまり親にリンクされていないトップ レベルのオブジェクトのみをソートします。これが、オブジェクトに親があるかどうかをチェックする必要がある理由です。何もない場合、つまり parent
プロパティが undefined
を返す場合には、先へ進むことができます。
node_by_name.parent = d
node_by_name.parent = undefined
.parent
プロパティにダミー オブジェクトを割り当てることによって、名前のソート後に作成した一時ダミーにノードをリンクします。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 などのクラス別にブロック化し、そのクラス ブロック内でアルファベット順にソートします。
戻る