吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 69|回复: 0
收起左侧

[其他原创] Ae重命名脚本

[复制链接]
lws4955 发表于 2025-12-22 12:49
目的:使用ae时方便重命名项目名称、合成名称、图层名称、素材名称、文字层内容
操作系统:win10 (mac未测试)
软件测试版本:ae2020
[JavaScript] 纯文本查看 复制代码
#target aftereffects

// AE重命名工具
// 支持:整个项目、合成名称、图层名称、素材名称、文字层内容
// 功能:搜索/替换,使用正则表达式,对于锁定的图层先解除锁定再重命名,并恢复原来锁定的状态

// 创建主窗口
var win = new Window("palette", "AE重命名工具", undefined, {resizeable: false});
win.orientation = "column";
win.alignChildren = "left";
win.spacing = 8;
win.margins = [15, 15, 15, 15];

// === 重命名类型 ===
var typeGroup = win.add("group");
typeGroup.add("statictext", undefined, "重命名类型:");
var renameType = win.add("dropdownlist", undefined, ["整个项目", "合成名称", "图层名称", "素材名称", "文字层内容"]);
renameType.selection = 0;
renameType.size = [180, 25];

// === 查找内容 ===
var searchGroup = win.add("group");
searchGroup.orientation = "column";
searchGroup.alignChildren = "left";
searchGroup.add("statictext", undefined, "查找内容:");
var searchInput = win.add("edittext", undefined, "");
searchInput.characters = 30;
searchInput.size = [200, 25];

// === 替换为 ===
var replaceGroup = win.add("group");
replaceGroup.orientation = "column";
replaceGroup.alignChildren = "left";
replaceGroup.add("statictext", undefined, "替换为:");
var replaceInput = win.add("edittext", undefined, "");
replaceInput.characters = 30;
replaceInput.size = [200, 25];

// === 选项 ===
var optionsGroup = win.add("group");
optionsGroup.orientation = "column";
optionsGroup.alignChildren = "left";
var regexCheck = optionsGroup.add("checkbox", undefined, "使用正则表达式 (Regex)");
var caseSensitiveCheck = optionsGroup.add("checkbox", undefined, "区分大小写");

// === 按钮 ===
var buttonGroup = win.add("group");
buttonGroup.alignment = "center";
var renameAllBtn = buttonGroup.add("button", undefined, "全部重命名");
renameAllBtn.size = [120, 35];

// === 状态 ===
var statusText = win.add("statictext", undefined, "就绪");
statusText.alignment = "center";

// === 按钮点击事件 ===
renameAllBtn.onClick = function() {
    try {
        // 检查AE环境
        if (typeof app === 'undefined' || !app.project) {
            alert("请在Adobe After Effects中运行此脚本");
            return;
        }
        
        // 获取参数
        var type = renameType.selection.text;
        var search = searchInput.text;
        var replace = replaceInput.text;
        var useRegex = regexCheck.value;
        var caseSensitive = caseSensitiveCheck.value;
        
        if (!search) {
            alert("请输入查找内容");
            return;
        }
        
        // 更新状态
        statusText.text = "处理中...";
        
        // 执行重命名
        var result = performRename(type, search, replace, useRegex, caseSensitive);
        
        // 更新状态
        statusText.text = "完成!重命名了 " + result.count + " 个项目";
        
        // 移除提示框,只保留状态文本显示
        // 如果有锁定的图层被解锁并重命名,在状态文本中显示额外信息
        if (result.unlocked > 0) {
            statusText.text = "完成!重命名了 " + result.count + " 个项目\n解锁并重命名了 " + result.unlocked + " 个锁定的图层";
        }
        
    } catch (e) {
        alert("错误: " + e.toString());
        statusText.text = "错误: " + e.message;
    }
};

// === 执行重命名 ===
function performRename(type, search, replace, useRegex, caseSensitive) {
    var result = {
        count: 0,
        unlocked: 0  // 记录解锁并重命名的图层数量
    };
    
    // 开始撤消组
    app.beginUndoGroup("AE重命名");
    
    try {
        if (type === "整个项目") {
            // 重命名整个项目中的所有类型
            var totalResult = renameAllInProject(search, replace, useRegex, caseSensitive);
            result.count = totalResult.count;
            result.unlocked = totalResult.unlocked;
        } else {
            // 只重命名特定类型
            switch(type) {
                case "合成名称":
                    var compResult = renameComps(search, replace, useRegex, caseSensitive);
                    result.count = compResult.count;
                    break;
                case "图层名称":
                    var layerResult = renameLayers(search, replace, useRegex, caseSensitive);
                    result.count = layerResult.count;
                    result.unlocked = layerResult.unlocked;
                    break;
                case "素材名称":
                    var footageResult = renameFootage(search, replace, useRegex, caseSensitive);
                    result.count = footageResult.count;
                    break;
                case "文字层内容":
                    var textResult = renameText(search, replace, useRegex, caseSensitive);
                    result.count = textResult.count;
                    result.unlocked = textResult.unlocked;
                    break;
                default:
                    alert("不支持的类型: " + type);
            }
        }
    } catch (e) {
        throw e;
    } finally {
        // 结束撤消组
        app.endUndoGroup();
    }
    
    return result;
}

// === 处理名称 ===
function processName(original, search, replace, useRegex, caseSensitive) {
    var result = original;
    
    // 应用搜索/替换
    if (search && search !== "") {
        if (useRegex) {
            try {
                var flags = caseSensitive ? "g" : "gi";
                var regex = new RegExp(search, flags);
                result = result.replace(regex, replace || "");
            } catch (e) {
                alert("正则表达式错误: " + e.message);
                return original;
            }
        } else {
            if (caseSensitive) {
                result = result.split(search).join(replace || "");
            } else {
                // 不区分大小写的简单替换
                var temp = result.toLowerCase();
                var searchLower = search.toLowerCase();
                var replaceWith = replace || "";
                var output = "";
                var lastIndex = 0;
                var index = temp.indexOf(searchLower);
                
                while (index >= 0) {
                    output += result.substring(lastIndex, index) + replaceWith;
                    lastIndex = index + search.length;
                    index = temp.indexOf(searchLower, lastIndex);
                }
                
                output += result.substring(lastIndex);
                result = output;
            }
        }
    }
    
    return result;
}

// === 重命名整个项目中的所有元素 ===
function renameAllInProject(search, replace, useRegex, caseSensitive) {
    var totalResult = {
        count: 0,
        unlocked: 0
    };
    
    // 重命名所有合成
    var compResult = renameComps(search, replace, useRegex, caseSensitive);
    totalResult.count += compResult.count;
    
    // 重命名所有图层
    var layerResult = renameLayers(search, replace, useRegex, caseSensitive);
    totalResult.count += layerResult.count;
    totalResult.unlocked += layerResult.unlocked;
    
    // 重命名所有素材
    var footageResult = renameFootage(search, replace, useRegex, caseSensitive);
    totalResult.count += footageResult.count;
    
    // 重命名所有文字内容
    var textResult = renameText(search, replace, useRegex, caseSensitive);
    totalResult.count += textResult.count;
    totalResult.unlocked += textResult.unlocked;
    
    return totalResult;
}

// === 重命名合成 ===
function renameComps(search, replace, useRegex, caseSensitive) {
    var count = 0;
    
    // 整个项目中的所有合成
    for (var i = 1; i <= app.project.numItems; i++) {
        var item = app.project.item(i);
        if (item instanceof CompItem) {
            var newName = processName(item.name, search, replace, useRegex, caseSensitive);
            if (newName !== item.name) {
                item.name = newName;
                count++;
            }
        }
    }
    
    return { count: count };
}

// === 重命名图层 ===
function renameLayers(search, replace, useRegex, caseSensitive) {
    var count = 0;
    var unlocked = 0;
    
    // 整个项目中的所有图层
    for (var i = 1; i <= app.project.numItems; i++) {
        var item = app.project.item(i);
        if (item instanceof CompItem) {
            for (var j = 1; j <= item.numLayers; j++) {
                var layer = item.layer(j);
                
                // 记录图层原来的锁定状态
                var wasLocked = layer.locked;
                
                // 如果图层被锁定,先解除锁定
                if (wasLocked) {
                    layer.locked = false;
                    unlocked++;
                }
                
                // 重命名图层
                var newName = processName(layer.name, search, replace, useRegex, caseSensitive);
                if (newName !== layer.name) {
                    layer.name = newName;
                    count++;
                }
                
                // 恢复原来的锁定状态
                if (wasLocked) {
                    layer.locked = true;
                }
            }
        }
    }
    
    return { count: count, unlocked: unlocked };
}

// === 重命名素材 ===
function renameFootage(search, replace, useRegex, caseSensitive) {
    var count = 0;
    
    // 整个项目中的所有素材
    for (var i = 1; i <= app.project.numItems; i++) {
        var item = app.project.item(i);
        if (item instanceof FootageItem) {
            var newName = processName(item.name, search, replace, useRegex, caseSensitive);
            if (newName !== item.name) {
                item.name = newName;
                count++;
            }
        }
    }
    
    return { count: count };
}

// === 重命名文字层内容 ===
function renameText(search, replace, useRegex, caseSensitive) {
    var count = 0;
    var unlocked = 0;
    
    // 整个项目中的所有文字层
    for (var i = 1; i <= app.project.numItems; i++) {
        var item = app.project.item(i);
        if (item instanceof CompItem) {
            for (var j = 1; j <= item.numLayers; j++) {
                var layer = item.layer(j);
                
                // 记录图层原来的锁定状态
                var wasLocked = layer.locked;
                
                // 如果图层被锁定,先解除锁定
                if (wasLocked) {
                    layer.locked = false;
                    unlocked++;
                }
                
                // 检查是否为文字层并重命名文字内容
                if (layer.property("ADBE Text Properties")) {
                    try {
                        var textProp = layer.property("ADBE Text Properties").property("ADBE Text Document");
                        if (textProp) {
                            var textValue = textProp.value.toString();
                            var newText = processName(textValue, search, replace, useRegex, caseSensitive);
                            if (newText !== textValue) {
                                textProp.setValue(newText);
                                count++;
                            }
                        }
                    } catch (e) {
                        // 跳过无法处理的图层
                    }
                }
                
                // 恢复原来的锁定状态
                if (wasLocked) {
                    layer.locked = true;
                }
            }
        }
    }
    
    return { count: count, unlocked: unlocked };
}

// === 显示窗口 ===
if (typeof app !== 'undefined' && app.project) {
    win.center();
    win.show();
} else {
    alert("请在Adobe After Effects中运行此脚本");
}


蓝奏云:https://wwanw.lanzouq.com/i92Ht3e7pklg
1.png
2.png

AE重命名脚本.zip

2.9 KB, 下载次数: 0, 下载积分: 吾爱币 -1 CB

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-12-25 15:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表