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

Photoshop script select all layers with same name as current layer

New Here ,
Feb 14, 2023 Feb 14, 2023

I need a photoshop script that selects all layers with the same name as the currently selected layer. The following code does the job:

 

// based on code by paul riggott and mike hale;

// 2013, use it at your own risk;

if (app.documents.length > 0) {

activeDocument.suspendHistory('stuff', 'main()');

function main(){

if(!documents.length) return;

var myDoc = app.activeDocument;

var theName = myDoc.activeLayer.name;

var theResults = new Array;

selectAllLayers();

var selectedLayers = getSelectedLayersIdx();

for(var a = 0; a < selectedLayers.length; a++){

var thisName = layerName(Number(selectedLayers[a]));

if (thisName == theName) {

          theResults.push(Number(selectedLayers[a]))

          };

};

selectLayerByIndex(theResults[0], false);

for (var m = 1; m < theResults.length; m++) {

selectLayerByIndex(theResults[m], true);

};

}

};

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

                     }

           }

           return selectedLayers;

};

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 layerName(idx){

var ref = new ActionReference();

ref.putIndex( charIDToTypeID( "Lyr " ), idx);

var desc = executeActionGet(ref);

return desc.getString(stringIDToTypeID("name"));

};

function selectLayerByIndex(index,add){

add = undefined ? add = false:add

var ref = new ActionReference();

    ref.putIndex(charIDToTypeID("Lyr "), index);

    var desc = new ActionDescriptor();

    desc.putReference(charIDToTypeID("null"), ref );

       if(add) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) );

      desc.putBoolean( charIDToTypeID( "MkVs" ), false );

   try{

    executeAction(charIDToTypeID("slct"), desc, DialogModes.NO );

}catch(e){

alert(e.message);

}

};

 BUT, there is one problem, my files have a ton of layers and so it appears that this code must iterate through them all, as such each time i need to run this script it takes 7minutes to execute. Is there a way to optimize this such that it will be faster even in files with VERY HIGH layer counts? Thanks

TOPICS
Actions and scripting
976
Translate
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

correct answers 1 Correct answer

Community Expert , Feb 21, 2023 Feb 21, 2023

Is this faster? 

// 2023, use it at your own risk;
if (app.documents.length > 0) {
    var thisName = activeDocument.activeLayer.name;
    var theLayers = collectLayersByName(thisName);
    alert (theLayers.length+" layers of the name »"+thisName+"«\n\n"+theLayers.join("\n"))
    };
////// collect layers with certain name //////
function collectLayersByName (aName) {
// get number of layers;
    var ref = new ActionReference();
    ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('
...
Translate
Adobe
Community Expert ,
Feb 21, 2023 Feb 21, 2023
LATEST

Is this faster? 

// 2023, use it at your own risk;
if (app.documents.length > 0) {
    var thisName = activeDocument.activeLayer.name;
    var theLayers = collectLayersByName(thisName);
    alert (theLayers.length+" layers of the name »"+thisName+"«\n\n"+theLayers.join("\n"))
    };
////// collect layers with certain name //////
function collectLayersByName (aName) {
// get number of layers;
    var ref = new ActionReference();
    ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('numberOfLayers'));
    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 group collect values;
    if (layerSet != "layerSectionEnd" /*&& layerSet != "layerSectionStart" && isBackground != true*/) {
    var theName = layerDesc.getString(stringIDToTypeID('name'));
    var theID = layerDesc.getInteger(stringIDToTypeID('layerID'));
    if (theName == aName) {
        theLayers.push([theName, theID]);
        selectLayerByID(theID, true)
    }
    };
    }
    catch (e) {};
    };
    return theLayers
    };
// based on code by mike hale, via paul riggott;
function selectLayerByID(id,add){ 
    add = undefined ? add = false:add 
    var ref = new ActionReference();
        ref.putIdentifier(charIDToTypeID("Lyr "), id);
        var desc = new ActionDescriptor();
        desc.putReference(charIDToTypeID("null"), ref );
           if(add) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) ); 
          desc.putBoolean( charIDToTypeID( "MkVs" ), false ); 
       try{
        executeAction(charIDToTypeID("slct"), desc, DialogModes.NO );
    }catch(e){
    alert(e.message); 
    }
    };
Translate
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