Включение и выключение нескольких слоев в скрипте Photoshop - PullRequest
3 голосов
/ 22 февраля 2012

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

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

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

1 Ответ

3 голосов
/ 20 августа 2012

Я сам новичок в написании скриптов для 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;

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

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

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

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

Надеюсь, это пригодится кому-то большему, чем только мне :) 1052 *

...