将图层名称复制到 Photoshop 中的文本框的脚本

Posted

技术标签:

【中文标题】将图层名称复制到 Photoshop 中的文本框的脚本【英文标题】:Script to copy Layer Names to text box in Photoshop 【发布时间】:2020-06-03 20:39:42 【问题描述】:

我正在尝试从 2 个工作脚本中创建一个脚本

目标:

我们需要一个脚本,它将遍历当前文档中的所有层,找到以某种颜色标记的每个层(例如红色),仅复制标记为红色的层的名称,然后将所有名称在一个接一个的文本层中(附上示例图片)。

资源:

我发现了 2 个脚本,每个脚本都完成了我们需要的一半,那么我们如何将它们组合在一起呢?

1) “Select by red”遍历文档,找出文档中有多少层被“红色”标记:

#target photoshop

if (app.documents.length > 0) 

// the file;

var myDocument = app.activeDocument;

// get number of layers;

var ref = new ActionReference();

ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );

var applicationDesc = executeActionGet(ref);

var theNumber = applicationDesc.getInteger(stringIDToTypeID("numberOfLayers"));

// process the layers;

var theLayers = new Array;

var theOthers = new Array;

for (var m = 0; m <= theNumber; m++) 

try 

var ref = new ActionReference();

ref.putIndex( charIDToTypeID( "Lyr " ), m);

var layerDesc = executeActionGet(ref);

var layerSet = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));

var isBackground = layerDesc.getBoolean(stringIDToTypeID("background"));

// if not layer group collect values;

if (layerSet != "layerSectionEnd" /*&& layerSet != "layerSectionStart"*/ && isBackground != true) 

var theName = layerDesc.getString(stringIDToTypeID('name'));

var theID = layerDesc.getInteger(stringIDToTypeID('layerID'));

var visible = layerDesc.getBoolean(stringIDToTypeID("visible"));

var theColor = layerDesc.getEnumerationValue(stringIDToTypeID("color"));

if (typeIDToStringID(theColor) == "red") theLayers.push([theName, theID])

else theOthers.push([theName, theID])

;



catch (e) ;

;

// if layers are red;

if (theLayers.length > 0) alert ("there are " + theLayers.length + " Red layers")

else alert ("no red layers")

;

2) “来自图层名称的文本框”获取当前选定图层的名称,并将其粘贴到一个名为“Comp”的新文本图层中。

if (app.documents.length > 0) mainScript();    



function mainScript()   

    try  

        var myLayerName = activeDocument.activeLayer.name;          

        var myLayerText = activeDocument.artLayers.add();  

        myLayerText.name = "Comp";  

        myLayerText.kind = LayerKind.TEXT; 

        var textProperty = myLayerText.textItem;

        textProperty.size = 10;   

        textProperty.font = "Arial";

        myLayerText.textItem.contents = myLayerName;  

    catch (errStr)  

        alert(errStr);  

      

  

计划:

根据我的理解,我们需要从一个与文档大小一样长的循环开始,即总层数for (var i = 0; i &lt; doc.layers.length; i++)

然后脚本将逐层检查颜色 ID if (typeIDToStringID(theColor) == "red") 。当它找到标记为红色的图层时,它会复制图层名称 - 然后将其存储在数组中(以便稍后一次性输出),或者创建一个新的文本框并粘贴图层名称myLayerText.textItem.contents = myLayerName

然后,每次找到另一个标记为红色的图层时,它都会复制图层名称,并将其粘贴到同一个文本框中,仅在前一个图层名称的上方/下方一行。

非常感谢任何帮助!

【问题讨论】:

那么你尝试了什么,什么没用?你似乎知道应该做什么并且拥有所有的拼图 问题是我没有足够的编码经验来组合这些部分。我可以理解每个组件的作用,但无法将它们连接到一个脚本中。所以我没有尝试过的脚本——只有两部分和一个计划。我向朋友寻求帮助,但他的脚本也不起作用。我可以发布他的剧本作为起点。 【参考方案1】:

您唯一需要做的就是使用换行符\r 加入theLayers 数组的名称:

if (app.documents.length > 0)


  // the file;
  var myDocument = app.activeDocument;

  // get number of layers;
  var ref = new ActionReference();
  ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));

  var applicationDesc = executeActionGet(ref);
  var theNumber = applicationDesc.getInteger(stringIDToTypeID("numberOfLayers"));

  // process the layers;
  var theLayers = new Array;

  for (var m = 0; m <= theNumber; m++)
  
    try
    
      var ref = new ActionReference();
      ref.putIndex(charIDToTypeID("Lyr "), m);
      var layerDesc = executeActionGet(ref);
      var layerSet = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));
      var isBackground = layerDesc.getBoolean(stringIDToTypeID("background")); // if not layer group collect values;  if (layerSet != "layerSectionEnd" /*&& layerSet != "layerSectionStart"*/ && isBackground != true)
      
        var theName = layerDesc.getString(stringIDToTypeID('name'));
        var theColor = layerDesc.getEnumerationValue(stringIDToTypeID("color"));
        if (typeIDToStringID(theColor) == "red")
        
          theLayers.push(theName); // we only need names here
        
      ;
    
    catch (e)
    ;
  ;

  // got our red layers in theLayers

  var myLayerText = activeDocument.artLayers.add();
  myLayerText.name = "Result";
  myLayerText.kind = LayerKind.TEXT;
  var textProperty = myLayerText.textItem;
  textProperty.size = 10;
  textProperty.font = "Arial";
  myLayerText.textItem.contents = theLayers.join('\r'); // joining layers with a line-break: this is going to be textItem text

;

结果如下:

我建议您在任何学习网站(代码学院等)上学习 JS 课程:这不会花费您超过一两个小时,但您会掌握基本概念:这将使您的在处理这样的问题方面生活要容易得多。

【讨论】:

嗨,谢尔盖,非常感谢您的回答和带注释的代码。这很有帮助。代码 100% 像我想要的那样工作,并且通过您清晰的描述,我能够进一步调整它以满足我们在工作室的需求。 起初它很简单,但现在我们看到了将代码注入一些地方的机会。所以在这一点上,正确学习 javascript 对我来说真的很有价值。再次感谢,像您这样的人让世界保持运转。

以上是关于将图层名称复制到 Photoshop 中的文本框的脚本的主要内容,如果未能解决你的问题,请参考以下文章

photoshop学习4

Photoshop

如何在 jsx Photoshop 脚本中提取图层旋转(变换)?

如何在 Photoshop 填充图层中检索颜色

Photoshop 保存操作按名称选择图层

photoshop制作古风画