[AI CC2020] Выделение объектов, с более чем тремя CMYK сепарациями

Skvoznyak

12 лет на форуме
Сообщения
4 955
Реакции
1 958
все условия по хорошему надо брать в скобки ибо например в си такой код не скомпилился бы вообще а за яваскрипт я не поручусь что порядок действий правильный будет

довольно странная претензия к коду на одном языке, что он не сработает на другом. при этом - сработает, скобки плодить вовсе не обязательно. порядок обычный, справа налево
 
  • Спасибо
Реакции: ~RA~

~RA~

10 лет на форуме
Сообщения
9 430
Реакции
2 697
Я тоже считаю, что, в данном случае, это лишнее.
 

glugoff

Участник
Топикстартер
Сообщения
611
Реакции
93
Выше приводил пример объекта, который видно только когда разгруппировываешь группу. Так и не могу его поймать скриптом. Перебор path items ничего не даёт. Вот сам файл: Спрятанный объект
У кого нибудь есть мысли, в какую сторону копать? Просто объекты в группах и группах обтравки нормально ищутся.

P.S. Это скорее всего плод любви корела ai и eps или чего похуже, и откровенный глюк. Но питстоп его отлавливает.
 

Skvoznyak

12 лет на форуме
Сообщения
4 955
Реакции
1 958
Он вообще нужен хоть в 4 краски, хоть в три? Как раз и хорошо что питстоп отловил, можете макет завернуть сразу
 

glugoff

Участник
Топикстартер
Сообщения
611
Реакции
93
Он вообще нужен хоть в 4 краски, хоть в три? Как раз и хорошо что питстоп отловил, можете макет завернуть сразу
На печати этого овала не будет, так как он невидим и на заднем плане. Попытки фильтровать пистопом невидимые объекты с треском провалились (виснет наглухо). Разумеется он не нужен, но и его наличие ничего не испортит. Но серверный питстоп срабатывает и оператор должен знать на что. Для этого скрипт и пишется.
 

Gad

Участник
Сообщения
1 970
Реакции
873
Для этого скрипт и пишется
 

Gad

Участник
Сообщения
1 970
Реакции
873
Попытки фильтровать пистопом невидимые объекты
2020-05-20_20-48-26.png
 
  • Спасибо
Реакции: _MBK_

Skvoznyak

12 лет на форуме
Сообщения
4 955
Реакции
1 958
Ну в иллюстраторе вроде как надо


В принципе, открыть как копию, разгруппировать все что можно и тогда проверять копию и по ней выбрасывать предупреждения. Либо уже через c++ sdk копаться в документе
 
Последнее редактирование:
  • Спасибо
Реакции: _MBK_ и glugoff

glugoff

Участник
Топикстартер
Сообщения
611
Реакции
93
Оставлю здесь последнюю обкатанно-рабочую-оптимизированную версию, чтобы самому не потерять :).

В конкретно нашем производстве, зарекомендовала себя хорошо. Не отлавливает в основном черные объекты в opacity mask, у жаваскрипта нет туда доступа. С простыми объектами и текстом справляется.

Код:
#target illustrator
//скрипт выделяет все (я надеюсь) объекты, цвет заливки или обводки у которых есть какое-то значение в каждой cmy компоненте, и от 70 до 100 в k компоненте. после поиска - объекты выделяются.

// v1.0 скрипт выделяет геометрические объекты с целевым цветом
//v1.1 исправлен косяк, который не позволял выделить объекты без заливки, только с обводкой
//v2.1 добавлен функционал, позволяющий работать с любыми текстовыми объектами
//v2.1.1 оптимизация кода
//v2.2 исправление ошибки с исключением, добавление алертов

var pi = app.activeDocument.pathItems; //все геометрические объекты
var tfs = app.activeDocument.textFrames; // все текстовые объекты
var all = [].concat.call(pi, tfs); // объединяем в массив
var arr = []; //массив для обнаруженных объектов


if (all.length > 0) { //если объектов чуть более чем нифига
    
  for (var i = 0; i < all.length - 1; i++) { //запускаем цикл
      
       var fill = all[i].fillColor;  //заодно вводим переменные для заливки
       var stroke = all[i].strokeColor; //и обводки

// объявляем условие для исключения. объекты с цветом равным критерию ниже - не будут выделены. это как бы наш местный "легальный" rich black.

    if (
  (fill.black == 100 &&
  fill.magenta == 50.1 &&
  fill.cyan == 50.1 &&
  fill.yellow == 50.1)
||
  (stroke.black == 100 &&
  stroke.magenta == 50.1 &&
  stroke.cyan == 50.1 &&
  stroke.yellow == 50.1)
)
{
 alert("В макете есть наш Rich Black ")
 
  continue;
      }
  // основная проверка. тут проверяется диапазон значений цвета. если оно  true - объекты будут выделены   
      if (
          (fill.black >= 70 && fill.black <= 100 &&
          fill.magenta >= 1 && fill.magenta <= 100 &&
          fill.cyan >= 1 && fill.cyan <= 100 &&
          fill.yellow >= 1 && fill.yellow <= 100) ||
          (stroke.black >= 70 && stroke.black <= 100 &&
          stroke.magenta >= 1 && stroke.magenta <= 100 &&
          stroke.cyan >= 1 && stroke.cyan <= 100 &&
          stroke.yellow >= 1 && stroke.yellow <= 100)
        ) {
            arr[arr.length] = all[i]; //всё что соответствует критерию выше - добавляется в массив для последующего выделения
          }
    }
  }
 
if (arr.length > 0) {
  activeDocument.selection = arr //выделяем все объекты найденные с помощью всего скрипта
  alert("Нашел составного черного: " + arr.length +" объектов")
} else {
  alert("Не нашел составного черного")
}
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
29 921
Реакции
9 835

glugoff

Участник
Топикстартер
Сообщения
611
Реакции
93
На мой взгляд какая то чертовски шаткая конструкция.
А если, например, fill.magenta == 50.097566 ?
Тогда не сработает, да и не должно. Это чисто наш, придуманный от балды rich black. На момент написания я не знал разницу между int и float '))' Он мог бы быть 49/50/51/100, например. Но это работает :)
 

glugoff

Участник
Топикстартер
Сообщения
611
Реакции
93
Не пойму, зачем вылавливать в макете

?
Наоборот же. Не вылавливать, а игнорировать. Например: заказчик навертел всякого, скрипт это отлавливает. Но вот в этой-вот черной плашке, мы САМИ навертели СВОЕГО черного. Он разумный, осознанный, он там нужен. Поэтому его скрипт не выделяет, и для красоты еще сообщает о его наличии.
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
29 921
Реакции
9 835
По идее (не помню, говорил я или нет) если не выделять объекты а просто проверять наличие, то через парсинг AI реализуемо даже во всевозможных масках
 

glugoff

Участник
Топикстартер
Сообщения
611
Реакции
93
Ну вот, год прошел :) Скрипт вертится, работает, помогает людям. И всё же нашлись макеты, на которых он не смог найти целевой цвет.
Речь идёт о swatch. То есть, если объект покрашен не просто триадой, а swatch с типом CMYKcolor - перебор patchItems ничего не даст. И я что-то не могу разобраться, как с этим работать. Просто добавить еще один тип данных в цикл не получается, видимо это другая сущность. Возможно, кто-то знает примерное решение?
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
29 921
Реакции
9 835
То есть, если объект покрашен не просто триадой, а swatch с типом CMYKcolor - перебор patchItems ничего не даст.
Не пойму суть проблемы. Ну так и перебирайте не pathitemы а swatchи и перекрашивайте их - или что не так?
 

glugoff

Участник
Топикстартер
Сообщения
611
Реакции
93
Не пойму суть проблемы. Ну так и перебирайте не pathitemы а swatchи и перекрашивайте их - или что не так?
Вот не могу понять как реализовать. Ну смотрите, вот pathItems и textFrames имеют fillColor и strokeColor, и с ними всё просто и понятно. А тут, получается, они имеют fillColor == swatch...? А он еще может быть плашечный, градиентный, смиковый... И даже если так, то у этого свотча нет ни fillColor ни strokeColor. Вот и не могу сообразить, какая логика должна быть.