Скрипт, перебирающий слои, останавливается на полпути

Я пытаюсь перебрать каждый слой в документе, и по какой-то причине мой скрипт проходит только первую половину (13 из 25), а затем в 14 он говорит, что элемент не существует. Не могли бы вы, ребята, помочь мне понять, почему? Ниже приведен фрагмент кода, который проходит через каждый слой.

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

Ответы (4)

Поскольку у меня нет рабочей копии вашего скрипта, это немного сложно для меня, но я написал скрипт раньше, и вот функция, которая бросает и скрывает все слои:

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

Вы заметите, что он просто захватывает длину объекта слоев, а затем перебирает каждый слой. В этом отношении наши скрипты практически идентичны. Если встречается группа слоев (как проверяется оператором if), то выполняется рекурсивный вызов, чтобы скрыть все вложенные слои. (Также мой refпараметр activeDocument).

В целях отладки я бы предложил посмотреть, сможете ли вы запустить мою функцию без каких-либо ошибок. Если это так, то вы знаете, что проблема заключается не в повторении всех слоев, а в логике, которую вы пытаетесь выполнить на каждом слое, а затем убедитесь, что любая логика, которую вы пытаетесь использовать, действительна для этого типа. слоя (растрового, текстового, фигурного и т. д.)

Другим методом может быть заполнение вашего цикла полезными предупреждениями (или, что еще лучше, просто журналами или точками останова) и проверка значения переменных по мере их прохождения.

Есть много причин, по которым скрипт может остановиться преждевременно. Часто это зависит от документа. В этом случае это может быть неправильный символ в имени слоя . Попробуйте убить слой 14 и посмотреть, что произойдет.

Для отладки запустите сценарий из набора Adobe ExtendScript Tool Kit. Вы можете просто позволить ему застрять или установить определенные перерывы для проверки определенных моментов в процессе.

также добавьте, что это может быть проблема с группировкой. Возможно, вам придется изолировать все на одном слое и ничего не иметь в папке.

Вставка слоев в группы папок — это рабочий процесс при импорте PSD в ToonBoom Harmony. Глядя на приведенный выше код, итерация вперед кажется проблемой, так как каждый раз, когда вы добавляете группу, она, вероятно, увеличивает количество слоев. Возвращение назад решает проблему для меня! надеюсь это поможет.

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