2010-09-09 14 views
2

J'écris une application pour OSX en utilisant C++ et Obj-C qui interagit avec Photoshop. J'ai utilisé NSAppleScript avec AppleScripts dynamiquement construit pour piloter Photoshop (oui, c'est un peu effrayant ...) J'aimerais pouvoir conduire Photoshop d'une manière différente, donc si quelqu'un connaît un meilleur moyen, je suis ouvert à ça! Malheureusement, je ne peux pas utiliser ScriptingBridge car je ne peux pas lier mes utilisateurs à Leopard.Obtenir la liste d'actions de Photoshop en utilisant Objective-C

Le gros problème est venu l'autre soir quand je suis allé interroger la liste d'actions de Photoshop pour l'afficher à mes utilisateurs. Apparemment, l'intégration de scripts de Photoshop n'expose pas les API de liste d'actions à AppleScript. Quelle est la deuxième raison pour laquelle je ne peux pas utiliser ScriptingBridge.

Est-ce que quelqu'un sait comment accéder à la liste d'actions de Photoshop dans mon programme Obj-C/C++? Question bonus: est-ce que quelqu'un sait une meilleure façon d'interagir avec Photoshop ?!

Répondre

2

Je ne pense pas qu'il existe un "meilleur" moyen d'interagir avec photoshop. Applescript est le chemin. C'est pour ça que ça a été construit. En ce qui concerne l'obtention d'une liste des actions, ma seule suggestion serait que les actions doivent être situées dans un dossier quelque part sur le disque dur. Chaque action n'est-elle pas un fichier séparé? Je ne suis pas sûr de cela, mais ce serait une approche qui mérite d'être étudiée. Peut-être que vous pouvez déterminer dans quels dossiers ils résident, et obtenir les noms de fichiers de l'action et, fondamentalement, recréer la hiérarchie du menu des actions en interrogeant la structure du dossier.

+0

C'est une idée assez intrigante, en fait. Je n'avais même pas considéré cela. Je vais devoir essayer. – Miquella

+0

Hmm ... ils ne sont pas stockés en tant qu'actions individuelles. Ils sont stockés dans des ensembles d'actions (par exemple, toutes les "Actions par défaut" sont stockées dans un seul fichier). Je pourrais regarder l'analyse du fichier des actions, mais je ne suis pas convaincu que je suis prêt pour cela ... – Miquella

+0

autant que je sache, il n'y a aucun moyen d'obtenir une liste d'actions, sauf si vous pouvez comprendre comment interpréter le fichier atn ou en quelque sorte lire l'écran, vous devrez trouver une autre façon ... peut-être exiger que l'utilisateur sot seulement mettre une action dans un ensemble de sorte que l'ensemble a le même nom que l'action? espoir idk qui vous aide en quelque sorte nous tenir au courant – mcgrailm

2

Vous ne savez pas comment faire avec AppleScript, mais vous pouvez appeler ce JavaScript en utilisant AppleScript pour renvoyer les noms dans une liste d'actions donnée. Je l'ai adapté de "Image Processor.jsx".

function GetActionList(folderName) 
{ 
    var setCounter = 1; 
    var actions = ''; 
    var actionName; 

    gClassActionSet = charIDToTypeID('ASet'); 
    gClassAction = charIDToTypeID('Actn'); 
    gKeyName = charIDToTypeID('Nm '); 
    gKeyNumberOfChildren = charIDToTypeID('NmbC'); 

    while (true) 
    { 
     var ref = new ActionReference(); 
     ref.putIndex(gClassActionSet, setCounter); 
     var desc = undefined; 
     try { desc = executeActionGet(ref); } 
     catch(e) { break; } 
     actionName = desc.getString(gKeyName); 

     var numberChildren = 0; 
     if (desc.hasKey(gKeyNumberOfChildren)) 
      numberChildren = desc.getInteger(gKeyNumberOfChildren); 
     if (numberChildren) 
     { 
      if(actionName == folderName) 
      { 
       for (var i = 1; i <= numberChildren; i++) 
       { 
        var ref = new ActionReference(); 
        ref.putIndex(gClassAction, i); 
        ref.putIndex(gClassActionSet, setCounter); 
        var desc = undefined; 
        desc = executeActionGet(ref); 
        if(desc.hasKey(gKeyName)) 
        { 
         if(actions.length > 0) 
          actions = actions + ',' + desc.getString(gKeyName); 
         else 
          actions = desc.getString(gKeyName); 
        } 
       } 
       break; 
      } 
     } 
     setCounter++; 
    } 
    return actions; 
}