通常、Adobe製品(InDesign、Illustrator、Photoshopなど)を自動化する.jsxスクリプトを作成する場合は、ExtendScript IDEからスクリプトを作成、デバッグ、実行します。 ExtendScriptをバイパスして、3番目のプログラムからスクリプトを実行することは可能ですか?
アドビ製品には、JavaScriptインタープリターが組み込まれていると思います。ExtendScriptを使用して、Adobeオブジェクトモデルにアクセスし、ソフトウェアを自動化できます。 ExtendScriptと同じように、そのインタープリターに直接接続してjsxファイルを実行できるようにしたいと思います。
Macを使用していますか?その場合、osascript
ツールでAppleScriptを使用してJavaScriptを実行できます。ここではいくつかの例を示します。
これを〜/ 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コードに引数を渡すには、次の例に従ってください。
ファイル〜/ 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辞書を開いてください。
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に返されます(コマンドプロンプトウィンドウに表示されます)。
これはウィンドウで動作します:
"C:\ Program Files(x86)\ Adobe\Adobe 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スクリプトを実行します。
[編集]
別の方法があります! 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