Adobe extendscript что это
В этом документе объясняются различия в синтаксисе языка выражений между движками выражений JavaScript и Legacy ExtendScript в After Effects 16.0.
Обращайтесь к этому документу, чтобы узнать, как улучшить выражения для движка выражений JavaScript, или при исправлении ошибок, которые возникают, когда выражения, написанные для предыдущих выпусков After Effects, не удается оценить в движке выражений JavaScript.
Язык выражений в After Effects основан на JavaScript, который представляет собой реализацию ECMAScript. Движок выражений JavaScript в After Effects 16.0 основан на ECMAScript 2018. Движок выражений Legacy ExtendScript основан на ECMAScript 3 (1999). (Adobe ExtendScript — это также язык, который используется для создания сценариев в After Effects и других приложениях Adobe.)
Вы можете следовать приведенным ниже примерам, а также рекомендациям по созданию выражений, которые работают в обоих движках выражений JavaScript и Legacy ExtendScript.
Основные различия между движками выражений JavaScript и Legacy ExtendScript:
- Современный синтаксис JavaScript: Дополнения, внесенные в JavaScript с ECMAScript 5 по ECMAScript 2018, позволяют использовать новый синтаксис и методы в выражениях при использовании движка выражений JavaScript. Кроме того, в синтаксис выражения при использовании движка выражений JavaScript внесены некоторые небольшие улучшения. Вот некоторые основные отличия:
- Выражение .значение больше не требуется при ссылке на другие свойства из исходного текста
В выражениях можно использовать синтаксис JavaScript из ECMAScript 2018
С момента выхода ECMAScript 3 в язык JavaScript было внесено много дополнений. Появились новые, более компактные и удобочитаемые методы для использования со строками, массивами и объектами. Также появились новые способы объявления переменных и функций, а также параметров по умолчанию, операторов spread и многого другого. Этот документ не охватывает такие изменения, так как это общие изменения языка JavaScript. Ресурсы для изучения многих синтаксических дополнений можно найти по следующим ссылкам:
Дополнительные рекомендуемые, углубленные ресурсы для изучения JavaScript:
Выражение .значение больше не требуется при ссылке на другие свойства из исходного текста
Для ссылки на другое значение свойства из свойства исходного текста, движок Legacy ExtendScript требует добавить выражение .значение в конце данного свойства. По умолчанию движок выражений JavaScript показывает значение свойства, если только не был явно использован еще один атрибут, такой как .propertyIndex или .name .
Заморозка значений свойств с помощью posterizeTime(0)
В After Effects 16.0 выражение posterizeTime(0) замораживает значение свойства в композиции в момент времени 0. Это относится к обоим движкам выражений JavaScript и Legacy ExtendScript.
Этот подход не является обратно совместимым и может привести к неожиданным результатам в версиях After Effects до 16.0.
Почти весь синтаксис выражений для движка выражений Legacy ExtendScript совместим с движком выражений JavaScript. Однако есть устаревший синтаксис, который несовместим с движком выражений JavaScript. Иногда это вызвано изменениями синтаксиса в современном варианте JavaScript. В других случаях устаревший синтаксис был удален. Ниже приведены примеры нерабочего и рабочего синтаксисов.
Отличается синтаксис if. else
В общем случае рекомендуется всегда писать операторы if. else с разрывами строк и скобками в соответствии с рекомендациями MDN. Движок Legacy ExtendScript был терпим к свободному синтаксису в операторах if. else , однако движок JavaScript требует строгого соблюдения синтаксиса. При использовании движка JavaScript выражения if. else с неверным синтаксисом не обрабатываются.
Не допускается завершать условный оператор без оператора else.
Для движка JavaScript необходимо явно указать, является ли часть else условного оператора последним оператором в данном выражении:
Это выражение правильно обрабатывается и движком JavaScript, и движком Legacy ExtendScript.
if и else не могут находиться в одной строке без скобок
Движок Legacy ExtendScript вычисляет следующее выражение равным 100, если параметр time больше 1 секунды. В противном случае оно вычисляется равным 50:
В операторах if. else необходимо использовать разрывы строк и скобки, чтобы они обрабатывались движком JavaScript. Для простых случаев вместо этого можно использовать трехместный оператор. С движком JavaScript можно использовать любой вариант следующего синтаксиса:
Все указанные выше решения правильно обрабатывается и движком JavaScript, и движком Legacy ExtendScript.
Выражения не могут заканчиваться объявлением функции
Следующий пример работает для движка Legacy, но не для движка JavaScript:
Если в последней строке вызывается функция (вместо объявления), такое выражение правильно обрабатывается обоими движками:
Сокращенный синтаксис this() не допускается, вместо него используйте thisLayer()
В следующем примере для движка Legacy ExtendScript формат this используется для создания сокращенной ссылки на свойство «Положение текстового слоя» из свойства «Исходный текст»:
В движке JavaScript форму this необходимо заменить на thisLayer:
Использование thisLayer совместимо с обоими движками выражений.
Свойству исходного текста для доступа к символам из индекса-массива требуется выражение .значение
В случае движка выражений Legacy ExtendScript для доступа к символам текстового свойства можно использовать скобки, как для массива:
В случае движка JavaScript для доступа к символам необходимо добавить выражение .значение :
Этот синтаксис совместим с обоими движками.
Свойства и методы Snake case не допускаются
Устаревшие свойства и методы Snake Case (запись с подчеркиванием вместо camelCase) не поддерживаются механизмом JavaScript. Вместо них следует использовать версии camelCase поскольку они совместимы с обоими движками. Ниже приведен список устаревших выражений Snake Case и соответствующие им выражения camelCase.
Свойства Snake Case
Методы Snake Case
Использование eval() с выражениями в двоичной кодировке (.jsxbin)
Выражения, закодированные в двоичном формате ExtendScript (сохраненные как двоичный файл .jsxbin из ExtendScript ToolKit CC), не поддерживаются движком JavaScript.
Чтобы запутать выражение, используйте движок Legacy ExtendScript или другой метод запутывания, совместимый с ECMAScript 2018. Некоторые методы запутывания могут не поддерживаться обоими движками выражений.
Ограниченная поддержка объекта $. (доллар)
Для объекта $. (доллар) методы и свойства характерны для ExtendScript и в основном не поддерживаются движком JavaScript. В этой таблице перечислены неподдерживаемые и поддерживаемые виды использования объекта $. (доллар):
$.engineName (не поддерживается движком Legacy ExtendScript)
Не поддерживаются выражения . reflect.properties, . reflect.methods и toSource()
Выражения reflect.properties и reflect.methods не поддерживаются движком JavaScript. Эти методы характерны для ExtendScript и у них нет прямого эквивалента в JavaScript.
Метод toSource() в JavaScript устарел и не является частью какого-либо стандарта.
Чтобы просмотреть список доступных свойств и методов для любого заданного свойства After Effects, аналогичного тому, которое было предоставлено вышеупомянутыми методами, используйте следующее выражение для свойства «Исходный текст» и свяжите его с нужным свойством, например, используя инструмент «Лассо» вместо thisProperty в строке 1:
Приведенное выше выражение не совместимо с движком Legacy ExtendScript. В нем используются синтаксис и методы, недоступные в ECMAScript 3.
Когда выражения используются внутри библиотеки выражений .jsx или выражение вызывается внутри метода eval() , необходимо изменить определенный синтаксис:
Явный префикс thisLayer. или thisProperty. должен быть добавлен к любому собственному методу или атрибуту, который явно не вызывается для слоя или свойства. Такой префикс сообщает движку JavaScript, для какого объекта вызывается метод или атрибут.
Математические операции со значениями массива, такие как Position, необходимо вычислять, используя векторные математические функции или циклические функции, чтобы действовать на каждый элемент массива. Перегруженные математические операторы, такие как position + [100,100], не будут обрабатываться.
При использовании движка JavaScript выражения предварительно обрабатываются перед вычислением, чтобы сделать некоторые выражения с синтаксисом для Legacy ExtendScript читаемыми новым движком. Однако такие задачи предварительной обработки не выполняются при вычислении выражений из библиотеки функций выражений .jsx или вызове выражений внутри метода eval() . Указанные выше изменения синтаксиса в таких случаях необходимо вносить вручную. Все эти изменения синтаксиса обратно совместимы с устаревшим движком ExtendScript, поэтому выражение .jsx записанное так, чтобы работать с движком JavaScript, также будет работать с движком Legacy ExtendScript.
Совет по производительности: из-за отсутствия предварительной обработки в случае вызова сложных выражений из библиотеки .jsx с таким синтаксисом и движком JavaScript возможно повышение производительности по сравнению с вызовом такого же выражения непосредственно в свойстве.
Собственные методы с явным префиксом и атрибуты с thisLayer. или thisProperty.
В таблице ниже перечислены методы и атрибуты, для которых требуется префикс. Например, атрибут time необходимо записать в форме thisLayer.time , тогда как метод wiggle() — в форме thisProperty.wiggle() .
Эти префиксы требуются, только если атрибут или метод не вызываются явно в другом слое или свойстве. Например, при вызове thisComp.layer(1).hasParent , добавляется thisLayer. не требуется, так как .hasParent уже явно вызывается в layer(1) .
Adobe Extendscript Toolkit CC - Среда разработки (IDE), используемая для написания, тестирования и выполнения скриптов ExtendScript. Поставляется в комплекте с Creative cloud.
Мы рассмотрим эту программу как очень полезный инструмент для изучения DOM структуры Adobe документов, возможных параметров и свойств объектов входящих в документ.
Для начинающего разработчика расширений для программ Adobe это очень полезный и нужный инструмент.
Установка Extendscript Toolkit CC:
Запустить Creative cloud, открыть из меню «Установки», раздел Creative Cloud, раздел Apps? Отметить галочкой – «Показывать более ранние приложения»
После этого в списке доступных программ появится Extendscript Toolkit CC :
Прямые ссылки на Extendscript Toolkit CC
После установки открываем программу, выбираем приложение, с которым будем работать, в нашем примере это Adobe Photoshop CC 2019:
Photoshop должен быть запущен и в нем нужно создать или открыть любой поддерживаемый файл.
В среде Extendscript Toolkit можно запускать скрипты, отслеживать ошибки, делать отладку, вывод значений переменных и т.п., но мы рассмотрим режим Data Browser, найти его можно в меню – Window – Data Browser:
Откроется окно с многочисленными свойствами данных, режимов, модулей программы, функций Photoshop.
Типы данных, которые мы сможем изучать:
Для нас в первую очередь интересует ветка app=[Application Adobe Photoshop] – открываем объект приложение Photoshop:
С этой ветки можно изучать свойства программы Photoshop.
Выберем переменную activeDocument = [Document Изучение Toolkit.psd] – в Photoshop открыт и активен документ с таким именем - Изучение Toolkit.psd. Чтобы воспользоваться в скрипте такой информацией, к примеру присвоить переменной это значение нужно написать скрипт:
var s=app. activeDocument
При выполнении будет выведено значение объекта Document Изучение Toolkit.psd
Выберем переменную build
выведет полную информацию о версии сборки программы Photoshop
Выберем метод openDialog()
Набираем скрипт app.openDialog() – запускаем на выполнение и откроется диалоговое окно выбора файла выбрав любой файл и нажав открыть в программе Photoshop ничего не откроется, этот метод нужен для работы с файлами – например напишем скрипт:
var f= app.openDialog()
Теперь после выбора файла мы получили переменную f содержащую ссылку к файлу или файлам, т.к. методом openDialog() можно выбрать несколько файлов.
app.open(new File( f ))
этим скриптом загружаем выбранный в диалоге файл в Photoshop? Если были выбраны несколько файлов, то их переменные будут указываться следующим образом f[0], f[1], f[2] …
Метод doAction() – запуск операций (Action):
app.doAction("Имя операции","Имя набора операций") этот скрипт запустит экшн, записанный вами.
И так далее изучайте возможные методы, доступные переменные для считывания.
Также есть справка по основным функциям в самой программе Extendscript Toolkit CC – меню help – Object Model Viewer:
В строке под Browser выбираем Adobe Photoshop XX Object Library, в строке поиска вводим интересующую нас функцию, например doAction (следите за регистром это важно) –
Получаем справку по данной функции, видим, что она имеет 2 аргумента имя операции и имя набора операций, обе переменных строковые, значит их значения надо писать в кавычках.
Вернемся к Data Browser, откроем объект app, в нем откроем объект activeDocument
В прошлый раз в скрипте мы писали
var s=app. activeDocument
И результат был объект, теперь если зайти в объект activeDocument, то можно найти переменную name. Теперь можно получить имя файла:
var s=app. activeDocument.name
Можно изучить текущий слой
Результат имя текущего слоя:
Погружаемся дальше открываем объект app.activeDocument.activeLayer
Видим множество методов, которые можно применять к слою, например размытие по Гауссу
app.activeDocument.activeLayer.applyGaus sianBlur(10) – размытие по Гауссу текущего слоя с радиусом 10px.
Объект bounds содержит координаты верхнего левого и нижнего правого угла выбранного слоя с учетом примененных к слою стилей
var b= app.activeDocument.activeLayer.bounds
alert("координата Х верхего левого угла"+b[0] )
alert("координата Y верхего левого угла"+b[1] )
alert("координата Х нижнего правого угла"+b[2] )
alert("координата Y нижнего правого угла"+b[3] )
При присвоении переменной b значение объекта bounds, переменная получает 4 числа в виде массива.
Объект boundsNoEffect содержит координаты верхнего левого и нижнего правого угла выбранного слоя без учета примененных к слою стилей.
Переменная grouped – булевая переменная, определяющая входит ли слой в группу.
Принцип изучения понятен, выбираем объект и смотрим какие переменные или методы мы можем использовать.
У Photoshop-а есть COM API, в котором покрыты многие из фотошоповских функций. Его, разумеется, можно использовать из JS- или VBS-скриптов. Adobe любезно предоставила разработчикам свою IDE, с автокопмлитом и брейкпоинтами. Поддерживаемые языки в ней JScript, VBScript (Win) и AppleScript (Mac). Я остановился на JScript, потому как большинству будет лучше всего понятен именно он.
- по умолчанию установлен не моноширинный шрифт, а какая-то дрянь. Тут же пофиксил
- нет watch-ей. За это казнить надо. Их роль выполняет data browser и javascript console
- по привычке нажал ctrl-D (копирует строчку в Решарпере) – и о чудо, оно работает!
- там есть профайлинг
- хелп есть, по контенту сносный, но до уровня msdn недотягивает.
Удобно, особенно если надо написать скрипт для фотошопа под заказ и не хочется давать исходники. Насчёт возможности его декомпиляции я детально не разбирался, но думаю, что переменные он меняет и кое-какую оптимизацию всё-таки делает.
Итак, IDE на первый взгляд неудобная, но поработав в ней минут 30, привыкаешь.
Скриптовый язык
Т.к. ExtendScript кроссплатформенный, пути к файлам представляются как /d/Temp/…
Живой пример
Задача: в папке есть 100 файлов. Надо внедрить в каждый из них лого, которое есть в PSD-файле.
Пример лого:
А вот и скрипт:
app.open(logoFile); // открываем лого
app.activeDocument.artLayers[ "Text" ].copy(); // ArtLayers – слои в файле. Этот слой назывался "Text"
var logoWidth = app.activeDocument.width. as ( "px" );
var logoHeight = app.activeDocument.height. as ( "px" );
app.activeDocument.close();
app.open(photoFile); // открываем фотку
var width = app.activeDocument.width. as ( "px" );
var height = app.activeDocument.height. as ( "px" );
var logoLayer = app.activeDocument.artLayers.add(); // добавляем на фотку новый слой, куда поместим лого
logoLayer.name = "Logo" ; // название нового слоя
app.activeDocument.paste(); // вставляем лого из clipboard
var shape = [ // Photoshop вставляет всё в середину; выделяем лого, чтобы перенести его
[(width - logoWidth) / 2, (height - logoHeight) / 2],
[(width - logoWidth) / 2, (height + logoHeight) / 2],
[(width + logoWidth) / 2, (height + logoHeight) / 2],
[(width + logoWidth) / 2, (height - logoHeight) / 2]
];
app.activeDocument.selection.select(shape);
app.activeDocument.selection.translate( // переносим selection вправо вниз
new UnitValue((width - logoWidth)/ 2, "px" ),
new UnitValue((height - logoHeight) / 2, "px" ));
var minImageDimension = Math.min(width, height); // масштабируем лого, чтобы оно было в 5 раз меньше минимального размера фотки
var logoScaleMultiplier = minImageDimension / 5 / logoWidth * 100;
app.activeDocument.selection.resize(logoScaleMultiplier, logoScaleMultiplier, AnchorPosition.BOTTOMRIGHT); // обратите внимание на последний аргумент
app.activeDocument.artLayers[ "Logo" ].opacity = 75; // делаем слой полупрозрачным
app.activeDocument.artLayers[ "Logo" ].blendMode = BlendMode.LUMINOSITY; // устанавливаем режим смешивания, чтобы выглядело симпатичнее
// а вот тут бы установить blending options! Об этом читайте дальше.
SaveFile(outputFile); // сохранит и закроет файл
>
function SaveFile(outputFile) var isPng = /png$/i.test(outputFile);
var saveOptions;
if (isPng) saveOptions = new PNGSaveOptions();
> else saveOptions = new JPEGSaveOptions(); /* неинтересный код про качество картинки */
>
app.activeDocument.saveAs(File(outputFile), saveOptions, true , Extension.LOWERCASE)
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES); // закрываем документ
>
Скрипт готов. Осталось сделать лого в формате PSD – такое, чтобы внутри был слой Text, на котором и должно быть размещено лого.
Пример того, что получится:
Полностью скрипт вылолжил на pastebin.
О грустном
- записав Action с этими настройками и выполнив его (спасибо за подсказку serge2)
- сохранить стиль в preset-ах (используя кнопку «New Style» в диалоге «Blending Options»)
Немного о недокументированном API
- Скопировать файл «ScriptListener.8li» из %ProgramFiles%Adobe\Adobe Photoshop CS5\Scripting\Utilities\ в %ProgramFiles%Adobe\Adobe Photoshop CS5\Plug-ins\Automate\
- (пере)запустить Photoshop
- Сделать то действие, о котором хочется узнать
- Найти на рабочем столе файлы ScriptListener.jsx и ScriptListener.vbs
- Не забыть удалить ScriptListener.8li (он тормозит работу Photoshop)
Как вы думаете, что делает этот код? Он добавляет тень (Drop Shadow) к слою, это видно по название «DrSh». Я подозреваю, что внутри Photoshop-а прямо так и называются контролы в GUI.
Но, выполнив этот код, обнаружим, что он работает.
Можно найти, что executeAction может как показать диалог пользователю, так и сделать свою работу молча (это определяет последний параметр). Сами ID-шники нигде не описаны, о них (как и о том, что будет с ними в CS6) мы можем только гадать.
Тем не менее, фича логгирования действий довольно интересная, если очень надо, можно по-быстрому накидать скриптик для себя.
Ещё скрипты
- ресайзинг картинок до определённого размера (ширина не больше X, высота не больше Y)
- добавление рамок к картинкам – таких же, как в этом топике
Интересные факты
- в API есть поддержка RAW. После того, как вы обработали RAW-файлы в Photoshop-е, сохранив в них настройки, вы можете быстро сконвертировать их в JPEG
- в отличие от blending options, фильтры представлены в API довольно хорошо, для каждого из них есть функция
- код в jsx-файлах можно вешать на события в Photoshop: например, при открытии файла добавлять в него новый слой, и так далее
- API есть и для Illustrator, и для Bridge
- из API есть доступ к гистограмме и к каналам
Выводы
API вкусное, очень вкусное. Но отсутствие поддержки blending options сильно удручает; если они нужны – будьте готовы к тому, что придётся возиться со страшным кодом. Если всё, что вам надо (что как раз и надо в большинстве случаев от пакетной обработки) – обвести картинку рамочкой, думаю, ImageMagick в этом случае будет быстрее и намного удобнее.
фильтры, гистограммы
RAW
color profiles, как в Photoshop-е
javascript – удобный, понятный почти всем язык
документация с примерами
отсутствие blending options
для работы нужен Photoshop /* внезапно */
работает довольно медленно
Почитать
Adobe Photoshop Scripting – официальный ресурс
Scripting Photoshop – небольшой, но полезный тьюториал по скрпитингу в Photoshop
PS-Scripts – форум о скриптах для Photoshop
Подумать
В качестве упражнения предлагается скрипт, который может действительно пригодиться: сделать так, чтобы лого на фотке добавлялось в той же цветовой гамме, что и фотка – например, синее или жёлтое для сине-жёлтой фотки: это сделает лого не портящим общий цвет и настроение фотки. Лого не должно сливаться с цветом, т.е. не быть синим на синем. Кроме того, будет классно, если лого не будет на поверхности вроде травы, его можно попробовать перенести в другой угол или перекрасить.
В прошлых двух статьях я рассказал, как сделать скрипт, запускающийся в After Effects. Наш скрипт создавал окно в интерфейсе программы, в котором мы можем писать и выполнять код ExtenScript. Но это игрушка, полезна она может быть только новичку. Давайте же сделаем нечто более полезное, применимое в реальной жизни.
Одной из самых распространенных задач, которые встречались мне в работе, была динамичная расстановка титров в видеороликах. Видео сегодня, один из самых популярных форматов контента. Одно из ограничений накладываемых браузером, невозможность запустить в ролике звук без действия пользователя. Естественный выход из данной ситуации, заменить звук титрами. Если это 5 - 10 титров, то можно сделать их и руками. Ну, а что, если вам надо выпускать по пять роликов в день и в них не 10, а 50 - 70 титров? Да еще каждый ролик в 2 - 3 форматах? Да, плюс ко всему, еще и на нескольких языках? Если вам кажется такая ситуация необычной, то я сталкиваюсь с ней ежедневно.
Так давайте же упростим эту задачу на сколько это возможно. Мы сделаем более менее универсальный скрипт, который будет интерпретировать текст в титры на сцене After Effects. Хоть я и решал эту задачу уже много раз, буду писать свой скрипт прямо во время написания статьи, чтобы ничего не упустить и сделать свой рассказ максимально подробным. Приступим.
Текст титров мы будем вводить следующим образом
За основу нашего скрипта можно взять скрипт из первой статьи. Мы оставим в интерфейсе те же элементы только немного подредактируем. Во первых, я убрал весь код в самовызывающуюся функцию init, просто для удобства, чтобы он не мешал в общей массе остального кода.
Далее мы исправим дефолтный текст в текстовом поле
Ну а в обработчике нажатия кнопки run мы удалим строку выполнения кода, заменив ее на вызов метода createTitres
Соответственно, нам надо создать метод createTitres, принимающий аргументом некий массив данных.
И расширить класс String, добавив ему метод getTitresData, который будет парсить текст, создавая из него массив объектов. Это, в свою очередь, влечет небольшое расширение класса Array, ему мы добавим метод map. Приведу оба расширения вместе.
Давайте посмотрим, что у нас тут происходит. В методе getTitresData мы первым делом удаляем из строки часто встречающиеся артефакты в начале и в конце всего текста. Такими артефактами являются переносы, пробелы и, что случается, если копировать текст из гугл таблицы, кавычки.
Далее мы разбиваем текст по разделителю двойной перенос
И формируем из получившегося массива новый, отделяя от каждого титра тег
Я запустил скрипт. В метод createTitres приходит массив объектов. Пока все верно. Можно двигаться дальше.
Теперь нам следует поработать над макетом. Открываем After Effects. Создаем новый проект. В окне Project добавим папку, назовем ее 1x1. В этой папке создадим композицию с именем ModelScene_1x1
По префиксу ModelScene мы будем определять, что это макет сцены, по настройкам этого макета мы будем ориентироваться далее. Суффикс 1x1 означает соотношение сторон, мне так удобнее понимать о какой сцене идет речь. Вы же можете выбрать другой суффикс, главное в дальнейшем следить, чтобы макеты титров имели тот же суффикс в имени. Префикс с суффиксом отделены нижним подчеркиванием.
Настраиваем нашу сцену.
Указываем ширину, высоту, частоту кадров, продолжительность сцены. Значение Duration лучше сделать побольше, чтобы влезли все титры. Все эти параметры мы позже скопируем в нашу рабочую сцену.
Макет сцены готов. Вернемся к скрипту.В методе createTitres первым действием мы получим данные всех сцен имеющихся в нашем макете.
В новом методе getScenesData мы проходимся по всем элементам в нашем проекте. Обратите внимание, что индексация элементов в списке проекта начинается с единицы. Общее число элементов хранится в свойстве проекта numItems.
Мы смотрим, является ли элемент композицией и есть ли в его имени префикс ModelScene.
Если условие выполнено, добавляем данные о сцене в массив.
Нас интересует тип сцены, отделяем суффикс от ее имени. Ширина, высота, частота кадров и продолжительность сцены.
Теперь пройдемся по массиву, поищем наши сцены в проекте, и если таковых нет, создадим их.
Метод getScene сначала ищет композицию в проекте по имени
И если не находит такой, то создает ее, используя параметры макета
Можете проверить работу скрипта. Если вы все сделали правильно, в проекте должна появиться композиция scene-1x1. Сюда мы будем добавлять наши титры. Но об этом в следующий раз.
В предыдущей статье я рассказал, как написать скрипт для Adobe After Effects. Напомню, что наш скрипт создает окно в интерфейсе программы. В этом окне можно вводить и выполнять код Extendscript - язык сценариев для программ Adobe. Теперь хочу предложить вам некоторое расширение данного плагина. Давайте сделаем так, чтобы он мог загружать и сохранять написанные нами скрипты.
Начнем с загрузки скрипта. Для этого добавим кнопку Open и обработчик ее нажатия
Первым делом в обработчике мы вызываем диалоговое окно для открытия файла. Первым аргументом в статический метод File.openDialog передается подсказка для пользователя. Если система поддерживает такую подсказку, она будет отображена. В противном случае этот аргумент будет проигнорирован.
Так же этот метод принимает и второй аргумент - метод или строка (в зависимости от ОС) фильтрации расширения открываемых файлов. Но по какой-то причине в последних версиях AE этот аргумент не работает, поэтому в этом скрипте я его использовать не стал. Вместо этого мы чуть ниже сделаем соответствующую проверку.
Если пользователь выбрал файл, метод File.openDialog возвратит экземпляр класса File. В противном случае, если пользователь нажал Отмена, будет возвращен null. В таком случае мы прерываем работу обработчика
Далее мы проверяем расширение выбранного файла. Для этого мы используем регулярное выражение, проверяющее окончание строки с именем файла.
Нас интересуют файлы .js и .jsx. Оба эти расширения интерпретируются AE как сценарии. Если проверка прошла успешно, мы открываем файл для чтения, для этого передаем методу open аргумент “r” - read, передаем нашему текстовому полю содержимое файла и закрываем файл, чтобы он не засорял память программы.
Если расширение файла нам не подходит, мы предупреждаем об этом пользователя, на чем работа обработчика завершается.
Можете проверить работу кнопки. Если вы все сделали верно, в текстовом поле отобразится содержимое открытого файла.
Следующим шагом мы сохраним наш скрипт. Для этого добавим кнопку Save.
Тут почти та же логика, что и в предыдущем блоке. Мы открываем диалоговое окно для сохранения файла.
Если пользователь нажал Отменить File.saveDialog возвращает null и мы прерываем работу обработчика
Далее проверяем имя файла указанное в диалоговом окне и, если имя не содержит расширений .js или .jsx, переименовываем файл, добавляя нужное расширение
Имя файла доступно только для чтение, поэтому для его изменения мы используем метод rename.
А сами кнопки будем уже добавлять не в окно, а в эту группу
Теперь кнопки отрисовываются инлайн, что, согласитесь, выглядит гораздо лучше.
На этом пока все. Надеюсь, данный пример был вам полезен. Полный скрипт с подробными комментариями вы можете найти тут. Документацию по работе с файлами в AE Extendscript смотрите тут.
Читайте также: