Данная статья является своеобразным репостом моей-же статьи, опубликованной на другом (малопосещаемом) сайте. Для чего я выкладываю статью сюда? На этом сайте много пропрессников тусуется, и по широте души своей хочу им помочь. Безд-воз-мезд-но! то есть даром.(с)
Хочу сразу же оговориться — я не умею обучать. Ну, просто не дано от природы ораторствовать так, чтобы окружающие не просто прониклись идеей, а еще и поняли что-либо из сказанного.
Эта статья (и я надеюсь, последующие тоже) направлена в первую очередь для людей, подготавливающих макеты в печать флексопроизводств. Соответственно основная идея скриптов будет связана и «подрегулирована» под условия флексопечати.
Программа Adobe Illustrator являет собой не только визуальную среду художественной разработки макетов, но еще и
имеет в своем арсенале относительно неплохой движок скриптового языка, позволяющей запускать сторонние скрипты для различных действий с документом и объектами. Данный движок поддерживает такие скриптовые языки как: JavaScript, VisualBasic Script, AppleScript (последний, как можно понять из названия — возможное детище Яблочной корпорации).
Хочу остановится на скриптах в среде JavaScript, так как это единственный язык, который я относительно неплохо знаю.
Вдаваться в подробности работы JavaScrtipt’а я не планирую, если интересно — изучайте его на примерах веб-программирования. Основа
аналогична, лишь разница в объектах и структуре дерева объектов. Вот с этой структуры мы и начнем.
Структуру документа можно представить (в упрощенном виде) следующим образом:
- Документ
- Монтажная область
- Слои
- Группа объектов
- Объекты (примитивы или составные, текстовые блоки и т.п.)
Исходя из такого представления структуры документа можно построить логическую цепочку доступа к конкретному объекту. Нечто такого вида: АктивныйДокумент.МонтажнаяОбласть_№ххх(если их более 1).Слой№ххх(Если их более 1 и Вам необходим объект на конкретном слое).Объект
В принципе, все логично. Некоторые пункты в данном логическом построении можно опустить. К примеру, Вы хотите обрабатывать ВЕСЬ массив существующих объектов, без указания монтажных областей и/или слоев. В таком случае модернизированная логическая цепочка будет выглядеть так: АктивныйДокумент.Объект[№ххх]
Вариант построения логических цепочек запросов варьируется от конкретной поставленной цели.
Теперь давайте рассмотрим, сколько и какие все таки объекты присутствуют в открытом документе и как это знание можно получить программным способом.
Опять таки, опираясь на логическую цепочку можно написать запрос типа: переменная = АктивныйДокумент.Объекты.Количество.
На языке JS это будет выглядеть таким образом:
var docRef = app.activeDocument;
var docRefAll = docRef.pageItems.length; //выясняем количество объектов в активном документе
Все просто? Вполне! Двигаемся дальше.
Прежде чем продолжать я хотел бы обратить внимание на тот список объектов, которые мы можем изменять (далеко не полный список):
- текстовые объекты;
- графические примитивы;
- сложносоставные (compound) объекты;
- монтажные области;
- слои.
Увы, к сожалению создатели Иллюстратора разработали довольно слабенький движок скриптовых языков. Это накладывает ряд (и немалый) ограничений на наши действия. С каждым из приведенных выше объектов можно будет совершать очень малый объем изменений. Гораздо меньше, чем Вы можете себе позволить в графической среде программы.
Так неужели имеет смысл писать скрипты, если их возможности столь ограниченны? Конечно имеет. Хотя бы потому, что вручную обработать несколько тысяч объектов является не только монотонной, но и довольно глупой работой. А мы с Вами люди умные, да еще и ленивые. И платят нам за результат, никоим образом не обращая внимание на то, как именно мы добились этого результата и чего нам это стоило.
И что мы можем такого теперь, когда имеем количество объектов в документе, сделать? К примеру, перекрасить!
Прежде чем перекрашивать объекты (не суть важно какие именно, текстовые или сложносоставные, примитивы или обводки объектов) необходим понять структуру цвета данного объекта.
А структура довольно проста (собственно, все просто, если понять логику авторов):
Объект.Заливка.ЦветовойКанал,
где Объект — собственно сам обрабатываемый в данный момент объект;
Заливка — тип заливки (возможны варианты: однородная, градиентная, 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