SOURCE

// AI_ColorSwap_Test.jsx
// 5组测试专用脚本 - 保存后运行
var testPalettes = [
  {id: "TEST-01", main: "#2A4B7C", accent: "#5D8CAE", highlight: "#FF6B6B", neutral: "#F0F4F8"},
  {id: "TEST-02", main: "#D4B8BF", accent: "#A5C1A6", highlight: "#8A6A8F", neutral: "#E8E2D9"},
  {id: "TEST-03", main: "#D7A367", accent: "#C56B4F", highlight: "#5D8E7B", neutral: "#F5EDE0"},
  {id: "TEST-04", main: "#6B4EFC", accent: "#00D1B2", highlight: "#FF3E7F", neutral: "#1A1A24"},
  {id: "TEST-05", main: "#3A6B4A", accent: "#8DB38B", highlight: "#D4A55E", neutral: "#E1D7C8"}
];

var doc = app.activeDocument;
var outputFolder = Folder.selectDialog("选择输出文件夹");

// 1. 检查必需编组
var requiredGroups = ["主色编组", "辅助色编组", "点缀色编组", "中性色编组"];
var groups = {};

for (var i = 0; i < requiredGroups.length; i++) {
  var groupName = requiredGroups[i];
  try {
    groups[groupName] = doc.groupItems.getByName(groupName);
  } catch (e) {
    alert("错误:找不到编组 '" + groupName + "'\n请确保模板包含此编组");
    exit();
  }
}

// 2. 添加进度条
var progressWindow = new Window("palette", "换色进度", undefined);
progressWindow.orientation = "column";
progressWindow.preferredSize.width = 300;
var progressBar = progressWindow.add("progressbar", undefined, 0, testPalettes.length);
progressBar.preferredSize.width = 280;
var statusText = progressWindow.add("statictext", undefined, "准备开始...");
progressWindow.show();

// 3. 主循环
for (var i = 0; i < testPalettes.length; i++) {
  var palette = testPalettes[i];
  statusText.text = "处理: " + palette.id + " (" + (i+1) + "/" + testPalettes.length + ")";
  progressBar.value = i+1;
  
  // 更新颜色
  changeGroupColor(groups["主色编组"], palette.main);
  changeGroupColor(groups["辅助色编组"], palette.accent);
  changeGroupColor(groups["点缀色编组"], palette.highlight);
  changeGroupColor(groups["中性色编组"], palette.neutral);
  
  // 导出JPG
  exportJPG(outputFolder, palette.id);
  
  // 添加延迟避免UI卡顿
  $.sleep(200);
}

progressWindow.close();
alert("测试完成!5组文件已导出");

// 更换编组颜色函数
function changeGroupColor(group, hexColor) {
  var newColor = createRGBColor(hexColor);
  processPageItems(group.pageItems, newColor);
}

// 递归处理所有对象
function processPageItems(items, color) {
  for (var j = 0; j < items.length; j++) {
    var item = items[j];
    
    if (item.typename === "GroupItem") {
      processPageItems(item.pageItems, color); // 递归处理子编组
    } 
    else if (item.filled && item.fillColor.typename !== "GradientColor") {
      item.fillColor = color; // 更新纯色填充
    }
    // 文字对象特殊处理
    else if (item.typename === "TextFrame") {
      item.textRange.characterAttributes.fillColor = color;
    }
  }
}

// 创建RGB颜色
function createRGBColor(hex) {
  hex = hex.replace("#", "");
  if (hex.length !== 6) return new RGBColor(); // 安全校验
  
  var color = new RGBColor();
  color.red = parseInt(hex.substring(0, 2), 16) * 100 / 255;
  color.green = parseInt(hex.substring(2, 4), 16) * 100 / 255;
  color.blue = parseInt(hex.substring(4, 6), 16) * 100 / 255;
  return color;
}

// 导出JPG函数
function exportJPG(folder, filename) {
  var exportFile = new File(folder.fsName + "/" + filename + ".jpg");
  
  // 检查文件是否已存在
  if (exportFile.exists) {
    if (!confirm("文件 " + filename + ".jpg 已存在,要覆盖吗?")) return;
  }
  
  var exportOptions = new ExportOptionsJPEG();
  exportOptions.qualitySetting = 90; // 高质量
  exportOptions.artBoardClipping = true; // 按画板裁切
  exportOptions.antiAliasing = true; // 抗锯齿
  
  try {
    doc.exportFile(exportFile, ExportType.JPEG, exportOptions);
  } catch (e) {
    alert("导出错误: " + e.message);
  }
}
console 命令行工具 X clear

                    
>
console