Preview в диалоговом окне Adobe Illustrator

Поделиться
Отправить
Плюсануть
Класснуть

Привет!

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

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

Как же сделать preview?

  1. Нам необходимо создать checkbox, чтобы контролировать - показывать или не показывать результат выполнения скрипта.
  2. Создать переменную isUndo, для проверки надо или откатить действия скрипта
  3. После того как создали checkbox, нам понадобятся 2 метода глобального объекта “app”: app.undo(), app.redraw()

Алгоритм для preview:

  1. Если скрипт уже был запущен - отменяем его действия через app.undo();
  2. Далее запускаем скрипт(т.е. делаем какие-то изменения)
  3. У переменной isUndo меняем значение на true
  4. Запускаем перерисовку документа app.redraw()

Очень важное замечание, количество app.undo() должно быть строго столько, сколько было изменений в действии скрипта. Т.е. если мы вызовем метод app.undo() хоть на 1 раз больше, чем было до запуска скрипта - можем получить краш Illustrator. Как всегда в скриптинге Adobe Illustrator есть очень много различных багов-фич - это одна из них.

app.redraw() не даёт гарантии что изменения были внесены, т.е. app.undo() нужно использовать только тогда, когда были изменения в документе и эти изменения были записаны в историю. Иначе мы получим на 1 app.undo() больше, чем нужно и можем получить вылет AI.

Еще бывает так что некоторые действия записываются в историю независимо вызвали ли вы метод app.redraw() или нет - это тоже нужно учитывать. Итого вы должны возвращаться к той точке в истории, с которой начинали запуск скрипта и делать запускать скрипт снова.

Пример реализации preview:

var isUndo = false;

// start action
function startAction() {
    code body...

    isUndo = false;
}

function previewStart() {
    if (preview.value) {
        if (isUndo) app.undo();
            else isUndo = true;

        startAction();
        app.redraw();
    }
        else if (isUndo) {
            app.undo();
            app.redraw();
            isUndo = false;
        }
}

// if cancel
win.onClose = function () {
    if (isUndo) {
        app.undo();
        app.redraw();
        isUndo = false;
    }

    win.close();
}

Предыдущий проект Рандомная сортировка элементов - Adobe Illustrator scripts
Следущий проект Раскладка на печать в Adobe Illustrator

Контакты

work@ladygin.pro