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

в 8:10, , рубрики: adobe, adobe illustrator, javascript, Песочница, метки: ,

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

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

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

Программа 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;
}
}

В данном модуле встретились две новые команды — проверка типа заливки.
Если объект является графическим (не текстовые блоки) и при этом у него градиентная заливка — то обрабатываем каждую ключевую точку заливки.
Если объект является графическим (не текстовые блоки) и при этом у него однотонная заливка — закрашиваем в черный цвет объект.
На текущем моменте, пожалуй, я остановлюсь. Если статья получит отзывы о продолжении — продолжим, конечно же.

Автор: Skivmc

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js