外部extendscriptからJSXスクリプトを実行することは可能ですか?
-
27-09-2019 - |
質問
通常、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スクリプトを実行します。
編集
別の方法があります! 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