[AI CC-CC2022] Изменение скрипта "Find same color path and make compound path"

Ant-3

Участник
Топикстартер
Сообщения
81
Реакции
2
Доброго дня, вот скрипт "Find same color path and make compound path" в двух вариациях:

Код:
var lays=activeDocument.layers;
for(l=0;l<lays.length;l++){app.activeDocument.activeLayer=lays[l];
while (app.activeDocument.activeLayer.pathItems.length !=0) {try{
activeDocument.selection=app.activeDocument.activeLayer.pathItems[0];
app.executeMenuCommand("Find Fill & Stroke menu item");
app.executeMenuCommand ("compoundPath");}catch(e){continue;}
};
}

Код:
var lays=activeDocument.layers;
for(l=0;l<lays.length;l++){app.activeDocument.activeLayer=lays[l];
while (app.activeDocument.activeLayer.pathItems.length !=0) {try{
activeDocument.selection=app.activeDocument.activeLayer.pathItems[0];
app.executeMenuCommand("Find Fill & Stroke menu item");
app.executeMenuCommand('group');}catch(e){continue;}
};
}

Во второй вариации строчка app.executeMenuCommand ("compoundPath");}catch(e){continue;} заменена на app.executeMenuCommand('group');}catch(e){continue;}


Скрипт в данный момент работает сразу по всем объектам в документе. Что нужно дополнить или изменить в скрипте , чтобы он не выходил за рамки артборда в документе?
Например: в документе 10 артбордов, нужно чтобы скрипт выполнял действие только внутри артбордов, точнее внутри каждого артборда индивидуально
 
Задача неясна - он должен выделять только обьекты, целиком попадающие в артборды или хоть частично находящиеся внутри артбордов?
Опишите ручную последовательность действий, которую вы хотите закодить
 
Задача неясна - он должен выделять только обьекты, целиком попадающие в артборды или хоть частично находящиеся внутри артбордов?
Опишите ручную последовательность действий, которую вы хотите закодить
да, все верно, он должен выделять только объекты, целиком попадающие в артборды.

Представим, что в документе используется только 3 одинаковых цвета. Вот что примерно должно происходить при активации скрипта:

 
Я не про это.
Вопрос состоит из двух частей:
1) как выделить все обьекты, целиком попадающие на заданный артборд
2)...
PROFIT!!!!
 
Ну это понятно, однако, обьекты, частично выходящие за артборд тоже будут выделены.
Или я вас неправильно понял?
 
Ну это понятно, однако, обьекты, частично выходящие за артборд тоже будут выделены.
Или я вас неправильно понял?
Хм, если без этого невозможно будет сделать скрипт, то тогда лучше с выделением частично выходящих объектов за артборд
 
Изолировать группу объектов скриптом невозможно, можно сделать через экшн в скрипте, но заставить работать стабильно не выйдет (адский костыль), можно через плагин, но его пока не существует. Попробуйте отказаться от выделения по признаку через вызов меню, а вместо этого перебирать все объекты проверяя принадлежность к артборду и сравнивая параметры заливки и обводки по образцу, или как Вы собираетесь там указывать что именно выделять.
 
Последнее редактирование:
Изолировать группу объектов скриптом невозможно, можно сделать через экшн в скрипте, но заставить работать стабильно не выйдет (адский костыль), можно через плагин, но его пока не существует. Попробуйте отказаться от выделения по признаку через вызов меню, а вместо этого перебирать все объекты проверяя принадлежность к артборду и сравнивая параметры заливки и обводки по образцу, или как Вы собираетесь там указывать что именно выделять.
хм, может быть возможно (за место изоляции) создавать временный дополнительный документ на момент работы скрипта с одним артбордом. Может быть это не реализуемо, но я вроде бы подобную операцию видел в каком-то скрипте.
 
временный дополнительный документ
Не думаю что это хорошее решение. Можно как вариант разнести объекты согласно принадлежности артбордам по слоям, замкнуть все слои и отмыкать по очереди, но зачем?
 
Изолировать группу объектов скриптом невозможно, можно сделать через экшн в скрипте, но заставить работать стабильно не выйдет (адский костыль), можно через плагин, но его пока не существует.
Плагин, вроде Gad на днях делал, но, по моему, это сильно плохой костыль.
Сказать по правде, я так и не уяснил суть задачи. За пределами артбордов присутствуют обьекты, которые надо исключить из перекраски, что ли? Так тогда действительно можно и без изоляции обойтись через команду selectallinartboard. Однако, в этом случае будут перекрашиваться и обьекты, частично выходящие за пределы артборда.
Чтобы их отфильтровать, придется делать два вложенных цикла по всем артбордам и всем обьектам на предмет проверки, попадает ли обьект целиком в артборд или нет? Сразу предупреждаю, что последняя проверка сама по себе достаточно нетривиальна, поскольку простое сравнение боксов будет сильно лажать (на этом форуме было длительное обсуждение данной темы). В двух словах - в случае маскированных обьектов бокс определяется не по маске, а по ее содержимому и корректное его определение без создания дополнительных артбордов практически нереально.
Поэтому я и уточняю конкретику задачи, поскольку очень часто спрашивающие здесь хотят вовсе не то, что спрашивают, ибо решение их проблемы лежит совсем в противоположной плоскости.
 
Тогда решение у вас уже есть
Да, это работает, благодарю. Я добавил selectallinartboard , скрипт работает только в рамках одного артборда. К сожалению я не очень хорошо разбираюсь в структуре и создании скриптов, не разобрался как должен в итоге выглядеть скрипт, чтобы он затем сделал тоже самое и с другими артбордами в документе (чтобы на каждый артборд не протыкивать скрипт отдельно)
 
чтобы он затем сделал тоже самое и с другими артбордами в документе
Код:
for (var i=0; i < doc.artboards.length; i++) {
    doc.artboards.setActiveArtboardIndex(i);
... //что там нужно сделать на артборде
}
 
Код:
for (var i=0; i < doc.artboards.length; i++) {
    doc.artboards.setActiveArtboardIndex(i);
... //что там нужно сделать на артборде
}


Извиняюсь, похоже я что-то не так сделал, вот код:
Код:
var doc = app.activeDocument;
for (var i=0; i < doc.artboards.length; i++) {
    doc.artboards.setActiveArtboardIndex(i);
app.executeMenuCommand("Find Fill & Stroke menu item");
app.executeMenuCommand( 'selectallinartboard' );
app.executeMenuCommand('group')
}


Сейчас скрипт просто группирует вообще все объекты внутри каждого артборда (не объединяет в группы объекты с одинаковым цветом)
 
Да, строки местами перепутали
JavaScript:
var doc = app.activeDocument;
for (var i=0; i < doc.artboards.length; i++) {
 doc.artboards.setActiveArtboardIndex(i);
 redraw();     
 app.executeMenuCommand( 'selectallinartboard' );
 app.executeMenuCommand("Find Fill & Stroke menu item");
 app.executeMenuCommand('group')
 redraw();
}
 
А хотя нет, исходя из логики исходного скрипта, просто так не получится. :(
Вам действительно недостаточно выделить все объекты на текущем артборде - вам надо заблокировать все остальные объекты, чтобы поиск происходил только среди них. Довольно замороченно получается, в две строки не выйдет :(
 
Довольно замороченно получается, в две строки не выйдет
Ну... если поизвращаться, то так:
Код:
#target Illustrator
var doc = app.activeDocument;
for (var i=0; i < doc.artboards.length; i++) {
    doc.artboards.setActiveArtboardIndex(i);
    app.executeMenuCommand("unlockAll")
    app.executeMenuCommand("selectallinartboard");
    app.executeMenuCommand("Inverse menu item");
    app.executeMenuCommand("lock");
    app.executeMenuCommand("Find Fill & Stroke menu item");
    app.executeMenuCommand('group')
}
app.executeMenuCommand("unlockAll")
 
  • Спасибо
Реакции: _MBK_