¿Hay alguna forma de identificar las máscaras de recorte usando JavaScript? PS CS5

Estoy escribiendo un script que busca capas con un nombre determinado en un documento, y lo necesito para verificar si tiene máscaras de recorte aplicadas y seleccionarlas todas para poder fusionarlas y exportarlas. Tengo muchas de estas capas llenas de un PSD, con varios PSD. Así que hacer esto con suerte ahorrará una tonelada de tiempo.

El problema que tengo es con las máscaras de recorte de identificación. He revisado los archivos de referencia y no puedo encontrar nada relevante para ellos. ¿Hay alguna manera de hacer esto? ¿Me estoy perdiendo de algo?

Aquí está el comienzo de mi código:

var doc = app.activeDocument  
var ratios = ["1/1", "4/3", "3/4", "3/2", "2/3", "16/9", "9/3", "7/2", "11/5"];  

for (var i = 0, il = doc.layers.length; i < il; i++) {  
    var curLayer = doc.layers[i];  
    for (var j = 0, jl = ratios.length; j < jl; j++) {  
        if (curLayer.name == ratios[j]) {  
            alert(curLayer.name); 
            // Check for clipping masks attached to this layer
        }
    }  
} 

¡Gracias por toda tu ayuda!

No sé sobre esto específicamente, pero no es inusual en una jerarquía que los elementos principales no sepan prácticamente nada sobre sus hijos; toda la información de la relación pertenece a los elementos secundarios.

Respuestas (2)

Tengo la sensación de que podrías hacer eso con ActionReference, pero no tengo ni idea de cómo.

...sin embargo, escribí este script que debería funcionar, pero también es un poco estúpido...

Ambos se basan en el conocimiento de que si agrupa una capa base de máscara de recorte, la agrupa y todas las capas adjuntas a ella. Este es el único tipo de capa que actúa de esta manera. Entonces, si luego verifica la longitud del grupo y es mayor que 1, entonces la capa debe ser la capa base de una máscara de recorte.

Pongo el primer guión aquí para ilustrar la idea básica. El segundo script es una versión extendida del primero.

Este primer script devuelve verdadero si la capa actual es la capa base de una máscara de recorte:

function clippingMaskBaseLayer() {

    var doc = app.activeDocument;

    app.runMenuItem( stringIDToTypeID('groupLayersEvent') );

    var clippingmask = doc.activeLayer.layers.length > 1 ? true : false;

    executeAction( charIDToTypeID('undo'), undefined, DialogModes.NO );

    return clippingmask;

}

Este script le proporciona todas las capas de la máscara de recorte, excepto la capa base:

function clippingMaskLayers() {

    var doc = app.activeDocument;

    app.runMenuItem( stringIDToTypeID('groupLayersEvent') );

    var group = doc.activeLayer,
        groupLength = group.layers.length,
        clippingmask = groupLength > 1 ? true : false,
        collectedLayers = [];

    if ( clippingmask ) {

        for ( var i=0; i < groupLength-1; i++ ) {
            collectedLayers.push( group.layers[i] );
        }

    }

    executeAction( charIDToTypeID('undo'), undefined, DialogModes.NO );

    if ( clippingmask ) { return collectedLayers; } else { return false; }

}

Si quita el -1del forbucle, también obtendrá la capa base.



Hay un problema potencial con estos scripts: si tiene varias capas activas cuando se ejecuta esta función, todas las capas activas se agruparán y el script tiene una máscara de recorte allí.

Lo escribí de esta manera porque es más simple y en este caso no debería ser un problema.

Terminé pensando en otra forma de hacerlo. En cambio, agrupé las capas en un conjunto de capas y las exporté fuera del documento de esa manera. Para aquellos que quieran verlo, echen un vistazo aquí:

https://gist.github.com/BeauAgst/4da366b933cc75a0606a