javascript - adobe scripts
¿Es posible ejecutar scripts JSX desde ExtendScript externo? (5)
Normalmente, cuando escribe un script .jsx para automatizar un producto de Adobe (como InDesign, Illustrator o Photoshop), escribe, depura y ejecuta el script desde el IDE de ExtendScript. ¿Es posible omitir ExtendScript y ejecutar el script desde un tercer programa?
Creo que los productos de Adobe tienen un intérprete de JavaScript incorporado al cual se puede conectar ExtendScript para acceder a los modelos de objetos de Adobe y automatizar su software. Me gustaría poder conectarme directamente a ese intérprete y ejecutar archivos jsx como lo haría en ExtendScript.
Esto funciona en windows:
"C: / Archivos de programa (x86) / Adobe / Adobe Photoshop CS5 / Photoshop.exe" C: / completepathto / my.jsx
Presta atención al camino de Photoshop. Debe citarse ya que contiene espacios.
Hay muchos trucos para descubrir dónde se carga Photoshop. Aquí hay uno que encuentra todas las ubicaciones donde se ha cargado Photoshop y las coloca en 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 )
A continuación, puede procesar cada línea en x.lst. NOTA: Todo el "@for" debe estar en UNA línea, lo dividí en varias líneas para facilitar la lectura.
Si crees que solo habrá un Photoshop (y no Elementos), entonces puedes cambiar "echo %% f" a
"%%f/../../Photoshop.exe" C:/completepathto/my.jsx
La respuesta directa es SÍ . Illustrator, InDesign y Photoshop pueden ejecutarse mediante scripts a través de COM. Cualquier programa que realice que pueda acceder a COM (como un lenguaje .net, C ++, BCX, Autohotkey o Powerpro) puede decirle a Illustrator, InDesign o Photoshop que haga cosas.
Aquí hay un ejemplo para Powerpro (necesitará el complemento com de powerpro), y esto funciona en CS4 y 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
Después de usar la función ComLoad (), ejecuta cualquier tipo de método o función que ofrece la biblioteca COM. Aquí es cómo usar Powerpro para decirle a Illustrator que ejecute su archivo jsx o 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
Aquí hay una imagen de una barra de herramientas flotante que hice con Powerpro. Los botones están todos conectados a las funciones com. La mayoría del tiempo uso las funciones com para ejecutar scripts jsx externos.
[editar]
¡Hay otra manera! Puede usar el Configurador de Adobe para crear nuevos paneles que sean capaces de lanzar scripts. Puede diseñar el panel de la forma que desee y los resultados son bastante similares a los de la barra de herramientas powerpro que he descrito anteriormente. De hecho, me mudé de la barra de herramientas de powerpro a un Panel de configuración de Adobe.
Para usuarios de Windows, puede usar un script vbs. Pase los argumentos al script .jsx proporcionando argumentos al comando cscript
forma: cscript test.vbs "hello"
. test.vbs podría verse así:
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)
El Wscript.Echo
devolverá la última línea devuelta por el archivo .jsx. Un ejemplo de archivo .jsx podría ser:
function main(argv) {
alert(argv[0]);
return "test";
}
Cuando se ejecuta, debe ver la alerta de "hola" de Illustrator (o el programa de adobe) y luego "test" se devolverá a la salida estándar (debe verlo en la ventana del símbolo del sistema).
Si coloca los archivos .jsx en la ubicación correcta
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
Estas son las rutas en OSX, debería ser fácil encontrar el equivalente en Windows para Photoshop e Illustrator, pero para InDesign podría ser más fácil abrir el Panel de Scripts y abrir la carpeta de scripts usando el menú contextual del Panel.
Sé que puede ejecutar los scripts .jsfl desde la línea de comandos abriendo Flash y pasando la ruta al script .jsfl como un argumento, pero eso no parece funcionar con los archivos .jsx con InDesign.
HTH
¿Estás en una Mac? Si es así, puedes usar AppleScript con la herramienta de osascript
para ejecutar tu JavaScript. Aquí hay unos ejemplos:
Ejecutando JSX y devolviendo un valor
Guarda esto como ~ / 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
Y guarda esto como ~ / 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;
Ahora, desde la línea de comandos, ejecute osascript ~/temp/foo.scpt
Se imprimirá el número de capas en el documento activo de Illustrator.
Obtener datos del JavaScript es limitante. No se puede imprimir en stdout desde el JavaScript. En su lugar, coloque el valor que desea devolver como la última declaración del archivo JSX; Será impreso por osascript
. (Este es el motivo: el último valor en el archivo JSX es el valor de retorno de la declaración de AppleScript de do javascript
. Ese también es el último valor en el archivo de AppleScript, y osascript
imprime el valor final).
El valor que devuelve de JavaScript puede ser un número, una cadena, una matriz o cualquier otra cosa que retenga su valor cuando se convierte en una cadena. Si desea devolver un objeto complejo, deberá # .toJSONString()
una biblioteca JSON y llamar a .toJSONString()
en el objeto.
Pasando Argumentos a JSX
Para pasar argumentos al código JSX, siga este ejemplo:
Archivo ~ / 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
Archivo ~ / 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]);
}
Y luego ejecute osascript args.scpt 50 30 10 80
Depuración
El comando do javascript
también tiene opciones para iniciar el depurador ExtendScript. Para más detalles, abra el diccionario de Illustrator en AppleScript Editor.