【问题标题】:Script executes properly in ExtendScript Toolkit, but not Illustrator脚本在 ExtendScript Toolkit 中正确执行,但在 Illustrator 中不正确
【发布时间】:2019-04-23 14:03:35
【问题描述】:

我编写了一个脚本,它选择多个路径,复制它们,然后使用操作在底部路径的每个副本上应用“对象 > 信封扭曲 > 使用顶部对象制作”以及选择中的每个其他路径(不要相信 DOM 中有任何东西可以直接与信封交互)。所以我从这个开始:

https://i.stack.imgur.com/cBKZs.png

它在 ExtendScript Toolkit 中完美运行,给了我这个:

https://i.stack.imgur.com/dLdRz.png

但如果我从 Illustrator 中执行脚本,我会遇到这样的混乱:

https://i.stack.imgur.com/caL0u.png

这是我的代码:

var doc = app.activeDocument;
var sel = app.activeDocument.selection;
var currentLayer = app.activeDocument.activeLayer;

function envelope(){
    var arr = [];
    var bottomObject = sel[sel.length - 1];
    bottomObject.selected = false;
    for (i = 0; i < sel.length - 1; i++){
        arr.push(sel[i]);
        var newObjs = sel[i].duplicate();
        newObjs.zOrder(ZOrderMethod.SENDBACKWARD)
    }

    currentLayer.hasSelectedArtwork = false;

    for (i = 0; i < arr.length; i++){
        var objectsToDistribute = bottomObject.duplicate();
        objectsToDistribute.zOrder(ZOrderMethod.SENDTOBACK);
        arr[i].selected = true;
        objectsToDistribute.selected = true;
        app.doScript('Envelope all', 'scriptTest');
        }
}

envelope();

Here's 动作集。那么为什么我会从同一个脚本中得到不同的结果呢?有没有办法在 Illustrator 中解决这个问题?

【问题讨论】:

    标签: javascript adobe adobe-illustrator extendscript


    【解决方案1】:

    您必须将行 currentLayer.hasSelectedArtwork = false; 移动到循环中。每次迭代都需要清除选择:

    ...
    
    for (i = 0; i < arr.length; i++){
    
        currentLayer.hasSelectedArtwork = false; // <------------- here
    
        var objectsToDistribute = bottomObject.duplicate();
        objectsToDistribute.zOrder(ZOrderMethod.SENDTOBACK);
        arr[i].selected = true;
        objectsToDistribute.selected = true;
        app.doScript('Envelope all', 'scriptTest');
        }
    
    ...
    

    实际上你不需要动作集。 可以通过app.executeMenuCommand('Make Envelope');完成

    这是我的脚本版本:

    var sel = app.activeDocument.selection;      // all the objects that have been selected
    var lowest = sel[sel.length-1];              // the lowest object
    
    for (var i=0; i<sel.length-1; i++) {
        var top       = sel[i].duplicate();      // make a copy of the next object
        var btm       = lowest.duplicate();      // make a copy of the lowest object
        app.selection = null;                    // deselect all
        top.selected  = true;                    // select the top copy
        btm.selected  = true;                    // select the bottom copy
        app.executeMenuCommand('Make Envelope'); // make Envenlope
    }
    

    唯一的区别:它在选定的对象中转换最低的对象。

    【讨论】:

      最近更新 更多