需求
遍历目标文件夹,将制定文件夹内的序列文件导入AE,并且预合成,放入当前选择文件夹下的01_cel文件夹与_footage内
知识点
遍历本地文件夹并判断、遍历项目面板文件夹、AE项目文件夹的父子关系、导入设置、创建合成等相关知识。
UI的话 在线构建就行:https://scriptui.joonas.me/
如何使用
新建:创建“导入序列.txt”并打开,复制源码,粘贴入该txt。
重命名:把“导入序列.txt”改为“导入序列.jsx”
放置:丢在AE根目录下的 Scripts\ScriptUI Panels内即可
其他:其他自定义内容,请看 源码 – “用户自定义”区
难点
由于openDlg获取文件夹对话框太难用了,这里使用saveDlg,然后重新New 一个Folder对象
源码
// Author:Yueli
// 源码:https://www.yuelili.com/?p=17943
// Vision: 1.2
var panelGlobal = this;
var palette = (function () {
// UI 界面
var palette = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette");
if (!(panelGlobal instanceof Panel)) palette.text = "导入序列";
palette.orientation = "column";
palette.alignChildren = ["center", "top"];
palette.spacing = 10;
palette.margins = 16;
var seq_import = palette.add("button", undefined, undefined, { name: "seq_import" });
seq_import.text = "导入";
seq_import.onClick = import_seq
// 主函数区
function import_seq() {
// 用户自定义区
// 1.导入文件夹名称
var name_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q"]
var footage_list = ["png", "tga"]
// 2.初始加载文件夹(就是对话框文件夹)默认为根目录 你可以把 ~ 改成诸如 "F:\\work\\AE project"
var folderObj = new Folder('')
// 3.是否弹窗:true则错误操作弹窗 false则不弹窗
var user_alert = false
// 判断项目面板选择的文件夹
var proj = app.project;
var trg_folder
var footage_folder
var cel_folder
var comp_stage
for (var i = 1; i <= proj.numItems; i++) {
var itm = proj.item(i)
if (itm.selected) {
trg_folder = itm
}
}
// 文件夹遍历加判断
function folder_recursive(folderGroup) {
for (var i = 1; i <= folderGroup.numItems; i++) {
var items = folderGroup.item(i);
// 判断当前属性是否为文件夹,如果是,则继续遍历
if (items instanceof FolderItem) {
//对每个文件夹逐个操作
if (items.name === "_footage" && !(footage_folder instanceof FolderItem)) {
footage_folder = items
}
if (items.name === "01_cel" && !(cel_folder instanceof FolderItem)) {
cel_folder = items
}
folder_recursive(items);
continue;
}
if (items.name === "01_comp_stage") {
comp_stage = items
}
}
}
// 判断是否选择了文件夹,如果没有选择,则遍历所有文件夹
if (!(trg_folder instanceof FolderItem)) {
trg_folder = app.project.rootFolder
}
folder_recursive(trg_folder)
// 判断遍历项目文件夹结果,并选择导入文件夹
if (footage_folder instanceof FolderItem && cel_folder instanceof FolderItem && comp_stage instanceof CompItem) {
var source_folder = folderObj.saveDlg('请选择一个文件夹,点右下角保存');
} else {
if (user_alert == true) {
alert("当前层级目录未找到指定2个文件夹与1个合成")
}
}
//
// 判断是否在数组内 ES不自带 所以要加一个
function isInArray(arr, value) {
for (var i = 0; i < arr.length; i++) {
if (value === arr[i]) {
return true;
}
}
return false;
}
// 判断用户是否取消选择文件夹对话框
if (source_folder != null) {
source_folder = new Folder(source_folder.path)
}
// 判断是否选择了文件夹
if (source_folder instanceof Folder) {
var file_list = source_folder.getFiles()
app.beginUndoGroup("Import Seq");
// 循环导入文件
for (var i = 0; i < file_list.length; i++) {
// 判断是否为用户设置的关键词
if (isInArray(name_list, file_list[i].name)) {
if (file_list[i] instanceof Folder) {
// 遍历文件夹
var files = file_list[i].getFiles()
for (var j = 0; j < files.length; j++) {
if (isInArray(footage_list, files[j].name.substr(-3, 3))) {
file = files[j]
break
}
}
// 导入设置
var import_option = new ImportOptions(file)
import_option.sequence = true
item = app.project.importFile(import_option)
// 合成设置
var comp = app.project.items.addComp(file_list[i].name, item.width, item.height, item.pixelAspect, item.duration, item.frameRate)
// 合成添加item 场景合成添加item
comp.layers.add(item)
comp_stage.layers.add(comp)
// 素材与合成 放入父级文件夹
item.parentFolder = footage_folder
comp.parentFolder = cel_folder
}
}
}
app.endUndoGroup();
}
}
palette.layout.layout(true);
palette.layout.resize();
palette.onResizing = palette.onResize = function () { this.layout.resize(); }
if (palette instanceof Window) palette.show();
return palette;
}());
点击导入按键后不弹出选择文件夹对话框,问题出在哪?
不用纠结 这个是给群友私人定制的。不算正常的案例