Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CS5 Hiding layers is painfully slow

Is it only me that thinks the CS5 scripts runs painfully slow? These few lines takes over 1 minute to execute.

for (n=0; n<app.activeDocument.layerSets.length; n++) {
  app.activeDocument.layerSets[n].visible = false;
}

The number of layerSets are 20. I'm running the CS5.1 64bit version on a Vista Home Premium system, AMD Athlon 64 X2 Dual Core 5200+ with 8GB RAM.

I tried to Export the script as a .JSXBIN but it still takes over 1 minute. CPU usage for CS5.1 goes from 3% to 57% when the CS5.1 is running the .JSXBIN script.

There must be something wrong here, how can I speed up the scripts?

// Thanks

* EDIT * It seems like CS5's own DOM implementation is the problem here. The script speeded up more than twice by reading DOM related values into local variables.

var LayerCount = app.activeDocument.layerSets.length;
var LayerRoot = app.activeDocument.layerSets;

for (n=0; n<LayerCount; n++) {
  LayerRoot[n].visible = false;
}

...but still, it far to much time to just change a property in 20 objects. Any help with optimizing would be appreciated :)

like image 960
Max Kielland Avatar asked Aug 20 '12 15:08

Max Kielland


2 Answers

The only thing I can think of is try try to loop through the individual layers in app.activeDocument.layers which contains all the layers and groups. When you do this you'll notice that grouped layers will still retain their original visible property but are hidden because their parent group is hidden.

#target photoshop

var myLayers = app.activeDocument.layers;
var myLayersLength = myLayers.length;

for (var i=0; i<myLayersLength; i++) {
    myLayers[i].visible = false;
}

EDIT: So I tested this solution on a 400mb file with 50 layers and it worked in seriously less than a second. Are you sure the problem is with Photoshop?

If you have to iterate through every single layer and child-layer individually to perform an action you can do it recursively:

#target photoshop

var doc = app.activeDocument;
findLayers(doc);


function findLayers(set) {
    for (var i=0; i<set.layerSets.length; i++) {

        //recursive call
        findLayers(set.layerSets[i]);

        //iterate sub-layers and hide
        for (var j=0; j<set.layerSets[i].layers.length; j++) {
            set.layerSets[i].layers[j].visible = false;
        }
    }

    //hide top-level layers
    for (var l=0; l<set.layers.length; l++) {
        set.layers[l].visible = false;
    }
}

This takes a bit longer, ~20 seconds on my machine, but it will hit every single layer in a document.

NOTE: I also tested your original scripts from the question and they don't work on un-grouped layers because you're iterating through document.layerSets instead of document.layers

like image 183
pdizz Avatar answered Oct 14 '22 12:10

pdizz


Have a look at this ps-scripts iteration over layers is slow - explanation Which may be able to help you as well.

like image 40
Ghoul Fool Avatar answered Oct 14 '22 11:10

Ghoul Fool