Photoshop重命名脚本不会遍历文件夹中的图层
这个脚本完美地工作在一个方面:它不会循环遍历嵌套在文件夹中的层。我已尝试根据this问题将
layers
更改为layerSets
,但之后它停止处理文件夹名称。我正在Mac Catalina上使用Photoshop 2020。
// JavaScript Document
var doc = app.activeDocument;
// name indexed object
var layernames = {
'Products':'Working',
'Product':'Working',
'Notes':'Note',
'Background color':'Background Colour',
'White background':'White Background'
};
// loop through all layers
for (var i = 0; i < doc.layers.length; i++)
{
//Set up Variable to access layer name
var currentLayer = app.activeDocument.layers;
if (layernames[currentLayer.name]) {
currentLayer.name = layernames[currentLayer.name];
}
}
解决方案
考虑以下解决方案,该解决方案使用名为renameLayers
的recursive function遍历文档层树结构中的所有层节点。
typename
属性可以设置为ArtLayer
或LayerSet
。基本上,当层typename
是LayerSet
(即文件夹)时,我们再次递归调用该函数。
var doc = app.activeDocument;
/**
* Rename layers in a Photoshop document.
*
* @param {Object} doc A reference to the document to change.
* @param {Object} layerName Each property key name indicates the original layer
* name, and its corresponding value indicates the new layer name.
* @param {Object} options The configuration options.
* @param {Boolean} [options.includeTextLayers=false] Whether to rename text layers.
* @param {Boolean} [options.includeLayerSets=false] Whether to rename LayerSets.
*/
function renameLayers(doc, layerNames, options) {
// Default options
var opts = {
includeTextLayers: false,
includeLayerSets: false
};
// Overwrite properties in the default `opts` object by properties in the
// user defined `options` object if they have the same key. Shallow copy only.
if (typeof options === 'object') {
for (var key in opts) {
if (options.hasOwnProperty(key)) {
opts[key] = options[key];
}
}
}
// Iterate each layer in the document.
for (var i = 0, max = doc.layers.length; i < max; i++) {
var currentLayer = doc.layers[i];
if (currentLayer.typename === 'ArtLayer') {
if (layerNames[currentLayer.name]
&& (opts.includeTextLayers || currentLayer.kind !== LayerKind.TEXT)) {
currentLayer.name = layerNames[currentLayer.name];
}
} else { // The layers `typename` is a `LayerSet`
if (layerNames[currentLayer.name] && opts.includeLayerSets) {
currentLayer.name = layerNames[currentLayer.name];
}
renameLayers(currentLayer, layerNames, options); // Resursive call
}
}
}
// Demo Usage
var layerNames = {
'Products': 'Working',
'Product': 'Working',
'Notes': 'Note',
'Background color': 'Background Colour',
'White background': 'White Background'
};
renameLayers(doc, layerNames);
用法说明:
正如您在(上面)最后一行代码中看到的,我们调用renameLayers
函数如下:
renameLayers(doc, layerNames);
在这里,我们传入doc
变量,即对要更改的文档的引用,以及定义原始层名称和新层名称的映射的layerNames
对象。
layerNames
对象中指定的映射重命名任何层。但是,它当前不重命名任何文本层或LayerSet。
如何还重命名文本层和/或LayerSets?
renameLayers
函数列出了名为options
的第三个可选参数,以允许定义自定义配置。
以下三个函数调用演示了如何通过传入可选的options
参数来实现不同的配置:
调用该函数,
includeLayerSets
设置为true
也重命名LayerSets:renameLayers(doc, layerNames, { includeLayerSets: true });
在
includeTextLayers
设置为true
的情况下调用如下函数也会重命名文本层:renameLayers(doc, layerNames, { includeTextLayers: true });
调用该函数时,
includeLayerSets
和includeTextLayers
设置为true
也会重命名LayerSets和Text层:renameLayers(doc, layerNames, { includeLayerSets: true, includeTextLayers: true });
相关文章