Skip to main content
Participant
August 21, 2023
Answered

How to Return an Array of Selected Frames JSFL

  • August 21, 2023
  • 1 reply
  • 389 views

Hello! I'm new to scripting so bear with me. I've written a script (with help from ChatGPT) that loops through the frames on the selected layer and exports any frame with contents as a png with the name of the frame it's from. All I want to do is modify the script to loop through a user selection of the timeline, but I can't seem to work out how to return or make an array of selected frames. I know this must be possible because many built in commands run based on selected frames...

In case it's helpful here is the existing script and my current best guess at general timeline selection.

var dom = fl.getDocumentDOM();
var timeline = dom.getTimeline();

function exportPng() {
    var curLayer = timeline.currentLayer
    var layerArray = timeline.layers[curLayer].frames
    var folderURL = fl.browseForFolderURL("save", "Select export location", "folder");

    if (folderURL) {
        for (var i = 0; i < layerArray.length; i++) {
			timeline.currentFrame = i;
            var curFrame = timeline.currentFrame;
            if (layerArray[i].isEmpty) {
                continue;
            } else {
                var numName = "0000"
                if (curFrame < 9) {
                    numName = "000" + (curFrame + 1);
                } else if (curFrame < 99 && curFrame >= 9) {
                    numName = "00" + (curFrame + 1);
                } else if (curFrame < 999 && curFrame >= 99) {
                    numName = "0" + (curFrame + 1);
                } else {
                    numName = curFrame + 1;
                }
                dom.exportPNG([folderURL + "/" + numName + ".png"], true, true);
            }
        }
    }
}

exportPng();
var dom = fl.getDocumentDOM();
if (dom) {
  var timeline = dom.getTimeline();
  var selectedFrames = [];
  
  // Iterate through all layers in the timeline
  for (var i = 0; i < timeline.layers.length; i++) {
    var layer = timeline.layers[i];
    
    // Iterate through all frames in the layer
    for (var j = 0; j < layer.frames.length; j++) {
      var frame = layer.frames[j];
      
      // Check if the frame is selected
      if (frame.selected) {
        selectedFrames[j] = frame;
      }
    }
  }

  //  retrieve frame numbers:
  var selectedFrameNumbers = [];
  for (var i = 0; i < selectedFrames.length; i++) {
    selectedFrameNumbers[i] = selectedFrames[i].frameIndex;
  }
  
  // Print the selected frame numbers
  fl.trace("Selected Frame Numbers: " + selectedFrameNumbers.join(", "));
} else {
  fl.trace("No active document.");
}

 

This topic has been closed for replies.
Correct answer Vladin M. Mitov

Hi,
What you need is the function

 

timeline.getSelectedFrames().

 


It returns an array with the selected frames in the format
[ layerNum, startFrame, endFrame, layerNum, startFrame, endFrame... ].


Full documentation: https://github.com/AdobeDocs/developers-animatesdk-docs/blob/master/index.md


1 reply

Vladin M. Mitov
Vladin M. MitovCorrect answer
Inspiring
August 21, 2023

Hi,
What you need is the function

 

timeline.getSelectedFrames().

 


It returns an array with the selected frames in the format
[ layerNum, startFrame, endFrame, layerNum, startFrame, endFrame... ].


Full documentation: https://github.com/AdobeDocs/developers-animatesdk-docs/blob/master/index.md


- Vlad: UX and graphic design, Flash user since 1998Member of Flanimate Power Tools team - extensions for character animation
Participant
August 22, 2023

Thank you! I was able to get it working with this. The 3n format was unexpected.