Adobe Illustrator 选择同等宽高对象的脚本失效求修复方案
Adobe Illustrator 同尺寸对象选择脚本修复说明
原代码核心问题
selectionArray初始化错误:原代码将其定义为数字类型0,无法存储筛选出的页面对象,需修改为数组类型[]- 遍历范围缺失:
docRef.pageItems仅能获取页面顶层未嵌套的对象,无法识别组、复合路径、子图层内的元素 - 尺寸匹配逻辑缺陷:Illustrator计算宽高时易产生浮点精度误差,直接使用
==判断会遗漏实际尺寸一致的对象,需增加精度容差 - 无最终选中逻辑:筛选完成后未将匹配的对象数组赋值给
app.selection,不会触发界面的选中效果 - 缺少前置校验:未判断当前是否有打开的文档、是否已选中参考对象,空选运行会直接报错
修复后完整代码
// 前置校验:避免空运行报错 if (app.documents.length < 1 || app.selection.length < 1) { alert("请先打开文档并选中1个参考对象"); exit(); } var docRef = app.activeDocument; var refItem = app.selection[0]; var objWidth = refItem.width; var objHeight = refItem.height; var selectionArray = []; // 尺寸匹配精度容差,单位为pt,可根据需求调整 var tolerance = 0.001; // 递归遍历所有层级的页面对象 function traverseItems(container) { for (var i = 0; i < container.pageItems.length; i++) { var currentItem = container.pageItems[i]; // 匹配宽高 if (Math.abs(currentItem.width - objWidth) < tolerance && Math.abs(currentItem.height - objHeight) < tolerance) { selectionArray.push(currentItem); } // 递归遍历容器内的嵌套对象 if (["GroupItem", "CompoundPathItem", "Layer"].indexOf(currentItem.typename) > -1) { traverseItems(currentItem); } } } traverseItems(docRef); // 执行选中操作 app.selection = selectionArray;
可选优化
如果需要将宽高互换的对象也判定为尺寸匹配(例如适配旋转、翻转后的对象),可以将尺寸匹配的判断条件替换为以下内容:
if ( (Math.abs(currentItem.width - objWidth) < tolerance && Math.abs(currentItem.height - objHeight) < tolerance) || (Math.abs(currentItem.width - objHeight) < tolerance && Math.abs(currentItem.height - objWidth) < tolerance) )
内容的提问来源于stack exchange,提问作者H Jones
相关产品推荐
相关产品推荐

