質問

通常、Adobe製品(Indesign、Illustrator、Photoshopなど)を自動化するために.JSXスクリプトを作成するときは、Extendscript IDEからスクリプトを書き、デバッグ、実行します。拡張スクリプトをバイパスして、3番目のプログラムからスクリプトを実行することは可能ですか?

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

役に立ちましたか?

解決

あなたは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 Active 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エディターのIllustrator Dictionaryを開きます。

他のヒント

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";
}

実行されると、イラストレーター(またはAdobeプログラム)が「Hello」にアラートし、「テスト」がstdoutに返されます(コマンドプロンプトウィンドウに表示されるはずです)。

これはWindowsで機能します:

"c:プログラムファイル(x86) adobe adobe photoshop cs5 photoshop.exe" c: completeepathto 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つしかない(要素ではない)と思われる場合は、変更できます。「エコー%% F」

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

まっすぐな答えはです はい. 。 Illustrator、Indesign、およびPhotoshopはすべてCOMを使用してスクリプト化できます。 COMにアクセスできるプログラム(.NET言語、C ++、BCX、AutoHotkey、PowerProなど)にアクセスできます。

これが例です 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パネルに移動しました。

.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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top