Сценарий выполняется правильно в ExtendScript Toolkit, но не в Illustrator

Я написал сценарий, который выбирает несколько путей, дублирует их и применяет "Объект> Искажение конверта> Сделать с верхним объектом" к каждому дубликату нижнего пути со всеми другими путями в выделении с использованием действия (не я не верю, что в DOM есть что-то для непосредственного взаимодействия с конвертами). Итак, я начну с этого:

Он отлично работает в ExtendScript Toolkit, давая мне это:

Но если я выполню скрипт из Illustrator, я получу этот беспорядок:

Вот мой код:

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();

Вот набор действий. Так почему бы мне получать разные результаты из одного и того же сценария? Есть ли способ обойти это изнутри Illustrator?

0 ответов

Вы должны переместить линию 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
}

Единственное отличие: он преобразует самый нижний объект среди выбранных.

Другие вопросы по тегам