蘭雅sRGB 个人笔记 https://262235.xyz
提供编程和电脑应用视频教程,工具和源代码
C, C++, Python Programming, Source Code, Video

旧Hexo博客 | Github | IP定位WebAPI | Docker Hub
编程中文文档 | 网盘分享 | 中文Linux命令

Adobe Illustrator 自动群组脚本学习不完全解析

网上搞来个Adobe Illustrator 自动群组脚本源码,也没有代码注释,也不知道作者是谁,所以阅读起来就困难了。

代码执行会有些小问题,也不知道怎么解决。

先把源码奉上 自动群组.jsx

var AD = activeDocument;
var S = selection;
var len = S.length;
for (var i = len; i--;) {
    S[i]._order = i;
}
while (len > 1) {
    var groupArr = [];
    var a = S.pop();
    var pa = !a.clipped ? a.visibleBounds : a.pathItems[0].visibleBounds;
    groupArr[0] = a;
    len--;
    point: do {
        var exchange = 0;
        for (var i = len; i--;) {
            var b = S[i];
            var pb = !b.clipped ? b.visibleBounds : b.pathItems[0].visibleBounds;
            if (pb[0] >= pa[0] && pb[0] <= pa[2] || pa[0] >= pb[0] && pa[0] <= pb[2] && pb[1] <= pa[1] && pb[1] >= pa[3] || pa[1] <= pb[1] && pa[1] >= pb[3]) {
                groupArr.push(S.splice(i, 1)[0]);
                len--;
                pa = [Math.min(pa[0], pb[0]), Math.max(pa[1], pb[1]), Math.max(pa[2], pb[2]), Math.min(pa[3], pb[3])];
                exchange = 1;
                continue point;
            }
        }
    } while (exchange)
    g_len = groupArr.length;
    g_len > 1 && E_G(groupArr, g_len);
}
AD.selection = null;

function E_G(arr, L) {
    var tempGroup = AD.groupItems.add();
    arr.sort(function(x, y) {
        return x._order > y._order;
    });
    for (var i = 0; i < L; i += 1) {
        arr[i].moveToEnd(tempGroup);
    }
}

一头雾水,看傻了,在学习上面脚本前,先到网上查下群组相关文章查到了一个简单的脚本

//create group   建立群组
var group = activeDocument.groupItems.add();

//add all path items to group  添加文档中所有物件到群组
for (i = 0; i < activeDocument.pathItems.length; i++) {
   // 使用 moveToEnd 把物件添加到群组中
  activeDocument.pathItems[i].moveToEnd(group);
}

//move group 50 mm to left  移动群组50mm
group.translate(-50*2.835, 0);

使用这个能把文档所有物件群组,用到了 groupItems.add 建立群组, moveToEnd 把物件添加到群组,所以上面的代码E_G 函数是群组函数

// E_G 函数是群组函数,把对应数组的编号和个数传入函数进行群组
function E_G(arr, L) {
    var tempGroup = AD.groupItems.add();
    arr.sort(function(x, y) {
        return x._order > y._order;
    });
    for (var i = 0; i < L; i += 1) {
        arr[i].moveToEnd(tempGroup);
    }
}

脚本开头几行,AD 是当前激活文档,S 是选择对象, len 是物件总数, 使用 for 循环给物件编号,记录到 S[x]._order

var AD = activeDocument;  // 当前激活文档
var S = selection;     // 选择对象
var len = S.length;     // 物件总数
// 给物件编号,记录到S[x]._order中
for (var i = len; i--;) {
    S[i]._order = i;
}

程序选法部分 遍历物件计数 len,把各个物件编号分别放一组,调用E_G函数群组

while (len > 1) {
    var groupArr = [];  
    var a = S.pop(); 
    // 物件的边界赋值给pa
    var pa = !a.clipped ? a.visibleBounds : a.pathItems[0].visibleBounds; 
    groupArr[0] = a;
    len--;
  ... ...
本原创文章自由转载,转载请注明本博来源及网址 | 当前页面:兰雅sRGB个人笔记 » Adobe Illustrator 自动群组脚本学习不完全解析