今回は、Illustratorでレイヤーを名前順に並び替えるスクリプトです。レイヤー名を、昇順または降順に並び替えることができます。
以下のスクリプトを使うと、最初の階層のレイヤーを並び替えます。レイヤー内にさらにレイヤーがある場合、その中のレイヤーは並び替えません。
Illustratorではレイヤー名に数字を使用していると、layers[]で正しく参照できないことがあるので、一時的にレイヤー名を文字列にしてから処理をして、最後に元に戻しています。
同様に、ロック状態や不可視状態にあるとエラーになるので、これらの状態も最初に保存しておいて、最後に戻すようにしています。
// レイヤーをソートする
(function sortLayer(layObj){
var nameList = []; // 名前を入れる配列
var lockList = []; // ロック状態を入れる配列
var visibleList = []; // 表示状態を入れる配列
for(var i=0; i<layObj.length; i++){
layObj[i].name = "_"+layObj[i].name;
// 名前とロック状態、可視状態を保存しておく
nameList[i] = layObj[i].name;
lockList[nameList[i]] = layObj[i].locked;
layObj[i].locked = false;
visibleList[nameList[i]] = layObj[i].visible;
layObj[i].visible = true;
}
// レイヤーを昇順に並べ替え
nameList = nameList.sort();
var flag = confirm("降順にしますか?");
if (flag == true){
// レイヤー名を降順に並べ替える
nameList.reverse();
}
// 挿入基準のレイヤーを一番上に移動する
var baseLayObj = layObj[nameList[0]];
baseLayObj.move(layObj[0], ElementPlacement.PLACEBEFORE);
// レイヤーを並べ替え
for(var i=1; i<nameList.length; i++){
var aLay = layObj[nameList[i]];
aLay.move(baseLayObj, ElementPlacement.PLACEBEFORE);
}
// 最初のレイヤーを移動
baseLayObj.move(layObj[0], ElementPlacement.PLACEBEFORE);
// 名前とロック状態、可視状態を元に戻す
for(var i=0; i<layObj.length; i++){
layObj[i].locked = lockList[nameList[i]];
layObj[i].visible = visibleList[nameList[i]];
layObj[i].name = layObj[i].name.substr(1, 99999);
}
})(activeDocument.layers);
Illustratorのレイヤーには、さらにレイヤーを内包することができます。
以下のスクリプトはレイヤー内にレイヤーがある場合、その内部のレイヤーを並び替えます。ただし、選択したレイヤーの下の階層のみ並べ替えを行うだけで、さらに深い階層のレイヤーは並べ替えません。
// 選択されたレイヤーセット内のレイヤーをソートする
function sortLayer(layObj){
var nameList = []; // 名前を入れる配列
var lockList = []; // ロック状態を入れる配列
var visibleList = []; // 表示状態を入れる配列
for(var i=0; i<layObj.length; i++){
layObj[i].name = "_"+layObj[i].name;
// 名前とロック状態、可視状態を保存しておく
nameList[i] = layObj[i].name;
lockList[nameList[i]] = layObj[i].locked;
layObj[i].locked = false;
visibleList[nameList[i]] = layObj[i].visible;
layObj[i].visible = true;
}
// レイヤーを昇順に並べ替え
nameList = nameList.sort();
var flag = confirm("降順にしますか?");
if (flag == true){
// レイヤー名を降順に並べ替える
nameList.reverse();
}
// 挿入基準のレイヤーを一番上に移動する
var baseLayObj = layObj[nameList[0]];
baseLayObj.move(layObj[0], ElementPlacement.PLACEBEFORE);
// レイヤーを並べ替え
for(var i=1; i<nameList.length; i++){
var aLay = layObj[nameList[i]];
aLay.move(baseLayObj, ElementPlacement.PLACEBEFORE);
}
// 最初のレイヤーを移動
baseLayObj.move(layObj[0], ElementPlacement.PLACEBEFORE);
// 名前とロック状態、可視状態を元に戻す
for(var i=0; i<layObj.length; i++){
layObj[i].locked = lockList[nameList[i]];
layObj[i].visible = visibleList[nameList[i]];
layObj[i].name = layObj[i].name.substr(1, 99999);
}
}
(function (){
if(activeDocument.activeLayer.layers.length == 0){
alert("サブレイヤーがあるレイヤーを選択してください");
return;
}
sortLayer(activeDocument.activeLayer.layers);
})();
[
サンプルをダウンロード]