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的属性可以设置为ArtLayerLayerSet。本质上,当层typenameLayerSet(即文件夹)时,我们再次递归调用该函数。


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 });
    
  • 在将includeLayerSetsincludeTextLayers设置为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) ...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...