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

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
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 артбордов, нужно чтобы скрипт выполнял действие только внутри артбордов, точнее внутри каждого артборда индивидуально
 

_MBK_

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

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Задача неясна - он должен выделять только обьекты, целиком попадающие в артборды или хоть частично находящиеся внутри артбордов?
Опишите ручную последовательность действий, которую вы хотите закодить
да, все верно, он должен выделять только объекты, целиком попадающие в артборды.

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

 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Я не про это.
Вопрос состоит из двух частей:
1) как выделить все обьекты, целиком попадающие на заданный артборд
2)...
PROFIT!!!!
 

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Я не про это.
Вопрос состоит из двух частей:
1) как выделить все обьекты, целиком попадающие на заданный артборд
2)...
PROFIT!!!!

 

_MBK_

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

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Ну это понятно, однако, обьекты, частично выходящие за артборд тоже будут выделены.
Или я вас неправильно понял?
Хм, если без этого невозможно будет сделать скрипт, то тогда лучше с выделением частично выходящих объектов за артборд
 

Drawer

Участник
Сообщения
1 814
Реакции
799
Изолировать группу объектов скриптом невозможно, можно сделать через экшн в скрипте, но заставить работать стабильно не выйдет (адский костыль), можно через плагин, но его пока не существует. Попробуйте отказаться от выделения по признаку через вызов меню, а вместо этого перебирать все объекты проверяя принадлежность к артборду и сравнивая параметры заливки и обводки по образцу, или как Вы собираетесь там указывать что именно выделять.
 

Drawer

Участник
Сообщения
1 814
Реакции
799
Последнее редактирование:

Ant-3

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

Drawer

Участник
Сообщения
1 814
Реакции
799
временный дополнительный документ
Не думаю что это хорошее решение. Можно как вариант разнести объекты согласно принадлежности артбордам по слоям, замкнуть все слои и отмыкать по очереди, но зачем?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Изолировать группу объектов скриптом невозможно, можно сделать через экшн в скрипте, но заставить работать стабильно не выйдет (адский костыль), можно через плагин, но его пока не существует.
Плагин, вроде Gad на днях делал, но, по моему, это сильно плохой костыль.
Сказать по правде, я так и не уяснил суть задачи. За пределами артбордов присутствуют обьекты, которые надо исключить из перекраски, что ли? Так тогда действительно можно и без изоляции обойтись через команду selectallinartboard. Однако, в этом случае будут перекрашиваться и обьекты, частично выходящие за пределы артборда.
Чтобы их отфильтровать, придется делать два вложенных цикла по всем артбордам и всем обьектам на предмет проверки, попадает ли обьект целиком в артборд или нет? Сразу предупреждаю, что последняя проверка сама по себе достаточно нетривиальна, поскольку простое сравнение боксов будет сильно лажать (на этом форуме было длительное обсуждение данной темы). В двух словах - в случае маскированных обьектов бокс определяется не по маске, а по ее содержимому и корректное его определение без создания дополнительных артбордов практически нереально.
Поэтому я и уточняю конкретику задачи, поскольку очень часто спрашивающие здесь хотят вовсе не то, что спрашивают, ибо решение их проблемы лежит совсем в противоположной плоскости.
 

_MBK_

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

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Тогда решение у вас уже есть
Да, это работает, благодарю. Я добавил selectallinartboard , скрипт работает только в рамках одного артборда. К сожалению я не очень хорошо разбираюсь в структуре и создании скриптов, не разобрался как должен в итоге выглядеть скрипт, чтобы он затем сделал тоже самое и с другими артбордами в документе (чтобы на каждый артборд не протыкивать скрипт отдельно)
 

Drawer

Участник
Сообщения
1 814
Реакции
799
чтобы он затем сделал тоже самое и с другими артбордами в документе
Код:
for (var i=0; i < doc.artboards.length; i++) {
    doc.artboards.setActiveArtboardIndex(i);
... //что там нужно сделать на артборде
}
 

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Код:
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')
}


Сейчас скрипт просто группирует вообще все объекты внутри каждого артборда (не объединяет в группы объекты с одинаковым цветом)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Да, строки местами перепутали
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();
}
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
А хотя нет, исходя из логики исходного скрипта, просто так не получится. :(
Вам действительно недостаточно выделить все объекты на текущем артборде - вам надо заблокировать все остальные объекты, чтобы поиск происходил только среди них. Довольно замороченно получается, в две строки не выйдет :(
 

Drawer

Участник
Сообщения
1 814
Реакции
799
Довольно замороченно получается, в две строки не выйдет
Ну... если поизвращаться, то так:
Код:
#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_