全てのレイヤー名、レイヤーセット名を書き出す

今回は全てのレイヤー名およびレイヤーセット名を書き出します。
レイヤーが多くなると、レイヤーセット名、レイヤー名をテキストファイルに書き出してチェックしたい(管理したい)場合があります。元々はAfterEffectsでPhotoshop形式のファイルを読み込む際に、大量のファイル内のレイヤー名を一括して変更するためのものです。

Photoshop CSではレイヤーはレイヤーセット内にレイヤーを内包することができます。レイヤーセット内にレイヤーセットを内包することもできます。このような場合には「再帰(リカーシブ)」を使うと簡単です。以下のスクリプトを実行するとレイヤー名を保存するフォルダとファイル名を聞いてきます。ファイル名を入れて保存ボタンを押すと、しばらくして(時間がかかることがあります)テキストファイルにレイヤー名が書き出されます。

CR = String.fromCharCode(13);
savename = File.saveDialog("保存するファイル名を入れてください");
if (savename)
{
fileObj = new File(savename);
flag = fileObj.open("w");
if (flag == true)
{
writeLayerName(activeDocument);
fileObj.close();
}else{
alert("ファイルが開けませんでした");
}
}

// レイヤーセット内にレイヤーが含まれる限り書き出し(再帰)
function writeLayerName(layObj)
{
var i;
var n = layObj.artLayers.length;
for (i=0; i<n; i++)
{
layName = layObj.artLayers[i].name;
fileObj.write(layName+CR);
}
var ns = layObj.layerSets.length;
for (i=0; i<ns; i++)
{
writeLayerName(layObj.layerSets[i])
}
}


このスクリプトだとレイヤーセット内にレイヤー名があっても、字下げ(インデント)を行わずにテキストファイルに書き出してしまいます。やはり字下げした方が、見やすいでしょう。また、レイヤー名は書き出しますがレイヤーセット名は書き出しません。どのように入れ子になっているか見たい場合には上記のスクリプトでは不便です。
以下のスクリプトはレイヤーセットの入れ子の深さに応じてレイヤーセットとレイヤー名を書き出すものです。

CR = String.fromCharCode(13);
savename = File.saveDialog("保存するファイル名を入れてください");
if (savename)
{
fileObj = new File(savename);
flag = fileObj.open("w");
if (flag == true)
{
writeLayerName(activeDocument,0);
fileObj.close();
}else{
alert("ファイルが開けませんでした");
}
}

// レイヤーセット内にレイヤーが含まれる限り書き出し(再帰)
function writeLayerName(layObj, indent)
{
var i,k;
var n = layObj.artLayers.length;
for (i=0; i<n; i++)
{
layName = layObj.artLayers[i].name;
for (k=0,idt = ""; k<indent; k++) idt +=" ";
fileObj.write(idt+layName+CR);
}
var ns = layObj.layerSets.length;
for (i=0; i<ns; i++)
{
for (k=0,idt = "■"; k<indent; k++) idt +="■";
fileObj.write(idt+layObj.layerSets[i].name+CR);
writeLayerName(layObj.layerSets[i],indent+1)
}
}

これで、レイヤーの構成状況を把握することができます。ちなみにレイヤー名を一括して設定したい場合には以下のページの中級編の3、4、5番を参照してください。

http://www.openspc2.org/book/PhotoshopCS/



[サンプルをダウンロード]