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

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

源码 V1.1

/**
 * 名称:真实复制文件夹
 * 用途:完整复制一个文件夹,里面的合成也会被真实复制,跟原文件夹以及所属合成,互不干扰。静态资源、图片、纯色层等不会被复制,因为他们不会影响引用
 * Vision:1.1
 * 作者:yueli
 * 链接:https://www.yuelili.com/?p=17969
 */

var panelGlobal = this;
var palette = (function () {

    // UI 界面
    var palette = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette");
    if (!(panelGlobal instanceof Panel)) palette.text = "真实复制文件夹";
    palette.orientation = "row";
    palette.alignChildren = ["center", "top"];
    palette.spacing = 10;
    palette.margins = 16;

    var real_folder_btn = palette.add("button", undefined, undefined, { name: "real_folder_btn" });
    real_folder_btn.helpTip = "";  // 小提示
    real_folder_btn.text = "复制";
    real_folder_btn.preferredSize.width = 80;
    real_folder_btn.onClick = real_folder_it

    // 主函数
    function real_folder_it() {

        var proj = app.project;
        var selFolder
        var tarFolder

        for (var i = 1; i <= proj.numItems; i++) {
            var itm = proj.item(i)
            if (itm.selected && itm instanceof FolderItem) {
                selFolder = itm
                tarFolder = app.project.items.addFolder(itm.name + "_output");
                tarFolder.parentFolder = itm.parentFolder
            }
        }
        if (selFolder instanceof FolderItem) {
            app.beginUndoGroup("Duplicate Folder");
            folder_recursive(selFolder, tarFolder)
            app.endUndoGroup();
        }

    }

    // UI 结尾
    palette.layout.layout(true);
    palette.layout.resize();
    palette.onResizing = palette.onResize = function () { this.layout.resize(); }

    if (palette instanceof Window) palette.show();
    return palette;

}());

// 真实复制合成
function duplicateStructure(comp) {
    // Duplicate the incoming comp
    source_name = comp.name
    var comp = comp.duplicate();
    comp.name = source_name

    // 循环合成内的图层与子合成
    for (var i = 1; i <= comp.numLayers; i++) {
        var layer = comp.layer(i);

        // 检查图层是否有源 并且类型为合成
        if (layer.source && layer.source.typeName == "Composition") {

            // 检查是否被复制过了
            check = checkPreviousComps(layer.source.id, previousComps);

            if (check == null) {
                // 子合成还没被复制

                // 存储原合成id 用于校对
                var sourceID = layer.source.id;
                // 替换图层的源, 递归检查子合成中的 子子合成们
                layer.replaceSource(duplicateStructure(layer.source), false);
                // 存储新合成id 用于校正
                var destID = layer.source.id;
                // 添加校正id到数组
                previousComps[sourceID] = destID;
            } else {
                // 如果已经复制了该合成 直接替换源
                layer.replaceSource(check, false);
            }
        }
    }

    // 为了递归,返回复制后的合成
    return comp;
}

// 检查以前的复制,确保一个合成不会复制两次
function checkPreviousComps(checkID, previousComps) {
    if (previousComps[checkID]) {
        return getItemWithID(previousComps[checkID]);
    }
    return null;
}

// 返回具有指定 ID 的项目
function getItemWithID(id) {
    for (x = 1; x <= app.project.numItems; x++) {
        if (app.project.item(x).id == id) {
            return app.project.item(x);
        }
    }
    return null;
}
function duplicate_it(mainComp) {

    if (mainComp && mainComp instanceof CompItem) {
        previousComps = [];
        return duplicateStructure(mainComp);
    }

}

// 文件夹遍历加判断
function folder_recursive(folderGroup, tarfolderGroup) {
    for (var i = 1; i <= folderGroup.numItems; i++) {

        var items = folderGroup.item(i);

        // 判断当前属性是否为文件夹,如果是,则继续遍历
        if (items instanceof FolderItem) {
            newFolder = app.project.items.addFolder(items.name);
            newFolder.parentFolder = tarfolderGroup
            //对每个文件夹逐个操作
            folder_recursive(items, newFolder);
            continue
        }
        // 判断是否为合成
        if (items instanceof CompItem) {

            // if (i > 1 && items.name == folderGroup.item(i - 1).name) {
            //     items.parentFolder = tarfolderGroup
            //     continue
            // }
            // if (i < folderGroup.numItems && !(items.name == folderGroup.item(i + 1).name)) {
            newComp = duplicate_it(items)
            newComp.parentFolder = tarfolderGroup
            // }
        }
    }
}

 

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

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

2021-9-23 18:25:05

AE开发脚本开发

【AE脚本案例】预设小助手

2021-9-26 14:09:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
搜索