landboy 发表于 2024-7-4 09:15:26

AI JavaScripts 中心对齐替换,昨晚写的




AIJavaScripts 中心对齐替换,昨晚写的。
今早又改了一下,减少计算获取中心点的次数,感觉效率有提高

// 拼版中心对齐
function replace_align_center() {
var docRef = activeDocument;
// 判断选择物件2个以上
if (docRef.selection.length > 1) {
    // 定义选择物件
    mySelection = docRef.selection;

    // 最上层物件为替换源
    var sourceObj = docRef.selection;

    // 定义数组用来保存选择物件的中心坐标 # 计算中心坐标
    // x = (left + right) / 2    // y = (top + bottom) / 2
    var alterObjectArray = new Array();
    for (var i = 0; i < mySelection.length; i++) {
      var bound = NO_CLIP_BOUNDS(mySelection);
      var sel_xy = new Array((bound + bound) / 2, (bound + bound) / 2);
      alterObjectArray.push(sel_xy);
    }
    // 删除用来定位的下层物件
    for (var i = 1; i < mySelection.length; i++) {
      mySelection.remove();
    }

    // 获得替换源物件中心坐标
    var bound = NO_CLIP_BOUNDS(sourceObj);
    var src_xy = new Array((bound + bound) / 2, (bound + bound) / 2);

    // PageItem.duplicate 复制对象, 需要一个相对对象定位
    var newGroup = sourceObj.parent.groupItems.add();
    for (var i = 1; i < alterObjectArray.length; i++) {
      var newobj = sourceObj.duplicate(newGroup, ElementPlacement.PLACEATEND);
      var move_xy = new Array(alterObjectArray - src_xy, alterObjectArray - src_xy);
      newobj.translate(move_xy, move_xy);
    }
    sourceObj.remove();
}
}


昨晚旧版,要每次计算中心点
   // PageItem.duplicate 复制对象, 需要一个相对对象定位
    var newGroup = sourceObj.parent.groupItems.add();
    for (var i = 1; i < alterObjectArray.length; i++) {
      
      var bound = NO_CLIP_BOUNDS(sourceObj);
      var src_xy = new Array((bound + bound) / 2, (bound + bound) / 2);
      var move_xy = new Array(alterObjectArray - src_xy, alterObjectArray - src_xy);

      sourceObj.translate(move_xy, move_xy);// 移动到中心对齐位置
      sourceObj.duplicate(newGroup, ElementPlacement.PLACEATEND);
    }


landboy 发表于 2024-7-4 09:42:42

caishikun12 发表于 2024-7-4 09:35
大神,支持多层蒙版对象对其吗,



目前测试支持蒙板的,速度也还挺不错的,比老外写的稳定

landboy 发表于 2024-7-10 11:01:55

本帖最后由 landboy 于 2024-7-10 11:05 编辑

数码快印 发表于 2024-7-9 14:01
不清楚哪里有问题 AI 2018版本
因为还有一个边界处理的函数,本帖子里没补上来



landboy 发表于 2024-7-22 09:16:05

XuanKaiser 发表于 2024-7-21 10:05
大佬,为啥你这个代码跑不动啊,我的2019点开来没反应。

之前发的源码,只是发我自己写的部分,蒙板支持算法是从老外的里面提取修改的,有网友直接使用没法运行。
所以现在发的这个是完整版的,直接下载就可以使用。

针对之前问没法使用的网友: 把下面这个NO_CLIP_BOUNDS 函数补全也就可以正常使用了


function NO_CLIP_BOUNDS(a){function c(h){if(IS_CLIP(h))b.push(h.pageItems);else if("GroupItem"==h.constructor.name)try{for(var l=h.pageItems.length,k=0;k<l;k+=1)c(h.pageItems)}catch(m){}else b.push(h)}var b=[];c(a);var d=[],e=[],g=[];a=[];for(var f=0;f<b.length;f+=1)d=b.geometricBounds,e=b.geometricBounds,g=b.geometricBounds,a=b.geometricBounds;d=MIN_IN_ARRAY(d);e=MAX_IN_ARRAY(e);g=MAX_IN_ARRAY(g);a=MIN_IN_ARRAY(a);return}
function IS_CLIP(a){try{if("GroupItem"==a.constructor.name&&a.clipped)return!0}catch(c){}return!1}function MAX_IN_ARRAY(a){for(var c=a,b=0;b<a.length;b+=1)a>c&&(c=a);return c}function MIN_IN_ARRAY(a){for(var c=a,b=0;b<a.length;b+=1)a<c&&(c=a);return c};
其实我之前很多回复里已经写清楚了,让你们自己去找NO_CLIP_BOUNDS 只是你们都是太懒了

caishikun12 发表于 2024-7-4 09:35:20

大神,支持多层蒙版对象对其吗,

landboy 发表于 2024-7-4 09:36:06


下面这个是论坛别人发的中心对齐替换,
下载试了一下,不支持蒙板物件中心对齐
还是自己写的中心对齐替换好

高效:提高效率 在illustrator中按需拼版
https://www.52cnp.com/thread-21818-1-1.html



turh123 发表于 2024-7-5 09:03:45

复制上面的代码,保存为jsx,AI为什么没作用呢?

landboy 发表于 2024-7-5 12:54:03

turh123 发表于 2024-7-5 09:03
复制上面的代码,保存为jsx,AI为什么没作用呢?

因为这是代码片段,核心功能。
还有个函数 你自己搜索就可以找到了

hutang 发表于 2024-7-5 17:29:49

landboy 发表于 2024-7-5 12:54
因为这是代码片段,核心功能。
还有个函数 你自己搜索就可以找到了

不会呀,大佬,你能给个直接能运行的那个吗,我这个有点笨,

朱朱侠 发表于 2024-7-8 11:23:48

牛人,功能非常好。

landboy 发表于 2024-7-8 16:49:18

朱朱侠 发表于 2024-7-8 11:23
牛人,功能非常好。

谢谢夸奖,功能也是迭代了多次,然后从网上找到处理蒙板的代码,才逐渐完善的。

数码快印 发表于 2024-7-9 14:01:37

不清楚哪里有问题 AI 2018版本
页: [1] 2
查看完整版本: AI JavaScripts 中心对齐替换,昨晚写的