101 СПОСОБ  ЗАРАБОТАТЬ   НА ПЕЧАТИ

Визитки на конвейере

  • 4 февраля 2005 г.
  • 7851
В прошлом номере мы познакомились с базовыми возможностями механизма скриптов в Adobe Illustrator CS. Расширим наши познания и выберем задачу посложнее, имеющую практическую пользу. Речь пойдёт о визитках…

Спуск визиток на печатный лист

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

  1. Группировка всех объектов, дабы в дальнейшем визитка была единым целым.
  2. Разложение максимального количества визиток на листе с учётом обрезных меток. Предусмотрим их поворот — страховку от проблем при неточной резке листа, когда верх и низ визитки заметно отличаются.
  3. Центровка (если визитки двусторонние).
  4. Учёт выпусков (bleed) для компенсации неточной резки визиток по краям.
  5. Расстановка обрезных меток.

Результат — готовый к выводу спуск, сделанный всего одним нажатием мышки.

Группирование

Поскольку визитка может состоять из векторных и растровых объектов, для обращения к ним будем использовать pageItems — родительский класс для абсолютно всех элементов страницы. Группировка делается так: сначала объявляется группа (первоначально она пуста), а затем в неё заносятся элементы, из которых необходимо исключить саму группу. Последнее важно, поскольку группировка подряд всех элементов приведёт к попытке занести в группу её же саму (группа входит в класс pageItems), и скрипт выдаст ошибку. Так как ссылка на объекты класса page-Items уже определена в загрузочном скрипте, перейдём сразу к делу:

refGroup = gI.add();

Говоря казённым языком, этой строчкой мы объявили переменную refGroup и сделали её ссылкой на новый объект, созданный методом add для класса groupItems, — попросту, объявили новую, пока пустую группу. Для занесения в неё объектов будем использовать метод moveToEnd, при котором каждый новый член группы будет располагаться ниже самого нижнего элемента (по уровню залегания) из существующих в ней. Если этого явно не указать, произойдёт недопустимое изменение уровней объектов относительно друг друга, и вся композиция визитки изменится (по умолчанию Illustrator каждый новый объект располагает сверху над остальными, используя метод moveToBeginning).

В качестве параметров для перемещения в скриптовой модели Illustrator CS можно указывать пункт назначения (например, в новый документ) и задавать относительное положение дубликата в новом месте (допустим, move (app. Documents. add, Element Placement. PLACEATBEGINNING ) — это более универсальный способ, чем просто moveToBeginning, доступное в предыдущих версиях. Но в данном случае конструкция нам не нужна, воспользуемся кратким вариантом.

for (i=1; i pgI[i].moveToEnd( refGroup )}

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

У самого нижнего объекта желательно убрать контур — обычно на стадии утверждения макета он показывает границы визитки, в конечном же варианте не нужен. Чтобы обратиться к объекту, необходимо определить его индекс. Он легко вычисляется: самый верхний элемент в документе имеет индекс «0», следовательно, самый дальний (по глубине залегания) будет иметь индекс, равный числу элементов в массиве. Для удаления окантовки у нижнего объекта можно записать:

pgI[pgI.length-1].stroked = false;

Мы указали порядковый номер length-1 потому, что счёт элементов в массиве ведётся начиная с «0», а не с «1», а length (количество объектов) — с «1». Итак, первый этап работ выполнен.

Максимум визиток на лист

Для выполнения задачи определим, сколько визиток помещается на выбранном листе бумаги. Для этого необходимо определиться с длиной меток реза и их отступом от краёв визиток. Учтём один нюанс: в Illustrator в качестве основной единицы измерения по умолчанию приняты пункты, а возможность её изменения не предусмотрена (свойство документа rulerUnits имеет атрибут Read Only — только для чтения). Поскольку задавать размеры всё же привычнее в миллиметрах, введём поправочный коэффициент. После этого задаём длину меток реза и расстояние от них до визиток (10 мм и 3 мм, соответственно).

koef = 2.832;
cropsLenght = 10 * koef;
cropsOffset = 3 * koef;

Узнаём количество визиток по высоте, ширине и округляем до целого значения с учётом того, что хотя бы половина обрезной метки должна помещаться на листе (с обеих сторон). Воспользуемся floor — встроенной в JavaScript функцией, округляющей дробное число в меньшую сторону, и найдём ответ из неравенства: 2 * (cropsLenght/2 + cropsOffset ) + [количество визиток по ширине] * refGroup. width <= aD.width (aD уже задана в библиотечном скрипте) — рис. 1.

Для числа визиток по ширине и высоте получим:

numX = Math.floor( (aD.width — 2 * (cropsLenght/2 + cropsOffset) ) / refGroup.width );
numY = Math.floor( (aD.height — 2 * (cropsLenght/2 + cropsOffset) )/ refGroup.height );

Math — класс объектов JavaScript, позволяющий производить расширенные математические операции.

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

if confirm ('Do you want that ids will be rotated?') { rotation = true}
else { rotation = false }

При щелчке по кнопке ОК (confirm = true) признак rotation устанавливается, в противном случае — сбрасывается (в зависимости от его состояния будут выполняться разные действия).

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

column = gI.add();

Занесём исходную визитку в созданную группу. Метод переноса значения не имеет, поскольку визитки перекрываться не будут — выберем, например, moveToBeginning.

refGroup.moveToBeginning( column );

Количество визиток по высоте нам известно — numY. Количество необходимых копий — на единицу меньше, поскольку одна визитка в колонке уже имеется. Метод Duplicate создаёт копию объекта без смещения: он, как и move, позволяет задать дополнительные параметры, но пока они не востребованы:

for (i=1; irefGroup.duplicate();

Заметьте: продублированный объект, входящий в группу, автоматически становится её членом.

Теперь действия будут несколько отличаться в зависимости от выбранного вами в окне диалога. Если поворот нужен, будем его выполнять. Такие операции, как поворот или масштабирование, в Illustrator можно задавать двумя способами: в виде матрицы трансформаций и применением соответствующего метода трансформирования. Выберем второй способ как более простой. Метод rotate имеет такие параметры (по порядку): угол поворота, разрешение на поворот, необходимость изменения заливки шаблона (pattern), градиентной заливки, параметров окантовки и положение оси вращения.

Параметры можно опускать, если значения по умолчанию (для положения оси вращения это CENTER) менять не нужно. У нас всё так и есть, поэтому достаточно ограничиться строкой:

if (rotation == true) {
refGroup.rotate (180.0)

Каждая следующая визитка будет повернута на 180° по отношению к предыдущей — следовательно, повёрнутая и оставленная без изменений будут чередоваться автоматически, что нам и нужно.

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

Для раскладки визиток стык в стык очень удобен метод translate (сдвиг объекта относительно текущего его положения по осям Х и Y, соответственно), которому зададим в качестве параметра высоту объекта — translate( 0, — refGroup.height). Тут нужно сделать замечание. Поскольку объект вращается вокруг своего центра, он должен оставаться на месте. На самом же деле Illustrator почему-то его немного сдвигает, поэтому придётся прибегнуть к корректирующим методам, внося поправки по обеим осям (получены опытным путём).

refGroup.translate( 0.6, — refGroup. height + 0.1 )

Если поворот не нужен — всё гораздо проще:

} else { refGroup.translate( 0, — refGroup. height ) } }

Настала очередь копирования визиток поперёк листа. Очерёдность действий такая же, как и раньше, отличаться будет только количество копий (numX) и смещение (вправо на ширину визитки). Отсчёт опять ведём не с «0», т. к. первый вертикальный ряд (колонка) автоматически был создан в процессе дублирования визиток в предыдущем шаге. Предварительно колонку занесём в новую группу (общую для всех колонок) — для удобства при последующем их центрировании. Затем дублируем нашу единственную колонку по горизонтали необходимое количество раз.

all = gI.add();
column.moveToBeginning( all );
for (j=1; jcolumn.duplicate();
column.translate( column.width, 0 ) }

С созданием визиток покончено.

Размещение по центру листа

После объёмного предыдущего шага переходим к центрированию визиток, для чего используем свойства документа width и height. Но сначала жёстко зададим в качестве центра отсчёта (rulerOrigin) точку с координатами (0, 0) — это пригодится, если перед запуском скрипта были изменены размеры документа. Как известно, в таком случае Illustrator положения начальной точки не меняет, а все расчёты ведутся от неё, поэтому может произойти накладка (бывают и такие сюрпризы). Метод position нам уже знаком.

aD.rulerOrigin = Array(0,0);
posX = (aD.width — all.width)/2;
posY = aD.height — (aD.height — all.height)/2;
all.position = Array( posX, posY);

Визитки размещены; настал черёд шага ? 4 — выпуски (bleed) для компенсации неточной резки листа.

Создание выпусков

Будем формировать их, включая копии соответствующих колонок в обтравочные группы (Clipping Path). Масками для них будут прямоугольники заданной ширины с высотой, равной высоте колонки, или же группы all (что одно и то же). Метод создания прямоугольника основан на том, что он входит в общий класс кривых (pathItems), а задаются его параметры (в пунктах) в таком порядке: положение верхней точки, левой, ширина и высота. Таким образом, для маски получим:

clipMask = pI.rectangle( all.top, all.left, 10, all.height );

где pI = aD.pathItems — ссылка на все векторные объекты, определена в библиотечном скрипте. Ширину выпуска определим в 10 точек (около 3 мм), чего вполне достаточно. Обтравочная группа ничем не отличается от обычной за исключением свойства «clipped», которое должно быть установлено (true) — причём маской выступает объект, находящийся на самом её верху. Для поддержания порядка в макете все выпуски будем объединять в группу (clipGroup) с названием Bleeds.

clipGroup = gI.add();
clipGroup.name = 'Bleeds';

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

Каждый вновь создаваемый объект занимает самый верхний уровень среди всех в документе. Но в механизме скриптинга так происходит не всегда: при дублировании группы, вложенной в другую, дубликат помещается не сверху, а под родительский объект! Это расходится с общим принципом, зато позволяет гибко управлять элементами, если иерархия документа сложна.

Поскольку обтравочная группа clipGroup была создана последней и не входила в состав никакой группы, она находится наверху в документе, и её индекс «0». Точно так же была создана группа all (содержащая все визитки) — её номер «1», а ещё раньше — column — та, что нас интересует. Её индекс — «2».

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

Продолжив подсчёты, получим, что третий индекс будет иметь первый объект, помещённый в column; группа, состоящая из визиток второй колонки — 2 плюс количество элементов в первой колонке; первая группа во второй колонке — 4 плюс количество элементов в предыдущей колонке (не 3, поскольку добавилась группа, образованная визитками этой колонки — дубликат column) и т. д.

Попробуйте сами определить индексы объектов, необходимых для создания верхнего и нижнего выпусков. Имейте в виду: элементы имеют индексы, отличающиеся на количество элементов в колонке плюс 1 (сама колонка тоже является группой). Итак, продолжаем: создаём копию колонки для занесения её в clipGroup.

gI[2].duplicate(clipGroup,
ElementPlacement.PLACEATEND);

Тут мы воспользовались возможностью Illustrator CS дублировать объекты с одновременным изменением их глубины залегания. Для создания обтравочной группы осталось маску перенести на самый её верх и в свойствах группы установить параметр clipped.

clipMask.moveToBeginning(clipGroup);
clipGroup.clipped = true;

Обтравочная группа создана. Сразу же заносим её в обычную группу для хранения вместе с остальными ещё не созданными выпусками — порядок есть порядок!

clipGroup.moveToEnd(bleedGroup);

Чтобы она стала выпуском, осталось её зеркально отобразить по горизонтали относительно своей левой границы. На этот раз воспользуемся более гибким способом — матрицей масштабирования; только так можно для некоторых операций задать параметры, отличающиеся от используемых по умолчанию. В качестве масштаба по оси Х укажем -100.0, а по Y всё оставим без изменений (100.0). Эти значения передадим методу transform, которому, по аналогии с методом Rotate, укажем все необходимые параметры (разрешение на преобразование, центр преобразований — все остальные детально описаны в справочном руководстве).

scaleMatrix = getScaleMatrix( -100.0, 100.0 );
clipGroup.transform( scaleMatrix, true, false, false, false, 1.0, Transformation.LEFT );

Аналогично и с крайней справа колонкой, учтя её индекс и отобразив относительно правой границы (Transformation.RIGHT). Индекс определим исходя из таких соображений: общее количество визиток — numX * numY, к которому добавим количество нами специально созданных групп — 3 (all, column, clip- Group), а раз хотим иметь дело с самой правой колонкой, добавим количество колонок по горизонтали (numX). В результате получим (numX * numY + numX + 3). Попрактикуйтесь с созданием верхних и нижних выпусков сами.

Расстановка обрезных меток

Переходим к последнему шагу — меткам реза. Сначала определим их цвет. Это можно сделать двумя способами — используя образец (swatch) Regist-ration из стандартной палитры образцов, заданной в конфигурационном файле Adobe Illustrator Startup CMYK.ai (используя конструкцию aD.swatches["Registration"].color), либо создав собственный цвет. Применим универсальный второй вариант и попутно узнаем, как создавать пользовательские цвета.

Задание нового цвета отличается от привычной процедуры создания векторных объектов. Разница в том, что для этого нужно создать новый объект (функцией JavaScript new — поэтому он не станет обычным объектом Illustrator CS), а тип определит его цветовую модель (CMYKColor). Затем определим составляющие цвета как свойства этого объекта.

regColor = new CMYKColor();
regColor.cyan = 100;
regColor.magenta = 100;
regColor.yellow = 100;
regColor.black = 100;

Метки реза — не что иное, как векторные контуры, в модели Illustrator — объекты класса path-Items. Для удобства разнесём их и сами визитки по разным слоям, для чего создадим дополнительный слой. Назовем его «Crops».

lA = aD.layers.add();
lA.name = "Crops";

Теперь зададим количество меток по вертикали (их количество должно быть больше визиток на единицу), а затем вычислим координаты начальной и конечной точек для левого ряда меток (рис. 2):

for (i=0; i < numY+1; i++) {
refX1 = posX — cropsLenght — cropsOffset;
refY1 = posY — i * refGroup.height;
refX2 = refX1 + cropsLenght;
refY2 = refY1;

Очень удобен способ создания простых контуров при помощи метода setEntirePath, в качестве параметров для которого нужно передать координаты обеих составляющих его опорных точек (anchor). Параллельно присваиваем им необходимые параметры — толщину (0.2 pt) и цвет. Поскольку точно такие же операции будут проводиться для вертикальных меток, оптимальнее записать их в виде функции.

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

В качестве переменных данных у нас будут выступать координаты опорных точек и их цвет.

function makeCrops( X1, Y1, X2, Y2, color ) {
pathNew = pI.add();
pathNew.setEntirePath ( Array ( Array
(refX1, refY1), Array (refX2, refY2) ) );
pathNew.strokeWidth = 0.2;
pathNew.strokeColor = regColor; }

Функция описана. Она создаёт простой путь из двух точек (по координатам refX1, refY1 и refX2, refY2) с заданными атрибутами — будем вызывать её для создания каждой обрезной метки. Для удобства лучше разместить её в конце скрипта. Мы не указывали принадлежности путей новому слою (pathNew = activeLayer.pI.add()), поскольку после создания слой автоматически становится активным и рабочим. Вызываем функцию (в скобках — передаваемые параметры):

makeCrops( refX1, refY1, refX2, refY2, regColor );

Она создаёт левый ряд меток — нам остаётся только сделать его копию, которую потом нужно переместить в правый ряд (см. рис. 2). Используем метод translate:

pathNew.duplicate();
pathNew.translate ( all.width + cropsLenght + 2 * cropsOffset, 0 );

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

for ( i=0; i < numX+1; i++ )
{
refX1 = posX + i * refGroup.width;
refY1 = posY + cropsLenght + cropsOffset;
refX2 = refX1;
refY2 = refY1 — cropsLenght;
makeCrops( refX1, refY1, refX2, refY2, regColor );
}

Завершающий штрих — последнюю группу смещаем вниз на требуемое расстояние:

pathNew.translate ( 0, — ( all.height + cropsLenght + 2 * cropsOffset ) )

Скрипт готов. Действия при его написании охватывают множество часто используемых функций: преобразования над объектами с помощью простых и специальных методов (более гибких — через матрицу трансформаций); дублирование элементов с одновременным расположением их в нужном порядке; создание обтравочных групп и пользовательских цветов; перемещение объектов двумя способами — указывая абсолютные координаты (метод position) и относительные (метод translate); изменение глубины залегания элементов; создание слоёв и работу на них; группировку объектов; использование особенностей класса pageItem. Мы оценили удобство использования функций и, главное, рассмотрели механизм индексирования объектов Illustrator.

Поиск объектов определённой цветовой модели

Поскольку в этом выпуске затронута тема создания визиток, попробуем автоматизировать все процессы, связанные с их подготовкой к печати. Одна из насущных задач для визиток, печатающихся заказными красками, — проверка наличия в макете объектов только со смесевыми цветами, что особенно актуально при переходе к такому варианту от первоначального триадного. К счастью, разработчики Illustrator уже давно позаботились, чтобы в одном макете не смешивались объекты, принадлежащие разным цветовым моделям (одна из постоянных головных болей для пользователей CorelDRAW). Но это касается только вариантов CMYK/RGB и экзотических HLS/HSB/Lab/YIK — остальные же (например, смесевые цвета) могут вполне миролюбиво соседствовать с CMYK.

Для проверки макета можно воспользоваться встроенными возможностями Illustrator (палитра Document Info), но в ней только констатируется наличие или отсутствие проблемных объектов. Локализовать их не так-то просто, особенно если логотип состоит из множества мелких деталей, полученных трассировкой растрового изображения. Причина написания скрипта — автор сам столкнулся с подобной проблемой. Предлагаемое решение сохранит и вам массу времени.

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

value = prompt ("Specify the color model you find ( CMYK/Spot )", "CMYK")

Пользователю предлагается ввести одно из двух значений, по умолчанию в окне будет стоять CMYK. По логике вещей поиск мог бы ограничиться только элементами типа pathItems, но мы уже знаем, что универсально использование класса pageItems. В любом случае нам будет достаточно возможностей, заложенных в библиотечный скрипт.

//@include "~/predefined.js"

Для контроля будем вести счёт конвертированным объектам. Первоначально их 0.

numConverted = 0;

Чтобы знать друзей в лицо, будем их отмечать (выделять); соответственно, позаботимся, чтобы все объекты были видимыми. Однако визуализация всех без разбора невидимых объектов неоправданна, т. к. может нарушить общую композицию (если спрятанные расположены выше остальных). Поэтому будем «выводить на чистую воду» только тех, кто объявлен в розыск — будем устанавливать видимость принудительно только для тех, чья цветовая модель не соответствует требуемой. Так мы обезопасим себя от вышеописанной ситуации, ведь параллельно с решением технологических вопросов по каждому объекту индивидуально можно сохранять первоначальный вид визитки.

В руководстве по скриптингу процедура получения цветовой модели у объектов не описана, но это нас не остановит. Если гора не идёт к Магомету… Пойдём на хитрость и узнаем метод хранения сами — создадим объект в любой цветовой модели и, выделив его, запустим тестовый скрипт:

alert (activeDocument.selection[0].fillColor)

Этой строкой мы вынуждаем Illustrator CS сообщить интересующую нас информацию. Редактор к нашему вящему удовольствию выдаёт в окне: [CMYKColor] (или [Spot- Color]) — детали не столь важны. Главное, мы узнали формат хранения информации о модели: стандартное название, после которого сразу же идёт окончание Color, и всё это заключено в квадратные скобки. Получив ответ, мы решили проблему с дефицитом информации. Для удобства введём переменную searched, которой обозначим всю искомую конструкцию:

searched = "[" + value + "Color]"

Вместо value будет подставляться значение, введённое пользователем в окне диалога.

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

for ( i=0; iif ( pI[i].locked == true ) { pI[i].locked
= false;
}

проверка условия:

if ( (pI[i].fillColor == searched) || (pI[i].strokeColor == searched)) {
if (pI[i].hidden == true) { pI[i].hidden == false; }

Его логика такова: если окантовка или заполнение объекта имеют некорректную цветовую модель и к тому же он скрыт (соответственно, недоступен для выделения), делаем его видимым, после чего переходим к основному: выделяем объект и увеличиваем счётчик количества небезопасных элементов.

pI[i].selected = true;
pI[i].name = "Converted";
numConverted++; } }

На всякий случай мы переименовали каждый проблемный объект в Converted (пригодится при ручном поиске в панели слоёв). Параллельно проверяем на принадлежность хорошо известному своей коварностью классу pluginItem. При положительном результате реагируем:

if ( pI[i].name == "pluginItem" ) { plgItemExist = alert ( "\npluginItems Exist !!") }

«\n» обозначает переход к новой строке в поле окна. В финальной части скрипта выведем отчёт о проделанной работе: информацию об общем количестве просмотренных объектов; количестве проблемных; если были найдены «чёрные ящики» — pluginItem — выводим дополнительное сообщение.

alert( i + " objects processed. Found: " + numConverted +"\n\nThey were renamed to Converted " + plgItemExist);

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

  1. сохранить выделенные объекты через пункт меню Illustrator Select * Save selection (понадобится ввести название для набора; для повторного выделения объектов достаточно выбрать его из меню Select);
  2. после внесения изменений запускать скрипт повторно — до тех пор, пока проблемные объекты не пропадут.

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

Другое ограничение скрипта — пассивность по отношению к pluginItem. Но и это не проблема: обойти её можно, запустив скрипт, ищущий объекты с толщиной окантовки, меньше заданной (см. Publish, ? 7). В качестве пороговой величины укажите заведомо недостижимое значение (например, 10 пунктов) и вручную проверьте найденные объекты. Такая вот преемственность получается…

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

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

А каталог может заменить просмотрщик, специализирующийся на формате AI и PDF: он создаёт один многостраничный pdf-файл с миниатюрами всех документов этих типов, содержащихся в заданной папке — достаточно открыть его при помощи Acrobat Reader и распечатать.

Об авторе: Михаил Борисов, (mborisov@yahoo.com), пишет для Publish полезные советы и обзоры ПО.


Собираем библиотеку

В скриптах регулярно используется доступ к стандартным объектам Illustrator, поэтому есть смысл не определять их снова и снова (aD = app.activeDocument; sel = aD.selection и т. д.), а создать отдельный скрипт-библиотеку для последующего вызова: благо механизм сценариев, усовершенствованный в Illustrator CS, это позволяет. Создадим файл predefined.js такого содержания

aD = app.activeDocument;
sel = aD.selection;
pgI = aD.pageItems;
pI = aD.pathItems;
gI = aD.groupItems;

и сохраним его в каталоге C:\Documents and Settings\username (username — имя пользователя). В скрипте для вызова библиотеки достаточно написать строку //@include "~/predefined.js". Конструкция «//@» — расширение стандартного JavaScript и управляющая для скриптового модуля Illustrator CS («//» определяет комментарий в JavaScript), а знак тильда «~» соответствует вышеуказанному пути расположения файла. В принципе, для указания местонахождения библиотечного файла допускается использовать стандартные обозначения типа «../» для перехода к другим папкам.

ПОХОЖИЕ СТАТЬИ
Тире без отступа

Году в 2008-м в комментариях тогда ещё «Живого журнала» случился прелюбопытнейший спор об оформлении абзацного отступа: ведь правый край текстового фрейма даже при множестве переносов и с отключённой оптической компенсацией всегда выглядит сносно, а вот левый по умолчанию страдает — от красных строк и реплик; как с этим быть?

RGB-workflow в печати: почему «цифра», а не традиционный офсет

У дизайнеров есть мечта: получать в печати на бумаге нечто близкое по насыщенности к RGB-охватам, нежели тот маленький цветовой охват, что традиционно позволяют получить печатные краски европейской, да и любой другой триады CMYK.

Иллюстрируем мобильно

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

Допечатные эксцессы или 6 «детских» ошибок

Рейтинг самых частых ошибок в макетах печатной продукции по опыту типографии FastPrint, принимающей заказы через автоматизированную систему онлайн-проверки.

Лак и фольгирование со скоростью «цифры»

Подготовка макетов для цифрового облагораживания: выборочного УФ-лакирования и фольгирования.



Новый номер

Тема номера: Больше порядка. R-SUPERLAM AF-540. Пятикнижие конструкторов-полиграфистов. ARK-JET SOL 1804. Офсет – при своих. Когда ты – вне конкуренции. Бум в этикетке и не только. Глобальный плакат. Скрепка 2024. Интерлакокраска-2024. Инлегмаш 2024.



Организовав печать по текстильным материалам, стоит ли заводить своё швейное производство или лучше печатать на сторону?
    Проголосовало: 29