【AE脚本】案例:如何用脚本实现True Duplicate

介绍

直接复制合成

知识点

项目id:在内部用于标识项目的唯一且持久的标识号。

源码

// 名称:直接复制 V1.01
// 作者: Brennan Chapman
// 创建合成副本,包括子合成.
// 当然,如果某个合成重复使用,只会复制一次
// 其他的重复项也会指向该合成

function duplicateStructure(comp) {
    // 复制合成
    var comp = comp.duplicate();

    // 循环遍历合成里的图层,如果有子合成,则进行检测
    for (var i = 1; i <= comp.numLayers; i++) {

        var layer = comp.layer(i);
        //检查是否为合成
        if (layer.source && layer instanceof CompItem) {

            // 检查合成是否被复制
            check = checkPreviousComps(layer.source.id);

            if (check == null) {
                // 子合成没有复制过

                // 保存合成id到合成集
                var sourceID = layer.source.id;

                // 替换图层源,并检查子合成
                layer.replaceSource(duplicateStructure(layer.source), false);
                
                // 存储新合成的ID 并储存在检查列表里
                var destID = layer.source.id;
                previousComps[sourceID] = destID;
            } else {
                // 替换已经有源的合成
                layer.replaceSource(check, false);
            }
        }
    }

    // 为了再次检查,返回合成对象
    return comp;
}

// 判断合成有没有复制过
function checkPreviousComps(checkID) {
    if (previousComps[checkID]) {
        return getItemWithID(previousComps[checkID]);
    }
    return null;
}

// 返回项目item的独特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;
}

mainComp = app.project.activeItem;
if (mainComp && mainComp instanceof CompItem) {
    app.beginUndoGroup("Duplicate Hierarchy");

    previousComps = [];

    // Go!
    duplicateStructure(mainComp);

    app.endUndoGroup();
} else if (!mainComp) {
    alert("请选择一个合成进行复制.");
} else {
    alert("ERROR: 没有选择合成.n 请在项目面板重新选择.");
}

 

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

【脚本演示】修改纯色层尺寸为1920*1080

2020-4-8 21:21:06

AE开发脚本开发

【AE脚本】案例:把信息传递到系统剪贴板

2020-4-8 22:48:17

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