IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

Modifier le contenu d'un fichier textedit


Sujet :

AppleScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut Modifier le contenu d'un fichier textedit
    Bonjour à tous,

    Je suis monteur film et formateur au montage. Je rédige un document d'apprentissage pour Final Cut Pro X (FCP X) que je vends sur internet (pour une bien petite somme vu le boulot).

    J'aimerais entrer doucement dans l'écriture de petits scripts pour aider les utilisateur de FCP X à organiser leurs tournages (on appelle cela le dérushage) dans FCP X.
    Pour cela j'aimerais transformer le contenu d'un fichier (au format .fcpxml) qui peut s'ouvrir dans textedit.

    Le but me semble assez simple en soi mais mes connaissances sont très faibles en script et le très gros travail de vulgarisation que j'essaie de mener à propos de FCP X me prends énormément de temps et j'avoue n'avoir plus le courage de me plonger à fond dans un nouvel univers. Je propose à qui voudra bien aider ce petit bidule, une version gratuite de mon document (407 pages pour l'instant) et autant de coups de main sur FCP X qu'il voudra. Il s'agit donc d'un échange, disons.

    Voici l'idée:

    Dans ce fichier qui s'ouvre dans textedit, j'aimerais qu'en dessous de chaque ligne de ce type:

    <rating start="1264126/25s" duration "4000/2500s" name="nom du favoris un" value="favorite" note="*note du favoris un"/>

    le script ajoute à la suite une nouvelle ligne:

    <keyword start="1264126/25s" duration "4000/2500s" value="*" note="*note du favoris un"/>

    Cette ligne supplémentaire est donc une copie modifiée de l'originale où le script aura (dans l'orde d'apparition dans la ligne originale):
    remplacé le mot "rating" par le mot "keyword"
    supprimé la partie name="nom du favoris un"
    remplacé value "favorite" par value "*"

    Précision :
    1. Tout ce qui dans la ligne originale est dans les champs name et note est un texte qui peut varier (c'est du texte entré dans FCP X par l'utilisateur et sensé décrire le nom d'une entité (un favori) et la décrire un peu mieux avec le champ note).
    2. Par ailleurs l'astérisque * pourra parfois être deux ou trois astérisques ( donc ** ou ***) qui se trouveront toujours au début du contenu de la note de la ligne de départ. Ce serait idéal si le script pouvait donc étudier le début du contenu de la note et suivant qu'il trouve une, deux ou trois étoiles, il associe la value "*" ou "**" ou "***".
    3. L'idéal serait que seules les lignes comportant une ou plusieurs astérisques * dans leur champ note soient traitées par le script.
    4. L'idéal serait que l'utilisateur puisse déposer son fichier .fcpxml quelque part, que cela déclenche le script et qu'il puisse récupérer un fichier .fcpxml modifié.

    voili voilà

    Je mets donc cela entre vos mains et si le coeur et le courage vous en dit, je serai ravi de recevoir votre aide. Je sais par ailleurs que les demandes d'un néophytes complet ignorent souvent la quantité de savoir et de boulot que requiert une demande simple d'apparence.

    Merci de votre aide donc. Elle sera utile à la communauté des utilisateur de FCP X.

    bien à vous
    Martin

    PS: je suis matheux de formation donc n'ayez pas peur de la complexité.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour MartinOsset,
    Gentil petit challenge pour ce week end...

    Pour bien repérer la ligne à dupliquer/changer, quels sont les mots clé à repérer (pour éviter de prendre d'autres types de ligne) ?
    Par exemple est-ce que le fichier ne contient pas d'autres lignes (à ne pas dupliquer) qui commencent aussi par les caractères <rating start =" ?

    Si d'autres lignes, que tu ne souhaites pas dupliquer, peuvent aussi commencer par ces caractères, contiennent-elles aussi " name=" ?
    Tu le comprends, il faux d'abord être certain de trouver une "partern" unique qui garantie que cette ligne et pas une autre peut être traitée.

    Par ailleurs, j'imagine que les contenus entre "" des rating start, duration, name, value et note sont tous variables (d'un point de vue mathématique, je dirai quelconque !)

    Pour le reste, j'hésite entre des commandes replace Unix ou un script.
    - Unix très puissant, très rapide, mais dans ton cas, la syntaxe doit être un peu tordue.
    - AppleScript, plus lent, moins puissant dans les recherche/remplace, mais tellement plus lisible que cela te permettrai de modifier ensuite !

    Je réfléchi et je m'y mets dès que j'ai du temps ce WE... et que j'ai tes réponses !
    Cordialement

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    Philippe,

    très gentil à à toi de te pencher sur ce bidule.
    Alors oui ces question me font ajouter une petite précision du coup.

    1. Si on recherche les lignes qui contiennent <rating start=" on tombera sur des lignes qui contiennent la value "favorite" et celle qui ne la contiennent pas.
    Donc en fait il n'y a que les lignes commençant par <rating start=" et qui contiennent la value "favorite" qui seront concernées.
    Et ça serait super si on pouvait épargner celles qui ne contiennent aucune astérisque (ni*, ni **, ni ***) dans note. Mais je ne sais pas si ça complique pas trop le tri.

    Donc en résumé une ligne est à modifier si elle contient <rating start=" et value "favorite" et contienne une astérisque au moins dans note

    2. Pour ce qui est de name= il y a d'autres lignes qui le contiennent et là malheureusement ça poserait problème.

    3. les contenus entre "" des rating start, duration, name, value et note:
    -pour name, note c'est du texte entrée par l'utilisateur dans FCP X qui peut donc être différent selon les lignes.ça peut donc être name "Interview 1 de Jean-Pierre" et note " je bois du café au petit déjeuner "
    -pour duration ça parle de la longueur d'une plage (en nombre d'images) donc ça peut changer pour chaque ligne.
    -pour rating start ça dit à quelle image commence la plage donc ça peut changer pour chaque ligne.
    -pour value,dans la ligne originale c'est toujours "favorite" et ça ne change jamais.
    -par contre le value de la ligne copiée lui peut être ce qu'on veut (ici, on aimerait que ce soit *, ** ou ***, selon ce qu'on trouve dans la note de la ligne originale).

    Pour ce qui est de la vitesse d'execution, si y a 100 lignes à modifier, c'est bien le bout du monde. Je me dis que ça ne dois pas être très long. Je ne me rends pas compte. Et oui, si je peux espérer comprendre vaguement le code c'est mieux mais bon hein faut pas pousser mémé dans les orties !!!

    Bon merci beaucoup Philippe. Il n'y pas d'urgence du tout, donc si il y a du soleil ce week end, il y a surement mieux à faire

    Je reste à dispo si besoin d'autres précisions.

    bon week end

    Martin

  4. #4
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour Martin,
    Le script ci-dessous doit répondre à tes souhaits. Il doit être copié/collé dans l'éditeur de script et enregistré en tant qu'application (pas en tant que script !)
    Quelques commentaires :

    Lancement :
    Le programme principal est une sous routine nommé Prog_Principal. Cette routine est appelée par 2 handlers situés au début du script :
    - On run sera utilisé si l'utilisateur double click sur l'application : alors le script demande le nom d'un fichier .fcpxml
    - On Open sera utilisé si l'utilisateur dépose un ou plusieurs fichiers .fcpxml sur l'icône de l'application (traitement par lot possible !)

    Fichier résultat :
    Le fichier modifié est enregistré sous Nom_original_Nouv.fcpxml, dans le même dossier que l'original. J'ai mis des commentaires dans le script si tu veux directement écrire par dessus le fichier initial (lignes 17 à 24).
    Par habitude, je n'aime pas ré-écrire directement. En cas d'erreur, tout est perdu. A toi de voir selon le risque, les sauvegardes,...

    Pour les puristes, ce fichier est un format xml qui aurait aussi pu être traité comme tel par AppleScript. Le passage via un fichier texte n'est en fait pas plus compliqué que de manipuler des propriétés xml, mais peut être plus souples quant aux règles si elles évoluent !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    on run-- lancer avec un double click sur l'icone de script-- Sélection du fichier à ouvrir
        set source to choose file of type {"fcpxml"} with prompt "Sélectionner le fichier .fcpxml à traiter"
    Prog_Principal(source)
    end run
    
    
    on openList_source-- pour lancer le programme en droppant un ou plusieurs fichiers sur l'icone du script (sauvé comme application)
        repeat with source in List_source
    Prog_Principal(source)
        end repeat
    end open
    
    
    
    
    on Prog_Principal(source)
    -- extraire son nom, son dossier et ajouter un "_Nouv" dans le nom du fichier modifié pour éviter d'écraser l'existant
    -- cette partie peut être remplacée par un "Set Destination to Source", 
    -- cela écrasera le fichier source avant la fin de l'écriture du fichier destination :c'est plus dangereux, ..mais possible !
        tell application "Finder"
            set Nom to name of source
            set Nouv_Nom to (text 1 thru ((length of Nom) - 7) of Nom) & "_Nouv.fcpxml"
            set Destination to ((container of source) as text) & Nouv_Nom
        end tell
        
    -- on défini les constantes de recherche (ascii code 34 est un guillement)
        set Guil to ASCII character 34
        set T_Start to "<rating start=" & Guil
        set T_Favorite to "value=" & Guil & "favorite" & Guil
        set T_Note to "Note="
        
    -- lecture des lignes source
        set Mes_Lignes to paragraphs of (read source)
        
    -- crée le fichier destination et l'ouvre en écriture
        try
    open for accessfileDestination with write permission
        end try
        
    -- boucle sur les lignes
        repeat with Ligne in Mes_Lignes
    -- on réécrit la ligne telle quel
    write (Ligne & return) tofileDestinationstarting ateof
    -- rechercher si la ligne commence par <rating start=" et qui contient value="favorite", mais ne contient ni * ni ** ni *** dans une note
            if (Ligne starts with T_Start) and (Ligne contains T_Favorite) then
    -- recherche le contenu de la note
                set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
                set Asterix to ""
                if P_Note contains "***" then
                    set Asterix to "***"
                else if P_Note contains "**" then
                    set Asterix to "**"
                else if P_Note contains "*" then
                    set Asterix to "*"
                end if
                if Asterix is not "" then
    -- la ligne est bien à dupliquer car Note contient 1,2 ou 3 asterix : <keyword start="xxxx" duration="xxxx" value=" asterix "
                    set Ligne to "<keyword" & (text 8 thru -1 of Ligne)
                    set Ligne to (text 1 thru ((offset of "name=" in Ligne) - 1) of Ligne) & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
    write (Ligne & return) tofileDestinationstarting ateof
                end if
            end if
        end repeat
    close accessfileDestination
        display alert "Le fichier " & Nom & " est traité" giving up after 3
    end Prog_Principal
    Cordialement

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    Philippe,

    je viens seulement de voir ton message.

    c'est SUPER (le mot est faible) sympa.

    je vais regarder cela de près et cela me motivera joliment pour entrer document dans la programmation en Apple script (on appelle ça comme ça ?). Dans le temps je faisais des maths et j'ai toujours trouvé une poésie propre à ce genre de langage.
    Et tes remarques à propos des fichiers XML, me rappellent cette idée de "beau langage". Je pense qu'effectivement il y a une esthétique du code (sans snobisme s'entend). La "beauté" se loge là où on veut bien la voir.

    je te tiens au courant très rapidement et te remercie encore mille fois.

    (et comme promis, si l'envie d'apprendre ou de conforter tes savoirs sur FCP X te viens, je suis là !!!)

    à tout bientôt donc

    Martin

  6. #6
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    bon à partir de maintenant, toute réponse est optionnelle car je tenterai de chercher par moi même une solution:

    mais je la pose quand même:

    lorsque j'ai copié puis collé le script dans l'application AppelScript et que je l'enregistre sous forme d'application

    j'ai ce message lorsque j'enregistre le script en tant qu'application

    erreur de syntaxe
    «*given*», «*into*», «*with*», «*without*» ou autre nom de paramètre prévu mais fin de ligne trouvé.
    et il surligne la partie qui se trouve juste après on openList_source

    j'ai beau chercher partout, enlever toutes les lignes de commentaire (tout ce que tu as écrit avec deux tiret (--), rien n'y fait.

    Note :
    1. j'ai aussi essayer de passer par Automator pour y inclure un script. Pareil
    2.lorsque je lance l'appui (qui a malgré tout été créée), il me demande si je veux executer. je dis oui, il me propose ensuite de lui fournir un fichier .fcpxml et quand je valide j'ai le message suivant:
    "script" ne comprend pas le message "Prog_Principal"

    je continue mes recherches

    martin

  7. #7
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Il faut simplement ajouter un espace entre les mots "open" et "List_source".
    J'ai beau vérifier tout ou presque, depuis le nouveau look de ce forum (par ailleurs mieux que l'ancien !), il y a des bugs lors des copié/collé de scripts avec des espaces perdus ...
    J'ai beau vérifier, j'en oublie !

    Si après cette correction, tu as une autre erreur de compilation, c'est sûrement un autre espace qui s'est joué de ma vigilance.
    Dans le doute, sur le script posté initialement, les mots sont souvent de couleurs différentes (car copiés de l'éditeur de script), ce qui peut aider à voir lorsque des espaces manquent.

    Cordialement

  8. #8
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup beaucoup Philippe,

    Effectivement le souci était là. J'aurais beaucoup appris pendant ce temps !!!
    Malgré tout, quoique l'application se lançait alors bien, cela ne modifiait pas les fichier fcpxml.
    J'ai alors fait des tests, en ne gardant que des bouts de code. Pour voir ce qui n'allait pas. Il m'a semblé que cela se passait dans la boucle du premier IF. Comme si le script n'arrivait pas à detecter les étoiles (*). J'ai fini par le réécrire petits bouts par petits bouts (je commence à comprendre).
    J'ai finalement réussi à ce que ça fonctionne même si je pense que c'est du bricolage.
    C'est ici (vous verrez, j'ai entre autre ajouté une variable CROCHET car je pensais que le crochet n'était pas reconnu et je lui est attribué la valeur ASCII 60. Mais en fait ça n'est pas ça. J'ai tout de même laissé. Bricolage !!!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    on run -- lancer avec un double click sur l'icone de script-- Sélection du fichier à ouvrir
    	set source to choose file of type {"fcpxml"} with prompt "Sélectionner le fichier .fcpxml à traiter"
    	Prog_Principal(source)
    end run
     
    on open List_source -- pour lancer le programme en droppant un ou plusieurs fichiers sur l'icone du script (sauvé comme application)
    	repeat with source in List_source
    		Prog_Principal(source)
    	end repeat
    end open
     
    on Prog_Principal(source)
    	-- extraire son nom, son dossier et ajouter un "_Nouv" dans le nom du fichier modifié pour éviter d'écraser l'existant
    	-- cette partie peut être remplacée par un "Set Destination to Source", 
    	-- cela écrasera le fichier source avant la fin de l'écriture du fichier destination :c'est plus dangereux, ..mais possible !
    	tell application "Finder"
    		set Nom to name of source
    		set Nouv_Nom to (text 1 thru ((length of Nom) - 7) of Nom) & "_NEW.fcpxml"
    		set Destination to ((container of source) as text) & Nouv_Nom
    	end tell
     
    	-- on défini les constantes de recherche (ascii code 34 est un guillement)
    	set Guil to ASCII character 34
    	set CROCHET to ASCII character 60
    	set T_Start to CROCHET & "rating start=" & Guil
    	set T_Favorite to "value="
    	set T_Note to "note="
    	set T_Name to "name="
    	-- lecture des lignes source
    	set Mes_Lignes to paragraphs of (read source)
     
    	-- crée le fichier destination et l'ouvre en écriture
    	try
    		open for access file Destination with write permission
    	end try
     
    	-- boucle sur les lignes
    	repeat with Ligne in Mes_Lignes
    		-- on réécrit la ligne telle quel
    		write (Ligne & return) to file Destination starting at eof
    		-- rechercher si la ligne commence par <rating start=" et qui contient value="favorite", mais ne contient ni * ni ** ni *** dans une note
    		if (Ligne contains "rating start") and (Ligne contains T_Favorite) then
    			set Asterix to ""
    			set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
    			if (Ligne contains "name=") then
    				set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Name in Ligne) - 1) of Ligne)
    			else
    				set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Favorite in Ligne) - 1) of Ligne)
    			end if
    			if (P_Note contains "***") then
    				set Asterix to "***"
    			else if (P_Note contains "**") then
    				set Asterix to "**"
    			else if (P_Note contains "*") then
    				set Asterix to "*"
    			end if
    			if Asterix is not "" then
    				set Ligne to CROCHET & "keyword start=" & P_Start & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
    				write (Ligne & return) to file Destination starting at eof
    			end if
    		end if
    	end repeat
    	close access file Destination
    	display alert "your NEW fcpxml is ready" giving up after 3
    end Prog_Principal
    J'aimerais maintenant ajouter deux actions.
    la premiere
    Le but est de :
    1. repérer toutes les lignes commençant par "</event>"
    2.insérer 3 lignes juste avant
    3a. écrire "<keyword-collection name="*"/>" dans la premiere
    3b. écrire "<keyword-collection name="**"/>" dans la seconde
    3c. écrire "<keyword-collection name="***"/>" dans la troisième

    pour celle là je ne sais pas comment:
    1. insérer un ligne au dessus d'une ligne repérée (la ligne qui commence par </event>)
    1. insérer après une seconde ligne puis une troisieme.

    la seconde :
    Le but est de :
    premier partie:
    1. rechercher d'autres types de lignes en cherchant d'abord les lignes qui commence par "<clip name=".
    2. inspecter ce qu'il y a après "clip name=" dans la ligne pour voir si il y a les mots ITW, ILL, LIVE ou encore AMB.
    3. dans ce cas je crée une variable P_ROLL qui selon les cas prendre l'une de ces 4 valuers (ITW, LIVE...)
    4. ensuite l'idée est de placer a la fin de la ligne les mots "role=video." & P_ROLL & ">"
    seconde partie (en option):
    5. inspecter la PREMIER ligne suivante qui comporterait "<audio name=" en son début
    6. à la fin de de cette ligne repérée placer les mots "role=audio." & P_ROLL & ">"

    pour la premiere partie de celle-ci :
    j'ai essayé d'ajouter ce code en transformant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    if (Ligne contains "rating start") and (Ligne contains T_Favorite) then
    			set Asterix to ""
    			set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
    			if (Ligne contains "name=") then
    				set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Name in Ligne) - 1) of Ligne)
    			else
    				set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Favorite in Ligne) - 1) of Ligne)
    			end if
    			if (P_Note contains "***") then
    				set Asterix to "***"
    			else if (P_Note contains "**") then
    				set Asterix to "**"
    			else if (P_Note contains "*") then
    				set Asterix to "*"
    			end if
    			if Asterix is not "" then
    				set Ligne to CROCHET & "keyword start=" & P_Start & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
    				write (Ligne & return) to file Destination starting at eof
    			end if
    		end if
    en ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    	if (Ligne starts with T_CLIP) then
    			set P_ROLE to ""
    			if (Ligne contains T_INTERVIEW) then
    				set P_ROLE to T_INTERVIEW
    			else if (Ligne contains T_ILLUSTRATION) then
    				set P_ROLE to T_ILLUSTRATION
    			else if (Ligne contains T_AMBIANCES) then
    				set P_ROLE to T_AMBIANCES
    			else if (Ligne contains T_LIVE) then
    				set P_ROLE to T_LIVE
    			end if
    			if P_ROLE is not "" then
    				set Ligne to (text 1 thru -1 of Ligne) & T_ROLE & "video." & P_ROLE & Guil & ">"
    			end if
    		else if (Ligne starts with T_Start) and (Ligne contains T_Favorite) then
    			-- recherche le contenu de la note
    			set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
    			set Asterix to ""
    			if P_Note contains "***" then
    				set Asterix to "***"
    				set memAsterix to Asterix
    			else if P_Note contains "**" then
    				set Asterix to "**"
    				set memAsterix to Asterix
    			else if P_Note contains "*" then
    				set Asterix to "*"
    				set memAsterix to Asterix
    			end if
    			if Asterix is not "" then
    				-- la ligne est bien à dupliquer car Note contient 1,2 ou 3 asterix : <keyword start="xxxx" duration="xxxx" value=" asterix "
    				set Ligne to "<keyword" & (text 8 thru -1 of Ligne)
    				set Ligne to (text 1 thru ((offset of "name=" in Ligne) - 1) of Ligne) & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
     
    				write (Ligne & return) to file Destination starting at eof
    			end if
    		end if
     
    	end repeat
    ce qui donnerait avec les variables supplémentaires que j'ai ajouté en amont

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    on run -- lancer avec un double click sur l'icone de script-- Sélection du fichier à ouvrir
    	set source to choose file of type {"fcpxml"} with prompt "Sélectionner le fichier .fcpxml à traiter"
    	Prog_Principal(source)
    end run
     
    on open List_source -- pour lancer le programme en droppant un ou plusieurs fichiers sur l'icone du script (sauvé comme application)
    	repeat with source in List_source
    		Prog_Principal(source)
    	end repeat
    end open
     
    on Prog_Principal(source)
    	-- extraire son nom, son dossier et ajouter un "_Nouv" dans le nom du fichier modifié pour éviter d'écraser l'existant
    	-- cette partie peut être remplacée par un "Set Destination to Source", 
    	-- cela écrasera le fichier source avant la fin de l'écriture du fichier destination :c'est plus dangereux, ..mais possible !
    	tell application "Finder"
    		set Nom to name of source
    		set Nouv_Nom to (text 1 thru ((length of Nom) - 7) of Nom) & "_Nouv.fcpxml"
    		set Destination to ((container of source) as text) & Nouv_Nom
    	end tell
     
    	-- on défini les constantes de recherche (ascii code 34 est un guillement)
    	set Guil to ASCII character 34
    	set T_Start to "<rating start=" & Guil
    	set T_Favorite to "value=" & Guil & "favorite" & Guil
    	set T_Note to "Note="
    	set memAsterix to ""
    	-- lecture des lignes source
    	set Mes_Lignes to paragraphs of (read source)
    	set T_INTERVIEW to "ITW"
    	set T_AMBIANCES to "AMB"
    	set T_ILLSUTRATION to "ILL"
    	set T_LIVE to "LIVE"
    	set T_CLIP to "<clip name=" & Guil
    	set T_DURATION to "duration="
    	set T_ROLE to "role=" & Guil
    	-- crée le fichier destination et l'ouvre en écriture
    	try
    		open for access file Destination with write permission
    	end try
     
    	-- boucle sur les lignes
    	repeat with Ligne in Mes_Lignes
    		-- on réécrit la ligne telle quel
    		write (Ligne & return) to file Destination starting at eof
    		-- rechercher si la ligne commence par <rating start=" et qui contient value="favorite", mais ne contient ni * ni ** ni *** dans une note
    		if (Ligne starts with T_CLIP) then
    			set P_ROLE to ""
    			if (Ligne contains T_INTERVIEW) then
    				set P_ROLE to T_INTERVIEW
    			else if (Ligne contains T_ILLUSTRATION) then
    				set P_ROLE to T_ILLUSTRATION
    			else if (Ligne contains T_AMBIANCES) then
    				set P_ROLE to T_AMBIANCES
    			else if (Ligne contains T_LIVE) then
    				set P_ROLE to T_LIVE
    			end if
    			if P_ROLE is not "" then
    				set Ligne to (text 1 thru -1 of Ligne) & T_ROLE & "video." & P_ROLE & Guil & ">"
    			end if
    		else if (Ligne starts with T_Start) and (Ligne contains T_Favorite) then
    			-- recherche le contenu de la note
    			set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
    			set Asterix to ""
    			if P_Note contains "***" then
    				set Asterix to "***"
    				set memAsterix to Asterix
    			else if P_Note contains "**" then
    				set Asterix to "**"
    				set memAsterix to Asterix
    			else if P_Note contains "*" then
    				set Asterix to "*"
    				set memAsterix to Asterix
    			end if
    			if Asterix is not "" then
    				-- la ligne est bien à dupliquer car Note contient 1,2 ou 3 asterix : <keyword start="xxxx" duration="xxxx" value=" asterix "
    				set Ligne to "<keyword" & (text 8 thru -1 of Ligne)
    				set Ligne to (text 1 thru ((offset of "name=" in Ligne) - 1) of Ligne) & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
     
    				write (Ligne & return) to file Destination starting at eof
    			end if
    		end if
     
    	end repeat
     
    	close access file Destination
    	display alert "your new fcpxlm files " & Nom & memAsterix & "is ok" giving up after 3
    end Prog_Principal
    en fait plutôt que ressayer de faire cela dans le m^me mouvement (scan progressif des lignes du fichier) j'aimerais le faire en 3 petits PROGRAMMES. A la fin du premier PROGRAMME, on remonterait au début du fichier et on lancerait le second et ensuite pareil avec le troisième. Ce serait moins compliqué pour moi, même si c'est moins joli et conduit surement à une analyse plus longue. Cela me permettrait aussi dev kir les bout de scripts qui ne marchent pas.

    Je me demandais d'ailleurs si je n'allais pas passer par automator en procédant ainsi

    Etape 1: Premier script (celui que vous m'avez gentiment transmis)
    Etape 2: Action Automator: on réouvre le nouveau fichier .fcpxml et on le transmet au script suivant (je n'arrive pas à trouver le module de automator qui permette de réouvrir ce fichier et de le livrer au script suivant, mais peut-être que ça peut être un petit script)
    Etape 3: second script (ajouter les 3 lignes "<keyword-collection name="*"/>", "<keyword-collection name="**"/>" et "<keyword-collection name="***"/>" avant la ligne </event>
    Etape 4: Action Automator: on réouvre le nouveau fichier .fcpxml et on le transmet au script suivant.
    Etape 5: troisième script (ajouter les mots "role=video." & P_ROLL & ">" à la fin des ligne commençant par "<clip name=")+ en option ((ajouter les mots "role=audio." & P_ROLL & ">" à la fin des ligne commençant par "<audio name=")

    voilà où j'en suis
    je continue mes recherches

    merci encore mille fois (je ne vous en voudrez pas du tout si vous ne répondez pas à ce message, EVIDEMENT)

    Martin

  9. #9
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour Martin,
    Je ne suis pas certain que la variable Crochet "<" apporte un plus, mais pas de souci, le but est que cela fonctionne avec les corrections que tu as faites !
    Je vois cependant dans ta correction que tu cherches maintenant les lignes avec "rating start" et "value=" et pas "value="favorite"". J'ai du mal interpréter.


    Petite remarque en passant : le dernier display Alert est en anglais et la sélection du fichier au début est en français. Fromage ou dessert ? j'ai mis le premier dans la langue de Shakespeare.


    Si tu veux tester les lignes </Event> pas de problème tout peut se faire. C'est aussi une raison pour laquelle j'ai préféré faire cela en texte car je m'attendais à des extensions ! Idem pour les lignes avec "<clip name=" et "<audio name".

    Je n'aime pas ton idée de passe multiples .
    Certes il est possible de lancer un script à partir d'un autre ou à partir d'Automator (quel est l'intérêt ici d'ajouter Automator ?), cependant, pour une meilleure lecture et maintenance du code, je suggère de passer par des sous routines pour chaque type de ligne... ce sera plus lisible: une sous routine pour traiter les rating start, une pour les </event>, une pour les <clip name=" , etc ... en attendant qu'il y en aie d'autres !!

    Cela implique cependant de bien transmettre les variables adéquates à chaque routine et de laisser les autres en local, à l'exception de Guil et Crochet.
    L'avantage est que tu peux pousser plus loin les possibilités, car avec des sous routines, celles-ci peuvent aussi appeler des modules externes (d'autres scripts) qui sont assignés chacun à une tâche particulière.
    J'ai repris ton script en le transformant avec les 4 sous-routines ( tu pourrais en ajouter d'autres) :
    Je précise que j'ai supprimé les variables T_CLIP et T_Duration car elles ne semblent pas utiles

    (j'ai beau ajouter l'espace après open à la main, il est systématiquement supprimé lorsque je fais une prévisualisation du message !!! pense à le rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    global Guil
    global CROCHET
    
    
    on run-- lancer avec un double click sur l'icone de script-- Sélection du fichier à ouvrir
        set source to choose file of type {"fcpxml"} with prompt "Select the file .fcpxml to process :"
    Prog_Principal(source)
    end run
    
    
    on openList_source-- pour lancer le programme en droppant un ou plusieurs fichiers sur l'icone du script (sauvé comme application)
        repeat with source in List_source
    Prog_Principal(source)
        end repeat
    end open
    
    
    on Prog_Principal(source)
    -- extraire son nom, son dossier et ajouter un "_New" dans le nom du fichier modifié pour éviter d'écraser l'existant
        tell application "Finder"
            set Nom to name of source
            set Nouv_Nom to (text 1 thru ((length of Nom) - 7) of Nom) & "_NEW.fcpxml"
            set Destination to ((container of source) as text) & Nouv_Nom
        end tell
        
    -- Initialisation des variables 
        set Guil to ASCII character 34 -- 34 est un guillement
        set CROCHET to ASCII character 60 -- 60 est un chevron <
        set P_ROLE to ""
        
        set Mes_Lignes to paragraphs of (readsource) -- lecture des lignes source
        try
    open for accessfileDestination with write permission-- crée le fichier destination et l'ouvre en écriture
        end try
        repeat with La_Ligne in Mes_Lignes-- boucle sur les lignes du fichier
            if (La_Ligne starts with "<rating start") then
    L_Rating(La_Ligne, Destination)
            else if La_Ligne starts with "</event>" then
    L_Events(La_Ligne, Destination)
            else if La_Ligne starts with "<clip name=" then
                set P_Roll to L_Clip_Name(La_Ligne, Destination)
            else if (L_Ligne starts with "<Audioname=") and (P_Roll is not "") then
    L_Audio_Name(La_Ligne, Destination, P_ROLE)
                set P_ROLE to ""
            end if
        end repeat
    close accessfileDestination
        display alert "your NEW fcpxml is ready" giving up after 3
    end Prog_Principal
    
    
    
    
    -- ********************************* traite les lignes commençant par "raiting start"
    on L_Rating_Start(Ligne, Fichier)
        set T_Start to CROCHET & "rating start=" & Guil
        set T_Favorite to "value="
        set T_Note to "note="
        set T_Name to "name="
    write (Ligne & return) tofileFichierstarting ateof-- on réécrit en premier la ligne telle qu'elle est
    -- rechercher si la ligne contient value="favorite", mais ne contient ni * ni ** ni *** dans une note
        if (Ligne contains T_Favorite) then
            set Asterix to ""
            set P_Note to (text ((offset of T_Note in Ligne) + 6) thru ((length of Ligne) - 3) of Ligne)
            if (Ligne contains "name=") then
                set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Name in Ligne) - 1) of Ligne)
            else
                set P_Start to (text ((offset of T_Start in Ligne) + 14) thru ((offset of T_Favorite in Ligne) - 1) of Ligne)
            end if
            if (P_Note contains "***") then
                set Asterix to "***"
            else if (P_Note contains "**") then
                set Asterix to "**"
            else if (P_Note contains "*") then
                set Asterix to "*"
            end if
            if Asterix is not "" then
                set Ligne to CROCHET & "keyword start=" & P_Start & "value=" & Guil & Asterix & Guil & " note=" & Guil & P_Note & Guil & "/>"
    write (Ligne & return) tofileFichierstarting ateof
            end if
        end if
    end L_Rating_Start
    
    
    -- ********************************* traite les lignes commençant par "</event>" en écrivant d'abord 3 lignes différentes, puis la ligne elle-même
    on L_Events(Ligne, Fichier)
        set L_Key to "<keyword-collection name=" & Guil & "*" & Guil & "/>"
    write (L_Key & return) tofileFichierstarting ateof
        set L_Key to "<keyword-collection name=" & Guil & "**" & Guil & "/>"
    write (L_Key & return) tofileFichierstarting ateof
        set L_Key to "<keyword-collection name=" & Guil & "**" & Guil & "/>"
    write (L_Key & return) tofileFichierstarting ateof
    write (Ligne & return) tofileFichierstarting ateof
    end L_Events
    
    
    -- ********************************* traite les lignes començant par "<clip name=" : les écrit en extrayant le code P_Role si il existe
    on L_Clip_Name(Ligne, Fichier)
        set T_INTERVIEW to "ITW"
        set T_AMBIANCES to "AMB"
        set T_ILLSUTRATION to "ILL"
        set T_LIVE to "LIVE"
        set L_P_ROLE to ""
        if (Ligne contains T_INTERVIEW) then
            set L_P_ROLE to T_INTERVIEW
        else if (Ligne contains T_ILLUSTRATION) then
            set L_P_ROLE to T_ILLUSTRATION
        else if (Ligne contains T_AMBIANCES) then
            set L_P_ROLE to T_AMBIANCES
        else if (Ligne contains T_LIVE) then
            set L_P_ROLE to T_LIVE
        end if
    write (Ligne & return) tofileFichierstarting ateof
        return L_P_ROLE-- renvoie la valeur L_P_Role (ITW, LIVE,ILL,AMB)
    end L_Clip_Name
    
    
    -- ********************************* traite les lignes commençant par <audio name= et ajoute à la fin "role=audio." & L_P_Roll & >
    on L_Audio_Name(Ligne, Fichier, L_P_ROLE)
        set T_ROLE to "role=" & Guil
        set Ligne to (text 1 thru -1 of Ligne) & T_ROLE & "video." & L_P_ROLE & Guil & ">"
    write (Ligne & return) tofileFichierstarting ateof
    end L_Audio_Name
    Cordialement

  10. #10
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup Philippe

    avec votre aide et une presque une nuit blanche, je retrouve les vieux automatismes du Pascal quand il fallait diagonaliser des matrices. il y a 20 ans !!!

    avec ce code-ci, je crois que j'ai vraiment de quoi faire. je vais étudier tout cela.

    bon Philippe, un grand grand merci pour cet accompagnement. J'ai l'impression d'être une petite barque perdue dans l'océan qui a eu la chance de rencontrer le secours d'une fière esquife.
    Je vais pouvoir vous laisser à vos grandes pêches arctiques.

    merci à vous

    et ma proposition tiens toujours

    bien à vous

    Martin

  11. #11
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    Voilà,

    ça marche. Il manquait une petite ligne pour reconduire les lignes pas traitées (à moins que je l'ai enlevé sans faire exprès)
    Je vais ajouter une routine supplémentaire pour ajouter cette fois ce qu'on appelle dans FCP X des Marqueurs

    Donc à partir du Nom du plan, du nom du Favoris et de sa Note, on pourra créer
    des mots clés
    des Rôles
    des Marqueurs

    Maintenant je travaille à une petite fenêtre de départ pour pouvoir:
    1. cocher ce qu'on veut obtenir (Mots-Clés, Rôles, Marqueurs)
    2. préciser si on veut garder les Favoris ou les supprimer
    3. définir le signe utilisé pour donner des notes aux plans (jusqu'ici c'était *)
    4. définir le nombre de niveaux possibles ( 4 signifierait qu'on peut avoir jusqu'à 4 signes: *,**,***,****)
    5. indiquer les abréviations qu'on utilise dans le codage des Interviex, Live, Ambiance etc...
    6. enregistrer ses propres réglages pour ne pas avoir à les refaire à chaque fois.

    donc le menu ressemblera à ça
    Nom : MENU BOOMERANG.jpg
Affichages : 2069
Taille : 272,8 Ko

    Donc je vais
    1.ajouter un routine pour écrire une ligne ajoutant un marqueur à l'endroit du favoris
    2.créer une variable booléen pour chaque case coché dans la première partie du menu
    3.créer une variable pour le singe utilisé
    4.créer une variable pour le nombre de niveau possible à chercher
    5.créer un variable pour chaque champ d'abréviation
    6.créer une variable qui recueillera les choix de l'utilisateur pour pouvoir les conserver quelque part (surement qu'il est possible de créer des variables à plusieurs entrée (genre ChoixUtil(oui,non,non,oui,*,3,ITW,AMB,ILL,...))
    7. créer un menu genre questionnaire.

    voili voilà

    en tout cas je suis super content parce que je crois que ça va être une application très utiles pour les monteurs film.
    J'aimerais Philippe savoir comment je peux te siter. Un site internet, un compte Facebook, twiter etc...?
    Je pense que c'est important. Pour moi en tout cas, ça l'est.

    Martin

  12. #12
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir Martin,
    Compte tenu de la nouvelle structure (boucle principale et sous routine), tu n'aura pas de problème pour ajouter des marqueurs
    (Ils sont effectivement très utiles ! Pour info, j'utilise aussi FCP, mais je suis resté à la version 7 car 1) je suis amateur, 2) vu le prix !)

    Pour ce qui est de stocker des variables ou préférences utilisateurs, il y a 3 techniques propres et possibles :
    1) lorsque le script est enregistré sous forme d'application, tu peux mettre des fichiers ( texte, xml, ou autres) avec les préférences de l'utilisateur dans le paquet de l'application.
    Tu accèdes à l'emplacement via une instruction "path to me" dans le script lui-même.
    Avantage: c'est très simple pratique et l'utilisateur qui copie l'icône de l'application copie ses préférences avec !
    Inconvénient : si l'application est enregistrée dans le dossier /Applications il se peut que l'utilisateur non admin n'est pas les autorisations !!

    2) Tu utilises les propriétés des Property (souvent méconnues !). En effet tu peux définir leur valeur dans ton script, un peu comme des constantes, mais tu peux les changer et la nouvelle valeur est stockée dans ton script compilé,..tant que tu ne le re-compile pas !! J'ai cependant des doutes sur cette méthode avec Maverick et suivants car ces systèmes sont plus stricts en matière de sécurité et limitent l'autorisation des modification d'une application sur elle-même ! pas cool, mais plus secure !

    3) Le plus propre et conforme aux guides de développement Apple, tu enregistres et lis un fichier dans le dossier utilisateur / Bibliothèque / Préférences
    Accessible via le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set Mon_Fichier to (((path to preferences folder) as string) & "Nom_de_mon_Fichier_Pref")
    L'avantage est que l'utilisateur a toujours accès à ce ficher en lecture écriture.
    En plus tu peux combiner avec le 1, c'est à dire fournir ton application avec un fichier de préférence par défaut dans la paquet de l'application et le copier dans la bibliothèque si il n'y en a pas.
    J'ai fait ça pour quelques applications : c'est Nickel ! Simple et de bon goût !!

    Ton fichier de préférence peut contenir n'importe quel type de variable (des records, des listes, ...), donc à fortiori des attributs booléen (oui/non) !
    Je peux t'aider sur cette partie de gestion de préférences

    Voilà pour le côté positif !

    Mais je suis aussi tenu d'aborder la côté obscur de la Force,...pardon d'Applescript : Applescript est très limité en matière d'interface utilisateur.
    Une fenêtre avec des cases à cocher,...tu oublies ! sauf à passer via xCode (ce que j'ai du faire dans certains cas).
    Il existe bien des add-on type SATImage, mais le partage est moins souple.

    Il est toujours possible de contourner en partie cette limitation à condition de bien penser les questions à poser :dialogue à 3 boutons, dialogue avec liste de choix ?...
    Mais cela ne vaudra jamais une belle fenêtre de dialogue avec des cases bien organisées, des lignes de séparation et même une image adéquate !

    Cordialement

  13. #13
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup Philippe,

    Je mets ce petit bout de script de côté pour la fin !!!

    Pour les marqueurs, j'ai réussi sans soucis. Et effectivement, ces petites routines, c'est super pratique.

    Et effectivement, à force de roder, j'ai commencé à travailler dans Xcode pour créer la fenêtre. Ce qui n'est pas difficile. le seul truc c'est que je n'arrive pas à chopper le scripte. Je vais trouver. Quelques tuto et je vais découvrir le truc.

    J'ai déjà bien compris que c'était un objet à part et que le script doit attraper des variable issues de la fenêtre. C'est un peu comme un cerf-volant. Le cerf volant c'est la fenêtre dans Xcode et nous on est dans le script et on tire un peu les ficelles.

    mouai, pas certain que ce soit l'image la plus adaptée.

    Je t'ai mis en MP le lien de mon PDF... au cas où tu veuilles te mettre un jour à FCP X.

    voici aussi un lien de l'application (zippé):
    http://gossetmartin.free.fr/BOOMERANG
    dans le dossier, il y a aussi des images, genre avant/ après. Je pense que ça ne demande pas beaucoup plus d'explication. Juste pour que tu vois un peu à quoi sert ton aide.

    Je retourne donc à Xcode pour créer cette fichue fenêtre.

    merci encore

    Martin

  14. #14
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Pour ceux qui se posent la question de la gestion de quelques préférences pour leur application Applescript, j'ai réuni les morceaux de codes que j'utilise pour en faire quelque chose de ré-utilisable par tous.
    Il s'agit des 2 routines Get_Pref et Save_Pref (lignes 1 à 54)

    Elles sont écrites de telle manière que n'importe quelle structure de données (record) dans la variable Mes_Pref pourra être gérée: lecture, écriture avec initialisation par variable ou fichier dans le paquet de l'application Applescript.
    Pour mémoire, un record est un ensemble de données Applescript pouvant combiner des valeurs, des listes avec ou sans étiquettes. Très pratique ! Souvent méconnu.

    J'ai adapté l'exemple à une partie des préférences souhaitées par Martin, (voir la variable Mes_Pref et la sous-routine Modif_Pref).
    La partie Modif_Pref donne un exemple des limites d'Applescript en matière d'interface utilisateur... Cela n'atteint pas la puissance et souplesse de Xcode, mais Applescript reste plus abordable pour des choses simples !
    J'espère que cela aidera certains.
    N'hésitez pas à faire des commentaires !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    global Mes_pref, Pref_Application, Pref_Bibli-- met en global ces variables pour pouvoir les appeler à niveau
    
    property Nom_Pref : "com.Perso.Appli" -- exemple de nom  de préférences (URL inversée)  possible en format PList!
    property Mes_pref : {Interview:"ITW", Lives:"Live", Illus:"ILL", Ambiances:"AMB", Coupe:"PCTIW", Synchro:"SYNCRO", Favori:true, Mot_Cle:true, Marqueurs:true, Roles:true, Signe_Note:"*", Niveau:3}
    
    
    -- initialisation des variables
    set Pref_Application to ((path to me) as string) & "Contents:Resources:" & Nom_Pref
    set Pref_Bibli to ((path to preferences folder) as string) & Nom_Pref
    
    
    
    
    -- programme principal
    Get_Pref() -- initialisation à lancer au début de l'application
    set Lives of Mes_pref to "LIVE"
    
    set R to display dialog "Voulez vous modifier les préférences" buttons {"Modifier", "Continuer"} default button "Continuer"
    if (button returned of R) is "Modifier" then Modif_Pref() -- sous routine de changement des préférences
    
    display dialog "fin du programme"
    -- fin du prgramme principal
    
    
    
    on Get_Pref() -- lit le fichier préférence à partir du fichier en bibliothèque, sinon, du paquet application, sinon à partir des valeur par défaut (et crée le fichier bibliothèque)
        set A_Sauver to false
        tell application "Finder"
            if (exists (filePref_Bibli)) then -- lecture du fichier via Pref_Bibli
                try
                    set Mes_pref to (read (file Pref_Bibli) as record)
                on error
    close access (filePref_Bibli)
                end try
            else if (exists (filePref_Application)) then -- lecture de Pref_Application et écriture vers Pref_Bibli
                set Mes_pref to (read (filePref_Application) asrecord)
                set A_Sauver to true
            else
                set A_Sauver to true-- 2criture des property par défaut
            end if
        end tell
        if A_Sauver then Save_Pref() -- appel à une sub-routine en dehors du bloc tell "Finder"
    end Get_Pref
    
    
    on Save_Pref() -- enregistre le record Mes_Pref dans le fichier préférences
        try
    open for access (filePref_Bibli) with write permission
    writeMes_prefasrecordto (filePref_Bibli) starting at 0
    close access (filePref_Bibli)
        on error
    close access (filePref_Bibli)
        end try
    end Save_Pref
    
    
    
    
    on Modif_Pref()
    -- exemple de gestion des préférences (malgré les limitations d'interface AppleScript). Cette partie gagnera à être faite via XCode
    -- choix des préférences : type de marqueurs ou abréviations ou signe et Niveau (un seul choix)
        set Change_Fait to false
        set M_Liste to {"Interview (" & Interview of Mes_pref & ")", "Lives (" & Lives of Mes_pref & ")", "Illustrations (" & Illus of Mes_pref & ")", "Ambiances (" & Ambiances of Mes_pref & ")", "Plan de coupes (" & Coupe of Mes_pref & ")", "Son Synchro (" & Synchro of Mes_pref & ")"}
        set Saisie to choose from listM_Listewith prompt "Valeurs et codes à modifier" with multiple selections allowed
        if Saisie is not false then
            repeat with Choix in Saisie
                if Choix contains "Interview" then
                    set Cur_Val to Interview of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les interviews" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Interview of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Interview of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Lives" then
                    set Cur_Val to Lives of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les Lives" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Lives of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Lives of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Illustrations" then
                    set Cur_Val to Illus of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les Illustrations" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Illus of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Illus of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Ambiances" then
                    set Cur_Val to Ambiances of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les ambiances" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Ambiances of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Ambiances of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Plan de coupes" then
                    set Cur_Val to Coupe of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les plans de coupe" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Coupe of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Coupe of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Son Synchro" then
                    set Cur_Val to Synchro of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les sons syncrho" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Synchro of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Synchro of Mes_pref is Cur_Val)
                    end if
                end if
            end repeat -- sur chaque valeur d'abréviation à modifier
        end if --si il faut changer les abréviations
    -- selection des types de records (Favori, Mot-clé, Marqueurs et Roles)
        set M_Liste to {"Favoris", "Mots-clé", "Marqueurs", "Roles"}
        set Pre_Liste to {}
        if Favori of Mes_pref then set Pre_Liste to Pre_Liste & {"Favoris"}
        if Mot_Cle of Mes_pref then set Pre_Liste to Pre_Liste & {"Mots-clés"}
        if Marqueurs of Mes_pref then set Pre_Liste to Pre_Liste & {"Marqueurs"}
        if Roles of Mes_pref then set Pre_Liste to Pre_Liste & {"Roles"}
        set Saisie to choose from listM_Listewith prompt "Types d'enregistrement à prendre en compte" default itemsPre_Liste with multiple selections allowed
        if Saisie is not false then
            set Favori of Mes_pref to (Saisie contains "Favori")
            set Mot_Cle of Mes_pref to (Saisie contains "Mots-Clés")
            set Marqueurs of Mes_pref to (Saisie contains "Marqueurs")
            set Roles of Mes_pref to (Saisie contains "Roles")
            set Change_Fait to true-- on pourrai ici vérifier quel attribut a été changé ou non !
        end if --si il faut changer les types de records
        if Change_Fait then Save_Pref()
    end Modif_Pref
    Cordialement

  15. #15
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    Bonjour Philippe,

    J'ai encore beaucoup appris

    et ça fonctionne parfaitement

    je suis maintenant en train d'essayer de tout faire dans Xcode en cocoa applescript (un truc comme ça) pour avoir une fenêtre unique.
    J'ai réussi à paramtrer la fenêtre et à la connecter au script.
    Je m'en vois par contre pour la partie fichier (créer un second fichier _Nouv.fcpxml)
    Je pense que la suite sera pls simple.
    En encore beaucoup à apprendre

    Je vais aller voir le site qe tu m'as indiqué pour le Xcode

    merci encore à toi

    Martin

  16. #16
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    Bonjour Philippe,

    J'ai donc bien réussi à créer cette petite application avec ses préférences. J'ai ajouté quelques possibilités supplémentaires mais il m'a semblé que les options se multipliant, la trop nombreuse succession de fenêtres pour paramétrer l'application devenait rédhibitoire. Pour n'en avoir qu'une seule, j'ai donc appris à la créer dans Xcode. Et j'y suis parvenu. J'ai enfin compris comment connecter les boutons, les cases à cocher et les champs à remplir au code lui-m^me.

    J'ai tenté de transposer le script en applescriptobjc mais je me rends compte que c'est une autre montagne.

    ça me chagrine parce que l'application est là et plus je la ""développe" plus j'en vois l'intérêt. Tout ça pour une fenêtre !!! Brrrr...

    Je pars une quinzaine de jours promener mes gars dans les montagnes et reviendrais vaillant pour une dernière tentative.
    Je crois qu'il va falloir que j'achète un livre d'apprentissage ou que j'admette qu'on ne peut tout faire soi-même... ce qui est une autre résolution tout aussi envisageable.

    Merci encore à toi Philippe et à ce forum qui m'a permis de faire mes tout premiers (retours) pas dans ce monde de la programmation.

    à bientôt je l'espère

    et belle fin d'aout.

    Martin

  17. #17
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut Déterrage
    Bonjour à tous,

    je me remets à cette petite application.

    J'aimerais après recherche d'un terme de type "mot1_mot2_mot3_mot4" créer 4 lignes de type:

    "blablalbbla "mot1" blablabla"
    "blablalbbla "mot2" blablabla"
    "blablalbbla "mot3" blablabla"
    "blablalbbla "mot4" blablabla"

    mon soucis est donc de saucissonner le mot "mot1_mot2_mot3_mot4" en 4 mots.

    donc réussir à detecter un premier tiret bas (_) et d'attribuer la valeur mot1 qui précède à une première variable, detecter le second tiret bas et attribuer la valeur mot2 à une seconde variable, etc...

    une fois que j'ai réussi ça, pas de soucis pour fabriquer les 4 lignes...

    donc ma question consiste à comprendre comment saucissonner une phrase selon des séparateurs ...

    et je n'y parviens pas !!!

    quelqu'un d'entre vous saurait-il me mettre sur une piste de boucle sachant qu'avec ce que PBELL m'a appris j'ai surement déjà presque tout...

    en vous remerciant d'avance pour vos idées (en applescript) ...

    martin

  18. #18
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour Martin,
    Il faut utiliser les délimiteurs de texte prévus par Applescript. Voici un exemple de script qui réponds à ta question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    -- texte dans lequel il faut chercherset mon_texte to "voici les mots recherchés : mot1_mot2_mot3_mot4, au milieu d'un texte"
    
    -- la cible de recherche
    set mot1 to "mot1"
    set mot2 to "mot2"
    set mot3 to "mot3"
    set mot4 to "mot4"
    set cible to mot1 & "_" & mot2 & "_" & mot3 & "_" & mot4
    -- la valeur de remplacement de la cible
    set Remplace to "bla1 " & mot1 & " bla1" & return
    set Remplace to Remplace & "bla2 " & mot2 & " bla2" & return
    set Remplace to Remplace & "bla3 " & mot3 & " bla3" & return
    set Remplace to Remplace & "bla4" & mot4 & " bla4" & return
    
    
    set Position to offset of cible in mon_texte
    if (Position is 0) then return -- la chaine mot1,2, 3, 4 n'est pas dans le texte : fin du script
    set AppleScript's text item delimiters to cible
    set ma_liste to every text item of mon_texte
    set texte_final to (item 1 of ma_liste) & Remplace & (item 2 of ma_liste)
    display dialog texte_final
    Cordialement

  19. #19
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup m'sieur !!!

    Je vais étudier cela. Cela parait beaucoup moins laborieux que ce que j'avais commencé à écrire.

    Cela va beaucoup m'aider.

    Merci, merci et ... super merci

    Martin

  20. #20
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 15
    Points
    15
    Par défaut Fin de partie ;)
    Un petit mot pour te dire que je ne devais pas être le seul a trouver qu'il était urgent d'écrire une petit application comme celle à laquelle je souhaitais me coller

    quelqu'un l'a sortie quelques jour après ces messages.

    http://fcpxpert.net/2015/07/15/geekc...l-audio-roles/

    cela fait que je ne plus besoin de m'y atteler !!!

    merci encore à toi pour ta disponibilité et ta générosité.

    Martin

Discussions similaires

  1. Modifier le contenu d'un fichier PDF en PHP
    Par Ghunter59 dans le forum Langage
    Réponses: 6
    Dernier message: 17/03/2020, 13h27
  2. Modifier le contenu d'un fichier
    Par karim_usthb dans le forum C
    Réponses: 2
    Dernier message: 28/05/2008, 09h42
  3. Modifier le contenu d'un fichier
    Par sconrad dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2008, 17h00
  4. modifier le contenu d'un fichier
    Par progamer54 dans le forum ANT
    Réponses: 1
    Dernier message: 06/12/2007, 11h31
  5. Modifier le contenu d'un fichier
    Par Core8 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/01/2007, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo