Answered
When a get layerSet id, any way to get all children layers id by ActionManager?
We can traverse all layers by following code in dfs order:
/**
* @9397041 {LayerSet} layerSet
*/
function traverse(layerSet) {
const layers = layerSet.layers;
for (var layer, i = layers.length - 1; i >= 0; i--) {
layer = layers[i];
if (layer.typename === 'LayerSet') {
traverse(layer);
}
$.writeln(layer.name);
}
}
But using DOM api is very expensive, I want to use actiom manager api to implements dfs order traverse. For now, I can using following code to traverse all layers in linear order:
function traverseByAmInLinearOrder(callback) {
var ref = new ActionReference();
ref.putProperty(charIDToTypeID('Prpr'), charIDToTypeID('NmbL'));
ref.putEnumerated(charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
var desc = executeActionGet(ref);
var layerCount = desc.getInteger(charIDToTypeID('NmbL'));
var i = 0;
try {
activeDocument.backgroundLayer;
} catch (e) {
i = 1;
}
for (i; i <= layerCount; i++) {
var ref = new ActionReference();
ref.putIndex(charIDToTypeID('Lyr '), i);
var desc = executeActionGet(ref);
var id = desc.getInteger(stringIDToTypeID('layerID'));
if (desc.getInteger(stringIDToTypeID('layerKind')) !== 13) {
callback(desc);
}
}
}
traverseByAmInLinearOrder(function (desc) {
$.writeln(desc.getString(stringIDToTypeID('name')));
});
In order to traverse layers in dfs order by am, I need to find a method to get all child layers id of layerSet by am. Any bros have ideas?


