「エクスプレッションでグリッド状に均等配置する」で作った位置へのエクスプレッション適用をスクリプト化。
「これ以上ヌルレイヤーを増やしたくない人へのスクリプト「smartNuller.jsx」」の処理も含んでいるためフッテージに無闇にヌルレイヤーを増やしません。
[概要]
複数のレイヤーをグリッド状に整列させるエクスプレッションを仕込むスクリプト。X,Yのズレ、折り返す個数を設定可能。
[使い方]
- 並べたいレイヤーを全選択する
- スクリプトを実行する
- コントロールレイヤーの「ズレX」「ズレY」エフェクトで間隔を調整する
- 「n個で改行」エフェクトで折り返すまでの個数を設定可能
[オプション]
- コントローラーとしてオレンジのヌル「grid Control」レイヤーが追加される。
- コントローラーが一番上、その後選択順に下に向かって並び変える。
- 「n個で改行」が3なら、4レイヤーあれば4つ目は1つ目と同じX位置に来る
- 「ズレY」は文章でいうと折り返した2行目との間隔
- 全体の移動は「grid Control」レイヤーを移動させる。
- その他のレイヤーは個別に移動できるが、グリッドから離れた状態でも「ズレX」「ズレY」は維持される。
[解説]
function f_posGridAlign(){
/*----------コントロール用ヌル設定----------*/
var Itm = app.project.items; //全てのアイテムを取得
var actCmp = app.project.activeItem; //選択コンポを取得
var sel=actCmp.selectedLayers;
var nullLyr=f_smartNuller();
var nullFx=[];
nullLyr.moveBefore(sel[0]); // 一旦初めに選択したレイヤーの上に準備
var fxName0="タテ並び";
var fxName1="n個で改行";
var fxName2="ズレX";
var fxName3="ズレY";
nullLyr.name="grid Control";
nullLyr.label=11;//ラベルをオレンジに
nullFx[0]=nullLyr.property("ADBE Effect Parade").addProperty("ADBE Checkbox Control");
// メモリ節約のためにエクスプレッション制御エフェクトは以降も無効化する
//(数値をエクスプレッションで引っ張るだけなので、エフェクト自体は無効で問題なし)
nullFx[0].enabled=false;
nullFx[0].name=fxName0;
nullFx[1]=nullLyr.property("ADBE Effect Parade").addProperty("ADBE Slider Control");
nullFx[1].enabled=false;
nullFx[1].name=fxName1;
nullFx[1](1).setValue(3);
nullFx[2]=nullLyr.property("ADBE Effect Parade").addProperty("ADBE Slider Control");
nullFx[2].enabled=false;
nullFx[2].name=fxName2;
nullFx[2](1).setValue(100);
nullFx[3]=nullLyr.property("ADBE Effect Parade").addProperty("ADBE Slider Control");
nullFx[3].enabled=false;
nullFx[3].name=fxName3;
nullFx[3](1).setValue(100);
/*----------整列レイヤー用 位置設定----------*/
if ( actCmp != null ) {
for(i=0;i<sel.length;i++){
sel[i].moveBefore(nullLyr); // 上から下に、選択順に並べ替え
sel[i].position.setValue([0,0]); // 個別に動かせるようvalueを足すので、元は[0,0]に
sel[i].position.expression=
'cLyr=thisComp.layer("'+nullLyr.name+'");\r'+
'ind=index-cLyr.index-1;\r'+
'xNum=cLyr.effect("'+fxName1+'")(1);\r'+
'zureX=(cLyr.effect("'+fxName0+'")(1)==1)?Math.floor(ind/xNum):ind%xNum;\r'+
'zureY=(cLyr.effect("'+fxName0+'")(1)==1)?ind%xNum:Math.floor(ind/xNum);\r\r'+
'X=cLyr.effect("'+fxName2+'")(1)*zureX;\r'+
'Y=cLyr.effect("'+fxName3+'")(1)*zureY;\r'+
'value+[cLyr.position[0]+X,cLyr.position[1]+Y];';
}//for
nullLyr.moveBefore(sel[0]); //ヌルの上に並べたので、最後にグループの一番上に移動
}// if
}// f_gridAlign
function f_smartNuller(){
var addLyr=app.project.activeItem.layers.addNull(); // nullレイヤー追加
for(i=1;i<=app.project.items.length;i++){
//[平面]か[ヌル]であることを判別
if( (app.project.items[i].mainSource == "[object SolidSource]")&&(app.project.items[i].name=="ヌル 1") ){
addLyr.replaceSource(app.project.items[i],true);
break;
}
}
for(i=app.project.items.length;i>=1;i--){
//使用されていない[ヌル n]のみ削除
if( (app.project.items[i].mainSource == "[object SolidSource]")&&(app.project.items[i].name.indexOf("ヌル")!=-1)&&(app.project.items[i].name!="ヌル 1")&&(app.project.items[i].usedIn=="") ){
app.project.items[i].remove();
}
}
return addLyr;
}
app.beginUndoGroup("posGridAlign");
f_posGridAlign();
app.endUndoGroup();
コントローラーヌル「grid Control」の位置にその他のレイヤーが追従します。
新規追加されるヌルオブジェクトをコントローラーとして、その他の選択レイヤーの位置を[0,0]にした上でエクスプレッションを追加します。[0,0]にする意味は、位置を「value+整列位置」とすることで、個別に移動ができるようになっています。
適当な位置にばらした後、キーフレームで[0,0]に戻すことで「整列するアニメーション」が手軽に作れます。
注意点
つまり、レイヤーの位置が[0,0]から変わるような処理をした場合、グリッドが崩れます。
例えばスクリプト適用後に、整列レイヤーを他レイヤーの子に設定した場合や、コンポジションサイズを左上固定以外で変更した場合など。
やむを得ずコンポジションサイズを変更する場合は「左上固定」でサイズ変更をするか、それが都合の悪い場合は、変更後に整列レイヤーの位置を[0,0]に直してやると然るべき位置に戻ります。
「n個で改行」は、横書きテキストの要領で行の文字数を設定するイメージです。1なら毎レイヤー折り返され、Yしかズレません。
この記事へのコメントはありません。