====== Pass Javascript to AE ====== * method: - File > Scripts Menu, to display scripts from scripts folder - File > Scripts > Run Script File - Window > Script with UI + Dockable inside ScriptUI folder - during command line: - afterfx -r script_file_path.jsx - afterfx -s "javascript cmds" - configure file script in Scripts Folder / Startup Folder (after UI open) + Shutdown Folder (before UI close), auto run all in order * stop script by press Esc or Cmd+. ====== ScriptUI Script Structure ====== I mean: those from Window Menu > Script Window ones * for UI + dockable script, the AE will refer the panel as "this" inside the script var myPanel = this; myPanel.add("button", [10,10,100,30], "Tool #1"); * if UI creation is inside a function, it will require passing this as reference in function parameter function createUI(parent){ var curPanel = parent; curPanel.add("button", [10,10,100,30], "Tool #1"); return curPanel; } var myPanel = createUI(this); ====== Normal UI Script Structure ====== I mean: File menu > Scripts > Script Window ones * note "this" won't refer to anything by default unlike those from Window menu, thus, to make the script compatible in either location (File menu or Window menu), you need to check whether AE treat it as a "dockable Panel" or a "simple tool window"; * detection code as function createUI(parent){ var curPanel = (parent instanceof Panel) ? parent : new Window("palette", "Title Here", [100,100,300,300]); curPanel.add("button", [10,10,100,30], "Tool #1"); return curPanel; } var myPanel = createUI(this); // so this may be a Panel from Window menu or None from File menu. ====== Develop AE in Javascript ====== ** to do** ^ file brower | like Piper | ^ parent Zero | parentConstraint, then zero all Archove,Position,Rotation,Scale | ^ instance spacer | instance and push back a step | ====== AE Object Model ====== - system - file - folder - socket - application - settings - project **Project** * renderQueue * renderQueueItem(s) > outputModule(s) * item(s) * folderItem * compItem * layer(s) > properties * proxySource * footageItem * mainSource / proxySource **Source** * solidSource > color * placeHolderSource * fileSource > file ====== Read AE Info ====== **Project Info** * project detail projFilePath = app.project.file; //result: /d/Projects/AE_Test/test_v001.aep projFileName = File.decode(app.project.file.name); // test_v001.aep projBitDepth = app.project.bitsPerChannel; // 8 projItemTotal = app.project.numItems; // total items count in project panel, the whole hierarchy * project panel item // note: the app.project.item(index) use index from 1 cur_item = app.project.item(1); alert(cur_item.selected); // query active status alert(cur_itemName.name); // name in panel alert(cur_itemName.comment); // name in panel alert(cur_itemName.id); // unique ref int in panel alert(cur_itemName.typeName); // "Footage", "Folder", "Composition" cur_item.remove(); // delete itself * project panel creation var compFolder = app.project.items.addFolder("comps"); **Layer Info** * get current layer var result=''; if(app.project.activeItem.selectedLayers.length != 0) { result = app.project.activeItem.selectedLayers[0].name; } alert(result); **Text Layer Info** var result=''; if(app.project.activeItem.selectedLayers.length != 0) { layerName = app.project.activeItem.selectedLayers[0].name; textProp = app.project.activeItem.selectedLayers[0].property("Source Text"); textDocument = textProp.value; result =textDocument.font; // get font name //textDocument.font = "Arial"; // set //textDocument.fontStyle = "Bold"; //textDocument.fontSize = 36; } alert(result ); // ref: https://www.aenhancers.com/viewtopic.php?t=3084 * Layer property link expression myComp = app.project.activeItem; myLayers = myComp.selectedLayers; myLayers[0].property("Opacity").expression='thisComp.layer("Cap 2").transform.opacity'; ====== 3D Space Calculation ====== * 2D_null layer's position set to 3D_null thisComp.layer("3D_null").toComp([0,0,0]);