使用javascript获取所选图层或组图层数组(Photoshop CS4)

时间:2014-12-02 17:26:29

标签: javascript photoshop cs4

K基本上我需要编写一个photoshop脚本,它遍历选定的图层并检索有关它们的一些信息。

如果我可以获得所选图层的数组,我会很好,我知道如何做其余的工作,但是获得该数组本身就是一个令人头痛的问题。

我知道该文档包含类似“activeLayers”的内容,但我迷失了如何处理关卡和次级层。

所有图层都在一个组中,所以如果它更容易,如果我可以获得组中的每个图层也会很棒:D

感谢您提供此任何提示。

3 个答案:

答案 0 :(得分:3)

Bravo的代码可以工作,但是当没有选择任何图层时它会失败,所以我调整它以删除错误并简单地返回一个空数组:

function getSelectedLayers(){
  var resultLayers=new Array();
  try{
    var idGrp = stringIDToTypeID( "groupLayersEvent" );
    var descGrp = new ActionDescriptor();
    var refGrp = new ActionReference();
    refGrp.putEnumerated(charIDToTypeID( "Lyr " ),charIDToTypeID( "Ordn" ),charIDToTypeID( "Trgt" ));
    descGrp.putReference(charIDToTypeID( "null" ), refGrp );
    executeAction( idGrp, descGrp, DialogModes.NO );
    for (var ix=0;ix<app.activeDocument.activeLayer.layers.length;ix++){resultLayers.push(app.activeDocument.activeLayer.layers[ix])}
    var id8 = charIDToTypeID( "slct" );
    var desc5 = new ActionDescriptor();
    var id9 = charIDToTypeID( "null" );
    var ref2 = new ActionReference();
    var id10 = charIDToTypeID( "HstS" );
    var id11 = charIDToTypeID( "Ordn" );
    var id12 = charIDToTypeID( "Prvs" );
    ref2.putEnumerated( id10, id11, id12 );
    desc5.putReference( id9, ref2 );
    executeAction( id8, desc5, DialogModes.NO );
  } catch (err) { }
  return resultLayers;
}   
$.writeln(getSelectedLayers());`

简单地将代码包装在try / catch块中不起作用,所以我也改变了:

executeAction( idGrp, descGrp, DialogModes.ALL );

executeAction( idGrp, descGrp, DialogModes.NO );

这使得运行时错误消失了。

答案 1 :(得分:2)

这将为您提供所选的图层

 function getSelectedLayers(){
        var idGrp = stringIDToTypeID( "groupLayersEvent" );
        var descGrp = new ActionDescriptor();
        var refGrp = new ActionReference();
        refGrp.putEnumerated(charIDToTypeID( "Lyr " ),charIDToTypeID( "Ordn" ),charIDToTypeID( "Trgt" ));
        descGrp.putReference(charIDToTypeID( "null" ), refGrp );
        executeAction( idGrp, descGrp, DialogModes.ALL );
        var resultLayers=new Array();
        for (var ix=0;ix<app.activeDocument.activeLayer.layers.length;ix++){resultLayers.push(app.activeDocument.activeLayer.layers[ix])}
        var id8 = charIDToTypeID( "slct" );
            var desc5 = new ActionDescriptor();
            var id9 = charIDToTypeID( "null" );
            var ref2 = new ActionReference();
            var id10 = charIDToTypeID( "HstS" );
            var id11 = charIDToTypeID( "Ordn" );
            var id12 = charIDToTypeID( "Prvs" );
            ref2.putEnumerated( id10, id11, id12 );
        desc5.putReference( id9, ref2 );
        executeAction( id8, desc5, DialogModes.NO );
        return resultLayers;
    }   
    var layers = getSelectedLayers();

来源:https://github.com/kynd/photoshopScripts/blob/master/Rename%20Selected%20Layers/Rename%20Selected%20Layers.jsx

答案 2 :(得分:1)

您需要查看“ArtLayers”&#39;和&#39; LayerSets&#39;对象。以下代码段将获取文档中第一组中的所有图层:

var lyrs = app.activeDocument.layerSets[0].artLayers;

但由于您的每个组都可以包含其他组,因此您可能需要递归遍历所有组以根据您的用例获取所有图层。

我强烈建议您查看xtools库。它有一个很好的功能&#39; Stdlib.getLayersList&#39;这将允许您从嵌套组中递归地获取所有图层(以及许多其他很棒的东西)。获取图书馆here