Телевизоры. Приставки. Проекторы и аксессуары. Технологии. Цифровое ТВ

Набор платных скриптов illustrator. Скрипт для замены объектов исходным, объектами из группы или из буфера обмена

У вас есть уникальная возможность расширить функционал Adobe Illustrator. Нет ничего проще, чем использование скриптов (файлов-сценариев), просто выберите объект и запустите скрипт, который вам нужен. Скрипты представленные в этой заметке съэкономят вам уйму времени, сделают вашу работу более приятной и эффективной. Поверьте, они стоят вашего внимания. Все скрипты были протестированы в версиях Иллюстратора CS3 и СS4.

Если вам нужны дополнения к Illustrator премиум качества, вы можете найти их у нас в разделе Illustrator Actions and Scripts на нашем ресурсе GraphicRiver , такие как: Isometric Guides Grid Action (экшен по созданию изометрической сетки), Pattern Maker (Создание паттернов), и Long Shadow Action (Экшен по созданию длинной тени).

Лучшие Экшены (Операции) и Скрипты для Illustrator на Graphic River.

В противном случае воспользуйтесь бесплатными "плюшками" о которых мы вам сейчас расскажем. Но сначала, давайте разберемся, как установить скрипты для Illustrator.

Установка Скриптов

Скрипты, которые вы собираетесь использовать, желательно сохранять всегда в одно и тоже место, например в директорию Scrips (Скрипты). Что бы запустить скрипт нужно зайти в Файл > Сценарии > Другой Сценарий (Command + F12) (File > Scripts > Other Scripts).

Открыть директорию со скриптами и запустить нужный файл.

При создании рисунка в любом графическом редакторе часто приходится выполнять одни и те же действия. Еще больше времени занимает мелкая рутинная работа по подгонке контуров или созданию небольших деталей. При создании изображений для стоков затраты времени и вовсе могут стать катастрофическими. К счастью многие задачи можно решить используя записанные действия или скрипты. Представляем вам подборку из 20 удобных и полезных скриптов для .

Как установить скрипты в Adobe Illustrator

В целом установка скриптов в Illustrator не представляет ничего тяжелого. После того, как вы скачали нужны вам скрипт просто откройте программу, зайдите в File > Scripts > Other Scripts и выберите его. Полезный совет: скрипты лучше всего хранить в одном месте. Также очень полезным будет сохранять описания скриптов в отдельных файлах - со временем их база у вас будет только расти, что может привести к путанице.

Adjust Dashes

Скрипт Adjust Dashes помогает выравнивать пунктирную обводку по ключевым точкам. Всем известная проблема не очень красивого пунктира уходит навсегда! Важный момент: после работы скрипта заливка у объекта исчезнет, так что выполняйте его как можно раньше.

Arc Correction

Скажем, вы хотите нарисовать тучку. Можно долго возиться с эллипсами и кривыми, а можно за секунду набросать её форму с помощью планшета. Но вот беда - дуги часто получаются очень неровными. Скрипт Arc Correction легко исправляет положение.

Arrow-A, Arrow-V

При создании инфографики зачастую используются стрелки. Если вы хотите нарисовать красивую изогнутую стрелку, попробуйте скрипт Arrow-A, Arrow-V. Он создаст на каждом выделенном конце кривой указатель в форме А или V.

Circumcircle

Скрипт Circumcircle описывает окружность вокруг выбранной фигуры. Очень удобно, только не забывайте, что не всякую сложную фигуру можно вписать в круг.

Common Tangents

Скрипт Common Tangents рисует общие касательные для каждой выбранной кривой (если такие касательные имеются).

Divide

Необходимо разделить сегмент на равные части? Используйте скрипт Divide. Он аккуратно и точно разрежен объект на нужное количество равных отрезков.

Extend Handles

Вечная проблема - равномерное растягивание ползунков у ключевой точки. Еще и есть риск испортить наклон кривой. Скрипт Extend Handles сделает всю работу за вас.

Например:
100: оригинал
120: расширить 20%
80: сжать 20%
0: убрать закругление
-100: обратить закругление

Merge Overlapped Anchors

Многие фигуры проще сначала нарисовать в виде кривой, затем развернуть её и работать уже как с полноценным объектом. Но практически всегда происходит одно и тоже - после преобразования кривой в заливку образуется огромное количество ненужных точек, которые жутко мешают при дальнейшем редактировании. Скрипт Merge Overlapped Anchors помогает справиться с проблемой и удаляет лишние точки не меняя форму объекта.


Скачать Merge Overlapped Anchors можно .

Round Any Corner

Сложную форму можно создать, объединив несколько простых форм или же набросав угловатое очертание. Дальше может потребоваться скруглить углы. Задача рутинная и требует времени. Скрипт Round Any Corner упростит эту задачу. Выделите нужные точки, запустите скрипт, введите значение угла закругления и наслаждайтесь результатом.

Tree-like

Деревья - один из часто используемых элементов. Рисовать дерево долго, а рисовать лес и можно вечность. Скрипт Tree-like рисует деревья на основе одной кривой и может менять вид дерева при изменении её размера. Быстро и красиво.

Tangents From A Point

Этот скрипт рисует касательные от точки к выбранному объекту. Точка может быть как на кривой, так и изолирована (в таком случае она исчезнет после работы скрипта). Полученные касательные можно изменять по своему усмотрению.



Add Highlight And Shadow Swatches

Нужны быстрые контуры затемнения и осветления? Используйте скрипт Add Highlight And Shadow Swatches. Он берет цвет из выбранного объекта, далее вам необходимо задать ему некое имя, после чего на панели цветов появятся его гармоничные оттенки.



Скачать Add Highlight And Shadow Swatches можно .

Layer Export

Скрипт Layer Export быстро сохранит каждый слой в отдельный файл в формате PNG или PDF. Имя файла будет соответствовать имени слоя, а располагаться они будут там же, где и исходный Ai.

Layer Compose

Скрипт Layer Compose позволяет быстро объединить content- и template-слои в композицию. Для этого необходимо назвать template-слой любым именем с нижним подчеркиванием вначале (_abc) и запустить скрипт.

Specify!

Выберите один объект, запустите скрипт Specify! и задайте направление измерения - у узнаете длину или ширину объекта. Выделите два объекта - вы узнаете расстояние между ними. Выделите группу - узнаете её длину.

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

Один из способов автоматизации повторяющихся процессов — использование скрипты, которые представляют собой некоторые последовательности команд, могут многократно воспроизводиться и являются наиболее мощным и в то же время самым сложным инструментом автоматизации работы в программе Adobe Illustrator. Скриптинг эффективен в самых разных ситуациях, если речь идет о большом числе однотипных действий, а применять скрипты можно как к отдельным изображениям, так и к группам изображений, эффективно сочетая их с макросами, что еще более облегчает и ускоряет процесс подготовки изображений и экономит немало времени.

В то же время на практике скрипты используются дизайнерами недостаточно широко. По всей видимости, из-за того, что для их написания необходимо знать один из языков объектно-ориентированного программирования: JavaScript, Visual Basic (Windows) или AppleScript (Mac OS). Однако все не так уж сложно, поскольку многие дизайнеры занимаются созданием Web-страниц, использующих JavaScript и потому имеют представление об объектно-ориентированном программировании, а этих знаний вполне хватает для написания скриптов. Есть и еще один аргумент в пользу JavaScript — данный язык относится к числу платформенно-независимых, а следовательно, написанные на нем скрипты будут работать как в Windows, так и в Mac OS. В данном уроке мы остановимся на технологии скриптинга на основе JavaScript в среде Adobe illustrator CS2, причем для повышения уровня доступности материала постараемся обойтись без сложных формулировок и без использования большого количества понятий — новых для рядовых пользователей, но принятых в программировании, поскольку многие из них при решении большинства стандартных дизайнерских задач необязательны. Желающие ознакомиться с JavaScript-скриптингом на более высоком уровне и с основами создания скриптов на Visual Basic и AppleScript могут обратиться к подробному руководству от компании Adobe (файлы документации вместе с примерами скриптов входят в поставку, и их можно найти в папке Scripting).

Теоретические аспекты работы со скриптами

В поставку Adobe Illustrator входит несколько готовых скриптов, ориентированных на решение наиболее часто повторяющихся задач, — в том числе скрипты для экспорта изображений в SVG-, PDF- и Flash-форматы. Входящие в поставку скрипты запускаются командой File=>Scripts (Файл=>Скрипты) (рис. 1), а хранятся в папке Presets\Scripts . Кроме того, в работе можно применять и демонстрационные скрипты, прилагающиеся к документации, — их можно выбрать из папки Scripting\Sample Scripts при помощи команды File=>Scripts=>Other Script (Файл=>Скрипты=>Другой скрипт).

Библиотеку встроенных скриптов можно неограниченно пополнять новыми скриптами, скачивая их из Интернета или создавая самостоятельно. В обоих случаях дополнительные скрипты просто копируют в эту же папку — после перезапуска программы они становятся доступными из меню File=>Scripts наряду со встроенными скриптами. В случае большого количества скриптов разумнее сохранять их не напрямую в папке Presets\Scripts , а в отдельных подпапках, число которых не ограниченно, причем все они будут представлены в виде отдельных подменю команды File=>Scripts (рис. 2).

В скриптах сохраняются практически все последовательности нужных действий и преобразований, которые в дальнейшем можно будет использовать при работе с другими изображениями. Однако есть и исключения: так, в скриптах не могут быть созданы такие объекты, как стили, кисти, графики, сеточные объекты и спирали, а кроме того, из скриптов не могут запускаться плагины.

Скрипты на языке программирования JavaScript представляют собой обычные текстовые файлы с расширением js и потому могут создаваться в любом текстовом редакторе, включая блокнот.

Концепция объектно-ориентированного программирования

Документ, созданный в программе Illustrator, представляет собой некий набор объектов, каждый из которых относится к тому или иному типу (например, является векторным, растровым, символьным и т.д.) и обладает определенными свойствами (шириной границы, цветом заливки и др.). К тому же каждый объект принадлежит некоторому документу, причем находится на его определенном слое и может быть подвергнут некоторым действиям (move, copy, duplicate и пр.).

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

В JavaScript для обозначения каждого типа объектов, методов и свойств существуют свои зарезервированные имена (или операнды), например pathItems означает векторный объект, symbolItems — символьный объект, RasterItems — растровый объект, GroupItems — элемент группы, Selection — выделенный элемент и т.д. (полный набор зарезервированных имен представлен в руководстве по скриптингу).

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

Полученные довольно длинные конструкции нетрудно сократить. Здесь можно не указывать ненужные в данном конкретном случае составляющие имени (в частности, если в документе всего один слой, то указывать его необязательно). Можно использовать ссылки на имена, вводя для обозначения части конструкции имени, которую придется многократно повторять, сокращенное имя (такие имена в языке программирования называют переменными). Имена лучше присваивать со смыслом, чтобы упростить ориентацию в теле кода. Например, если предварительно ввести конструкцию mypathItems=app.activeDocument.layers.pathItems , то рассматриваемый участок кода будет иметь вид mypathItems .

Не стоит использовать в качестве имен слова, задействованные в языке JavaScript для обозначения классов, свойств и методов, ибо это может привести к непредсказуемым результатам. Пример неверно определенной переменной — strokeWidth=app.activeDocument.layers.pathItems , слово strokeWidth используется для обозначения свойства «Ширина границы»).

До того, как приступать к экспериментам со скриптами, необходимо запомнить несколько правил:

  • в названиях переменных имеет значение регистр (то есть mypathItems и MyPathItems окажутся совершенно разными переменными);
  • номер элемента массива всегда указывается внутри квадратных скобок ;
  • любая конструкции скрипта (такие конструкции называют операторами) заканчивается либо символом «;», либо закрывающейся фигурной скобкой «}». Второй вариант имеет место лишь в тех случаях; когда в данной конструкции уже фигурирует открывающаяся фигурная скобка «{»;
  • количество закрывающихся фигурных скобок полностью совпадает с числом открывающихся;
  • каждую новую конструкцию лучше размещать на новой строке, а конструкции, размещаемые внутри фигурных скобок, лучше печатать со сдвигом по строке (рис. 3). Хотя данные приемы необязательны, но они значительно упрощают ориентацию в созданном скрипте и позволяют контролировать число открывающихся и закрывающихся фигурных скобок.

Принцип написания и отладки скриптов

Хотя язык JavaScript очень прост в освоении, он тем не менее остается языком программирования. На практике это означает, что довольно часто скрипты начинают правильно работать лишь после отладки, предполагающей исправление как явных, так и скрытых ошибок. Под явными ошибками понимаются неверные языковые конструкции, неверный синтаксис, попытки обратиться к несуществующим переменным и т.п. (о них сообщает Illustrator при попытке запуска скрипта). Причина появления скрытых ошибок — неверный алгоритм, и о таких ошибках можно догадаться только при внимательном анализе всех операций скрипта.

До того как скрипт заработает, его не раз придется редактировать и вновь запускать, поэтому лучше сразу поместить скрипт в меню File=>Scripts (Файл=>Скрипты), чем каждый раз долго выбирать его вручную при помощи команды File=>Scripts=>Other Script (Файл=>Скрипты=>Другой скрипт). Для этого откройте блокнот, сохраните пустой еще файл с расширением js в папке Presets\Scripts и перезапустите программу. Целесообразно специально отвести для отладки скриптов один пункт в меню File=>Scripts , например с именем debugging , — в этом случае, создавая очередной скрипт, можно будет вначале размещать его в файле debugging.js в папке Presets\Scripts , потом доводить «до ума» (удобство в том, что данный скрипт будет сразу виден в меню программы Illustrator), а после отладки сохранять в той же самой папке, но уже под персональным именем.

Освоение простейших конструкций языка JavaScript

Прежде чем переходить к примерам создания скриптов, которые могут автоматизировать процесс решения тех или иных дизайнерских задач, рассмотрим несколько простых учебных примеров, которые хотя и не имеют особой практической ценности, но помогут нам разобраться в принципах использования наиболее распространенных языковых конструкций. Для этого создайте в блокноте пустой файл debugging.js и сохраните его в папке Presets\Scripts. Далее загрузите программу Illustrator и создайте новый документ, разместив в нем три векторных контура, например три прямоугольника с широкой границей (рис. 4). Обратите внимание на размещение объектов в палитре Layers: находящийся в самом низу слоя объект был создан самым первым, а потому в разнообразных массивах он будет фигурировать под 0-м номером; при движении вверх по палитре Layers номера объектов будут увеличиваться.

Введите в файл debugging.js нижеприведенные строки

mypathItems = app.activeDocument.layers.pathItems;

mypathItems.strokeWidth=2.5;

mypathItems.strokeWidth=3.5;

mypathItems.strokeWidth=2.5;

и сохраните файл под тем же именем (рис. 5).

Конструкция mypathItems = app.activeDocument.layers.pathItems означает создание переменной с именем mypathItems , благодаря которой можно будет сократить обращение ко всем объектам первого слоя активного документа. Строка mypathItems.strokeWidth=2.5 говорит о том, что ширина границы (свойство strokeWidth ) у самого первого объекта станет равной 2,5 пикселам. Остальные строки идентичны.

Переключитесь на изображение в программе Illustrator и запустите созданный скрипт командой File=>Scripts=>debugging (Файл=>Скрипты=>Отладка). Результатом будет изменение ширины границы: у первого и третьего объектов на 2,5 пикселов, а у второго — на 3,5 пикселов. Поскольку в документе всего один слой, то рассмотренная конструкция может быть и короче (рис. 6).

На практике одинаковые преобразования (как в данном случае изменение ширины границы) чаще всего выполняются в отношении нескольких или даже всех объектов. Перечислять их вручную в скрипте, даже просто копируя строки, довольно долго; к тому же это чревато лишними ошибками и усложняет программный код. В таких случаях прибегают к циклам — при наличии в документе все тех же трех прямоугольников уменьшение границы в цикле у всех объектов до величины в 0,5 пиксела представлено на рис. 7. Наберите данные строки в файле debugging.js, сохраните и запустите скрипт для обработки рабочего изображения. Измененный скрипт дополнился оператором цикла:

for (условие цикла){

тело цикла

Условие цикла может выглядеть по-разному, но в большинстве случаев оно может быть представлено конструкцией i=0;i<имя_объекта.length;i++ , означающей изменение переменной i на одну единицу в сторону увеличения от нуля и до тех пор, пока ее значение не совпадет с числом объектов (length ) в активном слое активного документа. Тело цикла ограничено с обеих сторон фигурными скобками и может включать как одну, так и несколько строк (в зависимости от числа выполняемых в цикле действий), каждая из которых оканчивается символом «;».

Попробуем теперь изменить скрипт так, чтобы граница менялась лишь тогда, когда на изображении имеются выделенные объекты, и одновременно ознакомимся с оператором условного перехода, который в общем виде выглядит следующим образом:

if (условие) {

набор действий 1

набор действий 2

Подобная конструкция означает, что при истинности условия выполняется первый набор действий, а в противном случае — второй. В простейшем виде условие может быть представлено в виде равенства или неравенства, а любой набор действий заключается в фигурные скобки и может состоять из одного или нескольких действий, каждое из которых находится на отдельной строке и оканчивается символом «;». Попробуйте изменить скрипт в соответствии с рис. 8 и проверьте его на практике. Скрипт в этом случае дополнился новой переменной docSelected , используемой для обращения к выделенным объектам в цикле (переменная цикла увеличивается до тех пор, пока не станет равной числу выделенных объектов) и фигурирующей в операторе условия, который проверяется на наличие выделенных объектов. Как показывает проверка, данный скрипт при выполнении не выдает ошибок, но работает неверно — при наличии выделенных объектов ширина границы действительно меняется, но не у тех объектов, которые были выделены, а всего лишь у соответствующего числа объектов по порядку. Проблема кроется в строке mypathItems[i].strokeWidth=0.5 и будет разрешена в случае ее замены на конструкцию docSelected[i].strokeWidth=0.5 (рис. 9). Проверьте это сами, чтобы убедиться, что теперь ширина границы меняется только у тех объектов, которые были предварительно выделены.

Под конец введем в скрипт завершающий штрих — дополним его так, чтобы при отсутствии выделенных объектов на экране появлялось соответствующее сообщение (рис. 10 и 11). Для вывода сообщения воспользуемся оператором Alert , который обеспечивает отображение на экране произвольного текста, предварительно введенного в конструкции Alert в кавычках. Стоит отметить, что оператор Alert может оказаться полезным не только в случае необходимости сопровождать работу скрипта некоторыми сообщениями. Гораздо полезнее он может оказаться при отладке скрипта, когда совершенно непонятны причины неправильной работы скрипта. Применяя в таких ситуациях оператор Alert, можно проследить, как понимает программа ту или иную инструкцию, и таким образом вы сможете установить причину неверной работы программного кода.

Примеры создания и использования скриптов

Изменение оформления однотипных объектов

Часто бывает необходимо быстро изменить у всех однотипных объектов в документе те или иные свойства. Например, вам требуется изменить цвет заливки объектов либо слегка уменьшить или увеличить размер. В ручном варианте в этом случае придется выделять все интересующие вас объекты, что при значительном их количестве довольно утомительно. Поэтому создайте для таких операций серию скриптов, выполняющих данную работу автоматически. Допустим, вам требуется в уже готовом документе слегка уменьшить размеры большого количества символьных изображений (symbolItems ) (рис. 12), причем заранее неизвестно, на сколько пикселов необходимо уменьшить значения высоты (height ) и ширины (width ). В таком случае следует уменьшать на 1 пиксел, а если этого окажется недостаточно, то скрипт можно будет неоднократно запускать для дальнейшего уменьшения. Чтобы уменьшить значение свойства на некоторую величину в сравнении с первоначальным значением, перед знаком равенства в свойстве следует добавить знак «-» — в нашем случае соответствующая конструкция примет вид: mysymbolItems[i].height-=1 . Точно так же можно увеличивать значение свойства, введя вместо знака «-» знак «+». Созданный скрипт представлен на рис. 13, а результат его работы — на рис. 14.

Скрипты могут использоваться не только для изменения того или иного свойства объектов, но и для полного их оформления, что чаще всего осуществляется наложением графического стиля и тоже может быть автоматизировано. Графические стили (graphicStyles ), как и многие другие объекты, объединяются в массивы, и к ним можно обращаться по номерам. Для примера создадим скрипт, который будет накладывать определенный стиль на все векторные объекты, ширина границы которых меньше или равна 1 (на деле принцип проверки изображений зависит от особенностей их создания и может быть самым разным). Пример подобного скрипта приведен на рис. 15.

Утолщение слишком тонких границ

Довольно часто после разнообразных преобразований оказывается, что границы части объектов получаются слишком тонкими и могут быть практически невидимыми (рис. 16). Тогда ширину границы у таких объектов приходится увеличивать, а сделать это вручную при большом числе объектов — весьма проблематично. Гораздо удобнее выполнить данную работу при помощи подходящего скрипта, что займет считаные секунды. Задача такого скрипта состоит в том, чтобы перебрать все объекты, а те из них, которые имеют меньшую ширину границы (например 0,25 пикселов) — увеличить ширину границы до 0,5 пикселов. Остальные границы при этом должны оставаться неизменными. Созданный скрипт представлен на рис. 17, а результат его работы — на рис. 18.

Форматирование текстовых объектов

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

Вариантов таких скриптов можно придумать очень много, но мы остановимся на увеличении размера шрифта на 1 единицу и на изменении его цвета для всех текстовых объектов документа (рис. 19). Это предполагает перебор в цикле объектов из класса textFrames (так обозначают текстовые объекты) и корректировку их свойств characterAttributes.size (размер шрифта) и fillColor (в данном случае — цвет символов). Подобный скрипт представлен на рис. 20, а результат его работы — на рис. 21.

Выравнивание высоты и ширины объектов

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

Создадим скрипт, который будет выравнивать высоту всех объектов по высоте контрольного объекта, созданного последним. Его следует создать, задав нужную высоту вручную (рис. 23), причем ширина объектов изменяться не должна. Для этого достаточно просто перебрать в цикле все объекты, пересчитывая для каждого новую высоту по обычной пропорции и затем изменяя ее. Для изменения высоты воспользуемся методом resize (scaleX, scaleY) , где scaleX и scaleY — изменение значений ширины и высоты в процентах (в сравнении со старыми значениями). В нашем случае вычислять нужно только значение scaleY , а scaleX будет равно 100, так как ширина остается без изменения. Созданный нами скрипт представлен на рис. 24, а результат его работы — на рис. 25.

Встречается и такая ситуация, когда объекты требуется выровнять по ширине, оставляя их высоту неизменной. Автоматизировать процесс тоже поможет скрипт, который можно получить из предыдущего, заменив свойство height (высота) на свойство width (ширина) и отредактировав принцип масштабирования объектов в методе resize (scaleX , scaleY ), где в этом случае неизменным должно оставаться значение scaleY (рис. 26).

Форматирование таблицы

Если приходится регулярно работать с однотипно оформленными объектами, например с таблицами, содержимое которых, как и количество строк, постоянно меняется, но стиль оформления при этом сохраняется, то можно значительно ускорить процесс оформления таблицы, создав соответствующий скрипт. Предположим, что все ячейки таблицы создаются в белом цвете и не имеют границ (рис. 27). При оформлении необходимо залить заголовочные ячейки некоторым цветом (иными словами изменить значение свойства fillColor ) и добавить им тонкую границу шириной в 0,5 пикселов, что предполагает изменение свойств strokeColor и strokeWidth .

Под заголовочными ячейками в данном случае будем понимать ячейки, имеющие определенную левую границу — в нашем примере 40 пикселов. Цвет заливки ячеек будет отличаться от цвета границы, поэтому нужно сформировать две переменные цвета — назовем их colorNew и colorNew1 , для каждой из которых придется определить красную, зеленую и синюю составляющие цвета. После этого потребуется перебрать все векторные объекты в цикле и изменить свойства fillColor , strokeColor и strokeWidth тех из них, у которых левая граница равна 40 пикселам. Созданный скрипт представлен на рис. 28, а результат его работы — на рис. 29.

Обратите внимание, что в рассматриваемом примере сами ячейки (то есть соответствующие им прямоугольные объекты) присутствовали в документе, поэтому их параметры можно было изменять. Это означает, что при создании таблицы ее ячейки были нарисованы в виде прямоугольных объектов, а затем были скопированы в буфер обмена и продублированы командой Edit=>Paste in Front (Редактировать=>Вставить на передний план). После этого в копии ячеек был вписан текст, сгруппированный вместе с соответствующей ему прямоугольной ячейкой. При другой технологии создания таблицы для ее оформления потребуется совсем иной скрипт.

Экспорт и сохранение открытых документов

Бывает, что после работы с несколькими и даже со многими документами в конце работы их все необходимо сохранить либо экспортировать в нужный формат. Рассмотрим вариант экспорта всех отрытых изображений в формат jpg. При создании скрипта для выполнения данной операции, во-первых, нужно добиться того, чтобы изображения сохранялись с разными именами и в конкретной папке, а во-вторых, следует как-то переключаться с документа на документ при условии, что имена документов произвольны.

Для решения первой проблемы есть два пути — либо задавать папку-приемник, равно как и имя документа вручную в ходе выполнения скрипта (но это довольно утомительно, особенно в случае большого числа изображений), либо формировать папку и имя документа по определенному принципу. Мы пойдем по второму пути, то есть в качестве папки-приемника зададим фиксированную папку C:/temp/ , имя документа оставим тем же, а расширение jpg будет присваиваться автоматически, за счет выбора нужного формата экспорта. В итоге соответствующая строка скрипта в данном примере будет выглядеть следующим образом: fileSpec = new File ("C:/temp/ " + doc.name ), где doc.name — имя активного документа.

Вторая проблема — переключение с документа на документ — в скрипте будет решаться автоматически вследствие того, что каждый уже экспортированный документ будет сразу же закрываться, а активным станет загруженный перед ним. Однако нужно иметь в виду, что число рабочих документов в данном скрипте окажется величиной переменной, так что не удастся использовать ее в качестве верхней границы выполнения цикла. Поэтому перед циклом нужно создать дополнительную переменную для хранения исходного числа документов — docLength=documents.length .

Кроме того, закрывать изображения лучше командой doc.close(SaveOptions.DONOTSAVECHANGES ), а не doc.close(), поскольку во втором случае при закрытии каждого изображения программа будет требовать соответствующего подтверждения. Скрипт для решения сформулированной проблемы представлен на рис. 30.

Проведение пакетной обработки файлов

Довольно часто бывает необходимо проводить одинаковую обработку для групп файлов, например при приведении большого числа файлов к определенному виду. В таких случаях целесообразно выполнение скрипта в пакетном режиме. Хотя такой возможности в программе Illustrator не предусмотрено, но в пакетном режиме можно запускать макрос, в качестве одной из команд которого может выступать запуск нужного скрипта.

Представьте, что имеется очень много файлов, разработанных разными пользователями, и что их нужно максимально уменьшить в размере и перезаписать в одном формате EPS. В отношении каждого файла нужно выполнить две операции: удалить утяжеляющие файл ненужные кисти, графические стили, символы и цвета, а затем сохранить изображение в формате EPS. Теоретически можно поместить обе операции в один скрипт, который в дальнейшем запускается в пакетном режиме из палитры Actions (Действия), но на практике придется поступать иначе — воспользоваться макросом Delete Unused Palette Items из набора Default Actions , который отвечает за удаление неиспользуемых кистей, графических стилей, символов и цветов. К сожалению, возможности JavaScript несколько ограниченны, и потому для решения этой задачи пришлось бы применять команды docRef.swatches.removeAll() , docRef.symbols.removeAll() и docRef.graphicStyles.removeAll() , которые приведут к удалению всех цветов, символов и пр., а не только неиспользуемых, что нельзя признать оптимальным решением. Можно удалять ненужные графические элементы по очереди, но это отнимет очень много времени и сил. Благодаря же макросу Delete Unused Palette Items нужное нам действие будет выполняться в считаные секунды, поэтому мы остановимся на комбинировании скрипта и макроса.

Откройте палитру Actions (Макросы) при помощи команды Window=>Actions (Окно=>Действия) и создайте в ней новый набор действий, щелкнув на кнопке Create New Set (Создать новый набор), расположенной в нижней части палитры. Выберите макрос Delete Unused Palette Items , продублируйте его командой Duplicate (Дублировать) и перетащите дублирующую операцию в созданный набор макросов. Теперь нужно дополнить макрос операцией сохранения файла в формате EPS — за данную операцию будет отвечать специально созданный скрипт SaveAsEPS (рис. 31). Сохранять файлы будем под их исходными именами в папке C:/temp/ .

Казалось бы, логичнее оформить запуск скрипта в виде второго макроса в созданном наборе действий, но это будет неудобно при дальнейшей обработки файлов. Дело в том, что в пакетном режиме можно запускать только один макрос, поэтому для того, чтобы операция обработки файлов осуществлялась в один прием, дополните макрос Delete Unused Palette Items запуском скрипта и измените имя макроса. Запуск скрипта можно включить в набор при помощи команды Insert Menu Item (Вставить пункт меню) меню палитры Actions, указав в открывшемся окне команду File=>Scripts=>SaveAsEPS (Файл=>Скрипты=>Сохранить как EPS), рис. 32.

Для выполнения созданного макроса в пакетном режиме из меню палитры Actions откройте команду Batch (Пакетная обработка), в открывшемся диалоговом окне выберите набор макросов в списке Set (Набор), а затем — нужный макрос в списке Action (Действие). Далее в списке Source (Источник) установите вариант Folder (Папка), щелкните на кнопке Choose (Выбрать) и укажите ранее созданную папку-источник. В списке Destination (Приемник) выберите вариант Save and Close (Сохранить и закрыть) (рис. 33) и щелкните на кнопке ОК. Результатом станет появление уменьшенных в размере файлов в папке C:/temp/ — все они будут в формате EPS.

Обычно, если речь идёт о программах для дизайнеров, первостепенное внимание уделяется художественным возможностям приложений — инструментам рисования, фильтрам и т. п. Но в повседневной жизни приходится заниматься и рутиной. К счастью, ПО от Adobe (в т. ч. Illustrator) стало поддерживать написание сценариев (скриптов), позволяющих переложить монотонный труд на плечи машины. И вы уже не работаете в Illustrator — вы им управляете, а это, как говорят в Одессе, две большие разницы!

Отдавая отчёт, что подавляющая часть пользователей Illustrator — художники и дизайнеры, не сталкивавшиеся с программированием, постараюсь построить обзор функциональности сценариев так, чтобы у читателей не сложилось впечатления, будто для этого занятия нужны какой-то «особый» склад мышления и длительное спецобразование. Одновременно приношу извинения профессионалам за некоторые упрощения в формулировках в угоду доступности материала. Сам автор когда-то был в подобной ситуации и поначалу не считал эту сферу своей епархией. Но потратил на изучение менее двух недель и теперь утверждаю: имея минимальные представления о программировании, освоить скрипты — задача вполне посильная.

Сценарии под Illustrator можно писать на любом языке: JavaScript, Visual Basic (Windows) и AppleScript (Mac OS). Поскольку с первым знакомо большинство читателей (многие дизайнеры для полиграфии успешно справляются и с созданием интернет-страниц, в которых он используется), опираться будем именно на него. К тому же JavaScript платформенно-независим: написанные на нём скрипты будут работать в обеих ОС — Windows и Mac OS. Способ обращения к элементам — объектно-ориентированный: чтобы узнать, например, толщину окантовки у второго векторного элемента на первом слое, нужно написать следующую конструкцию:

app.activeDocument.Layer.pathItems.strokeWidth

Это можно интерпретировать так: сначала указывается объект наивысшего уровня в иерархии Illustrator (app — приложение, сокращённо от application), и далее выбор постепенно сужается до конкретного элемента (в активном документе работать на первом слое; затем в указанном слое выбрать второй по глубине залегания векторный объект и узнать у него толщину окантовки). Подобный метод обращения к элементам весьма удобен, поскольку позволяет легко ориентироваться во всём многообразии их типов, существующих в редакторе. С полной моделью взаимосвязей можно познакомиться по хорошо составленному описанию (входит в комплект Illustartor).

Квадратные скобки говорят о том, что элемент — часть массива. Массив — совокупность нескольких объектов, объединённых определённым признаком. Например, Layers, pathItems, RasterItems, GroupItems, Selection и т. д. — массивы, состоящие из однотипных объектов (слоёв документа, векторных контуров, растровых изображений, групп и т. п.). В скобках указывается индекс (порядковый номер) требуемого элемента в массиве. Так, запись Layer обозначает первый слой, поскольку первый индекс всегда «0».

К объектам можно обращаться и по названиям Layer[«Сhart»]. Для этого элемент нужно явно назвать — вручную, используя палитру Layers (двойной щелчок на названии объекта открывает окно с его свойствами), либо из скрипта. Чтобы не писать каждый раз громоздкую конструкцию с перечислением всей «родословной», используйте ссылки (references):

pI = activeDocument.Layer.pathItems;

Тогда вышеприведённый участок кода будет иметь вид: pI.strokeWidth.

К слою как к объекту допускается не обращаться каждый раз, если все операции происходят на одном и том же активном слое. И учтите, что в названиях переменных имеет значение регистр: если первый раз написать pI, а второй — pi, то скрипт выдаст ошибку и работать не будет.

В объектно-ориентированной модели существуют: само приложение, классы (типы объектов, или, используя более привычное понятие, существительные: слои, векторные объекты, группы и т. п.), методы (способы взаимодействия с ними — глаголы: move, duplicate и т. п.) и свойства (прилагательные: strokeWidth, fillColor, selected и т. п.). Чтобы легче ориентироваться, представьте, что приложение — это дом, в котором есть различные предметы — аналог классов (окна, двери), обладающие некоторыми свойствами (пластиковые, деревянные), с которыми выполняют определённые действия — методы (открывают, закрывают). Понимая суть подобной иерархии, гораздо проще разобраться в скриптинге.

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

Классы Layer, Group, Text могут содержать объекты того же класса, у которых также могут иметься дочерние. Полезная возможность объектного подхода — наследование свойств. Так, все векторные контуры (pathItems) являются дочерними для более общего класса — элементов страницы (pageItems). Следовательно, назначив определённые свойства pageItems, мы автоматически назначаем его и pathItems.

Несмотря на похожесть, классы Layers и Layer всё же различны. Первый — коллекция всех слоёв в документе, второй — только какой-то определённый, соответственно отличаются их методы и свойства. К первому можно применять методы add, removeAll, а ко второму — все операции, доступные для отдельного слоя. Непосредственно к объекту обращаются как к элементу соответствующего массива — в нашем случае через Layers, Layers и т. д.

Выделенному элементу соответствует отдельный класс — selection, который также является массивом (выделена может быть группа объектов). На особом счету в Illustrator классы pluginItems, Colors, Views. Первый имеет множество ограничений, связанных с тем, что объекты такого типа «не родные» для Illustrator. К ним относятся элементы Blend, Envelope, Mesh и аналогичные. Особенности остальных будем рассматривать по мере их использования.

Чтобы скрипт был «виден», его размещают в папке Presets.Scripts, расположенной в той, где установлено приложение. Рассматривать будем реальные примеры (это позволит сразу почувствовать полезность сценариев), а писать их под Illustrator CS, поскольку его скриптинг гибче предыдущих версий.

Пример 1: объединение объектов

Начнём с самого простого — напишем скрипт, соединяющий линиями подчинённые объекты с основным (нередкая задача при создании блок-схем, технической документации и аналогичных работах). И коснёмся таких базовых вопросов, как работа с выделенными объектами, создание новых слоёв, размещение объектов, изменение их порядка, создание и включение кривых в сложный путь (compound path).

Работа с такого рода документами предполагает широкое использование символов (symbols) — внесение изменений в них автоматически обновляет все созданные копии. Однако с такими элементами Illustrator работает не всегда корректно: бывает, что не считывает названия у объектов, являющихся копиями символов. В результате их отбор по имени невыполним. Обработка же всех элементов данного типа в текущем слое практической пользы не имеет. В итоге, я склонился в пользу альтернативного варианта, при котором сначала необходимо выделить требуемые объекты (проще всего — выбором одного символа и поиском его копий через командой Select.Same Instances), а затем выделить опорный элемент, с которым они будут соединяться.

Итак, начинаем. Для сокращения введём переменную sel, к которой будем обращаться, когда нужно провести какие-либо действия над выделенным объектом. Затем проверим, сколько элементов выделено (хотя к массиву selection также относятся и любые выделенные символы текста, проверять, что выделен не текст, не будем). Запись if (sel.length<2) означает, что мы сравниваем значение length (количество объектов класса sel) с двойкой — минимальным количеством для работы сценария. Если выделенных элементов меньше, будут выполняться действия, заключённые в первые идущие за оператором if фигурные скобки, иначе — идущие после else. При этом логично предусмотреть выдачу сообщения, чтобы сориентироваться в ситуации и понять, что нужно сделать.

sel = activeDocument.selection
if (sel.length<2) {br> alert (“Not enough objects to proceed! \nSelect at least 2 objects and the last — target object!”) }
else {

Alert — стандартная функция JavaScript, которая выводит окно с заданным текстом и кнопкой ОК. «\n» означает переход на новую строку и используется, чтобы размеры окна оставались небольшими. Текст, выводимый в окне, должен быть заключён в кавычки.

Подготовительный этап

Получим координаты центра опорного объекта. Поскольку мы условились, что он — самый верхний, его номер (индекс) — «0» (sel). Для вычисления координат будем использовать такие свойства объекта, как position (положение), width и height (высота и ширина). Значения position хранятся в массиве, состоящем из пары значений — координат по оси Х и Y, соответственно. Следовательно, к каждому нужно обращаться как position и position.

refObj_x = sel.position + (sel.width/2);
refObj_y = sel.position — (sel.height/2);

Мы получили координаты центра опорного объекта и присвоили их двум переменным для дальнейшего использования. Во второй строке стоит знак «—», т. к. за точку отсчёта в Illustrator принят левый нижний угол документа, а position выдаёт координаты верхнего левого угла элемента.

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

Создаём новый слой — он, как и любой элемент Illustrator, создаётся методом add(), применённым к соответствующему классу объектов. В скобках можно конкретизировать параметры действия: указать объект-назначение (им может быть, например, слой или даже новый документ, а также положение в месте назначения). В отличие от большинства методов, для add дополнительных параметров не предусмотрено, поэтому для переноса на самый верхний уровень воспользуемся специальным методом — zOrder, которому в качестве параметра укажем BRINGTOFRONT (зарезервированная константа, полный список которых приведён в документации). В принципе, если в документе всего один слой, специально указывать положение нового не требуется, поскольку Illustrator всегда располагает его выше текущего. Если же соединяемые объекты расположены не на самом верхнем уровне, вторая строчка будет нужна.

newlayer = activeDocument.layers.add();
newlayer.ZOrder(ZOrderMethod.BRINGTOFRONT);

Первую строку можно прочитать так: создать новый элемент путём увеличения (add) числа объектов требуемого типа (layers) и ссылку на только что созданный элемент присвоить переменной newlayer. В начальный момент слой пуст, т. к. в него ещё ничего не помещено. Для упрощения ориентации в сложном макете дадим слою название «Connectors» (методом name) — как видите, названия методов чётко говорят о выполняемых действиях.

newlayer.name = “Connectors”;

В учебных целях создадим не разрозненные соединительные линии, а объединённые в объект типа Compound Path — для удобства редактирования. Создание такого объекта повторяет уже известную процедуру, на этот раз применённую к классу compoundPathItems:

newCompoundPath = activeDocument.compoundPathItems.add();

Поскольку в прошлом шаге мы создали новый слой, он является активным — соответственно, создаваемые объекты будут располагаться на нём, и необходимости специально указывать его (activeDocument.newlayer) нет.

Определение координат подчинённых элементов

Этот процесс объединим с выводом самих соединительных линий, поскольку их количество должно соответствовать количеству объектов. Поочередно начинаем перебирать все выделенные элементы («i++» означает приращение на единицу) и считываем их координаты. Поиск начнём не с самого первого объекта из массива Selection (как вы помните, им выступает опорный объект), а со второго (sel). Следующие строки нам уже знакомы:

for(i=1; i < sel.length; i++) {
obj_x= sel[i].position + sel[i].width
obj_y = sel[i].position — sel[i].height

Получив координаты центра дочернего элемента, приступим к созданию линии, соединяющей его с опорным. Для каждого выделенного элемента создаём новый объект — векторный контур, входящий в класс CompoundPath, увеличивая общее количество контуров:

newPath = newCompoundPath.pathItems.add();

Для задания простых контуров в Illustrator существует метод setEntirePath, параметрами которого выступает массив из координат начальной и конечной точек — которые, как мы уже знаем, в свою очередь задаются в виде массивов из двух значений (положения по двум осям). Наконец, заканчиваем введённое в самом начале условие «если что-то выделено».

newPath.setEntirePath(Array(Array(refObj_x, refObj_y), Array(obj_x, obj_y))); }

Скрипт готов. Как видите, ничего сложного в нём нет: названия методов раскрывают их сущность, а объектно-ориентированная модель помогает чётко понимать иерархию объектов Illustrator. Особой практической ценности скрипт не представляет (он скорее обучающий), но на его примере были рассмотрены многие базовые понятия, на которые мы будем опираться в дальнейшем (работа с выделенными объектами, принцип их нумерации в массиве selection, определение координат, создание новых слоёв, вывод линий).

Пример 2: обнаружение слишком тонких контуров

Операции масштабирования в векторной графике применяются очень активно. Поэтому при уменьшении размеров объектов с тонкими линиями (если включён параметр Scale strokes) часто толщина их обводки становится ниже 0,25 pt (значения, после которого линии становятся слабо заметными) и оказывается причиной пропадания их при распечатке на струйном принтере. Встроенных в Illustrator функций поиска объектов со значениями обводки, меньше заданной, не предусмотрено. Вручную же найти их очень трудно — придётся выделять каждый объект в отдельности, что быстро отобьёт желание заниматься подобными проверками. Существенно упростит операцию скрипт.

Сам по себе сценарий в простейшем варианте небольшой, но мы зададимся целью сделать его более универсальным — расширим функциональность за счёт возможности указывать минимальную толщину в окне диалога. Конечно, можно в самом скрипте жёстко прописать эту величину и при необходимости каждый раз её корректировать, но, согласитесь, это неудобно. Также предусмотрим указание выделенного элемента как объекта-эталона с минимально допустимым значением окантовки. Параллельно для статистики подсчитаем количество элементов с изменённой толщиной и для наглядности их выделим.

Весь скрипт делится на две части: начальную (считывание значения из окна диалога или же у выделенного элемента) и заключительную (поиск среди всех объектов в документе и переназначение толщины окантовки). Кроме демонстрации доступа к объектам Illustrator, мы рассмотрим создание мини-интерфейса для ввода пользовательских значений.

Ввод значений

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

var mySel = app.activeDocument.selection;
var go = true;
if (sel == 0) {

Если ничего не выделено, минимальная толщина будет задаваться через окно диалога. Выведем его при помощи стандартной функции JavaScript — prompt. Она открывает окно с полем, в которое можно ввести значение и в дальнейшем его использовать. Синтаксис функции таков: сначала идёт текст-подсказка, который будет выводиться в окне (с учётом унификации работы скрипта не будем использовать кириллицу, поскольку она часто отображается некорректно), затем следует значение, которое будет по умолчанию стоять в поле ввода. Плюса целых два: возможность сразу задать минимально допустимую толщину и указать любое значение. Создав переменную, которой присвоено значение функции prompt, можно потом использовать его в своих целях.

Забегая вперёд, замечу, что Illustrator даёт полный доступ не ко всем типам объектов — некоторые остаются за бортом. Поэтому предусмотрим визуализацию не только исправленных элементов, но и недоступных скрипту, чтобы не искать их вручную — ведь в них также могут быть проблемные объекты. Чтобы не выводить два окна диалога (для значения толщины и определения, какие элементы выделять), воспользуемся возможностями JavaScript по обработке строк. Дело в том, что содержимое заполненного пользователем поля является «строкой» (блоком информации), в которой может находиться сколько угодно параметров (через разделители). Зная разделитель, значения отдельных параметров можно легко извлечь из строки.

Соответственно, текст-подсказка окна диалога будет таким: задание минимальной толщины окантовки и условное число: «1», если нужно, чтобы скрипт выделил исправленные элементы, «2» — те, к которым «достучаться» не удалось.

value = prompt (“Specify the stroke width threshold (in pt),\n What to select: corrected objects (1) or inaccessible (2)”, “0.25, 1”)

Изначально в поле установим 0,25 пункта (единицы измерения в Illustrator по умолчанию), но при его изменении будет использоваться новое значение, и «1». «2» нужно указывать, только если скрипт найдёт недоступные объекты (мы позаботимся, чтобы он в конце работы сигнализировал об этом). И они станут выделенными, что избавит нас от ручного поиска (как известно, встроенный поиск Illustrator оставляет желать).

Со считыванием значений из пользовательского поля разобрались, переходим к их обработке. Проверим, действительно ли поле не пустое (знак «!» обозначает отрицание, т. е. «!=» эквивалентно «не равно», null — зарегистрированное слово для пустого значения). Если в нём что-то есть, строку разбиваем на отдельные блоки при помощи функции JavaScript split (в качестве разделителя определим комбинацию из символов «,») и полученные значения заносим в массив splitString. После этого значениям из массива дадим описательные названия (первое будет определять толщину, второе — режим работы).

if (value != null) {
splitString = value.split(“, “);
weight = splitString;
type = splitString; }

Если же в пользовательском поле ничего нет — останавливаем выполнение сценария. Последняя закрывающая скобка — признак завершения условия, которое мы поставили вначале («если в документе ничего не выделено»).

else { go = false }

Если опорный объект специально выделен

Теперь напишем последовательность действий, если мы намеренно выделили элемент, чью толщину окантовки хотим использовать в качестве порогового значения. Выведем предупреждение о дальнейших действиях скрипта с помощью стандартной функции confirm (создаёт окно диалога с двумя кнопками — и). Если нажать <Сancel>, работа прекращается, если же согласиться, скрипт продолжит работу.

else { selectedMsg = confirm (“Stroke width of selected object will be used as threshold”)
if (selectedMsg != true) {
go = false;
} else {

Переходим к основной части сценария. Сознательно не рассматриваем ситуацию, когда выделены несколько объектов, — ведь для задания толщины окантовки достаточно выбрать лишь один. Да и какое значение использовать, если оно у элементов окажется разным? Как мы уже знаем, единственно выделенный объект будет иметь индекс «0», а для получения толщины окантовки у Illustrator существует свойство strokeWidth. Учтём, что в принципе, selection может содержать не только отдельные элементы, но и часть текста (например, выделенную случайно), что не входит в наши планы, поэтому перед началом работы проверим возможностями JavaScript тип выделенного элемента на принадлежность именно массиву:

if (sel isArray) {
weight = sel.strokeWidth;

Поскольку мы условились выделять только изменённые объекты, с самого опорного выделение нужно снять (обращаемся к его свойству selected):

sel.selected = false; } } }

Теперь мы полностью готовы к выполнению основной задачи сценария — поиска объектов: значение, которое будет использоваться в качестве минимально допустимой толщины, хранится в переменной wei.

Обстоятельства

Сравним его с аналогичным свойством у всех объектов в документе. Можно сразу перейти к поиску, но использование скрипта в повседневной работе потребовало учёта дополнительных обстоятельств — в макетах часто бывают как заблокированные слои, так и отдельные объекты. Следовательно, хоть в них поиск и работает, но вносить изменения нельзя. Чтобы обеспечить тотальную проверку, добавим в скрипт несколько операций: проверяя элементы на соответствие заданному критерию, одновременно разблокируем их, если это необходимо, и запомним индекс, чтобы после завершения проверки вернуть их в прежнее состояние. Вводим две переменные: первую для сокращённого доступа ко всем слоям в документе, а при помощи второй получим доступ только к заблокированным. Хранить порядковые номера последних будем в массиве, который создадим функцией JavaScript — new Array().

var dL = activeDocument.layers;
var blokedLayers = new Array();

Затем просмотрим все слои и у заблокированных (свойство locked=true) порядковый номер занесём в массив blokedLayers (при помощи функции push из JavaScript), после чего разрешим их редактирование (locked=false).

if (go == true) {
for (i=0; i if (dL[i].locked == true) {
blokedLayers.push(i);
dL[i].locked = false;Раньше мы условились исправленные объекты выделять, но после завершения работы скрипта на заблокированных слоях этого сделать не сможем — нужно вывести соответствующее предупреждение. Для этого используем признак lockedPresence, который установим, если хотя бы один слой заблокирован.

lockedPresence = true;

То же повторим и с отдельными заблокированными элементами. В простейшем случае достаточно проверить все векторные элементы (класс pathItems), в которые как подкласс входят compound pathes, — чтобы ничто не ускользнуло от всевидящего глаза скрипта.

Подводные камни

Кроме рассмотренной ситуации с заблокированностью, существует ещё один «подводный камень». Как уже отмечалось, некоторые элементы (в частности, Blend Group и Envelope) не являются «родными» для Illustrator, они принадлежат специальному типу рluginItem. При этом доступ к таким объектам в Illustrator не предусмотрен, они — «вещь в себе». «Достучаться» до них можно только через класс более высокого уровня — pageItems, через который мы сможем хотя бы определить их присутствие и вывести в конце соответствующее предупреждение. Оно будет говорить, что, запустив скрипт ещё раз и указав в качестве второго параметра в поле ввода «2», он выделит эти «черные ящики».

pgI = activeDocument.pageItems;

Для хранения индексов заблокированных объектов создадим массив blokedPathes, а для подсчёта количества изменённых введём переменную corrected.

bloсkedPathes = new Array();
corrected = 0;

Для всех объектов выполним проверку на принадлежность типу PluginItem (свойство typename): если таковые присутствуют, установим признак pluginItemExist (его состояние будет определять вывод предупреждения о наличии таких элементов). В случае же повторной проверки (когда второй параметр в поле ввода равен «2») будем их выделять:

for(i=0; i < pgI.length; i++) {
if (pgI[i].typename==“PluginItem”) {
pluginItemExist = true
if (type ==“2”) { pgI[i].selected = true }

Итак, все (или практически все) возможные ситуации, возникающие в работе, мы предусмотрели и определили для них действия.

Основная проверка

Теперь настал черёд собственно проверки макета на соответствие заданному критерию окантовки. Учтём, что среди объектов могут попасться и такие, у которых окантовки нет вообще (определяется состоянием признака stroked) — следовательно, их нужно исключить из проверки.

if((pgI[i].strokeWidth < weight)&&(pgI[i].stroked)) {
if (pgI[i].locked == true) {
blokedPathes.push(i);
pgI[i].locked = false;

Этот фрагмент кода можно интерпретировать так: определяем у каждого элемента наличие окантовки и её толщину. Если она меньше минимальной (if(pI[i].strokeWidth < weight), и объект заблокирован, его индекс занести в специально созданный для такой цели массив blokedPathes, после чего разблокировать для внесения возможных изменений. Знак && обозначает логическое «И» (обязательное совпадение двух условий) — толщины меньше минимальной и присутствия окантовки.

Затем фиксируем наличие заблокированных объектов (устанавливаем признак lockedPresence для вывода в будущем предупреждения о том, что не все изменённые могут быть выделены) и сам исправленный выделяем, а его окантовке присваиваем пороговое значение — и так для всех элементов. Для статистики параллельно будем подсчитывать количество изменённых объектов.

lockedPresence = true;
pgI[i].selected = true;
pgI[i].strokeWidth = weight;
corrected++;

Ранее были рассмотрены действия для выделения непроверенных элементов (type =«2»). Теперь определим, что должно происходить в стандартной ситуации — при обычном поиске потенциально проблемных объектов.

if (type =“1”) { pgI[i].selected = true }

Восстановление статуса заблокированных элементов

Главную задачу мы выполнили — проблемные объекты исправлены и выделены. Осталось восстановить status quo — всё первоначально заблокированное вернуть в прежнее состояние. Для этого в текущем цикле считываем содержимое массива, где хранятся индексы заблокированных объектов, и каждому соответствующему элементу устанавливаем признак locked = true (метод shift выводит из массива последнее занесённое в него значение). Поскольку общее количество объектов больше заблокированных, нужно позаботиться, чтобы после опустошения массива цикл проверки заканчивался.

if (blokedPathes.length >0) {
retrievedPathes = blokedPathes.shift();
pI.locked = true;} }

Затем аналогичные действия предпримем в отношении слоёв:

for (i=0; i if (blokedLayers.length >0) {
retrieved = blokedLayers.shift();
dL.locked = true; } }Вообще-то, для однотипных операций гораздо удобнее пользоваться функциями. Их преимущество в том, что единожды описав определённые действия, можно повторять их в полном объёме, просто вызывая в нужных местах функцию; так достигается компактность и читабельность сценария. Для повышения гибкости функции передают используемые в ней значения (параметры). Если же не хотите использовать функции, пропустите следующие два абзаца.

Составим две функции: первую — для разблокировки слоёв и объектов, вторую — для восстановления их атрибутов. Меняться в них будут только типы объектов (класс Layers и pageItems) и массивы для записи интересующих нас элементов (blokedLayers и blokedPathes) — они-то и будут фигурировать в качестве параметров функции. Первую запишем так:

function unlock(array, itemType)
if (itemType[i].locked == true) {
array.push(i);
itemType[i].locked = false;
locked = false;
}

Вместо array будем подставлять массив, вместо itemType — необходимый класс. Тогда получим два вызова — unlock (blockedLayers, dL) и unlock (blokedPathes, pgI). Аналогично запишем функцию для восстановления статуса:

function restore (array, itemType)
if (array.length > 0) {
retrieved = array.shift();
itemType.locked = true;
}

Вывод информации о результатах проверки

Это последний этап работы скрипта. Сначала определим условие вывода сообщения, если выбран поиск нередактируемых объектов, затем условие появления предупреждения о том, что такие объекты были обнаружены:

if (type == “2”) { b = “\nCheck selected!” }
if (pluginItemExist == true) {
alert (“Due to scripting restrictions some objects can"t be affected” + b) }

Логика выдачи предостережения о том, что не все исправленные могут быть выделены, такова:

if ((lockedPresence == true) && (pluginItemExist == false)) {
warning= “\nBecause some of them are locked they can"t be showed as selected” }

После чего выводим окончательные результаты:

alert (“Number of corrected objects are: “ + corrected + warning)

Вот, собственно, и весь скрипт. Как видите, эти несколько строчек выполняют колоссальный объём работы, на которую вручную вряд ли кто-то отважится. Сценарий же выполняется моментально (в масштабных проектах, при количестве элементов порядка нескольких тысяч, начинает сказываться производительность процессора). От вас требуется только выбрать его из списка имеющихся (можно даже этого не делать — Illustrator позволяет скриптам назначать «горячие клавиши») командой Edit.Keyboard shortcuts.Menu commands.Scripts. Но учтите: названия скриптов сортируются в алфавитном порядке, поэтому добавление новых или удаление старых может привести к переназначению клавиш соседним сценариям. Вывод: после изменений в папке Presets\Scripts проверяйте соответствие клавиш.

Мы постарались сделать скрипт универсальным, что сказалось на его объёме. В самом же примитивном варианте (без учёта описанных выше особенностей и подводных камней) он занимает буквально пару строчек:

minWidth = activeDocument.selection.strokeWidth;
pI = activeDocument.pathItems;
for (i=0; i < pI.length; i++) {
if((pI[i].strokeWidth < minWidth) && (pI[i].stroked)) {
pI[i].strokeWidth = minWidth;
}}

А десерт?

Следующий выпуск мы посвятим визиткам: напишем скрипт, автоматизирующий их раскладку на листе. Впрочем, он пригодится и для более широкого круга задач, поскольку не имеет привязки к размерам объектов. Как и положено, предусмотрим создание выпусков во избежание проблем при неточной порезке листа, а также поворот визиток (если их верх и низ существенно отличаются). Параллельно затронем вопрос поиска объектов, цветовая модель которых отличается от заданной, что тоже не редкость при подобных работах.

Журналов в свободном доступе.

На ту же тему:

    Новости 2019-04-03

    Как дополнительные белые чернила помогают создавать новые применения широкоформатной печати.

    Сегодня ряд моделей широкоформатных и сверхширокоформатных принтеров могут печатать чернилами дополнительного цвета — белого, что создаёт новые возможности применения этих устройств. Но в принтерах могут быть реализованы различные технологии печати белыми чернилами, и у разных технологий — свои возможности и ограничения.

В Illustrator есть целая куча инструментов, но даже со всем этим изобилием, всегда будет чего-то не хватать. Вот тут то и приходят на помощь скрипты и плагины. Используя их, вы можете выполнять такие задачи, которые сам по себе Illustrator выполнить не в состоянии. В этой статье вы познакомитесь с 10 бесплатными и наиболее полезными скриптами (сценарии) для Illustrator!

Скрипты?

Illustrator поддерживает сценарии от AppleScript, Visual Basic, JavaScript, и ExtendScript. В активированном состоянии они выполняют различные операции внутри Illustrator, а также могут вовлекать другие программы, такие как редакторы текстов, программы баз данных и электронных таблиц. Вы можете использовать как установленные по умолчанию или чужие готовые скрипты, так и создавать свои собственные. Для получения большей информации по сценариям в Illustrator, изучите документацию в папке Adobe Illustrator CS3/Scripting.

Устанавливаем скрипты

Скачайте желаемый скрипт. После поместите его в папку Adobe Illustrator CS3/Presets/Scripts и он появится в подменю скриптов. Чтобы запустить нужный вам скрипт в Illustrator нажмите File > Scripts и выберете его в выпавшем списке.


1) Закрыть все пути Закрыть все выделенные пути (Close All Paths / Close All Selected Paths)

Простой, однако, очень мощный скрипт. При помощи него вы сможете разделять многострочные текстовые поля в отдельные объекты текстовых рамок, облегчая задачу разделения списков, предметов навигации и многого другого.


3) Слияние текстовых рамок (Join Text Frames)

Этот скрипт может воссоединить разделенные текстовые рамки. Очень полезен, если вам понадобилось открыть файл pre-CS illustrator или же нужно скомбинировать несколько текстовых рамок вместе.


Этот скрипт способен создавать цветочные фигуры из обычных фигур. Отлично подходит для создания необычных узоров, логотипов и просто для экспериментирования.


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


6) Перевод CMYK в Pantone v.2 (CMYK to Pantone v.2)

Этот скрипт подберет для вас наиболее точное соответствие пантона из данного цвета CMYK.


7) Изменение оттенков Случайные цвета (Vary Hues / Randomize Colors

Этот скрипт создаст эллипс с указанным числом ключевых точек. Это может показаться простым, однако операция прилично облегчает процесс редактирования окружностей, создания кистей, сложных фигур и многого другого. В Illustrator есть функция, добавляющая больше ключевых точек в фигуру, однако вы не можете указать, сколько конкретно ключевых точек вы хотите добавить.



Похожие публикации