基于选中图形颜色数量循环执行操作的Illustrator脚本求助
Illustrator脚本开发:获取选中图形颜色数量并存储颜色名称
需求说明
需要开发Illustrator脚本,实现根据选中图形的颜色数量循环执行指定操作,同时将颜色名称存储到数组中。目前已写出基础框架,但无法获取选中图形的颜色数量并赋值给selcolors变量。
基础脚本框架
var doc = app.activeDocument; var sel = doc.selection[0]; var selcolors = 0; //==================== //Here I need to get how many colors the selected art have and set it to selcolors //==================== for(i = 0; i < selcolors; i++) { //Set of actions }
解决方案代码
以下是完善后的脚本,可实现获取选中图形的唯一颜色数量、存储颜色名称,并基于颜色数量循环执行操作:
var doc = app.activeDocument; var sel = doc.selection[0]; var selcolors = 0; var colorNames = []; // 用于存储颜色名称的数组 // 获取选中图形的所有唯一颜色(含组内元素递归处理) function getUniqueColors(art) { var colors = []; var colorIds = new Set(); // 用集合实现颜色去重 // 检查填充颜色 if (art.fillColor != null && art.fillColor.typename !== "NoColor") { addColor(art.fillColor); } // 检查描边颜色 if (art.stroked && art.strokeColor != null && art.strokeColor.typename !== "NoColor") { addColor(art.strokeColor); } // 递归处理组内子元素 if (art.typename === "GroupItem") { for (var i = 0; i < art.pageItems.length; i++) { var subColors = getUniqueColors(art.pageItems[i]); subColors.forEach(color => addColor(color)); } } // 添加颜色并去重的内部函数 function addColor(color) { var colorKey, colorName; // 根据颜色类型生成唯一标识和名称 switch (color.typename) { case "SpotColor": colorKey = color.spot.name; colorName = color.spot.name; break; case "CMYKColor": colorKey = [color.cyan, color.magenta, color.yellow, color.black].join(","); colorName = `CMYK(${color.cyan},${color.magenta},${color.yellow},${color.black})`; break; case "RGBColor": colorKey = [color.red, color.green, color.blue].join(","); colorName = `RGB(${color.red},${color.green},${color.blue})`; break; case "GrayColor": colorKey = color.gray.toString(); colorName = `Gray(${color.gray})`; break; default: return; // 忽略未知颜色类型 } if (!colorIds.has(colorKey)) { colorIds.add(colorKey); colors.push(color); colorNames.push(colorName); } } return colors; } // 获取选中图形的颜色数组并赋值数量 var selectedColors = getUniqueColors(sel); selcolors = selectedColors.length; // 循环执行指定操作 for (var i = 0; i < selcolors; i++) { // 示例:打印当前处理的颜色名称 $.writeln(`处理第${i+1}种颜色:${colorNames[i]}`); // 在这里替换为你的自定义操作逻辑 // 比如对当前颜色执行样式修改、导出等操作 }
代码关键点说明
- 颜色去重:通过
Set集合存储颜色的唯一标识,避免重复统计同一颜色 - 多类型颜色支持:适配专色、CMYK、RGB、灰度等常见Illustrator颜色类型
- 组元素处理:递归遍历组内的所有子元素,确保选中组时能获取全部颜色
- 颜色名称存储:
colorNames数组会存储每种颜色的可读名称,专色直接用其名称,其他颜色用参数组合字符串
内容的提问来源于stack exchange,提问作者goamalo
相关产品推荐
相关产品推荐

