Photoshop CC2019自动更新所有链接的智能对象包括嵌套对象

问题描述 投票:0回答:1

我有Photoshop CC2019 PSD文档,其中包含几个智能对象,包含其他智能对象,包含其他智能对象。其中一些有链接的图层。通常情况下,这类图片不会自动更新(这是非常烦人的,Adobe!),但一旦链接的图片内容发生变化,你必须手动更新每个图片。

有一个名为 "Update All Modified Content.jsx "的.jsx脚本文件,它可以自动更新链接图层(在我的例子中是PNG图片),但只有当智能对象在最上面的文档中时,才会自动更新--也就是说没有嵌套的智能对象的链接图层会自动更新。

我的问题是:有谁知道如何更新上述.jsx文件的内容,使它能自动更新PSD文档中所有智能对象的所有链接图片,包括嵌套的图片?

对于那些关心或愿意帮助更新代码的人,这里是。

// Update all modified content
var idplacedLayerUpdateAllModified = stringIDToTypeID( "placedLayerUpdateAllModified" );
executeAction( idplacedLayerUpdateAllModified, undefined, DialogModes.NO );
image photoshop layer
1个回答
0
投票

所以,我花了半天时间,终于自己解决了。下面是代码。

#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;
};
© www.soinside.com 2019 - 2024. All rights reserved.