Copy link to clipboard
Copied
Hello all.
Does anyone know if there is a way to apply the same Action to all the layers in the Layers Palette? I imported a video sequence and would like to carry out a semi-rotoscope action on all the layer prior to exporting the video. Batch doesn't seem to do it, it can only work on files in a folder.
Thank you in advance,
Sarah
Birmingham City University
UK
Ps: I am definitely not a scripter, but willing to learn! I don't even know the scripting language in Photoshop. š
script runs selected action in actions palette for all selected layers
#target photoshop
var s2t = stringIDToTypeID;
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('targetLayersIDs'));
r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'));
var lrs = executeActionGet(r).getList(p);
(r = new ActionReference()).putEnumerated(s2t('action'), s2t('ordinal'), s2t('targetEnum'));
try {
try {
var atn = executeActionGet(r).getString(s2t('name')),
...
Copy the code from this page, create a new document in any text editor, paste the code. Save it in plain text (txt) format with any filename. After (or during) saving, change the file extension from ".txt" to ".jsx" (so that Photoshop understands that this is a file with a script inside).
Find the folder where you have installed Photoshop, place the * .jsx file in the \Presets\Scripts\ directory. Restart Photoshop, after that the script will appear in the File-> Scripts menu. After that, you can
...Copy link to clipboard
Copied
How would your action know what to do for each layer it processes. It would be easy for a script to do your Action with each layer in the document being the document active layer. What would your action do for smart object layers, for adjustment layers, for gradient fills for pattern fills etc. Your action can test just a few layer conditions and would need to play other actions to handle layer conditions. The list of condition an Action can test is very limited. It can not even test if the active layer is a smart object layer?????
You need to learn scripting to Process all layer in a document.
if (documents.length) {
// declare Global variables
var layerList = new Array;
var setList = new Array;
var allList = new Array;
var allLayers = "";
main();
for( var i = 0; i < layerList.length; i++) {processLayer(layerList[i]);}
//alert("Layerset: " + setList.length + " Layers: " + layerList.length + " Total: " + allList.length + "\n\n" +allLayers);
logInfo("Layerset: " + setList.length + " Layers: " + layerList.length + " Total: " + allList.length + "\n\n" +allLayers);
}
//////////////////////////////////////////////////////////////////////////////////////////////
function main() {
processLayers(activeDocument)
}
function processLayers(obj) {
for( var i = obj.layers.length-1; 0 <= i; i--) {
if (obj.layers[i].kind!=undefined) {
layerList.push(obj.layers[i]);
allList.push(obj.layers[i]);
}
else {
setList.push(obj.layers[i]);
allList.push(obj.layers[i]);
processLayers(obj.layers[i]);
}
}
}
function processLayer(layer) {
//alert('Layer Name = "' + layer.name + '" Layer Kind ' + layer.kind );
allLayers = allLayers + layer.name + " , ID " + layer.id + ", " + layer.kind + "\n";
//allLayers = allLayers + obj_to_str(layer) + "\n";
}
function obj_to_str(obj){
var str = "";
for (var p in obj) {
if(obj.hasOwnProperty(p)) {
try{str+=p+"::"+obj[p]+"\n";}
catch(e){};
}
}
return str;
}
function logInfo(Txt){
try {
var file = new File(Folder.desktop + "/LayersBotToTop.txt");
file.open("w", "TEXT", "????");
//alert(file.encoding);
file.encoding = "UTF8";
file.seek(0,2);
$.os.search(/windows/i) != -1 ? file.lineFeed = 'windows' : file.lineFeed = 'macintosh';
file.writeln(Txt);
if (file.error) alert(file.error);
file.close();
file.execute();
}
catch(e) { alert(e + ': on line ' + e.line, 'Script Error', true); }
};
You could modify this script. Modify the processLayer make normal Layer the Active layer and use the doaction method to run your action ignore all other layer kinds.
Copy link to clipboard
Copied
Thank you JJMack. This is clearly not a trivial thing and as you say I would need to learn Javascript (?) to get this to work. I did have a clunky workaround which was to save all the layers as documents into a folder and then run a batch procedure on them.
Copy link to clipboard
Copied
"same Action to all the layers in the Layers Palette? "
Well, difficult thing using action unless your documents always have same amount of layers. You can record action with conditional steps to start from top most layer then to check and stop playing (play None action) when it hits Background layer for example. If every conditional step have that condition then you can insert as many if steps as you want and everything will work fine if you have Background layer what can be also checked and fixed. If you want to process and Background layer then check in the very last if step for Background layer and play action to process Background layer.
Copy link to clipboard
Copied
Thankyou so much Bojan.
I'll have a go, thank you for the information. This isn't as easy as I hoped it might be!
All the best,
Cathy
Copy link to clipboard
Copied
script runs selected action in actions palette for all selected layers
#target photoshop
var s2t = stringIDToTypeID;
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('targetLayersIDs'));
r.putEnumerated(s2t('document'), s2t('ordinal'), s2t('targetEnum'));
var lrs = executeActionGet(r).getList(p);
(r = new ActionReference()).putEnumerated(s2t('action'), s2t('ordinal'), s2t('targetEnum'));
try {
try {
var atn = executeActionGet(r).getString(s2t('name')),
set = executeActionGet(r).getString(s2t('parentName'));
}
catch (e) { throw 'Before start select any action from actions palette!' }
for (var i = 0; i < lrs.count; i++) {
(r = new ActionReference()).putIdentifier(s2t('layer'), lrs.getReference(i).getIdentifier(s2t('layerID')));
(d = new ActionDescriptor()).putReference(s2t('target'), r);
try { executeAction(s2t('select'), d, DialogModes.NO); } catch (e) { throw e + '\nCannot select layer!' }
(r = new ActionReference()).putName(s2t('action'), atn);
r.putName(s2t('actionSet'), set);
(d = new ActionDescriptor()).putReference(s2t('target'), r);
try { executeAction(s2t('play'), d) } catch (e) { throw e + '\nCannot play action "' + atn + '" from set "' + set + '"' }
}
} catch (e) { alert(e) }
Copy link to clipboard
Copied
That is a much better way you run the action on the layer you want to process not have to filter layer types in a custom script before running the action.
I forget to highlight an action when I did delect an action that action added a nen document frone the layer the script failed because of the doc switch.
The script could be improved to test if the docoment has been switched and if it has try to switch back to the document the script was run from.
Its a neet script
Copy link to clipboard
Copied
I try not to write complex scripts that provide for all possible states of the objects involved in them, when it comes to solving a simple problem. That is, it is better to literally follow the instructions š
Copy link to clipboard
Copied
I understand still I think a novice will think the script you posted is buggy when it failes because the script was missued
Copy link to clipboard
Copied
I made some edits to the code š
Copy link to clipboard
Copied
Yes I made a mod like that...good show as usual. You know how to code Action manger code well. Thanks for helping us out here....
Copy link to clipboard
Copied
Copy link to clipboard
Copied
Haha, Users, right?
Cathy.
Copy link to clipboard
Copied
"This issue was resolved by improving type checking of user inputs."
Copy link to clipboard
Copied
Thank you Jazz-y
I think without an understanding of scripting I will have little chance of understanding this. I don't even know where to enter the script. Is there a script editor in Photoshop? I do a little scripting in Maya (MELscript), but that has a dedicated location for scripts.
I really appreciate you taking the time to answer me. I am just a user, with very limited programming background (though I did use Cobol and RPGII at one time!)
All the best,
Cathy.
Copy link to clipboard
Copied
Copy the code from this page, create a new document in any text editor, paste the code. Save it in plain text (txt) format with any filename. After (or during) saving, change the file extension from ".txt" to ".jsx" (so that Photoshop understands that this is a file with a script inside).
Find the folder where you have installed Photoshop, place the * .jsx file in the \Presets\Scripts\ directory. Restart Photoshop, after that the script will appear in the File-> Scripts menu. After that, you can run it manually, assign a hotkey, or record it into an action.
Copy link to clipboard
Copied
Wow, that's brilliant, just what I need Thank you!
You've made me want to learn scripting!
Very best wishes from a grateful user.
Cathy x
Copy link to clipboard
Copied
Hi, can somebody modify this script from jazz-y so you don't have to preselect the action, but rather have the action name in the script already?
Copy link to clipboard
Copied
You can modify it yourself. atn is the name of the action, set is the name of the action set.
Copy link to clipboard
Copied
you mean here?
var atn = executeActionGet(r).getString(s2t('name')),
set = executeActionGet(r).getString(s2t('parentName'));
I did try before I posted question. Name = action name, parentName = action group/set
But stil no go.
Copy link to clipboard
Copied
You can take a look at the following topics as well:
Copy link to clipboard
Copied
I saw all that links, but I don't know how to modify the script properly. š
I just need script with the action name in it, so I can call that scrip from another action.
Copy link to clipboard
Copied
You can play action using action step without script. While recording action simply play any action and that will be recorded as action step. Do not rename action set or action later, that will break step.
Copy link to clipboard
Copied
I saw all that links, but I don't know how to modify the script properly. š
I just need script with the action name in it, so I can call that scrip from another action.
By @filips97187540
The various scripts have comments indicating where to change the name of the action set and action.