Как я могу получить данные слоя, используя Action Manager, за исключением слоев с определенным набором layerSet? - PullRequest
0 голосов
/ 01 октября 2019

Я сделал эту функцию , чтобы получить данные каждого слоя с эффектом Bevel and Emboss в пределах документ . Теперь я ищу способ сделать то же самое , но исключая определенную группу ( 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 !!!

Я нашел способ перечислить всеимена групп в другую функцию. Так что мне просто нужна эта функция, которую я показываю, чтобы проверить родительское имя для каждого слоя и если слой является дочерним для этой группы, которую нужно исключить !!!

1 Ответ

1 голос
/ 06 октября 2019

Работа с группами внутри сценариев - это боль, и некоторые сценарии могут работать медленно в зависимости от количества групп и слоев, которые у вас есть. В 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);
    }
  }
}
...