Beenden eines Photoshop-Skripts, wenn keine Ebenen ausgewählt sind

Ich habe mit einer Funktion gearbeitet, die ich hier auf Stackoverflow gefunden habe und die, soweit ich das beurteilen kann, funktioniert, indem sie die Ebenen gruppiert, Ebenennamen in ein Array ablegt und dann die Gruppierung aufhebt.

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

Wenn keine Ebenen ausgewählt sind und diese Funktion ausgeführt wird, wirft Photoshop leider die Meldung

Der Befehl „Ebenen gruppieren“ ist derzeit nicht verfügbar.

Gibt es eine Möglichkeit, zumindest einen Nullwert zurückzugeben, wenn dies geschieht, ohne dass das Skript zum Stillstand kommt? Auf diese Weise könnte ich eine Meldung anzeigen, dass Ebenen ausgewählt werden müssen, wenn sie null ist.

ODER Gibt es eine Möglichkeit festzustellen, dass keine Ebenen ausgewählt sind, bevor die Funktion versucht, die Gruppierungsfunktion auszuführen?

Jede Hilfe wird sehr geschätzt!

Um eine solide Antwort zu erhalten, erklären Sie bitte, warum Sie dies überprüfen müssen. Du iterierst durch die Ebenen, aktivierst sie und möchtest prüfen, ob du die letzte erreicht hast? Ich würde vorschlagen, zuerst die Schichten zu zählen und zu sortieren.

Antworten (2)

So etwas sollte funktionieren....

var activelayer = application.document.activeLayer;

if(activeLayer){
   var layers = getSelectedLayers();
}else{
   alert("Select a Layer");
}
Leider schon probiert. Beim Ausführen von var activeLayer = activeDocument.activeLayer; Funktion main(){ alert(activeLayer); } hauptsächlich(); Wenn in Photoshop keine Ebenen ausgewählt sind, wird der Name der obersten Ebene im Ebenenbedienfeld zurückgegeben. Keine Ahnung warum.
Ja, es sieht so aus, als ob das früher funktioniert hat, als ob ich aus dem Gedächtnis gehe. Es gibt ein paar andere Werte, die Sie überprüfen könnten, Sie haben wahrscheinlich an diese gedacht ... code// Sie könnten überprüfen, um welche Art von Ebene es sich handelt. ArtLayers enthalten kein Layer-Array // activeLayer.typename === "LayerSet" // if Layerset prüft die Länge des app.activeDocument.activeLayer.layers-Arrays //activeLayer.typename === "ArtLayer" // if artLayer kann eine "Art" haben // Oder Sie könnten die Grenzen der Ebene überprüfen, um zu sehen, ob ihre leere codeFormatierung schrecklich aussieht, tut mir leid.

Ich denke, das wird funktionieren, ich habe es getestet ... Indem Sie den objType überprüfen, können Sie sehen, ob es sich um ein Array oder ein LayerSet/Folder handelt. Ich hoffe, das bringt Sie auf den richtigen Weg.

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