如何使用动作管理器获取图层的数据,不包括具有特定layerSet的图层?

问题描述 投票:0回答:1

我具有此[[function,以便在document中获得具有Bevel and Emboss效果的每个layerdata。现在,我正在寻找一种执行same事情的方法,但要排除特定的组(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是该组的子级即可!!

javascript photoshop photoshop-script
1个回答
0
投票
在脚本中使用组是一个痛苦的过程,某些脚本可能会变慢,具体取决于您拥有的组和层的数量。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); } } }

© www.soinside.com 2019 - 2024. All rights reserved.