2017-03-25 2 views
1

Je suis bloqué par un script qui détecte quel calque est visible dans un (sous-) calque (alias Group) avec le nom "Color".Photoshop Script - Récupère le nom du calque visible dans le groupe/calque

Le script ci-dessous recherche toutes les couches visibles et les sélectionne. Je ne peux pas le faire fonctionner pour faire la même chose SEULEMENT dans le jeu de couches mentionné.

Toute aide serait grandement appréciée!

#target photoshop 
 
app.bringToFront(); 
 

 
main(); 
 
function main(){ 
 
if(!documents.length) return; 
 
var Vis = getVisLayers(); 
 
deselectLayers(); 
 
for(var a in Vis){ 
 
    selectLayerById(Number(Vis[a]),true); 
 
    } 
 
} 
 
function getVisLayers(){ 
 
    var ref = new ActionReference(); 
 
    ref.putEnumerated(charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt')); 
 
    var count = executeActionGet(ref).getInteger(charIDToTypeID('NmbL')) +1; 
 
    var Names=[]; 
 
try{ 
 
    activeDocument.backgroundLayer; 
 
var i = 0; }catch(e){ var i = 1; }; 
 
    for(i;i<count;i++){ 
 
     if(i == 0) continue; 
 
     ref = new ActionReference(); 
 
     ref.putIndex(charIDToTypeID('Lyr '), i); 
 
     var desc = executeActionGet(ref); 
 
     var layerName = desc.getString(charIDToTypeID('Nm ')); 
 
     var Id = desc.getInteger(stringIDToTypeID('layerID')); 
 
     if(layerName.match(/^<\/Layer group/)) continue; 
 
     var layerType = typeIDToStringID(desc.getEnumerationValue(stringIDToTypeID('layerSection'))); 
 
     var isLayerSet =(layerType == 'layerSectionContent') ? false:true; 
 
     var vis = desc.getBoolean(charIDToTypeID("Vsbl")); 
 
     if(!isLayerSet && vis) Names.push(Id); 
 
    }; 
 
return Names; 
 
}; 
 
function selectLayerById(ID, add) { 
 
    add = (add == undefined) ? add = false : add; 
 
    var ref = new ActionReference(); 
 
    ref.putIdentifier(charIDToTypeID('Lyr '), ID); 
 
    var desc = new ActionDescriptor(); 
 
    desc.putReference(charIDToTypeID('null'), ref); 
 
    if (add) { 
 
     desc.putEnumerated(stringIDToTypeID('selectionModifier'), stringIDToTypeID('selectionModifierType'), stringIDToTypeID('addToSelection')); 
 
    } 
 
    desc.putBoolean(charIDToTypeID('MkVs'), false); 
 
    executeAction(charIDToTypeID('slct'), desc, DialogModes.NO); 
 
} 
 
function deselectLayers() { 
 
    var desc01 = new ActionDescriptor(); 
 
     var ref01 = new ActionReference(); 
 
     ref01.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt')); 
 
    desc01.putReference(charIDToTypeID('null'), ref01); 
 
    executeAction(stringIDToTypeID('selectNoLayers'), desc01, DialogModes.NO); 
 
};

enter image description here

Répondre

0

Grâce à @Ghoul Fool j'ai enfin réussi à faire fonctionner ça. J'ai changé le code un peu car j'ai seulement besoin de vérifier quelle couche est visible et de stocker ce nom en tant que variable. Ce serait génial si quelqu'un de plus compétent pouvait corriger mon code pour d'autres qui l'utiliseraient ou des parties de celui-ci.

Merci encore

// Checking which layer is visible in layeset (group) "Colors" in "Mockup.psd" aka mockupDoc and store it's name for later use in the "save" part. 
var front = mockupDoc.layerSets.getByName("Front"); 
var colors = front.layerSets.getByName("Colors"); 
for (var m = colors.layers.length - 1; m >= 0; m--) 
{ 
    var theLayer = colors.layers[m]; 
    if (theLayer.typename == "ArtLayer") 
{ 
    if (theLayer.visible == true) 
    { 
     // Sets a variable for the name of the visible Layer in the "Colors" Group, so i can use it later as a part of the Filename when saving. 
     var activeColor = theLayer.name; 
    } 
    } 
}; 
0

Trouble with groupes est que vous devez sauter à la fin profonde. Malheureusement, la façon dont Photoshop conserve ses calques n'est pas intuitive. La meilleure chose à faire est d'avoir une fonction récursive et de regarder toutes les couches - à partir de cela, vous serez en mesure de déterminer si c'est un groupe ou non. Et puis travailler si c'est visible.

var allLayers = new Array(); 
var theLayers = collectAllLayers(app.activeDocument, 0); 

// function collect all layers 
function collectAllLayers (theParent, level) 
{ 
    for (var m = theParent.layers.length - 1; m >= 0; m--) 
    { 
    var theLayer = theParent.layers[m]; 

    if (theLayer.typename == "ArtLayer") 
    { 
     // find the art layers 
     if (theLayer.visible == true) 
     { 
     //do stuff here 
     } 
    } 
    else 
    { 
     allLayers.push(level + theLayer.name); 
     collectAllLayers(theLayer, level + 1) 
    } 
    } 
} 
+0

Merci beaucoup pour votre réponse. Bien que j'ai parcouru un long chemin avec mon script complet dans le besoin, je suis toujours un débutant dans les scripts PS et je ne suis pas sûr si je vous ai bien compris. Je n'ai pas besoin de déterminer si le groupe "couleurs" est visible, mais quelle couche à l'intérieur de ce groupe est visible. Disons que mon groupe est appelé "COULEURS" et à l'intérieur de ce groupe j'ai "Jaune", "Noir", "Orange" et ainsi de suite. Maintenant, il n'y a qu'un seul de ces calques visibles à la fois, j'exporte le fichier jpg et je dois savoir lequel et enregistrer le nom de la couleur dans le nom de fichier. – GTO

+0

Boucle sur toutes les couches pour inclure des groupes. Si c'est une couche d'art - alors c'est probablement votre après - puis déterminez si elle est visible. J'ai ajusté le code plus loin pour aider. –

+0

Merci encore @Ghoul Fool - Je suis toujours coincé après des heures de lecture et d'essayer de le faire fonctionner. J'ai été capable de sortir (alerter) tous les calques et groupes visibles, mais toujours de ne pas sortir le nom du calque visible dans le groupe "Couleurs" qui sort lui-même comme "1Couleurs". Je suis désolé de demander à nouveau et j'aimerais résoudre ceci par moi-même .... mais je devine que je suis stupide. – GTO