CS5 Скрытие слоев болезненно медленно

Разве только мне кажется, что скрипты CS5 работают медленно? Эти несколько строк занимают 1 минуту, чтобы выполнить.

for (n=0; n<app.activeDocument.layerSets.length; n++) {
  app.activeDocument.layerSets[n].visible = false;
}

Число наборов слоев - 20. Я запускаю 64-разрядную версию CS5.1 в системе Vista Home Premium, AMD Athlon 64 X2 Dual Core 5200+ с оперативной памятью 8 ГБ.

Я попытался экспортировать script в качестве .JSXBIN, но он по-прежнему занимает более 1 минуты. Использование ЦП для CS5.1 идет от 3% до 57%, когда CS5.1 работает .JSXBIN script.

Здесь должно быть что-то не так, как я могу ускорить выполнение скриптов?

//Спасибо

* РЕДАКТИРОВАТЬ * Кажется, что проблема с CS5 собственной DOM является проблемой здесь. script ускоряется более двух раз, считывая значения, связанные с DOM, в локальные переменные.

var LayerCount = app.activeDocument.layerSets.length;
var LayerRoot = app.activeDocument.layerSets;

for (n=0; n<LayerCount; n++) {
  LayerRoot[n].visible = false;
}

... но все же, это далеко не так много времени, чтобы просто изменить свойство в 20 объектах. Любая помощь в оптимизации будет оценена:)

Ответы

Ответ 1

Единственное, о чем я могу подумать, - попытаться пропустить отдельные слои в app.activeDocument.layers, который содержит все слои и группы. Когда вы это сделаете, вы заметите, что сгруппированные слои по-прежнему сохраняют свое первоначальное свойство visible, но скрыты, потому что их родительская группа скрыта.

#target photoshop

var myLayers = app.activeDocument.layers;
var myLayersLength = myLayers.length;

for (var i=0; i<myLayersLength; i++) {
    myLayers[i].visible = false;
}

EDIT: Итак, я протестировал это решение в файле размером 400 Мбайт с 50 слоями, и он работал серьезно менее чем за секунду. Вы уверены, что проблема связана с Photoshop?

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

#target photoshop

var doc = app.activeDocument;
findLayers(doc);


function findLayers(set) {
    for (var i=0; i<set.layerSets.length; i++) {

        //recursive call
        findLayers(set.layerSets[i]);

        //iterate sub-layers and hide
        for (var j=0; j<set.layerSets[i].layers.length; j++) {
            set.layerSets[i].layers[j].visible = false;
        }
    }

    //hide top-level layers
    for (var l=0; l<set.layers.length; l++) {
        set.layers[l].visible = false;
    }
}

Это займет немного больше времени, ~ 20 секунд на моей машине, но он попадет в каждый слой в документе.

ПРИМЕЧАНИЕ. Я также проверил ваши исходные сценарии из вопроса, и они не работают с негрупповыми слоями, потому что вы выполняете итерацию через document.layerSets вместо document.layers