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.

War es hilfreich?

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ückkehr

Speichern 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.

eingeben Bild Beschreibung hier

[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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top