Можно ли выполнять JSX-скрипты извне ExtendScript? - PullRequest
31 голосов
/ 02 октября 2010

Обычно, когда вы пишете скрипт .jsx для автоматизации продукта Adobe (например, InDesign, Illustrator или Photoshop), вы пишете, отлаживаете и выполняете скрипт из IDE ExtendScript. Можно ли обойти ExtendScript и запустить скрипт из третьей программы?

Я думаю, что продукты Adobe имеют встроенный интерпретатор JavaScript, к которому ExtendScript может подключаться для доступа к объектным моделям Adobe и автоматизации их программного обеспечения. Я хотел бы иметь возможность подключиться напрямую к этому интерпретатору и запускать файлы jsx так же, как в ExtendScript.

Ответы [ 5 ]

35 голосов
/ 27 января 2012

Вы на Mac? Если это так, вы можете использовать AppleScript с инструментом osascript для выполнения вашего JavaScript. Вот несколько примеров:

Запуск JSX и возврат значения

Сохраните это как ~ / temp / foo.scpt:

tell application "Adobe Illustrator"
     -- 'do javascript' runs any arbitrary JS.
     -- We're using the #include feature to run another
     -- file. (That's an Adobe extension to JS.)
     --
     -- You have to pass a full, absolute path to #include.
     --
     -- The documentation alleges that 'do javascript'
     -- can be passed an AppleScript file object, but
     -- I wasn't able to get that to work.
     do javascript "#include ~/temp/foo.jsx"
end tell

И сохраните это как ~ / temp / foo.jsx:

var doc = app.activeDocument;
var numLayers = doc.layers.length;

// The last value in the JSX file will be printed out by
// osascript. 
numLayers;

Теперь из командной строки запустите osascript ~/temp/foo.scpt Будет напечатано количество слоев в активном документе Illustrator.

Получение данных из JavaScript является ограничением. Вы не можете печатать на стандартный вывод из JavaScript. Вместо этого поместите значение, которое вы хотите вернуть, как последний оператор файла JSX; оно будет напечатано osascript. (Вот почему: последнее значение в файле JSX - это возвращаемое значение оператора AppleScript do javascript. Это также последнее значение в файле AppleScript, и osascript выводит окончательное значение.)

Значение, которое вы возвращаете из JavaScript, может быть числом, строкой, массивом или чем-то еще, что сохраняет свое значение при преобразовании в строку. Если вы хотите вернуть сложный объект, вам нужно #include JSON-библиотеку и вызвать .toJSONString() для объекта.

Передача аргументов в JSX

Чтобы передать аргументы в код JSX, следуйте этому примеру:

Файл ~ / temp / args.scpt:

on run argv
    tell application "Adobe Illustrator"
        set js to "#include '~/temp/args.jsx';" & return
        set js to js & "main(arguments);" & return
        do javascript js with arguments argv
    end tell
end run

Файл ~ / temp / args.jsx

function main(argv) {
    var layer = app.activeDocument.activeLayer;
    app.defaultStroked = true; 
    app.defaultFilled = true;

    // Top, left, width, height (in points).
    // Note that parameters start at argv[0].
    layer.pathItems.rectangle(argv[0], argv[1], argv[2], argv[3]);
}

А затем запустить osascript args.scpt 50 30 10 80

Debugging

Команда do javascript также имеет параметры для запуска отладчика ExtendScript. Для получения дополнительной информации откройте словарь Illustrator в редакторе AppleScript.

13 голосов
/ 04 сентября 2014

Для пользователей Windows вы можете использовать скрипт vbs. Передайте аргументы скрипту .jsx, указав аргументы для команды cscript, например: cscript test.vbs "hello". test.vbs может выглядеть так:

Dim appRef
Dim javaScriptFile
Dim argsArr()

Dim fsObj : Set fsObj = CreateObject("Scripting.FileSystemObject")
Dim jsxFile : Set jsxFile = fsObj.OpenTextFile("C:\Users\path\test.jsx", 1, False)
Dim fileContents : fileContents = jsxFile.ReadAll
jsxFile.Close
Set jsxFile = Nothing
Set fsObj = Nothing

javascriptFile = fileContents & "main(arguments);"

Set appRef = CreateObject("Illustrator.Application")

ReDim argsArr(Wscript.Arguments.length-1)

For i = 0 To Wscript.Arguments.length-1
    argsArr(i) = Wscript.Arguments(i)
Next

Wscript.Echo appRef.DoJavaScript(javascriptFile, argsArr, 1)

Wscript.Echo вернет последнюю строку, возвращенную файлом .jsx. Пример файла .jsx может быть:

function main(argv) {
    alert(argv[0]);
    return "test";
}

При запуске вы должны увидеть оповещение Illustrator (или любой другой программы Adobe) «Привет», а затем «test» будет возвращен на стандартный вывод (вы должны увидеть его в окне командной строки).

5 голосов
/ 26 марта 2014

Это работает в Windows:

"C: \ Program Files (x86) \ Adobe \ Adobe Photoshop CS5 \ Photoshop.exe" C: \ completepathto \ my.jsx

Обратите внимание на путь к фотошопу.Он должен быть заключен в кавычки, так как содержит пробелы.

Существует множество приемов для определения места загрузки Photoshop.Вот тот, который находит все места, куда загружен Photoshop, и помещает их в x.lst

@REM  The Presets\Scripts doesn't really restrict where the loop is looking, 
@REM  thus the "IF EXIST" is needed.  The FIND makes sure that the 
@for /R "%ProgramFiles(x86)%\Adobe" %%f in (Presets\Scripts) 
  DO @IF EXIST %%f 
     (echo %%f | FIND /I "Adobe Photoshop C" >> x.lst )

. Затем вы можете обработать каждую строку в x.lst.ПРИМЕЧАНИЕ: весь «@for» должен быть в ОДНОЙ строке, я делю его на несколько строк для удобства чтения.

Если вы считаете, что будет только один Photoshop (а не Elements), вы можете изменить "echo %% f" до

"%%f\..\..\Photoshop.exe" C:\completepathto\my.jsx 
4 голосов
/ 13 мая 2012

Прямой ответ: ДА .Illustrator, InDesign и Photoshop могут быть написаны через COM.Любая создаваемая вами программа, которая может получить доступ к COM (например, язык .net, C ++, BCX, Autohotkey или Powerpro), может сказать Illustrator, InDesign или Photoshop сделать что-то.

Вот пример для Powerpro (вам понадобится плагин com для powerpro), и это работает в CS4 и CS5:

Function ComLoad() ;;MAKE SURE TO CALL .@ComUnload WHEN EXITING FUNCTION CALLS!
      static objname="Illustrator.Application"
      static com_status, com_type
      static appRef=com.create_object(objname)
      endfunction

Function ComUnload();;this is end the com calls and unload com
    com.unload
    endfunction

После использования ComLoad (), вы затем запускаете любой метод или функцию, предлагаемую библиотекой COM.Вот как использовать Powerpro, чтобы сказать Illustrator, что нужно запускать файл jsx или js:

;Run a script from anywhere
Function RunOtherScript(whatscript)
    If (file.Validpath(whatscript) == 0)do
        messagebox("ok","Whoops! That script doesn't exist!","ILL Runscript")
        quit
    endif
    .@ComLoad()
    appRef.DoJavaScriptFile(whatscript)
    .@ComUnload()
    quit

Вот изображение плавающей панели инструментов, которую я сделал с помощью Powerpro.Все кнопки привязаны к ком-функциям.Большую часть времени я использую функции com для запуска внешних jsx-скриптов.

enter image description here

[edit]

Есть другой способ!Вы можете использовать Adobe Configurator для создания новых панелей, способных запускать скрипты.Вы можете создать панель любым удобным для вас способом, и результаты будут практически аналогичны панели инструментов powerpro, которую я описал выше.Фактически я перешел с панели инструментов powerpro на панель Adobe Configurator.

3 голосов
/ 30 января 2011

Если вы разместите файлы .jsx в нужном месте

Photoshop
folder location:
/Applications/Adobe\ Photoshop\ CS5/Presets/Scripts
menu location:
File > Scripts

Illustrator
folder location:
/Applications/Adobe\ Illustrator\ CS5/Presets.localized/en_GB/Scripts
menu location:
File > Scripts

InDesign
folder location:
/Users/{user}/Library/Preferences/Adobe\ InDesign/Version\ 7.0/en_GB/Scripts/Scripts\ Panel
menu location:
Window > Utilities > Scripts

Это пути в OSX, в Windows легко найти эквивалент для Photoshop и Illustrator, но для InDesign это можетПроще открыть панель сценариев и открыть папку сценариев с помощью контекстного меню панели.

Я знаю, что можно запускать сценарии .jsfl из командной строки, открыв Flash и передав путь к сценарию .jsfl какаргумент, но это не похоже на файлы .jsx с InDesign.

HTH

...