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.

Était-ce utile?

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.

entrer image description ici

[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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top