Skip to main content
Participant
October 26, 2016
Question

Collect function causes script to go into infinity loop

  • October 26, 2016
  • 0 replies
  • 360 views

I'm trying to modify this script and add a collect function I found.
For one selected comp this script works but I would like to make it work with all comps selected.

If you comment out line number 230 (collect(projectDir.absoluteURI+ "/" + mycomp,mycomp);

This script does create a folder and saves a reduce project inside the folder.
I think it has something to do with calling "app.project.numItems" on line 96.

But with line 230 uncommented it will do the first comp and then start "3" comps later and goes in a infinity loop...
For testing purposes you can easily create a new project, create a comp, duplicate it a couple of times, select all comps, save it somewhere and run this script.

Alscollect(projectDir.absoluteURI+ "/" + Alsmycomp,mycomp);collect(projectDir.absoluteURI+ "/" + mycomp,mycomp)

// rd_NewProjectFromComp.jsx

// Copyright (c) 2007-2013 redefinery (Jeffrey R. Almasol). All rights reserved.

// check it: www.redefinery.com

//

// Name: rd_NewProjectFromComp

// Version: 1.2

//

// Description:

// This script saves separate projects for each selected

// composition.

//

// Note: This script requires After Effects 7.0 or later.

//

// Originally requested by David Torno.

//

// Legal stuff:

// This script is provided "as is," without warranty of any kind, expressed

// or implied. In no event shall the author be held liable for any damages

// arising in any way from the use of this script.

//

// In other words, I'm just trying to share knowledge with and help out my

// fellow AE script heads, so don't blame me if my code doesn't rate. 🙂

// rd_NewProjectFromComp()

//

// Description:

// This function contains the main logic for this script.

//

// Parameters:

// None.

//

// Returns:

// Nothing.

//

(function rd_NewProjectFromComp()

{

  // Globals

  var rd_NewProjectFromCompData = new Object(); // Store globals in an object

  rd_NewProjectFromCompData.scriptName = "rd: New Project From Comp";

  rd_NewProjectFromCompData.scriptTitle = rd_NewProjectFromCompData.scriptName + " v1.2";

  rd_NewProjectFromCompData.strHelp = {en: "?"};

  rd_NewProjectFromCompData.strSaveProjFirst = {en: "Click OK to save the current project."};

  rd_NewProjectFromCompData.strSaveInstructions = {en: "The current project will be reduced to each selected composition (and its assets). Please specify a project file name for each one. Click OK to begin."};

  rd_NewProjectFromCompData.strErrNoCompsSel = {en: "Cannot perform operation. Please select at least one composition in the Project window, and try again."};

  rd_NewProjectFromCompData.strMinAE70 = {en: "This script requires Adobe After Effects 7.0 or later."};

  rd_NewProjectFromCompData.strHelpText =

  {

  en: "Copyright (c) 2007-2013 redefinery (Jeffrey R. Almasol). \n" +

  "All rights reserved.\n" +

  "\n" +

  "This script saves separate projects for each selected \n" +

  "composition.\n" +

  "\n" +

  "Note: This script requires After Effects 7.0 or later.\n" +

  "\n" +

  "Originally requested by David Torno.\n"

  };

  // rd_NewProjectFromComp_localize()

  //

  // Description:

  // This function localizes the given string variable based on the current locale.

  //

  // Parameters:

  //   strVar - The string variable's name.

  //

  // Returns:

  // String.

  //

  function rd_NewProjectFromComp_localize(strVar)

  {

  return strVar["en"];

  }

  function collect(dir,prname) { //dossierRassembler, c'est le dossier de destination, plan, c'est une chaine de caractre : le nom du projet/numŽro du plan, ou n'importe quoi d'autre dŽfini par l'utilisateur

  

    //crŽer le dossier du plan

    var projectDir = new Folder(dir);

    var footageDir = new Folder(projectDir.absoluteURI + "/(Footage)/");

    projectDir.create();

    footageDir.create();

  

    //pour chaque item, si c'est un footage Item, le copier au nouvel emplacement dans le bon sous dossier puis le relinker

    var item;

    var targetFile;

  

    for (i = 1; i <= app.project.numItems; i++)

    {

        var item = app.project.item(i);

        if (item instanceof FootageItem)

        {

            //crŽer le dossier

            var targetDir = new Folder(footageDir.absoluteURI + "/" + item.parentFolder.name + "/");

            if (!targetDir.exists)

                targetDir.create();

            if (item.file != null && !item.footageMissing)

            {

                var extension = item.file.name.substring(item.file.name.lastIndexOf(".")+1).toLowerCase();

                if (item.mainSource.isStill) // si c'est fixe

                {

                    targetFile = new File(targetDir.absoluteURI + "/" + item.file.name);

                    if (!targetFile.exists)

                    {

                        //dŽplacer

                        item.file.copy(targetDir.absoluteURI + "/" + item.file.name);

                  

                        //relink

                        item.replace(targetFile);

                        }

                    }

                  else if (extension != "jpg" && extension != "jpeg" && extension != "png" && extension != "tga" && extension != "tif" && extension != "tiff" && extension != "exr" && extension != "bmp" && extension != "pxr"  && extension != "pct"  && extension != "hdr" && extension != "rla"  && extension != "ai" && extension != "cin" && extension != "dpx") {// si c'est pas un format d'image fixe

                    

                    targetFile = new File(targetDir.absoluteURI + "/" + item.file.name);

                    if (!targetFile.exists)

                    {

                        //dŽplacer

                        item.file.copy(targetDir.absoluteURI + "/" + item.file.name);

                        //relink

                        item.replace(targetFile);

                        }

                      }

                else

                { // reste les sŽquences d'images

                    //copie et remplacement en cas de sŽquence de fichier

                      //rŽcupŽrer la liste des images et crŽer le nouveau dossier de destination

                      var dossierSequence = item.file.parent;

                      var frameSequence = dossierSequence.getFiles();

                      var dossierSequenceTarget = new Folder(targetDir.absoluteURI + "/" + dossierSequence.name + "/");

                      dossierSequenceTarget.create();

                      targetFile = new File(dossierSequenceTarget.absoluteURI + "/" + item.file.name);

                      if (!targetFile.exists)

                      {

                        //copier les frames

                        for (j=0;j<frameSequence.length;j++)

                        {

                        

                            frameSequence.copy(dossierSequenceTarget.absoluteURI + "/" + frameSequence.name);

                            }

                        //relink

                        item.replaceWithSequence(targetFile, true);

                        }

                      delete dossierSequence;

                      delete frameSequence;

                      delete dossierSequenceTarget;

                    }

                  delete extension;

                }

              delete targetDir;

            }

        }

    //sauvegarder le projet

    //virer les variables

    delete projectDir;

    delete footageDir;

    }

  // main code:

  //

  var projFile = app.project.file;

  var fldr = Folder.selectDialog("Choose folder");

  //var projectDir = new Folder(fldr);

  // Prerequisites check

  if (parseFloat(app.version) < 7.0)

  alert(rd_NewProjectFromComp_localize(rd_NewProjectFromCompData.strMinAE70), rd_NewProjectFromCompData.scriptName);

  else

  {

  // Make sure only a single comp is selected

  if (app.project === null)

  return;

  // Keep track of item numbers (not actual items, as we need to reload the project after each time)

  var comps = new Array();

  var compsname = new Array();

  for (var i=1; i<=app.project.numItems; i++)

  {

  if (app.project.item(i).selected && (app.project.item(i) instanceof CompItem))

  comps[comps.length] = i;

  compsname = app.project.item(i);

  $.writeln(i);

  }

  for (var i=0; i<comps.length; i++)

  {

  // Reduce project

  $.writeln(comps.length);

  mycomp = app.project.items[comps].name;

     var projectDir = new Folder(fldr);

     var footageDir = new Folder(projectDir.absoluteURI + "/" + mycomp + "/");

     projectDir.create();

    footageDir.create();

  app.project.reduceProject(app.project.items[comps]);

                collect(projectDir.absoluteURI+ "/" + mycomp,mycomp);

                myfile = projectDir.absoluteURI + "/" + mycomp + "/" + mycomp  +".aepx";

               

               

                app.project.save(new File(myfile));

  // Reopen project

  app.open(projFile);

  }

  app.endUndoGroup();

  }

})();

This topic has been closed for replies.