[FIXED] Skript zum Kopieren von Ebenennamen in ein Textfeld in Photoshop

Ausgabe

Ich versuche, ein Skript aus 2 funktionierenden Skripten zu erstellen

Tor:

Wir brauchen ein Skript, das alle Ebenen im aktuellen Dokument durchgeht, jede Ebene findet, die in einer bestimmten Farbe markiert ist (z. B. Rot), die Namen nur der rot markierten Ebenen kopiert und dann alle Namen nacheinander in eine Textebene einfügt ein anderes (angehängtes Beispielbild).

Geben Sie hier die Bildbeschreibung ein

Ressourcen:

Ich habe 2 Skripte gefunden, die jeweils die Hälfte dessen tun, was wir brauchen. Wie können wir sie also zusammenstellen?

1) „Select by red“ geht durch das Dokument und findet heraus, wie viele „rot“ markierte Layer sich im Dokument befinden:

#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) „Textfeld aus Ebenenname“ nimmt den Namen der aktuell ausgewählten Ebene und fügt ihn in eine neue Textebene namens „Comp“ ein.

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);  

    }  

}  

Planen:

Nach meinem Verständnis müssen wir mit einer Schleife beginnen, die so lang ist wie unsere Dokumentgröße, dh die Gesamtzahl der Ebenen for (var i = 0; i < doc.layers.length; i++).

Then layer by layer the script will check for color ID if (typeIDToStringID(theColor) == "red") . When it finds layer marked in red, it copies the layer name – then either stores it in array (to output later all at once), or creates a new text box and pastes the layer name myLayerText.textItem.contents = myLayerName.

Then for each time it finds another layer marked in red , it copies the layer name, and pastes it in the same text box just a line above/below previous layer name.

Any help is much appreciated!

Solution

The only thing you needed to do was to join the names of your theLayers array using the line-break symbol \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

};

Here’s the result:

Geben Sie hier die Bildbeschreibung ein

Ich würde Ihnen vorschlagen, einen JS-Kurs auf einer beliebigen Lernwebsite (Code Academy usw.) zu belegen: Dies dauert nicht länger als ein oder zwei Stunden, aber Sie erhalten die grundlegenden Konzepte: Dies wird Ihr Leben viel einfacher machen im Umgang mit solchen Fragen.


Beantwortet von –
Sergey Kritskiy


Antwort geprüft von –
David Goodson (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like