よく使うスクリプト内の処理【AfterEffects】

よく使うものその1 備忘録的に

・選択レイヤーのリストを作成
・プロパティリンク複製
・親子関係を探索
・親をヌルとして複製して親子付け
・親付きプリコンポーズ
・プロパティリンク用の重複名称解消

//選択レイヤーのリストを作成
//引数
//activeComp:作業場所コンポ
//戻り値
//selectedLayers:選択したレイヤーが選択順で入った配列
function gSLs(activeComp){
    var Length = activeComp.selectedLayers.length;
    var selectedLayers = new Array(); 
    for(j=0; j< Length; j++){
            selectedLayers[j] = activeComp.selectedLayers[j];
            }
        return selectedLayers;
        }

//プロパティリンク複製(ライト非対応)
//引数
//activeComp:作業場所コンポ
//Root:複製もとのレイヤー カメラは判定
//戻り値
//Child:複製されたレイヤー
function PropertyLinkDup(Root,activeComp){
    var Child = Root.duplicate();
    Child.name = Root.name + "PropertyLink"
    Child.position.expression = "comp(\"" + activeComp.name + "\").layer(\"" + Root.name + "\").transform.position;";
    if(Child.threeDLayer){
        Child.transform.orientation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Root.name + "\").transform.orientation;";
        Child.transform.xRotation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Root.name + "\").transform.xRotation;";
        Child.transform.yRotation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Root.name + "\").transform.yRotation;";
        Child.transform.zRotation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Root.name + "\").transform.zRotation;";
        }else{Child.rotation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Root.name + "\").transform.rotation;";
            }
        if(Child.cameraOption){
            Child.cameraOption.zoom.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Root.name + "\").cameraOption.zoom;";
            }else{
                Child.scale.expression = "comp(\"" + activeComp.name + "\").layer(\"" + Root.name + "\").transform.scale;";
                Child.anchorPoint.expression = "comp(\"" + activeComp.name + "\").layer(\"" + Root.name + "\").transform.anchorPoint;";
                }
            return Child;
            }

//親子関係を探索
//引数
//activeComp:作業場所コンポ
//Root:探索元の子
//戻り値
//Parent:親が若い方から順に入った配列
function SearchParent(Root,activeComp){
        var Parent = new Array();
        Parent[0] = Root.parent;
        var i=0;
        while(Parent[i]){
            i++;
            Parent[i] = Parent[i-1].parent;
            }
        Parent.pop();
        return Parent
        }

//親をヌルとして複製して親子付け
//引数
//activeComp:作業場所コンポ
//Layer:子
//戻り値
//Null:親にリンクしたヌルが若い方から順に入った配列
//SearchParent使用
function ParentConvertToNulls(Layer,activeComp){
    var Parent = SearchParent(Layer,activeComp)
        //親をヌルとして複製
        var Null = new Array();
        var Inpoint = Layer.inPoint
        for(j=0;j<Parent.length; j++){
            Null[j] = activeComp.layers.addNull();
            Null[j].startTime = Inpoint;
            Null[j].name = Parent[j].name + "null";
            Null[j].position.expression = "comp(\"" + activeComp.name + "\").layer(\"" + Parent[j].name + "\").transform.position;";
            Null[j].scale.expression = "comp(\"" + activeComp.name + "\").layer(\"" + Parent[j].name + "\").transform.scale;";
            Null[j].anchorPoint.expression = "comp(\"" + activeComp.name + "\").layer(\"" + Parent[j].name + "\").transform.anchorPoint;";
            if(Parent[j].threeDLayer){
                Null[j].threeDLayer = true;
                Null[j].transform.orientation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Parent[j].name + "\").transform.orientation;";
                Null[j].transform.xRotation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Parent[j].name + "\").transform.xRotation;";
                Null[j].transform.yRotation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Parent[j].name + "\").transform.yRotation;";
                Null[j].transform.zRotation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Parent[j].name + "\").transform.zRotation;";
                }else{Null[j].rotation.expression = "comp(\"" + activeComp.name + "\").layer(\"" +Parent[j].name + "\").transform.rotation;";
                    }
            }
        //ヌルと親子付け
        Layer.setParentWithJump(Null[0])
        for(j=0;j<Parent.length-1; j++){
            Null[j].setParentWithJump(Null[j+1]);
            }
        return Null
        }   

//親付きプリコンポーズ
//引数
//activeComp:作業場所コンポ
//Layer:プリコン対象の子
//戻り値
//obj オブジェクト
//obj.MakedComp:作られたコンポへのアクセス
//obj.MakedCompLayer作られたコンポへのactiveCompでのレイヤーとしてのアクセス
//ParentConvertToNulls,PropertyLinkDup使用
function PPC(Layer,HeadName,activeComp){
     var DupParents = ParentConvertToNulls(Layer,activeComp);
     //3dの場合を処理
     var activeCam = activeComp.activeCamera;
     if(Layer.threeDLayer){
         var DupCam = PropertyLinkDup(activeCam,activeComp);
         var CamParents =  ParentConvertToNulls(DupCam,activeComp);
         }
     //precomposeメソッド用インデックス生成
     var PPCIndex = new Array(); 
     PPCIndex[0] = Layer.index;
     for(k=0;k<DupParents.length;k++){
         PPCIndex[k+1] = DupParents [k].index;
         }
     if(Layer.threeDLayer){
        var CamAroundIndex = new Array(); 
        CamAroundIndex[0] = DupCam.index;
        for(k=0;k<CamParents.length;k++){
            CamAroundIndex[k+1] = CamParents[k].index;
            }
        PPCIndex = PPCIndex.concat(CamAroundIndex);
        }
     //precompose
     var minIndex = Math.min.apply(null,PPCIndex)
     var makedComp = activeComp.layers.precompose(PPCIndex, HeadName + Layer.name, true);
     var makedCompLayer = activeComp.layer(minIndex);
     //戻り値を整える
     var obj = new Object();
     obj.MakedComp = makedComp;
     obj.MakedCompLayer = makedCompLayer;
     return obj;
     }

// プロパティリンク用の重複名称解消
//引数
//Layers:重複名称をチェックしたいレイヤーの配列
//戻り値
//なし
function AvoidSameName(Layers){
    var storage= {};
    var i,value;
    for (i=0;i<Layers.length;i++){
        value = Layers[i];
        if (!(value in storage)) {
            storage[value]= '';
            }else{
                Layers[i].name = Layers[i].name + "_" + String(i);
                }
            }
        }

で例えばディスプレイメントマップやベクトルブラーを使った歪みのマットを自動でつけるとか結構便利かもしれない

var activeComp= app.project.activeItem;
if(activeComp){
    var Select = gSLs(activeComp);
    if(Select.length>0){
        app.beginUndoGroup("gG_AutoDisplacement");
        //重複名称チェック
        var Check = new Array();
        for (i=0;i<Select.length;i++){
            Check.concat(SearchParent(Select[i],activeComp))
            }
        AvoidSameName(Check);
        for (i=0;i<Select.length;i++){
            //複製してトランスフォームリンクを書いてPPC
            var DupLay = PropertyLinkDup(Select[i],activeComp);
            var Precomp = PPC(DupLay,"Mat_",activeComp);
            var MatComp = Precomp.MakedComp;
            var MatLayer = Precomp.MakedCompLayer;
            MatLayer.moveBefore(Select[i]);
            MatLayer.enabled = false;
            //調整レイヤー作成
            var AdjLayer = activeComp.layers.addSolid([0,0,0],
                                                "Disp_by_" + MatLayer.name, 
                                                activeComp.width,
                                                activeComp.height,             
                                                activeComp.pixelAspect );
            AdjLayer.adjustmentLayer =  true ;
            AdjLayer.moveAfter(Select[i]);
            AdjLayer.name = "Disp_" + Select[i].name
            //モーションタイル
            var Tile = AdjLayer.property("ADBE Effect Parade").addProperty("ADBE Tile");
            Tile.property("ADBE Tile-0004").setValue(500);
            Tile.property("ADBE Tile-0005").setValue(500);
            Tile.property("ADBE Tile-0006").setValue(true);
            //ベクトルブラー
            var VectorB = AdjLayer.property("ADBE Effect Parade").addProperty("CC Vector Blur");
            VectorB.property("CC Vector Blur-0005").setValue(MatLayer.index);
            var Disp = AdjLayer.property("ADBE Effect Parade").addProperty("ADBE Displacement Map");
            Disp.property("ADBE Displacement Map-0001").setValue(MatLayer.index);
            //上の階層から調整可能なマットぼかし
            var Slider = AdjLayer.property("ADBE Effect Parade").addProperty("ADBE Slider Control");
            var MatAdjLayer = MatComp.layers.addSolid([0,0,0],
                                                "マットをぼかす", 
                                                MatComp.width,
                                                MatComp.height,             
                                                MatComp.pixelAspect );
           MatAdjLayer.adjustmentLayer =  true ;
           var Bluer = MatAdjLayer.property("ADBE Effect Parade").addProperty("ADBE Camera Lens Blur");
           Bluer.property("ADBE Camera Lens Blur-0001").expression = " comp(\"" + activeComp.name + "\").layer(\"" + AdjLayer.name + "\").effect(\"スライダー制御\")(\"スライダー\") "
           }
       
        }else{alert("レイヤーが選択されていません")
            }
        
}else{alert("アクティブなコンポジションがありません")
    }