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 caractre : 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[j].copy(dossierSequenceTarget.absoluteURI + "/" + frameSequence[j].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[i] = app.project.item(i); $.writeln(i); } for (var i=0; i<comps.length; i++) { // Reduce project $.writeln(comps.length); mycomp = app.project.items[comps[i]].name; var projectDir = new Folder(fldr); var footageDir = new Folder(projectDir.absoluteURI + "/" + mycomp + "/"); projectDir.create(); footageDir.create(); app.project.reduceProject(app.project.items[comps[i]]); collect(projectDir.absoluteURI+ "/" + mycomp,mycomp); myfile = projectDir.absoluteURI + "/" + mycomp + "/" + mycomp +".aepx"; app.project.save(new File(myfile)); // Reopen project app.open(projFile); } app.endUndoGroup(); } })();