[AI CC-CC2021] Скрипт красит заливки в цвет обводок, а толщину обводок обнуляет

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Мне вообще странно что у вас скрипт рандомной покраски работает существенно быстрее. Вы точно на чистый эксперимент на одном и том же документе ставили?
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Заметил интересную закономерность.
Если объекты изначально не имеют заливки, только обводку (как в моем случае),
скрипт работает ооооочень медленно, например 600 объектов обработал за 20 секунд,
а если предварительно выделенным объектам дать заливку (просто любую, я вручную белым их залил),
то все кардинально меняется, время обработки тех же
600 объектов - 72 миллисекунды,
33 000 шт - 4,1 с,
тут закономерность похожа на арифметическую, а вот дальше уже затормаживается:
66 000 шт - 23 с,
122 000 шт - 1,8 минуты.
Ну в общем вполне приемлемый результат, надо только не забывать перед запуском срипта
вручную давать объектам заливку чтобы не подвесить Илл-р на неопределенное время
(пробовал ждать - не дождался '))'.
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Или прописать в скрипт изначально эту заливку и уменьшение обводки до нулевой толщины
(это еще процентов 20 времени работы экономит), как думаете, возможно без применения цикла
назначить всем выделенным объектам заливку и толщину обводки?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Одну и ту же заливку?
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Ага, по-видимому Илл-р работает на порядки (именно на порядки!!!) быстрее, когда в скриптах старый цвет заливки
переназначает на новый, нежели когда объекту без заливки присваивает заливку определенного цвета в цикле.

Так что идея в том чтобы перед прогоном моего скрипта залить все объекты любой заливкой одинаковой.

В том же скрипте, если возможности скриптинга позволяют без запуска цикла назначить всем выделенным объектам заливку, ну и заодно нулевую толщину обводки.

Если нет, то проще и быстрее вручную будет перекрашивать все белой заливкой, не трогая обводку, перед запуском скрипта. Главное не забывать :)
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Кстати, скрипт рандомной покраски в данном случае (122 000 объектов) дал то же время работы в две минуты
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Ага, по-видимому Илл-р работает на порядки (именно на порядки!!!) быстрее, когда в скриптах старый цвет заливки
переназначает на новый, нежели когда объекту без заливки присваивает заливку определенного цвета в цикле.

Так что идея в том чтобы перед прогоном моего скрипта залить все объекты любой заливкой одинаковой.

В том же скрипте, если возможности скриптинга позволяют без запуска цикла назначить всем выделенным объектам заливку, ну и заодно нулевую толщину обводки.

Если нет, то проще и быстрее вручную будет перекрашивать все белой заливкой, не трогая обводку, перед запуском скрипта. Главное не забывать :)
Тут есть еще одна маленькая тонкость. У каждого объекта PathItem есть свойства filled и stroked, указывающие соответственно, залит или обведен объект. Сказать по правде, весьма странно, что простое назначение цвета без установки свойства filled заливает незалитый объект цветом. Но, возможно, это выход? Попробуйте перед переназначинем цвета делать filled=true, а в конце вместо назначения нулевой обводки stroked=false. Чем черти не шутят, может это тоже ускорит?
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Это то что надо!
Строчку
Код:
docSelected[i].filled=true;
поместил внутрь цикла перед перекраской и теперь за 2,2 минуты с незалитыми объектами скрипт отработал. Убирать обводку не стал, т.к. нужно ее сохранить, просто с нулевой толщиной.
Еще попробовал вынести это дело за цикл, чтобы маленько ускорить,
поставил строку
Код:
docSelected.filled=true;
перед циклом, но так ничего не вышло..


#28Flegma, только что
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
поместил внутрь цикла перед перекраской и теперь за 2,2 минуты с незалитыми объектами скрипт отработал.
Так что проблема решена, победителям выдан похвальный лист? 'hmmm'
перед циклом, но так ничего не вышло..
И не должно, filled - свойство некоторых элементов массива, а не всего массива. Вам бы матчасть подтянуть действительно ;)
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Подтянуть, или начать тянуть почти с нуля, это даааа ))
Ага, для моих целей более чем достаточно, огромное спасибо за помощь!
Вот готовый вариант, может кому тоже пригодится:
Код:
docSelected = app.activeDocument.selection;
     if ( docSelected.length > 0 ) {
          for ( i = 0; i < docSelected.length; i++ ) {
               docSelected[i].filled=true;
               docSelected[i].fillColor = docSelected[i].strokeColor;
               docSelected[i].strokeWidth = 0;
          }
     }
     else {
     alert( "Please select one or more objects" );
     }
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Не знаю, насколько скорость оптимизирует, но вот еще такой вариант:
Код:
docSelected = app.activeDocument.selection;
     if ( docSelected.length > 0 ) {
          for ( i = 0; i < docSelected.length; i++ )
          with (docSelected[i])
         {
               filled=true;
               fillColor = strokeColor;
               strokeWidth = 0;
          }
     }
     else {
     alert( "Please select one or more objects" );
     }
 
  • Спасибо
Реакции: DrEgor

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
немного дольше - на 0,4 минуты
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
немного дольше - на 0,4 минуты
Странно. А так:
Код:
docSelected = app.activeDocument.selection;
     if ( docSelected.length > 0 ) {
          for ( i = 0; i < docSelected.length; i++ )
        
         {    var ds=docSelected[i];
               ds.filled=true;
               ds.fillColor = ds.strokeColor;
               ds.strokeWidth = 0;
          }
     }
     else {
     alert( "Please select one or more objects" );
     }
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Оо, 1,8 минуты, отлично!
Мне кажется, это потолок для такого кол-ва объектов, такой скорости уже вполне достаточно,
буду пользоваться и вспоминать вас добрым словом ;)
 

_MBK_

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

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
А вот это для моих знаний точно уже выше потолка )))
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Попробуйте так
Код:
@JSXBIN@ES@2.0@MyBbyBn0ACJAnABjzLjEjPjDiTjFjMjFjDjUjFjEBfXzJjTjFjMjFjDjUjJjPjOCf
XzOjBjDjUjJjWjFiEjPjDjVjNjFjOjUDfjzDjBjQjQEfnfOBbyCn0ABaCbEn0AEJEnASzCjEjTFyBQz
AGfjBfjzBjJHfnftJFnABXzGjGjJjMjMjFjEIfVFfyBnctfJGnABXzJjGjJjMjMiDjPjMjPjSJfVFfy
BXzLjTjUjSjPjLjFiDjPjMjPjSKfVFfyBnfJHnABXzLjTjUjSjPjLjFiXjJjEjUjILfVFfyBndAfAjH
fAXzGjMjFjOjHjUjIMfjBfByBzBhcNACzBheOXMfjBfnndAbyLn0ABJLnAEjzFjBjMjFjSjUPfRBFeh
BiQjMjFjBjTjFhAjTjFjMjFjDjUhAjPjOjFhAjPjShAjNjPjSjFhAjPjCjKjFjDjUjTffABF40BiAAB
AGByB
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Прикольно, не знал, что скрипт может так выглядеть )))
По времени также - 1,8 минуты
 

_MBK_

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

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Это лучше, чем я мог себе представить, раньше решал эту задачу такими кривыми и трудозатратными методами, что больно вспомнить теперь, почти вручную ((
По сравнению с этим 2 минуты - пыль, нет предела моей радости :)