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

  • Автор темы Автор темы Flegma
  • Дата начала Дата начала
Мне вообще странно что у вас скрипт рандомной покраски работает существенно быстрее. Вы точно на чистый эксперимент на одном и том же документе ставили?
 
Заметил интересную закономерность.
Если объекты изначально не имеют заливки, только обводку (как в моем случае),
скрипт работает ооооочень медленно, например 600 объектов обработал за 20 секунд,
а если предварительно выделенным объектам дать заливку (просто любую, я вручную белым их залил),
то все кардинально меняется, время обработки тех же
600 объектов - 72 миллисекунды,
33 000 шт - 4,1 с,
тут закономерность похожа на арифметическую, а вот дальше уже затормаживается:
66 000 шт - 23 с,
122 000 шт - 1,8 минуты.
Ну в общем вполне приемлемый результат, надо только не забывать перед запуском срипта
вручную давать объектам заливку чтобы не подвесить Илл-р на неопределенное время
(пробовал ждать - не дождался :)).
 
Или прописать в скрипт изначально эту заливку и уменьшение обводки до нулевой толщины
(это еще процентов 20 времени работы экономит), как думаете, возможно без применения цикла
назначить всем выделенным объектам заливку и толщину обводки?
 
Одну и ту же заливку?
 
Ага, по-видимому Илл-р работает на порядки (именно на порядки!!!) быстрее, когда в скриптах старый цвет заливки
переназначает на новый, нежели когда объекту без заливки присваивает заливку определенного цвета в цикле.

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

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

Если нет, то проще и быстрее вручную будет перекрашивать все белой заливкой, не трогая обводку, перед запуском скрипта. Главное не забывать :)
 
Кстати, скрипт рандомной покраски в данном случае (122 000 объектов) дал то же время работы в две минуты
 
Ага, по-видимому Илл-р работает на порядки (именно на порядки!!!) быстрее, когда в скриптах старый цвет заливки
переназначает на новый, нежели когда объекту без заливки присваивает заливку определенного цвета в цикле.

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

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

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


#28Flegma, только что
 
поместил внутрь цикла перед перекраской и теперь за 2,2 минуты с незалитыми объектами скрипт отработал.
Так что проблема решена, победителям выдан похвальный лист? 'hmmm'
перед циклом, но так ничего не вышло..
И не должно, filled - свойство некоторых элементов массива, а не всего массива. Вам бы матчасть подтянуть действительно ;)
 
Подтянуть, или начать тянуть почти с нуля, это даааа ))
Ага, для моих целей более чем достаточно, огромное спасибо за помощь!
Вот готовый вариант, может кому тоже пригодится:
Код:
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" );
     }
 
Не знаю, насколько скорость оптимизирует, но вот еще такой вариант:
Код:
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
немного дольше - на 0,4 минуты
 
немного дольше - на 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" );
     }
 
Оо, 1,8 минуты, отлично!
Мне кажется, это потолок для такого кол-ва объектов, такой скорости уже вполне достаточно,
буду пользоваться и вспоминать вас добрым словом ;)
 
А вот это для моих знаний точно уже выше потолка )))
 
Попробуйте так
Код:
@JSXBIN@ES@2.0@MyBbyBn0ACJAnABjzLjEjPjDiTjFjMjFjDjUjFjEBfXzJjTjFjMjFjDjUjJjPjOCf
XzOjBjDjUjJjWjFiEjPjDjVjNjFjOjUDfjzDjBjQjQEfnfOBbyCn0ABaCbEn0AEJEnASzCjEjTFyBQz
AGfjBfjzBjJHfnftJFnABXzGjGjJjMjMjFjEIfVFfyBnctfJGnABXzJjGjJjMjMiDjPjMjPjSJfVFfy
BXzLjTjUjSjPjLjFiDjPjMjPjSKfVFfyBnfJHnABXzLjTjUjSjPjLjFiXjJjEjUjILfVFfyBndAfAjH
fAXzGjMjFjOjHjUjIMfjBfByBzBhcNACzBheOXMfjBfnndAbyLn0ABJLnAEjzFjBjMjFjSjUPfRBFeh
BiQjMjFjBjTjFhAjTjFjMjFjDjUhAjPjOjFhAjPjShAjNjPjSjFhAjPjCjKjFjDjUjTffABF40BiAAB
AGByB
 
Прикольно, не знал, что скрипт может так выглядеть )))
По времени также - 1,8 минуты
 
Это лучше, чем я мог себе представить, раньше решал эту задачу такими кривыми и трудозатратными методами, что больно вспомнить теперь, почти вручную ((
По сравнению с этим 2 минуты - пыль, нет предела моей радости :)