After Effects 自動匯入素材和分類的指令碼
阿新 • • 發佈:2018-12-19
最近一個遊戲專案需要用到AE做合成,可是渲出來的素材有那麼多曾,藝術家自己一個一個往裡導確實很費時間,於是給他們寫了個自動匯入素材的工具,並且根據背景和角色層自動打好組,建立資料夾,還建立了comp,將素材放進去,根據序列的長度來設定comp的長度,還能根據檔案的名字給裡面的comp命名,將檔案命名規範,最後又加了個為藝術家自動設定輸出路徑和視訊名字的功能。 工具的介面如下:
碼如下:
{
function importFile(file){
try{
var importOptions = new ImportOptions(file);
app. project.importFile(importOptions);
}
catch(error){}
}
function detectForSequence(files){
var searcher = new RegExp("[0-9]+");
var imageFileSearcher = new RegExp("(mov|avi|mpg)$", "i");
var parseResults = new Array;
var parseNum = new Array;
for (var i=0; i < files.length; i++){
var imageFileResult = imageFileSearcher.exec(files[i].name);
if (!imageFileResult){
var currentResult = searcher.exec(files[i].name);
parseNum.push(currentResult);
if (currentResult){
parseResults[ parseResults.length] = currentResult[0];
}
else{
parseResults[parseResults.length] = null;
}
}else{
parseResults[parseResults.length] = null;
}
}
parseNum.sort();
difference = parseNum[parseNum.length - 1] - parseNum[0] + 1
if (difference == parseNum.length & parseNum.length > 1){
return files[0];
}else{
return null;
}
// var result = null;
// for (var i=0; i < parseResults.length; ++i){
// if (parseResults[i]){
// if (!result){
// result = files[i];
// }
// }
// else{
// result = null;
// break;
// }
// }
// return parseNum;
// return result;
}
function processFolder(folderPath, value){
var files = folderPath.getFiles();
var sequenceStartFile = detectForSequence(files);
value.push(files.length);
if (sequenceStartFile){
try{
var importOptions = new ImportOptions(sequenceStartFile);
importOptions.sequence = true;
var importImg = app.project.importFile(importOptions);
importImg.conformFrameRate = 24;
} catch (error){ /*alert(error.line.toString() + "v" + error.toString())*/
}
}
for (var i = 0; i < files.length; i++) {
if (files[i] instanceof File){
if (!sequenceStartFile){
importFile(files[i]);
}
}
if (files[i] instanceof Folder){
processFolder(files[i], value);
}
}
}
function findItemIndexFromSelection(){
var index = null;
selected = app.project.selection;
if (!selected){
alert("Please select one item at least")
}
firstSelectedName = selected[0].name;
allItems = app.project.items;
for (var i = 1; i < allItems.length; i++) {
itemName = allItems[i].name;
if (itemName == firstSelectedName){
index = i;
break;
}
}
return index;
}
function getItemSize(index){
var itemWidth = app.project.item(index).width;
var itemHeight = app.project.item(index).height;
return [itemWidth, itemHeight];
}
function getItemDuration(index){
var duration = app.project.item(index).duration;
var frameRate = app.project.item(index).frameRate;
var length = duration * frameRate;
if (length == 0)
return 150;
else
return length;
}
function getItemByName(name){
for (var i=1; i<app.project.numItems; i++){
if (app.project.item(i).name == name){
return app.project.item(i);
}
}
}
function deleteItemByName(name){
try{
var item = getItemByName(name);
item.remove();
} catch(error){}
}
function createComp(compName, compParent, compSize, compLength){
var comp = app.project.items.addComp(compName, compSize[0], compSize[1], 1, compLength/24, 24);
comp.parentFolder = compParent;
var selected_num = app.project.selection.length;
var seledcted_items = app.project.selection;
for (var i = 0; i < selected_num; i++) {
item = seledcted_items[i];
comp.layers.add(item);
item.parentFolder = compParent;
item.selected = false;
}
return comp;
}
function createFolderForCG(path){
var folder_path = Folder(path);
var files = folder_path.getFiles()
var result = new Array;
var parent = getItemByName("02)CG");
for (var i = 0; i < files.length; i++) {
var folder_name = "CHR_" + files[i].name;
var folder_item = app.project.items.addFolder(folder_name);
folder_item.parentFolder = parent;
var path_comp_grp = [folder_name, files[i]];
result.push(path_comp_grp);
}
// alert(result);
return result;
}
function processBG(path){
app.beginUndoGroup("Process BG");
deleteItemByName('BG_00_015')
var num_value = new Array;
processFolder(Folder(path), num_value);
var index = findItemIndexFromSelection();
var widthHeight = getItemSize(index);
var length = getItemDuration(index);
var project_name = app.project["file"].name;
var first = project_name.indexOf("_");
var last = project_name.lastIndexOf("_");
var valid_part = project_name.substring(first, last - 2);
var BG_comp_name = "BG" + valid_part.substr(0, valid_part.length - 1)
BGFolder = getItemByName("BG");
createComp(BG_comp_name, BGFolder, widthHeight, length)
app.endUndoGroup();
}
function processCG(path){
app.beginUndoGroup("Process CG");
deleteItemByName('CHR_XXX');
character_folder_path = createFolderForCG(path);
for (var i = 0; i < character_folder_path.length; i++) {
var folder_path = character_folder_path[i];
var num_value = new Array;
processFolder(Folder(folder_path[1]), num_value);
length = num_value[num_value.length - 1];
var CGFolder = getItemByName(folder_path[0])
var index = findItemIndexFromSelection();
var widthHeight = getItemSize(index);
// var length = getItemDuration(index);
var CH_name = folder_path[0]
createComp(CH_name, CGFolder, widthHeight, length)
}
app.endUndoGroup();
}
function alterCompName(){
app.beginUndoGroup("Alter Comp Name");
var comp_item = getItemByName("KGA_00_000_L1_01");
var project_name = app.project["file"].name;
var dot_index = project_name.indexOf(".");
var main_comp = project_name.substr(0, dot_index)
comp_item.name = main_comp;
app.endUndoGroup();
}
function alterOutputCompName(){
app.beginUndoGroup("Alter Output CompName");
var comp_item = getItemByName("KGA_00_000_L1");
var project_name = app.project["file"].name;
var last = project_name.lastIndexOf("_");
var output_comp_name = project_name.substr(0, last);
comp_item.name = output_comp_name;
app.endUndoGroup();
}
function importResourses(){
var folder_path = Folder.selectDialog ("Choose a source folder.");
if (folder_path != null){
if (!app.project){
app.newProject();
}
var files = folder_path.getFiles();
for (index in files){
if (files[index].name == "BG"){
processBG(files[index]);
}
if (files[index].name == "CH"){
processCG(files[index]);
}
}
alert("Finish importing");
}
alterCompName();
alterOutputCompName();
}
function createRenderQueue(){
app.beginUndoGroup("Create Render Queue");
var qtemplate = "H.264";
var project_path = app.project["file"].path;
var project_name = app.project["file"].name;
var output_path = project_path + "/" + project_name.replace('aep', 'mp4');
var activeItem = app.project.activeItem;
if(activeItem != null && activeItem instanceof CompItem){
var theRender = app.project.renderQueue.items.add(activeItem);
theRender.outputModules[1].applyTemplate(qtemplate);
if (theRender.status == RQItemStatus.QUEUED){
for (j = 1; j <= theRender.numOutputModules; ++j) {
var curOM = theRender.outputModule(j);
curOM.file = new File(output_path);
}
}
}
app.endUndoGroup();
}
function initUI(thisObj){
UIunit=5;
UIwidth=175;
UIheight=UIunit*18;
var pal = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Create Comp", [0, 0, UIwidth, UIheight]);
// UI.main = new Window("palette", "Create Comp", undefined, {resizeable:true}); //[0, 0, UIwidth, UIheight]{resizeable:true}
var createCompButton = pal.add("button", [UIunit,UIunit*1,UIwidth-UIunit,UIunit*8.5], "Import Resources");
var createRenderQueueButton = pal.add("button", [UIunit, UIunit*10, UIwidth-UIunit,UIunit*17], "Create Render Queue");
if (pal instanceof Window)
{
pal.center();
pal.show();
}
else
{
pal.layout.layout(true);
}
// UI.main.center();
// UI.main.show();
createCompButton.onClick = importResourses;
createRenderQueueButton.onClick = createRenderQueue;
}
// var UI = new Object();
initUI(this);
}