because I have 10k layers and it takes too long to do that
By @jack284003085p35
How did you manage to create 10k layers?
When the number of layers is more than 8000, problems begin with the file, not to mention the fact that adding new layers manually will not work.
Try this script. I would like to see your timings.
It won't be possible to do it faster.
var layers = get_layers();
merge_layers(layers, "Layer 1");
merge_layers(layers, "Layer 1 copy");
function get_layers()
{
try {
$.hiresTimer;
var layers = new Array();
var r = new ActionReference();
r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("count"));
r.putEnumerated(stringIDToTypeID("layer"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum"));
var count = executeActionGet(r).getInteger(stringIDToTypeID("count"));
var n = 0;
if (!app.activeDocument.layers[app.activeDocument.layers.length-1].isBackgroundLayer) { n = 1; ++count; }
for (var i = count-1; i >= n; i--)
{
var r = new ActionReference();
r.putIndex(stringIDToTypeID("layer"), i);
var d = executeActionGet(r);
layers.push({id:d.getInteger(stringIDToTypeID("layerID")), name:d.getString(stringIDToTypeID("name"))});
}
alert("Scanned " + count + " layers in " + ($.hiresTimer/1000000).toFixed(2) + " seconds", "Timer");
return layers;
}
catch (e) { alert(e); throw(e); }
}
function merge_layers(layers, name)
{
try {
$.hiresTimer;
var len = layers.length;
var cnt = 0;
var r = new ActionReference();
for (var i = 0; i < len; i++)
{
if (layers[i].name == name) { r.putIdentifier(stringIDToTypeID("layer"), layers[i].id); ++cnt; }
}
var d = new ActionDescriptor();
d.putReference(stringIDToTypeID("null"), r);
d.putBoolean(stringIDToTypeID("makeVisible"), false);
executeAction(stringIDToTypeID("select"), d, DialogModes.NO);
alert("Selected " + cnt + " \"" + name + "\" in " + ($.hiresTimer/1000000).toFixed(2) + " seconds", "Timer");
$.hiresTimer;
executeAction(stringIDToTypeID("mergeLayersNew"), undefined, DialogModes.NO);
alert("Merged " + cnt + " \"" + name + "\" in " + ($.hiresTimer/1000000).toFixed(2) + " seconds", "Timer");
}
catch (e) { alert(e); throw(e); }
}