我已启用此功能,以便在每个图层中获得具有斜角和浮雕效果的数据 文档。现在,我正在寻找一种相同的方法,但是要排除特定的组( layerSet )。
function getLayersData()
{
var lyrs = [];
var layers = 1;
while (true)
{
ref = new ActionReference();
ref.putIndex(charIDToTypeID('Lyr '), layers);
try
{
var d1 = executeActionGet(ref);
var d2 = executeActionGet(ref);
var d3 = executeActionGet(ref);
var d4 = executeActionGet(ref);
}
catch (err)
{
break;
};
var c2t = function (s){return app.charIDToTypeID(s);};
var s2t = function (s){return app.stringIDToTypeID(s);};
var lyr = {};
lyr.type = d1.getInteger(s2t("layerKind"));
lyr.name = d1.getString(c2t("Nm "));
lyr.id = d1.getInteger(s2t("layerID"));
if (checkbox1.value == true)
{
ref.putEnumerated( c2t("Lyr "), c2t("Ordn"), c2t("Trgt") );
if (d1.hasKey(s2t('layerEffects')))
{
d1 = d1.getObjectValue(s2t('layerEffects'));
if (d1.hasKey(s2t('bevelEmboss')))
{
d1 = d1.getObjectValue(s2t('bevelEmboss'));
// etc
d2 = d1.getObjectValue(s2t('highlightColor'));
// etc
d3 = d1.getObjectValue(s2t('shadowColor'));
// etc
d4 = d1.getObjectValue(c2t('TrnS'));
// etc
lyrs.push(lyr);
};
};
}
else
{
lyrs.push(lyr);
};
layers++;
};
return lyrs;
};
例如,假设我们有五个组,名称分别为Group1、2、3、4和5。
在每个组中,我们有四个具有相同名称的向量。都是“形状1”。
我想列出所有这些“形状1”矢量,但第5组中的矢量除外!
我找到了将所有组名列出到另一个函数中的方法。所以我只需要这个函数(我正在显示的那个函数)来检查每一层的父名称,以及是否layer是要排除在外的这一组的孩子!!!
答案 0 :(得分:1)
在脚本中使用组是很痛苦的事情,某些脚本可能会变慢,具体取决于您拥有的组和层的数量。DOM的排序没有系统性或逻辑性:(
但是,您可以做的是通过递归遍历所有层,并排除不需要的层。我拼凑了一个脚本,该脚本将遍历所有图层并记录组图层名称,并忽略第5组。您应该可以从中组合出要使用的内容。
// group layer vegetables
var allLayers = new Array();
// hold an array that we want to ignore the names of
var excludeLayers = ["Group 5"];
var theLayers = collect_all_layers(app.activeDocument, 0, excludeLayers);
var s = "Groups:\n";
for (var i = 0; i < allLayers.length; i++)
{
s += allLayers[i] + "\n"
}
alert(s);
function do_stuff(alayer)
{
// do stuff!
alert(alayer.name);
}
// function collect all layers
function collect_all_layers (theParent, level, exclude)
{
for (var m = theParent.layers.length - 1; m >= 0; m--)
{
var theLayer = theParent.layers[m];
if (theLayer.typename == "LayerSet")
{
for (i = 0; i< exclude.length; i++)
{
if (theLayer.name == exclude[i])
{
alert ("Found " + exclude[i] + " and ignoring it.");
}
else
{
allLayers.push(theLayer.name);
}
}
}
// apply the function to layersets;
if (theLayer.typename == "ArtLayer")
{
// find the art layers
do_stuff(theLayer)
}
else
{
collect_all_layers(theLayer, level + 1, excludeLayers);
}
}
}