使用javascript获取选定层或组层数组(Photoshop CS4)
基本上,我需要编写一个photoshop脚本,在选定的图层中进行迭代,并检索有关这些图层的一些信息 如果我可以得到一个选定层的数组,我会很好,我知道如何做其余的,但获得该数组本身就是一个头痛的问题 我知道该文档包含类似“activeLayers”的内容,但我不知道如何处理层和子层 所有的层都在一个组中,所以如果它更容易,如果我能得到一个组中的每一层,那也会很好:D使用javascript获取选定层或组层数组(Photoshop CS4),javascript,photoshop,cs4,Javascript,Photoshop,Cs4,基本上,我需要编写一个photoshop脚本,在选定的图层中进行迭代,并检索有关这些图层的一些信息 如果我可以得到一个选定层的数组,我会很好,我知道如何做其余的,但获得该数组本身就是一个头痛的问题 我知道该文档包含类似“activeLayers”的内容,但我不知道如何处理层和子层 所有的层都在一个组中,所以如果它更容易,如果我能得到一个组中的每一层,那也会很好:D 感谢您提供的相关提示。您需要查看“ArtLayers”和“LayerSet”对象。以下代码段将获取文档中第一个组中的所有图层: va
感谢您提供的相关提示。您需要查看“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;ixBravo,除了在未选择任何层时出现错误外,它的代码可以正常工作,因此我对其进行了调整,以消除错误并只返回一个空数组:
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 );