web-dev-qa-db-ja.com

ExtendScriptの外部からJSXスクリプトを実行することは可能ですか?

通常、Adobe製品(InDesign、Illustrator、Photoshopなど)を自動化する.jsxスクリプトを作成する場合は、ExtendScript IDEからスクリプトを作成、デバッグ、実行します。 ExtendScriptをバイパスして、3番目のプログラムからスクリプトを実行することは可能ですか?

アドビ製品には、JavaScriptインタープリターが組み込まれていると思います。ExtendScriptを使用して、Adobeオブジェクトモデルにアクセスし、ソフトウェアを自動化できます。 ExtendScriptと同じように、そのインタープリターに直接接続してjsxファイルを実行できるようにしたいと思います。

31
Thomas

Macを使用していますか?その場合、osascriptツールでAppleScriptを使用して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内からstdoutに出力することはできません。代わりに、返す値をJSXファイルの最後のステートメントとして配置します。 osascriptによって出力されます。 (理由:JSXファイルの最後の値は、_do javascript_ AppleScriptステートメントの戻り値です。これは、AppleScriptファイルの最後の値でもあり、osascriptは最終値を出力します。)

JavaScriptから返す値は、数値、文字列、配列など、文字列に変換されたときにその値を保持するものであれば何でもかまいません。複雑なオブジェクトを返したい場合は、JSONライブラリを#includeして、そのオブジェクトに対して.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_を実行します

デバッグ中

_do javascript_コマンドには、ExtendScriptデバッガーを起動するためのオプションもあります。詳しくは、AppleScript EditorでIllustrator辞書を開いてください。

37
Evan

Windowsユーザーの場合は、vbsスクリプトを使用できます。次のようにcscriptコマンドに引数を指定して、.jsxスクリプトに引数を渡します: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プログラム)のアラート「hello」が表示され、「test」がstdoutに返されます(コマンドプロンプトウィンドウに表示されます)。

14
jfizz

これはウィンドウで動作します:

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

Photoshopへのパスに注意してください。スペースが含まれているため、引用する必要があります。

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"全体は1行にする必要があります。読みやすくするために、複数行に分割しています。

(要素ではなく)Photoshopが1つだけになると思われる場合は、"echo %% f"を次のように変更できます。

"%%f\..\..\Photoshop.exe" C:\completepathto\my.jsx 

正解は[〜#〜]はい[〜#〜]です。 Illustrator、InDesign、PhotoshopはすべてCOMを介してスクリプト化できます。 COMにアクセスできるプログラム(.net言語、C++、BCX、Autohotkey、Powerproなど)は、Illustrator、InDesign、Photoshopに処理を指示できます。

Powerpro (powerproのcomプラグインが必要になります)の例を以下に示します。これは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機能に付属しています。ほとんどの場合、com関数を使用して外部jsxスクリプトを実行します。

enter image description here

[編集]

別の方法があります! Adobe Configuratorを使用して、スクリプトを起動できる新しいパネルを作成できます。パネルは好きなようにデザインできます。結果は、上で説明したpowerproツールバーとほぼ同じです。実際、私はpowerproツールバーからAdobe Configuratorパネルに移動しました。

4
bgmCoder

.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のパスです。PhotoshopとIllustratorの場合、Windowsで同等のものを見つけるのは簡単ですが、InDesignの場合は、スクリプトパネルを開いて、パネルのコンテキストメニューを使用してスクリプトフォルダを開く方が簡単な場合があります。

Flashを開いて.jsflスクリプトへのパスを引数として渡すことで、コマンドラインから.jsflスクリプトを実行できることは知っていますが、InDesignの.jsxファイルでは機能しないようです。

HTH

3
George Profenza