【AE】フォルダ構成を作る【自動化】

こんにちは。
チームや外部協力者とAfter Effectsを使った作業をする場合に、データ作成の規則などを用意する場面が多いと思います。
その際に、コンポジションやフッテージの格納場所について取り決めることが多いですが、それを都度手動で作成することは非常に手間がかかりますね。
テンプレートとなるプロジェクトを使用していることもあるでしょうが、もし制御するプログラムの仕様が変更になった場合はそれでは対応しきれません。

という訳で、フォルダ構成を作成するスクリプトです。
必要なフォルダ構成への改変については後述します。

■スクリプト


{
   app.beginUndoGroup( "Create Folders" );

   var folders = [
       // フォルダ名,  コメント,   親フォルダの要素番号
       [ "_product", "製品コンポジション", 0 ],
       [ "layer", "productに配置するコンポジション", 0 ],
       [ "parts1", "部品1", 1 ],      // 1番目のフォルダに追加する
       [ "parts2", "部品2", 1 ],      // 1番目のフォルダに追加する
       [ "footage", "フッテージ", 0 ],
   ];

   var itemString = new Array(), itemPath = new Array();
   var TOKEN = "@@@";
   itemString.push( "" );

   // ルート直下のフォルダ名を調べる
   for( var i = 1; i <= app.project.items.length; i ++ ){
       var item = app.project.items[i];
       if( !(item instanceof FolderItem) || (item.parentFolder != app.project.rootFolder) ) continue;

       itemString.push( item.name );
       itemPath.push( item );
   }

   // ルート直下のフォルダを作る
   var newFolders = new Array();
   for( var i = 0; i < folders.length; i ++ ){
       var _item = undefined;
       if( itemString.join( TOKEN ).indexOf( TOKEN + folders[i][0] ) == -1 ){
           if( folders[i][2] == 0 ){
               _item = app.project.items.addFolder( folders[i][0] );
               _item.comment = folders[i][1];
           }
       }
       else {
           // a = アイテム名の連結文字列を対象の文字列までで区切った要素数が対象の要素番号
           var targetItemPlace = itemString.join( TOKEN ).indexOf( TOKEN + folders[i][0] );
           var a = itemString.join( TOKEN ).slice( targetItemPlace )[0].slice( TOKEN ).length;
           _item = itemPath[a];
       }
       newFolders.push( _item );
   }
   // サブフォルダを作る
   for( var i = 0; i < folders.length; i ++ ){
       if( folders[i][2] != 0 ){
           var targetName = folders[folders[i][2]][0];
           var targetFolder = undefined;
           // 親フォルダが既存だった場合
           for( var j = 0; j < itemPath.length; j ++ ){
               if( targetName == itemPath[j].name ){
                   targetFolder = itemPath[j];
                   break;
               }
           }
           // 親フォルダも新規の場合
           if( targetFolder== undefined ) targetFolder = newFolders[folders[i][2]];
           //
           var subitemString = new Array();
           subitemString.push( "" );
           for( var k = 1; k <= targetFolder.items.length; k ++ ){ subitemString.push( targetFolder.items[k].name ); }
           if( subitemString.join( TOKEN ).indexOf( TOKEN + folders[i][0] ) == -1 ){
               if( targetFolder != undefined ){
                   var _subitem = targetFolder.items.addFolder( folders[i][0] );
                   _subitem.comment = folders[i][1];
               } 
           }
       }
   }

   app.endUndoGroup();
}

■使い方

実行するのみです。
AECS6以降のバージョンでは問題なく動作します。
それよりも古いバージョンでは動作未検証です。

なお、アンドゥ操作は可能です。

■機能説明

このスクリプトでは、既存プロジェクトに対して実行してもフォルダの重複をせずに不足分のみを作成できます。
ただし、作成する構成はルートフォルダ直下とそのサブフォルダ1階層分までです。

AEP作成時に1回のみの実行であれば何階層でも自由に作成できますが、それでは事後実行が難しく、また、うっかり複数回実行してしまった場合に却って面倒なことになってしまいます。
そのため今回はフォルダ階層の作成数を1階層のものとしました。

■改変について

先頭の folders[][] の第二要素は

["作成するフォルダ名", "そのフォルダのコメント", サブフォルダの場合の対象要素番号 ]

となっています。
この作成するフォルダ名コメントを編集したり、第一要素の項目を増やして実際の業務や規則に適った形に改変して使用してください。

また、第二要素に項目を追加し、第二要素の第四要素としてラベルカラーの設定などを行う場合は、下記の「★」部分を追記することで実現できますので、必要に応じて同様の対応を行ってください。

{
   var folders = [
       // フォルダ名,  コメント,   親フォルダの要素番号,    ★ラベルカラー
       [ "layer", "productに配置するコンポジション", 0, 1 ],
       [ "parts1", "部品1", 1, 2 ],      // 1番目のフォルダに追加する ★
       [ "parts2", "部品2", 1, 2 ],      // 1番目のフォルダに追加する ★
   ];
   
   ~ 中略 ~
   
   // ルート直下のフォルダを作る
   var newFolders = new Array();
   for( var i = 0; i < folders.length; i ++ ){
       var _item = undefined;
       if( itemString.join( TOKEN ).indexOf( TOKEN + folders[i][0] ) == -1 ){
           if( folders[i][2] == 0 ){
               _item = app.project.items.addFolder( folders[i][0] );
               _item.comment = folders[i][1];
               _item.label = folders[i][3];    // ★
           }
       }
       ~ 中略 ~
   }
   // サブフォルダを作る
   for( var i = 0; i < folders.length; i ++ ){
       if( folders[i][2] != 0 ){
           ~ 中略 ~
           if( subitemString.join( TOKEN ).indexOf( TOKEN + folders[i][0] ) == -1 ){
                if( targetFolder != undefined ){
                   var _subitem = targetFolder.items.addFolder( folders[i][0] );
                   _subitem.comment = folders[i][1];
                   _subitem.label= folders[i][3];    // ★
               }
           }
       }
    }
}


■あとがき

作業者によってフォルダ構成が異なっていたり、コメントの有無や内容の違いによってそれを利用するプログラマや別の作業者(引継ぎなどがあった場合)に混乱を生むことが往々にして起こると思います。

そういったことを解消する一番簡単な方法は規則化し、それを機械化することだと思います。特にフォルダ構成の用意などは基本的に創造性(=クリエイティビティ)を含まない作業ですので関係する作業者の手を煩わせないようにしたいところですね。

それでは便利なAEライフを٩( 'ω' )و

この記事が気に入ったらサポートをしてみませんか?