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

  • Автор темы Автор темы Flegma
  • Дата начала Дата начала

Flegma

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

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

Имя слоя - Draw, нужно чтобы просто все с него подчищалось независимо от выделения
Спасибо ;)
 
Во первых, у элементов массива индексы забыли проставить , во вторых, цикл должен быть в обратном порядке - с конца массива в начало, а в третьих - не проще ли весь слой разом удалить?
 
Или вы индексы проставили а чудныйновый движок их сожрал? Используйте тэг CODE для помещения кода.
 
Да, видимо сюда вставилось без индекса. Поменял местами начало и конец массива:
Код:
mypathItems = app.activeDocument.layers.getByName("Draw").pathItems;
          for ( i = i++; i < mypathItems.length; 0 ) {
               mypathItems[i].remove
          }
Этот скрипт подвесил иллюстратор. Наверное совершаю элементарные ошибки, извиняюсь за темноту, с языками программирования не сталкивался после школьного бэйсика..
Да, удалить весь слой наверное проще, но у меня другая задача, этот скрипт будет встроен в дефинишн Грассхоппера и должен чистить слой в реальном времени постоянно, не удаляя его, в общем слой должен оставаться..
 
Вы немного неправильно представляете себе обратный порядок цикла. Надо делать так:
for (var i=mypath.length-1;i>=0;i--)
Что за "дефинишн грассхоппера"?
Я чего то не понимаю? ИМХО в реальном времени это делать невозможно
 
Спасибо, что откликнулись!
Поправил, получилось вот так:
Код:
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;
Тоже ничего не происходит.. Может дело в первой строчке, гм...

Грассхоппер - плагин для Райноцерос, там программирование в нодовом режиме (для меня очень удобно и наглядно), работаю там с геометрией. Если поколдовать, можно наладить связь с другими программами, в т.ч. с Иллюстратор
 
Запускается, но ничего не происходит.
Ну уже хорошо, хоть ошибку не выдает ;)
Первое, что бросается в глаза - remove - метод, у него список параметров есть, хоть и пустой, надо писать remove()
Но это все не так уж важно, по существу: вы этим кодом удаляете все PathItemы, являющимися непосредственными детьми слоя. А это вовсе не обязательно. Т.е. на слое может быть куча групп, всяких разных экзотических объектов и ни одного pathitemа. По хорошему, надо удалять не PathItem ы а PageItem ы. И второй момент - вовсе не факт, что родительский слой содержит ссылки на своих потомков - индусы, внезапно, совсем не озаботились этим. То есть, по идее, работает только заднепроходно - надо перебирать все PageItemы документа и смотреть на их родителя. Если это - нужный слой, то убирать нетнетнет не убирать! - накапливать в массив, который в самом конце тоже в цикле убирать по одному. Да и то теоретически возможны коллизии. Индусский скриптинг такой индусский. Поэтому я и говорю - проще и надежнее просто тупо убрать слой и тут же создать новый с тем же именем.
Теперь самое главное, погуглил я ваш Grasshoper - если это то о чем я думаю, то у меня даже в голове не укладывается, как эта штука может каким то боком интегрироваться с иллюстратором, да еще и в фоновом режиме его скрипты запускать. '8()' Это ж вообще не предусмотрено самой концепцией иллюстратора! Поэтому, подозреваю, это все не здорово, это все не так.
 
Заработало! Помогли пустые скобки после remove, огромное вам спасибо, сам бы никогда не догадался ))
С путями все работает прекрасно, т.к. на этом слое все просто - появляется простой путь с заливкой и обводкой (в редких случаях несколько) и после того, как он попадает в Грассхоппер, его надо удалить. Весь процесс регулирует Г-р (да, вы тот самый нашли), связь между ним и Иллюстратором возможна с плагином Doodlebug, она опробована и в ряде задач хорошо работает, хоть и с некоторыми нюансами.
Еще раз спасибо за отзывчивость ;)
 
  • Спасибо
Реакции: _MBK_
связь между ним и Иллюстратором возможна с плагином Doodlebug, она опробована и в ряде задач хорошо работает, хоть и с некоторыми нюансами.
Мне все таки интересно, неужели и вправду он умеет в фоновом режиме скрипты запускать? 'hmmm'
Или из грассхопера происходит вызов иллюстратора со скриптом?
 
А вообще да, занятная штука
LiveIllustratorfromGH.gif
 
Ага, Г-р запускает Илл-р, поддерживает связь и должен запускать скрипты, сейчас буду пробовать )
 
Вы, чтобы проще было, отлаживайте скрипты непосредственно в иллюстраторе или ESTK - там, во всяком случае, можно контролировать грубые синтаксические ошибки и за процессом работы следить.
 
С Иллюстратором понятно, а ЕСТК не знаю, погуглю
 
Имеется в виду это
 
О, какая штука, если понадобится углубляться в скриптинг, буду осваивать, с этим будет явно удобней, спасибо!
 
Имхо, так быстрее, но начиная с CS6:

Код:
app.activeDocument.selection=null;
app.activeDocument.layers.getByName("Draw").hasSelectedArtwork=true;
app.executeMenuCommand('clear');
 
Работает!! Чуть медленнее, где-то на 40мс всего при малом количестве объектов, но думаю при большом будет значительно быстрее, не запуская цикл..
Спасибо, буду использовать!
 
Мне как раз скорость очень актуальна, т.к. скрипт запускается автоматом постоянно
 
Работает!! Чуть медленнее, где-то на 40мс всего при малом количестве объектов, но думаю при большом будет значительно быстрее, не запуская цикл..
Тогда я не пойму, что мешает делать
Код:
app.activeDocument.layers.getByName("Draw").remove();
app.activeDocument.layers.add().name="Draw";
 
Дело в том, что к слою обращаются постоянно разные процессы, там милисекунды и прогнозировать сложно, что с чем пересечется по времени, поэтому надежнее сам слой не трогать