Pull to refresh

Ленивый препресс

Reading time5 min
Views2.7K
Данная статья является своеобразным репостом моей же статьи, опубликованной на другом (малопосещаемом) сайте. Для чего я выкладываю статью сюда? На этом сайте много препрессников тусуется, и по широте души своей хочу им помочь. Безд-воз-мезд-но! то есть даром.(с)

Хочу сразу же оговориться — я не умею обучать. Ну, просто не дано от природы ораторствовать так, чтобы окружающие не просто прониклись идеей, а еще и поняли что-либо из сказанного.

Эта статья (и я надеюсь, последующие тоже) направлена в первую очередь для людей, подготавливающих макеты в печать флексопроизводств. Соответственно основная идея скриптов будет связана и «подрегулирована» под условия флексопечати.

Программа Adobe Illustrator являет собой не только визуальную среду художественной разработки макетов, но еще и
имеет в своем арсенале относительно неплохой движок скриптового языка, позволяющей запускать сторонние скрипты для различных действий с документом и объектами. Данный движок поддерживает такие скриптовые языки как: JavaScript, VisualBasic Script, AppleScript (последний, как можно понять из названия — возможное детище Яблочной корпорации).
Хочу остановится на скриптах в среде JavaScript, так как это единственный язык, который я относительно неплохо знаю.
Вдаваться в подробности работы JavaScrtipt’а я не планирую, если интересно — изучайте его на примерах веб-программирования. Основа
аналогична, лишь разница в объектах и структуре дерева объектов. Вот с этой структуры мы и начнем.
Структуру документа можно представить (в упрощенном виде) следующим образом:
  • Документ
  • Монтажная область
  • Слои
  • Группа объектов
  • Объекты (примитивы или составные, текстовые блоки и т.п.)

Исходя из такого представления структуры документа можно построить логическую цепочку доступа к конкретному объекту. Нечто такого вида: АктивныйДокумент.МонтажнаяОбласть_№ххх(если их более 1).Слой№ххх(Если их более 1 и Вам необходим объект на конкретном слое).Объект
В принципе, все логично. Некоторые пункты в данном логическом построении можно опустить. К примеру, Вы хотите обрабатывать ВЕСЬ массив существующих объектов, без указания монтажных областей и/или слоев. В таком случае модернизированная логическая цепочка будет выглядеть так: АктивныйДокумент.Объект[№ххх]
Вариант построения логических цепочек запросов варьируется от конкретной поставленной цели.
Теперь давайте рассмотрим, сколько и какие все таки объекты присутствуют в открытом документе и как это знание можно получить программным способом.
Опять таки, опираясь на логическую цепочку можно написать запрос типа: переменная = АктивныйДокумент.Объекты.Количество.
На языке JS это будет выглядеть таким образом:

var docRef = app.activeDocument;
var docRefAll = docRef.pageItems.length;   //выясняем количество объектов в активном документе


Все просто? Вполне! Двигаемся дальше.
Прежде чем продолжать я хотел бы обратить внимание на тот список объектов, которые мы можем изменять (далеко не полный список):
  1. текстовые объекты;
  2. графические примитивы;
  3. сложносоставные (compound) объекты;
  4. монтажные области;
  5. слои.

Увы, к сожалению, создатели Иллюстратора разработали довольно слабенький движок скриптовых языков. Это накладывает ряд (и немалый) ограничений на наши действия. С каждым из приведенных выше объектов можно будет совершать очень малый объем изменений. Гораздо меньше, чем Вы можете себе позволить в графической среде программы.
Так неужели имеет смысл писать скрипты, если их возможности столь ограниченны? Конечно имеет. Хотя бы потому, что вручную обработать несколько тысяч объектов является не только монотонной, но и довольно глупой работой. А мы с Вами люди умные, да еще и ленивые. И платят нам за результат, никоим образом не обращая внимание на то, как именно мы добились этого результата и чего нам это стоило.
И что мы можем такого теперь, когда имеем количество объектов в документе, сделать? К примеру, перекрасить!
Прежде чем перекрашивать объекты (не суть важно какие именно, текстовые или сложносоставные, примитивы или обводки объектов) необходим о понять структуру цвета данного объекта.
А структура довольно проста (собственно, все просто, если понять логику авторов):
Объект.Заливка.ЦветовойКанал,
где Объект — собственно сам обрабатываемый в данный момент объект;
Заливка — тип заливки (возможны варианты: однородная, градиентная, SPOT, SPOT-градиентная, Mesh);
ЦветовойКанал — зависит от цветового пространства и типа заливки; имеет варианты — Cyan, Magenta, Yellow, Black (CMYK); Red, Green, Blue (RGB); Tint (Spot, Grayscale);
Таким образом заливка объекта цветом в среде JS выглядит следующим образом:
docRef.pageItems[0].fillColor.cyan = 0…100;  //(для голубого канала цвета объекта №0 (нумерация идет с 0, т.е. объект №0 — самый первый, самый «верхний» объект в документе)
docRef.pageItems[0].fillColor.red = 0…255;     //(красный канал в схеме RGB)
docRef.pageItems[0].fillColor.tint = 0…100;   //(процент заливки SPOT-цветом или процент заливки черным из схемы Grayscale)

Если мы рассматриваем задание цвета обводки объекта, то запись будет такого плана:
docRef.pageItems[0].strokeColor.cyan = 0…100;

т.е. разница в задании цвета заливки (однотонной) и обводки лишь в указании типа заливки: fillColor или strokeColor.
Но мы можем ведь указать не однородную заливку для объекта, а градиентную? Можем, конечно. Для этого нам необходимо понимать, что такое градиентная заливка с точки зрения скрипта.
Градиентная заливка — это набор ключевых точек на прямой от начала заливки (один край) до конца заливки (противоположный край заливки), имеющий свои цвета. Т.е. заливка от черного к белому будет выглядеть приблизительно таким образом:
Точка1[цветовой массив вида 0,0,0,100] … Точка2[цветовой массив вида 0,0,0,0]
на языке JS:
docRef.pageItems[0].fillColor.gradient.gradientStops[0].color.black=100;
docRef.pageItems[0].fillColor.gradient.gradientStops[1].color.black=0;

Первая строка производит указание 100% черного цвета для 1 ключевой точки объекта, вторая строка указывает 0% черного цвета для второй точки (конечной, в данном случае).
Но, как Вы понимаете, количество ключевых точек в градиентной заливке ВСЕГДА не менее 2, но ведь бывает и гораздо больше.
В таком случае, вспоминая еще школьный курс информатики (или ВУЗовский курс, если удобнее) нам необходимо написать цикл, обрабатывающий ВСЕ ключевые точки в нашей градиентной заливке.
Пишем такой вот блок:
gradNumb = docRef.pageItems[0].fillColor.gradient.gradientStops.length; //(мы считываем количество ключевых точек градиентной заливки)
for (k = 0; k < gradNumb; k++) { //(открываем цикл обработки ключевых точек заливки)
    docRef.pageItems[0].fillColor.gradient.gradientStops[k].color.black = 0; //(указываем 0% для черного канала в каждой ключевой точке заливки)
}

Довольно несложно, кроме того, чтобы понять логику разработчиков в корпорации ADOBE, которые так «глубоко» засунули свойства доступа к ключевым точкам заливки. В свое время я потратил немало усилий, чтобы добраться к этим возможностям изменения цвета.
Давайте подведем небольшой итог всего, что мы узнали на текущий момент:
var docRef = app.activeDocument;
var docRefAll = docRef.pageItems.length;
for (n = 0; n < docRefAll; n++) {
    if ((docRef.pageItems[n] == »[PathItem]«) && (docRef.pageItems[n].fillColor == »[GradientColor]«)) {
        gradNumb = docRef.pageItems[n].fillColor.gradient.gradientStops.length;
        for (k = 0; k < gradNumb; k++) {
            docRef.pageItems[n].fillColor.gradient.gradientStops[k].color.black = 0;
        }
    }
    if ((docRef.pageItems[n] == »[PathItem]«) && (docRef.pageItems[n].fillColor == »[CMYKColor]«)) {
        docRef.pageItems[n].fillColor.black = 100;
    }
}

В данном модуле встретились две новые команды — проверка типа заливки.
Если объект является графическим (не текстовые блоки) и при этом у него градиентная заливка — то обрабатываем каждую ключевую точку заливки.
Если объект является графическим (не текстовые блоки) и при этом у него однотонная заливка — закрашиваем в черный цвет объект.
На текущем моменте, пожалуй, я остановлюсь. Если статья получит отзывы о продолжении — продолжим, конечно же.
Tags:
Hubs:
Total votes 13: ↑6 and ↓7-1
Comments1

Articles