【脚本案例】自定义导入序列

需求

遍历目标文件夹,将制定文件夹内的序列文件导入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;

}());

 

给TA充电
共{{data.count}}人
人已充电
AE开发脚本开发

【脚本案例】表达式小助手

2021-9-23 13:04:38

AE开发脚本开发

【AE脚本案例】真实复制文件夹

2021-9-25 7:30:41

2 条回复 A文章作者 M管理员
  1. 点击导入按键后不弹出选择文件夹对话框,问题出在哪?

    • 不用纠结 这个是给群友私人定制的。不算正常的案例

个人中心
今日签到
搜索