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

时间:2019-10-01 15:56:25

标签: javascript photoshop photoshop-script

我已启用此功能,以便在每个图层中获得具有斜角和浮雕效果的数据 文档。现在,我正在寻找一种相同的方法,但是要排除特定的组( 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是要排除在外的这一组的孩子!!!

1 个答案:

答案 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);
    }
  }
}