...

понедельник, 1 июля 2013 г.

[Из песочницы] Ленивый препресс

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

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


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



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




В данном модуле встретились две новые команды — проверка типа заливки.

Если объект является графическим (не текстовые блоки) и при этом у него градиентная заливка — то обрабатываем каждую ключевую точку заливки.

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

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

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Комментариев нет:

Отправить комментарий