Из-за моей неамериканской клавиатуры мне пришлось сделать действие, которое отображает "Выбрать слой вперед" на F-клавишу.
Однако "Выбрать слой вперед" не выбирает невидимые слои.
Есть ли способ выбрать передний слой, несмотря на то, что он невидим?
Из-за моей неамериканской клавиатуры мне пришлось сделать действие, которое отображает "Выбрать слой вперед" на F-клавишу.
Однако "Выбрать слой вперед" не выбирает невидимые слои.
Есть ли способ выбрать передний слой, несмотря на то, что он невидим?
Предполагая, что под прямым слоем вы подразумеваете верхний слой, вы можете сделать это с помощью простого скрипта. Откройте ваш набор инструментов ExtendScript (он должен быть установлен вместе с Photoshop) и создайте новый документ Javascript. Затем введите:
var doc = app.activeDocument; //references current document
doc.activeLayer = doc.layers[0]; //selects the top layer
Это сделает верхний слой видимым, когда он выбран. Если вы хотите сделать его невидимым, добавьте следующую строку в конце:
doc.activeLayer.visible = false;
Для удобства сохраните его в папке «Presets /Scripts» (хотя он может пойти куда угодно).
Затем перейдите в Photoshop, создайте новый файл, начните запись нового действия, затем перейдите в «Файл»> «Сценарии»> «Обзор» и найдите свой сценарий. Открытие это запускает это. Как только он запустится, остановите запись и просто назначьте сочетание клавиш для действия, и вуаля !
Если по какой-либо причине вы не можете найти набор инструментов ExtendScript, просто поместите код в пустой текстовый документ и измените расширение на .jsx. Если вы переместили файл сценария после того, как записали действие, вам придется перезаписать его, так как он запоминает путь.
Небольшое дополнение к сценариям выше.
После тестирования в 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.
Мне удалось сделать это, слегка изменив скрипт, который я нашел на форуме AHK (тот, который принудительно переключил целевой слой на видимый, и имел другие незначительные ошибки), и он работает для меня:
var doc = app.activeDocument;
var currentLayer = doc.activeLayer;
for(i=0; i < doc.layers.length; )
{
if(doc.layers[i]==currentLayer)
{
a=i;
//alert(a);
i = doc.layers.length;
}
else{ i++; }
}
try
{
var nextLayer = doc.layers[a+1];
var check = nextLayer.visible;
}
catch(e)
{
var nextLayer = doc.layers[0];
var check = nextLayer.visible;
}
doc.activeLayer = nextLayer;
if (check == false)
doc.activeLayer.visible = false;
Это для перехода к следующему (нижнему) слою; для предыдущего (вверх) просто создайте другой скрипт с изменениями [a+1] на [a-1] в разделе TRY и [0] на [doc.layers.length-1] в разделе CATCH. В общем, следующий способ: поместите оба сценария в папку сценариев Ps, выполните действие с "Вставить элемент меню" и назначьте горячие клавиши по своему усмотрению. Позже вы можете использовать даже ваши любимые ярлыки AHK и так далее ...