skip to Main Content

K basically I need to write a photoshop script that iterates through the selected layers and retrieve some information about them.

if I can get an array of the selected layers I will be fine, I know how to do the rest, but getting that array is been a headache on its own.

I know the document holds something like “activeLayers” but I get lost how to deal with levels and sublevel layers.

All the layers are in a group, so if its easier, if I can get every layer in a group that would be great too 😀

Thanks for any tips on this.

3

Answers


  1. You’ll need to check out the ‘ArtLayers’ and ‘LayerSets’ objects. The following snippet will get all the layers in the first group within a document:

    var lyrs = app.activeDocument.layerSets[0].artLayers;
    

    But since each of your groups can contain other groups, you may have to recursively loop through all of them to get all your layers depending on your use case.

    I highly recommend checking out the xtools library. It has a nice function ‘Stdlib.getLayersList’ that will allow you to get the all the layers recursively from nested groups (plus a whole lot of other great stuff). Get the library here.

    Login or Signup to reply.
  2. This will get you the selected layers

     function getSelectedLayers(){
            var idGrp = stringIDToTypeID( "groupLayersEvent" );
            var descGrp = new ActionDescriptor();
            var refGrp = new ActionReference();
            refGrp.putEnumerated(charIDToTypeID( "Lyr " ),charIDToTypeID( "Ordn" ),charIDToTypeID( "Trgt" ));
            descGrp.putReference(charIDToTypeID( "null" ), refGrp );
            executeAction( idGrp, descGrp, DialogModes.ALL );
            var resultLayers=new Array();
            for (var ix=0;ix<app.activeDocument.activeLayer.layers.length;ix++){resultLayers.push(app.activeDocument.activeLayer.layers[ix])}
            var id8 = charIDToTypeID( "slct" );
                var desc5 = new ActionDescriptor();
                var id9 = charIDToTypeID( "null" );
                var ref2 = new ActionReference();
                var id10 = charIDToTypeID( "HstS" );
                var id11 = charIDToTypeID( "Ordn" );
                var id12 = charIDToTypeID( "Prvs" );
                ref2.putEnumerated( id10, id11, id12 );
            desc5.putReference( id9, ref2 );
            executeAction( id8, desc5, DialogModes.NO );
            return resultLayers;
        }   
        var layers = getSelectedLayers();
    

    Source: https://github.com/kynd/photoshopScripts/blob/master/Rename%20Selected%20Layers/Rename%20Selected%20Layers.jsx

    Login or Signup to reply.
  3. Bravo’s code works except it fails with an error when no layers are selected, so I tweaked it to remove the error and simply return an empty array:

    function getSelectedLayers(){
      var resultLayers=new Array();
      try{
        var idGrp = stringIDToTypeID( "groupLayersEvent" );
        var descGrp = new ActionDescriptor();
        var refGrp = new ActionReference();
        refGrp.putEnumerated(charIDToTypeID( "Lyr " ),charIDToTypeID( "Ordn" ),charIDToTypeID( "Trgt" ));
        descGrp.putReference(charIDToTypeID( "null" ), refGrp );
        executeAction( idGrp, descGrp, DialogModes.NO );
        for (var ix=0;ix<app.activeDocument.activeLayer.layers.length;ix++){resultLayers.push(app.activeDocument.activeLayer.layers[ix])}
        var id8 = charIDToTypeID( "slct" );
        var desc5 = new ActionDescriptor();
        var id9 = charIDToTypeID( "null" );
        var ref2 = new ActionReference();
        var id10 = charIDToTypeID( "HstS" );
        var id11 = charIDToTypeID( "Ordn" );
        var id12 = charIDToTypeID( "Prvs" );
        ref2.putEnumerated( id10, id11, id12 );
        desc5.putReference( id9, ref2 );
        executeAction( id8, desc5, DialogModes.NO );
      } catch (err) { }
      return resultLayers;
    }   
    $.writeln(getSelectedLayers());`
    

    Simply wrapping the code in a try/catch block didnt work, so I also changed:

    executeAction( idGrp, descGrp, DialogModes.ALL );
    

    to

    executeAction( idGrp, descGrp, DialogModes.NO );
    

    and that made the runtime error go away.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search