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

使用javascript获取选定层或组层数组(Photoshop CS4),javascript,photoshop,cs4,Javascript,Photoshop,Cs4,基本上,我需要编写一个photoshop脚本,在选定的图层中进行迭代,并检索有关这些图层的一些信息 如果我可以得到一个选定层的数组,我会很好,我知道如何做其余的,但获得该数组本身就是一个头痛的问题 我知道该文档包含类似“activeLayers”的内容,但我不知道如何处理层和子层 所有的层都在一个组中,所以如果它更容易,如果我能得到一个组中的每一层,那也会很好:D 感谢您提供的相关提示。您需要查看“ArtLayers”和“LayerSet”对象。以下代码段将获取文档中第一个组中的所有图层: va

基本上,我需要编写一个photoshop脚本,在选定的图层中进行迭代,并检索有关这些图层的一些信息

如果我可以得到一个选定层的数组,我会很好,我知道如何做其余的,但获得该数组本身就是一个头痛的问题

我知道该文档包含类似“activeLayers”的内容,但我不知道如何处理层和子层

所有的层都在一个组中,所以如果它更容易,如果我能得到一个组中的每一层,那也会很好:D


感谢您提供的相关提示。

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

var lyrs = app.activeDocument.layerSets[0].artLayers;
但是,由于您的每个组都可以包含其他组,因此您可能必须递归地遍历所有组,以根据您的用例获得所有层


我强烈建议您查看xtools库。它有一个很好的函数“Stdlib.getLayersList”,它允许您从嵌套组中递归地获取所有层(加上许多其他优秀的东西)。获取库。

这将获取选定的层

 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();
函数getSelectedLayers(){ var idGrp=stringIDToTypeID(“GroupLayerEvent”); var descGrp=new ActionDescriptor(); var refGrp=new ActionReference(); refGrp.putEnumerated(charIDToTypeID(“Lyr”)、charIDToTypeID(“Ordn”)、charIDToTypeID(“Trgt”); descGrp.putReference(charIDToTypeID(“null”),refGrp); 执行操作(idGrp、descGrp、DialogModes.ALL); var resultLayers=新数组();
对于(var ix=0;ix

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());`

这使得运行时错误消失了

executeAction( idGrp, descGrp, DialogModes.ALL );
executeAction( idGrp, descGrp, DialogModes.NO );