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!
Algo como esto debería funcionar....
var activelayer = application.document.activeLayer;
if(activeLayer){
var layers = getSelectedLayers();
}else{
alert("Select a Layer");
}
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 code
formato 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;
}
p2or