Skip to main content
olivu1568674
Known Participant
November 20, 2017
Answered

Is there any way to get active layer comp in JSX?

  • November 20, 2017
  • 2 replies
  • 2128 views

I want go get currently active layer comp.

Is there any way to that?

This topic has been closed for replies.
Correct answer r-bin

Probably so. Works in CC2018 (verified)

 

aaa()

function aaa()
    {
    try
        {
        var r = new ActionReference();
        r.putProperty( charIDToTypeID( "Prpr" ), stringIDToTypeID( "json" ) );
        r.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );

        var ret = executeActionGet(r); 

        var json = ret.getString(stringIDToTypeID("json"));

        eval("var obj= " + json);

        var ok = false;

        for (var i = 0; i < obj.comps.length; i++)
            {
            if (obj.comps[i].applied)
                 {
                 var idx = get_comp_idx(obj.comps[i].id);

                 alert ( obj.comps[i].name + "\n\n" + "index: " + (idx-1) + "\n\n" + "id:" + obj.comps[i].id + "\n\n" +
                        "app.activeDocument.layerComps["+(idx-1)+"].name = " + app.activeDocument.layerComps[idx-1].name, "Applied comp");

                 ok = true;
                 break;
                 }
            }

        if (!ok) alert ("No applied comp found");

        function get_comp_idx(id)
            {
            try
                {
                var r = new ActionReference();
                r.putProperty( charIDToTypeID( "Prpr" ), stringIDToTypeID("compsList"));
                r.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
   
                var comps = executeActionGet(r).getList(stringIDToTypeID("compsList")); 

                for (var i = 0; i < comps.count; i++)
                    if (comps.getObjectValue(i).getInteger(stringIDToTypeID("ID")) == id)
                        return comps.getObjectValue(i).getInteger(stringIDToTypeID("itemIndex"));
       
                return -1;
                }
            catch (e) { alert(e); }
            }

        }
    catch (e) { alert(e)  }
    }

 

2 replies

r-binCorrect answer
Legend
November 21, 2017

Probably so. Works in CC2018 (verified)

 

aaa()

function aaa()
    {
    try
        {
        var r = new ActionReference();
        r.putProperty( charIDToTypeID( "Prpr" ), stringIDToTypeID( "json" ) );
        r.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );

        var ret = executeActionGet(r); 

        var json = ret.getString(stringIDToTypeID("json"));

        eval("var obj= " + json);

        var ok = false;

        for (var i = 0; i < obj.comps.length; i++)
            {
            if (obj.comps[i].applied)
                 {
                 var idx = get_comp_idx(obj.comps[i].id);

                 alert ( obj.comps[i].name + "\n\n" + "index: " + (idx-1) + "\n\n" + "id:" + obj.comps[i].id + "\n\n" +
                        "app.activeDocument.layerComps["+(idx-1)+"].name = " + app.activeDocument.layerComps[idx-1].name, "Applied comp");

                 ok = true;
                 break;
                 }
            }

        if (!ok) alert ("No applied comp found");

        function get_comp_idx(id)
            {
            try
                {
                var r = new ActionReference();
                r.putProperty( charIDToTypeID( "Prpr" ), stringIDToTypeID("compsList"));
                r.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
   
                var comps = executeActionGet(r).getList(stringIDToTypeID("compsList")); 

                for (var i = 0; i < comps.count; i++)
                    if (comps.getObjectValue(i).getInteger(stringIDToTypeID("ID")) == id)
                        return comps.getObjectValue(i).getInteger(stringIDToTypeID("itemIndex"));
       
                return -1;
                }
            catch (e) { alert(e); }
            }

        }
    catch (e) { alert(e)  }
    }

 

Jarda Bereza
Inspiring
November 21, 2017

This is interesting. I thought that JSON property returns all properties accessible with document reference without property. But this is exactly same content as from Generator plugin :-)

SuperMerlin
Inspiring
November 20, 2017

This will give the first selected Layer Comp, it does not check if more than one comp is selected!

#target photoshop;

main();

function main(){

var sourceDoc = app.activeDocument;

for( var c = 0; c < sourceDoc.layerComps.length; c++ ){

     if( sourceDoc.layerComps.selected == true ){

         // do whatever get name etc.

         alert(sourceDoc.layerComps.name + " is selected");

         return;

         }}

     alert("No layer comp selected");

};

Jarda Bereza
Inspiring
November 20, 2017

Selected layer comp is not active layer comp.

Activation has its own state button.

I tried to solve this and only thing that worked for me was getting data via generator plugin.