新規レイヤーを作成(ダイアログなし)

新規にレイヤーを作成(ダイアログなし)するスクリプトです。
Photoshopではショートカットを使って新規にレイヤーを作れますが、スクリプトでできても便利だろうということで作りました。
また、ショートカットで実行した「レイヤーを作成(ダイアログなし)」をアクションに登録することもできますが、あえてスクリプトで..
スクリプト中の関数「getSelectedLayersInfo()」の部分は他所で公開されていたものを使わせてもらってます。
スクリプト本体を「Scripts」フォルダにコピーし、Photoshopを再起動すればメニューに追加されると思います。
これにはショートカットを割り当てられます。
Photoshop でのスクリプト

// http://www.openspc2.org/book/PhotoshopCC2014/easy/layer/007/index.html
// https://stackoverflow.com/questions/63448143/get-selected-layers

/*
if (activeDocument.activeLayer.typename == "LayerSet") {
activeDocument.activeLayer.artLayers.add();
} else if (activeDocument.activeLayer.parent.typename == "LayerSet") {
activeDocument.activeLayer.parent.artLayers.add();
} else {
activeDocument.artLayers.add();
}
*/

var layers = getSelectedLayersInfo();
for (var i = 0; i < layers.length; i++) {
var n = i;
}
createLayer(layers[n].id + 1);


function getSelectedLayersInfo() {
var lyrs = [];
var lyr;
var ref = new ActionReference();
var desc;
var tempIndex = 0;
var ref2;
ref.putProperty(stringIDToTypeID("property"), stringIDToTypeID("targetLayers"));
ref.putEnumerated(charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));

var targetLayers = executeActionGet(ref).getList(stringIDToTypeID("targetLayers"));
for (var i = 0; i < targetLayers.count; i++) {
ref2 = new ActionReference();

// if there's a background layer in the document, AM indices start with 1, without it from 0. ¯\_(ツ)_/¯
try {
activeDocument.backgroundLayer;
ref2.putIndex(charIDToTypeID('Lyr '), targetLayers.getReference(i).getIndex());
desc = executeActionGet(ref2);
tempIndex = desc.getInteger(stringIDToTypeID("itemIndex")) - 1;

} catch (o) {
ref2.putIndex(charIDToTypeID('Lyr '), targetLayers.getReference(i).getIndex() + 1);
desc = executeActionGet(ref2);
tempIndex = desc.getInteger(stringIDToTypeID("itemIndex"));
}

lyr = {};
lyr.index = tempIndex;
lyr.id = desc.getInteger(stringIDToTypeID("layerID"));
lyr.name = desc.getString(charIDToTypeID("Nm "));
lyrs.push(lyr);
}

return lyrs;
}

function createLayer(idx) {
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass(stringIDToTypeID("layer"));
desc.putReference(stringIDToTypeID("null"), ref);
desc.putInteger(stringIDToTypeID("layerID"), idx);
executeAction(stringIDToTypeID("make"), desc, DialogModes.NO);
}

スクリプトを実行すると、新規にレイヤーが作られます。
グループにも対応し、レイヤーを選択した状態で実行するとひとつ上に作成されます。

更新履歴

inserted by FC2 system