Terminar un script de Photoshop cuando no hay capas seleccionadas

He estado trabajando con una función que encontré en stackoverflow aquí que funciona, por lo que puedo decir, agrupando las capas, volcando los nombres de las capas en una matriz y luego desagrupándolas.

function getSelectedLayers(){
    var idGrp = stringIDToTypeID( "groupLayersEvent" );
    var descGrp = new ActionDescriptor();
    var refGrp = new ActionReference();
    refGrp.putEnumerated(charIDToTypeID( "Lyr " ),charIDToTypeID( "Ordn" ),charIDToTypeID( "Trgt" ));
    descGrp.putReference(charIDToTypeID( "null" ), refGrp );
    executeAction( idGrp, descGrp, DialogModes.ALL );
    var resultLayers=new Array();
    for (var ix=0;ix<app.activeDocument.activeLayer.layers.length;ix++){resultLayers.push(app.activeDocument.activeLayer.layers[ix])}
    var id8 = charIDToTypeID( "slct" );
        var desc5 = new ActionDescriptor();
        var id9 = charIDToTypeID( "null" );
        var ref2 = new ActionReference();
        var id10 = charIDToTypeID( "HstS" );
        var id11 = charIDToTypeID( "Ordn" );
        var id12 = charIDToTypeID( "Prvs" );
        ref2.putEnumerated( id10, id11, id12 );
    desc5.putReference( id9, ref2 );
    executeAction( id8, desc5, DialogModes.NO );
    return resultLayers;
}   
var layers = getSelectedLayers();

Desafortunadamente, cuando no se seleccionan capas y se ejecuta esta función, Photoshop arroja el mensaje

El comando "Capas de grupo" no está disponible actualmente.

¿Hay alguna forma de al menos devolver un valor nulo cuando esto sucede sin que el script se detenga? De esa manera, podría mostrar un mensaje sobre la necesidad de seleccionar capas cuando es nulo.

O ¿Hay alguna forma de determinar que no se seleccionan capas antes de que la función intente ejecutar la función de agrupación?

¡Cualquier ayuda es muy apreciada!

Para obtener una respuesta sólida, explique por qué necesita verificar esto. ¿Está iterando a través de las capas, las activa y desea verificar si llegó a la última? Sugeriría contar y ordenar las capas primero.

Respuestas (2)

Algo como esto debería funcionar....

var activelayer = application.document.activeLayer;

if(activeLayer){
   var layers = getSelectedLayers();
}else{
   alert("Select a Layer");
}
Desafortunadamente ya lo intenté. Al ejecutar var activeLayer = activeDocument.activeLayer; función principal () { alerta (capa activa); } principal(); sin capas seleccionadas en Photoshop, devuelve el nombre de la capa superior en el panel de capas. Ni idea de por qué.
Sí, parece que esto solía funcionar pero me estoy quedando sin memoria. Hay algunos otros valores que podría verificar, probablemente haya pensado en estos... code//Podría verificar el tipo de capa que es. ArtLayers No tienen la matriz de capas dentro de ellas // activeLayer.typename === "LayerSet" // si Layerset verifica la longitud de la aplicación.activeDocument.activeLayer.layers array length //activeLayer.typename === "ArtLayer" // si artLayer puede tener un "tipo" // O puede verificar los límites de la capa para ver si su codeformato vacío se ve horrible, lo siento.

Creo que esto funcionará, lo probé... Al verificar objType, puede ver si es una matriz o LayerSet/Folder. Espero que esto te lleve por el buen camino.

function getSelectedLayers(){
        var objType = typeof app.activeDocument.activeLayer.layers;
        if(objType !== "undefined"){    
            var len = app.activeDocument.activeLayer.layers.length;
            if(len > 0){            
                    var idGrp = stringIDToTypeID( "groupLayersEvent" );
                    var descGrp = new ActionDescriptor();
                    var refGrp = new ActionReference();
                    refGrp.putEnumerated(charIDToTypeID( "Lyr " ),charIDToTypeID( "Ordn" ),charIDToTypeID( "Trgt" ));
                    descGrp.putReference(charIDToTypeID( "null" ), refGrp );
                    executeAction( idGrp, descGrp, DialogModes.ALL );
                    var resultLayers=new Array();
                    for (var ix=0;ix<len;ix++){
                                   resultLayers.push(app.activeDocument.activeLayer.layers[ix])
                    };
                    var id8 = charIDToTypeID( "slct" );
                    var desc5 = new ActionDescriptor();
                    var id9 = charIDToTypeID( "null" );
                    var ref2 = new ActionReference();
                    var id10 = charIDToTypeID( "HstS" );
                    var id11 = charIDToTypeID( "Ordn" );
                    var id12 = charIDToTypeID( "Prvs" );
                    ref2.putEnumerated( id10, id11, id12 );
                    desc5.putReference( id9, ref2 );
                    executeAction( id8, desc5, DialogModes.NO );
                      return resultLayers;
            }
   }
    return null;
}