Copy link to clipboard
Copied
I created a photoshop listener (Script Events Manager) to trigger which action is played (from the actions panel list) when the user runs it.
The listener fires well and I want to get the 2 vars:
A) Name of the action Set just triggered;
B) Name of the Action just triggered;
We use this to send the result to an external database that collects the Photo-editor history log, and I want to send the set and the action name.
This is the AM code from scriptlistener:
// ______________________
var reference = new ActionReference();
reference.putName( stringIDToTypeID( "action" ), “MyAction Name here" );
reference.putName( stringIDToTypeID( "actionSet" ), “MySetName here" );
descriptor.putReference( charIDToTypeID( "null" ), reference );
executeAction( stringIDToTypeID( "play" ), descriptor, DialogModes.NO );
// ______________________
The listener is installed and it runs a script I named “actionPlayed_listener.jsx"
app.notifiersEnabled = true;
var cstoolEvent = new File(Folder.desktop + "/actionPlayed_listener.jsx");
try{
app.notifiers.add("Ply ", cstoolEvent);
}catch(e){}
}
// the code in the “actionPlayed_listener.jsx” file:
var actionSet_name = myDescriptor.hasKey(stringIDToTypeID("actionSet"));
var action_name = myDescriptor.getName(stringIDToTypeID("action"));
alert(
"Set: " + actionSet_name + "\n"
+ "Action: " + action_name
);
What’s the problem?
actionSet_name ERROR: It returns the name of the action and not the actionSet name!
action_name returns the name of the action
I tested on CC2017 (mac and PC)
Have you another way of return to correct value, or is this a bug we can’t solve?
more correct
...// the code in the “actionPlayed_listener.jsx” file:
var r = arguments[0].getReference(stringIDToTypeID("null"));
var x1, x2;
var t1 = r.getDesiredClass();
switch (r.getForm())
{
case ReferenceFormType.INDEX: x1 = r.getIndex();
case ReferenceFormType.NAME: x1 = r.getName();
}
r = r.getContainer(); // can fail, so use try-catch
var t2 = r.getDesiredClass();
switch (r.getForm())
{
case ReferenceFormType.INDEX: x2 = r.getIndex();
case ReferenceFormType.NAME:
Copy link to clipboard
Copied
var actionSet_name = myDescriptor.hasKey(stringIDToTypeID("actionSet")); // Change struckthrough part to getName.
Copy link to clipboard
Copied
Sorry, I wrote the wrong code.
The bug is still there even using getName
var actionSet_name = myDescriptor.getName(stringIDToTypeID("actionSet"));
// returns wrong data
It returns the name of the action, not the name of the Set.
Copy link to clipboard
Copied
So maybe change getName to getString?
Copy link to clipboard
Copied
getString returns an error because getString is not a method of the ActionReference class
Error:
myDescriptor.getString is not a function
see:
ActionReference in Photoshop DOM
It must be getName
Copy link to clipboard
Copied
"action" can also be an Index type.
use myDescriptor.getForm() to obtain type.
P.S. myDescriptor is an ActionReference you have
Copy link to clipboard
Copied
I used
myDescriptor.getForm(stringIDToTypeID("actionSet"))
and it returned:
ReferenceFormType.NAME
So getName should be working, but it returns not the name of the set but the action name itself.
It's a bug?
Copy link to clipboard
Copied
You use this function incorrectly.
Try to understand how this code works.
Here r (the ActionReference) emits your myDescriptor and contains similar data,
two or even three values: setName(or index), actionName(or index), cmdIndex(or Name)
// example 1
// ref contains name and name
var r = new ActionReference();
r.putName(stringIDToTypeID("actionSet"), "some S");
r.putName(stringIDToTypeID("action"), "some A");
var form1 = r.getForm().toString().replace("ReferenceFormType.", "");
//here can use r.getName or r.getIndex, depending on form1
r = r.getContainer();
var form2 = r.getForm().toString().replace("ReferenceFormType.", "");
alert(form1 + "\n" + form2);
//here can use r.getName or r.getIndex, depending on form2
// example 2
// ref contains name and index
var r = new ActionReference();
r.putName(stringIDToTypeID("actionSet"), "some S");
r.putIndex(stringIDToTypeID("action"), 7);
var form1 = r.getForm().toString().replace("ReferenceFormType.", "");
r = r.getContainer();
var form2 = r.getForm().toString().replace("ReferenceFormType.", "");
alert(form1 + "\n" + form2);
Copy link to clipboard
Copied
Could you install the "play" listener and use the script it runs instead?
I can't start from a well-defined actionSet and action names because I don't know what action the user has run.
Those are the strings I need to catch when the user clicked an action to run.
I created a listener ("Ply ") that automatically runs a script. This is the script we are talking about.
The code I need is to read the data (both actionSet + action names) and send it to a personal database I need.
So, I must start with arguments[0] >> this is my ActionDescriptor which contains my ActionReference with both names I need.
Copy link to clipboard
Copied
Oh oh oh
Try
// the code in the “actionPlayed_listener.jsx” file:
var r = arguments[0].getReference(stringIDToTypeID("null"));
var x1, x2;
switch (r.getForm())
{
case ReferenceFormType.INDEX: x1 = r.getIndex();
case ReferenceFormType.NAME: x1 = r.getName();
}
r = r.getContainer(); // can fail, so use try-catch
switch (r.getForm())
{
case ReferenceFormType.INDEX: x2 = r.getIndex();
case ReferenceFormType.NAME: x2 = r.getName();
}
alert("Set: " + x2 + "\n" + "Action: " + x1);
Copy link to clipboard
Copied
Finally, thank you very much, r-bin!
Sorry I couldn't figure out earlier.
Copy link to clipboard
Copied
more correct
// the code in the “actionPlayed_listener.jsx” file:
var r = arguments[0].getReference(stringIDToTypeID("null"));
var x1, x2;
var t1 = r.getDesiredClass();
switch (r.getForm())
{
case ReferenceFormType.INDEX: x1 = r.getIndex();
case ReferenceFormType.NAME: x1 = r.getName();
}
r = r.getContainer(); // can fail, so use try-catch
var t2 = r.getDesiredClass();
switch (r.getForm())
{
case ReferenceFormType.INDEX: x2 = r.getIndex();
case ReferenceFormType.NAME: x2 = r.getName();
}
alert(typeIDToStringID(t2) + " = " + x2 + "\n" + typeIDToStringID(t1) + " = " + x1);