Das Skript, das Ebenen durchläuft, stoppt auf halbem Weg

Ich versuche, jede Ebene in einem Dokument zu durchlaufen, und aus irgendeinem Grund geht mein Skript nur durch die erste Hälfte (13 von 25) und dann bei 14 sagt es, dass das Element nicht existiert. Könnt ihr mir helfen herauszufinden, warum? Unten ist das Code-Snippet, das durch jede Ebene geht

function processLayers(extension)
{
    var doc = app.activeDocument;
    //go through each layer and create a folder
    alert('length is ' + doc.artLayers.length);
    var length = doc.artLayers.length;
    for (var layer = 0; layer < length; layer++)
    {
        var folderName = generateFolderName(doc.artLayers[layer].name, extension);
        //create folder in photoshop with folderName
        var folder = doc.layerSets.add();
        folder.name = folderName;
        doc.artLayers[layer].move(folder, ElementPlacement.INSIDE);     
    }
}

Antworten (4)

Da ich keine funktionierende Kopie Ihres Skripts habe, ist dies etwas schwierig für mich, aber ich habe zuvor ein Skript geschrieben und hier ist eine Funktion, die throw auslöst und alle Ebenen ausblendet:

function hideLayers(ref) {
    var len = ref.layers.length;
    for (var i = 0; i < len; i++) {
        var layer = ref.layers[i];
        if (layer.typename == 'LayerSet') hideLayers(layer);
        else layer.visible = false;
    }
}

Sie werden feststellen, dass es einfach die Länge des Ebenenobjekts erfasst und dann über jede Ebene iteriert. In dieser Hinsicht sind unsere Skripte nahezu identisch. Wenn eine Ebenengruppe gefunden wird (wie von der ifAnweisung überprüft), führt sie einen rekursiven Aufruf aus, um alle verschachtelten Ebenen auszublenden. (Auch mein refParameter ist activeDocument).

Was ich zu Debugging-Zwecken vorschlagen würde, ist zu sehen, ob Sie meine Funktion ohne Fehler ausführen können. Wenn ja, dann wissen Sie, dass das Problem nicht darin besteht, alle Schichten zu durchlaufen, sondern in der Logik, die Sie auf jeder Schicht auszuführen versuchen, und stellen Sie dann sicher, dass die Logik, die Sie verwenden möchten, für diesen Typ gültig ist der Ebene (Raster, Text, Form usw.)

Eine andere Technik wäre, Ihre Schleife mit hilfreichen Warnungen (oder noch besser nur Protokollen oder Haltepunkten) zu füllen und den Wert der Variablen zu überprüfen, wenn sie durchkommen.

Es gibt viele Gründe, warum ein Skript vorzeitig beendet werden kann. Oft hängt es vom Dokument ab. In diesem Fall könnte es sich um ein ungültiges Zeichen in einem Ebenennamen handeln . Versuchen Sie, Schicht 14 zu töten, und sehen Sie, was passiert.

Führen Sie zum Debuggen Ihr Skript aus dem ExtendScript Tool Kit von Adobe aus. Sie können es einfach stecken lassen oder bestimmte Unterbrechungen festlegen, um bestimmte Punkte im Prozess zu inspizieren.

Fügen Sie auch hinzu, dass es sich um ein Gruppierungsproblem handeln könnte. Möglicherweise müssen Sie alles auf einer Ebene isolieren und nichts in einem Ordner haben.

Das Einfügen von Ebenen in Ordnergruppen ist der Arbeitsablauf beim Importieren von PSDs in ToonBoom Harmony. Wenn Sie sich den obigen Code ansehen, scheint das Vorwärts-Iterieren das Problem zu sein, da jedes Mal, wenn Sie eine Gruppe hinzufügen, die Anzahl der Ebenen wahrscheinlich erhöht wird. Rückwärts gehen löst das Problem für mich! hoffe das hilft.

function PrepLayersForToonBoomImport()
{
    var doc = app.activeDocument;
    //go through each layer and create a folder
    //alert('length is ' + doc.artLayers.length);
    var length = doc.artLayers.length-1;
    for (var layer = length; layer >= 0 ; layer--)
    {
        var folderName = doc.artLayers[layer].name;
        //create folder in photoshop with folderName
        var folder = doc.layerSets.add();
        folder.name = folderName;
        doc.artLayers[layer].move(folder, ElementPlacement.INSIDE);     
    }
}

PrepLayersForToonBoomImport()