我在 Photoshop 中有 6 个组,每个组中包含多个图层。我正在寻找打开/关闭每个组中的图层以创建图像的每种可能组合。
有人可以指出我正确的方向吗?
我从来没有在 Photoshop 中编写过脚本,但我试图自己解决这个问题。
我在 Photoshop 中有 6 个组,每个组中包含多个图层。我正在寻找打开/关闭每个组中的图层以创建图像的每种可能组合。
有人可以指出我正确的方向吗?
我从来没有在 Photoshop 中编写过脚本,但我试图自己解决这个问题。
我自己对 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);
我希望这对我以外的人有用:)