[AI CC-CC2021] Помощь с маленьким скриптом

bullion

Участник
Топикстартер
Сообщения
3
Реакции
0
Друзья, доброго времени суток! Я "ноль" в скриптинге, поэтому прошу помощи.
Я сделал по учебнику Adobe маленький скрипт для illustrator. Суть его в рандомном применении Graphic Styles к выбранным объектам.
Он работает, но есть один нюанс: данный скрипт не понимает выделения. Т.е. я выделяю например 4 из 10 фигур, запускаю скрипт и он рандомно окрашивает 4 фигуры, НО не те что я выбрал, а видимо в порядке их расположения. (а может любые четыре). Кол-во окрашенных фигур всегда соответствует выбранному количеству, но не соответствует конкретно выбранным объектам. Надеюсь понятно объяснил.

Прошу помощи: как сделать что бы скрипт работал только на указанные выделением объекты.


Вот сам скрипт (js):

doc = app.activeDocument;

sel = app.activeDocument.selection;

for (i=0; i<sel.length; i++)

{

styleIndex = Math.round(Math.random() * (doc.graphicStyles.length - 1));

doc.graphicStyles[styleIndex].applyTo(app.activeDocument.pathItems);



}
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
лень втыкать. но скорее всего вот это
Код:
 app.activeDocument.pathItems
нужно поменять на
Код:
sel[i]
, если без всяких проверок на то, что там в выделенном, а просто в лоб и еще сделать Math.round(( Math.random() + 1)) - чтобы в диапазон не попадал стиль "по-умолчанию", ну это уж, по желанию.
короч:

Код:
doc = app.activeDocument;
sel = app.activeDocument.selection;
for (i=0; i<sel.length; i++)
{
styleIndex = Math.round(( Math.random() + 1));
doc.graphicStyles[styleIndex].applyTo(sel[i]);
}

ЗЫ.
Код:
app.activeDocument.pathItems
- вот это и выделяет вам каждый раз элементы в порядке их расположения
 
Последнее редактирование:

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Сообщения
2 089
Реакции
145
Example:

Код:
// Creates 5 shapes in layer 1 of document 1
// and applies a random graphic style to each
var doc = app.documents.add();
var artLayer = doc.layers[0];
app.defaultStroked = true;
app.defaultFilled = true;

var rect = artLayer.pathItems.rectangle(762.5, 87.5, 425.0, 75.0);
var rndRect = artLayer.pathItems.roundedRectangle(637.5, 87.5, 425.0, 75.0, 20.0, 10.0);

// Create ellipse, 'reversed' is false, 'inscribed' is true
var ellipse = artLayer.pathItems.ellipse(512.5, 87.5, 425.0, 75.0, false, true);

// Create octagon, and 8-sided polygon
var octagon = artLayer.pathItems.polygon(300.0, 325.0, 75.0, 8);

// Create a 4 pointed star
var star = artLayer.pathItems.star(300.0, 125.0, 100.0, 20.0, 4);

for (i = 0; i < artLayer.pathItems.length; i++) {
  var styleIndex = Math.round(Math.random() * (doc.graphicStyles.length - 1));
  doc.graphicStyles[styleIndex].applyTo(artLayer.pathItems[i]);
}
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
И это
и еще сделать Math.round(( Math.random() + 1)) - чтобы в диапазон не попадал стиль "по-умолчанию"...
Конечно же не правильно, ибо я тупанул, ведь стилей-то может быть много, а не три, как я почему-то решил.
Лучше так (ну, всяк лучше =) ):
Код:
styleIndex = Math.floor(( Math.random()*(doc.graphicStyles.length-1) + 1));
floor, чтобы округлялось в меньшую сторону, потому что round может округлить в большую сторону и выдать несуществующий styleIndex, и в итоге ЕГОГ =)
 

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Сообщения
2 089
Реакции
145
И это

Конечно же не правильно, ибо я тупанул, ведь стилей-то может быть много, а не три, как я почему-то решил.
Лучше так (ну, всяк лучше =) ):
Код:
styleIndex = Math.floor(( Math.random()*(doc.graphicStyles.length-1) + 1));
floor, чтобы округлялось в меньшую сторону, потому что round может округлить в большую сторону и выдать несуществующий styleIndex, и в итоге ЕГОГ =)

А как насчет того чтоб был выбор из заданного диапазона..? Например - 1 3 5 7
var myStyles=[1, 3, 5, 7];
 

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Сообщения
2 089
Реакции
145
а почему по 2 скобки в начале и в конце.... - опять накосячил?



styleIndex = Math.floor(( Math.random() * (doc.graphicStyles.length-1) + 1));
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 201
Реакции
10 848

bullion

Участник
Топикстартер
Сообщения
3
Реакции
0
лень втыкать. но скорее всего вот это
Код:
 app.activeDocument.pathItems
нужно поменять на
Код:
sel[i]
, если без всяких проверок на то, что там в выделенном, а просто в лоб и еще сделать Math.round(( Math.random() + 1)) - чтобы в диапазон не попадал стиль "по-умолчанию", ну это уж, по желанию.
короч:

Код:
doc = app.activeDocument;
sel = app.activeDocument.selection;
for (i=0; i<sel.length; i++)
{
styleIndex = Math.round(( Math.random() + 1));
doc.graphicStyles[styleIndex].applyTo(sel[i]);
}

ЗЫ.
Код:
app.activeDocument.pathItems
- вот это и выделяет вам каждый раз элементы в порядке их расположения
Спасибо вам огромное! РАБОТАЕТ ))
 

bullion

Участник
Топикстартер
Сообщения
3
Реакции
0
А как насчет того чтоб был выбор из заданного диапазона..? Например - 1 3 5 7
var myStyles=[1, 3, 5, 7];
Было бы гораздо круче и удобнее если бы скрипт брал в работу только выделенные пользователем Styles в палитре. (по аналогии со скриптом рандомной заливки выделенными свотчами)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 201
Реакции
10 848

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Сообщения
2 089
Реакции
145
Было бы гораздо круче и удобнее если бы скрипт брал в работу только выделенные пользователем Styles в палитре. (по аналогии со скриптом рандомной заливки выделенными свотчами)

да есть такие скрипты, правда они не в открытом доступе..)))) 8*)