[AI CC-CC2021] Скрипт по очистке слоя

Flegma

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

mypathItems = app.activeDocument.layers.getByName("Draw").pathItems;
for ( i = 0; i < mypathItems.length; i++ ) {
mypathItems.remove
}

Имя слоя - Draw, нужно чтобы просто все с него подчищалось независимо от выделения
Спасибо ;)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 194
Реакции
10 846
Во первых, у элементов массива индексы забыли проставить , во вторых, цикл должен быть в обратном порядке - с конца массива в начало, а в третьих - не проще ли весь слой разом удалить?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 194
Реакции
10 846
Или вы индексы проставили а чудныйновый движок их сожрал? Используйте тэг CODE для помещения кода.
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Да, видимо сюда вставилось без индекса. Поменял местами начало и конец массива:
Код:
mypathItems = app.activeDocument.layers.getByName("Draw").pathItems;
          for ( i = i++; i < mypathItems.length; 0 ) {
               mypathItems[i].remove
          }
Этот скрипт подвесил иллюстратор. Наверное совершаю элементарные ошибки, извиняюсь за темноту, с языками программирования не сталкивался после школьного бэйсика..
Да, удалить весь слой наверное проще, но у меня другая задача, этот скрипт будет встроен в дефинишн Грассхоппера и должен чистить слой в реальном времени постоянно, не удаляя его, в общем слой должен оставаться..
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 194
Реакции
10 846
Вы немного неправильно представляете себе обратный порядок цикла. Надо делать так:
for (var i=mypath.length-1;i>=0;i--)
Что за "дефинишн грассхоппера"?
Я чего то не понимаю? ИМХО в реальном времени это делать невозможно
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Спасибо, что откликнулись!
Поправил, получилось вот так:
Код:
mypathItems = app.activeDocument.layers.getByName("Draw").pathItems;
          for (var i=mypathItems.length-1;i>=0;i--) {
               mypathItems[i].remove
          }
Запускается, но ничего не происходит.
Еще попробовал совсем без массива чтобы первый удалял для проверки:
Код:
mypathItems = app.activeDocument.layers.getByName("Draw").pathItems;
                         mypathItems[0].remove;
Тоже ничего не происходит.. Может дело в первой строчке, гм...

Грассхоппер - плагин для Райноцерос, там программирование в нодовом режиме (для меня очень удобно и наглядно), работаю там с геометрией. Если поколдовать, можно наладить связь с другими программами, в т.ч. с Иллюстратор
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 194
Реакции
10 846
Запускается, но ничего не происходит.
Ну уже хорошо, хоть ошибку не выдает ;)
Первое, что бросается в глаза - remove - метод, у него список параметров есть, хоть и пустой, надо писать remove()
Но это все не так уж важно, по существу: вы этим кодом удаляете все PathItemы, являющимися непосредственными детьми слоя. А это вовсе не обязательно. Т.е. на слое может быть куча групп, всяких разных экзотических объектов и ни одного pathitemа. По хорошему, надо удалять не PathItem ы а PageItem ы. И второй момент - вовсе не факт, что родительский слой содержит ссылки на своих потомков - индусы, внезапно, совсем не озаботились этим. То есть, по идее, работает только заднепроходно - надо перебирать все PageItemы документа и смотреть на их родителя. Если это - нужный слой, то убирать нетнетнет не убирать! - накапливать в массив, который в самом конце тоже в цикле убирать по одному. Да и то теоретически возможны коллизии. Индусский скриптинг такой индусский. Поэтому я и говорю - проще и надежнее просто тупо убрать слой и тут же создать новый с тем же именем.
Теперь самое главное, погуглил я ваш Grasshoper - если это то о чем я думаю, то у меня даже в голове не укладывается, как эта штука может каким то боком интегрироваться с иллюстратором, да еще и в фоновом режиме его скрипты запускать. '8()' Это ж вообще не предусмотрено самой концепцией иллюстратора! Поэтому, подозреваю, это все не здорово, это все не так.
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Заработало! Помогли пустые скобки после remove, огромное вам спасибо, сам бы никогда не догадался ))
С путями все работает прекрасно, т.к. на этом слое все просто - появляется простой путь с заливкой и обводкой (в редких случаях несколько) и после того, как он попадает в Грассхоппер, его надо удалить. Весь процесс регулирует Г-р (да, вы тот самый нашли), связь между ним и Иллюстратором возможна с плагином Doodlebug, она опробована и в ряде задач хорошо работает, хоть и с некоторыми нюансами.
Еще раз спасибо за отзывчивость ;)
 
  • Спасибо
Реакции: _MBK_

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 194
Реакции
10 846
связь между ним и Иллюстратором возможна с плагином Doodlebug, она опробована и в ряде задач хорошо работает, хоть и с некоторыми нюансами.
Мне все таки интересно, неужели и вправду он умеет в фоновом режиме скрипты запускать? 'hmmm'
Или из грассхопера происходит вызов иллюстратора со скриптом?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 194
Реакции
10 846
А вообще да, занятная штука
LiveIllustratorfromGH.gif
 

Flegma

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 194
Реакции
10 846
Вы, чтобы проще было, отлаживайте скрипты непосредственно в иллюстраторе или ESTK - там, во всяком случае, можно контролировать грубые синтаксические ошибки и за процессом работы следить.
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
С Иллюстратором понятно, а ЕСТК не знаю, погуглю
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 194
Реакции
10 846
Имеется в виду это
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
О, какая штука, если понадобится углубляться в скриптинг, буду осваивать, с этим будет явно удобней, спасибо!
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
Имхо, так быстрее, но начиная с CS6:

Код:
app.activeDocument.selection=null;
app.activeDocument.layers.getByName("Draw").hasSelectedArtwork=true;
app.executeMenuCommand('clear');
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Работает!! Чуть медленнее, где-то на 40мс всего при малом количестве объектов, но думаю при большом будет значительно быстрее, не запуская цикл..
Спасибо, буду использовать!
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Мне как раз скорость очень актуальна, т.к. скрипт запускается автоматом постоянно
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 194
Реакции
10 846
Работает!! Чуть медленнее, где-то на 40мс всего при малом количестве объектов, но думаю при большом будет значительно быстрее, не запуская цикл..
Тогда я не пойму, что мешает делать
Код:
app.activeDocument.layers.getByName("Draw").remove();
app.activeDocument.layers.add().name="Draw";
 

Flegma

Участник
Топикстартер
Сообщения
90
Реакции
2
Дело в том, что к слою обращаются постоянно разные процессы, там милисекунды и прогнозировать сложно, что с чем пересечется по времени, поэтому надежнее сам слой не трогать