Atalho de teclado “Select forward layer” - inclui camadas invisíveis

1

Devido ao meu teclado fora dos EUA, tive que fazer uma ação que mapeasse "Select forward layer" para uma tecla F.

No entanto, a "Selecionar camada de encaminhamento" não seleciona camadas invisíveis.

Existe uma maneira de selecionar a camada avançada, apesar de ser invisível?

    
por timkl 09.03.2011 / 09:58

3 respostas

0

Assumindo que por camada de avanço você quer dizer camada superior, você pode fazer isso com um script simples. Abra o ExtendScript Toolkit (ele deve ter instalado junto com o Photoshop) e crie um novo documento Javascript. Em seguida, digite:

var doc = app.activeDocument; //references current document
doc.activeLayer = doc.layers[0]; //selects the top layer

Isso tornará a camada superior visível quando selecionada. Se você quiser mantê-lo invisível, adicione a seguinte linha no final:

doc.activeLayer.visible = false;

Salve-o na sua pasta Presets / Scripts por conveniência (embora possa ir a qualquer lugar).

Em seguida, vá para o Photoshop, crie um novo arquivo, comece a gravar uma nova ação e vá para Arquivo > Scripts > Procure e encontre seu script. Abrindo ele executa. Depois de executar, pare a gravação e apenas atribua uma tecla de atalho à ação et voila !

Se por algum motivo você não conseguir encontrar o ExtendScript Toolkit, basta colocar o código em um documento de texto em branco e alterar a extensão para .jsx. Se você mover o arquivo de script depois de ter gravado a ação, terá que regravá-lo novamente ao se lembrar do caminho.

    
por 09.03.2011 / 13:08
0

Eu consegui fazer isso modificando um pouco o script que encontrei no fórum do AHK (aquele que mudou a camada de destino com força para visível e tinha outros pequenos erros), e funciona para mim:

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;

Isto é para avançar para a próxima camada (abaixo); para previous (up) apenas faça outro script com alterações [a + 1] para [a-1] na seção TRY e [0] para [doc.layers.length-1] na seção CATCH. Bem, a seguir, da maneira mais comum: coloque ambos os scripts na pasta de script Ps, faça a ação com "Inserir item de menu" e atribua teclas de atalho como desejar. Mais tarde você pode usar até seus atalhos AHK fav e assim por diante ...

    
por 28.05.2014 / 02:08
0

Um pequeno acréscimo aos scripts acima.

Depois de testar os que estão no Ps, me deparei com o fato de que, se houver grupos no fluxo de trabalho atual, os scripts não funcionarão corretamente. Eles não levam em conta camadas dentro de grupos, conhecidas como layerSets em linguagem de script; quando o script lista através de "camadas", ele lida apenas com elementos de nível superior (camadas fora de grupos e grupos).

Então, tentei ajustá-los a necessidades mais amplas.

Os scripts modificados estão abaixo; eles podem manipular adequadamente fluxos de trabalho com camadas e grupos de nível superior e elementos aninhados em grupos de nível superior. Com mais hierarquia, eles também funcionarão, se a camada ativa não for duas vezes aninhada, o elemento (caso contrário, "para baixo", o script alternará para a camada superior e "para cima", o script, simplesmente, não fará nada). Mas eu raramente lidei com mais de uma vez grupos aninhados e na pior das hipóteses posso fazer um bom clique do mouse se for necessário (use atalhos legados Alt + [/], eles ainda funcionam em todas as camadas não ocultas). / p>

Desculpe, eu não sou de longe um programador, então código funcional completo está além do meu cérebro; Além disso, esses scripts são muito volumosos também, suponho. Mas eles funcionam. (Por exemplo, atribuo "up" -ciclo a F3, "down" -ciclo a F4 e "toggle-visibility" -script a F2; para mim, essa combinação é bastante prática e economiza muito tempo).

"Cycle-down" -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;
} 

Script "Cycle-up"

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;
    }
}

"Bonus" - "toggle visibility" -script

var currentLayer = activeDocument.activeLayer;
currentLayer.visible = !currentLayer.visible

Nota: Salve-os como arquivos * .jsx e coloque em C: \ Arquivos de Programas \ Adobe \% Sua Pasta de Versões da Adobe% \ Presets \ Scripts

    
por 08.06.2014 / 14:49