Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • EspaƱol
      • FranƧais
      • PortuguĆŖs
  • ę—„ęœ¬čŖžć‚³ćƒŸćƒ„ćƒ‹ćƒ†ć‚£
  • ķ•œźµ­ ģ»¤ė®¤ė‹ˆķ‹°
7

ExtendScript Toolkit Download Link

Community Expert ,
Dec 10, 2019 Dec 10, 2019

I notice that with later versions of FrameMaker, the ExtendScript Toolkit is not automatically installed. Can someone provide a download link for the latest version of the ExtendScript Toolkit? Thank you.

TOPICS
Scripting
20.2K
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Enthusiast , Dec 11, 2019 Dec 11, 2019

Hi Rick,

ESTK is now downloadable via github:

https://github.com/Adobe-CEP/CEP-Resources/tree/master/ExtendScript-Toolkit

Hope this helps.

Translate
Enthusiast ,
Dec 11, 2019 Dec 11, 2019

Hi Rick,

ESTK is now downloadable via github:

https://github.com/Adobe-CEP/CEP-Resources/tree/master/ExtendScript-Toolkit

Hope this helps.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Mar 14, 2022 Mar 14, 2022
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Apr 08, 2025 Apr 08, 2025
LATEST

// Template Browser UI for After Effects
// Author: [TĆŖn cį»§a bįŗ”n hoįŗ·c Ä‘į»ƒ trống]
// Version: 1.5 (User Base - DETAILED onClick LOGGING) // ĐÔnh dẄu rõ

(function createTemplateBrowser(thisObj) {

// --- CONFIGURATION --- (Giữ nguyên)
var defaultTemplateRootFolder = "";
var thumbnailExtensions = ["png", "jpg", "jpeg", "gif"];
var thumbnailSize = 120;
var columns = 3;
var itemSpacing = 8;
var overlayTextSize = 10;
// --- END CONFIGURATION ---

var scriptName = "Template Browser v1.5 (Detailed onClick Log)";
var settingsSection = "TemplateBrowserSettings_v1_5";

var templateRootFolder = null;
var templatesByFolder = {};

// --- Logging Function --- (Giữ nguyên)
function logMessage(message) { $.writeln(scriptName + ": " + new Date().toLocaleTimeString() + " - " + message); }
logMessage("Script execution started.");

// --- UI CREATION --- (Giữ nguyên từ code bẔn cung cẄp)
var win = (thisObj instanceof Panel) ? thisObj : new Window("palette", scriptName, undefined, { resizeable: true, dockable: true }); /*...*/ folderGroup = win.add("panel", undefined, "Template Root Folder"); /*...*/ folderBtn = folderGroup.add("button", undefined, "Select Folder..."); /*...*/ folderPathText = folderGroup.add("statictext", undefined, "Not selected", { truncate: "middle" }); /*...*/ listPanel = win.add("panel", undefined, "Templates (Click Thumbnail to Add to Active Comp)"); /*...*/ scrollableGroup = listPanel.add("group"); /*...*/ controlGroup = win.add("group"); /*...*/ refreshBtn = controlGroup.add("button", undefined, "Refresh List"); logMessage("UI elements created.");

// --- FUNCTIONS ---

// selectFolder, findThumbnail, scanFolderRecursively (Giữ nguyên từ code bẔn cung cẄp)
function selectFolder(title, defaultPath) { /*...*/ }
function findThumbnail(templateFile) { /*...*/ }
function scanFolderRecursively(folderToScan, relativePathBase) { /*...*/ }
// findCompByName (Gốc - KhĆ“ng đệ quy)
function findCompByName(folderItem, compName) { /*...*/ }
// findCompByNameRecursive (ThĆŖm vĆ o Ä‘į»ƒ onClick gį»i)
function findCompByNameRecursive(searchItem, compName) { /*...*/ } // Giữ nguyĆŖn hĆ m đệ quy từ cĆ”c bįŗ£n sį»­a trước


// --- loadAndDisplayTemplates (GIį»® NGUYÊN TỪ CODE Bįŗ N CUNG Cįŗ¤P, chỉ thay thįŗæ onClick bĆŖn trong) ---
function loadAndDisplayTemplates() {
logMessage("--- Starting loadAndDisplayTemplates (Base: User v1.5) ---");
// ... (ToĆ n bį»™ phįŗ§n trĆŖn cį»§a hĆ m nĆ y giữ nguyĆŖn y hệt code gốc v1.5 bįŗ”n đʰa) ...
// ... (Phần quét thư mỄc, lẄy key, tẔo header, tẔo grid...) ...

// BĆŖn trong vòng lįŗ·p for (var i = 0; ...) Ä‘į»ƒ tįŗ”o item:
// ... (Phần tẔo itemStackGroup, gÔn data, tẔo image/placeholder, tẔo text) ...

try {
// ... (code tẔo itemStackGroup, image, text giữ nguyên) ...
var itemStackGroup = currentRow.add("group {orientation:'stack', preferredSize:["+thumbnailSize+", "+thumbnailSize+"], alignment:['left','top']}");
itemStackGroup.templatePath = templateInfo.path; itemStackGroup.templateName = templateInfo.name; itemStackGroup.helpTip = "Click to Add '" + templateInfo.fileName + "' to Active Comp";
if (templateInfo.thumbFile) { var thumbImage = itemStackGroup.add("image", undefined, templateInfo.thumbFile); thumbImage.alignment = ['fill', 'fill']; } else { var ph=itemStackGroup.add('panel',undefined,""); ph.alignment=['fill','fill']; ph.add('statictext',[5,5,thumbnailSize-10,thumbnailSize-10],"No\nThumb",{multiline:true,justify:'center'}); }
var nameText = itemStackGroup.add("statictext", undefined, templateInfo.name); nameText.alignment = ['fill', 'bottom']; nameText.justify = 'center';

// ======================================================
// ===== onClick vį»›i LOGGING SIÊU CHI TIįŗ¾T =====
// ======================================================
itemStackGroup.onClick = function() {
var tPath = this.templatePath;
var tName = this.templateName; // Tên comp cần tìm
logMessage("\n\n------- onClick START -------");
logMessage("Attempting to process:");
logMessage(" Template Path: " + tPath);
logMessage(" Comp Name: " + tName);

// --- Step 1: Check Active Comp ---
logMessage("Step 1: Checking Active Composition...");
var activeComp = null;
try {
activeComp = app.project.activeItem;
if (!activeComp) {
logMessage(" --> FAILED: app.project.activeItem is null or undefined.");
alert("Please open or select a composition first."); return;
}
if (!(activeComp instanceof CompItem)) {
logMessage(" --> FAILED: Active item is not a CompItem. Type: " + activeComp.typeName);
alert("Please select a Composition in the timeline, not a " + activeComp.typeName + "."); return;
}
if (!activeComp.isValid) {
logMessage(" --> FAILED: Active composition reference is invalid (maybe closed or deleted?).");
alert("The selected composition seems invalid. Please check your project."); return;
}
logMessage(" --> OK: Active Comp is '" + activeComp.name + "' (ID: " + activeComp.id + ")");
} catch (e1) {
logMessage(" --> ERROR during Active Comp Check: " + e1.toString());
alert("Error checking the active composition:\n" + e1.toString()); return;
}

// --- Step 2: Check Template File ---
logMessage("Step 2: Checking Template File Path...");
var fileToImport = null;
try {
fileToImport = new File(tPath);
if (!fileToImport.exists) {
logMessage(" --> FAILED: File does not exist at path: " + tPath);
alert("Error: Template file not found:\n" + tPath); return;
}
logMessage(" --> OK: File exists.");
} catch (e2) {
logMessage(" --> ERROR during File Check: " + e2.toString());
alert("Error creating file object:\n" + e2.toString()); return;
}


// --- Step 3: Import File ---
logMessage("Step 3: Importing File...");
var importedRootItem = null;
var undoGroupName = "Import and Add Template: " + tName;
try {
app.beginUndoGroup(undoGroupName);
var importOptions = new ImportOptions(fileToImport);
importedRootItem = app.project.importFile(importOptions);
if (!importedRootItem) {
logMessage(" --> FAILED: app.project.importFile() returned null.");
throw new Error("Import process failed or returned null. Check file permissions or if the file is corrupted.");
}
if (!importedRootItem.isValid) {
logMessage(" --> FAILED: Imported item reference is invalid immediately after import.");
// Attempt to find it by name just in case the reference got lost
var foundByName = null;
for(var i=1; i<= app.project.numItems; i++){
if(app.project.item(i).name == importedRootItem.name){ foundByName = app.project.item(i); break;}
}
if(foundByName && foundByName.isValid){
importedRootItem = foundByName;
logMessage(" (Recovered item reference by name)");
} else {
throw new Error("Imported item became invalid immediately. Cannot proceed.");
}
}
logMessage(" --> OK: Import successful. Item: '" + importedRootItem.name + "', Type: " + importedRootItem.typeName + ", ID: " + importedRootItem.id);
} catch (e3) {
logMessage(" --> ERROR during Import: " + e3.toString());
alert("Error during import:\n" + e3.toString());
app.endUndoGroup(); // End undo group on error too
return;
}


// --- Step 4: Find Target Composition ---
logMessage("Step 4: Finding Target Composition '" + tName + "'...");
var compToAdd = null;
try {
// QUAN TRỌNG: Gį»i hĆ m ĐỆ QUY
compToAdd = findCompByNameRecursive(importedRootItem, tName);

if (!compToAdd) {
logMessage(" --> FAILED: Comp '" + tName + "' not found via recursive search within '" + importedRootItem.name + "'.");
} else if (!(compToAdd instanceof CompItem)) {
logMessage(" --> FAILED: Found item named '" + tName + "', but it's not a Composition (Type: " + compToAdd.typeName + ").");
compToAdd = null; // Mark as not found if wrong type
} else if (!compToAdd.isValid) {
logMessage(" --> FAILED: Found Comp '" + tName + "', but its reference is invalid.");
compToAdd = null; // Mark as not found if invalid
} else {
logMessage(" --> OK: Found valid CompItem: '" + compToAdd.name + "' (ID: " + compToAdd.id + ")");
}
} catch (e4) {
logMessage(" --> ERROR during Composition Search: " + e4.toString());
alert("Error while searching for the composition:\n" + e4.toString());
compToAdd = null; // Ensure it's null on error
}

// --- Step 5: Add to Timeline ---
logMessage("Step 5: Adding to Timeline...");
if (compToAdd) { // Chỉ tiįŗæp tỄc nįŗæu compToAdd hợp lệ
var newLayer = null;
try {
// Kiểm tra lẔi activeComp lần nữa cho chắc
if (!activeComp || !activeComp.isValid) { throw new Error("Active comp became invalid before adding layer."); }

logMessage(" Attempting: activeComp.layers.add(compToAdd)...");
newLayer = activeComp.layers.add(compToAdd); // ThĆŖm layer

if (!newLayer) {
logMessage(" --> FAILED: layers.add() returned null or undefined.");
throw new Error("Adding layer failed silently (returned null).");
}
logMessage(" --> OK: Layer added! Name: '" + newLayer.name + "', Index: " + newLayer.index);

// --- Step 6: Set Start Time ---
logMessage("Step 6: Setting Layer Start Time...");
try {
var currentTime = activeComp.time;
logMessage(" Current Time: " + currentTime);
newLayer.startTime = currentTime;
logMessage(" --> OK: Set startTime to " + currentTime);
} catch (e6) {
logMessage(" --> WARNING: Could not set startTime: " + e6.toString());
// KhĆ“ng phįŗ£i lį»—i nghiĆŖm trį»ng, vįŗ«n tiįŗæp tỄc
}
} catch (e5) {
logMessage(" --> ERROR during Add Layer/Set Time: " + e5.toString());
alert("Error adding layer to timeline:\n" + e5.toString());
}
} else {
logMessage(" --> SKIPPED: Target composition was not found or invalid in Step 4.");
alert("Could not find a valid composition named '" + tName + "' in the imported file.\nPlease check the comp name inside the AEP.");
// CĆ¢n nhįŗÆc xóa item đã import
// try { if(importedRootItem && importedRootItem.isValid) importedRootItem.remove(); logMessage("Removed imported item.");} catch(e){}
}

// --- Step 7: End Undo ---
logMessage("Step 7: Ending Undo Group...");
try{
app.endUndoGroup();
logMessage(" --> OK: Undo group ended.");
} catch(e7){
logMessage(" --> WARNING: Could not end undo group: " + e7.toString());
}
logMessage("------- onClick FINISHED -------");

}; // ===== KẾT THÚC onClick SIÊU CHI TIẾT =====
// ===========================================

columnCount++;
} catch (itemError) { logMessage("!!! ERROR creating UI item: " + itemError); }
// ... (Phần còn lẔi của vòng lặp for (var i...) và for (var k...) giữ nguyên) ...
}
// ... (Phįŗ§n cuối cį»§a hĆ m loadAndDisplayTemplates giữ nguyĆŖn) ...
} // End loadAndDisplayTemplates

// --- EVENT HANDLERS & SETTINGS (Giữ nguyên từ code bẔn cung cẄp) ---
folderBtn.onClick = function() { /*...*/ loadAndDisplayTemplates(); };
refreshBtn.onClick = function() { /*...*/ loadAndDisplayTemplates(); };
function loadSettings() { /*...*/ }

// --- INITIALIZATION --- (Giữ nguyên)
logMessage("Script Initialization..."); loadSettings(); if (templateRootFolder && templateRootFolder.exists) { loadAndDisplayTemplates(); } else { loadAndDisplayTemplates(); } win.onResizing = win.onResize = function () { this.layout.resize(); };

// --- SHOW WINDOW --- (Giữ nguyên)
logMessage("Attempting to show UI..."); if (win instanceof Window) { win.center(); win.show(); } else { win.layout.layout(true); win.layout.resize(); } logMessage("--- Script Initialization Complete ---");

})(this);

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines