3.4. Votre premier script de Script-Fu
| 3. Didacticiel pour Script-Fu |

### 3.4. Votre premier script de Script-Fu

Vous tirez la langue, non ? Allez, entamons notre quatrième leçon : votre premier script de Script-Fu !

#### 3.4.1. Création d'un Script Boîte de Texte

L'une des opérations les plus fréquentes que je réalise avec GIMP, est la création d'une boîte contenant un texte pour une page Web ou un logo. Mais vous ne savez jamais bien quelle taille donner à l'image au départ. Vous ne savez pas combien d'espace le texte occupera avec la taille de police que vous voulez.

Le Maître en Script-Fu (et l'étudiant), se rend compte rapidement que ce problème peut être aisément résolu et automatisé avec un Script-Fu.

Nous allons donc créer un script, appelé Text Box, qui crée une image dont la taille est parfaitement adaptée au texte que saisit l'utilisateur. Nous permettrons aussi à l'utilisateur de choisir la police de caractères, sa taille, et la couleur du texte.

#### 3.4.2. Modifier et enregistrer vos Scripts

Jusqu'à présent, nous avons travaillé avec la Console de Script-Fu. Nous allons maintenant réaliser l'édition de fichiers textes de script (en utilisant un éditeur tel que Kate par exemple).

Là où vous stockez vos scripts est affaire de préférence. Si vous avez accès au répertoire de scripts par défaut de GIMP, vous pouvez y placer vos scripts. Néanmoins, je préfère avoir mes scripts dans mon propre répertoire de scripts, bien séparés des scripts installés au départ.

Dans le répertoire `.gimp-2.8` que GIMP a créé dans votre répertoire personnel, vous devriez trouver un répertoire nommé `scripts`. GIMP recherchera systématiquement un répertoire pour les scripts dans votre répertoire `.gimp-2.8`, et ajoutera les scripts de ce répertoire dans la base des Script-Fu. C'est donc là que vous devriez placer vos scripts personnels.

#### 3.4.3. Le strict nécessaire

Tout script de Script-Fu définit au moins une fonction, qui est la fonction principale du script. C'est là que vous travaillerez.

Tout script doit également être connu de la base de données de procédures (PDB), de façon à ce que GIMP puisse y accéder.

Nous allons définir la fonction principale en premier :

            (define (script-fu-text-box inText inFont inFontSize inTextColor))

Nous définissons ici une fonction appelée `script-fu-text-box` avec quatre paramètres qui correspondront plus tard à un texte, une police, la taille de la police et la couleur du texte. La fonction est actuellement vide et ne fait rien. Jusqu'ici ça va – rien de neuf, rien de spécial.

#### 3.4.4. Conventions de dénomination

Les conventions de dénomination de Scheme préfèrent les lettres minuscules avec traits d'union, ce que j'ai respecté dans la dénomination de la fonction. Toutefois, je me suis écarté de la convention en ce qui concerne les paramètres. Je préfère en effet les noms descriptifs pour mes paramètres et variables, c'est pourquoi j'ai ajouté le préfixe « in » aux paramètres, de façon à voir d'emblée qu'il s'agit de paramètres reçus par la fonction et non pas de paramètres émis par elle. Et j'utilise le prefixe « the » pour les variables définies au sein du script.

C'est une convention GIMP de nommer vos fonctions de script script-fu-xxx, parce qu'ainsi elle apparaîtront avec les script-fu quand elles seront listées dans la base de procédures. Cela permet aussi de les distinguer des greffons.

#### 3.4.5. Enregistrement de la fonction

Maintenant, faisons connaître la fonction à GIMP. On réalise cela en appelant la fonction `script-fu-register`. Quand GIMP lira le script, il exécutera cette fonction qui enregistrera le script dans la base de procédures. Vous pouvez placer cette fonction où vous voulez dans votre script, mais personnellement je la mets à la fin, après tout le reste de mon code.

Voici le listing pour enregistrer cette fonction (j'expliquerai ses paramètres dans un instant) :

      (script-fu-register
        "script-fu-text-box"                        ;func name
        "Text Box"                                  ;menu label
        "Creates a simple text box, sized to fit\
          around the user's choice of text,\
          font, font size, and color."              ;description
        "Michael Terry"                             ;author
        "copyright 1997, Michael Terry;\
          2009, the GIMP Documentation Team"        ;copyright notice
        "October 27, 1997"                          ;date created
        ""                     ;image type that the script works on
        SF-STRING      "Text"          "Text Box"   ;a string variable
        SF-FONT        "Font"          "Charter"    ;a font variable
        SF-ADJUSTMENT  "Font size"     '(50 1 1000 1 10 0 1)
                                                    ;a spin-button
        SF-COLOR       "Color"         '(0 0 0)     ;color variable
      )
      (script-fu-menu-register "script-fu-text-box" "<Image>/File/Create/Text")

Enregistrez ces fonctions dans un fichier texte avec le suffixe `.scm` dans votre répertoire de scripts, et choisissez Filtres → Script-Fu → Actualiser les Scripts, et ce nouveau script apparaîtra comme Fichier → Créer → Texte → Text Box.

Si vous lancez ce nouveau script, il ne fera rien bien sûr, mais vous pourrez voir les invites que vous avez créées quand vous avez enregistré le script (ça sera plus clair plus loin).

Finalement, si vous invoquez le Navigateur de Procédures ( Aide → Navigateur de Procédures), vous verrez que votre script figure maintenant dans la base de procédures.

#### 3.4.6. Étapes pour enregistrer le script

Pour enregistrer notre script dans GIMP, nous appelons la fonction `script-fu-register`, remplissons les sept paramètres requis et nous ajoutons nos propres paramètres de script, ainsi qu'une description et une valeur par défaut pour chaque paramètre.

Les paramètres requis

- Le nom de la fonction que nous avons définie. C'est la fonction appelée quand notre script est invoqué, le point d'entrée dans notre script. C'est important parce qu'il est possible de définir plusieurs autres fonctions dans le même fichier, et GIMP doit savoir quelle fonction appeler. Dans notre exemple, nous n'avons défini qu'une seule fonction, text-box, que nous avons enregistrée.

- L'emplacement dans le menu où le script est inséré est spécifié comme un chemin dans Unix, avec la racine du chemin qui est `<Image>`.

  Si votre script n'opère pas sur une image existante (et donc crée une nouvelle image, comme le fera notre script Text Box, vous voudrez l'insérer dans le menu d'image (barre de menus, clic droit sur la fenêtre d'image, touche F10).

  Si votre script est destiné à opérer sur une image présente à l'écran, vous voudrez l'insérer dans le menu d'image. Le reste du chemin pointe sur les listes de menus, les menus et les sous-menus. Ainsi, nous avons enregistré notre script dans Fichier → Créer → Text → Text Box ).

  Si vous avez remarqué, le sous-menu Text dans le menu Fichier/Créer n'existait pas au départ : GIMP crée automatiquement les menus qui n'existent pas.

- Une description de votre script, qui sera affichée dans le Navigateur de Procédures.

- Votre nom (l'auteur du script)

- Information de Copyright.

- La date à laquelle le script a été créé, ou la date de dernière révision.

- Les types d'image sur lesquels travaille le script. Il peut s'agir de RGB, RGBA, GRAY, GRAYA, INDEXED, INDEXEDA. Ou aucun d'eux: dans notre cas, nous créons une image et nous n'avons pas besoin d'en définir le type.

Figure 13.4. Le menu correspondant à notre script.

#### 3.4.7. Enregistrement des paramètres du script

Maintenant que nous avons vu la liste des paramètres requis, nous devons préciser ceux qui correspondent aux besoins de notre script. Nous devons fournir des précisions concernant leur type, pour la fenêtre de dialogue qui apparaît quand l'utilisateur choisit notre script. Nous devons aussi fournir une valeur par défaut.

Cette section du processus d'enregistrement a le format suivant :

Type de paramètre | Description | Exemple
--- | --- | ---
`SF-IMAGE` | Si votre script opère sur une image ouverte, ceci doit être le premier paramètre après les paramètres requis. GIMP transmettra une référence à l'image dans ce paramètre. | 3
`SF-DRAWABLE` | Si votre script opère sur une image ouverte, ceci doit être le second paramètre, après le paramètre `SF-IMAGE`. Il se réfère au calque actif. GIMP transmettra une référence au calque actif dans ce paramètre. | 17
`SF-VALUE` | Accepte les nombres et les chaînes de caractères. Pour un texte, les guillemets doivent être précédés du caractère d'échappement \ , donc il vaut mieux dans ce cas utiliser `SF-STRING`. | 42
`SF-STRING` | Accepte les chaînes de caractères. | "Un texte"
`SF-COLOR` | Indique qu'une couleur est nécessaire pour ce paramètre. | '(0 102 255)
`SF-TOGGLE` | Une boîte de saisie est affichée, pour entrer une valeur Booléenne. | TRUE ou FALSE (Vrai ou Faux)

#### 3.4.8. Les paramètres de l'API Script-Fu

| Note
En plus des paramètres de types ci-dessus, il en existe d'autres pour le mode interactif, chacun d'eux créant une zone de dialogue dans la fenêtre de dialogue du script-fu. Vous trouverez la description de ces paramètres et des exemples dans le script de test `plug-ins/script-fu/scripts/test-sphere.scm` fourni avec le code source de GIMP.

Type de paramètre | Description
--- | ---

`SF-ADJUSTMENT`

En mode interactif il crée une zone de dialogue dans la fenêtre de dialogue du script-fu.

SF-ADJUSTMENT "label" '(value lower upper step_inc page_inc digits type)

Liste d'arguments de boutons

Élément | Description
--- | ---
"label" | Texte affiché devant la zone de dialogue.
valeur | value : Valeur affichée par défaut au départ.
lower / upper | Valeurs mini / maxi (détermine la plage de choix).
step_inc | Valeur pour incrémenter/décrémenter.
page_inc | Valeur pour incrémenter/décrémenter utilisant les touches Page
chiffres | Chiffres après le point (partie décimale)
type | Un parmi: SF-SLIDER or 0 (glissière), SF-SPINNER or 1 (bouton à flèche)

`SF-COLOR`

Crée un bouton de choix de couleur.

SF-COLOR "label" '(red green blue)

ou

SF-COLOR "label" "color"

Liste d'arguments de boutons

Élément | Description
--- | ---
"label" | Texte affiché devant la zone de dialogue.
'(red green blue) | Liste de trois valeurs pour les composantes rouge, vert et bleu de la couleur par défaut.
"color" | Un nom de couleur en notation CSS pour la couleur par défaut.

`SF-FONT`

Crée une zone de sélection de fonte. Retourne le nom de la fonte sous la forme d'une chaîne de caractères. Il existe deux nouvelles procédures de type gimp-text pour utiliser facilement ce paramètre que retourne la fonction:

(gimp-text-fontname image drawable x-pos y-pos text border antialias size unit font)

(gimp-text-get-extents-fontname text size unit font)

dans lesquelles le paramètre "font" est le nom de la fonte que vous obtenez. La taille spécifiée dans fontname est ignorée. Elle est utilisée seulement dans le sélecteur de fonte. On vous demandera de donner une valeur utilisable (24 pixels est un choix correct).

SF-FONT "label" "fontname"

Liste d'arguments de boutons

Élément | Description
--- | ---
"label" | Texte affiché devant la zone de dialogue.
"fontname" | Nom de la fonte par défaut.

`SF-BRUSH`

Crée une zone de choix de brosse : prévisualisation de la brosse et à sa droite, bouton "Parcourir". Cliquer sur ce dernier fait apparaître la boite de dialogue des brosses avec possibilité de choisir une brosse ainsi que son espacement, son opacité et son mode.

SF-BRUSH "Brush" '("Circle (03)" 100 44 0)

Dans ce cas la brosse par défaut sera un Cercle (03) avec une opacité de 100, un espacement de 44 et en mode normal (0).

Si cette sélection reste inchangée la valeur passée à la fonction comme paramètre sera '("Circle (03)" 100 44 0).

`SF-PATTERN`

Crée une zone de choix de motif : prévisualisation du motif et à sa droite, bouton "Parcourir". Cliquer sur ce dernier fait apparaître la boite de dialogue des motifs.

SF-PATTERN "Pattern" "Maple Leaves"

La valeur retournée quand le script est appelé est une chaîne de caractères contenant le nom du motif. Si la sélection par défaut ci-dessus n'est pas modifiée, la chaîne contiendra "Maple Leaves".

`SF-GRADIENT` | Crée un bouton contenant une prévisualisation du dégradé. Si on appuie sur le bouton, une fenêtre de sélection de palette apparaît. SF-GRADIENT "Gradient" "Deep Sea" La valeur retournée quand le script est appelé est une chaîne de caractères contenant le nom du dégradé. Si la sélection par défaut ci-dessus n'est pas modifiée, la chaîne contiendra "Deep Sea".
`SF-PALETTE` | Crée un bouton contenant le nom de la palette sélectionnée. Si on appuie sur le bouton, une fenêtre de sélection de palette apparaît. SF-PALETTE "Palette" "Named Colors" La valeur retournée quand le script est appelé est une chaîne de caractères contenant le nom de la palette. Si la sélection par défaut ci-dessus n'est pas modifiée, la chaîne contiendra "Named Colors".
`SF-FILENAME` | Crée un bouton contenant le nom d'un fichier. Cliquer sur celui-ci fait apparaître la boite de dialogue de sélection de fichiers. SF-FILENAME "label" (string-append "" gimp-data-directory "/scripts/beavis.jpg") La valeur retournée quand le script est appelé est une chaîne de caractères contenant le nom du fichier.
`SF-DIRNAME` | Similaire à SF-FILENAME, mais permet de choisir un dossier. SF-DIRNAME "label" "/var/tmp/images" La valeur retournée quand le script est appelé est une chaîne de caractères contenant le nom du dossier.
`SF-OPTION` | Crée une boîte de choix (combo-box) pour des options possibles. La première option est l'option par défaut. SF-OPTION "label" '("option1" "option2") La valeur retournée quand le script est appelé est le numéro de l'option choisie (0 correspondant à la 1ère option...).
`SF-ENUM` | Crée une boîte de choix (combo-box) montrant toutes les valeurs possibles pour un type donné. Le premier paramètre doit être un nom d'énumération de valeurs de GIMP, sans le préfixe "Gimp". Le second spécifie la valeur par défaut. SF-ENUM "Interpolation" '("InterpolationType" "linear") La valeur retournée quand le script est appelé est la valeur choisie de l'énumération.

3.3. Listes, des listes et encore des listes |  | 3.5. Donner un peu plus de corps à votre script

Envoyez un rapport d'anomalie à Bugzilla