例文02

選択しているレイヤーそれぞれのひとつ上の階層にヌルレイヤーを追加する

例文

//変数宣言&初期化

//(コード内に散在させてもいいのですが、個人的には各変数スコープの最初で宣言するようにしています)

//例文ではすべてグローバルスコープになっています。

//現在アクティブになっているコンポジションを取得。何もアクティブでない場合はnullが取得されます。

var activeComp= app.project.activeItem;

var newLayers = new Array();

var selectedLayers= new Array();

var tempLength, i, j;

//まず処理を加える前にactiveItem(アクティブになっているコンポジションの値)がnullでないことを確認します。

//同時にそのアイテムがCompItemであることを確認します。

//2つの条件が揃わない場合は、最後のアラートを表示してスクリプトは終了します。

if(activeComp&&(activeComp instanceof CompItem)){

//アクティブなコンポジションで選択されているレイヤーの数を取得します。

tempLength = activeComp.selectedLayers.length;

//選択されているレイヤーの数が1以上の場合そのレイヤーの上にNullを追加します。

if(tempLength > 0){

//選択されているレイヤーを別の配列に一時的に格納します。

for(i=0; i < tempLength; i++){

selectedLayers[i] = activeComp.selectedLayers[i];

}

//addNull()を実行してからmoveBefore()を用いて選択レイヤーの上に移動させます。

for (j=0; j < tempLength; j++) {

newLayers[j] = activeComp.layers.addNull();

newLayers[j].moveBefore(selectedLayers[j]);

}

} else {

//レイヤーが選択されていない場合アラートを出すようにしています。

alert('レイヤーが選択されていません');

}

} else {

//アクティブになっているアイテムが存在しない、あるいはアイテムがコンポジションでない場合はアラート表示

alert('現在アクティブになっているコンポジションがありません');

}

解説

単純なことに思えるのですが、意外と「選択しているレイヤーに対して何かする」や「指定した場所にレイヤーを追加する」という処理は、手順を踏まないといけないので初心者が混乱しやすいと思います。

まず選択レイヤーを取得するには、そのレイヤーを含むコンポジションを指定する必要があります。この時に使用するのはactiveItemで、activeItemは必ずしもCompItem objectとは限りませんので注意してください。

//まず処理を加える前にactiveItem(アクティブになっているコンポジションの値)がnullでないことを確認します。

//同時にそのアイテムがCompItemであることを確認します。

//2つの条件が揃わない場合は、最後のアラートを表示してスクリプトは終了します。

if(activeComp&&(activeComp instanceof CompItem)){

activeItemがCompItemであった場合は選択しているレイヤーが1つ以上あるかを確認します。

activeItem(CompItem)のselectedLayersの配列の長さ(数)を取得してから、それが1以上であれば選択しているレイヤーが存在しているという方法で確認します。

tempLength = activeComp.selectedLayers.length;

条件をクリアしたら、選択しているレイヤーを総あたりで別の配列に格納します。これはヌルレイヤーを追加した際にselectedLayerに変化が生じるため、当初選択していた個々のLayer objectを後から特定するためです。

if(tempLength > 0){

//選択されているレイヤーを別の配列に一時的に格納します。

for(i=0; i < tempLength; i++){

selectedLayers[i] = activeComp.selectedLayers[i];

}

このあと、addNull()でレイヤー1つに対して1つのヌルレイヤーを追加します。追加されたヌルはそのままだとレイヤーの再前面に配置されますので、配列に格納したLayer Objectの1つ上にmoveBefore()で移動しています。

//addNull()を実行してからmoveBefore()を用いて選択レイヤーの上に移動させます。

for (j=0; j < tempLength; j++) {

newLayers[j] = activeComp.layers.addNull();

newLayers[j].moveBefore(selectedLayers[j]);

}