[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中运行此脚本");
}