Завершение сценария Photoshop, когда не выбраны слои

Я работал с функцией, которую нашел здесь в stackoverflow, которая, насколько я могу судить, работает, группируя слои, выгружая имена слоев в массив, а затем разгруппируя их.

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();

К сожалению, когда слои не выбраны и эта функция запущена, Photoshop выдает сообщение

Команда «Группировать слои» в настоящее время недоступна.

Есть ли способ хотя бы вернуть нулевое значение, когда это происходит без остановки скрипта? Таким образом, я мог бы отобразить сообщение о необходимости выбора слоев, когда оно равно нулю.

ИЛИ Есть ли способ определить, что слои не выбраны, прежде чем функция попытается запустить функцию группировки?

Любая помощь приветствуется!

Чтобы получить исчерпывающий ответ, пожалуйста, объясните, почему вам нужно это проверить. Вы перебираете слои, делаете их активными и хотите проверить, достигли ли вы последнего? Я бы предложил сначала подсчитать и отсортировать слои.

Ответы (2)

Что-то вроде этого должно работать....

var activelayer = application.document.activeLayer;

if(activeLayer){
   var layers = getSelectedLayers();
}else{
   alert("Select a Layer");
}
К сожалению уже пробовал. При запуске var activeLayer = activeDocument.activeLayer; функция main () { оповещение (activeLayer); } главный(); если в Photoshop не выбраны слои, он возвращает имя верхнего слоя на панели слоев. Не знаю, почему.
Да, похоже, раньше это работало, но я схожу с ума. Есть несколько других значений, которые вы могли бы проверить, вы, вероятно, думали об этом... code//Вы могли бы проверить, что это за слой. ArtLayers Не содержит массив слоев внутри // activeLayer.typename === "LayerSet" // если Layerset проверяет длину массива app.activeDocument.activeLayer.layers //activeLayer.typename === "ArtLayer" // если artLayer он может иметь "вид" // Или вы можете проверить границы слоя, чтобы увидеть, codeвыглядит ли его пустое форматирование ужасно, извините за это.

Я думаю, что это сработает, я проверил это... Проверив objType, вы можете увидеть, является ли он массивом или LayerSet/Folder. Я надеюсь, что это поможет вам на правильном пути.

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;
}