Скрипт для копирования имен слоев в текстовое поле в Photoshop - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь создать скрипт из 2-х рабочих скриптов

Цель:

Нам нужен скрипт, который будет go через все слои в текущем документе найдите каждый слой, отмеченный определенным цветом (например, красным), скопируйте имена только слоев, отмеченных красным, затем поместите все имена в текстовый слой один за другим (прикрепленный пример изображения).

enter image description here

Ресурсы:

Я нашел 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.

Затем каждый раз, когда он находит другой слой, помеченный красным, он копирует имя слоя и вставляет его в то же текстовое поле, просто на строку выше / ниже имени предыдущего слоя.

Любая помощь очень ценится!

1 Ответ

1 голос
/ 19 февраля 2020

Единственное, что вам нужно было сделать, это соединить имена вашего массива theLayers, используя символ перевода строки \r:

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;

  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 theColor = layerDesc.getEnumerationValue(stringIDToTypeID("color"));
        if (typeIDToStringID(theColor) == "red")
        {
          theLayers.push(theName); // we only need names here
        }
      };
    }
    catch (e)
    {};
  };

  // got our red layers in theLayers

  var myLayerText = activeDocument.artLayers.add();
  myLayerText.name = "Result";
  myLayerText.kind = LayerKind.TEXT;
  var textProperty = myLayerText.textItem;
  textProperty.size = 10;
  textProperty.font = "Arial";
  myLayerText.textItem.contents = theLayers.join('\r'); // joining layers with a line-break: this is going to be textItem text

};

Вот результат:

enter image description here

Я бы посоветовал вам пройти курс по JS на любом обучающем веб-сайте (академия кода и др. c): это не займет у вас больше, чем час или два, но вы получите базовые c концепции: это значительно облегчит вашу жизнь с точки зрения решения подобных вопросов.

...