воскресенье, 31 марта 2013 г.

Пишем скрипты для Illustrator

Скрипт делает маркеры на выбраном объекте.
Альфа версия.
Я бы написал больше, but there no time to explain!
Таки нашел время, смотрите под катом!

UPDATE: Так я тут. Теперь по порядку:
Чтобы писать скрипты для Иллюстратора нужно знать программную теорию и основы ООП. Запускаем Adobe ExtendScript Toolkit (он кажись идет в комплекте с любой прогой от Адоб), и сразу жмакаем F1. Нам выводится список всех объектов и их функции в Иллюстраторе... вернее не только его, а вообще всех основных адобовских прог. Тут нужно учесть, что в Иллюстраторе уже есть некоторые уже созданые объекты в ОЗУ, которыми можно управлять. Непонятно? Чуть ниже поясню.
Алсо, незабудьте посмотреть примеры скриптов в папке с прогой (заботливые разработчики пихают примеры, документацию и среду разработки для скриптов)
function ToMillimeters (pointInteger) // обратный процесс
{
  var pointElement = pointInteger * 0.3528; 
    return pointElement;
    }
function ToPoint (millimeters) //В жопу поинты, даешь милиметры!
{
    var MM = millimeters / 0.3528;
    return MM; //возвращаем уже эти вашы поинты
    }
Функции преобразуют милиметры в поинты (пиксели что-ли?). Формулу нашел где-то в инете. Вообщем без этих функции сложно - я привык работать с милиметрами.
Точнее я пользовался только одной функцией ToPoint. ToMillimeters не понадобилась, но я все равно её оставил.
var Selection = activeDocument.selection[0]; //Первый элемент выделения.
И если быть точнее то я работаю лишь с первым объектом выделения (видите обозначение массива?). Если в выделений больше чем один объект - то скрипт тролльфейснет :D .
И обратите внимание на activeDocument. В справке вы не найдете такой класс, это уже созданый объект в ОЗУ Иллюстратора. Все уже созданые экземпляры классов в программе можно посмотреть в окошке Data Browser, тока не забудьте указать что вы работаете с Иллюстратором (при первом запуске в той херне, где надо это указывать будет написано Extend Script Toolkit)
function CheckSelection () {
if (Selection == undefined) //проверяем, выделен у нас объект?
{
alert ("Ничего не выделено!");
return false;
}
else
{
return true;   
    }
}
Ну да, да.... знаю что можно без фигурных скобок. МНЕ ОНИ НРАВЯТСЯ, БЛЕАТЬ!
if (CheckSelection ()){
var selectX = Selection.position[0];
var selectY = Selection.position[1];
var selectHeight = Selection.height;
var selectWidth = Selection.width; 
var markeroffset = Window.prompt ("Введите отступ для маркеров: ")
Для удобства в ScriptUI наиболее часто используемые формы диалога с пользователем можно вызывать через одну функцию. Удобно! Там еще есть форма "Да/Нет", обычное сообщение и еще что-то. Но опять таки - никто не запрещает создавать свои интерфейс.
var pathelements = activeDocument.pathItems; //создаем интерфейс для создания обьектов
Интерфейс - громко сказано, скорее ссылку быстрого доступа ;)
DrawMarker (new Array (selectX - ToPoint (markeroffset), selectY + ToPoint (markeroffset) ) ); //лево верхний угол
DrawMarker (new Array (selectX + ToPoint (markeroffset) + selectWidth, selectY + ToPoint (markeroffset)) ); //право верхний угол
DrawMarker (new Array (selectX - ToPoint (markeroffset), selectY - ToPoint (markeroffset) - selectHeight) ); //нижне левый угол
DrawMarker (new Array (selectX + ToPoint (markeroffset) + selectWidth, selectY - ToPoint (markeroffset) - selectHeight), 45 ); //нижнее правый
}
Вот я щас смотрю эту часть кода, и думаю "Что я курил, когда писал это?" Даже не надо меня просить объяснить что здесь происходит, я сам хз...
function DrawMarker (position, rotation) {
 if (rotation === undefined) rotation = 0; //это типо мы так опциональные значения делаем
И кстати очень тупо с опциональными значениями. Мб я что-то упускаю?
var line = pathelements.add (); //создан обьект, щас будем завать координаты для пера
var line2 = pathelements.add (); //вторая линия
line.setEntirePath (new Array ( //рисуем линию
new Array (0, 0),
new Array (0, ToPoint (6))
)
);
line2.setEntirePath (new Array ( //тоже линия
new Array (ToPoint (-3), ToPoint (3)),
new Array (ToPoint (3), ToPoint (3))
)
);
line.position = new Array (position[0], position[1]); //Перемещаем объект. Точнее пытаемся это сделать.
line2.position = new Array (position[0] - ToPoint (3), (position[1]) - ToPoint (3)); //Перемещаем вторую линию.
line.rotate (rotation);
line2.rotate (rotation);

}
Ну вот такие дела! У меня еще на работе есть скрипт который подготавливает объект к нарезки на плоттере, но там все намного проще. 

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

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