Multiple layer selection

Anyone, especially newbies, asking for help with Photoshop Scripting and Photoshop Automation - as opposed to those contributing to discussion about an aspect of Photoshop Scripting

Moderators: Tom, Kukurykus

d3mac123

Multiple layer selection

Post by d3mac123 »

I need to find if multiple layers are selected (and if so, their respective names). I am trying this code from Paul MR, which returns the number of layer selected but I couldn't find a way to extract the layer names. Any chance someone can help help?

Code: Select all    /*///////////////////////////////////////////////////////////////////////////////////////////
    // Function: getSelectedLayersCount
    // Description: gets the number of selected layers
    // Usage:
    // Input:
    // Return: Number
    // Dependencies:     
    //////////////////////////////////////////////////////////////////////////////*/
    function getSelectedLayersCount(){
       var res = new Number();
       var ref = new ActionReference();
       ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
       var desc = executeActionGet(ref);
       if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ){
          desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
          res = desc.count
       }else{
    var vis = app.activeDocument.activeLayer.visible;
    if(vis == true) app.activeDocument.activeLayer.visible = false;
    checkVisability();
    if(app.activeDocument.activeLayer.visible == true){
        res =1;
        }else{
            res = 0;
            }
    app.activeDocument.activeLayer.visible = vis;
    }
       return res;
    }
    function checkVisability(){
    var desc = new ActionDescriptor();
        var list = new ActionList();
        var ref = new ActionReference();
        ref.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
        list.putReference( ref );
        desc.putList( charIDToTypeID('null'), list );
        executeAction( charIDToTypeID('Shw '), desc, DialogModes.NO );
    }
    alert("Number of layers selected = " + getSelectedLayersCount());

Professional AI Audio Generation within Adobe Premiere Pro - Download Free Plugin here

Paul MR

Multiple layer selection

Post by Paul MR »

Please try this..

Code: Select allmain();
function main(){
if(!documents.length) return;
var selectedLayers = getSelectedLayersIdx();
var selectedLayersName=[];
for(var a in selectedLayers){
    selectedLayersName.push(getLayerNameByIndex(Number(selectedLayers[a]) ) );
}
alert(selectedLayersName.toString());
 }
function getLayerNameByIndex( idx ) {
    var ref = new ActionReference();
    ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "Nm  " ));
    ref.putIndex( charIDToTypeID( "Lyr " ), idx );
    return executeActionGet(ref).getString(charIDToTypeID( "Nm  " ));
};
function selectAllLayers() {
    var desc29 = new ActionDescriptor();
        var ref23 = new ActionReference();
        ref23.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
    desc29.putReference( charIDToTypeID('null'), ref23 );
    executeAction( stringIDToTypeID('selectAllLayers'), desc29, DialogModes.NO );
};
function getSelectedLayersIdx(){
      var selectedLayers = new Array;
      var ref = new ActionReference();
      ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
      var desc = executeActionGet(ref);
      if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ){
         desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
          var c = desc.count
          var selectedLayers = new Array();
          for(var i=0;i<c;i++){
            try{
               activeDocument.backgroundLayer;
               selectedLayers.push(  desc.getReference( i ).getIndex() );
            }catch(e){
               selectedLayers.push(  desc.getReference( i ).getIndex()+1 );
            }
          }
       }else{
         var ref = new ActionReference();
         ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "ItmI" ));
         ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
         try{
            activeDocument.backgroundLayer;
            selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" ))-1);
         }catch(e){
            selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" )));
         }
     var vis = app.activeDocument.activeLayer.visible;
        if(vis == true) app.activeDocument.activeLayer.visible = false;
        var desc9 = new ActionDescriptor();
    var list9 = new ActionList();
    var ref9 = new ActionReference();
    ref9.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
    list9.putReference( ref9 );
    desc9.putList( charIDToTypeID('null'), list9 );
    executeAction( charIDToTypeID('Shw '), desc9, DialogModes.NO );
    if(app.activeDocument.activeLayer.visible == false) selectedLayers.shift();
        app.activeDocument.activeLayer.visible = vis;
      }
      return selectedLayers;
};
d3mac123

Multiple layer selection

Post by d3mac123 »

Paul, you are a master! Thanks a lot!
dgk

Multiple layer selection

Post by dgk »

Paul MR, thank you as well, I've been wondering how to do this! I really got to figure out this TypeID stuff!