Иллюстратор javascript - цикл по массиву pathItems влияет только на последний элемент? - PullRequest
0 голосов
/ 03 июля 2019

Я пишу javascript для Illustrator, чтобы скопировать выбранные элементы на другой слой, а затем изменить заливку и обводку результирующих элементов, чтобы они не имели заливки и имели одинаковый цвет обводки.В основном это работает - часть дублирования работает нормально, но циклический просмотр массива результирующих элементов для изменения свойств каждого элемента, похоже, влияет только на последний элемент в массиве.

main();

function main() {
    //Check if there is a document
    if (app.documents.length == 0) {
        return;
    } else {
        //Check Cutter layer exists, get reference to it if it does
        var doc = app.activeDocument;
        var currentLayer = doc.activeLayer;
        if (existCheck(doc.layers, "Cutter")) {
            var cutterLayer = doc.layers.getByName("Cutter");
            //Get reference to selection (as Array)
            var mySelection = app.selection;
            //Iterate through array of selected objects, duplicating each one onto Cutter layer
            for (var i = 0; i < mySelection.length; i++) {
                mySelection[i].duplicate(cutterLayer, ElementPlacement.PLACEATEND);
            }
            currentLayer.hasSelectedArtwork = false;
            var myPathItems = cutterLayer.pathItems;
            for (var i = 0; i < myPathItems.length; i++) {
                myPathItems[i].filled = false;
                myPathItems[i].stroked = true;
                myPathItems[i].strokeWidth = 1;
                myPathItems[i].strokeColor = doc.swatches.getByName("Cutter").color;
            }
        }
    }
}

//Function to check if a names item exists in an array
function existCheck(myArray, name) {
    for (i = 0; i < myArray.length; i++) {
        if (myArray[i].name == name) {
            return true;
        } else {
            return false;
        }
    }
}

Я бы ожидал, что у всех ссылочных элементов пути будет цвет обводки образца "Резак" и нет заливки - но только последний элемент делает.Другие элементы не имеют заливки или обводки.

1 Ответ

0 голосов
/ 04 июля 2019

Перепишите свой цикл for с замыканием

/*rewrite your loop like this*/
  for (var i = 0; i < myPathItems.length; i++) {
    (function () {
      var index = i;
      myPathItems[index].filled = false;
      myPathItems[index].stroked = true;
      myPathItems[index].strokeWidth = 1;
      myPathItems[index].strokeColor = doc.swatches.getByName("Cutter").color;
    })();
  }

IIFE используется для немедленного запуска функции.Эффект такой же, как и в исходном коде, за исключением того, что теперь индекс переменной является локальным для IIFE, поэтому он не будет меняться каждый раз, когда меняется переменная i.

...