Est-il possible d'exécuter des scripts JSX à l'extérieur ExtendScript?
-
27-09-2019 - |
Question
En général, lorsque vous écrivez un script pour automatiser .jsx un produit Adobe (comme InDesign, Illustrator ou Photoshop), vous écrivez, déboguer et d'exécuter le script à partir ExtendScript IDE. Est-il possible de contourner ExtendScript et exécuter le script d'un troisième programme?
Je pense que les produits Adobe ont un interpréteur JavaScript intégré qui ExtendScript peut se connecter à accéder aux modèles d'objet Adobe et d'automatiser leur logiciel. Je voudrais être en mesure de se connecter directement à cet interpréteur et exécuter des fichiers JSX comme je le ferais dans ExtendScript.
La solution
Êtes-vous sur un Mac? Si oui, vous pouvez utiliser AppleScript avec l'outil osascript
pour exécuter votre JavaScript. Voici quelques exemples:
Course à pied JSX et retour d'une valeur
Enregistrer ce que ~ / 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
Et enregistrer comme ~ / 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;
Maintenant, à partir de la ligne de commande run osascript ~/temp/foo.scpt
Il imprimera le nombre de couches dans le document Illustrator actif.
Obtenir des données sur le JavaScript est limitatives. Vous ne pouvez pas imprimer à stdout à partir du JavaScript. Au lieu de cela, placez la valeur que vous voulez revenir comme la dernière déclaration du fichier JSX; il sera imprimé par osascript
. (Voici pourquoi:.. La dernière valeur dans le fichier JSX est la valeur de retour de la déclaration do javascript
AppleScript est aussi la dernière valeur dans le fichier AppleScript et osascript
imprime la valeur finale)
La valeur que vous revenez de JavaScript peut être un nombre, une chaîne, un tableau, ou toute autre chose qui conserve sa valeur lorsqu'elle est convertie en une chaîne. Si vous voulez retourner un objet complexe, vous aurez besoin de #inclure une bibliothèque JSON et .toJSONString()
d'appel sur l'objet.
Passage des arguments à JSX
Pour passer des arguments au code JSX, suivez cet exemple:
Fichier ~ / 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
Fichier ~ / 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]);
}
Et puis exécutez osascript args.scpt 50 30 10 80
Debugging
La commande do javascript
a également des options pour le lancement du débogueur ExtendScript. Pour plus de détails, ouvrez le dictionnaire Illustrator dans AppleScript Editor.
Autres conseils
Pour les utilisateurs de Windows, vous pouvez utiliser un script VBS. Passer des arguments au script .jsx en fournissant des arguments à la commande cscript
comme ceci: cscript test.vbs "hello"
. Test.vbs pourrait ressembler à ceci:
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)
Le Wscript.Echo
retourne la dernière ligne retournée par le .jsx. Un exemple .jsx pourrait être:
function main(argv) {
alert(argv[0]);
return "test";
}
Quand RAN, vous devez seee Illustrator (ou tout autre programme adobe) alerte « bonjour » et « test » sera retourné à stdout (vous devriez le voir dans la fenêtre d'invite).
Cela fonctionne dans les fenêtres:
"C: \ Program Files (x86) \ Adobe \ Adobe Photoshop CS5 \ Photoshop.exe" C: \ completepathto \ my.jsx
Faites attention au chemin de Photoshop. Il doit être cité car il contient des espaces.
Il y a beaucoup de trucs pour déterminer où Photoshop est chargé. En voici un qui trouve chaque endroit où Photoshop a été chargé et place ceux 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 )
Vous pouvez ensuite traiter chaque ligne x.lst. NOTE: L'ensemble « @For » devrait être sur une ligne, je partage à plusieurs lignes pour une meilleure lisibilité
.Si vous pensez qu'il y aura qu'un seul Photoshop (et non des éléments), vous pouvez alors changer "echo %% f" à
"%%f\..\..\Photoshop.exe" C:\completepathto\my.jsx
La réponse droite est YES . Illustrator, InDesign et Photoshop peuvent tous être scénarisé par COM. Tout programme que vous faites que COM d'accès peut (comme un langage .net, C ++, BCX, Autohotkey ou Powerpro) peut dire Illustrator, InDesign ou Photoshop pour faire les choses.
Voici un exemple pour POWERPRO (vous aurez besoin com Plugin de PowerPro), et cela fonctionne dans CS4 et 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
Une fois que vous utilisez la fonction ComLoad (), vous exécutez alors une sorte de méthode ou fonction offerte par la bibliothèque COM. Voici comment utiliser Powerpro dire Illustrator pour exécuter votre jsx ou d'un fichier 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
Voici une image d'une barre d'outils flottante que j'ai fait à l'aide Powerpro. Les boutons sont tous attachés aux fonctions com. La plupart du temps, j'utiliser les fonctions de com pour exécuter des scripts JSX externes.
[modifier]
Il y a une autre façon! Vous pouvez utiliser le logiciel Adobe Configurator pour créer de nouveaux panneaux qui sont capables de scripts de lancement. Vous pouvez concevoir le panneau de quelque façon que vous le souhaitez, et les résultats sont tout à fait similaire en effet à la barre d'outils PowerPro je l'ai décrit ci-dessus. En fait, je me suis déplacé de la barre d'outils PowerPro à un panneau Adobe Configurator.
Si vous placez les fichiers .jsx au bon endroit
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
Ce sont les chemins sur OSX, il devrait être facile de trouver l'équivalent sous Windows pour Photoshop et Illustrator, mais pour InDesign, il pourrait être plus facile d'ouvrir le panneau Scripts et ouvrez les scripts dossier à l'aide du menu contextuel du Groupe.
Je sais que vous pouvez exécuter des scripts .jsfl de la ligne de commande en ouvrant Flash et passer le chemin du script .jsfl comme argument, mais cela ne semble pas fonctionner pour les fichiers .jsx avec InDesign.
HTH