[AI CC2022] Скрипт для замены одних объектов другими

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Доброго дня!
Искал скрипт для массовой замены одних объектов другими объектами для иллюстратора. Нашел хороший на официальном форме adobe community , понравилось, что есть рандомизатор и объект вставляется по размеру заменяемого объекта, вот этот скрипт:
Код:
var n = prompt("", 8, "No. of items to randomly replace tiles:");
for (var i = app.selection.length - 1; i > n - 1; i--) {
    var pos = app.selection[i].position,
    w = app.selection[i].width,
    h = app.selection[i].height;
    app.selection[i].remove();
    var index = Math.floor(Math.random() * n);
    var duple = app.selection[index].duplicate(app.activeDocument, ElementPlacement.PLACEATEND);
    duple.position = pos;
    duple.width = w;
    duple.height = h;
}

B.png


Но в данном виде скрипт работает не так, как хотелось.
Проблема в том, что он может не задействовать один из объектов замены (отметил красный квадрат на скриншоте ниже) или может использовать один и тот же объект два или более раз (отметил два синих квадрата на скриншоте ниже) :

кркцооцк (1).png



Может быть кто-то знает, что нужно исправить в скрипте, чтобы данная проблема не возникала? Автор скрипта на форуме adobe community упомянул, что это довольно простой по структуре скрипт. Заранее благодарю!
 

Gad

Сообщения
2 958
Реакции
1 390
понравилось, что есть рандомизатор
При этом жалуетесь что
что он может не задействовать один из объектов замены
?
Тогда рандомизатор надо сделать менее рандомныи и это будет уже не рандомизатор :) При достаточно большой выборке элементов эта проблема как бы сама исчезнет:)
 
Последнее редактирование:

lev

Модератор
15 лет на форуме
Сообщения
2 100
Реакции
2 002
Можно чуть развернуть логику.
Сейчас меняются все объекты на случайный из набора, а можно менять случайный объект на очередной из набора. Т.е. будут задействованы все объекты для замены. Надеюсь не путанно написал.
 

lev

Модератор
15 лет на форуме
Сообщения
2 100
Реакции
2 002
Дык убирать объект из набора/списка для замен после его обработки. Тем более, он физически удаляется даже в текущем коде.
 

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Можно чуть развернуть логику.
Сейчас меняются все объекты на случайный из набора, а можно менять случайный объект на очередной из набора. Т.е. будут задействованы все объекты для замены. Надеюсь не путанно написал.
1-тест.png




2-тест.png
 

lev

Модератор
15 лет на форуме
Сообщения
2 100
Реакции
2 002
И чего у меня не так?
Берём случайный объект из меняемых, меняем на первый из набора для подстановки, объект удаляется
берём случайным образом следующий объект, меняем на второй
при исчерпании объектов для подстановки, начинаем брать их заново
делаем, пока есть объекты для замены.
 

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
И чего у меня не так?
Берём случайный объект из меняемых, меняем на первый из набора для подстановки, объект удаляется
берём случайным образом следующий объект, меняем на второй
при исчерпании объектов для подстановки, начинаем брать их заново
делаем, пока есть объекты для замены.
мне нужно сразу 100-150 объектов минимум заменять, для этого поштучное нажатие скрипта не подойдет
 

lev

Модератор
15 лет на форуме
Сообщения
2 100
Реакции
2 002
Вы с ума сошли?
Я с ума сошел?
Лыжи не едут?

Из темы устраняюсь.
 
Последнее редактирование:

Gad

Сообщения
2 958
Реакции
1 390

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
32 168
Реакции
10 547
Я тоже нихрена не понял, но из картинки вангую, что вам нужно два скрипта - первый для замены, второй для перемешивания - так?
 

almastu

15 лет на форуме
Сообщения
482
Реакции
74
ну давайте уже тогда перепоставим задачу: нужен не рандомный заменитель, а статистически равномерный перемешанный. Так, имхо, будет понятнее. Это потому исходный скрипт не подходит - задача другая
 
  • Спасибо
Реакции: Gad

Gad

Сообщения
2 958
Реакции
1 390
ну давайте уже тогда перепоставим задачу: нужен не рандомный заменитель, а статистически равномерный перемешанный. Так, имхо, будет понятнее. Это потому исходный скрипт не подходит - задача другая
Собственно Лев такой алгоритм и предложил :)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
32 168
Реакции
10 547
Так бы сразу и сказали
Подумаешь бином Ньютона, вместо




var index = Math.floor(Math.random() * n);

поставьте

var index=i%n;
 
  • Спасибо
Реакции: Gene

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Так бы сразу и сказали
Подумаешь бином Ньютона, вместо




var index = Math.floor(Math.random() * n);

поставьте

var index=i%n;
Это работает, спасибо большое! Прошу меня извинить за вероятно не самое точное изначальное описание проблемы. Слабо разбираюсь в теме скриптов