Gibt es eine Möglichkeit, Schnittmasken mit JavaScript zu identifizieren? PS CS5

Ich schreibe ein Skript, das nach Ebenen mit einem bestimmten Namen in einem Dokument sucht, und ich brauche es, um dann zu prüfen, ob Schnittmasken darauf angewendet wurden, und sie alle auszuwählen, damit ich sie zusammenführen und exportieren kann. Ich habe viele dieser Schichten, die durch eine PSD verstreut sind, mit mehreren PSDs. Wenn Sie dies tun, sparen Sie hoffentlich eine Menge Zeit.

Das Problem, das ich habe, ist die Identifizierung von Schnittmasken. Ich habe die Referenzdateien durchgesehen und kann nichts Relevantes dazu finden. Gibt es eine Möglichkeit, dies zu tun? Übersehe ich hier etwas?

Hier ist der Anfang meines Codes:

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
        }
    }  
} 

Danke für deine Hilfe!

Ich weiß das nicht genau, aber es ist in einer Hierarchie nicht ungewöhnlich, dass Elternelemente praktisch nichts über ihre Kinder wissen; Alle Beziehungsinformationen gehören zu den untergeordneten Elementen.

Antworten (2)

Ich habe das Gefühl, dass Sie das mit tun könnten ActionReference, aber ich habe keine Ahnung, wie.

... aber ich habe dieses Skript geschrieben, das funktionieren sollte, aber es ist auch irgendwie dumm ...

Beide basieren auf dem Wissen, dass, wenn Sie eine Schnittmasken-Basisebene gruppieren, diese und jede einzelne daran angehängte Ebene gruppiert werden. Dies ist der einzige Schichttyp, der auf diese Weise funktioniert. Wenn Sie also die Gruppenlänge überprüfen und sie größer als 1 ist, muss die Ebene die Basisebene einer Schnittmaske sein.

Ich habe das erste Skript hier eingefügt, um die Grundidee zu veranschaulichen. Das zweite Skript ist eine erweiterte Version des ersten.

Dieses erste Skript gibt true zurück, wenn die aktuelle Ebene die Basisebene einer Schnittmaske ist:

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;

}

Dieses Skript gibt Ihnen jede Ebene in der Schnittmaske mit Ausnahme der Basisebene:

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; }

}

-1Wenn Sie die aus der Schleife entfernen for, erhalten Sie auch die Basisschicht.



Es gibt ein mögliches Problem mit diesen Skripten: Wenn Sie mehrere aktive Ebenen haben, wenn diese Funktion ausgeführt wird, werden alle aktiven Ebenen gruppiert und die Skript-Dinge, die Sie dort haben, erhalten eine Schnittmaske.

Ich habe es so geschrieben, weil es einfacher ist und in diesem Fall kein Problem sein sollte.

Am Ende habe ich einen anderen Weg gefunden, es zu tun. Stattdessen habe ich die Ebenen in einem Ebenensatz gruppiert und auf diese Weise aus dem Dokument exportiert. Wer es sehen möchte, kann hier vorbeischauen:

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