Explorar o código

Adobe Illustrator 方框智能群组,等了好多年自己终于写好了

蘭雅sRGB hai 8 meses
pai
achega
331a1bce8d
Modificáronse 4 ficheiros con 147 adicións e 4 borrados
  1. 7 0
      README.md
  2. BIN=BIN
      img/AIGroup.webp
  3. 11 4
      jsx/LanyaAITools.jsx
  4. 129 0
      jsx/autogroup.jsx

+ 7 - 0
README.md

@@ -1,3 +1,6 @@
+### [捐赠 蘭雅 Adobe Illustrator Scripts 开源项目](https://github.com/hongwenjun/corelvba/blob/main/donate.md)
+- [![](https://raw.githubusercontent.com/hongwenjun/vps_setup/master/img/youtube.png)频道](https://www.youtube.com/sRGB18/videos)   www.youtube.com/sRGB18   [![](https://raw.githubusercontent.com/hongwenjun/vps_setup/master/img/paypal.png)赞赏支持!](https://paypal.me/sRGB18)  https://paypal.me/sRGB18
+
 # Adobe_Illustrator_Scripts
 Some powerfull JSX scripts for extending Adobe Illustrator
 This is a collection of JS scripts for Adobe Illustrator. All scripts created by me, sometimes using parts of other authors’code. 
@@ -17,6 +20,10 @@ This is a collection of JS scripts for Adobe Illustrator. All scripts created by
 ## [Adobe Illustrator JSX script demo using BridgeTalk to communicate with palette window.jsx](./jsx/Adobe%20Illustrator%20JSX%20script%20demo%20using%20BridgeTalk%20to%20communicate%20with%20palette%20window.jsx)
 
 
+## [Adobe Illustrator 方框智能群组,等了好多年自己终于写好了 autogroup.jsx](./jsx/autogroup.jsx)
+![](./img/AIGroup.webp)
+
+
 
 ## Other Adobe Illustrator Scripts
 - https://github.com/creold/illustrator-scripts

BIN=BIN
img/AIGroup.webp


+ 11 - 4
jsx/LanyaAITools.jsx

@@ -1,7 +1,10 @@
 #target illustrator
 #targetengine main
 
-var vs = "illustrator-" + app.version.substr(0, 2);
+var bit = 64;//AI软件系统位数,默认64位,如果点击合集面板按钮没有反应,可以将64改为32。
+var aiVersion = app.version.split('.')[0];
+var vs = "illustrator-" + aiVersion + ".0" + bit;
+
 var IconsFolder = "C:/TSP/icon";
 var micro_distance = "1";
 // 实际代码建立 buildMsg(code) 函数传送代码
@@ -816,8 +819,9 @@ function replace_align_center(objremove) {
     }
 
     // 获得替换源物件中心坐标
-    var bound = NO_CLIP_BOUNDS(sourceObj);
-    var src_xy = new Array((bound[0] + bound[2]) / 2, (bound[1] + bound[3]) / 2);
+    // var bound = NO_CLIP_BOUNDS(sourceObj);
+    // var src_xy = new Array((bound[0] + bound[2]) / 2, (bound[1] + bound[3]) / 2);
+    var src_xy = alterObjectArray[0];
 
     // PageItem.duplicate 复制对象, 需要一个相对对象定位
     var newGroup = sourceObj.parent.groupItems.add();
@@ -830,7 +834,6 @@ function replace_align_center(objremove) {
   }
 }
 
-
 // 读取加载jsxbin文件,传递给AI软件
 function load_jsxbin(file) {
   var file = new File(file);
@@ -842,6 +845,10 @@ function load_jsxbin(file) {
     alert('文件打开失败: ' + file);
   }
 }
+
+
+
+
 //==========  以下插件引用使用互联网各位大大的插件  =================//
 // 标注尺寸增强版 V2.1
 function make_size_plus() { load_jsxbin(IconsFolder + "/makesize.dat"); }

+ 129 - 0
jsx/autogroup.jsx

@@ -0,0 +1,129 @@
+#target illustrator
+exp = prompt("蘭雅提示:选择数量不要过多\n\n请输入容差数值(mm):", "1", "蘭雅AI智能群组 lyvba.com");
+
+var mm = 25.4 / 72;  // pt 和 mm 转换系数
+Box_AutoGroup(exp / mm);
+function Box_AutoGroup(exp) {
+    var doc = activeDocument;
+
+    if (doc.selection.length > 1) {
+        var sr = doc.selection; 	// 定义选择物件
+        var boxes = [];             // 初始化 boxs 为一个空数组
+
+if (sr.length > 3500)  alert("选择物件数量过多, 请选择2500个以下", "蘭雅AI方框智能群组 lyvba.com");
+if (sr.length > 5000)  return;
+        
+// app.activeDocument.selection = null;   //  清除当前选择
+var start = new Date().getTime();
+
+        for (var i = 0; i < sr.length; i++) {
+            var bound = sr[i].geometricBounds;
+            // box 是物件的边界: x , y , w , h   // 左 上 宽 高
+            var box = [bound[0], bound[1], bound[2] - bound[0], bound[1] - bound[3]];
+            if (exp !== 0) {
+                box = expand_bounding_box(box, exp);
+            }
+            boxes.push(box);
+        }
+
+        var groups = groupIntersectingBoxes(boxes);
+
+        // 取出分组的索引,然后按分组群组
+        for (var i = 0; i < groups.length; i++) {
+            var len = groups[i].length;
+            if (len > 1) {
+                var newGroup = doc.groupItems.add();
+                for (var j = 0; j < len ;j++) {
+                    var item = sr[groups[i][j]];
+                    item.moveToEnd(newGroup);
+                }
+            }
+        }
+
+var end = new Date().getTime();
+alert("运行时间:" + (end - start).toFixed(2) + "毫秒\n选择物件: " + sr.length + " 个, 批量群组后共 " + groups.length + "个群组",
+    "蘭雅AI方框智能群组 lyvba.com");
+
+// 输出记录
+// var content = "";
+// for (var i = 0; i < Groups.length; i++) {
+//     content += Groups[i] + "\n";
+// }
+// for (var i = 0; i < boxs.length; i++) {
+//     var box = boxs[i];
+//     content += box[0] + ", " + box[1] + ", " + box[2] + ", " + box[3] + "\n";
+// }
+// // 写入文本文件
+// var file = new File("R:/boxs.txt"); // 修改为你想要保存的位置
+// file.open('w'); // 打开文件以写入
+// file.write(content); // 写入内容
+// file.close(); // 关闭文件
+    }
+}
+
+// 扩展边界框
+function expand_bounding_box(box, exp) {
+    return [
+        box[0] - exp,      // 向左扩展
+        box[1] - exp,      // 向上扩展
+        box[2] + 2 * exp,  // 宽度扩展
+        box[3] + 2 * exp   // 高度扩展
+    ];
+}
+
+// 判断两个矩形是否相交
+function intersectRect(rect1, rect2) {
+    return !(rect1[0] > rect2[0] + rect2[2] ||
+        rect2[0] > rect1[0] + rect1[2] ||
+        rect1[1] < rect2[1] - rect2[3] ||
+        rect2[1] < rect1[1] - rect1[3]);
+}
+
+// 分组相交的矩形
+function groupIntersectingBoxes(boxes) {
+    var parent = [];
+    for (var i = 0; i < boxes.length; i++) {
+        parent[i] = i;  // 初始化 parent 数组
+    }
+
+    function find(x) {
+        if (parent[x] !== x) {
+            parent[x] = find(parent[x]);
+        }
+        return parent[x];
+    }
+
+    function union(x, y) {
+        var rootX = find(x);
+        var rootY = find(y);
+        if (rootX !== rootY) {
+            parent[rootY] = rootX;
+        }
+    }
+
+    for (var i = 0; i < boxes.length; i++) {
+        for (var j = i + 1; j < boxes.length; j++) {
+            if (intersectRect(boxes[i], boxes[j])) {
+                union(i, j);
+            }
+        }
+    }
+
+    var groupsMap = {};
+    for (var i = 0; i < boxes.length; i++) {
+        var root = find(i);
+        if (!groupsMap[root]) {
+            groupsMap[root] = [];
+        }
+        groupsMap[root].push(i);
+    }
+
+    var groups = [];
+    for (var key in groupsMap) {
+        if (groupsMap.hasOwnProperty(key)) {
+            groups.push(groupsMap[key]);
+        }
+    }
+
+    return groups;
+}