Я пытаюсь создать скрипт из 2-х рабочих скриптов
Цель:
Нам нужен скрипт, который будет go через все слои в текущем документе найдите каждый слой, отмеченный определенным цветом (например, красным), скопируйте имена только слоев, отмеченных красным, затем поместите все имена в текстовый слой один за другим (прикрепленный пример изображения).
Ресурсы:
Я нашел 2 сценария, каждый из которых выполняет половину того, что нам нужно, так как же их собрать?
1) «Выбрать красным» просматривает документ и определяет, сколько слоев, помеченных «красным», находятся в документе:
#target photoshop
if (app.documents.length > 0) {
// the file;
var myDocument = app.activeDocument;
// get number of layers;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var applicationDesc = executeActionGet(ref);
var theNumber = applicationDesc.getInteger(stringIDToTypeID("numberOfLayers"));
// process the layers;
var theLayers = new Array;
var theOthers = new Array;
for (var m = 0; m <= theNumber; m++) {
try {
var ref = new ActionReference();
ref.putIndex( charIDToTypeID( "Lyr " ), m);
var layerDesc = executeActionGet(ref);
var layerSet = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));
var isBackground = layerDesc.getBoolean(stringIDToTypeID("background"));
// if not layer group collect values;
if (layerSet != "layerSectionEnd" /*&& layerSet != "layerSectionStart"*/ && isBackground != true) {
var theName = layerDesc.getString(stringIDToTypeID('name'));
var theID = layerDesc.getInteger(stringIDToTypeID('layerID'));
var visible = layerDesc.getBoolean(stringIDToTypeID("visible"));
var theColor = layerDesc.getEnumerationValue(stringIDToTypeID("color"));
if (typeIDToStringID(theColor) == "red") {theLayers.push([theName, theID])}
else {theOthers.push([theName, theID])}
};
}
catch (e) {};
};
// if layers are red;
if (theLayers.length > 0) {alert ("there are " + theLayers.length + " Red layers")}
else {alert ("no red layers")}
};
2) «Текстовое поле из имени слоя» принимает имя текущий выбранный слой, и вставляет его в новый текстовый слой под названием «Comp».
if (app.documents.length > 0) mainScript();
function mainScript() {
try{
var myLayerName = activeDocument.activeLayer.name;
var myLayerText = activeDocument.artLayers.add();
myLayerText.name = "Comp";
myLayerText.kind = LayerKind.TEXT;
var textProperty = myLayerText.textItem;
textProperty.size = 10;
textProperty.font = "Arial";
myLayerText.textItem.contents = myLayerName;
}catch (errStr){
alert(errStr);
}
}
План:
Насколько я понимаю, нам нужно начать с al oop, который равен размеру нашего документа, т.е. общему количеству слоев for (var i = 0; i < doc.layers.length; i++)
.
Затем слой за слоем скрипт проверит цвет ID if (typeIDToStringID(theColor) == "red")
. Когда он находит слой, помеченный красным, он копирует имя слоя - затем либо сохраняет его в массиве (чтобы вывести позже все сразу), либо создает новое текстовое поле и вставляет имя слоя myLayerText.textItem.contents = myLayerName
.
Затем каждый раз, когда он находит другой слой, помеченный красным, он копирует имя слоя и вставляет его в то же текстовое поле, просто на строку выше / ниже имени предыдущего слоя.
Любая помощь очень ценится!