• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
2

Photoshop Scripting - Image Placement Within Frame

Explorer ,
Mar 16, 2024 Mar 16, 2024

Copy link to clipboard

Copied

Hello!

I'm working on a project in Photoshop where I have a single frame and a single image. Currently, in the Photoshop UI, it's possible to drag an image into a frame, and it automatically scales and positions the image to fit perfectly within the frame's bounds. This process is intuitive and saves a considerable amount of time.

However, I'm looking to automate this process through scripting. I want to achieve the same effect: taking an image and fitting it inside a predefined frame, with the image automatically scaling and positioning itself to match the frame's dimensions and orientation. The goal is to replicate the seamless integration that occurs when manually dragging an image into a frame but through a scripted process.

I've explored various scripting options, including manipulating layers, selections, and transformations, but none provide a straightforward solution to mimic the manual drag-and-drop behavior entirely. The challenge lies in automating the image's fitting process into the frame, ensuring it scales and positions correctly without manual intervention.

 

Could anyone provide insights, solutions, or workarounds that could help achieve this automated fitting of an image to a frame using Photoshop scripting? Any advice or direction towards relevant documentation and examples would be greatly appreciated.

Thanks!

TOPICS
Actions and scripting

Views

1.1K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Expert , Mar 17, 2024 Mar 17, 2024
quote

After removing the line

descriptor.putObject( s2t( "replaceLayer" ), s2t( "placeEvent" ), descriptor );

everything worked perfectly!

 

That is strange, I get the same results with or without that line... However, you are correct that it doesn't appear to be required. I trimmed away a lot of unnecessary code that was recorded by the ScriptingListener plugin but missed that one.

 

 

quote

I also have an additional question that I hope you could help with. Is there a way to determine if a layer is o

...

Votes

Translate

Translate
Adobe
Community Expert ,
Mar 16, 2024 Mar 16, 2024

Copy link to clipboard

Copied

How is this related to your other topic, where the layout had 24 images in a specific 6x4 layout where you wanted to fit to frame tool layers:

 

https://community.adobe.com/t5/photoshop-ecosystem-discussions/automating-student-portrait-layouts-u...

 

If you only wish to swap out a single image, you can look into smart object replacement with or without using a frame or the BatchOneImageCollage.jsx script in the JJMack archive linked in the other topic.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 16, 2024 Mar 16, 2024

Copy link to clipboard

Copied

Hello, and thank you for your suggestion!

I wanted to inquire specifically about the script you mentioned. Does it support placing images within frames (as opposed to smart objects)? It's important for my project that the final output is an image within a frame. I'm willing to do the necessary coding to achieve this. Could you please provide more details on whether the script supports this functionality, or if there's a way to adapt it for use with frames?

Thank you for your assistance!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 16, 2024 Mar 16, 2024

Copy link to clipboard

Copied

No, the JJMack scripts don't use frames or smart objects.

 

Again, how is this related to your other topic, where the layout had 24 images in a specific 6x4 layout where you wanted to fit to frame tool layers?

 

Is it that you wish to start small, just a single image and what you learn from that you will try to apply to multiple frames?

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 17, 2024 Mar 17, 2024

Copy link to clipboard

Copied

Hello,

Thank you for your follow-up. Yes, you've understood my approach correctly. I am indeed starting with a single image to refine my understanding and the script's functionality. Once I have a solid grasp on how to effectively work with one frame, my goal is to apply what I've learned to manage multiple images and frames, specifically in the context of the 6x4 layout project you mentioned.

This step-by-step approach helps me ensure that I fully understand each part of the process before scaling up to the more complex layout. I appreciate your patience and assistance as I navigate through learning and applying these scripting techniques in Photoshop.

Thank you again for your help

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 16, 2024 Mar 16, 2024

Copy link to clipboard

Copied

To get the ball rolling... Presuming that you have a frame layer active/selected, the following code example will place embedded the chosen file into the frame:

 

placeInSelectedFrame(File.openDialog("Select the file to place:"), false);

function placeInSelectedFrame(theFile, linked) {
	function s2t(s) {
        return app.stringIDToTypeID(s);
    }
	var descriptor = new ActionDescriptor();
	descriptor.putPath( s2t( "null" ), theFile ); // File path
	descriptor.putBoolean( s2t( "linked" ), linked ); // Linked/embedded boolean
	descriptor.putEnumerated( s2t( "freeTransformCenterState" ), s2t( "quadCenterState" ), s2t( "QCSAverage" )); // Place and fit
	descriptor.putObject( s2t( "replaceLayer" ), s2t( "placeEvent" ), descriptor );
	executeAction( s2t( "placeEvent" ), descriptor, DialogModes.NO );
}

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 17, 2024 Mar 17, 2024

Copy link to clipboard

Copied

Hello,

I wanted to extend my sincerest thanks for your guidance and the script you shared. It significantly propelled my project forward. After removing the line

descriptor.putObject( s2t( "replaceLayer" ), s2t( "placeEvent" ), descriptor );

everything worked perfectly!

I also have an additional question that I hope you could help with. Is there a way to determine if a layer is of the type 'frame'? I'm looking to further refine my script and this piece of information would be incredibly helpful.

Thank you once again for your invaluable assistance!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 17, 2024 Mar 17, 2024

Copy link to clipboard

Copied

quote

After removing the line

descriptor.putObject( s2t( "replaceLayer" ), s2t( "placeEvent" ), descriptor );

everything worked perfectly!

 

That is strange, I get the same results with or without that line... However, you are correct that it doesn't appear to be required. I trimmed away a lot of unnecessary code that was recorded by the ScriptingListener plugin but missed that one.

 

 

quote

I also have an additional question that I hope you could help with. Is there a way to determine if a layer is of the type 'frame'? I'm looking to further refine my script and this piece of information would be incredibly helpful.

 

By @Adi1231234

 

Yes, I can help you there.

 

I know that you are new to scripting, so let me try to explain... In the legacy ExtendScript used by Photoshop before the new UXP scripting, there were two types of code:

 

* ExtendScript Document Object Model code (DOM)

* ExtendScript Action Manager code (AM)

 

DOM code is high-level, more "user friendly" and legible than AM code, which is low-level, more like "machine language". Unfortunately, DOM code doesn't cover many areas of Photoshop, so we have to use AM code. AM code can sometimes provide performance benefits over DOM code, it doesn't matter that the code is more verbose than DOM.

 

The previous code that I provided to place an image is AM code, which has been greatly simplified from the source and placed into a JavaScript Function.

 

Now that I have given you some background context, it's time to answer your question regarding checking/testing that the active layer is a Frame.

 

In the standard DOM code, Adobe shares the same entry for Layer Groups, Artboards and Frames. This is the 

"LayerSet" typename. As long as there is no chance that you may have a Layer Group selected, you can just use standard DOM code to ensure that the active layer isn't another layer kind:
 
if (app.activeDocument.activeLayer.typename == "LayerSet") {
    placeInSelectedFrame(File.openDialog("Select the file to place into the Frame:"), false);
} else {
    alert("The layer '" + app.activeDocument.activeLayer.name + "' isn't a Frame layer...");
}

function placeInSelectedFrame(theFile, linked) {
    function s2t(s) {
        return app.stringIDToTypeID(s);
    }
    var descriptor = new ActionDescriptor();
    descriptor.putPath(s2t("null"), theFile); // File path
    descriptor.putBoolean(s2t("linked"), linked); // Linked/embedded boolean
    descriptor.putEnumerated(s2t("freeTransformCenterState"), s2t("quadCenterState"), s2t("QCSAverage")); // Place and fit
    executeAction(s2t("placeEvent"), descriptor, DialogModes.NO);
}

 

However, if you need the script to be able to differentiate between a Frame and not a Layer Group, then you need more complex AM code:

 

if (isFrame()) {
    placeInSelectedFrame(File.openDialog("Select the file to place into the Frame:"), false);
} else {
    alert("The layer '" + app.activeDocument.activeLayer.name + "' isn't a Frame layer...");
}

function placeInSelectedFrame(theFile, linked) {
    function s2t(s) {
        return app.stringIDToTypeID(s);
    }
    var descriptor = new ActionDescriptor();
    descriptor.putPath(s2t("null"), theFile); // File path
    descriptor.putBoolean(s2t("linked"), linked); // Linked/embedded boolean
    descriptor.putEnumerated(s2t("freeTransformCenterState"), s2t("quadCenterState"), s2t("QCSAverage")); // Place and fit
    executeAction(s2t("placeEvent"), descriptor, DialogModes.NO);
}

function isFrame() {
    // modified from a script by greless with hints from jazz-y!
    try {
        var r = new ActionReference();
        r.putEnumerated(stringIDToTypeID('layer'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum'));
        var options = executeActionGet(r);
        return options.hasKey(stringIDToTypeID('framedGroup')); // test for the required key, returns true or false
    } catch (e) {}
}

 

https://community.adobe.com/t5/photoshop-ecosystem-discussions/custom-script-for-renaming-artboards-...

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 18, 2024 Mar 18, 2024

Copy link to clipboard

Copied

Thank you very much!

I tried it out, and it worked! Your advices was practical and directly addressed the issues I was facing. I appreciate your help and just wanted to let you know your suggestions worked well.

Thanks again!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 23, 2024 Mar 23, 2024

Copy link to clipboard

Copied

Hi,
I've been using the 'isFrame' function you provided to check if a layer is a frame type in Photoshop.
After assuming it was functioning correctly for a while, I've recently run into an issue where it consistently returns false for layers that are indeed frame types.

This discovery came as a surprise after a period of usage, as I only now realized the function might not be working as intended. I wonder if there might be a discrepancy in how frame layers are identified or if something has changed in Photoshop's API that affects the function's accuracy.

 

Would you be willing to take another look at the 'isFrame' function and suggest any modifications?
If there are specific details or examples you need to better understand the issue, I'm ready to provide them.

 

I appreciate your expertise and any further assistance you can provide to resolve this matter.
Thanks!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 23, 2024 Mar 23, 2024

Copy link to clipboard

Copied

I may not have the knowledge as this is advanced AM code, but I would be interested to see example files where this fails.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 24, 2024 Mar 24, 2024

Copy link to clipboard

Copied

Thank you for your willingness to delve deeper into this issue.

I can definitely provide examples of the layers I've tested the isFrame function with.

To give you a clear picture, I've tried it on various frame layers, including those with images inside and those without any content.

Unfortunately, the function didn’t work as expected in any of these cases, always returning false.

Before I send over these examples, I’m curious—have you had the opportunity to test the function on your end with similar frame layers? And if so, did it perform correctly for you?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 24, 2024 Mar 24, 2024

Copy link to clipboard

Copied

quote

Before I send over these examples, I’m curious—have you had the opportunity to test the function on your end with similar frame layers? And if so, did it perform correctly for you?


By @Adi1231234

 

Yes, I tested the original 3 scripts to check/test that an active layer is either a group, frame or artboard and have not encountered a situation where they return a false result.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 25, 2024 Mar 25, 2024

Copy link to clipboard

Copied

The attached file contains two frames: one frame with an image and another frame without an image.
The issue I'm encountering is that the function does not recognize that both elements are frames.
Could you please take a look and advise on any possible adjustments to the function that might help resolve this issue?
Thanks

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 25, 2024 Mar 25, 2024

Copy link to clipboard

Copied

@Adi1231234 â€“ Apparently it depends on whether the frame or image has focus:

 

frame-1.pngframe-2.pngframe-3.png

 

So, I believe that an additional step is required to ensure that the frame and not the image are targeted.

 

Looking at the AM code recorded when either the frame or the image is selected:

 

var idselect = stringIDToTypeID( "select" );
    var desc300 = new ActionDescriptor();
    var idnull = stringIDToTypeID( "null" );
        var ref22 = new ActionReference();
        var idlayer = stringIDToTypeID( "layer" );
        ref22.putName( idlayer, "11 Frame" ); // selected by name
    desc300.putReference( idnull, ref22 );
    var idmakeVisible = stringIDToTypeID( "makeVisible" );
    desc300.putBoolean( idmakeVisible, false );
    var idlayerID = stringIDToTypeID( "layerID" );
executeAction( idselect, desc300, DialogModes.NO );

// =======================================================
var idselect = stringIDToTypeID( "select" );
    var desc301 = new ActionDescriptor();
    var idnull = stringIDToTypeID( "null" );
        var ref23 = new ActionReference();
        var idlayer = stringIDToTypeID( "layer" );
        ref23.putName( idlayer, "11" ); // selected by name
    desc301.putReference( idnull, ref23 );
    var idmakeVisible = stringIDToTypeID( "makeVisible" );
    desc301.putBoolean( idmakeVisible, false );
    var idlayerID = stringIDToTypeID( "layerID" );
executeAction(idselect, desc301, DialogModes.NO);

 

The challenge will be in finding the frame layer name and not the image name in the targeted layer to use with the putName string. Unless there is another way using the layer ID or Index.

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 25, 2024 Mar 25, 2024

Copy link to clipboard

Copied

Further clues:

 

2024-03-26_12-54-07.png2024-03-26_12-54-28.png

 

This could be a good hack:

 

app.activeDocument.activeLayer = app.activeDocument.activeLayer.parent;

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 25, 2024 Mar 25, 2024

Copy link to clipboard

Copied

@Adi1231234 

 

The following is a means to an end (i.e. hack), it forces the frame to be selected if the (smart object) contents of the frame are active:

 

/* 
As Groups, Artboards & Frames are all considered as "layerSets" in DOM code, it takes AM code to truly determine the actual layerSet variant... 
Modified from a script by greless with hints from jazz-y!
v1.0, 11th February 2023, Stephen Marsh
v1.1, 26th March 2024 - Added a conditional check to account for the frame content being selected
https://community.adobe.com/t5/photoshop-ecosystem-discussions/custom-script-for-renaming-artboards-with-multiple-elements/m-p/13498536
*/

#target photoshop

if (app.activeDocument.activeLayer.parent.name != app.activeDocument.name) {
    app.activeDocument.activeLayer = app.activeDocument.activeLayer.parent;
    if (app.activeDocument.activeLayer.typename === "LayerSet" && isFrame() === true) {
        alert(app.activeDocument.activeLayer.name + "\r" + "The layer is a Frame!");
        // Do stuff
    }
} else if (app.activeDocument.activeLayer.typename === "LayerSet" && isFrame() === true) {
    alert(app.activeDocument.activeLayer.name + "\r" + "The layer is a Frame!");
    // Do stuff {
} else {
    alert(activeDocument.activeLayer.name + "\r" + "The layer isn't a Frame...");
    // Do other stuff
}

function isFrame() {
    // modified from a script by greless with hints from jazz-y!
    // returns true or false
    try {
        var d = new ActionDescriptor();
        var r = new ActionReference();
        r.putEnumerated(stringIDToTypeID('layer'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum'));
        var options = executeActionGet(r);
        return options.hasKey(stringIDToTypeID('framedGroup')); // test for the required key
    } catch (e) {
        //alert(e);
    }
}

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 25, 2024 Mar 25, 2024

Copy link to clipboard

Copied

My main goal is to create a function that retrieves all the frames within a Photoshop document.
I've attempted to use the code provided here on the PSD file I attached earlier, but the search results consistently return zero.
Do you know why this might be happening?


function isCurrentLayerFrame() {
    try {
        var r = new ActionReference();
        r.putEnumerated(stringIDToTypeID('layer'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum'));
        var options = executeActionGet(r);
        return options.hasKey(stringIDToTypeID('framedGroup')); // Test for the 'framedGroup' key
    } catch (e) {
        return false;
    }
}

function isFrame(layer) {
    app.activeDocument.activeLayer = layer;

    if (layer.kind == LayerKind.SMARTOBJECT) {
        app.activeDocument.activeLayer = layer.parent;
        if (layer.parent.typename === "LayerSet" && isCurrentLayerFrame() === true) {
            return true;
        }
    } else if (layer.typename === "LayerSet" && isCurrentLayerFrame() === true) {
        $.writeln("layer LayerSet");;
        return true;
    }
    return false;
}


function getAllEmptyFrames() {
    var layers = doc.layers;
    var emptyFrames = [];
    for (var i = 0; i < layers.length; i++) {
        var layer = layers[i];
        var isLayerFrame = isFrame(layer);

        if (isLayerFrame) {
            emptyFrames.push(layer);
        }
    }
    return emptyFrames;
}

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 28, 2024 Mar 28, 2024

Copy link to clipboard

Copied

Hi!

@Stephen_A_Marsh, Did you have the opportunity to check the code I sent?

I really appreciate your help so far, This challenge gives me no rest.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 28, 2024 Mar 28, 2024

Copy link to clipboard

Copied

@Adi1231234 

 

There are errors in the code and it's hard for me to work out what you are trying to do.

 

I also stopped looking a smart object and changed my previous code with what I believe is a better method based on the parent.

 

What happens when you know which layers are frames?

 

Can't you just loop over each frame and do what you need on a layer-by-layer basis, rather than first collect a list of frames?

 

You appear to be looking for empty frames, but there isn't code to check for that?

 

Can you explain in simple bullet point form what you are trying to do?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 29, 2024 Mar 29, 2024

Copy link to clipboard

Copied

Thank you for taking the time to help me. Let me address each of your questions and points for clarity:

 

1. Regarding the errors in the code: You mentioned there are errors in my code, making it difficult for you to understand my intentions. However, when I run the edited version of the code you provided, it executes without throwing any errors on my end. The script runs flawlessly in VSCode on Photoshop 2019, and it interacts correctly with the PSD file I shared. It does not encounter any errors during execution but returns an empty array, indicating no frames are found in the document, despite their presence. This leads me to wonder which version of Photoshop you are testing this on, as there might be differences in how frames are handled or identified across versions.

 

2. On the method based on the parent you suggested: I've followed your suggestion and used the method based on identifying the parent to determine if a layer is a frame. However, I've made minimal changes to the logic of the function you provided, focusing mainly on enabling it to check all layers. Despite these slight modifications, the script still does not correctly identify layers as frames, returning an empty array instead. Could there be any adjustments I made that inadvertently affected its ability to identify frames correctly? Your insight into whether there’s a specific change that might have caused this issue would be invaluable.

 

3. Looping over each frame: You inquired why not loop over each frame and perform the necessary actions on a layer-by-layer basis, instead of first collecting a list of frames. I must clarify, whether I process each frame one by one from the start or collect them all first isn't the core issue. The central logic supposed to identify a layer as a frame is not working as expected, which is the main problem we need to address.

 

4. Looking for empty frames: Your observation is correct; the current version of the code does not include a check for empty frames. This is an oversight on my part, and I intend to implement this functionality once I can reliably identify all frames in the document.

 

To sum up, I'm facing a challenge in ensuring the script correctly identifies all frames in the document. The current code, based on your suggestions, does not recognize frames accurately and returns an empty array. I'm curious about the steps you took to achieve the results you described. Could you possibly share more details about your process?

Additionally, would it help if I sent over properties of the layers from my document so we can better understand why the script behaves differently for us?

I’m wondering how the script that works on my end returns incorrect results but seems to fail when you run it. Any further insights or assistance you could provide would be immensely helpful in troubleshooting these issues.

 

Thank you again for your support and guidance.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 29, 2024 Mar 29, 2024

Copy link to clipboard

Copied

@Adi1231234 

 

Scripting is just a hobby for me (I don't have a JS or programming background), there are others here who are much more adept than I...

 

Please try the following based on my previous code, this will loop over all top-level layerSets (not nested) and tests for a frame, it works with your sample file:

 

// Loop over top-level layerSets...

for (var i = 0; i < activeDocument.layerSets.length; i++) {
    try {
        app.activeDocument.activeLayer = app.activeDocument.layerSets[i];
        if (app.activeDocument.activeLayer.parent.name != app.activeDocument.name) {
            app.activeDocument.activeLayer = app.activeDocument.activeLayer.parent;
            if (app.activeDocument.activeLayer.typename === "LayerSet" && isFrame() === true) {
                alert(app.activeDocument.activeLayer.name + "\r" + "The layer is a Frame!");
                // Do stuff
            }
        } else if (app.activeDocument.activeLayer.typename === "LayerSet" && isFrame() === true) {
            alert(app.activeDocument.activeLayer.name + "\r" + "The layer is a Frame!");
            // Do stuff {
        } else {
            alert(app.activeDocument.activeLayer.name + "\r" + "The layer isn't a Frame...");
            // Do other stuff
        }
    } catch (e) {
        alert("Error!" + "\r" + e + ' ' + e.line);
    }

    function isFrame() {
        // modified from a script by greless with hints from jazz-y!
        // returns true or false
        try {
            var d = new ActionDescriptor();
            var r = new ActionReference();
            r.putEnumerated(stringIDToTypeID('layer'), stringIDToTypeID('ordinal'), stringIDToTypeID('targetEnum'));
            var options = executeActionGet(r);
            return options.hasKey(stringIDToTypeID('framedGroup')); // test for the required key
        } catch (e) {
            alert("Error!" + "\r" + e + ' ' + e.line);
        }
    }
}

 

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Mar 30, 2024 Mar 30, 2024

Copy link to clipboard

Copied

Quite peculiarly, after running the code you shared on the PSD I forwarded previously, it resulted in an alert stating all the layers are not frames. Are you certain this worked for you?

 

Adi1231234_0-1711787084606.png

Adi1231234_1-1711787109220.png

If it worked for you, how is it possible that it doesn't work for me? Could there be differences in the Photoshop versions? Or discrepancies in the execution method? @Stephen_A_Marsh 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 30, 2024 Mar 30, 2024

Copy link to clipboard

Copied

@Adi1231234 

 

I’m not sure, here it is in v2021, File > Scripts > Browse

 

2024-03-30_20-16-34.png

2024-03-30_20-16-47.png

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Mar 30, 2024 Mar 30, 2024

Copy link to clipboard

Copied

v2024, File > Scripts > Browse

 

2024-03-30_20-21-16.png

2024-03-30_20-21-26.png

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines