Domanda

In genere quando si sta scrivendo uno script per automatizzare .jsx un prodotto Adobe (come InDesign, Illustrator o Photoshop), si scrive, eseguire il debug ed eseguire lo script dalla ExtendScript IDE. E 'possibile bypass ExtendScript ed eseguire lo script da un terzo programma?

Credo Adobe prodotti hanno un built-in JavaScript interprete che ExtendScript può connettersi a accedere ai modelli di oggetti di Adobe e automatizzare il loro software. Mi piacerebbe essere in grado di connettersi direttamente a quella di interprete e eseguire file JSX proprio come avrei fatto in ExtendScript.

È stato utile?

Soluzione

Sei su un Mac? In tal caso, è possibile utilizzare AppleScript con lo strumento osascript per eseguire il JavaScript. Ecco alcuni esempi:

Esecuzione JSX e restituisce un valore

Salva questo come ~ / 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

e salvare questo come ~ / 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;

Ora, dalla linea di comando di marcia osascript ~/temp/foo.scpt Si stamperà il numero di strati nel documento di Illustrator attiva.

Come dati fuori del JavaScript sta limitando. Non è possibile stampare a stdout dall'interno del JavaScript. Invece, inserire il valore che si desidera di ritorno, l'ultima affermazione del file JSX; che verrà stampato da osascript. (Ecco perché:.. L'ultimo valore nel file JSX è il valore di ritorno della dichiarazione AppleScript do javascript Questo è anche l'ultimo valore nel file AppleScript, e osascript stampa il valore finale)

Il valore si torna da JavaScript può essere un numero, una stringa, un array, o qualsiasi altra cosa che mantiene il suo valore quando convertito in una stringa. Se si desidera restituire un oggetto complesso, è necessario # include una libreria JSON e call .toJSONString() sull'oggetto.

Passaggio di argomenti a JSX

per passare argomenti al codice JSX, seguire questo esempio:

file ~ / 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

file ~ / 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]);
}

E osascript args.scpt 50 30 10 80 quindi eseguire

Debug

Il comando do javascript ha anche opzioni per l'avvio del debugger ExtendScript. Per ulteriori informazioni, aprire il dizionario AppleScript Editor Illustrator in.

Altri suggerimenti

Per gli utenti Windows, è possibile utilizzare uno script VBS. Passare argomenti allo script .jsx fornendo argomenti al comando cscript in questo modo: cscript test.vbs "hello". Test.vbs potrebbe apparire in questo modo:

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)

Il Wscript.Echo restituirà l'ultima riga restituito dal file di .jsx. Un esempio di file .jsx potrebbe essere:

function main(argv) {
    alert(argv[0]);
    return "test";
}

Quando correva, si dovrebbe seee Illustrator (o qualsiasi programma di Adobe) alert "ciao" e poi "test" verrà restituito a stdout (si dovrebbe vedere nella finestra del prompt dei comandi).

Questo funziona in Windows:

  

"C: \ Program Files (x86) \ Adobe \ Adobe Photoshop CS5 \ Photoshop.exe" C: \ completepathto \ my.jsx

Fare attenzione al percorso a Photoshop. Deve essere citato in quanto contiene gli spazi.

Ci sono un sacco di trucchi per capire dove è caricato Photoshop. Qui è uno che trova ogni luogo in cui Photoshop è stato caricato e mette quelli 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 )

È quindi possibile elaborare ogni riga x.lst. NOTA: L'intero "@For" dovrebbe essere su una linea, ho diviso a più righe per facilitarne la lettura

.

Se si ritiene che ci sarà un solo Photoshop (e non elementi) allora si potrebbe cambiare "echo %% f" a

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

La risposta retta è YES . Illustrator, InDesign e Photoshop possono essere script attraverso COM. Qualsiasi programma che si fanno che l'accesso può COM (come ad esempio un linguaggio .NET, C ++, BCX, Autohotkey o Powerpro) può dire Illustrator, InDesign o Photoshop per fare le cose.

Ecco un esempio per Power Pro (avrete bisogno di PowerPro com plug), e questo funziona in CS4 e 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

Dopo aver utilizzato la funzione ComLoad (), è quindi eseguire qualsiasi tipo di metodo o una funzione offerta dalla libreria COM. Ecco come utilizzare Powerpro dire Illustrator per eseguire il JSX o il file 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

Ecco un immagine di una barra degli strumenti mobile che ho fatto usando Powerpro. I pulsanti sono tutti attaccati alle funzioni com. La maggior parte delle volte uso le funzioni com di eseguire script JSX esterni.

entrare descrizione dell'immagine qui

[modifica]

C'è un altro modo! È possibile utilizzare Adobe Configurator per creare nuovi pannelli che sono in grado di script di lancio. È possibile progettare il pannello in qualsiasi modo che ti piace, ed i risultati sono molto simili a tutti gli effetti alla barra degli strumenti Power Pro che ho descritto sopra. In effetti, mi sono trasferito dalla barra degli strumenti Power Pro ad un configuratore Pannello di Adobe.

Se si posiziona i file .jsx nella giusta posizione

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

Questi sono i percorsi su OSX, dovrebbe essere facile da trovare l'equivalente su Windows per Photoshop e Illustrator, ma per InDesign potrebbe essere più facile da aprire Script del pannello e aprire gli script cartella utilizzando il menu contestuale del pannello.

Lo so che è possibile eseguire .jsfl script dalla riga di comando con l'apertura di Flash e passando il percorso dello script .jsfl come argomento, ma questo non sembra funzionare per i file .jsx con InDesign.

HTH

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top