groupSelectedLayers

Photoshop Script Snippets - Note: Full Scripts go in the Photoshop Scripts Forum

Moderators: Tom, Kukurykus

Paul MR

groupSelectedLayers

Post by Paul MR »

Here is a slightly different version that uses Mike Hale's Layer functions.
Once you have a list of Layers they are normally selected by thier Layer Name. The problem here is if you have selected a few layers with the same name. This is where this should work as it gets the layers in turn from thier Layer ID.

Code: Select allgroupSelectedLayers();
var groupLayers = activeDocument.activeLayer.layers
var selectedLayers = new Array;
for(var i=0;i<groupLayers.length;i++){
   activeDocument.activeLayer= groupLayers;
   selectedLayers.push(getLayerId());
}
executeAction( charIDToTypeID('undo'), undefined, DialogModes.NO );
for(var a=0;a<selectedLayers.length;a++){
      selLayer(a,false);
      //Do what ever you want to the selected layer here.
   }

function getLayerIDByItemIndex(idx) {
    var ref = new ActionReference();
    ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "LyrI" ));
    ref.putIndex( charIDToTypeID( "Lyr " ), idx );
    return executeActionGet(ref).getInteger(charIDToTypeID( "LyrI" ));;
};
function getLayerId(){
    var ref = new ActionReference();
    ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
    d = executeActionGet(ref); //layer descriptor
   return d.getInteger(charIDToTypeID('LyrI'));
};
function selLayer(layerID,add){
var result =getLayerItemIndexByLayerID(layerID);
//alert(result);
if(result != true){
   selectLayerByIndex(result -1,add);
   }else{
alert("Layer does not exist");      
      }
};
function getLayerItemIndexByLayerID(id) {
    var ref = new ActionReference();
    ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "ItmI" ));
    ref.putIdentifier( charIDToTypeID( "Lyr " ), id );
   try{
    return executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" ));
   }catch(e){
         //alert(e.number);
         return true;
      }
};
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);   
   }
};
function groupSelectedLayers(){
    var desc = new ActionDescriptor();
        var ref = new ActionReference();
        ref.putClass( stringIDToTypeID( "layerSection" ) );
    desc.putReference( charIDToTypeID( "null" ), ref );
        var ref2 = new ActionReference();
        ref2.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );
    desc.putReference( charIDToTypeID( "From" ), ref2 );
executeAction(charIDToTypeID( "Mk  " ), desc, DialogModes.NO );
}
Patrick

groupSelectedLayers

Post by Patrick »

Thanks for posting this, I haven't run into the problem (yet) but its good to have this in the toolbox!

Patrick
Mike Hale

groupSelectedLayers

Post by Mike Hale »

Paul MR wrote:activeDocument.activeLayer.layers

Nice, somehow I never made that connection.

When I run this I get two Layer 'does not exist' alerts and it skips the second from the top selected layer. The selLayer function seems to select the top most layer twice in the loop.

Does this happen with anyone else?

Mike
Paul MR

groupSelectedLayers

Post by Paul MR »

My fault entirely Mike I hadn't referenced the array item!.
selLayer(a,false); should be selLayer(selectedLayers[a],false);

This should work now.
Code: Select allgroupSelectedLayers();
var groupLayers = activeDocument.activeLayer.layers;
var selectedLayers = new Array;
for(var i=0;i<groupLayers.length;i++){
   activeDocument.activeLayer= groupLayers;
   selectedLayers.push(getLayerId());
}
executeAction( charIDToTypeID('undo'), undefined, DialogModes.NO );

for(var a=0;a<selectedLayers.length;a++){
      selLayer(selectedLayers[a],false);
      //Do what ever you want to the selected layer here.
   }

function getLayerIDByItemIndex(idx) {
    var ref = new ActionReference();
    ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "LyrI" ));
    ref.putIndex( charIDToTypeID( "Lyr " ), idx );
    return executeActionGet(ref).getInteger(charIDToTypeID( "LyrI" ));;
};
function getLayerId(){
    var ref = new ActionReference();
    ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
    d = executeActionGet(ref); //layer descriptor
   return d.getInteger(charIDToTypeID('LyrI'));
};
function selLayer(layerID,add){
var result =getLayerItemIndexByLayerID(layerID);
//alert(result);
if(result != true){
   selectLayerByIndex(result -1,add);
   }else{
alert("Layer does not exist");      
      }
};
function getLayerItemIndexByLayerID(id) {
    var ref = new ActionReference();
    ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "ItmI" ));
    ref.putIdentifier( charIDToTypeID( "Lyr " ), id );
   try{
    return executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" ));
   }catch(e){
         //alert(e.number);
         return true;
      }
};
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);   
   }
};
function groupSelectedLayers(){
    var desc = new ActionDescriptor();
        var ref = new ActionReference();
        ref.putClass( stringIDToTypeID( "layerSection" ) );
    desc.putReference( charIDToTypeID( "null" ), ref );
        var ref2 = new ActionReference();
        ref2.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );
    desc.putReference( charIDToTypeID( "From" ), ref2 );
executeAction(charIDToTypeID( "Mk  " ), desc, DialogModes.NO );
}

Mike Hale

groupSelectedLayers

Post by Mike Hale »

Paul,

What version of Photoshop are you using?
Paul MR

groupSelectedLayers

Post by Paul MR »

I have CS2/3 and 4
This was done using Photoshop CS3.
Mike Hale

groupSelectedLayers

Post by Mike Hale »

I have run into something strange.

activeDocument.activeLayer.layers works in CS2 on my home system that also has CS3 and 4. However it doesn't work on another system that only has CS2 and different system that only has CS3.

If activeDocument.activeLayer.layers is a CS4 feature I would think that it would only work in CS4.

Mike
Paul MR

groupSelectedLayers

Post by Paul MR »

Would you believe it's your code Mike? (smile)
It originated here:
bb/viewtopic.php?t=1741&highlight=groupselectedlayers. ... ctedlayers
Mike Hale

groupSelectedLayers

Post by Mike Hale »

I was concerned that I lost some brain cells when I was hospitalized earlier this year. Now I sure I did.

Mike