• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Script for adding color marked layer names to a text layer.

New Here ,
Feb 19, 2020 Feb 19, 2020

Copy link to clipboard

Copied

Hi Everyone,

 

I'm trying to create a script out of 2 working scripts.

 

Goal:

 

We need a script that will go through all the layers in the current document, find each layer marked in certain color (Red for example), copy the names of only the layers marked in red, then put all names in a text layer one after another (attached example image).

Capture.JPG

Resources:

I found 2 scripts that each do half of what we need, so how to we put them together?

 

1) "Select by red" goes through the document and finds how many layers marked in "red" are in the document:

 

 

#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) "Text box from layer name" takes the name of the currently selected layer, and pastes it into a new text layer called "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);  

    }  

}  

 

 

 

Plan:

 

From my understanding, we need to start with a loop that's as long as our document size i.e. total number of layers 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.

 

I think we got all the ingredients here, I'm just not sure how to put it together. My coding skills are very limited, I can change parameters here and there but can't create anything functional myself, which is why I'm hoping you folks can help.

 

Any help is much appreciated!

 

Thank you.

TOPICS
Actions and scripting

Views

988

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe
Community Expert ,
Feb 20, 2020 Feb 20, 2020

Copy link to clipboard

Copied

LATEST

Try this:

 

#target photoshop

if (app.documents.length > 0) {
    // the file;
    var doc = 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 = '';
    //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 theColor = layerDesc.getEnumerationValue(stringIDToTypeID("color"));
                if (typeIDToStringID(theColor) == "red") {theLayers += theName +'\r'}
              
                };
            }
        catch (e) {};
    };


   
       var txtLayer = doc.artLayers.add();
       txtLayer.kind = LayerKind.TEXT; 
       txtLayer.name = "Red Layer Names";
       var textProperty = txtLayer.textItem;
       textProperty.size = 20;   
       textProperty.font = "Arial";
       textProperty.contents = theLayers;
       //myLayerText.textItem.contents = myLayerName;   
       txtLayer.move(doc.layers[0], ElementPlacement.PLACEBEFORE);
    };

red lable text.jpg

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines