Включение и выключение нескольких слоев в Photoshop Script

У меня есть 6 групп в Photoshop, каждая из которых содержит несколько слоев. Я хочу включить/выключить слой в каждой группе, чтобы создать все возможные комбинации изображения.

Может ли кто-нибудь указать мне в правильном направлении?

Я никогда не писал скрипты в Photoshop, но пытаюсь понять это самостоятельно.


person user1226431    schedule 22.02.2012    source источник
comment
Взгляните на этот ответ: stackoverflow.com/a/8544923/327466   -  person KatieK    schedule 24.02.2012


Ответы (1)


Я сам новичок в написании сценариев CS5, но я думаю, что могу объяснить, как это работает. Примеры кода, возможно, не самый эффективный способ сделать это, но они помогают.

Существует большая разница между группой слоев или самим отдельным слоем. Все слои и группы упорядочены в формате DOM. Чтобы получить свой корень, вы можете использовать глобальный экземпляр app для получения активного документа: app.activeDocument.

Грязная часть заключается в том, что есть два отдельных массива для отдельных слоев и групп. Чтобы получить массив отдельных слоев, используйте app.activeDocument.layers и app.activeDocument.layerSets для групп.

Чтобы углубиться в иерархию, используйте массив layerSets для итерации вниз.

Например, предположим следующую иерархию:

-Border
+Icons
   +Left
       -Star
       -Home
   +Right
       -Add
       -Remove

Здесь Border, Star, Home, Add и Remove — все одиночные слои, а Icons, Left и Right — группы.

Чтобы включить группу Left, нам нужно перебрать группу Icon:

Icons = app.activeDocument.layerSets.getByName("Icons");
Left = Icons.layerSets.getByName("Left");
Left.visible = true;

Если вы показываете слой/группу в CS5, щелкнув мышью, все родительские группы также будут автоматически показаны. В сценариях это не так, вы также должны включить всех родителей.

Icons = app.activeDocument.layerSets.getByName("Icons");
Icons.visible = true;
Left = Icons.layerSets.getByName("Left");
Left.visible = true;

Чтобы показать слой границы, вам нужно использовать массив слоев.

app.activeDocument.layers.getByName("Border").visible = true;

То же самое применимо, если вы хотите показать слой «Добавить».

Icons = app.activeDocument.layerSets.getByName("Icons");
Icons.visible = true;
Right = Icons.layerSets.getByName("Right");
Right.visible = true;
AddLayer = Right.layers.getByName("Add");
AddLayer.visible = true;

Это может быть немного беспорядочно, если у вас много групп и слоев. Я создал функцию, которая следует по указанному пути, чтобы получить конечный объект. Он сам определит, слой это или группа.

//******************************************
// GET BY PATH
// Author: Max Kielland
//
// Gets the LayerSet or Layer at the path's end.
// Example path "Icons/left" will return the LayerSet object "Left"
// while "Icons/left/Star" will return the Layer object "Star"
// If fSetPath is true, all the parents will be visible as well.

function GetByPath(fPath,fSetPath) {

  var lGroup = null;
  var lPathArray = new Array();

  lPathArray = fPath.split('/');
  try {
    lGroup = app.activeDocument.layers.getByName(lPathArray[0]);
  } catch (err) {
    lGroup = app.activeDocument.layerSets.getByName(lPathArray[0]);
  }

  if (fSetPath)
    lGroup.visible = true;

  for (n=1; n<lPathArray.length; n++) {
    try {
      lGroup = lGroup.layerSets.getByName(lPathArray[n]);
    } catch(err) {
      lGroup = lGroup.layers.getByName(lPathArray[n]);
    }
    if (fSetPath == true)
      lGroup.visible = true;
  }

  return lGroup;
}

... и одна функция, чтобы просто установить или очистить группу или слой по его пути.

//******************************************
// SET STATUS
// Author: Max Kielland
//
// Sets the Group or Layer's visible property
// at the end of the path to fStatus.

function SetStatus(fPath, fStatus) {

  Obj = GetByPath(fPath,false);
  Obj.visible = fStatus;
}

..и, наконец, я написал эту функцию, чтобы скрыть все группы и/или слои от указанного пользователем корня.

/******************************************
// CLEAR GROUP
// Author: Max Kielland
//
// Clears the visible property in a single
// group/layer with the option to clear all
// its children as well (fRecurs = true).
// fLayerSet can be a layerSet object or a
// String path.

function ClearGroup(fLayerSet,fRecurs) {

  var n;
  var TargetGroup;

  // Get LayerSet Object if reference is a string.
  if (typeof fLayerSet == "string")
    TargetGroup = GetByPath(fLayerSet);
  else
    TargetGroup = fLayerSet;

  // Iterate through all LayerSets
  for (n=0; n<TargetGroup.layerSets.length; n++) {
    if (fRecurs == true)
      ClearGroup(TargetGroup.layerSets[n],true);
    else
     TargetGroup.layerSets[n].visible = false;
  }

  // Iterate through all layers
  for (n=0; n<TargetGroup.layers.length; n++) {
    TargetGroup.layers[n].visible = false;
  }

  // Clear self
  TargetGroup.visible = false;
}

Вот пример использования функций

// Hide group "Icon" and its children
ClearGroup("Icons",true);

//Show the layer "Home"
GetByPath("Icons/Left/Home",true);

// To just get the object "Right"
var MyGroup = GetByPath("Icons/Right");

// Save the current document as a PNG file
app.activeDocument.saveAs(File("Scripted Document.png"),PNGSaveOptions);

Надеюсь, это будет полезно кому-то больше, чем мне :)

person Max Kielland    schedule 20.08.2012