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

Scheme Discussion :

Problème de traitement de variables de type chaîne de caractères


Sujet :

Scheme

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut Problème de traitement de variables de type chaîne de caractères
    Bonjour.

    Je suis en train de faire un petit script sous Gimp ... qui utilise scheme donc.

    J'ai défini une variable ... baptisée mettons filenamein ... qui est le nom de mon image avant traitement ... et qui est donc une chaine de caractère du genre "T1_V1_E1_L1C1" (mais au final peu importe).

    Je voudrais ensuite une fois le traitement terminé enregistrer l'image sous un nom un peu différent en rajoutant _bin à la fin de la précédente chaine.

    La variable s'appellerait filenameout.

    J'avais pensé à un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (set! filenameout '(filenamein "_bin"))
    Mais çà n'a pas l'air de marché car j'obtiens visiblement une liste de deux chaines de caractères au lieu d'obtenir une nouvelle chaine de caractères.

    A moins que ce ne soit la même chose ??

    Mes connaissances en scheme datant de ce matin seulement ... quelqu'un pourrait il éclairer ma lanterne sur le sujet ?!?

    Merci d'avance.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Je ne connais pas le Scheme sous GIMP (c'est bien Guile n'est-ce pas?). Ce que je dis est donc en toute réserve qu'il respecte les standards normaux (R6RS par exemple).

    La première chose est bien entendu que tu apprennes à programmer en fonctionnel. Ce qui commence mal lorsque je vois un set!. Mais peut-être fais-je erreur ? Ensuite, apprends un peu de Scheme. Il est aisé de trouver des cours de qualité sur le net (cherches un peu sur le forum). Finalement tu trouveras ton bonheur dans le lien que j'ai placé avec string-append (section sur les strings dans la bibliothèque standard), ce qui est logique n'est-ce pas ? Car tu as, avec le quote, effectivement crée une liste.

    Donc voici, un premier coup de pouce, mais la prochaine fois il faudra montrer que tu as cherché un peu plus

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Ok Garulfo message reçu ^^ !!

    Effectivement on ne peut pas dire que mes recherches ai été complètes ... mais comme l'utilisation du langage scheme ne m'était necessaire que pour un petit script-fu d'automatisation de taches sous GIMP dans le cadre d'un projet d'école ... je ne me voyais pas me lancer dans l'apprentissage total et intensif de ce langage !!

    Le fait est que pour l'instant je m'en suis pas trop mal sorti ... je butais juste sur cette espèce de concaténation de string ... j'avais repérer append pour gérer les listes mais je n'avais pas penser que la solution soit au finale si simple et comme tu dit si logique.

    Et si j'ai bien compris il faudrait également que je définisse ma variable filenameout avec let* plutot qu'avec set!.

    En tout cas merci et merci encore pour le coup de pouce c'est exactement ce qu'il me fallait pour terminer mon script !!

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Zaltymbunk Voir le message
    [...]
    Et si j'ai bien compris il faudrait également que je définisse ma variable filenameout avec let* plutot qu'avec set![...]
    L'idée est, effectivement, de transformer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define x 'non-defini)
    (define y 'non-defini)
    (set! x 1)
    (set! y "a")
    (f x y)
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (let [(x 1) (y "a")] (f x y))
    comme on le fait en math donc d'un certain côté.

    Il faut réduire l'utilisation des set! au maximum, surtout quand on débute. Après, cela dépend de beaucoup de paramètre.

    Menfinbon, bonne continuation.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Voici à la final mon fameux script :

    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
    (define (batch-binarisation)
      (let* 
         (
         (pattern (get-directory("Selectionnez un répertoire" vpanel))
         (filelist (cadr (file-glob pattern 1)))
         )
       (while (not (null? filelist))
         (let* 
            (
            (filenamein (car filelist))
            (filenameout (string-append filenamein "_bin"))
            (image (car (gimp-file-load 1 filenamein filenamein)))
            (drawable (car (gimp-image-get-active-layer image)))
            )
          (plug-in-gauss 1 image drawable 5,0 5,0 1)
          (gimp-threshold drawable 95 255)
          (gimp-invert drawable)
          (gimp-file-save 1 image drawable filenameout filenameout)
          (gimp-image-delete image)
          )
         (set! filelist (cdr filelist))
        )
      )
    )
    
    (script-fu-register "batch-binarisation" ;; nom du script
    "<Toolbox>/Exts/Script-Fu/Perso/Binarisation" ;; position du script dans le menu
    "Binarise la capture MEB" ;; commentaires
    "Boisbouvier D." ;; auteur
    "Copyright" ;; copyright
    "19/12/08" ;; date
    "" ;; types d'images supportés par le script
    SF-IMAGE "Image" 0 ;; image dans lequel le calque est ajouté
    SF-DRAWABLE "Drawable" 0 ;; calque actif de l'image
    ) ;; fin du register
    J'ai enregistré ce script dans GIMP Pack Mode/share/script (comme on a m'a dit) mais lorsque j'actualise les scripts il me sort un message d'erreur me disant que les parenthèses ne collent pas !?! J'avoue ne pas voir l'erreur...

    D'autre part ... j'ai un gros doute sur le fait que ma fonction get-directory soit acceptée en SIOD (le langage scheme de GIMP) ... connaissez vous par hasard un équivalent de cette fonction qui marcherait ?!? Le must serait une fonction qui donne directement le chemin de répertoire en UTF-8 (kezako ?) comme demandé dans le navigateur de procédures.

    Merci d'avance de vos réponses ... puisse t elle m'éclairer dans ma (re)quête ^^ !!

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Tu as simplement oublié une parenthèse à la fin du binding sur la variable pattern.
    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
    (define (batch-binarisation)
      (let* 
          ((pattern (get-directory("Selectionnez un répertoire" vpanel)))
           (filelist (cadr (file-glob pattern 1)))
           )
        (while (not (null? filelist))
               (let* 
                   (
                    (filenamein (car filelist))
                    (filenameout (string-append filenamein "_bin"))
                    (image (car (gimp-file-load 1 filenamein filenamein)))
                    (drawable (car (gimp-image-get-active-layer image)))
                    )
                 (plug-in-gauss 1 image drawable 5,0 5,0 1)
                 (gimp-threshold drawable 95 255)
                 (gimp-invert drawable)
                 (gimp-file-save 1 image drawable filenameout filenameout)
                 (gimp-image-delete image)
                 )
               (set! filelist (cdr filelist))
               )
        )
      )
    Bon sinon on voit ton manque d'habitude de la programmation fonctionnelle et même, simplement, de la récursivité. En fait ta boucle ne fait que parcourir l'ensemble des éléments de filelist. Il existe un itérateur de liste qui s'appelle for-each qui fait exactement ce que tu veux.
    applique f à tous les éléments de liste. Le retour n'est pas spécifié (donc en général c'est #void ce qui ne pose pas de problème pour toi).
    Ainsi ton code donnerait :
    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
    ;; Définition du traitement pour un fichier
    (define (treat-one-file filenamein)
      (let* ( (filenameout (string-append filenamein "_bin"))
              (image (car (gimp-file-load 1 filenamein filenamein)))
              (drawable (car (gimp-image-get-active-layer image))) )
        (plug-in-gauss 1 image drawable 5,0 5,0 1)
        (gimp-threshold drawable 95 255)
        (gimp-invert drawable)
        (gimp-file-save 1 image drawable filenameout filenameout)
        (gimp-image-delete image)))
    
    ;; Définition du batch
    (define (batch-binarisation)
      (let* ( (pattern (get-directory("Selectionnez un répertoire" vpanel)))
              (filelist (cadr (file-glob pattern 1))) )
        ;; appel du traitement sur chaque élément de la liste
        (for-each treat-one-file filelist)))
    Pour ta question sur la fonction get-directory, je ne sais pas. J'ai trouvé ça qui donne des fonctions comme getcwd qui semble faire un peu ce que tu veux (get current directory). Bonne lecture.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Ok Garulfo merci pour la correction ( je jure d'avoir pourtant tout bien compté selon moi il en manquait pô ) ... et pour la restructuration !!

    Sinon j'ai eu du neuf ... finalement l'interpréteur pour GIMP n'est plus du SIOD mais du Tiny Scheme ... j'ai cherché de la documentation pour essayer à nouveau de trouver un equivalent à ma fonction "get-directory" mais jusqu'à présent zéro !!

    Quelqu'un aurait il trouvé sur le net une doc pouvant répondre à mes attentes ... ou encore mieux aurait il en tête l'équivalent en question ?!?

    Merci d'avance les gens et bonnes fêtes de fin d'année ^^ !!

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Je viens de comprendre, que ce que tu voulais c'était une fonction qui ouvrait une fenêtre qui permettait la sélection d'un répertoire... est-ce ça ?

    C'est beaucoup plus difficile ça, car je pense que c'est relié à GIMP. Encore un exemple que Open-source ne rime pas avec bonne documentation -_-

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Je viens de rentrer de vacances et donc de me pencher sur le code corrigé plus haut (celui avec for-each) ... et en fait il y a un truc que je ne saisit pas trop ... dans ma version je définis la variable filenamein alors que dans la version remaniée la définition n'apparait plus ... est elle implicite ?!?

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Zaltymbunk Voir le message
    Je viens de rentrer de vacances et donc de me pencher sur le code corrigé plus haut (celui avec for-each) ... et en fait il y a un truc que je ne saisit pas trop ... dans ma version je définis la variable filenamein alors que dans la version remaniée la définition n'apparait plus ... est elle implicite ?!?
    En fait cette variable apparait dans la fonction qui traite un seul fichier. Ensuite tu appelles for-each qui va appliquer cette fonction à la liste de tous les noms de fichiers. En français, batch-binarisation se lirait:
    1. En posant que pattern est le répertoire sélectionné dans le vpanel
    2. et que la liste des noms de fichiers est le deuxième élément obtenu par (file-glob pattern 1) (je ne sais pas ce que ça fait)
    3. Pour chaque nom de fichier de la liste des noms de fichiers, appliquer le traitement pour un fichier.

    Est-ce que ça va ? Toi tu manipulais à la main la liste des noms de fichiers en mettant le premier nom dans une variable puis en coupant la tête. Ça t'obligeait à faire attention à plusieurs trucs. Un itérateur comme for-each te permet de ne pas t'en préoccuper.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Yes ok çà va pour moi ... merci encore de tous ces éclaircissements ... çà m'a bien aidé !!

    Tchou !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/05/2010, 14h11
  2. Problème bizarre avec une variable de type string
    Par beegees dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/06/2009, 11h34
  3. Le type chaîne de caractères
    Par WhiteTigerZ dans le forum Langage
    Réponses: 6
    Dernier message: 27/09/2006, 16h41
  4. Réponses: 5
    Dernier message: 24/05/2006, 08h59
  5. Réponses: 2
    Dernier message: 18/10/2003, 14h42

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