[FIXED] Holen Sie sich ausgewählte Schichten

Ausgabe

Gibt es im Gegensatz zu dieser Frage eine Möglichkeit, ein Array aktuell ausgewählter Ebenen zurückzugeben, ohne alle Ebenen durchlaufen zu müssen und diese Auswahl daher zu entfernen / neu anzupassen?

function get_selected_layers()
{
  var layers = app.activeDocument.activeLayer;
 // only works with *last* selected layer
 // not *all* selected layers
}

var thelayers = get_selected_layers;
alert(thelayers);

Lösung

Irgendwie, aber nicht wirklich. Es gibt keine native Möglichkeit, ein Array ausgewählter artLayerObjekte zu erhalten. Aber es gibt eine Action Manager-Methode, um Deskriptoren ausgewählter Layer zu erhalten – und von Deskriptoren können Sie alles bekommen, was Sie wollen. Hier ist ein Ausschnitt, der ein Array ausgewählter Layer-Namen, -Indizes und -IDs zurückgibt – mit verschiedenen Gettern für den Layer-Deskriptor ( desc) ist es möglich, alles andere zu erhalten. Als Bonus eine Funktion zur Auswahl nach IDs, wenn Sie DOM-Objekte artLayerserhalten möchten . artLayerUnd ja, das funktioniert mit Gruppen und Zeichenflächen.

var layers = getSelectedLayersInfo();

// if we _really_ want to get artLayers we can select them one by one with IDs
for (var i = 0; i < layers.length; i++) {
  selectByID(layers[i].id);
  alert(activeDocument.activeLayer.name);
}

// and reselecting everything back
for (var i = 0; i < layers.length; i++) {
  selectByID(layers[i].id, true);
}


function getSelectedLayersInfo()
{
  var lyrs = [];
  var lyr;
  var ref = new ActionReference();
  var desc;
  var tempIndex = 0;
  var ref2;
  ref.putProperty(stringIDToTypeID("property"), stringIDToTypeID("targetLayers"));
  ref.putEnumerated(charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));

  var targetLayers = executeActionGet(ref).getList(stringIDToTypeID("targetLayers"));
  for (var i = 0; i < targetLayers.count; i++)
  {
    ref2 = new ActionReference();

    // if there's a background layer in the document, AM indices start with 1, without it from 0. ¯\_(ツ)_/¯ 
    try
    {
      activeDocument.backgroundLayer;
      ref2.putIndex(charIDToTypeID('Lyr '), targetLayers.getReference(i).getIndex());
      desc = executeActionGet(ref2);
      tempIndex = desc.getInteger(stringIDToTypeID("itemIndex")) - 1;

    }
    catch (o)
    {
      ref2.putIndex(charIDToTypeID('Lyr '), targetLayers.getReference(i).getIndex() + 1);
      desc = executeActionGet(ref2);
      tempIndex = desc.getInteger(stringIDToTypeID("itemIndex"));
    }

    lyr = {};
    lyr.index = tempIndex;
    lyr.id = desc.getInteger(stringIDToTypeID("layerID"));
    lyr.name = desc.getString(charIDToTypeID("Nm  "));
    lyrs.push(lyr);
  }

  return lyrs;
}

function selectByID(id, add) {
    if (add == undefined) add = false;
    var desc1 = new ActionDescriptor();
    var ref1 = new ActionReference();
    ref1.putIdentifier(charIDToTypeID('Lyr '), id);
    desc1.putReference(charIDToTypeID('null'), ref1);
    if (add) desc1.putEnumerated(stringIDToTypeID("selectionModifier"), stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
    executeAction(charIDToTypeID('slct'), desc1, DialogModes.NO);
} // end of selectByID()


Beantwortet von –
Sergey Kritskiy


Antwort geprüft von –
Mary Flores (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like