Ausgabe
Ich versuche, eine Aktionsmanagerfunktion zum Auswählen von Ebenen zu erstellen. Dies kann mit dem Dom erfolgen, aber ich möchte herausfinden, warum es nicht funktioniert. Nun, es funktioniert, wenn alle Layer und LayerSets unterschiedliche Namen haben. Aber wenn Ebenen mit demselben Namen vorhanden sind, wird nur die erste ausgewählt, die sie findet. Aber… Im AM-Code, der vom Scriptlistener aufgezeichnet wurde, wird ein layer.id-Parameter verwendet.
Ich verstehe, warum ich eine Layer-ID brauche, ohne sie hat es nur den Layer-Namen, das reicht nicht, wenn es mehrere Layer mit demselben Namen gibt. Aber es scheint korrekt aufzunehmen, aber nicht abzuspielen.
der scriptlistener zeigt diese Änderung der layer.id. Aber wenn ich den Listerner-Code ausführe, ignoriert er diesen Parameter und wählt immer noch nur den ersten aus. Sie können dort einen beliebigen Wert eingeben, und es macht keinen Unterschied. Warum sollte das so sein? Es scheint, dass in anderem AM-Code einige Variablen insgesamt nicht verwendet werden.
var idslct = charIDToTypeID( "slct" );
var desc34 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref13 = new ActionReference();
var idLyr = charIDToTypeID( "Lyr " );
ref13.putName( idLyr, "Group 4" );
desc34.putReference( idnull, ref13 );
var idMkVs = charIDToTypeID( "MkVs" );
desc34.putBoolean( idMkVs, false );
var idLyrI = charIDToTypeID( "LyrI" );
var list5 = new ActionList();
list5.putInteger( 4 );
desc34.putList( idLyrI, list5 );
executeAction( idslct, desc34, DialogModes.NO );
var idslct = charIDToTypeID( "slct" );
var desc35 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref14 = new ActionReference();
var idLyr = charIDToTypeID( "Lyr " );
ref14.putName( idLyr, "Group 4" );
desc35.putReference( idnull, ref14 );
var idMkVs = charIDToTypeID( "MkVs" );
desc35.putBoolean( idMkVs, false );
var idLyrI = charIDToTypeID( "LyrI" );
var list6 = new ActionList();
list6.putInteger( 6 );
desc35.putList( idLyrI, list6 );
executeAction( idslct, desc35, DialogModes.NO );
var idslct = charIDToTypeID( "slct" );
var desc36 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref15 = new ActionReference();
var idLyr = charIDToTypeID( "Lyr " );
ref15.putName( idLyr, "Group 4" );
desc36.putReference( idnull, ref15 );
var idMkVs = charIDToTypeID( "MkVs" );
desc36.putBoolean( idMkVs, false );
var idLyrI = charIDToTypeID( "LyrI" );
var list7 = new ActionList();
list7.putInteger( 8 );
desc36.putList( idLyrI, list7 );
executeAction( idslct, desc36, DialogModes.NO );
Der obige Code “sollte” 3 LayerSets auswählen, alle mit dem Namen “Gruppe 4”. Die ID’s wurden korrekt erfasst, 4, 6 und 8. Es wird aber nur 3 mal ein und dasselbe LayerSet ausgewählt. Sie könnten ein Skript verwenden, um nach einer ID-Übereinstimmung zu suchen, und die Kuppel verwenden, um die richtige Ebene auszuwählen, aber ich möchte es verstehen;)
Jeder Rat ist willkommen!
Lösung
Der von Ihnen gepostete Code wählt eine Ebene nach Namen aus, die ID-Referenz wird ignoriert (ich glaube, sie wird zum Abrufen einer ID verwendet): Das wichtige Bit hier ist, putReference
und ich weiß nicht, woher das ActionList
, was Sie erstellen, stammt.
Hier ist eine Funktion zur Auswahl nach ID:
function selectById(data)
{
if (data == undefined) return false;
if (data.id == undefined) return false;
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putIdentifier(charIDToTypeID('Lyr '), data.id);
desc.putReference(charIDToTypeID('null'), ref);
if (data.add) desc.putEnumerated(stringIDToTypeID("selectionModifier"), stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
if (data.visible) desc.putBoolean(charIDToTypeID('MkVs'), data.visible);
executeAction(charIDToTypeID('slct'), desc, DialogModes.NO);
}
Um mehrere Ebenen auszuwählen, können Sie so etwas tun
selectById({id: 4})
selectById({id: 6, add: true})
selectById({id: 8, add: true})
ps wenn du ref.putIdentifier()
zum ref.putIndex()
snippet wechselst wird schicht nach index selektiert.
Beantwortet von – Sergey Kritskiy
Antwort geprüft von – Robin (FixError Admin)