В справочнике Adobe Illustrator CC Reference: JavaScript говорится, что activeDocument.layers
хранит слои документа. Но на самом деле не все, а только верхний уровень.
Дополнительную информацию можно найти в Руководстве по созданию сценариев Adobe Illustrator, где вы найдете схему объектной модели Illustrator. Классы Layer
и GroupItem
могут содержать вложенные объекты одного и того же класса и так далее.
Решение
Чтобы узнать истинное количество слоев в документе Adobe Illustrator, вам понадобится рекурсивная функция. Пример:
var counter = 0; // I know it's not good to use a global variable countingLayers(activeDocument.layers); alert('True layers length: ' + counter); function countingLayers(_layers) { for (var i = 0; i < _layers.length; i++) { var iLayer = _layers[i]; if (iLayer.layers.length > 0) { countingLayers(iLayer.layers); } counter++; } }
Функция countingLayers()
принимает в качестве входных данных все слои верхнего уровня. В цикле выясняем, содержит ли каждый слой подслои или нет. Если это так, функция вызывает себя с новым аргументом: все подслои текущего слоя.
В использовании
Я использовал аналогичную рекурсию в RenameItems, чтобы найти и заменить символы в именах слоев. Рекурсивные функции также хороши для перечисления всех вложенных групп или получения самого верхнего слоя, где находится объект.