autogroup.jsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #target illustrator
  2. exp = prompt("蘭雅提示:选择数量不要过多\n\n请输入容差数值(mm):", "1", "蘭雅AI智能群组 lyvba.com");
  3. var mm = 25.4 / 72; // pt 和 mm 转换系数
  4. Box_AutoGroup(exp / mm);
  5. function Box_AutoGroup(exp) {
  6. var doc = activeDocument;
  7. if (doc.selection.length > 1) {
  8. var sr = doc.selection; // 定义选择物件
  9. var boxes = []; // 初始化 boxs 为一个空数组
  10. if (sr.length > 3500) alert("选择物件数量过多, 请选择2500个以下", "蘭雅AI方框智能群组 lyvba.com");
  11. if (sr.length > 5000) return;
  12. // app.activeDocument.selection = null; // 清除当前选择
  13. var start = new Date().getTime();
  14. for (var i = 0; i < sr.length; i++) {
  15. var bound = sr[i].geometricBounds;
  16. // box 是物件的边界: x , y , w , h // 左 上 宽 高
  17. var box = [bound[0], bound[1], bound[2] - bound[0], bound[1] - bound[3]];
  18. if (exp !== 0) {
  19. box = expand_bounding_box(box, exp);
  20. }
  21. boxes.push(box);
  22. }
  23. var groups = groupIntersectingBoxes(boxes);
  24. // 取出分组的索引,然后按分组群组
  25. for (var i = 0; i < groups.length; i++) {
  26. var len = groups[i].length;
  27. if (len > 1) {
  28. var newGroup = doc.groupItems.add();
  29. for (var j = 0; j < len ;j++) {
  30. var item = sr[groups[i][j]];
  31. item.moveToEnd(newGroup);
  32. }
  33. }
  34. }
  35. var end = new Date().getTime();
  36. alert("运行时间:" + (end - start).toFixed(2) + "毫秒\n选择物件: " + sr.length + " 个, 批量群组后共 " + groups.length + "个群组",
  37. "蘭雅AI方框智能群组 lyvba.com");
  38. // 输出记录
  39. // var content = "";
  40. // for (var i = 0; i < Groups.length; i++) {
  41. // content += Groups[i] + "\n";
  42. // }
  43. // for (var i = 0; i < boxs.length; i++) {
  44. // var box = boxs[i];
  45. // content += box[0] + ", " + box[1] + ", " + box[2] + ", " + box[3] + "\n";
  46. // }
  47. // // 写入文本文件
  48. // var file = new File("R:/boxs.txt"); // 修改为你想要保存的位置
  49. // file.open('w'); // 打开文件以写入
  50. // file.write(content); // 写入内容
  51. // file.close(); // 关闭文件
  52. }
  53. }
  54. // 扩展边界框
  55. function expand_bounding_box(box, exp) {
  56. return [
  57. box[0] - exp, // 向左扩展
  58. box[1] - exp, // 向上扩展
  59. box[2] + 2 * exp, // 宽度扩展
  60. box[3] + 2 * exp // 高度扩展
  61. ];
  62. }
  63. // 判断两个矩形是否相交
  64. function intersectRect(rect1, rect2) {
  65. return !(rect1[0] > rect2[0] + rect2[2] ||
  66. rect2[0] > rect1[0] + rect1[2] ||
  67. rect1[1] < rect2[1] - rect2[3] ||
  68. rect2[1] < rect1[1] - rect1[3]);
  69. }
  70. // 分组相交的矩形
  71. function groupIntersectingBoxes(boxes) {
  72. var parent = [];
  73. for (var i = 0; i < boxes.length; i++) {
  74. parent[i] = i; // 初始化 parent 数组
  75. }
  76. function find(x) {
  77. if (parent[x] !== x) {
  78. parent[x] = find(parent[x]);
  79. }
  80. return parent[x];
  81. }
  82. function union(x, y) {
  83. var rootX = find(x);
  84. var rootY = find(y);
  85. if (rootX !== rootY) {
  86. parent[rootY] = rootX;
  87. }
  88. }
  89. for (var i = 0; i < boxes.length; i++) {
  90. for (var j = i + 1; j < boxes.length; j++) {
  91. if (intersectRect(boxes[i], boxes[j])) {
  92. union(i, j);
  93. }
  94. }
  95. }
  96. var groupsMap = {};
  97. for (var i = 0; i < boxes.length; i++) {
  98. var root = find(i);
  99. if (!groupsMap[root]) {
  100. groupsMap[root] = [];
  101. }
  102. groupsMap[root].push(i);
  103. }
  104. var groups = [];
  105. for (var key in groupsMap) {
  106. if (groupsMap.hasOwnProperty(key)) {
  107. groups.push(groupsMap[key]);
  108. }
  109. }
  110. return groups;
  111. }