1

Из-за моей неамериканской клавиатуры мне пришлось сделать действие, которое отображает "Выбрать слой вперед" на F-клавишу.

Однако "Выбрать слой вперед" не выбирает невидимые слои.

Есть ли способ выбрать передний слой, несмотря на то, что он невидим?

3 ответа3

0

Предполагая, что под прямым слоем вы подразумеваете верхний слой, вы можете сделать это с помощью простого скрипта. Откройте ваш набор инструментов 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. Если вы переместили файл сценария после того, как записали действие, вам придется перезаписать его, так как он запоминает путь.

0

Небольшое дополнение к сценариям выше.

После тестирования в 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.

0

Мне удалось сделать это, слегка изменив скрипт, который я нашел на форуме 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 и так далее ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .