├── .github └── FUNDING.yml ├── EF_CleanRenderQueue.jsx ├── EF_BatchChangeFrameRate.jsx ├── EF_AddSelectedPreCompsToRenderQueue.jsx ├── EF_CountSelectedItems.jsx ├── EF_RemoveEmptyFolders.jsx ├── EF_SelectEveryOtherLayer.jsx ├── EF_RemoveUselessMasks.jsx ├── EF_DeleteAllEffects.jsx ├── EF_RemoveExpressionsFromProperty.jsx ├── EF_ReplaceSelectedItemsWithSolids.jsx ├── EF_ReplaceMissingFootageWithSolid.jsx ├── EF_CleanPropertyKeyframes.jsx ├── EF_RemoveExpressionsFromLayers.jsx ├── EF_FadeAudioInOut.jsx ├── EF_LockAndHide.jsx ├── EF_SequentialMaskToggle.jsx ├── EF_SaveFrameToPNG.jsx ├── EF_AddPosterizeTimeZero.jsx ├── EF_ExportMissingFootagesPathsToFile.jsx ├── EF_DeactivateEffectsOnComps.jsx ├── EF_CreateMasksFromText.jsx ├── EF_CreateShapesFromText.jsx ├── EF_SaveProjectVersionUp.jsx ├── EF_FindAndReplaceLayer.jsx ├── EF_RandomizePosition.jsx ├── EF_ChangeFontsInProject.jsx ├── EF_SaveSelectedCompsToPNG.jsx ├── EF_CreateFolderStructure.jsx ├── EF_SaveGivenFrameToPNG.jsx ├── EF_BatchEditEffectProp.jsx ├── EF_ShowMaskedLayerBoxSize.jsx ├── EF_MakePropertiesValidAgain.jsx ├── EF_SaveGivenFrameToPSD.jsx ├── EF_CountSelectedItemsUI.jsx ├── EF_SaveSelectedCompsAsProjects.jsx ├── EF_SaveToPNGAndPSD.jsx ├── EF_ExportActiveCompExpressionsToFile.jsx ├── EF_AddItemsToVariousCompsSizes.jsx ├── EF_ShowLayerSizeAndPosition.jsx ├── EF_ExportAllExpressionsToFile.jsx ├── EF_ExportSelectedCompsExpressions.jsx ├── EF_ResetTransform.jsx ├── EF_OrganizeProject.jsx └── README.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: evefalcao 4 | ko_fi: evefalcao 5 | -------------------------------------------------------------------------------- /EF_CleanRenderQueue.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_CleanRenderQueue.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Deletes all items in the Render Queue. 8 | *========================================================================**/ 9 | 10 | (function cleanRenderQueue(){ 11 | var rq = app.project.renderQueue; 12 | 13 | for(var item = rq.numItems; item != 0; item--){ 14 | rq.item(item).remove(); 15 | } 16 | 17 | })(); -------------------------------------------------------------------------------- /EF_BatchChangeFrameRate.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_BatchChangeFrameRate.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Batch changes the frame rate of all compositions in the project. 8 | *========================================================================**/ 9 | 10 | var newFrameRate = 30; 11 | 12 | function setCompFrameRate(comp, frameRate) { 13 | comp.frameRate = frameRate; 14 | } 15 | 16 | app.beginUndoGroup("Batch Change Frame Rate"); 17 | 18 | for (var i = 1; i <= app.project.numItems; i++) { 19 | var item = app.project.item(i); 20 | if (item instanceof CompItem) { 21 | setCompFrameRate(item, newFrameRate); 22 | } 23 | } 24 | 25 | app.endUndoGroup(); -------------------------------------------------------------------------------- /EF_AddSelectedPreCompsToRenderQueue.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_AddSelectedPreCompsToRenderQueue.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Add selected precomp (selected compositions layers inside an active composition) to the render queue. Skip any other layer that is not a composition. 8 | *========================================================================**/ 9 | 10 | (function addSelectedLayerToRQ(){ 11 | var comp = app.project.activeItem; 12 | var layers = comp.selectedLayers; 13 | 14 | for(var layer = 0; layer < layers.length; layer++){ 15 | if(layers[layer].source instanceof CompItem){ 16 | var layerSource = layers[layer].source; 17 | app.project.renderQueue.items.add(layerSource); 18 | } 19 | } 20 | })(); -------------------------------------------------------------------------------- /EF_CountSelectedItems.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_CountSelectedItems.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Counts the selected items in the Project Panel and outputs the result to the Info Panel. 8 | *========================================================================**/ 9 | 10 | (function countSelectedProjectItems(){ 11 | 12 | var selectedItems = app.project.selection; 13 | 14 | // Open Info panel 15 | var infoPanelId = 2028; // app.findMenuCommandId("Info"); 16 | app.executeCommand(infoPanelId); 17 | 18 | // Clean previous outputs 19 | clearOutput(); 20 | 21 | if(selectedItems.length != 0){ 22 | writeLn("Selected items: " + selectedItems.length); 23 | } else { 24 | alert("Select some project items to count.") 25 | } 26 | })(); -------------------------------------------------------------------------------- /EF_RemoveEmptyFolders.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_RemoveEmptyFolders.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Removes empty folders. 8 | *========================================================================**/ 9 | 10 | 11 | (function removeEmptyFolders() { 12 | function removeEmptyFolder(folderItem) { 13 | if (folderItem.numItems == 0) { 14 | folderItem.remove(); 15 | } 16 | } 17 | 18 | var projectItems = app.project.items; 19 | 20 | app.beginUndoGroup("'Remove empty folders'"); 21 | for (var item = projectItems.length; item > 0; item--) { 22 | var folderItem = projectItems[item]; 23 | if (folderItem instanceof FolderItem) { 24 | removeEmptyFolder(folderItem); 25 | } 26 | } 27 | app.endUndoGroup(); 28 | })(); -------------------------------------------------------------------------------- /EF_SelectEveryOtherLayer.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_SelectEveryOtherLayer.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Selects every other layer. Starts from the first selected layer. Ignores locked layers. 8 | *========================================================================**/ 9 | 10 | (function selectEveryOtherLayer() { 11 | 12 | var comp = app.project.activeItem; 13 | var compLayers = comp.layers; 14 | var selectedLayer = comp.selectedLayers[0]; 15 | 16 | app.beginUndoGroup("'Select every other layer'"); 17 | 18 | for (var layer = selectedLayer.index; layer <= compLayers.length; layer = layer + 2) { 19 | var curlayer = compLayers[layer]; 20 | 21 | if (!curlayer.locked) { 22 | curlayer.selected = true; 23 | } 24 | } 25 | 26 | app.endUndoGroup(); 27 | 28 | })() 29 | 30 | // Start from the selected layer -------------------------------------------------------------------------------- /EF_RemoveUselessMasks.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_RemoveUselessMasks.jsx 3 | * @author : Eveline Falcão 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Remove all masks set in "NONE" mode from the selected layers. Requested by Tim Weiser. Thanks Nic Dean for the referral. 8 | *========================================================================**/ 9 | 10 | (function removeUselessMasks(){ 11 | 12 | var comp = app.project.activeItem; 13 | var layers = comp.selectedLayers; 14 | 15 | app.beginUndoGroup("'Remove Useless Masks'"); 16 | 17 | for (var layer = 0; layer < layers.length; layer++) { 18 | var curLayer = layers[layer]; 19 | 20 | for (var maskTotal = curLayer.mask.numProperties; maskTotal >= 1; maskTotal--) { 21 | var curMask = curLayer.mask(maskTotal); 22 | if (curMask.maskMode === MaskMode.NONE) { 23 | curMask.remove(); 24 | } 25 | } 26 | } 27 | 28 | app.endUndoGroup(); 29 | 30 | })(); -------------------------------------------------------------------------------- /EF_DeleteAllEffects.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_DeleteAllEffects.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Deletes all effects from selected layers. 8 | *========================================================================**/ 9 | 10 | (function deleteAllEffects(){ 11 | 12 | app.beginUndoGroup("'Delete All Effects'"); 13 | 14 | var comp = app.project.activeItem; 15 | var layers = comp.selectedLayers; 16 | 17 | if(layers.length != 0){ 18 | for(var layer = 0; layer < layers.length; layer++){ 19 | var currentLayer = layers[layer]; 20 | var effectsProp = currentLayer.property("ADBE Effect Parade"); 21 | 22 | for(var effect = effectsProp.numProperties; effect != 0; effect--){ 23 | effectsProp.property(effect).remove(); 24 | } 25 | } 26 | 27 | } else { 28 | alert("Select some layers to continue.") 29 | } 30 | 31 | app.endUndoGroup(); 32 | })() -------------------------------------------------------------------------------- /EF_RemoveExpressionsFromProperty.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_RemoveExpressionsFromProperty.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Removes all expressions from the selected properties. 8 | *========================================================================**/ 9 | 10 | (function removePropertiesExpressions(){ 11 | app.beginUndoGroup("'Remove properties expressions'") 12 | 13 | var comp = app.project.activeItem; 14 | if(comp instanceof CompItem && comp != null) { 15 | var allProperties = comp.selectedProperties; 16 | 17 | if(allProperties.length > 0){ 18 | for(var property = 0; property < allProperties.length; property++){ 19 | var selectedProperty = allProperties[property]; 20 | selectedProperty.expression = ""; 21 | } 22 | } else { 23 | alert("Select a property within a layer."); 24 | } 25 | 26 | } else { 27 | alert("Select your active Comp in the project panel or timeline."); 28 | } 29 | 30 | app.endUndoGroup(); 31 | })(); -------------------------------------------------------------------------------- /EF_ReplaceSelectedItemsWithSolids.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ReplaceSelectedItemsWithSolids.jsx 3 | * @author : Eveline Falcão 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Replace all selected footages in the Project Panel with a white solid with the same size as the layers. 8 | *========================================================================**/ 9 | 10 | (function replaceSelectedFootageWithSolids(){ 11 | app.beginUndoGroup("'Replace Selected Footage with Solids'"); 12 | 13 | var selectedItems = app.project.selection; 14 | 15 | function replaceWithSolid(layer, index){ 16 | var color = [1.0, 1.0, 1.0] 17 | var name = 'Solid - ' + index; 18 | var width = layer.width; 19 | var height = layer.height; 20 | var pixelAspect = [1.0]; 21 | 22 | layer.replaceWithSolid(color, name, width, height, pixelAspect); 23 | } 24 | 25 | for(var item = 0; item < selectedItems.length; item++){ 26 | currentItem = selectedItems[item]; 27 | 28 | if(currentItem instanceof FootageItem){ 29 | replaceWithSolid(currentItem, item); 30 | } 31 | } 32 | 33 | app.endUndoGroup(); 34 | })() -------------------------------------------------------------------------------- /EF_ReplaceMissingFootageWithSolid.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ReplaceMissingFootageWithSolid.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Replace all Missing Footage with a white solid with the same size as the layers. 8 | *========================================================================**/ 9 | 10 | (function replaceMissingFootageWithSolid(){ 11 | app.beginUndoGroup("'Replace Missing Footage with Solids'"); 12 | 13 | var projectItems = app.project.items; 14 | 15 | function replaceWithSolid(layer, index){ 16 | var color = [1.0, 1.0, 1.0] 17 | var name = 'Solid - ' + index; 18 | var width = layer.width; 19 | var height = layer.height; 20 | var pixelAspect = [1.0]; 21 | 22 | layer.replaceWithSolid(color, name, width, height, pixelAspect); 23 | } 24 | 25 | for(var numItem = projectItems.length; numItem != 0; numItem--){ 26 | currentItem = projectItems[numItem]; 27 | 28 | if(currentItem.footageMissing){ 29 | alert(numItem) 30 | replaceWithSolid(currentItem, numItem) 31 | } 32 | } 33 | 34 | app.endUndoGroup(); 35 | })() -------------------------------------------------------------------------------- /EF_CleanPropertyKeyframes.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_CleanPropertyKeyframes.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Removes all keyframes from selected properties. Supports multiple layer and property selections. 8 | *========================================================================**/ 9 | 10 | (function cleanPropertyKeyframes(){ 11 | app.beginUndoGroup("Clean property keyframes.") 12 | 13 | var comp = app.project.activeItem; 14 | if (comp instanceof CompItem && comp != null) { 15 | var allProperties = comp.selectedProperties; 16 | if (allProperties.length > 0){ 17 | for (var property = 0; property < allProperties.length; property++) { 18 | var selectedProperty = allProperties[property]; 19 | while(selectedProperty.numKeys > 0) { 20 | selectedProperty.removeKey(1); 21 | } 22 | } 23 | } else { 24 | alert("Select a property within a layer.") 25 | } 26 | } else { 27 | alert("Select your active Comp in the project panel or timeline.") 28 | } 29 | 30 | app.endUndoGroup(); 31 | 32 | })(); -------------------------------------------------------------------------------- /EF_RemoveExpressionsFromLayers.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_RemoveExpressionsFromLayers.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Removes all expressions from selected layers. 8 | *========================================================================**/ 9 | 10 | (function removeLayersExpressions() { 11 | 12 | app.beginUndoGroup("Remove selected layers expressions."); 13 | 14 | var comp = app.project.activeItem; 15 | var layers = comp.selectedLayers; 16 | 17 | function processProperty(property) { 18 | // Pass a layer or a prop 19 | if (property.propertyType == PropertyType.PROPERTY) { // Check if value is a single property and do something 20 | if (property.expressionEnabled) { 21 | property.expression = ""; 22 | } 23 | } else { 24 | for (var i = 1; i <= property.numProperties; i++) { 25 | processProperty(property.property(i)); 26 | } 27 | } 28 | } 29 | 30 | for (var layer = 0; layer < layers.length; layer++) { 31 | var currentLayer = layers[layer]; 32 | processProperty(currentLayer); 33 | } 34 | 35 | app.endUndoGroup(); 36 | 37 | })(); -------------------------------------------------------------------------------- /EF_FadeAudioInOut.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_FadeAudioInOut.jsx 3 | * @author : Eveline Falcão 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Fades audio in and out in the selected layers. 8 | *========================================================================**/ 9 | 10 | (function FadeAudioInOut() { 11 | 12 | var myComp = app.project.activeItem; 13 | var layers = myComp.selectedLayers; 14 | var fadeDuration = 0.5; 15 | 16 | function fadeAudioInOut(layer, duration) { 17 | var audioLevels = layer.property("Audio").property("Audio Levels"); 18 | var inPoint = layer.inPoint; 19 | var outPoint = layer.outPoint; 20 | 21 | // Fade In 22 | audioLevels.setValueAtTime(inPoint, [-48, -48]); 23 | audioLevels.setValueAtTime(inPoint + duration, [0, 0]); 24 | 25 | // Fade Out 26 | audioLevels.setValueAtTime(outPoint - duration, [0, 0]); 27 | audioLevels.setValueAtTime(outPoint, [-48, -48]); 28 | } 29 | 30 | app.beginUndoGroup("Fade Audio In and Out"); 31 | 32 | for (var i = 0; i < layers.length; i++) { 33 | var layer = layers[i]; 34 | if (layer.hasAudio) { 35 | fadeAudioInOut(layer, fadeDuration); 36 | } 37 | } 38 | 39 | app.endUndoGroup(); 40 | 41 | })(); -------------------------------------------------------------------------------- /EF_LockAndHide.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_LockAndHide.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Locks, activates the shy guy and hides all the layers within the selected compositions in the project panel. Is recursive. 8 | *========================================================================**/ 9 | 10 | 11 | (function lockAndHideLayers(){ 12 | var selectedComps = app.project.selection; 13 | 14 | function lockAndShy(layer){ 15 | layer.shy = true; 16 | layer.locked = true; 17 | } 18 | 19 | function recursivelyLockAndShy(selectedComps){ 20 | for(var comp = 0; comp < selectedComps.length; comp++){ 21 | var currentComp = selectedComps[comp]; 22 | 23 | for(var layer = 1; layer <= currentComp.numLayers; layer++){ 24 | var currentLayer = currentComp.layer(layer); 25 | 26 | if(currentLayer.source instanceof CompItem){ 27 | recursivelyLockAndShy([currentLayer.source]); 28 | } 29 | lockAndShy(currentLayer); 30 | } 31 | 32 | currentComp.hideShyLayers = true; 33 | } 34 | } 35 | 36 | app.beginUndoGroup("'Lock and Hide Layers'"); 37 | recursivelyLockAndShy(selectedComps); 38 | app.endUndoGroup(); 39 | 40 | })(); -------------------------------------------------------------------------------- /EF_SequentialMaskToggle.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_SequentialMaskToggle.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Sets the Mask Mode to "Add" on the mask corresponding to the layer index. Requested by Tim Weiser. 8 | *========================================================================**/ 9 | 10 | 11 | (function sequentialMaskToggle(){ 12 | 13 | var comp = app.project.activeItem; 14 | var layers = comp.selectedLayers; 15 | 16 | function findIndexInArray(item) { 17 | for (var i = 0; i < layers.length; i++) { 18 | if (layers[i] === item) { 19 | return i; 20 | } 21 | } 22 | return -1; 23 | } 24 | 25 | app.beginUndoGroup("'Sequential Mask Toggle'"); 26 | 27 | for (var layer = 0; layer < layers.length; layer++) { 28 | 29 | var curLayer = layers[layer]; 30 | var curLayerIndexInSelection = findIndexInArray(layers[layer]); 31 | var maskTotal = curLayer.mask.numProperties; 32 | 33 | for (var maskIndex = 1; maskIndex <= maskTotal; maskIndex++) { 34 | var curMask = curLayer.mask(maskIndex); 35 | 36 | if (curMask.propertyIndex === curLayerIndexInSelection + 1) { 37 | curMask.maskMode = MaskMode.ADD; 38 | } else { 39 | curMask.maskMode = MaskMode.NONE; 40 | } 41 | } 42 | } 43 | 44 | app.endUndoGroup(); 45 | 46 | })(); -------------------------------------------------------------------------------- /EF_SaveFrameToPNG.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_SaveFrameToPNG.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Quickly saves the current frame to PNG next to the project file. 8 | *========================================================================**/ 9 | 10 | (function saveFrameToPNG(){ 11 | 12 | function currentTimeToFrames(currentTime, frameRate){ 13 | return Math.round(currentTime * frameRate); 14 | } 15 | 16 | function padWithZeros(number, digits) { 17 | var str = number.toString() 18 | while (str.length < digits) { 19 | str = '0' + str; 20 | } 21 | return str; 22 | } 23 | 24 | var comp = app.project.activeItem; 25 | 26 | if(comp instanceof CompItem && comp != null) { 27 | var currentTime = comp.time; 28 | var frameRate = comp.frameRate; 29 | var currentFrame = currentTimeToFrames(currentTime, frameRate); 30 | var projectPath = app.project.file; 31 | 32 | if(projectPath != null){ 33 | var stringProjPath = projectPath.toString().replace(".aep", ""); 34 | comp.saveFrameToPng(currentTime, File(stringProjPath + "_" + padWithZeros(currentFrame, 6) + ".png")); 35 | } else { 36 | alert("Save your project to continue.") 37 | } 38 | 39 | } else { 40 | alert("Select your active Comp in the project panel or timeline."); 41 | } 42 | })(); -------------------------------------------------------------------------------- /EF_AddPosterizeTimeZero.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_AddPosterizeTimeZero.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Add "PosterizeTime(0);" to the beginning of all the selected properties expressions. 8 | *========================================================================**/ 9 | 10 | (function addPosterizeTimeZero(){ 11 | 12 | function addPosterizeExpression(property){ 13 | var propertyExpression = property.expression; 14 | // if the property has no keyframes or animation driven by expression, apply posterizeTime(0), else leave as is 15 | if(!property.numKeys){ 16 | property.expression = "posterizeTime(0);" + "\n\n" + propertyExpression; 17 | } 18 | } 19 | 20 | app.beginUndoGroup("'Add Posterize Time Zero'"); 21 | 22 | var comp = app.project.activeItem; 23 | if(comp instanceof CompItem && comp != null) { 24 | var allProperties = comp.selectedProperties; 25 | if(allProperties.length > 0){ 26 | for(var property = 0; property < allProperties.length; property++){ 27 | var selectedProperty = allProperties[property]; 28 | addPosterizeExpression(selectedProperty); 29 | } 30 | } else { 31 | alert("Select a property within a layer."); 32 | } 33 | } else { 34 | alert("Select your active Comp in the project panel or timeline."); 35 | } 36 | 37 | app.endUndoGroup(); 38 | })(); -------------------------------------------------------------------------------- /EF_ExportMissingFootagesPathsToFile.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ExportMissingFootagesPathsToFile.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Saves a list of all the missing footages in a project to a text file. 8 | *========================================================================**/ 9 | 10 | (function exportMissingFootagesPathsToFile(){ 11 | var projectItems = app.project.items; 12 | var missingItems = []; 13 | var projectPath = app.project.file; 14 | 15 | // Pushes every missing footage to the missingItems Array 16 | for(var item = 1; item <= projectItems.length; item++){ 17 | if(projectItems[item].footageMissing){ 18 | var footagePath = projectItems[item].mainSource.missingFootagePath; 19 | missingItems.push(footagePath); 20 | } 21 | } 22 | 23 | // If project is saved 24 | if(projectPath != null){ 25 | var filePath = projectPath.toString().replace(".aep", ""); 26 | } else { 27 | alert("Save your project to continue.") 28 | } 29 | 30 | // Separates each item with a line break 31 | var missingItemsString = missingItems.join("\n"); 32 | 33 | // Prompt to save the file 34 | var file = new File(filePath + "_MissingFiles.txt").saveDlg("Select the file destination.", "*.txt"); 35 | 36 | // Write the file 37 | if (file != null) { 38 | file.open("w"); 39 | file.write(missingItemsString); 40 | file.close(); 41 | } 42 | 43 | // alert(typeof missingItemsString === "string") 44 | })() -------------------------------------------------------------------------------- /EF_DeactivateEffectsOnComps.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_DeactivateEffectsOnComps.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Deactivate a given effect from the selected comps. Is case insensitive. 8 | *========================================================================**/ 9 | 10 | (function deactivateEffectsOnComps(){ 11 | 12 | var comps = app.project.selection; 13 | var userInput = prompt("Type the Effect Name you wish to disable:", "Effect Name"); 14 | if (userInput) { 15 | var targetEffectName = userInput.toString().toLowerCase(); 16 | } 17 | 18 | app.beginUndoGroup("'Deactivate Effects'"); 19 | for (var item = 0; item < comps.length; item++) { 20 | var curItem = comps[item]; 21 | if (curItem instanceof CompItem) { 22 | var layers = curItem.layers; 23 | 24 | for (var layer = 1; layer <= layers.length; layer++) { 25 | var currentLayer = layers[layer]; 26 | var effectsProp = currentLayer.property("ADBE Effect Parade"); 27 | 28 | if (effectsProp) { 29 | for(var effect = 1; effect <= effectsProp.numProperties; effect++){ 30 | var effectName = effectsProp.property(effect).name.toLowerCase(); 31 | 32 | if (effectName == targetEffectName) { 33 | effectsProp.property(effect).enabled = false; 34 | } 35 | } 36 | } 37 | } 38 | } 39 | } 40 | app.endUndoGroup(); 41 | 42 | })(); -------------------------------------------------------------------------------- /EF_CreateMasksFromText.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_CreateMasksFromText.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Creates masks from selected text layers by executing the "Create Masks from Text" menu command. 8 | *========================================================================**/ 9 | 10 | (function createMasksFromText() { 11 | 12 | function processLayers(layer) { 13 | var comp = layer.containingComp; 14 | var initialSelection = comp.selectedLayers; 15 | 16 | if (layer instanceof TextLayer) { 17 | // Deselect all layers 18 | for (var k = 0; k < layers.length; k++) { 19 | layers[k].selected = false; 20 | } 21 | 22 | // Select only the current layer 23 | layer.selected = true; 24 | 25 | // 2933: CreateOutlineMasks ("Create Masks from Text") 26 | app.executeCommand(2933); 27 | 28 | // Deselect the created solid layer 29 | var newLayer = comp.selectedLayers[0]; 30 | newLayer.selected = false; 31 | } 32 | } 33 | 34 | var comp = app.project.activeItem; 35 | var layers = comp.selectedLayers; 36 | 37 | app.beginUndoGroup("'Create Masks from Text Layer'"); 38 | 39 | for (var layer = 0; layer < layers.length; layer++) { 40 | var curLayer = layers[layer]; 41 | processLayers(curLayer); 42 | 43 | // Reselect the original layers 44 | for (var j = 0; j < layers.length; j++) { 45 | layers[j].selected = true; 46 | } 47 | } 48 | 49 | app.endUndoGroup(); 50 | 51 | })() -------------------------------------------------------------------------------- /EF_CreateShapesFromText.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_CreateShapesFromText.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Creates shapes from selected text layers by executing the "Create Shapes from Text" menu command. 8 | *========================================================================**/ 9 | 10 | (function createShapesFromText() { 11 | 12 | function processLayers(layer) { 13 | var comp = layer.containingComp; 14 | var initialSelection = comp.selectedLayers; 15 | 16 | if (layer instanceof TextLayer) { 17 | // Deselect all layers 18 | for (var k = 0; k < layers.length; k++) { 19 | layers[k].selected = false; 20 | } 21 | 22 | // Select only the current layer 23 | layer.selected = true; 24 | 25 | // 3781: CreateOutlineShape ("Create Shapes from Text") 26 | app.executeCommand(3781); 27 | 28 | // Deselect the created shape layer 29 | var newLayer = comp.selectedLayers[0]; 30 | newLayer.selected = false; 31 | } 32 | } 33 | 34 | var comp = app.project.activeItem; 35 | var layers = comp.selectedLayers; 36 | 37 | app.beginUndoGroup("'Create Shapes from Text Layer'"); 38 | 39 | for (var layer = 0; layer < layers.length; layer++) { 40 | var curLayer = layers[layer]; 41 | processLayers(curLayer); 42 | 43 | // Reselect the original layers 44 | for (var j = 0; j < layers.length; j++) { 45 | layers[j].selected = true; 46 | } 47 | } 48 | 49 | app.endUndoGroup(); 50 | 51 | })() -------------------------------------------------------------------------------- /EF_SaveProjectVersionUp.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_SaveProjectVersionUp.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Quickly saves a new version of the current project file versioning up the suffix, ex.: from "_v001" to "_v002". 8 | *========================================================================**/ 9 | 10 | 11 | (function saveProjectVersionUp(){ 12 | 13 | function padWithZeros(number, digits) { 14 | var str = number.toString() 15 | while (str.length < digits) { 16 | str = '0' + str; 17 | } 18 | return str; 19 | } 20 | 21 | function findCurrentVersionNumber(pattern, projectString){ 22 | var matchVersion = projectString.match(pattern); 23 | var currentVersion; 24 | 25 | if(!matchVersion){ 26 | currentVersion = 1; 27 | } else { 28 | currentVersion = parseInt(matchVersion[1], 10); 29 | } 30 | 31 | return currentVersion; 32 | } 33 | 34 | var project = app.project; 35 | var projectPath = project.file; 36 | 37 | if(!projectPath){ 38 | project.saveWithDialog(); 39 | } 40 | var pattern = /_v(\d+)/; 41 | var projectString = projectPath.toString().replace(".aep", ""); 42 | var currentVersionInt = findCurrentVersionNumber(pattern, projectString); // identifies current version 43 | var newProjString = projectString.replace(pattern, ""); 44 | var newVersionNumber = currentVersionInt + 1; 45 | 46 | var fileObject = new File(newProjString + "_v" + padWithZeros(newVersionNumber, 3) + ".aep"); 47 | project.save(fileObject); 48 | 49 | })(); -------------------------------------------------------------------------------- /EF_FindAndReplaceLayer.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_FindAndReplaceLayer.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Find a layer by name and replace it with another item. Is case sensitive. 8 | *========================================================================**/ 9 | 10 | (function findAndReplaceLayer(){ 11 | 12 | var comps = app.project.selection; 13 | var layerInput = prompt("Type the Layer Name you wish to replace:", "Layer Name"); 14 | if (layerInput) { 15 | var targetLayerName = layerInput.toString(); 16 | } 17 | var sourceInput = prompt("Type the Item Name you wish to replace the layer with:", "Source Name"); 18 | if (sourceInput) { 19 | var targetSourceName = sourceInput.toString(); 20 | } 21 | 22 | var projectItems = app.project.items; 23 | 24 | for (var item = 1; item <= projectItems.length; item++) { 25 | if (projectItems[item].name == targetSourceName) { 26 | var targetSource = projectItems[item]; 27 | } 28 | } 29 | 30 | app.beginUndoGroup("'Replace Layers'"); 31 | for (var item = 0; item < comps.length; item++) { 32 | var curItem = comps[item]; 33 | if (curItem instanceof CompItem) { 34 | var layers = curItem.layers; 35 | 36 | for (var layer = 1; layer <= layers.length; layer++) { 37 | var currentLayer = layers[layer]; 38 | var curLayerName = currentLayer.name; 39 | 40 | if (curLayerName == targetLayerName) { 41 | currentLayer.replaceSource(targetSource, true); 42 | } 43 | } 44 | } 45 | } 46 | app.endUndoGroup(); 47 | 48 | })(); -------------------------------------------------------------------------------- /EF_RandomizePosition.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_RandomizePosition.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Randomizes the selected layers' position by a given number. 8 | *========================================================================**/ 9 | 10 | (function randomizePosition(){ 11 | 12 | var myComp = app.project.activeItem; 13 | var layers = myComp.selectedLayers; 14 | 15 | var xPosInput = prompt("Randomize X Position up to:", "10"); 16 | if (xPosInput) { 17 | var xPosIncrement = xPosInput; 18 | } 19 | var yPosInput = prompt("Randomize Y Position up to:", "10"); 20 | if (yPosInput) { 21 | var yPosIncrement = yPosInput; 22 | } 23 | 24 | if (myComp) { 25 | if (layers.length != 0) { 26 | app.beginUndoGroup("'Randomize Position'"); 27 | for (var i = 0; i < layers.length; i++) { 28 | var currentLayer = layers[i]; 29 | var positionProp = currentLayer.property("Position"); 30 | 31 | if (positionProp && positionProp.canSetExpression) { 32 | var currentPosition = positionProp.value; 33 | 34 | var randomX = (Math.random() - 0.5) * 2 * xPosIncrement; 35 | var randomY = (Math.random() - 0.5) * 2 * yPosIncrement; 36 | 37 | var newPosition = [ 38 | currentPosition[0] + randomX, 39 | currentPosition[1] + randomY 40 | ]; 41 | positionProp.setValue(newPosition); 42 | } 43 | } 44 | app.endUndoGroup(); 45 | } 46 | } 47 | })(); 48 | -------------------------------------------------------------------------------- /EF_ChangeFontsInProject.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ChangeFontsInProject.jsx 3 | * @author : Eveline Falcão 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Changes the font and style of text layers of the entire project. 8 | *========================================================================**/ 9 | 10 | (function ChangeFontsInProject() { 11 | var newFont = "CSAriston-Regular"; // Use the postscript name as the font name 12 | var newStyle = "Regular"; 13 | 14 | // Check the actual font name 15 | // var textProp = app.project.activeItem.selectedLayers[0].property("Source Text"); 16 | // var textDocument = textProp.value; 17 | // alert(textDocument.font); 18 | 19 | function changeFontsInTextLayer(textLayer, fontName) { 20 | var textProp = textLayer.property("Source Text"); 21 | var textDocument = textProp.value; 22 | textDocument.font = fontName; 23 | textProp.setValue(textDocument); 24 | } 25 | 26 | function processComp(comp, fontName) { 27 | for (var i = 1; i <= comp.numLayers; i++) { 28 | var layer = comp.layer(i); 29 | if (layer instanceof TextLayer) { 30 | changeFontsInTextLayer(layer, fontName); 31 | } else if (layer instanceof AVLayer && layer.source instanceof CompItem) { 32 | processComp(layer.source, fontName); 33 | } 34 | } 35 | } 36 | 37 | app.beginUndoGroup("Batch Change Fonts"); 38 | 39 | for (var i = 1; i <= app.project.numItems; i++) { 40 | var item = app.project.item(i); 41 | if (item instanceof CompItem) { 42 | processComp(item, newFont, newStyle); 43 | } 44 | } 45 | 46 | app.endUndoGroup(); 47 | 48 | })(); 49 | 50 | -------------------------------------------------------------------------------- /EF_SaveSelectedCompsToPNG.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_SaveSelectedCompsToPNG.jsx 3 | * @author : Eveline Falcão 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Quickly saves the current frame of the selected Comps to PNG next to the project file. 8 | *========================================================================**/ 9 | 10 | (function saveFrameToPNG(){ 11 | 12 | function currentTimeToFrames(currentTime, frameRate){ 13 | return Math.round(currentTime * frameRate); 14 | } 15 | 16 | function padWithZeros(number, digits) { 17 | var str = number.toString() 18 | while (str.length < digits) { 19 | str = '0' + str; 20 | } 21 | return str; 22 | } 23 | 24 | var selection = app.project.selection; 25 | 26 | for (var item = 0; item < selection.length; item++) { 27 | var curComp = selection[item]; 28 | var compName = curComp.name; 29 | 30 | if(curComp instanceof CompItem && curComp != null) { 31 | var currentTime = curComp.time; 32 | var frameRate = curComp.frameRate; 33 | var currentFrame = currentTimeToFrames(currentTime, frameRate); 34 | var projectPath = app.project.file; 35 | 36 | if(projectPath != null){ 37 | var stringProjPath = projectPath.toString().replace(".aep", ""); 38 | curComp.saveFrameToPng(currentTime, File(stringProjPath + "_" + compName + "_" + padWithZeros(currentFrame, 6) + ".png")); 39 | } else { 40 | alert("Save your project to continue.") 41 | } 42 | 43 | } else { 44 | alert("Select your active Comp in the project panel or timeline."); 45 | } 46 | } 47 | 48 | })(); -------------------------------------------------------------------------------- /EF_CreateFolderStructure.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_CreateFolderStructure.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Create folders in a project. 8 | *========================================================================**/ 9 | 10 | (function createFolderStructure(){ 11 | app.beginUndoGroup("Create Folder Structure"); 12 | 13 | var mainFolders = ["1_Comps", "2_PreComps", "3_Assets"]; 14 | var inputSubFolders = ["Stills", "Audio", "Videos", "3D", "Data", "Projects", "Missing"]; 15 | var inputFolderName = "3_Assets"; 16 | 17 | function findItemByName(itemName){ 18 | var myItem; 19 | var itemCollection = app.project.items; 20 | 21 | for(var itemIndex = 1; itemIndex <= itemCollection.length; itemIndex++){ 22 | if (itemCollection[itemIndex].name == itemName){ 23 | myItem = itemCollection[itemIndex]; 24 | } 25 | } 26 | return myItem; 27 | } 28 | 29 | function createFolders(list){ 30 | for(var folderIndex = 0; folderIndex < list.length; folderIndex++){ 31 | var currentItem = app.project.items.addFolder(list[folderIndex]); 32 | currentItem.label = 0; 33 | } 34 | } 35 | 36 | function parentSubFolders(childFolders, parentName){ 37 | var parent = findItemByName(parentName); 38 | var child; 39 | 40 | for (var childIndex = 0; childIndex < childFolders.length; childIndex++){ 41 | child = findItemByName(childFolders[childIndex]); 42 | child.parentFolder = parent; 43 | } 44 | } 45 | 46 | createFolders(mainFolders); 47 | createFolders(inputSubFolders); 48 | parentSubFolders(inputSubFolders, inputFolderName); 49 | 50 | app.endUndoGroup(); 51 | })(); -------------------------------------------------------------------------------- /EF_SaveGivenFrameToPNG.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_SaveGivenFrameToPNG.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Saves selected comps in the Project Panel as PNG. Asks the user to input the frame number. 8 | *========================================================================**/ 9 | 10 | (function saveFrameToPNG(){ 11 | 12 | function currentTimeToFrames(currentTime, frameRate){ 13 | return Math.round(currentTime * frameRate); 14 | } 15 | 16 | function framesToCurrentTime(frameNumber, frameRate) { 17 | return frameNumber / frameRate; 18 | } 19 | 20 | function padWithZeros(number, digits) { 21 | var str = number.toString() 22 | while (str.length < digits) { 23 | str = '0' + str; 24 | } 25 | return str; 26 | } 27 | 28 | var selection = app.project.selection; 29 | var frameToSave = prompt("Input the Frame Number:", "Eg: 1, 2, 3, ..."); 30 | 31 | for (var item = 0; item < selection.length; item++) { 32 | var curComp = selection[item]; 33 | var compName = curComp.name; 34 | 35 | if(curComp instanceof CompItem && curComp != null) { 36 | var targetFrame = framesToCurrentTime(frameToSave, curComp.frameRate); 37 | var frameRate = curComp.frameRate; 38 | var currentFrame = currentTimeToFrames(targetFrame, frameRate); 39 | var projectPath = app.project.file; 40 | 41 | if(projectPath != null){ 42 | var stringProjPath = projectPath.toString().replace(".aep", ""); 43 | curComp.saveFrameToPng(targetFrame, File(stringProjPath + "_" + compName + "_" + padWithZeros(currentFrame, 6) + ".png")); 44 | } else { 45 | alert("Save your project to continue.") 46 | } 47 | 48 | } else { 49 | alert("Select your active Comp in the project panel or timeline."); 50 | } 51 | } 52 | 53 | })(); -------------------------------------------------------------------------------- /EF_BatchEditEffectProp.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_BatchEditEffectProperty.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Batch edits the effects in the selected Compositions. Case sensitive. 8 | *========================================================================**/ 9 | 10 | (function batchEditEffectProperty(){ 11 | 12 | var comps = app.project.selection; 13 | // var targetEffectName = "Fill"; 14 | // var targetPropertyName = "Opacity"; 15 | // var newPropValue = 0.5; 16 | 17 | var effectInput = prompt("Effect Name:", "Effect Name"); 18 | if (effectInput) { 19 | var targetEffectName = effectInput.toString(); 20 | } 21 | var propName = prompt("Effect Property Name:", "Property Name"); 22 | if (propName) { 23 | var targetPropertyName = propName.toString(); 24 | } 25 | var propValue = prompt("New Property Value:", "Eg: Numeric Value: 100, Checkbox: 0 or 1, Color: [1.0, 1.0, 1.0], Percentage: 1.0"); 26 | if (propValue) { 27 | var newPropValue = propValue; 28 | } 29 | 30 | app.beginUndoGroup("'Batch Edit Effects'"); 31 | for (var item = 0; item < comps.length; item++) { 32 | var curItem = comps[item]; 33 | 34 | if (curItem instanceof CompItem) { 35 | var layers = curItem.layers; 36 | 37 | for (var layer = 1; layer <= layers.length; layer++) { 38 | var currentLayer = layers[layer]; 39 | 40 | var effectsProp = currentLayer.property("ADBE Effect Parade"); 41 | if (effectsProp) { 42 | for(var effect = 1; effect <= effectsProp.numProperties; effect++){ 43 | var effectName = effectsProp.property(effect).name; 44 | 45 | if (effectName == targetEffectName) { 46 | effectsProp.property(targetEffectName).property(targetPropertyName).setValue(newPropValue); 47 | } 48 | } 49 | } 50 | } 51 | } 52 | } 53 | app.endUndoGroup(); 54 | 55 | })(); -------------------------------------------------------------------------------- /EF_ShowMaskedLayerBoxSize.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ShowMaskedLayerBoxSize.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Shows the bounding box size for a layer with one or more masks. 8 | * @thankyou Based on Charles Bordenave (https://www.nabscripts.com) BoundingBox solution for the RepositionAnchorPoint (version: 3.9) script. 9 | *========================================================================**/ 10 | 11 | function showMaskedLayerBox(layer) { 12 | var comp = layer.containingComp; 13 | var curTime = comp.time; 14 | var maskGroup = layer.Masks; 15 | 16 | var top = Infinity, bottom = -Infinity, left = Infinity, right = -Infinity; 17 | 18 | var numMasks = maskGroup.numProperties; 19 | for (var mask = 1; mask <= numMasks; mask++) { 20 | var maskShape = maskGroup.property(mask).maskShape; 21 | var shape = maskShape.valueAtTime(curTime, false); 22 | var verts = shape.vertices; 23 | var inTangents = shape.inTangents; 24 | var outTangents = shape.outTangents; 25 | 26 | for (var i = 0; i < verts.length; i++) { 27 | 28 | var vx = verts[i][0]; 29 | var vy = verts[i][1]; 30 | var inX = vx + inTangents[i][0]; 31 | var inY = vy + inTangents[i][1]; 32 | var outX = vx + outTangents[i][0]; 33 | var outY = vy + outTangents[i][1]; 34 | 35 | left = Math.min(left, vx, inX, outX); 36 | right = Math.max(right, vx, inX, outX); 37 | top = Math.min(top, vy, inY, outY); 38 | bottom = Math.max(bottom, vy, inY, outY); 39 | } 40 | } 41 | 42 | return { 43 | width: right - left, 44 | height: bottom - top, 45 | left: left, 46 | top: top 47 | }; 48 | } 49 | 50 | // Test 51 | var comp = app.project.activeItem; 52 | var layers = comp.selectedLayers; 53 | var layer = layers[0]; 54 | var boundingBox = showMaskedLayerBox(layer); 55 | alert("Width: " + Math.abs(boundingBox.width) + "\nHeight: " + Math.abs(boundingBox.height) + "\nLeft: " + Math.abs(boundingBox.left) + "\nTop: " + Math.abs(boundingBox.top)); 56 | -------------------------------------------------------------------------------- /EF_MakePropertiesValidAgain.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_MakePropertiesValidAgain.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Create a reference object for the selected properties, allowing you to locate them after they become invalid due to added or removed effects. 8 | *========================================================================**/ 9 | 10 | (function makePropertiesValidAgain() { 11 | var comp = app.project.activeItem; 12 | var selectedProps = comp.selectedProperties; 13 | 14 | if (selectedProps.length > 0) { 15 | // Make property references 16 | var propsToProcess = []; 17 | for (var i = 0; i < selectedProps.length; i++) { 18 | var currentProp = selectedProps[i]; 19 | var reference = createNestedPropertyReference(currentProp); 20 | propsToProcess.push(reference); 21 | } 22 | 23 | // Get property from references 24 | for (var i = 0; i < propsToProcess.length; i++) { 25 | var reference = propsToProcess[i]; 26 | var prop = getNestedPropertyFromReference(reference); 27 | 28 | // Do something to the property 29 | alert(prop.name); 30 | } 31 | } 32 | 33 | function createNestedPropertyReference(property) { 34 | var layer = property.propertyGroup(property.propertyDepth); 35 | var propIndices = []; 36 | 37 | for (var depth = property.propertyDepth; depth > 0; depth--) { 38 | propIndices.unshift(property.propertyIndex); 39 | property = property.propertyGroup(); 40 | } 41 | 42 | // Save layer and indices 43 | return { layer: layer, propIndices: propIndices }; 44 | } 45 | 46 | function getNestedPropertyFromReference(propertyReference) { 47 | var layer = propertyReference.layer; 48 | var propIndices = propertyReference.propIndices; 49 | var prop = layer; 50 | 51 | for (var j = 0; j < propIndices.length; j++) { 52 | prop = prop.property(propIndices[j]); 53 | } 54 | 55 | return prop; 56 | } 57 | })(); -------------------------------------------------------------------------------- /EF_SaveGivenFrameToPSD.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_SaveGivenFrameToPSD.jsx 3 | * @author : Eveline Falcão 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Quickly saves the given frame of the selected Comps to PSD next to the project file. 8 | *========================================================================**/ 9 | 10 | (function saveFrameToPSD() { 11 | 12 | function framesToCurrentTime(frameNumber, frameRate) { 13 | return frameNumber / frameRate; 14 | } 15 | 16 | function saveFrameToPsd(comp, filePath) { 17 | 18 | var renderQueueItem = app.project.renderQueue.items.add(comp); 19 | var outputModule = renderQueueItem.outputModule(1); 20 | outputModule.file = filePath; 21 | outputModule.applyTemplate("Photoshop"); 22 | 23 | app.project.renderQueue.render(); 24 | 25 | renderQueueItem.remove(); 26 | comp.workAreaStart = 0; 27 | comp.workAreaDuration = comp.duration; 28 | }; 29 | 30 | var selection = app.project.selection; 31 | var frameToSave = parseInt(prompt("Input the Frame Number:", "Eg: 1, 2, 3, ..."), 10); 32 | 33 | for (var item = 0; item < selection.length; item++) { 34 | var curComp = selection[item]; 35 | var compName = curComp.name; 36 | 37 | if (curComp instanceof CompItem && curComp != null) { 38 | var targetFrame = framesToCurrentTime(frameToSave, curComp.frameRate); 39 | 40 | curComp.time = targetFrame; 41 | curComp.workAreaStart = targetFrame; 42 | curComp.workAreaDuration = 1 / curComp.frameRate; 43 | 44 | var projectPath = app.project.file; 45 | 46 | if (projectPath != null) { 47 | var stringProjPath = projectPath.toString().replace(".aep", ""); 48 | var filePath = File(stringProjPath + "_" + compName + ".psd"); 49 | 50 | saveFrameToPsd(curComp, filePath); 51 | 52 | } else { 53 | alert("Save your project to continue."); 54 | } 55 | 56 | } else { 57 | alert("Select your active Comp in the project panel or timeline."); 58 | } 59 | } 60 | 61 | })(); -------------------------------------------------------------------------------- /EF_CountSelectedItemsUI.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_CountSelectedItemsUI.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description ScriptUI version of the CountSelectedItem scriptlet. 8 | *========================================================================**/ 9 | 10 | (function countSelectedProjectItemsUI(thisObj) { 11 | 12 | var resourceString = 13 | "group { \ 14 | orientation: 'column', \ 15 | alignment: ['left', 'top'], \ 16 | textDisplay: StaticText { text: 'Selected items: 0', properties: { multiline: true, preferredSize: [-1, -1] } }, \ 17 | countButton: Button { text: 'Count' }, \ 18 | }"; 19 | 20 | function createUserInterface(thisObj, userInterfaceString, scriptName) { 21 | 22 | var myPanel = (thisObj instanceof Panel) ? thisObj : new Window("palette", scriptName, undefined, { resizeable: true }); 23 | if (myPanel == null) return myPanel; 24 | var UI = myPanel.add(userInterfaceString); 25 | 26 | myPanel.layout.layout(true); 27 | myPanel.layout.resize(); 28 | myPanel.onResizing = myPanel.onResize = function () { 29 | this.layout.resize(); 30 | } 31 | 32 | var countButton = UI.countButton; 33 | var textDisplay = UI.textDisplay; 34 | 35 | countButton.onClick = function() { 36 | var itemsCount = 0; 37 | var selectedItems = app.project.selection; 38 | var selectedItemsLen = selectedItems.length; 39 | 40 | if (selectedItemsLen > 0) { 41 | itemsCount = selectedItemsLen; 42 | textDisplay.text = "Selected items: " + itemsCount; 43 | } else { 44 | alert("Select the project items to count."); 45 | textDisplay.text = "Selected items: 0"; 46 | } 47 | }; 48 | 49 | if ((myPanel != null) && (myPanel instanceof Window)) { 50 | myPanel.center(); 51 | myPanel.show(); 52 | } 53 | 54 | return UI; 55 | } 56 | 57 | var scriptName = "Count Selected Items"; 58 | var UI = createUserInterface(thisObj, resourceString, scriptName); 59 | 60 | })(this); -------------------------------------------------------------------------------- /EF_SaveSelectedCompsAsProjects.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_SaveSelectedCompsAsProjects.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Saves selected comps in the Project Panel as a project. 8 | *========================================================================**/ 9 | 10 | (function saveSelectedCompsAsProjects() { 11 | 12 | function getProjectItem(name) { 13 | for (var i = 1; i <= app.project.items.length; i++) { 14 | var item = app.project.items[i]; 15 | if (item.name == name) { 16 | return item; 17 | } 18 | } 19 | return null; 20 | } 21 | 22 | function getSelectedItemsNames(selectedItems){ 23 | var itemsList = []; 24 | for(var i = 0; i < selectedItems.length; i++){ 25 | var curItemName = selectedItems[i].name; 26 | itemsList.push(curItemName); 27 | } 28 | return itemsList; 29 | } 30 | 31 | var project = app.project; 32 | var selectedItems = project.selection; 33 | var projectPath = project.file; 34 | 35 | if(!projectPath){ 36 | project.saveWithDialog(); 37 | } 38 | var folderPath = projectPath.toString().replace(/[^\\\/]+$/, ""); 39 | 40 | // Saves selectedItems names 41 | var itemsNames = getSelectedItemsNames(selectedItems); 42 | 43 | for(var item = itemsNames.length - 1; item >= 0; item--){ 44 | 45 | // Find item by name 46 | var currentItem = getProjectItem(itemsNames[item]); 47 | 48 | if(currentItem instanceof CompItem){ 49 | var curCompName = currentItem.name; 50 | 51 | // Reduce comp 52 | try { 53 | project.reduceProject(currentItem); 54 | } catch (e) { 55 | alert("Error reducing project for " + curCompName + ": " + e.message); 56 | continue; 57 | } 58 | 59 | // Save comp 60 | var fileObject = new File(folderPath + curCompName + ".aep"); 61 | project.save(fileObject); 62 | 63 | // Reopen original project 64 | var mainProject = new File(projectPath); 65 | app.open(mainProject); 66 | 67 | // Reinitialize the project 68 | project = app.project; 69 | } 70 | 71 | // Removes the item from the itemsNames list 72 | itemsNames.splice(item, 1); 73 | } 74 | })() -------------------------------------------------------------------------------- /EF_SaveToPNGAndPSD.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_SaveToPNGAndPSD.jsx 3 | * @author Eveline Falcão 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Saves selected comps in the Project Panel as PNG and PSD. Asks the user to input the frame number. 8 | *========================================================================**/ 9 | 10 | (function saveToPNGAndPSD(){ 11 | 12 | function currentTimeToFrames(currentTime, frameRate){ 13 | return Math.round(currentTime * frameRate); 14 | } 15 | 16 | function framesToCurrentTime(frameNumber, frameRate) { 17 | return frameNumber / frameRate; 18 | } 19 | 20 | function padWithZeros(number, digits) { 21 | var str = number.toString() 22 | while (str.length < digits) { 23 | str = '0' + str; 24 | } 25 | return str; 26 | } 27 | 28 | function saveFrameToPsd(comp, filePath) { 29 | var renderQueueItem = app.project.renderQueue.items.add(comp); 30 | var outputModule = renderQueueItem.outputModule(1); 31 | outputModule.file = filePath; 32 | outputModule.applyTemplate("Photoshop"); 33 | 34 | app.project.renderQueue.render(); 35 | 36 | renderQueueItem.remove(); 37 | comp.workAreaStart = 0; 38 | comp.workAreaDuration = comp.duration; 39 | } 40 | 41 | var selection = app.project.selection; 42 | var frameToSave = prompt("Input the Frame Number:", "Eg: 1, 2, 3, ..."); 43 | 44 | for (var item = 0; item < selection.length; item++) { 45 | var curComp = selection[item]; 46 | var compName = curComp.name; 47 | 48 | if(curComp instanceof CompItem && curComp != null) { 49 | var targetFrame = framesToCurrentTime(frameToSave, curComp.frameRate); 50 | 51 | curComp.time = targetFrame; 52 | curComp.workAreaStart = targetFrame; 53 | curComp.workAreaDuration = 1 / curComp.frameRate; 54 | 55 | var frameRate = curComp.frameRate; 56 | var currentFrame = currentTimeToFrames(targetFrame, frameRate); 57 | var projectPath = app.project.file; 58 | 59 | if(projectPath != null){ 60 | var stringProjPath = projectPath.toString().replace(".aep", ""); 61 | curComp.saveFrameToPng(targetFrame, File(stringProjPath + "_" + compName + "_" + padWithZeros(currentFrame, 6) + ".png")); 62 | 63 | var renderPath = File(stringProjPath + "_" + compName + ".psd"); 64 | saveFrameToPsd(curComp, renderPath); 65 | } else { 66 | alert("Save your project to continue.") 67 | } 68 | 69 | } else { 70 | alert("Select your active Comp in the project panel or timeline."); 71 | } 72 | } 73 | 74 | })(); -------------------------------------------------------------------------------- /EF_ExportActiveCompExpressionsToFile.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ExportActiveCompExpressionsToFile.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Exports the expressions of the active comp to a .jsx file. 8 | *========================================================================**/ 9 | 10 | (function exportActiveCompExpressionsToFile() { 11 | 12 | app.beginUndoGroup("Export Active Comp Expressions"); 13 | 14 | var project = app.project; 15 | var projectPath = project.file; 16 | var projectName = projectPath.toString(); 17 | var comp = project.activeItem; 18 | var layers = comp.layers; 19 | var docHeader = "/*\n\tProject: " + projectName + "\n\tComposition: " + comp.name + "\n*/"; 20 | var expressions = [docHeader]; 21 | 22 | function processProperty(property, curLayerName, curLayerIndex) { 23 | 24 | // Pass a layer or a prop 25 | if (property.propertyType == PropertyType.PROPERTY) { // Check if value is a single property and do something 26 | 27 | if (property.expressionEnabled) { 28 | var string = "// Layer " + curLayerIndex + ": \"" + curLayerName + "\" - " + property.name + "\n"; 29 | var exp = property.expression.replace(/[\r\n]+/g, "\n").trim(); 30 | var expression = string + exp; 31 | expressions.push(expression); 32 | } 33 | 34 | } else { 35 | 36 | for (var i = 1; i <= property.numProperties; i++) { 37 | processProperty(property.property(i), curLayerName, curLayerIndex); 38 | } 39 | 40 | } 41 | } 42 | 43 | for (var layer = 1; layer <= layers.length; layer++) { 44 | var currentLayer = layers[layer]; 45 | var curLayerName = currentLayer.name; 46 | var curLayerIndex = currentLayer.index; 47 | // alert(curLayerName); 48 | processProperty(currentLayer, curLayerName, curLayerIndex); 49 | } 50 | 51 | // Check if project is saved 52 | if (projectPath != null) { 53 | var filePath = projectPath.toString().replace(".aep", ""); 54 | } else { 55 | alert("Save your project to continue.") 56 | } 57 | 58 | // Separates each item with three line breaks 59 | var expressionsString = expressions.join("\n\n\n\n"); 60 | 61 | // Prompt to save the file 62 | var file = new File(filePath + "_" + comp.name + "_Expressions.jsx").saveDlg("Select the file destination.", "*.jsx"); 63 | 64 | // Write the file 65 | if (file != null) { 66 | file.open("w"); 67 | file.write(expressionsString); 68 | file.close(); 69 | } 70 | 71 | app.endUndoGroup(); 72 | 73 | })(); -------------------------------------------------------------------------------- /EF_AddItemsToVariousCompsSizes.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_AddItemsToVariousCompsSizes.jsx 3 | * @author : Eveline Falcão 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Quickly saves the given frame of the selected Comps to PSD next to the project file. 8 | *========================================================================**/ 9 | 10 | (function addItemsToVariousCompsSizes() { 11 | 12 | function removeExtension(filename) { 13 | var lastDot = filename.lastIndexOf("."); 14 | if (lastDot > -1) { 15 | return filename.substring(0, lastDot); 16 | } 17 | return filename; 18 | } 19 | 20 | function createCompWithItem(baseName, width, height, item, createdCompsArray) { 21 | var duration = item.duration || 1; 22 | var frameRate = item.mainSource && item.mainSource.frameRate ? item.mainSource.frameRate : 30; 23 | 24 | var compName = baseName + "_" + width + "x" + height; 25 | var comp = app.project.items.addComp(compName, width, height, 1, duration, frameRate); 26 | createdCompsArray.push(comp); 27 | 28 | var layer = comp.layers.add(item); 29 | 30 | var itemWidth = item.width; 31 | var itemHeight = item.height; 32 | 33 | if (itemWidth === 0 || itemHeight === 0) { 34 | alert("Item '" + baseName + "' has no width or height."); 35 | return; 36 | } 37 | 38 | var scaleX = width / itemWidth; 39 | var scaleY = height / itemHeight; 40 | var finalScale = Math.max(scaleX, scaleY) * 100; 41 | 42 | layer.property("Scale").setValue([finalScale, finalScale]); 43 | 44 | return comp; 45 | } 46 | 47 | app.beginUndoGroup("'Add Items to Comps'"); 48 | 49 | var selectedItems = app.project.selection; 50 | var createdComps = []; 51 | 52 | if (selectedItems.length === 0) { 53 | alert("Please select one or more footage items in the Project panel."); 54 | app.endUndoGroup(); 55 | return; 56 | } 57 | 58 | for (var i = 0; i < selectedItems.length; i++) { 59 | var curItem = selectedItems[i]; 60 | var curItemName = removeExtension(curItem.name); 61 | 62 | if (!(curItem instanceof FootageItem)) { 63 | alert("Item '" + curItem.name + "' is not a valid footage item. Skipping."); 64 | continue; 65 | } 66 | 67 | createCompWithItem(curItemName, 1920, 1080, curItem, createdComps); 68 | createCompWithItem(curItemName, 1080, 1080, curItem, createdComps); 69 | createCompWithItem(curItemName, 1080, 1920, curItem, createdComps); 70 | } 71 | 72 | for (var j = 1; j <= app.project.numItems; j++) { 73 | app.project.item(j).selected = false; 74 | } 75 | 76 | for (var k = 0; k < createdComps.length; k++) { 77 | createdComps[k].selected = true; 78 | } 79 | 80 | app.endUndoGroup(); 81 | })(); 82 | -------------------------------------------------------------------------------- /EF_ShowLayerSizeAndPosition.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ShowLayerSizeAndPosition.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Shows layer size and position in the Info Panel. The position shown is relative to parent and the position in the comp. 8 | *========================================================================**/ 9 | 10 | (function showLayerSizeAndPosition(){ 11 | 12 | function getBoundingBox(layer, currentTime){ 13 | var layerObj = {}; 14 | var sourceRect = layer.sourceRectAtTime(currentTime, true); 15 | 16 | layerObj.top = sourceRect.top; 17 | layerObj.left = sourceRect.left; 18 | layerObj.width = sourceRect.width; 19 | layerObj.height = sourceRect.height; 20 | 21 | return layerObj; 22 | } 23 | 24 | function fixPositionDecimals(propertyValue, digits){ 25 | var posObj = {}; 26 | 27 | posObj.x = propertyValue[0].toFixed(digits); 28 | posObj.y = propertyValue[1].toFixed(digits); 29 | posObj.z = propertyValue[2].toFixed(digits); 30 | 31 | return posObj; 32 | } 33 | 34 | var comp = app.project.activeItem; 35 | var layers = comp.selectedLayers; 36 | 37 | if(layers.length > 0){ 38 | var currentLayer = layers[0]; 39 | var currentTime = comp.time; 40 | 41 | var boundingBox = getBoundingBox(currentLayer, currentTime); 42 | var positionProp = currentLayer.property("ADBE Transform Group").property("ADBE Position"); 43 | var position = currentLayer.property("ADBE Transform Group").property("ADBE Position").value; 44 | var anchorProp = currentLayer.property("ADBE Transform Group").property("ADBE Anchor Point"); 45 | var width = boundingBox.width.toFixed(1); 46 | var height = boundingBox.height.toFixed(1); 47 | var posFixed = fixPositionDecimals(position, 1); 48 | 49 | positionProp.expression = ""; 50 | positionProp.expression = 51 | "l = thisLayer;\rtry {\r" + 52 | " l.toComp(l.anchorPoint);\r" + 53 | "}\r" + 54 | "catch(e) {\r" + 55 | " l.toComp(l.anchorPoint);\r" + 56 | "}"; 57 | positionProp.expressionEnabled = false; 58 | positionProp.expressionEnabled = true; 59 | var newPositionValue = positionProp.valueAtTime(currentTime, false); 60 | var newPosFixed = fixPositionDecimals(newPositionValue, 1); 61 | positionProp.expression = ""; 62 | 63 | writeLn(currentLayer.name); 64 | writeLn("Size: " + "[" + width + ", " + height + "]"); 65 | writeLn("Position: [" + posFixed.x + ", " + posFixed.y + ", " + posFixed.z + "]"); 66 | if(currentLayer.parent) { 67 | writeLn("Comp Pos: [" + newPosFixed.x + ", " + newPosFixed.y + ", " + newPosFixed.z + "]"); 68 | } 69 | 70 | } else { 71 | alert("Select one layer to continue.") 72 | } 73 | 74 | })(); -------------------------------------------------------------------------------- /EF_ExportAllExpressionsToFile.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ExportAllExpressionsToFile.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Exports all expressions in the project to a file for each composition. 8 | *========================================================================**/ 9 | 10 | (function exportAllExpressionsToFile() { 11 | 12 | (function main() { 13 | var project = app.project; 14 | var projectPath = project.file; 15 | var projectName = projectPath.toString(); 16 | var projItems = project.items; 17 | var expressions = []; 18 | 19 | // Check if project is saved 20 | if (projectPath != null) { 21 | var filePath = projectPath.toString().replace(".aep", ""); 22 | } else { 23 | alert("Save your project to continue."); 24 | } 25 | 26 | app.beginUndoGroup("Export Comps Expressions"); 27 | for (var item = 1; item <= projItems.length; item++) { 28 | var curItem = projItems[item]; 29 | 30 | if (curItem instanceof CompItem) { 31 | var curComp = projItems[item]; 32 | var layers = curComp.layers; 33 | 34 | for (var layer = 1; layer <= layers.length; layer++) { 35 | var currentLayer = layers[layer]; 36 | var curLayerName = currentLayer.name; 37 | var curLayerIndex = currentLayer.index; 38 | 39 | processProperty(currentLayer, curLayerName, curLayerIndex, expressions); 40 | } 41 | 42 | if (expressions.length != 0) { 43 | // Add the project and comp name to the first element of the array 44 | var compString = "/*\n\tProject: " + projectName + "\n\tComposition: " + curComp.name + "\n*/"; 45 | expressions.unshift(compString); 46 | 47 | // Join array and save file 48 | var expressionsString = expressions.join("\n\n\n\n"); 49 | saveFile(filePath, "Expressions", ".jsx", expressionsString, curComp); 50 | 51 | // Reset the expressions array 52 | expressions = []; 53 | } 54 | 55 | } 56 | } 57 | app.endUndoGroup(); 58 | })(); 59 | 60 | 61 | // Supporting functions 62 | function processProperty(property, curLayerName, curLayerIndex, expressionsList) { 63 | 64 | // Pass a layer or a prop 65 | if (property.propertyType == PropertyType.PROPERTY) { // Check if value is a single property and do something 66 | 67 | if (property.expressionEnabled) { 68 | var layerAndPropInfo = "// Layer " + curLayerIndex + ": \"" + curLayerName + "\" - " + property.name; 69 | var exp = property.expression.replace(/[\r\n]+/g, "\n").trim(); 70 | var expression = layerAndPropInfo + "\n" + exp; 71 | expressionsList.push(expression); 72 | } 73 | 74 | } else { 75 | 76 | for (var i = 1; i <= property.numProperties; i++) { 77 | processProperty(property.property(i), curLayerName, curLayerIndex, expressionsList); 78 | } 79 | 80 | } 81 | } 82 | 83 | function saveFile(filePath, fileSuffix, fileFormat, content, comp) { 84 | // Prompt to save the file 85 | var extension = fileFormat; 86 | var compName = comp.name; 87 | var file = new File(filePath + "_" + compName + "_" + fileSuffix + extension); 88 | 89 | // Write the file 90 | if (file != null) { 91 | file.open("w"); 92 | file.write(content); 93 | file.close(); 94 | } 95 | } 96 | 97 | })(); -------------------------------------------------------------------------------- /EF_ExportSelectedCompsExpressions.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ExportSelectedCompsExpressions.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Exports the expressions of the selected comps in the Projec Panel to a .jsx file. Each comp exports a file next to the project. 8 | *========================================================================**/ 9 | 10 | (function exportLayersExpressionsToFile() { 11 | 12 | (function main() { 13 | var project = app.project; 14 | var projectPath = project.file; 15 | var projectName = projectPath.toString(); 16 | var projItems = project.selection; 17 | var expressions = []; 18 | 19 | // Check if project is saved 20 | if (projectPath != null) { 21 | var filePath = projectPath.toString().replace(".aep", ""); 22 | } else { 23 | alert("Save your project to continue."); 24 | } 25 | 26 | app.beginUndoGroup("Export Comps Expressions"); 27 | for (var item = 0; item < projItems.length; item++) { 28 | var curItem = projItems[item]; 29 | 30 | if (curItem instanceof CompItem) { 31 | var curComp = projItems[item]; 32 | var layers = curComp.layers; 33 | 34 | for (var layer = 1; layer <= layers.length; layer++) { 35 | var currentLayer = layers[layer]; 36 | var curLayerName = currentLayer.name; 37 | var curLayerIndex = currentLayer.index; 38 | 39 | processProperty(currentLayer, curLayerName, curLayerIndex, expressions); 40 | } 41 | 42 | if (expressions.length != 0) { 43 | // Add the project and comp name to the first element of the array 44 | var compString = "/*\n\tProject: " + projectName + "\n\tComposition: " + curComp.name + "\n*/"; 45 | expressions.unshift(compString); 46 | 47 | // Join array and save file 48 | var expressionsString = expressions.join("\n\n\n\n"); 49 | saveFile(filePath, "Expressions", ".jsx", expressionsString, curComp); 50 | 51 | // Reset the expressions array 52 | expressions = []; 53 | } 54 | 55 | } 56 | } 57 | app.endUndoGroup(); 58 | })(); 59 | 60 | 61 | // Supporting functions 62 | function processProperty(property, curLayerName, curLayerIndex, expressionsList) { 63 | 64 | // Pass a layer or a prop 65 | if (property.propertyType == PropertyType.PROPERTY) { // Check if value is a single property and do something 66 | 67 | if (property.expressionEnabled) { 68 | var layerAndPropInfo = "// Layer " + curLayerIndex + ": \"" + curLayerName + "\" - " + property.name; 69 | var exp = property.expression.replace(/[\r\n]+/g, "\n").trim(); 70 | var expression = layerAndPropInfo + "\n" + exp; 71 | expressionsList.push(expression); 72 | } 73 | 74 | } else { 75 | 76 | for (var i = 1; i <= property.numProperties; i++) { 77 | processProperty(property.property(i), curLayerName, curLayerIndex, expressionsList); 78 | } 79 | 80 | } 81 | } 82 | 83 | function saveFile(filePath, fileSuffix, fileFormat, content, comp) { 84 | // Prompt to save the file 85 | var extension = fileFormat; 86 | var compName = comp.name; 87 | var file = new File(filePath + "_" + compName + "_" + fileSuffix + extension); 88 | 89 | // Write the file 90 | if (file != null) { 91 | file.open("w"); 92 | file.write(content); 93 | file.close(); 94 | } 95 | } 96 | 97 | })(); -------------------------------------------------------------------------------- /EF_ResetTransform.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_ResetTransform.jsx 3 | * @author : Eveline Falcão (https://evelinefalcao.com) 4 | * @email : hello@evelinefalcao.com 5 | * @version : 1.0.0 6 | * @createdFor : Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description : Reset the transformations (Anchor Point, Position, Scale, Rotation, Opacity) of the selected layers. 8 | *========================================================================**/ 9 | 10 | (function resetTransform(){ 11 | app.beginUndoGroup("'Reset Transform'"); 12 | 13 | var comp = app.project.activeItem; 14 | var layers = comp.selectedLayers; 15 | 16 | function getBoundingBox(layer, currentTime){ 17 | var layerObj = {}; 18 | var sourceRect = layer.sourceRectAtTime(currentTime, true); 19 | 20 | layerObj.top = sourceRect.top; 21 | layerObj.left = sourceRect.left; 22 | layerObj.width = sourceRect.width; 23 | layerObj.height = sourceRect.height; 24 | 25 | return layerObj; 26 | } 27 | 28 | function getCompSize(comp){ 29 | var compObj = {}; 30 | 31 | compObj.width = comp.width; 32 | compObj.height = comp.height; 33 | 34 | return compObj; 35 | } 36 | 37 | function setPropertyValue(comp, property, value){ 38 | // Function inspired by zl_CreatePivotalNull_setKeys 39 | var currentTime = comp.time; 40 | if(property.isTimeVarying){ 41 | var nearestKeyframeIndex = property.nearestKeyIndex(currentTime); 42 | property.setValueAtKey(nearestKeyframeIndex, value); 43 | } else { 44 | property.setValue(value); 45 | } 46 | } 47 | 48 | if(layers.length != 0){ 49 | for(var layer = 0; layer < layers.length; layer++){ 50 | var currentTime = comp.time; 51 | var currentLayer = layers[layer]; 52 | var layerSourceRect = getBoundingBox(currentLayer, currentTime); 53 | var compSize = getCompSize(comp); 54 | 55 | var anchorPoint = currentLayer.property("ADBE Transform Group").property("ADBE Anchor Point"); 56 | var position = currentLayer.property("ADBE Transform Group").property("ADBE Position"); 57 | var scale = currentLayer.property("ADBE Transform Group").property("ADBE Scale"); 58 | if(currentLayer.threeDLayer){ 59 | var orientation = currentLayer.property("ADBE Transform Group").property("ADBE Orientation"); 60 | var rotationX = currentLayer.property("ADBE Transform Group").property("ADBE Rotate X"); 61 | var rotationY = currentLayer.property("ADBE Transform Group").property("ADBE Rotate Y"); 62 | } 63 | var rotationZ = currentLayer.property("ADBE Transform Group").property("ADBE Rotate Z"); 64 | var opacity = currentLayer.property("ADBE Transform Group").property("ADBE Opacity"); 65 | 66 | anchorPointNew = [layerSourceRect.width/2, layerSourceRect.height/2, 0]; 67 | positionNew = [compSize.width/2, compSize.height/2, 0]; 68 | scaleNew = [100, 100, 100]; 69 | orientationNew = [0, 0, 0]; 70 | rotationX_new = 0; 71 | rotationY_new = 0; 72 | rotationZ_new = 0; 73 | opacityNew = 100; 74 | 75 | setPropertyValue(comp, anchorPoint, anchorPointNew); 76 | setPropertyValue(comp, position, positionNew); 77 | setPropertyValue(comp, scale, scaleNew); 78 | if(currentLayer.threeDLayer){ 79 | setPropertyValue(comp, orientation, orientationNew); 80 | setPropertyValue(comp, rotationX, rotationX_new); 81 | setPropertyValue(comp, rotationY, rotationY_new); 82 | } 83 | setPropertyValue(comp, rotationZ, rotationZ_new); 84 | setPropertyValue(comp, opacity, opacityNew); 85 | } 86 | } else { 87 | alert("Select some layers to continue.") 88 | } 89 | 90 | app.endUndoGroup(); 91 | 92 | })() -------------------------------------------------------------------------------- /EF_OrganizeProject.jsx: -------------------------------------------------------------------------------- 1 | /**======================================================================== 2 | * ? EF_OrganizeProject.jsx 3 | * @author Eveline Falcão (https://evelinefalcao.com) 4 | * @email hello@evelinefalcao.com 5 | * @version 1.0.0 6 | * @createdFor Adobe After Effects CC 2024 (Version 24.1.0 Build 78) 7 | * @description Creates folders and organizes the project items by type into a Comps, PreComps and Assets folders. 8 | *========================================================================**/ 9 | 10 | (function organizeProject() { 11 | 12 | var fileTypesObj = { 13 | "Video": [".crm", ".mxf", ".hevc", ".3pg", ".3g2", ".amc", ".swf", ".flv", ".f4v", ".gif", ".mov", ".mwts", ".m4v", 14 | ".mpg", ".m2p", ".m2v", ".m2a", ".m2t", ".mp4", ".omf", ".avi", ".wmv", ".wma"], 15 | "Still": [".ai", ".eps", ".ps", ".pdf", ".psd", ".psb", ".bmp", ".rle", ".dib", ".tif", ".crw", ".nef", ".raf", ".orf", 16 | ".mrw", ".dcr", ".mos", ".raw", ".pef", ".srf", ".dng", ".x3f", ".cr2", ".erf", ".cin", ".dpx", ".rla", 17 | ".rpf", ".img", ".ei", ".iff", ".tdi", ".jpg", ".jpe", ".heif", ".exr", ".pcx", ".png", ".hdr", ".rgbe", 18 | ".xyze", ".sgi", ".bw", ".rgb", ".pic", ".tga", ".vda", ".icb", ".vst", ".webp"], 19 | "Audio": [".aac", ".m4a", ".aif", ".aiff", ".mp3", ".mpeg", ".mpg", ".mpa", ".mpe",".wav"], 20 | "Project": [".aep", ".aepx", ".prproj", ".aaf"], 21 | "Data": [".json", ".mgjson", ".csv", ".tsv", ".txt"], 22 | "Library": [".jsbin", ".jsx"], 23 | "3D": [".c4d", ".obj", ".glb", ".gltf", ".ma"], 24 | }; 25 | 26 | var assetsObj = { 27 | "Video": [], 28 | "Still": [], 29 | "Audio": [], 30 | "Project": [], 31 | "Data": [], 32 | "Library": [], 33 | "3D": [], 34 | "Solids": [], 35 | }; 36 | var compsList = []; 37 | var preCompsList = []; 38 | var foldersList = []; 39 | 40 | (function main() { 41 | var projectItems = app.project.items; 42 | 43 | app.beginUndoGroup("'Organize Project'"); 44 | 45 | // Categorize all items 46 | for (var i = 1; i <= projectItems.length; i++) { 47 | var item = projectItems[i]; 48 | addItemToCategory(item); 49 | } 50 | 51 | // Create Folders 52 | var mainFolders = createMainFolders(assetsObj); 53 | createAssetsFolders(assetsObj, mainFolders["Assets"]); 54 | 55 | // Move comp items 56 | moveItemsToFolder(compsList, mainFolders["Comps"].name) 57 | // Move preComp items 58 | moveItemsToFolder(preCompsList, mainFolders["PreComps"].name) 59 | // Move assets items 60 | for (var assetType in assetsObj) { 61 | var assetList = assetsObj[assetType]; 62 | moveItemsToFolder(assetList, assetType) 63 | } 64 | 65 | // Remove empty folders 66 | for (var item = projectItems.length; item > 0; item--) { 67 | var folderItem = projectItems[item]; 68 | if (folderItem instanceof FolderItem) { 69 | removeEmptyFolder(folderItem); 70 | } 71 | } 72 | 73 | app.endUndoGroup(); 74 | })(); 75 | 76 | 77 | function findItemByName(name) { 78 | for (var i = 1; i <= app.project.items.length; i++) { 79 | var item = app.project.items[i]; 80 | if (item.name == name) { 81 | return item; 82 | } 83 | } 84 | return null; 85 | } 86 | 87 | function moveItemsToFolder(items, targetFolderName) { 88 | var itemsLength = items.length; 89 | var targetFolder = findItemByName(targetFolderName); 90 | 91 | for (var i = 0; i < itemsLength; i++) { 92 | var item = items[i]; 93 | item.parentFolder = targetFolder; 94 | } 95 | } 96 | 97 | function removeEmptyFolder(folderItem) { 98 | if (folderItem.numItems == 0) { 99 | folderItem.remove(); 100 | } 101 | } 102 | 103 | function addItemToCategory(item) { 104 | if (item instanceof CompItem && (item.usedIn.length == 0)) { 105 | compsList.push(item); 106 | } else if (item instanceof CompItem && (item.usedIn.length > 0)) { 107 | preCompsList.push(item); 108 | } else if (item instanceof FolderItem) { 109 | foldersList.push(item); 110 | } else if (item.mainSource instanceof SolidSource) { 111 | assetsObj["Solids"].push(item); 112 | } else { 113 | var itemName = item.name; 114 | var itemFileExtension = itemName.substring(itemName.lastIndexOf(".")).toLowerCase(); 115 | 116 | for (var key in fileTypesObj) { 117 | var fileType = fileTypesObj[key]; // Eg.: fileTypesObj["Video"] 118 | for (var j = 0; j < fileType.length; j++) { 119 | var fileExtension = fileType[j]; 120 | if (itemFileExtension == fileExtension) { 121 | assetsObj[key].push(item); 122 | return; 123 | } 124 | } 125 | } 126 | } 127 | } 128 | 129 | function getOrCreateFolder(name, parent) { 130 | // Create folder 131 | var folder = findItemByName(name); 132 | if (folder == null) { 133 | folder = app.project.items.addFolder(name); 134 | } 135 | // Parent new folder 136 | if (parent) { 137 | folder.parentFolder = parent; 138 | } 139 | folder.label = 0; 140 | 141 | return folder; 142 | } 143 | 144 | function createMainFolders(categoriesObj) { 145 | var folderCounter = 1; 146 | var createdFolders = {}; 147 | 148 | if (compsList.length > 0) { 149 | var newFolder = getOrCreateFolder(folderCounter + "_Comps"); 150 | createdFolders["Comps"] = newFolder; 151 | folderCounter++; 152 | } 153 | if (preCompsList.length > 0) { 154 | var newFolder = getOrCreateFolder(folderCounter + "_PreComps"); 155 | createdFolders["PreComps"] = newFolder; 156 | folderCounter++; 157 | } 158 | for (var key in assetsObj) { 159 | if (assetsObj[key].length > 0) { 160 | var newFolder = getOrCreateFolder(folderCounter + "_Assets"); 161 | createdFolders["Assets"] = newFolder; 162 | folderCounter++; 163 | break; 164 | } 165 | } 166 | 167 | return createdFolders; 168 | } 169 | 170 | function createAssetsFolders(categoriesObj, parent) { 171 | for (var key in categoriesObj) { 172 | // Create folder if category is not empty 173 | if (categoriesObj[key].length > 0) { 174 | getOrCreateFolder(key, parent); 175 | } 176 | } 177 | } 178 | 179 | })(); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EF After Effects Scriptlets 2 | 3 | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/M4M212BC7C) 4 | 5 | A collection of useful Adobe After Effects scriptlets designed to streamline your workflow. Each scriptlet can be run directly in After Effects or added to a script launcher like [KBar](https://aescripts.com/kbar/) for easy access. 6 | 7 | ## Installation Instructions 8 | 9 | ### Direct Installation 10 | 1. Download the `.jsx` file from this repository. 11 | 2. Place the file in the After Effects `Scripts` folder (usually located at `C:\Program Files\Adobe\Adobe After Effects \Support Files\Scripts` on Windows or `/Applications/Adobe After Effects /Scripts` on macOS). 12 | 3. To run the script, go to `File > Scripts > Run Script File` in After Effects and select the `.jsx` file. 13 | 14 | ### Adding to KBar 15 | #### Method 1 16 | 1. Download the `.jsx` file from this repository. 17 | 2. Open the `KBar Settings` in After Effects. 18 | 3. Choose your preferred Toolbar and click `Add Button`. 19 | 4. Click `Run JSX/JSXBIN File` and select the scriptlet location. 20 | 5. Add a `Description` and click `OK`. 21 | #### Method 2 22 | 1. Open the `KBar Settings` in After Effects. 23 | 2. Choose your preferred Toolbar and click `Add Button`. 24 | 3. Copy the content of the `.jsx` file from its GitHub page. 25 | 4. Back in KBar, click `Run Scriptlet` and paste the text in `Scriptlet`. 26 | 5. Add a `Description` and hit `OK`. 27 | 28 | ## Scriptlets 29 | 30 | ### [Add Posterize Time Zero](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_AddPosterizeTimeZero.jsx) 31 | Adds `"posterizeTime(0);"` to the beginning of all selected properties' expressions, ensuring efficiency when using static expressions. 32 | 33 | ### [Add Selected PreComps To Render Queue](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_AddSelectedPreCompsToRenderQueue.jsx) 34 | Automatically adds selected precompositions within an active composition to the Render Queue. 35 | 36 | ### [Batch Edit Effect Property](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_EF_BatchEditEffectProp.jsx) 37 | Batch edit properties of effects across one or more compositions selected in the project panel. 38 | 39 | ### [Clean Property Keyframes](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_CleanPropertyKeyframes.jsx) 40 | Removes all keyframes from selected properties across multiple layers. 41 | 42 | ### [Clean Render Queue](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_CleanRenderQueue.jsx) 43 | Deletes all items in the Render Queue with a single click, keeping your project tidy. 44 | 45 | ### [Count Selected Items](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_CountSelectedItems.jsx) 46 | Counts the number of selected items in the Project Panel and displays the result in the Info Panel, providing quick project insights. 47 | 48 | ### [Count Selected Items UI](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_CountSelectedItemsUI.jsx) 49 | A dockable UI to count the selected items in the project panel. 50 | 51 | ### [Create Folder Structure](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_CreateFolderStructure.jsx) 52 | Automatically creates a structured folder hierarchy in your project, including subfolders for inputs, precomps, and outputs. 53 | 54 | ### [Create Masks From Text](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_CreateMasksFromText.jsx) 55 | Converts one or more selected text layers into Solids with Masks. 56 | 57 | ### [Create Shapes From Text](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_CreateShapesFromText.jsx) 58 | Converts one or more selected Text layers into Shape layers. 59 | 60 | ### [Deactivate Effects On Comps](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_DeactivateEffectsOnComps.jsx) 61 | Disable a given effect in the selected compositions. 62 | 63 | ### [Delete All Effects](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_DeleteAllEffects.jsx) 64 | Removes all applied effects from selected layers, helping you start fresh with clean layers. 65 | 66 | ### [Export All Expressions To File](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_ExportAllExpressionsToFile.jsx) 67 | Quickly exports all expressions in the project to files based on the composition. 68 | 69 | ### [Export Layers Expressions To File](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_ExportLayersExpressionsToFile.jsx) 70 | Exports the expressions of the active compositions only. 71 | 72 | ### [Export Missing Footages Paths To File](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_ExportMissingFootagesPathsToFile.jsx) 73 | Exports a list of all missing footage in your project to a text file, making it easier to track and replace missing assets. 74 | 75 | ### [Export Selected Comps Expressions To File](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_ExportSelectedCompsExpressions.jsx) 76 | Exports the expressions of all selected compositions. 77 | 78 | ### [Find and Replace Layer](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_FindAndReplaceLayer.jsx) 79 | Search for a layer by layer name and replace it with another item across compositions. 80 | 81 | ### [Lock And Hide](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_LockAndHide.jsx) 82 | Locks, activates the "shy" mode, and hides all layers within selected compositions, helping protect complex projects from unwanted edits. 83 | 84 | ### [Make Properties Valid Again](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_MakePropertiesValidAgain.jsx) 85 | Added or removed an effect and your property objects became invaid? This scriptlet will help you create references to find your lost properties. 86 | 87 | ### [Organize Project](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_OrganizeProject.jsx) 88 | Sorts project items, tidying up your project based on the item type. 89 | 90 | ### [Randomize Position](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_RandomizePosition.jsx) 91 | Randomize the position of selected layers within a specified range. 92 | 93 | ### [Remove Empty Folders](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_RemoveEmptyFolders.jsx) 94 | Removes unused folders in your project panel. 95 | 96 | ### [Remove Expressions From Layers](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_RemoveExpressionsFromLayers.jsx) 97 | Removes all expressions from selected layers, allowing you to bulk reset animations or values applied via expressions. 98 | 99 | ### [Remove Expressions From Property](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_RemoveExpressionsFromProperty.jsx) 100 | Clears expressions from selected properties only, without affecting entire layers. 101 | 102 | ### [Replace Missing Footage With Solid](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_ReplaceMissingFootageWithSolid.jsx) 103 | Replaces all missing footage in your project with a white solid of the same size, helping you maintain project integrity even when assets are missing. 104 | 105 | ### [Reset Transform](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_ResetTransform.jsx) 106 | Resets the Transformations (Anchor Point, Position, Scale, Rotation, Opacity) of the selected layers, restoring them to their default states. 107 | 108 | ### [Save Frame To PNG](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_SaveFrameToPNG.jsx) 109 | Quickly saves the current frame of your composition as a PNG file, stored next to your project file, for easy reference or documentation. 110 | 111 | ### [Save Project Version Up](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_SaveProjectVersionUp.jsx) 112 | Saves a new version of the current project file, incrementing the version suffix (e.g., from "_v001" to "_v002"), ensuring that your work is always saved incrementally. 113 | 114 | ### [Save Selected Comps As Projects](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_SaveSelectedCompsAsProjects.jsx) 115 | Saves selected compositions in the Project Panel as individual project files, enabling modular project management and easier asset sharing. 116 | 117 | ### [Save Selected Comps to PNG](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_SaveSelectedCompsToPNG.jsx) 118 | Export selected compositions as PNG files for quick previews. 119 | 120 | ### [Select Every Other Layer](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_SelectEveryOtherLayer.jsx) 121 | Selects every other layer starting from the first selected layer, ignoring locked layers, which is useful for quickly modifying or shifting things around. 122 | 123 | ### [Show Layer Size And Position](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_ShowLayerSizeAndPosition.jsx) 124 | Displays the size and position of the selected layer in the Info Panel, which is useful when developing templates. 125 | 126 | ### [Show Masked Layer Box Size](https://github.com/evefalcao/EF_After-Effects-Scriptlets/blob/main/EF_ShowMaskedLayerBoxSize.jsx) 127 | Shows the bounding box size for a layer with one or more masks, helping you understand the true dimensions of masked content. 128 | 129 | --- 130 | 131 | Feel free to explore the code, contribute, or use them in your projects! Do not sell. 132 | --------------------------------------------------------------------------------