[概要]
平面レイヤーフォルダに並ぶ複数のヌルレイヤーが気になる方へのスクリプト。
気になる方は気になる、プロジェクトウィンドウの平面フォルダーに山積みとなるヌルレイヤー。
このスクリプトでヌルレイヤーを追加していれば、プロジェクト全体で「ヌル 1」しか追加されません。
今回覚えられること
- ヌルオブジェクトの追加方法
- ヌルオブジェクトの判別方法
- undo(取り消し)用の気遣い
- コンポジション内のフッテージをプロジェクトウィンドウの別のフッテージで置換する方法(alt+ドラッグのスクリプトでの記述方法)
- for文でプロジェクトウィンドウからフッテージを削除する際のテクニック
- フッテージが使用済みか未使用かの判別方法
[使い方]
- ヌルを追加したいタイムラインをアクティブにする
- スクリプトを実行する
※タイムライン以外をアクティブにして実行するとエラーが出ます。ヌルを追加するコンポジションを判断できないためですが、エラー時に「タイムラインをアクティブにしてください」と表示させる処理が面倒で入れてません。ご了承を。
[解説]
ヌルオブジェクトの特性として、新規ヌルオブジェクト作成の度に、「ヌル 1」「ヌル2」「ヌル 3」…と連番で追加されていきます。
スクリプトによりヌルを追加し、既にヌルオブジェクトがプロジェクトウィンドウに登録されていれば、追加した「ヌル n」を「ヌル 1」に置き換え、自身を削除します。
既に「ヌル 2」以降がある場合、使用されていなければ削除、もちろんどこかのコンポジションに使用されていれば勝手に削除しません。
app.beginUndoGroup("smartNuller");
var Itm = app.project.items; //全てのアイテムを取得
var actCmp = app.project.activeItem; //選択コンポを取得
var addLyr=actCmp.layers.addNull(); // nullレイヤー追加
for(var i=1;i<=Itm.length;i++){
//[平面]か[ヌル]であることを判別
if( (Itm[i].mainSource == "[object SolidSource]")&&(Itm[i].name=="ヌル 1") ){
addLyr.replaceSource(Itm[i],true);
break;
}
}
for(var i=Itm.length;i>=1;i--){
//使用されていない[ヌル n]のみ削除
if( (Itm[i].mainSource == "[object SolidSource]")&&(Itm[i].name.indexOf("ヌル")!=-1)&&(Itm[i].name!="ヌル 1")&&(Itm[i].usedIn=="") ){
Itm[i].remove();
}
}
app.endUndoGroup();
行ごとの解説
・1,22行目
app.beginUndoGroup();
~
app.endUndoGroup();
このメソッドに挟まれた処理は、After Effectsのundoつまり「取り消し(ctrl+z / cmd+z)」で一手で戻せます。この設定がないと、今回のスクリプトでは4回以上取り消しをしないと、スクリプトの実行前に戻せないという不便なことになります。
処理を連続するスクリプトは、使用者目線では1手で戻せることが望ましいため、基本的にこのundo用のメソッドを使用しておくと親切ですね。
また、
app.beginUndoGroup(“ヌル追加”);
と処理の名前を設定でき、After Effectsメニューの「編集」>「取り消し」に名前が付く他、取り消し時には情報ウィンドウに「取り消し ヌル追加」と表示させられます。名前を付ける際はわかりやすい命名を心がけてください。
自分が分かっているスクリプトを使用するので大きな問題はないと思われますが、一律で「スクリプト処理」などとしていると混乱します。
・3行目
var Itm = app.project.items; //全てのアイテムを取得
プロジェクトウィンドウ内の全てのフォルダ、フッテージを取得します。ヌルオブジェクトの入れ替え、削除でアクセスする必要があるため、変数「Itm」に代入しておきます。
・4行目
var actCmp = app.project.activeItem; //選択コンポを取得
現在アクティブなコンポジションを取得します。ヌルオブジェクトの入れ替えに必要なため、変数「actCmp」に代入しておきます。
・6行目
addLyr=actCmp.layers.addNull(); // nullレイヤー追加
早速ヌルオブジェクトを追加してしまいます。通常の新規ヌルオブジェクト作成と同じく、アクティブコンポジションに新規作成され、プロジェクトウィンドウに「ヌル n」として追加されます。
また、追加と同時に変数「addLyr」に代入し、後でアクセスできるようにしておきます。
・8-14行目
for(var i=1;i<=Itm.length;i++){
//[平面]か[ヌル]であることを判別
if( (Itm[i].mainSource == "[object SolidSource]")&&(Itm[i].name=="ヌル 1") ){
addLyr.replaceSource(Itm[i],true);
break;
}
}
プロジェクトウィンドウ内全アイテムを調べていきます。Itm[i]は「プロジェクトウィンドウの上からn番目のアイテム」ということで、フォルダだろうがコンポジションだろうがpngファイルだろうが1つとして数えられます。0番目はないため、i=1から開始となります。
1番目から、全アイテムの個数(Itm.length)回、iを1足しながらfor文をループしていきます。例えばn回目のforループでは、n番目のアイテムが[object SolidSource]か、また名前が「ヌル 1」かを判別していきます。
プロジェクトウィンドウ内のアイテムのソースが[object SolidSource]であれば、ヌルオブジェクトか平面レイヤーということが判別できるので、さらにそのソースの名前が「ヌル 1」か判別すれば、ヌルレイヤーとほぼ確定できます。
名前だけで判別して良いのですが、過去に「ヌル」というコンポジションを作ったことがあるため、ヌルオブジェクトではない「ヌル 1」という名前のフォルダやコンポジションを作る可能性を考慮し、念の為[object SolidSource]であるかの判別もしているだけです。
for文で回し、i個目のアイテムソースが[object SolidSource]かつ、名前が「ヌル 1」というアイテムがあれば、アクティブコンポジションに追加したばかりのヌルオブジェクトと置換します。
※置換は、通常はタイムライン上のレイヤーを選択し、プロジェクトウィンドウから置換したいフッテージを「altを押しながら」タイムラインにドラッグすることで置換できます。これをスクリプトで行うのが「replaceSource()」です。
初めて作るヌルオブジェクトであれば、入れ替えは無駄になってしまいますが、既に「ヌル 1」がある場合、作ったヌルオブジェクトは「ヌル 2」となるはずで、アクティブコンポジションの「ヌル 2」をアイテムソースの「ヌル 1」で置き換え(addLyr.replaceSource)、「ヌル 2」は使用されていない状態にします。
また、「ヌル 1」が複数あることはまずないため、一つ見つかった時点で上記置き換え処理を行い、breakでfor文を抜けています。
・16-21行目
for(var i=Itm.length;i>=1;i--){
//使用されていない[ヌル n]のみ削除
if( (Itm[i].mainSource == "[object SolidSource]")&&(Itm[i].name.indexOf("ヌル")!=-1)&&(Itm[i].name!="ヌル 1")&&(Itm[i].usedIn=="") ){
Itm[i].remove();
}
}
「ヌル 1」のみ残したいので、for文を逆順で回し、プロジェクトウィンドウの下から全アイテムを比較していきます。例えば今回ヌルを追加したことでヌルオブジェクトが3つになっている場合、初めに「ヌル 3」が見つかり、削除→「ヌル 2」が見つかり、削除→「ヌル 1」が見つかり、削除しない、という処理になります。
なぜ逆順かというと、プロジェクトウィンドウの上からn番目のアイテムを調べているのに、削除処理( .remove() )」をするとその瞬間、次に調べるアイテム番号が1つ飛んでしまうからです。
例えば上から10番目の「ヌル 1」が見つかり、残す→11番目の「ヌル 2」が見つかり、削除→12番目の「ヌル 3」が繰り上がって11番目になる→for文のiが進んで12番目のアイテムを探す←元12番目の「ヌル 3」を飛ばしてしまうことになります。
削除時にiを増やさないなどの面倒な処理が必要になるため、ハナから逆順で調べたほうが早いというわけです。
・18行目詳細
if( (Itm[i].mainSource == "[object SolidSource]")&&
(Itm[i].name.indexOf("ヌル")!=-1)&&
(Itm[i].name!="ヌル 1")&&
(Itm[i].usedIn=="") ){
Itm[i].remove();
}
if文により、プロジェクトウィンドウ内の上からi番目のアイテムが、下記4つの条件に当てはまれば削除( .remove() )します。
条件1:[object SolidSource](平面かヌル)かつ
条件2:名前に「ヌル」が含まれているかつ
条件3:名前が「ヌル 1」”でない”かつ
条件4:コンポジションで使用されていない
これで「ヌル 1」以外の未使用のヌルだけ削除できます。
結果
スクリプトで追加したヌルは「ヌル 1」で置き換えられるため、スクリプト終了後は他に使用済みのヌルを除いて「ヌル 1」に統合され、結果「コンポジション内にヌルオブジェクトを追加したのに、プロジェクトウィンドウにはヌルを増やさない」が実現できました。
この記事へのコメントはありません。