// c2009 Adobe Systems, Inc. All rights reserved.
// Written by Naoki Hada
/*
@@@BUILDINFO@@@ Delete All Empty Layers.jsx 1.0.0.3
*/
/*
// BEGIN__HARVEST_EXCEPTION_ZSTRING
$$$/JavaScripts/DeleteAllEmptyLayers/Menu=Delete All Empty Layers
Delete
true
a0754df2-9c60-4b64-a940-6a2bb1102652
>]
>>
>> ]]>
// END__HARVEST_EXCEPTION_ZSTRING
*/
// enable double clicking from the
// Macintosh Finder or the Windows Explorer
#target photoshop
// Make Photoshop the frontmost application
app.bringToFront();
/////////////////////////
// SETUP
/////////////////////////
// all the strings that need localized
var strDeleteAllEmptyLayersHistoryStepName = localize("$$$/JavaScripts/DeleteAllEmptyLayers/Menu=Delete All Empty Layers" );
/////////////////////////
// MAIN
/////////////////////////
var doc = app.activeDocument; // remember the document, the selected layer, the visibility setting of the selected layer
var currentLayer = doc.activeLayer; // remember the selected layer
var currentVisible = currentLayer.visible;// remember the visibility setting of the selected layer
var mySelectedLayers = getSelectedLayers(); // remember the selected layers
var myDialogMode = app.displayDialogs; // remember the dialog mode
app.displayDialogs = DialogModes.NO; // set it to no to avoid dialogs
// Create only one history state for the entire script
doc.suspendHistory(strDeleteAllEmptyLayersHistoryStepName, "main()");
// restore the selected layer
try{
doc.activeLayer = currentLayer;
}catch(e) {
; // do nothing
}
// restore the visibility setting of the original layer
try{
currentLayer.visible = currentVisible;
}catch(e) {
; // do nothing
}
if (mySelectedLayers.length != 0){//,more than one layer selected
// restore the selected layers
try{
setSelectedLayers(mySelectedLayers);
}catch(e) {
; // do nothing
}
}
// Record the script in the Actions palette when recording an action
try{
var playbackDescription = new ActionDescriptor;
var playbackReference = new ActionReference;
playbackReference.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
playbackDescription.putReference( charIDToTypeID("null"), playbackReference);
app.playbackDisplayDialogs = DialogModes.NO;
app.playbackParameters = playbackDescription;
}catch(e) {
; // do nothing
}
app.displayDialogs = myDialogMode;
/////////////////////////
// FUNCTIONS
/////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Function: main
// Usage: container function to hold all the working code that generates history states
// Input: Must have an open document
// Return:
///////////////////////////////////////////////////////////////////////////////
function main(){
try {
var originalRulerUnits = app.preferences.rulerUnits; // remember current setting
app.preferences.rulerUnits = Units.PIXELS; // set Pixel for checking bounds
var doc = app.activeDocument;
deleteAllEmptyLayers(doc);
deleteAllEmptyLayerSets(doc);
app.preferences.rulerunits = originalRulerUnits; // restore unit
} catch(e) {
return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: deleteAllEmptyArtLayers
// Usage: the worker routine, take our params and save the file accordingly
// Input: Object o: It can be document object or LayerSets.
// It is called recursively.
// Return:
///////////////////////////////////////////////////////////////////////////////
function deleteAllEmptyLayers(o){
try{
for(var i = o.artLayers.length-1; 0 <= i; i--){ // top level layers
var layer = o.artLayers[i];
if( layer.allLocked
|| layer.pixelsLocked
|| layer.positionLocked
|| layer.transparentPixelsLocked
||(0 != layer.linkedLayers.length)){ // linked
continue; // skip locked or linked
}
if((LayerKind.TEXT == layer.kind)){ // TEXT Layer
if("" == layer.textItem.contents) layer.remove();
}else{ // Other Layer
if( (0 == layer.bounds[2]) // width = 0
&& (0 == layer.bounds[3])){ // height = 0
layer.remove();
}
}
}
for(var i = o.layerSets.length-1; 0 <= i; i--){ // LayerSet
var layerSet = o.layerSets[i];
if((layerSet.allLocked)||(0 != layerSet.linkedLayers.length)){
continue; // skip locked or linked
}
deleteAllEmptyLayers(layerSet); // recursive call
}
}catch(e){
; // do nothing
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: deleteAllEmptyLayerSets
// Usage: the worker routine, take our params and save the file accordingly
// Input: Object o: It can be document object or LayerSets.
// It is called recursively.
// Return: , a file on disk
///////////////////////////////////////////////////////////////////////////////
function deleteAllEmptyLayerSets(o){
try{
var bEmpty = true;
for(var i = o.layerSets.length-1; 0 <= i; i--) {
var layerSet = o.layerSets[i];
if((layerSet.allLocked)||(0!=layerSet.linkedLayers.length)){
continue; // skip locked or linked
}
if(deleteAllEmptyLayerSets(layerSet)){ // empty
layerSet.remove(); // delete
} else bEmpty = false; // not empty
}
if(0 != o.artLayers.length) bEmpty = false; // not empty
}catch(e){
; // do nothing
}
return bEmpty;
}
///////////////////////////////////////////////////////////////////////////////
// Function: getSelectedLayers
// Usage: creates and array of the currently selected layers
// Input: Must have an open document
// Return: Array selectedLayers
///////////////////////////////////////////////////////////////////////////////
function getSelectedLayers() {
var selectedLayers = [];
try {
var backGroundCounter = activeDocument.artLayers[activeDocument.artLayers.length-1].isBackgroundLayer ? 0 : 1;
var ref = new ActionReference();
var keyTargetLayers = app.stringIDToTypeID( 'targetLayers' );
ref.putProperty( app.charIDToTypeID( 'Prpr' ), keyTargetLayers );
ref.putEnumerated( app.charIDToTypeID( 'Dcmn' ), app.charIDToTypeID( 'Ordn' ), app.charIDToTypeID( 'Trgt' ) );
var desc = executeActionGet( ref );
if ( desc.hasKey( keyTargetLayers ) ) {
var layersList = desc.getList( keyTargetLayers );
for ( var i = 0; i < layersList.count; i++) {
var listRef = layersList.getReference( i );
selectedLayers.push( listRef.getIndex() + backGroundCounter );
}
//hasLayerMask = true;
}
}catch(e) {
; // do nothing
}
return selectedLayers;
}
///////////////////////////////////////////////////////////////////////////////
// Function: setSelectedLayers
// Usage: Selects an array of layers
// Input: Array selectedLayers
// Return:
///////////////////////////////////////////////////////////////////////////////
function setSelectedLayers( layerIndexesOrNames ) {
// first select the first one
setSelectedLayer( layerIndexesOrNames[0] );
// then add to the selection
for ( var i = 1; i < layerIndexesOrNames.length; i++) {
addSelectedLayer( layerIndexesOrNames[i] );
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: setSelectedLayer
// Usage: Selects the first layer
// Input: Array selectedLayers
// Return:
///////////////////////////////////////////////////////////////////////////////
function setSelectedLayer( layerIndexOrName ) {
try {
var id239 = charIDToTypeID( "slct" );
var desc45 = new ActionDescriptor();
var id240 = charIDToTypeID( "null" );
var ref43 = new ActionReference();
var id241 = charIDToTypeID( "Lyr " );
if ( typeof layerIndexOrName == "number" ) {
ref43.putIndex( id241, layerIndexOrName );
} else {
ref43.putName( id241, layerIndexOrName );
}
desc45.putReference( id240, ref43 );
var id242 = charIDToTypeID( "MkVs" );
desc45.putBoolean( id242, false );
executeAction( id239, desc45, DialogModes.NO );
}catch(e) {
; // do nothing
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: addSelectedLayer
// Usage: adds the rest of the layers in the array to the first layer
// Input: Array selectedLayers
// Return:
///////////////////////////////////////////////////////////////////////////////
function addSelectedLayer( layerIndexOrName ) {
try {
var id243 = charIDToTypeID( "slct" );
var desc46 = new ActionDescriptor();
var id244 = charIDToTypeID( "null" );
var ref44 = new ActionReference();
var id245 = charIDToTypeID( "Lyr " );
if ( typeof layerIndexOrName == "number" ) {
ref44.putIndex( id245, layerIndexOrName );
} else {
ref44.putName( id245, layerIndexOrName );
}
desc46.putReference( id244, ref44 );
var id246 = stringIDToTypeID( "selectionModifier" );
var id247 = stringIDToTypeID( "selectionModifierType" );
var id248 = stringIDToTypeID( "addToSelection" );
desc46.putEnumerated( id246, id247, id248 );
var id249 = charIDToTypeID( "MkVs" );
desc46.putBoolean( id249, false );
executeAction( id243, desc46, DialogModes.NO );
}catch(e) {
; // do nothing
}
}
// End Delete All Empty Layers.jsx