Skip to main content
Known Participant
September 14, 2020
Answered

Script: Delete selected layer, if empty.

  • September 14, 2020
  • 2 replies
  • 3986 views

There are various ways to delete all layers that are empty, but is there a script which can detect if the "selected" layer is empty, and if so, delete it?
Thanks!
Jeff

This topic has been closed for replies.
Correct answer r-bin

I'm using CS6.. lol

 

Thanks!


Option for CS6

var r = new ActionReference();    
r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("targetLayers"));
r.putEnumerated(stringIDToTypeID("document"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum"));

var list = executeActionGet(r).getList(stringIDToTypeID("targetLayers"));

var selected = new Array();
var ids = new Array();

for (var i = 0; i < list.count; i++) selected.push(list.getReference(i).getIndex());

for (var i = 0; i < selected.length; i++) 
    {
    var r = new ActionReference();    
    r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("bounds"));
    r.putIndex(stringIDToTypeID("layer"), selected[i]);

    var bounds = executeActionGet(r).getObjectValue(stringIDToTypeID("bounds"));

    var x0 = bounds.getUnitDoubleValue(stringIDToTypeID("left"));
    var x1 = bounds.getUnitDoubleValue(stringIDToTypeID("right"));
    var y0 = bounds.getUnitDoubleValue(stringIDToTypeID("top"));
    var y1 = bounds.getUnitDoubleValue(stringIDToTypeID("bottom"));

    if (!x0 && !x1 && !y0 && !y1) ids.push(selected[i]);
    }

if (ids.length)
    {
    var r = new ActionReference();
    for (var i = 0; i < ids.length; i++) r.putIndex(stringIDToTypeID("layer"), ids[i]);

    var d = new ActionDescriptor();
    d.putReference(stringIDToTypeID("null"), r);
    executeAction(stringIDToTypeID("delete"), d, DialogModes.NO); 
    }

2 replies

Legend
September 16, 2020
This script removes empty layers among selected.
 
var r = new ActionReference();    
r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("targetLayersIDs"));
r.putEnumerated(stringIDToTypeID("document"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum"));

var list = executeActionGet(r).getList(stringIDToTypeID("targetLayersIDs"));

var selected = new Array();
var ids = new Array();

for (var i = 0; i < list.count; i++) selected.push(list.getReference(i).getIdentifier());

for (var i = 0; i < selected.length; i++) 
    {
    var r = new ActionReference();    
    r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("bounds"));
    r.putIdentifier(stringIDToTypeID("layer"), selected[i]);

    var bounds = executeActionGet(r).getObjectValue(stringIDToTypeID("bounds"));

    var x0 = bounds.getUnitDoubleValue(stringIDToTypeID("left"));
    var x1 = bounds.getUnitDoubleValue(stringIDToTypeID("right"));
    var y0 = bounds.getUnitDoubleValue(stringIDToTypeID("top"));
    var y1 = bounds.getUnitDoubleValue(stringIDToTypeID("bottom"));

    if (!x0 && !x1 && !y0 && !y1) ids.push(selected[i]);
    }

if (ids.length)
    {
    var r = new ActionReference();
    for (var i = 0; i < ids.length; i++) r.putIdentifier(stringIDToTypeID("layer"), ids[i]);

    var d = new ActionDescriptor();
    d.putReference(stringIDToTypeID("null"), r);
    executeAction(stringIDToTypeID("delete"), d, DialogModes.NO); 
    }
 
Known Participant
September 16, 2020

Thanks for the help, and  scripts!

Stephen_A_Marsh,   The addition was just what i needed to make it work,  Thanks!

 

r-bin,  Also, thanks for the script!,   Although it gave me this error.

"- The command 'Get' is not currently available.
Line: 5"

 

Thanks again for all the help!

Jeff

Legend
September 16, 2020
Which version of photoshop?
My script does not work in low-end Photoshop like CS6.
But it is possible to remake.
 
Community Expert
September 14, 2020

Doesn't the "Delete All Empty layers" script shipped with PS work for you.

 

-Manan

-Manan
Known Participant
September 14, 2020

Thanks Manan,

 

I have several layers that are empty, which i need to keep.

This action is part of a larger script.

For this part, it focuses on a selected layer, and remove it, if empty.

 

Thanks

Jeff

Stephen Marsh
Community Expert
Community Expert
September 15, 2020

Thank you for the help!

 

.. but,  being the noob that i am, and many failed attempts, not sure how i can indicate this to work with the selected layer?

 

Any suggestions?

 

Thanks!


Adding to the fantastic code from Jef_Bracke1:

 

var layer = app.activeDocument.activeLayer;
var layerName = layer.name;

// check if layer can be removed (ie: is not locked & has no linked layers)
if (!(layer.allLocked || layer.pixelsLocked || layer.positionLocked || layer.transparentPixelsLocked || (0 !== layer.linkedLayers.length))) { // linked
    // check if text & if text, if also empty or if width/height == 0 (ie nothing on the layer)
    if ((LayerKind.TEXT === layer.kind && "" === layer.textItem.contents) || (0 === layer.bounds[2] && (0 === layer.bounds[3]))) {
        // remove layer
        layer.remove();
        alert('Active layer "' + layerName + '" removed!');
    }
    else {
        alert('This layer is not empty!');
    }
}