Отключить текстовые слои в сетах скриптом

  • Автор темы Автор темы chesen
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

chesen

Топикстартер
20 лет на форуме
Сообщения
553
Реакции
49
Ребятки, пж. черканите строчку скрипта для CS2, дабы удалить с его помощью текстовый слой в сете.
Или отключить его видимость. Без проверок на его наличие.
Спасибо!
 
видимость
try{
app.activeDocument.layers.getByName(layerName).visible=false;
}catch(e){}

удалить
try{
app.activeDocument.layers.getByName(layerName).remove();
}catch(e){}
 
  • Спасибо
Реакции: chesen
ок.низкий поклон.:)
 
Приходится поднять темку.
Дано: документ с сетами слоев.
В каждом сете один слой текстовый.
Надо: одним скриптом отключить видимость всех текстовых слоев во всех сетах документа.
 
Тут так просто, как в предыдущем случае, не проканает.
Придется делать рекурсивный перебор слоев и проверять равенство kind==LayerKind.TEXT
 
Да, я подозревал это))
Вся надежда на форумных профи.
 
Чтобы развеять сомнения8*)
 
Собрал что-то. Вроде должно работать, ан не работает.
Код:
//removeLayerText.jsx

var docRef = app.activeDocument;

LayersScan0(Doc);

function LayersScan0(Doc)  
{
  var i;
  var L;


{
   for(i=0; i < docRef.layers.length; i++)
  {
   L = Doc.layers[i];
    if (L.kind == LayerKind.TEXT)
    {
      if (L.visible==false) { L.visible = true; Doc.activeLayer = L; L.remove();}
    }
    else
    {
        if(L.typename == "LayerSet")
        {
          LayersScan0(L);
        }
    
        else
        {
           if (L.visible==false) { L.visible = true; Doc.activeLayer = L; L.remove();}
        }
     }
   }
}
 
Во-первых, в предоставленном коде не хватает последней фигурной скобки.
И, наверное, при вызове в ф-цию надо передавать docRef, а не Doc (вот так - LayersScan0(docRef))?
Ну и в коде ф-ции то Doc, то docRef... так и должно быть?
 
Последнее редактирование:
вот это вроде работает (отключает видимость текстовых слоёв в сетах):
PHP:
(function disableTxtInSets ( lays ) {

  for ( var i = 0; i < lays.length; i++ ) {
    if ( lays[ i ].typename == "LayerSet" ) {  
      disableTxtInSets ( lays [ i ].layers );
    } else if ( lays[ i ].kind == LayerKind.TEXT && lays[ i ].parent.typename == "LayerSet" ) {
      lays[ i ].visible = false;
    }
  }
}) ( activeDocument.layers );

а эта удаляет:
PHP:
(function removeTxtInSets ( lays ) {

  for ( var i = 0; i < lays.length; i++ ) {
    if ( lays[ i ].typename == "LayerSet" ) {
      removeTxtInSets ( lays [ i ].layers );
    } else if ( lays[ i ].kind == LayerKind.TEXT && lays[ i ].parent.typename == "LayerSet" ) {
      lays[ i ].remove ();
      i--;
    }
  }
}) ( activeDocument.layers );
 
Последнее редактирование:
Увы, не работает ни то, ни другое.
 
а если оформить как обычную ф-цию и поставить app. перед activeDocument, чтобы везде было app.activeDocument?
вроде все используемые свойства присутствуют в мануале по фотошопу cs2, а проверить не могу, т.к. нет cs2 и не будет ;)
PHP:
var lays = app.activeDocument.layers;

disableTxtInSets(lays);

function disableTxtInSets ( lays ) {

  for ( var i = 0; i < lays.length; i++ ) {
    if ( lays[ i ].typename == "LayerSet" ) {
      disableTxtInSets ( lays [ i ].layers );
    } else if ( lays[ i ].kind == LayerKind.TEXT && lays[ i ].parent.typename == "LayerSet" ) {
      lays[ i ].visible = false;
    }
  }
}

Во овсяком случае, логика-то понятна, вроде? Проверьте в extendScript каждый шаг выполнения, может увидите, что не работает...
 
Последнее редактирование:
  • Спасибо
Реакции: chesen
Работает. Огромное спасибо!
Но при запуске с Toolkit виснет на первой строке undefined is not an object.На это можно не обращать внимания.
 
Перед запуском в ESTK надо выбирать в выпадающем меню целевую программу, либо ставить в начале скрипта //@target photoshop, иначе ESTK запускает скрипт в своей DOM, а в ней видно нет ни activeDocuments ни тем более layers
estk.jpg
 
Теперь понятно. Еще раз спасибо за ликбез.
 
Комментарий модератора: Поменял название темы для большей наглядности.
 
  • Спасибо
Реакции: dumbm1
Статус
Закрыто для дальнейших ответов.