[FIXED] Photoshop CC2019 Auto-Update Alle verknüpften intelligenten Objekte einschließlich verschachtelter

Ausgabe

Ich habe ein Photoshop CC2019 PSD-Dokument mit mehreren Smart-Objekten, die andere Smart-Objekte enthalten, die andere Smart-Objekte enthalten. Einige davon haben verknüpfte Ebenen. Normalerweise werden solche Bilder nicht automatisch aktualisiert (was extrem ärgerlich ist, Adobe!), sondern Sie müssen jedes von ihnen manuell aktualisieren, sobald sich der verlinkte Bildinhalt geändert hat.

Es gibt eine .jsx-Skriptdatei mit dem Namen “Update All Modified Content.jsx”, die verknüpfte Ebenen (in meinem Fall PNG-Bild) automatisch aktualisiert, jedoch nur, wenn sich das Smart-Objekt im obersten Dokument befindet – das sind keine verschachtelten Smart-Objekte mit Verknüpfung Ebenen werden automatisch aktualisiert.

Meine Frage ist: Weiß jemand, wie man den Inhalt der oben genannten .jsx-Datei aktualisiert, damit alle verknüpften Bilder über alle intelligenten Objekte im PSD-Dokument hinweg automatisch aktualisiert werden, einschließlich verschachtelter?

Für diejenigen, die sich dafür interessieren oder bereit wären, beim Aktualisieren des Codes zu helfen, hier ist es:

// Update all modified content
var idplacedLayerUpdateAllModified = stringIDToTypeID( "placedLayerUpdateAllModified" );
executeAction( idplacedLayerUpdateAllModified, undefined, DialogModes.NO );

Lösung

Nachdem ich einen halben Tag damit verbracht hatte, habe ich es endlich selbst gelöst. Hier ist der Code:

#target photoshop

// SET INITIAL ACTIVE DOCUMENT
var mainDocument = app.activeDocument;

// SAVE THE DOCUMENT NAME FOR FUTURE USE
var mainDocName = mainDocument.name;

// RUN THE MAIN UPDATE FUNCTION
mainDocument.suspendHistory("processAllSmartObjects", "autoupdateAllSmartObjects(mainDocument, 0)");

// FINALLY SAVE THE MAIN DOCUMENT
mainDocument.save();

function autoupdateAllSmartObjects(theParent, prevVal) {

    // FUNCTION TO TEST IF SMARTOBJECT IS LINKED
    function isLinkedSO(obj) {

        var localFilePath = "";
        var ref = new ActionReference();
        ref.putIdentifier(charIDToTypeID('Lyr '), obj.id);
        var desc = executeActionGet(ref);
        var smObj = desc.getObjectValue(stringIDToTypeID('smartObject'));  
        var isLinked = false;

        // TEST IF IT HAS LINKED FILE
        try {
            var localFilePath = smObj.getPath(stringIDToTypeID('link'));
            isLinked = true;

        } catch(e) {
            //
        }

        return isLinked; 
    }

    // FUNCTION TO UPDATE LINKED SMART OBJECT 
    function doTheUpdate(LYR, stackNr) {

        // SET ACTIVE LAYER TO ACTUALY ITERATED ONE
        app.activeDocument.activeLayer = LYR;

        // RUN IN "SILENT" MODE
        app.displayDialogs = DialogModes.NO;
        var layer = app.activeDocument.activeLayer;

        // IF ACTIVE LAYER IS SMARTOBJECT
        if (layer.kind == "LayerKind.SMARTOBJECT") {

            //alert(layer);

            // OPEN THE SMARTOBJECT
            app.runMenuItem(stringIDToTypeID('placedLayerEditContents'));

            // DO THE ACTUAL FILE UPDATE
            var idplacedLayerUpdateAllModified = stringIDToTypeID( "placedLayerUpdateAllModified" );
            executeAction( idplacedLayerUpdateAllModified, undefined, DialogModes.NO);

            // IF IT IS NOT THE "CORE/MAIN" DOCUMENT
            if(stackNr > 0) {

                // SAVE CHANGES (UPDATE) AND CLOSE IT
                app.activeDocument.close(SaveOptions.SAVECHANGES);
            }

            // CONTINUE INSIDE THIS ACTIVE SMARTOBJECT
            autoupdateAllSmartObjects(app.activeDocument, stackNr);
        }

        return;
    }

    // FUNCTION TO PARSE GROUPS
    function parseGroup(LYR) {

        var groupLayers = LYR.layers;

        // IF GROUP IS NOT EMPTY
        if(groupLayers.length > 0) {

            // PARSE ALL LAYERS IN THE GROUP
            for (var i = groupLayers.length - 1; i >= 0; i--) {

                var lyr = groupLayers[i];

                // IF NOT LOCKED = NOT EDITABL:E
                if(!lyr.allLocked) {

                    // YET ANOTHER GROUP?
                    if (lyr.typename == "LayerSet") {

                        // IF IT IS NOT EMPTY
                        if (lyr.layers.length > 0) {

                            // RE-RUN THE SCRIPT ANEW WITH THE SELECTED GROUP AS LAYERS SOURCE
                            autoupdateAllSmartObjects(lyr, 0);
                        }

                    // LAYERS
                    } else if (lyr.typename == "ArtLayer") {

                        // IF THE LAYER IS SMARTOBJECT
                        if (lyr.kind == LayerKind.SMARTOBJECT) {

                            // IF THE LAYER IS SET TO "visible" (THAT IS: NOT DISABLED)
                            if(lyr.visible){

                                // TEST IF THE SMARTOBJECT IS ACTUALLY LINKED
                                if(!isLinkedSO(lyr)) {

                                    // RUN THE UPDATE SUB-FUNCTION
                                    doTheUpdate(lyr, i);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    // PARSE ALL THE LAYERS
    for (var i = theParent.layers.length - 1 - prevVal; i >= 0; i--) {

        var theLayer = theParent.layers[i];

        // ONLY ArtLayers
        if (theLayer.typename == "ArtLayer") {

            // IF THE LAYER IS SMARTOBJECT
            if (theLayer.kind == LayerKind.SMARTOBJECT) {

                // IF THE LAYER IS SET TO "visible" (THAT IS: NOT DISABLED)
                if(theLayer.visible){

                    // TEST IF THE SMARTOBJECT IS ACTUALLY LINKED
                    if(!isLinkedSO(theLayer)){

                        // RUN THE UPDATE SUB-FUNCTION
                        doTheUpdate(theLayer, i);

                        // IF WE ARE AT THE LAST LAYER IN THE STACK AND IT IS NOT OUR MAIN DOCUMENT
                        if(i == 0 && app.activeDocument.name !== mainDocName) {

                            // SAVE CHANGES (UPDATE) AND CLOSE IT
                            app.activeDocument.close(SaveOptions.SAVECHANGES);
                        }
                    }
                }
            }

        // ONLY Groups
        } else if (theLayer.typename == "LayerSet") {

            // RUN SUB-FUNCTION FOR GROUP PARSING
            parseGroup(theLayer);

        // ANYTHING ELSE
        } else {

            autoupdateAllSmartObjects(theLayer, m);
        }
    }

    return;
};


Beantwortet von –
qraqatit


Antwort geprüft von –
Willingham (FixError Volunteer)

0 Shares:
Leave a Reply

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

You May Also Like