AEスクリプトでレイヤーやエフェクトを一括削除する
- 2023/04/12
After Effectsのレイヤーやエフェクトを一括で削除するAEスクリプトを書いてみましたのでご紹介します!
コピー&ペーストで大量のレイヤーやエフェクトをつくるのは簡単ですが、それを1つずつ手で削除しようとすると大変だったりします。そんなときはスクリプトに自動処理をさせて、楽をしましょう。
なお、削除するスクリプトを使うときは、いつでも前の状態に戻れるように、別名保存してバックアップファイルを保存しておいてから実行することをオススメします。ここで紹介するスクリプトによって損害が生じても補償はできませんので、皆様のご判断と責任でご利用ください。
プロジェクトパネルでコンポジションを選択(複数可)して、このスクリプトを実行します。
コンポジション内の無効になっている(目のスイッチがオフになっている)レイヤーを削除します。
こだわりポイントとしては、無効になっているレイヤーでも、他のレイヤーのトラックマットとして使用されている場合は必要なレイヤーと思われるため、「無効で、かつ他のレイヤーにトラックマットとして使用されていないレイヤー」を削除するようにしています。さらに、トラックマットとして使用されているとしても、その使用している側のレイヤーが無効になっていれば削除すべきなので、上からではなく下から1レイヤーずつ判定して削除していく、という仕組みにしています。
この部分を書き換えれば、いろいろと応用できます。
たとえば、代わりに以下のように書けば「調整レイヤーなら削除する」というスクリプトになります。
ガイドレイヤーなら削除する
ヌルレイヤーなら削除する
音声のみのレイヤーなら削除する
レイヤー名が「カラコレ」に一致するなら削除する
レイヤー名に「カラコレ」という文字列が含まれるなら削除する
こんな感じで、いろんなパターンに改造できそうです。
では、今度はエフェクトも削除してみたいと思います。
プロジェクトパネルでコンポジションを選択(複数可)して、このスクリプトを実行します。
コンポジション内のレイヤーに適用されている「無効になっているエフェクト」をすべて削除します。
ちなみに、今回のこの.activeという書き方では、エフェクト自体の「fx」スイッチはオンになっていても、そのレイヤー自体の持つ「fx」スイッチがオフになっていると削除されます。
もしエフェクト自体の「fx」スイッチがオフになっているときだけ削除したいなら、.enabledという書き方になります。
また、そもそもこの部分を消してしまえば、エフェクトが無効であろうと有効であろうと、すべてのエフェクトを削除するスクリプトになります。
あるいは、代わりに以下のように書けば、「色相/彩度エフェクトであれば削除する」というスクリプトになります。
ここで、今登場したmatchNameについて補足します。これではなぜダメなのか?
上記のように書くことも可能ですが、.nameで取得するのは表示上の名前なので、たとえば「色相/彩度 2」のように表示上のエフェクト名が変わってしまっている場合に判定できない問題があります。そのため、エフェクトの判定にはmatchNameという内部的に決まっている名前を使うのがオススメなのです。
それぞれのエフェクトが持つ真の名前、matchNameを調べたいときは、エフェクトを適用したレイヤーを選択してから、以下のスクリプトを実行してみてください。
さらに応用で、エフェクトを削除するのではなく、「色相/彩度エフェクトであれば無効(fxスイッチをオフ)にする」というスクリプトも書くことができます。さっき出てきたenabledとmatchNameの組み合わせです。
こんな感じで、良かったらいろいろ改造して使ってみてください。
なお、上記のスクリプトでは「プロジェクトパネルでコンポジションを選択して実行する」ツールでしたが、「すべてのコンポジションに対して実行する」ツールにすることもできます。処理対象のコンポを取得する部分をこのように書き換えるだけです。
ご使用の際は、くれぐれも自己責任でお願いします。
プログラミングは、常にバグとの戦いです。
グッドラック。
コピー&ペーストで大量のレイヤーやエフェクトをつくるのは簡単ですが、それを1つずつ手で削除しようとすると大変だったりします。そんなときはスクリプトに自動処理をさせて、楽をしましょう。
なお、削除するスクリプトを使うときは、いつでも前の状態に戻れるように、別名保存してバックアップファイルを保存しておいてから実行することをオススメします。ここで紹介するスクリプトによって損害が生じても補償はできませんので、皆様のご判断と責任でご利用ください。
無効のレイヤーを一括で削除する
プロジェクトパネルでコンポジションを選択(複数可)して、このスクリプトを実行します。
コンポジション内の無効になっている(目のスイッチがオフになっている)レイヤーを削除します。
//myCompsという空の配列をつくっておく
var myComps = new Array();
//選択アイテムをselItemとする
var selItem = app.project.selection;
//selItemの数だけ繰り返し、selItem[i]がコンポなら配列 myComps に追加
for(var i = 0; i < selItem.length; i++){
if(selItem[i] instanceof CompItem){
myComps.push(selItem[i]);
}
}
//繰り返し終了、myCompsの取得が完了
//myCompsの数が0ではないなら処理に入り、そうでなければ警告メッセージを表示
if(myComps.length !=0){
//Ctrl+Zで戻れるためアンドゥ・グループ
app.beginUndoGroup("Delete_Disabled_Layers");
var count=0;
for(var i=0; i < myComps.length; i++) {
//下のレイヤーから処理したいので、レイヤー番号を減算でカウントダウンで繰り返し
for(j=myComps[i].layers.length; j>0; j--){
if(myComps[i].layers[j].enabled==false && myComps[i].layers[j].isTrackMatte==false){
//レイヤーのロックを外す。外さずに削除しようとするとエラーになる。
myComps[i].layers[j].locked=false;
//削除
myComps[i].layers[j].remove();
count++;
}
}
}
app.endUndoGroup();
alert("選択された " + myComps.length + " 個のコンポジションを調べました。\n\n無効になっていた " + count + " 個のレイヤーを削除しました。");
}
else{
alert("プロジェクトパネルでコンポジションを選択して実行してください。");
}
こだわりポイントとしては、無効になっているレイヤーでも、他のレイヤーのトラックマットとして使用されている場合は必要なレイヤーと思われるため、「無効で、かつ他のレイヤーにトラックマットとして使用されていないレイヤー」を削除するようにしています。さらに、トラックマットとして使用されているとしても、その使用している側のレイヤーが無効になっていれば削除すべきなので、上からではなく下から1レイヤーずつ判定して削除していく、という仕組みにしています。
この部分を書き換えれば、いろいろと応用できます。
if(myComps[i].layers[j].enabled==false && myComps[i].layers[j].isTrackMatte==false){
}
たとえば、代わりに以下のように書けば「調整レイヤーなら削除する」というスクリプトになります。
if(myComps[i].layers[j].adjustmentLayer==true){
}
ガイドレイヤーなら削除する
if(myComps[i].layers[j].guideLayer==true){
}
ヌルレイヤーなら削除する
if(myComps[i].layers[j].nullLayer==true){
}
音声のみのレイヤーなら削除する
if(myComps[i].layers[j].hasVideo==false){
}
レイヤー名が「カラコレ」に一致するなら削除する
if(myComps[i].layers[j].name=="カラコレ"){
}
レイヤー名に「カラコレ」という文字列が含まれるなら削除する
if (myComps[i].layers[j].name.indexOf("カラコレ") != -1) {
}
こんな感じで、いろんなパターンに改造できそうです。
では、今度はエフェクトも削除してみたいと思います。
無効のエフェクトを一括で削除する
プロジェクトパネルでコンポジションを選択(複数可)して、このスクリプトを実行します。
コンポジション内のレイヤーに適用されている「無効になっているエフェクト」をすべて削除します。
//myCompsという空の配列をつくっておく
var myComps = new Array();
//選択アイテムをselItemとする
var selItem = app.project.selection;
//selItemの数だけ繰り返し、selItem[i]がコンポなら配列 myComps に追加
for(var i = 0; i < selItem.length; i++){
if(selItem[i] instanceof CompItem){
myComps.push(selItem[i]);
}
}
//繰り返し終了、myCompsの取得が完了
//myCompsの数が0ではないなら処理に入り、そうでなければメッセージを表示
if(myComps.length !=0){
//Ctrl+Zで戻れるためアンドゥ・グループ
app.beginUndoGroup("Delete_Disabled_Effects");
var count=0;
for(var i=0; i < myComps.length; i++) {
for(var j = 1; j <= myComps[i].layers.length; j++){
fxGroup = myComps[i].layers[j].property("ADBE Effect Parade");
if( fxGroup != null){
//下のエフェクトから処理、減算でカウントダウンで繰り返し
for( var k = fxGroup.numProperties; k>0; k--){
if(fxGroup.property(k).active==false){
fxGroup.property(k).remove();
count++;
}
}
}
}
}
app.endUndoGroup();
alert("選択された " + myComps.length + " 個のコンポジションを調べました。\n\n無効になっていた " + count + " 個のエフェクトを削除しました。");
}
else{
alert("プロジェクトパネルでコンポジションを選択して実行してください。");
}
ちなみに、今回のこの.activeという書き方では、エフェクト自体の「fx」スイッチはオンになっていても、そのレイヤー自体の持つ「fx」スイッチがオフになっていると削除されます。
if(fxGroup.property(k).active==false){
}
もしエフェクト自体の「fx」スイッチがオフになっているときだけ削除したいなら、.enabledという書き方になります。
if(fxGroup.property(k).enabled==false){
}
また、そもそもこの部分を消してしまえば、エフェクトが無効であろうと有効であろうと、すべてのエフェクトを削除するスクリプトになります。
if(fxGroup.property(k).active==false){
}
あるいは、代わりに以下のように書けば、「色相/彩度エフェクトであれば削除する」というスクリプトになります。
if(fxGroup.property(k).matchName=="ADBE HUE SATURATION"){
}
ここで、今登場したmatchNameについて補足します。これではなぜダメなのか?
if(fxGroup.property(k).name=="色相/彩度"){
}
上記のように書くことも可能ですが、.nameで取得するのは表示上の名前なので、たとえば「色相/彩度 2」のように表示上のエフェクト名が変わってしまっている場合に判定できない問題があります。そのため、エフェクトの判定にはmatchNameという内部的に決まっている名前を使うのがオススメなのです。
それぞれのエフェクトが持つ真の名前、matchNameを調べたいときは、エフェクトを適用したレイヤーを選択してから、以下のスクリプトを実行してみてください。
//選択しているレイヤー(1つめ)をselLayerとする
var selLayer = app.project.activeItem.selectedLayers[0];
//1つめのエフェクトのmatchNameをアラート表示
alert(selLayer.property("effect").property(1).matchName);
さらに応用で、エフェクトを削除するのではなく、「色相/彩度エフェクトであれば無効(fxスイッチをオフ)にする」というスクリプトも書くことができます。さっき出てきたenabledとmatchNameの組み合わせです。
if(fxGroup.property(k).matchName=="ADBE HUE SATURATION"){
fxGroup.property(k).enabled=false;
}
こんな感じで、良かったらいろいろ改造して使ってみてください。
終わりに
なお、上記のスクリプトでは「プロジェクトパネルでコンポジションを選択して実行する」ツールでしたが、「すべてのコンポジションに対して実行する」ツールにすることもできます。処理対象のコンポを取得する部分をこのように書き換えるだけです。
//myCompsという空の配列をつくっておく
var myComps = new Array();
//Itemの数だけ繰り返し、コンポなら配列 myComps に追加
for(var i = 1; i <= app.project.numItems; i++){
if(app.project.items[i] instanceof CompItem){
myComps.push(app.project.items[i]);
}
}
//繰り返し終了、myCompsの取得が完了
ご使用の際は、くれぐれも自己責任でお願いします。
プログラミングは、常にバグとの戦いです。
グッドラック。
- 関連記事
-
- AEスクリプトでレイヤーやエフェクトを一括削除する (2023/04/12)
- AEスクリプトのUIでイベントハンドラを使ってみる (2017/02/28)
- AEスクリプトでウィンドウ(GUI)をつくる方法 (2017/02/22)
- AEスクリプトで自分だけのレンダー設定ツールをつくって効率化する! (2014/10/12)