Скрипты для упрощения рабочего процесса в After Effects своими руками. Часть 2.

Всем мир, братья!

Продолжаем нести свет просвещения и упрощения людям. Ну и немного выслушивать моё нытьё на предмет: «оооуу, как тут всё неудооообно». Следующее что выбешивало меня в постоянной работе с векторными иллюстрациями — это процесс их перевода в шейпы. Подготавливаешь себе персонажа, переименовываешь все слои, вот Pelvis, тут у нас Leg_L а из этого места Arm_forearm_R торчит. Всё сделал, назвал как нужно и тут ты понимаешь что много чего тебе придется переводить в шейпы. Нажимаешь правую кнопку мыши, жмешь Create Shape from Vector Layer… и все начинает сходить с ума 🙂 Слои куда-то улетают, появляется долбанная приписка Outlines в каждом из них, крики, паника. В общем пишем следующий скрипт.

Задача:

скрипт, который переводит векторные слои в шейпы с сохранением имени и индекса.

И первое с чем нам необходимо познакомиться в рамках этой задачи — команды app.findMenuCommandId() и app.executeCommand(). Мы же с вами пытаемся эмулировать нажатие на пункт меню, а в АЕ для этих целей есть замечательные команды, findMenuCommandId() ищет идентификатор команды по названию, а executeCommand() — выполняет эту команду.

Так что если на выделенном векторном слое выполнить

то он преобразуется в шейп.

Теперь нужно удалять слово Outlines и сделать возможность выделять несколько слоев. И тут нам придется решить еще пару сложностей. Дело в том, что нам легко получить набор выделенных слоев (для этого у композиции есть массив selectedLayers), но получить набор шейпов, которые сгенерировала команда «Create Shape from Vector Layer» так легко не получится. К тому же эта команда игнорирует последовательность входящих слоев. А значит если ты выделил слои с индексом 3,1,8,5 (в такой последовательности), то шейпы получишь в последовательности 1,3,5,8.

Поэтому логика кода будет такая: запоминаем последовательность выделенных векторных слоев, сортируем их по индексу, генерируем шейпы, передвигаем их к оригинальным слоям на таймлайне:

Немного разъяснений

Интересно применение функции sort(): она встроена в каждый массив по умолчанию, но как именно сортировать его — не знает. Поэтому в качестве параметра передаём функцию, которая подсказывает ей как именно нужно сравнивать элементы массива (напоминаю, что каждый элемент массива — слой, у которого есть параметр index). Про функцию сортировки.

Функция replace () удаляет/ изменяет подстроку в строке.

Функция <layer2>. moveBefore (<layer1>) / moveAfter(<layer1>)  ставит слой 2 перед/ после слоя 1 на таймлайне.

Отдельно стоит объяснить цикл. После генерации шейпов они выстроятся последовательно в самом верху таймлайна. У нас нет списка новых слоев, но есть их количество, значит делаем цикл по количеству слоев, берем первый шейп (это будет comp.layers[1]) и отправляем его на его место, а старый слой удаляем. После этого второй шейп становится первым, отправляем его на его новое место и так далее.

Упакуем все в кнопку.

Второй способ запускать код из ftToolbar: создаем новую кнопку, выбираем тип JAVASCRIPT и вставляем код в окно комманды. Вот результат: