网上搞来个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--;
... ...