Включение и выключение нескольких слоев в сценарии Photoshop
У меня есть 6 групп в Photoshop, которые содержат несколько слоев внутри каждой группы. Я ищу, чтобы включить/выключить слой в каждой группе, чтобы создать все возможные комбинации изображения.
Может ли кто-нибудь указать мне правильное направление?Я никогда не писал сценарии в Photoshop, но пытаюсь разобраться в этом самостоятельно.
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);
Я надеюсь, что это полезно кому-то больше, чем просто мне:)