Включение и выключение нескольких слоев в сценарии Photoshop


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

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

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

1 3

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

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