Небольшое дополнение к сценариям выше.
После тестирования в Ps я наткнулся на тот факт, что если в текущем рабочем процессе есть группы, сценарии не работают должным образом. Они не учитывают слои внутри групп, известные как layerSets на языке сценариев; когда скрипт перечисляет "слои", он обрабатывает только элементы верхнего уровня (слои вне групп и сами группы).
Поэтому я попытался приспособить их к более расширенным потребностям.
Модифицированные скрипты ниже; они могут правильно обрабатывать рабочие процессы со слоями и группами верхнего уровня и вложенными элементами в группах верхнего уровня. С большей иерархией они также будут работать, если активный слой не является дважды вложенным элементом (в противном случае "down" -скрипт переключится на самый верхний уровень, а "up" -скрипт просто ничего не сделает). Но я действительно очень редко сталкиваюсь с не один раз вложенными группами, и в худшем случае можно сделать старый добрый щелчок мыши, если в этом есть необходимость (или используйте устаревшие сочетания клавиш Alt+[/], они все еще работают на всех не скрытых слоях, даже если они вложенные).
Извините, я далеко не программист, поэтому полнофункциональный код за пределами моего мозга; Более того, я полагаю, что эти сценарии тоже довольно громоздкие. Но они работают. (Например, я назначаю цикл "вверх" для F3, цикл "вниз" для F4 и скрипт «toggle-visibility» для F2; для меня эта комбинация довольно удобна и экономит много времени).
«Цикл-вниз» -script
var doc = app.activeDocument;
var currentLayer = doc.activeLayer;
//===========
var gropp = doc.layerSets.length;
var docl = doc.layers.length;
var sublayer = 0;
//alert(gropp)
for (i=0; i < gropp;)
{
sublayer = sublayer + doc.layerSets[i].layers.length;
i++;
}
//==============
var a = -1
var kk = -1
var aa = -1
//если активный слой - элемент высшего порядка:
for(i=0; i<docl;)
{
if(doc.layers[i]==currentLayer)
{
a=i;
i = docl;
}
else{ i++;}
}
//если активный слой - элемент группы:
if (a<0)
{
for (i=0; i<gropp;)
{
var subdocl = doc.layerSets[i].layers.length;
for (k=0; k<subdocl;)
{
if(doc.layerSets[i].layers[k]==currentLayer)
{
aa = i;
kk = k;
k = doc.layerSets[i].layers.length;
i = gropp-1;
}
else { k++; }
}
i++;
}
}
//ACTIVATING
//если активный слой - слой высшего порядка:
if (kk<0)
{
//если активный слой - группа (т.е. нижележ. слой - внутри её):
for (i=0; i<gropp;)
{
if (doc.layerSets[i] == currentLayer)
{
var nLayer = doc.layerSets[i].layers[0];
var check = nLayer.visible;
doc.activeLayer = nLayer;
var isGroup = true;
var isActived = true;
if (check == false)
doc.activeLayer.visible = false;
i = gropp;
}
else {i++;}
}
//если активный слой - простой слой (будет обрабатываться в try-catch):
if (isGroup != true)
{
for (i=0; i<docl;)
{
if (doc.layers[i]==currentLayer)
{
numm = i;
i=docl;
}
else {i++;}
}
}
}
else
//(если активный слой - подобъект (элемент группы), т.е. известны (неотриц.) aa и kk:
{
//если элемент группы - последний в ней (будет обрабатываться в try-catch):
if (kk == subdocl-1)
{
for (i=0; i<docl;)
{
if (doc.layers[i] == doc.layerSets[aa])
{
numm = i;
i = docl;
}
else {i++;}
}
}
//если не последний в группе, то проще:
else
{
var nLayer = doc.layerSets[aa].layers[kk+1];
var check = nLayer.visible;
doc.activeLayer = nLayer;
var isActived = true;
if (check == false)
doc.activeLayer.visible = false;
}
}
//try-catch секция для последних вариантов (самых нижних слоёв):
try
{
//alert ("isActived is " + isActived)
if (isActived != true)
{
var nLayer = doc.layers[numm+1];
var check = nLayer.visible;
doc.activeLayer = nLayer;
if (check == false)
doc.activeLayer.visible = false;
}
}
catch(e)
{
var nLayer = doc.layers[0];
var check = nLayer.visible;
doc.activeLayer = nLayer;
if (check == false)
doc.activeLayer.visible = false;
}
Сценарий "цикл"
var doc = app.activeDocument;
var currentLayer = doc.activeLayer;
var gropp = doc.layerSets.length;
var docl = doc.layers.length;
var a = -1
var kk = -1
var aa = -1
//если активный слой - элемент высшего порядка:
for(i=0; i<docl;)
{
if(doc.layers[i]==currentLayer)
{
a=i;
i = docl;
}
else{ i++;}
}
//если активный слой - элемент группы:
if (a<0)
{
for (i=0; i<gropp;)
{
var subdocl = doc.layerSets[i].layers.length;
for (k=0; k<subdocl;)
{
if(doc.layerSets[i].layers[k]==currentLayer)
{
aa = i;
kk = k;
k = doc.layerSets[i].layers.length;
//модернизируем скрипт: вносим сразу в этот цикл обработку активизации.
//если элемент группы - первый в ней (активизируем саму группу - гипероним):
if (kk==0)
{
var pLayer = doc.layerSets[i];
var check = pLayer.visible;
doc.activeLayer = pLayer;
//var isGroup = true;
var isActived = true;
if (check == false)
doc.activeLayer.visible = false;
}
//если не первый, то просто слой вверх:
else
{
var pLayer = doc.layerSets[i].layers[kk-1];
var check = pLayer.visible;
doc.activeLayer = pLayer;
var isActived = true;
if (check == false)
doc.activeLayer.visible = false;
}
i = gropp-1;
}
else { k++; }
}
i++;
}
}
//если активный слой - высший элемент; нам известно (неотриц) a:
else
{
if (a==0)
a=docl;
for (i=0; i<gropp;)
{
//если предыдущий слой - последний элемент находящейся выше группы:
if (doc.layerSets[i] == doc.layers[a-1])
{
var subdocl = doc.layerSets[i].layers.length;
var pLayer = doc.layerSets[i].layers[subdocl-1];
var check = pLayer.visible;
doc.activeLayer = pLayer;
var isActived = true;
if (check == false)
doc.activeLayer.visible = false;
i = gropp;
}
else {i++;}
}
if (isActived != true)
{
var pLayer = doc.layers[a-1];
var check = pLayer.visible;
doc.activeLayer = pLayer;
if (check == false)
doc.activeLayer.visible = false;
}
}
"Бонус" - "Переключить видимость" -скрипт
var currentLayer = activeDocument.activeLayer;
currentLayer.visible = !currentLayer.visible
Примечание. Сохраните их как файлы * .jsx и поместите в C:\Program Files\Adobe\% Ваша папка Adobe Version%\Presets\Scripts.