如何解决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
的{{3}}遍历文档层树结构中的所有层节点。
图层recursive function的属性可以设置为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,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。
如何重命名文本图层和/或图层集?
renameLayers
函数列出了第三个可选参数,名为options
,用于定义自定义配置。
以下三个函数调用说明了如何通过传入可选的options
参数来实现不同的配置:
-
在将
includeLayerSets
设置为true
的情况下,按以下方式调用该函数也会重命名LayerSets:renameLayers(doc,{ includeLayerSets: true });
-
在将
includeTextLayers
设置为true
的情况下,按以下方式调用函数也将重命名文本层:renameLayers(doc,{ includeTextLayers: true });
-
在将
includeLayerSets
和includeTextLayers
设置为true
的情况下,按如下所述调用函数也将同时重命名LayerSet和Text Layers:renameLayers(doc,{ includeLayerSets: true,includeTextLayers: true });
根据我对文档(https://www.adobe.com/content/dam/acom/en/devnet/photoshop/pdfs/photoshop-scripting-guide-2020.pdf)的了解,图层可能包含ArtLayers或LayerSet。 图层集包含其他嵌套图层...
您可以创建一个函数来重命名每个Layer(您所做的事情),但是当遇到LayerSet时,还可以在currentLayer.layers
上递归调用该函数。
要了解特定的图层是否为图层集,请尝试if (currentLayer.layers) ...
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。