K基本上我需要编写一个photoshop脚本,它遍历选定的图层并检索有关它们的一些信息。
如果我可以获得所选图层的数组,我会很好,我知道如何做其余的工作,但是获得该数组本身就是一个令人头痛的问题。
我知道该文档包含类似“activeLayers”的内容,但我迷失了如何处理关卡和次级层。
所有图层都在一个组中,所以如果它更容易,如果我可以获得组中的每个图层也会很棒:D
感谢您提供此任何提示。
答案 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();
答案 2 :(得分:1)
您需要查看“ArtLayers”&#39;和&#39; LayerSets&#39;对象。以下代码段将获取文档中第一组中的所有图层:
var lyrs = app.activeDocument.layerSets[0].artLayers;
但由于您的每个组都可以包含其他组,因此您可能需要递归遍历所有组以根据您的用例获取所有图层。
我强烈建议您查看xtools库。它有一个很好的功能&#39; Stdlib.getLayersList&#39;这将允许您从嵌套组中递归地获取所有图层(以及许多其他很棒的东西)。获取图书馆here。