Ist es möglich, JSX Skripte von außen ExtendScript auszuführen?
-
27-09-2019 - |
Frage
Normalerweise, wenn Sie einen .jsx Skript gerade schreiben ein Adobe-Produkt (wie InDesign, Illustrator oder Photoshop) zu automatisieren, die Sie schreiben, debuggen und führen Sie das Skript aus der ExtendScript IDE. Ist es möglich, in dem Bypass-ExtendScript und das Skript von einem dritten Programm ausführen?
Ich denke, Adobe-Produkte über eine integrierte in JavaScript-Interpreter dem ExtendScript verbinden die Adobe Objektmodelle zugreifen und ihre Software automatisieren. Ich möchte in der Lage sein, direkt zu diesem Interpreter zu verbinden und jsx Dateien genauso wie ich würde in ExtendScript ausgeführt werden.
Lösung
Sind Sie auf einem Mac? Wenn ja, können Sie Applescript mit dem osascript
Tool verwenden, um Ihre JavaScript ausführen. Hier sind einige Beispiele:
Running JSX und ein Wert
RückkehrSpeichern Sie diese als ~ / 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
und speichern Sie diese als ~ / 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;
Nun, von der Kommandozeile osascript ~/temp/foo.scpt
Es wird die Anzahl der Schichten in dem aktiven Illustrator-Dokument drucken.
Erste Daten aus dem JavaScript ist begrenzt. Sie können nicht aus dem JavaScript in stdout drucken. Stattdessen legen Sie den Wert, den Sie als letzte Anweisung der JSX-Datei zurückkehren wollen; es wird durch osascript
gedruckt werden. (Hier ist der Grund:.. Der letzte Wert in der JSX-Datei der Rückgabewert der do javascript
Apple Aussage ist, dass auch der letzte Wert in der Applescript-Datei, und osascript
druckt den Endwert)
Der Wert, den Sie von JavaScript zurückgeben kann eine Zahl, ein String, ein Array, oder irgendetwas anderes, das seinen Wert behält, wenn es in einen String umgewandelt. Wenn Sie ein komplexes Objekt zurückkehren wollen, müssen Sie auf dem Objekt eine JSON-Bibliothek und Call .toJSONString()
#include.
Argumente an JSX
Um Argumente an die JSX Code übergeben, folgen Sie diesem Beispiel:
Datei ~ / 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
Datei ~ / 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]);
}
Und dann laufen osascript args.scpt 50 30 10 80
Debuggen
Der do javascript
Befehl hat auch Optionen für den Start des ExtendScript Debugger. Einzelheiten öffnen Sie den Illustrator-Wörterbuch in Applescript-Editor.
Andere Tipps
Für Windows-Benutzer können Sie einen vbs-Skript verwenden. Übergeben von Argumenten an die .jsx Skript durch Argumente an den cscript
Befehl wie so bereitstellt: cscript test.vbs "hello"
. test.vbs wie so aussehen:
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)
Die Wscript.Echo
wird die letzte Zeile von der .jsx Datei zurückgegeben zurückzukehren. Ein .jsx Datei Beispiel könnte sein:
function main(argv) {
alert(argv[0]);
return "test";
}
Wenn RAN, sollten Sie Illustrator (oder was auch immer Sie Adobe-Programm) alert „Hallo“ seee und dann „test“ nach stdout zurückgegeben werden (sollten Sie es in der Eingabeaufforderung Fenster).
Das funktioniert in den Fenstern:
"C: \ Program Files (x86) \ Adobe \ Adobe Photoshop CS5 \ Photoshop.exe" C: \ completepathto \ my.jsx
Achten Sie auf den Weg zu Photoshop. Es muss angegeben werden, da es Leerzeichen enthält.
Es gibt viele Tricks, um herauszufinden, wo Photoshop geladen wird. Hier ist eine, die jeden Ort findet, wo Photoshop geladen ist und legt die in 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 )
Sie können dann jede Zeile in x.lst verarbeiten. HINWEIS: Die gesamte „@For“ auf einer Linie sein sollte, ich teile es auf mehrere Zeilen für die Lesbarkeit
.Wenn Sie glauben, dass es sein wird nur Photoshop (und nicht die Elemente), dann könnten Sie ändern "echo %% f" zu
"%%f\..\..\Photoshop.exe" C:\completepathto\my.jsx
Die klare Antwort ist YES . Illustrator, InDesign und Photoshop können alle durch COM scripted werden. Jedes Programm, dass Sie diese können den Zugriff COM (wie eine .NET-Sprache, C ++, BCX, Autohotkey oder Powerpro) machen kann Illustrator sagen, InDesign oder Photoshop Dinge zu tun.
Hier ist ein Beispiel für Powerpro (Sie werden PowerPro die brauchen com Plugin), und das funktioniert in CS4 und 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
Nachdem Sie die ComLoad () Funktion zu verwenden, führen Sie dann jede Art von Verfahren oder Funktion von der COM-Bibliothek angeboten. Hier ist, wie Powerpro verwendet Illustrator zu sagen, Ihre jsx oder js-Datei ausgeführt werden:
;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
Hier ist ein Bild von einer Abreißleiste, dass ich mit Powerpro gemacht. Die Tasten sind alle com Funktionen angebracht. Die meiste Zeit verwende ich die com Funktionen externen jsx Skripte auszuführen.
[Bearbeiten]
Es gibt eine andere Art und Weise! Sie können das Adobe Configurator verwenden, um neue Platten zu erstellen, die von Start-Skripten können. Sie können das Panel in irgendeiner Weise entwerfen Sie mögen, und die Ergebnisse sind sehr ähnlich in der Tat auf die PowerPro Symbolleiste ich oben beschrieben habe. In der Tat, zog ich aus der PowerPro Symbolleiste in eine Adobe Configurator-Panel.
Wenn Sie die .jsx Dateien in der richtigen Stelle platzieren
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
Diese Pfade auf OSX sind, sollte es leicht sein, das Äquivalent unter Windows für Photoshop und Illustrator zu finden, aber für InDesign könnte es einfacher sein, die Scripts Panel zu öffnen und die Scripte öffnen Ordner über das Kontextmenü des Panels.
Ich weiß, dass Sie .jsfl Skripte von der Kommandozeile von Flash öffnen und vorbei den Weg zum .jsfl Skript als Argument ausgeführt werden können, aber das scheint nicht zu Arbeit für .jsx Dateien mit InDesign.
HTH