よく使うものその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("アクティブなコンポジションがありません") }