Passer de Applescript à Xcode / cherche un coup de main pour une petite application
Bonjour à tous,
Je suis monteur, formateur et rédacteur d'un PDF de formation de 407 pages sur Final Cut Pro X (FCP X).
(vous pouvez si vous le souhaitez voir la page où je le vends (pour une somme disons ... modique, vu le boulot) martingosset.com) mais je ne suis pas là pour faire de la pub pour ce machin.
Pour aider les monteurs film, j'ai songé à créer une petit application gratuite qui permettrait de faciliter ce qu'on appelle dans le métier le "dérushage"(partie du travail qui consiste à organiser les plans issus du tournage)
Avec la très aimable et précieuse aide de PBELL, j'ai pu écrire une petit application.
(le fil de discussion est ici : http://www.developpez.net/forums/d14...hier-textedit/ )
Cette petite application que j'ai appelé BOOMERANG (on peut la trouver ici : http://gossetmartin.free.fr/BOOMERANG (clic droit sur BOOMERANG.app.zip pour la télécharger) est un simple Applescript qui transforme un fichier texte (un .xml ouvrable dans TextEdit) en un autre.
L'application étudie le texte du fichier et le modifie selon plusieurs paramètres définis par l'utilisateur au démarrage de l'application.
Une fois cette app terminé, j'ai souhaité qu'une fenêtre UNIQUE permette de determiner divers options suivant les souhaits de l'utilisateur. Mais j'ai vite compris qu'une telle fenêtre n'était pas envisageable en Applescript. J'ai donc étudié la programmation en Cocoa dans Xcode et réussi à créer un fenêtre et à lié les différents champs à une variable.
Je pensais qu'il serait simple de lier cette fenêtre à l'Applescript que j'avais obtenu mais j'ai vite compris que c'était hors de portée pour moi qui ne suis pas du tout programmeur. Même en consultant les sites indiqué par Philippe. J'ai tenté de transposer le script en applescriptobjc mais je me rends compte que c'est une autre montagne.
Voici la fenêtre en question
Pièce jointe 156341
Après avoir beaucoup bossé, je baisse les bras et me dit qu'il me reste à accepter que je ne suis pas programmeur !!!
Je sollicite donc votre aide. Je serai ravi de vous offrir mon PDF mais aussi vous aider en retour, dans votre apprentissage du logiciel Final Cut Pro X si vous l'utilisez. Avec grand plaisir ;)
Le principe de la recherche consiste en plusieurs étapes:
I- on enregistre ce qui est entré et coché par l'utilisateur dans la fenêtre (une sorte de préférence utilisateur pour ne pas avoir à reremplir cette fenêtre à chaque utilisation). Je crois que dans Xcode, il y a lors de la construction de la fenêtre, une option qui permet de les enregistrer sans avoir à faire du code, mais je n'ai pas tout saisi).
II- on demande à l'utilisateur de choisir son fichier ("monfichierxml.xml").
III- créer une copie du fichier texte ("monfichierxml_NEW.xml").
IV- Modifier le contenu du nouveau fichier en fonction des options choisies dans la fenêtre.
IV.A Si la case keyword est cochée par l'utilisateur: (T_KEYWORD = true)
On consulte les champs "rate with" de la fenetre: on appelle cette valeur "ratesign" (par exemple)
Première modification
1. repérer toutes les lignes du fichier texte commençant par "</event>"
2. insérer 3 lignes juste avant
3a. écrire "<keyword-collection name="ratesign"/>" dans la premiere (exemple si le ratesign est une astérisque : "<keyword-collection name="*"/>")
3b. écrire "<keyword-collection name="ratesign deux fois"/>" dans la seconde (exemple : "<keyword-collection name="**"/>")
3c. écrire "<keyword-collection name="ratsigne trois fois"/>" dans la troisième ((exemple : "<keyword-collection name="***"/>")
3d..... on ajoute autant de lignes que l'indique le champs "number of rate" (à priori le monteur choisira entre 3 et 5 niveaux de classement)
Seconde modification
1. rechercher les lignes contenant à la fois le texte <rating start=" ET le texte value ="favorite" ET le caractère ratesign en un, deux, trois... exemplaires
(ex :<rating start="9143/5s" duration="55800/2500s" name="texte 1 entré par le monteur" value="favorite" note="**texte 2 entré par le monteur"/> où ici le caractère recherchée est l'astérisque *)
2. On insert une nouvelle ligne juste après:
<keyword start="9143/5s" duration="55800/2500s" value="**" note="**texte 2 entré par le monteur"/>
Notes:
-les parties en vert sont tirées des parties en vert dans la ligne originale).
-pour simplifier, j'ai mis l'astérisque * à la place de ratesign)
-ici il faudra faire un boucle pour chercher les lignes contenant le caractère ratesign en un, deux, trois...exemplaires selon la valeur indiquée par l'utilisateur dans le champs "number of rate")
IV.B Si la case Marker est cochée: (T_MARKER = true)
1. rechercher les lignes contenant à la fois le texte <rating start= ET le texte value ="favorite"
(ex :<rating start="9143/5s" duration="55800/2500s" name="texte 1 entré par le monteur" value="favorite" note="texte 2 entré par le monteur"/>
(on a déjà cherché ces lignes-la mais cette fois il n'est pas nécessaire qu'elles contiennent le caractère ratesign)
2. On insert une nouvelle ligne juste après:
<marker start="9143/5s" duration="100/2500s" value="texte 2 entré par le monteur"/>
Note:
-les parties en bleu sont écrites et les parties en vert sont tirées des parties en vert dans la ligne originale).
IV.C Si la case Favorite est décochée: (T_FAVORITE = false)
1. rechercher et supprimer tous les lignes contenant à la fois le texte <rating start= ET le texte value ="favorite"
IV.D Si la case Roles est cochée: (T_ROLL = true)
1. on rend accessible la possibilité de nourrir les champs ITW, LIVE,ILL, AMB, other1, other 2, etc... dans la fenêtre
(c'est une option lorsqu'on construit la fenêtre donc je crois que ça n'entre pas dans le code)
On obtient les variables T_ITW, T_LIVE,T_ILL,T_AMB,T_OTHER1, etc...
2. On fait une boucle en créant une variable P_ROLE à laquelle on attribue successivement les valeur T_ITW puis T_LIVE, etc...
3. On recherche les lignes contenant "clip name=" et on cherche si on y trouve les textes choisi par l'utilisateur (donc le P_ROLL du moment dans la boucle)
(exemple: <clip name="ILL général" duration="236700/2500s" start="1813s" format="r1" tcFormat="NDF">
Note:
-on va travailler sur les 2 lignes qui suivent nécessairement cette ligne lorsqu'elle commence par <clip name:<clip name="ILL général" duration="236700/2500s" start="1813s" format="r1" tcFormat="NDF">
<video name="Pocket_1_2014-05-28_0030_C0000 - v1" offset="1813s" ref="r2" duration="236700/2500s" start="1813s"/>
<audio name="Pocket_1_2014-05-28_0030_C0000 - a1" lane="-1" offset="1813s" ref="r2" duration="4544640/48000s" start="1813s" srcCh="1, 2"/>
4. On ajoute à la fin de la ligne suivante (la ligne commençant par "<video name=") le contenu "role=video." & P_ROLL & ">"<video name="Pocket_1_2014-05-28_0030_C0000 - v1" offset="1813s" ref="r2" duration="236700/2500s" start="1813s" role="video.ILL">
Note:
-les parties en bleu sont laissées telles quelle et la partie en violet est ajoutée, la partie en vert est tirée de la partie en vert dans la ligne précédente (commençant par "<clip name") qui est en fait la valeur P_ROLL.
5. On insert dans la ligne suivante (la ligne commençant par "<audio name=") le contenu "role=audio." & P_ROLL & ">"
(exemple: <audio name="Pocket_1_2014-05-28_0030_C0000 - a1" lane="-1" offset="1813s" ref="r2" duration="4544640/48000s" start="1813s" role="dialogue.audioILL" srcCh="1, 2"/>).
Note:
-les parties en bleu sont laissées telles quelle et la partie en violet est ajoutée, a partie en vert est tirée de la partie en vert dans la ligne précédente (commençant par "<clip name") qui est en fait là encore la valeur P_ROLL.
EN OPTION:
J'aimerais pour simplifier le travail de l'utilisateur, pouvoir controller FCP X. (Mais ce serait sûrement un petit luxe et cela peut sans problème être omis).
Je m'explique:
Le fichier "monfichierxml.xml" est en fait le fruit d'un export fait par l'utilisateur après avoir sélectionné une entité qu'on appelle "Événement" dans FCP X.
Cet export est fait en choisissant le menu "Fichier" puis "Exporter" puis "XML".
J'ai cru comprendre qu'on pouvait "implémenter" le sous-menu "Service" du menu "Final Cut Pro". Je me demandais donc si on ne pouvait pas permettre a l'utilisateur de lancer l'application depuis ce sous menu. L'app BOOMERANG se chargeant de l'export... je ne sais pas si cela complique fort la programmation !?
L'idée serait aussi qu'en retour et une fois créé le fichier "monfichierxml_NEW.xml", on puisse controller FCP X pour qu'il importe ce nouveau fichier en passant par le menu "Fichier" puis "importer" puis "xml".
Au total, l'utilisateur n'aurait donc qu'à choisir son événement dans Final Cut Pro X et lancer BOOMERANG depuis le sous-menu "Service".
------------------------------------------------------------------------------------
MAJ 16 septembre 15h11:
J'avais cru comprendre qu'on pouvait utiliser un commande (NSAppleScript) dans Xcode pour lancer un simple AppleScript. Peut-être la solution est elle là. Mais je n'y suis pas parvenu. Cela permettrait peut-être de ne pas tout réécrire ?
------------------------------------------------------------------------------------
Voili voilà
Je me remets seulement cette app après avoir un peu baisser les bras. Il y aura peut-être de tout petit ajouts qui ne me reviennent pas aujourd'hui mais je crois que je saurai m'en débrouiller avec la première version.
En vous remerciant mille fois de votre aide éventuelle
Cordialement
Martin Gosset