Alexander ladygin web, frontend, design

Как сделать preview в диалоговом окне - Adobe Illustrator scripts

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

Привет!

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

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

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

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

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

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

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

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

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

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

var win = new Window('dialog', 'My script');
var isUndo = false;
var preview = win.add('checkbox', undefined, 'Preview');
preview.onClick = function() { previewStart(); }

// 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();
}

Контакты