Adobe extendscript что это

Обновлено: 04.07.2024

В этом документе объясняются различия в синтаксисе языка выражений между движками выражений 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 возможно повышение производительности по сравнению с вызовом такого же выражения непосредственно в свойстве.

У 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/…

Живой пример

logo example


Задача: в папке есть 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

  1. Скопировать файл «ScriptListener.8li» из %ProgramFiles%Adobe\Adobe Photoshop CS5\Scripting\Utilities\ в %ProgramFiles%Adobe\Adobe Photoshop CS5\Plug-ins\Automate\
  2. (пере)запустить Photoshop
  3. Сделать то действие, о котором хочется узнать
  4. Найти на рабочем столе файлы ScriptListener.jsx и ScriptListener.vbs
  5. Не забыть удалить 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

У 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/…

Живой пример

logo example


Задача: в папке есть 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

  1. Скопировать файл «ScriptListener.8li» из %ProgramFiles%Adobe\Adobe Photoshop CS5\Scripting\Utilities\ в %ProgramFiles%Adobe\Adobe Photoshop CS5\Plug-ins\Automate\
  2. (пере)запустить Photoshop
  3. Сделать то действие, о котором хочется узнать
  4. Найти на рабочем столе файлы ScriptListener.jsx и ScriptListener.vbs
  5. Не забыть удалить 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

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 – булевая переменная, определяющая входит ли слой в группу.

Принцип изучения понятен, выбираем объект и смотрим какие переменные или методы мы можем использовать.

Читайте также: