Copy link to clipboard
Copied
Hi
I need to run a script into a save action, and could use some help to rewrite a script.
The action i need the script to do, is merging each main group/artboard into seperate layers.
Is it possible to rewrite the script, so that photoshop selects the top layer (In my case a Artboard group) ?
When using "select --> All layers" i get a error (See attached) But if i manually select the top artboard, the scripts runs perfect!
This is my current script, and i think i just need to add a "select top group" kinda code.
Copy link to clipboard
Copied
Can you provide before/after screenshots of the layers panel? A sample PSD would also be helpful too.
Copy link to clipboard
Copied
Hi Stephen
Attached is 2 screenshots. The first is how my files would be build in the future, and it could spand from 2 to approx 10 artboards. The other screenshot is the intended end goal. This is possible with the script, only if i manually select the top group, and i cant record that in a action in a good way. So is it possible to write the script, so that the top group is always selected, not taking account of the name. ?
I've also attached a sample PSD.
Thanks 🙂
Copy link to clipboard
Copied
Instead of the original script, here are two alternative scripts that you may wish to try, which don't require any layers to be selected. I have added the extra code to rasterize the SO layer:
/* convert all top level layers and layer sets to smart objects AM CODE.jsx
by jazz-y
Smart Objects in separate layers
https://community.adobe.com/t5/photoshop/smart-objects-in-separate-layers/td-p/11137197
*/
#target photoshop
s2t = stringIDToTypeID;
t2s = typeIDToStringID;
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('hasBackgroundLayer'));
r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'))
var indexFrom = executeActionGet(r).getBoolean(p) ? 0 : 1;
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('numberOfLayers'));
r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'))
var indexTo = executeActionGet(r).getInteger(p);
var layers = {}
parseLayerSets(indexFrom, indexTo, layers)
for (o in layers) {
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerKind'));
r.putIdentifier(s2t("layer"), layers[o].id);
var kind = executeActionGet(r).getInteger(p)
if (kind != 2 && kind != 5) {
(r = new ActionReference()).putIdentifier(s2t("layer"), layers[o].id);
(d = new ActionDescriptor()).putReference(s2t("null"), r);
executeAction(s2t("select"), d, DialogModes.NO)
try {
executeAction(s2t("newPlacedLayer"), undefined, DialogModes.NO);
activeDocument.activeLayer.rasterize(RasterizeType.ENTIRELAYER);
} catch (e) {
alert(e)
}
}
}
function parseLayerSets(from, to, parentObj) {
for (var i = from; i <= to; i++) {
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerSection'));
r.putIndex(s2t("layer"), i)
var section = t2s(executeActionGet(r).getEnumerationValue(p))
if (section == 'layerSectionEnd') {
i = parseLayerSets(i + 1, to, parentObj[i] = {})
continue;
}
var properties = {};
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('layerID'));
r.putIndex(s2t("layer"), i);
properties.id = executeActionGet(r).getInteger(p);
if (section == 'layerSectionStart') {
for (o in properties) {
parentObj[o] = properties[o]
}
return i;
} else {
parentObj[i] = properties
}
}
}
Or perhaps this one:
/* convert all top level layers and layer sets to smart objects.jsx
Smart Objects in separate layers
https://community.adobe.com/t5/photoshop/smart-objects-in-separate-layers/td-p/11137197
*/
function main() {
if (!documents.length) {
alert('There are no documents open!');
} else {
processAllLayersAndSets(app.activeDocument);
}
function processAllLayersAndSets(obj) {
// Process all layers and layer sets
// Change the following 2 entries of "obj.layers" to "obj.artLayers" to exclude layer sets
for (var al = obj.layers.length - 1; 0 <= al; al--) {
app.activeDocument.activeLayer = obj.layers[al];
newPlacedLayer();
activeDocument.activeLayer.rasterize(RasterizeType.ENTIRELAYER);
}
// Process Layer Set Layers
for (var ls = obj.layerSets.length - 1; 0 <= ls; ls--) {
processAllLayersAndSets(obj.layerSets[ls]);
newPlacedLayer();
activeDocument.activeLayer.rasterize(RasterizeType.ENTIRELAYER);
}
}
// Convert to smart object (Cleaned AM code)
function newPlacedLayer() {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
executeAction(s2t("newPlacedLayer"), undefined, DialogModes.NO);
}
}
activeDocument.suspendHistory('Smart Objects from Layers & Sets', 'main()');
Copy link to clipboard
Copied
Is it possible to rewrite the script, so that photoshop selects the top layer (In my case a Artboard group) ?
By @Simon3344797511r3
Is the problem that no artboards or layers are currently selected before running the script (your sample PSD had a layer selected, so I wasn't sure)?
If so, you can add the following code to ensure that the very top layer is selected:
activeDocument.activeLayer = activeDocument.layerSets[0].layers[0];
activeDocument.activeLayer = activeDocument.activeLayer.parent;
I'm guessing that you only need this once, before the while loop to ensure that the top artboard is selected, before the script loops over and rasterizes the artboards.
Find more inspiration, events, and resources on the new Adobe Community
Explore Now