3.4. Su primer código de Script-Fu
| 3. Un tutorial de Script-Fu |

### 3.4. Su primer código de Script-Fu

¿No necesita parar y tomar algo? ¿No? Bien, entonces procederemos con la cuarta lección, su primer código de Script-Fu.

#### 3.4.1. Crear un script: una caja de texto

Una de las operaciones más comunes que realiza el autor en GIMP es crear una caja con algún texto en ella para una página web, un logotipo o algo así. Nunca se sabe el tamaño adecuado de una imagen cuando se empieza. No sabe cuánto espacio llenará el texto con la tipografía ni el tamaño de tipografía que quiere.

Los maestros de Script-Fu (y los estudiantes) reconocen rápidamente que este problema puede resolverse fácilmente y automatizado con Script-Fu.

Crearemos un script, llamado «Text Box», que creará una imagen, con el tamaño correctamente ajustado a una línea de texto, que el usuario introduce. También, dejaremos al usuario elegir la fuente, el tamaño de la fuente y el color del texto.

#### 3.4.2. Editar y guardar su código

Hasta ahora, hemos trabajado en la consola de Script-Fu. Ahora, sin embargo, vamos a cambiar para editar códigos de archivos de texto.

Dónde situar sus códigos es cuestión de preferencias, si tiene acceso a la carpeta de scripts predefinida de GIMP, puede situarlos allí. Sin embargo, es preferible dejar los códigos personales en la carpeta personal de scripts, para mantenerlos separados de los instalados de fabrica.

En la carpeta `.gimp-2.8`, que GIMP crea en su carpeta personal, debería encontrar una carpeta llamada `scripts`. GIMP, buscará automáticamente en su carpeta `.gimp-2.8` la carpeta `scripts`, y añadirá los scripts de esta carpeta a la base de datos de Script-Fu. Debería situar sus scripts personales aquí.

#### 3.4.3. Lo esencial al descubierto

Cada guión Script-Fu define al menos una función, que es la función principal del script. Es donde hace el trabajo.

Cada script debe registrarse también en la base de datos de procedimientos, para poder acceder a el bajo GIMP.

Se define la función principal, primero:

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

Aquí se ha definido una nueva función llamada `script-fu-text-box` que toma cuatro parámetros que más tarde corresponderán al texto, a una tipografía, al tamaño de la tipografía y al color del texto. La función generalmente está vacía y no hace nada. Hasta ahora, todo va bien; nada nuevo, nada lujoso.

#### 3.4.4. Convenciones de nombres

Las convenciones de nombres en Scheme parecen preferir minúsculas con guiones y se han seguido en el nombre de la función. Sin embargo, se parte de la convención con los parámetros. Se quieren nombres más descriptivos para los parámetros y variables, y se añade el prefijo «in» a los parámetros, así se puede ver rápidamente qué valores entran en el script, en lugar de que los que se crean en él. Se usa el prefijo «the» para las variables definidas en el script.

Es la convención de GIMP para nombrar sus funciones de script `script-fu-abc`, porque así están listadas en la base de datos de procedimientos, todas ellas se mostrarán bajo Script-Fu cuando se estén listando las funciones. Esto también ayuda a distinguirlas de los complementos.

#### 3.4.5. Registrar la función

Ahora se registra la función con GIMP. Esto se hace llamando a la función `script-fu-register`. Cuando GIMP lee en un script, ejecutará esta función, que registrará el script en la base de datos de procedimientos. Puede situar esta llamada a la función donde quiera en su script, pero normalmente se sitúa al final, después de las otras líneas de código.

Aquí está el listado de registro de esta función (se explicarán todos estos parámetros enseguida):

      (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")

Si guarda estas funciones en un archivo de texto con el sufijo `.scm` en su carpeta de scripts, seleccione Filtros → Script-Fu → Actualizar scripts, este script nuevo aparecerá como Archivo → Crear → Texto → Text Box.

Si llama a este nuevo script, no hará nada, desde luego, pero puede ver los apuntes creados cuando se registra el script (más información de lo que hicimos, se descubrirá luego).

Finalmente, si abre el visor de procedimientos Ayuda → Visor de procedimientos), verá que nuestro script aparece en la base de datos.

#### 3.4.6. Pasos para registrar el script

Para registrar el script en GIMP, se llamará a la función `script-fu-register`, se rellenarán los siete parámetros requeridos y se añadirán los parámetros propios, junto con una descripción y los valores predefinidos para cada parámetro.

Los parámetros requeridos

- El nombre de la función que se define. Esto es la llamada de la función cuando nuestro script se invoca (el punto de entrada del script). Es necesario porque se pueden definir funciones adicionales bajo el mismo archivo, y GIMP necesita saber a cuáles de estas funciones se llama. En este ejemplo, solo se define una función, «text box», que se ha registrado.

- La ubicación en el menú donde el script será insertado. La ubicación exacta del script está especificada como una ruta en Unix, con la raíz de la ruta del menú de la imagen como `<Image>`.[6]

  Si su script no opera sobre una imagen existente (y crea una imagen nueva, como hará «Text Box»), querrá insertarlo en el menú de la ventana de la imagen, al que puede acceder a través de la barra del menú de la imagen, pulsando con el derecho en la ventana de la imagen, pulsando sobre el icono botón del menú en la esquina superior izquierda de la ventana de la imagen, o presionando F10.

  Si su script está intentando trabajar sobre una imagen que se está editando, querrá insertarlo en el menú de la ventana de la imagen. El resto de la ruta apunta a la lista de menú, menús y submenús. Registre su script «Text Box» en el menú Texto del menú Crear del menú Archivo. [7] (Archivo → Crear → Texto → Text Box).

  Si se fija, el submenú «Texto», en el menú Archivo/Crear, no estaba allí al empezar, GIMP crea automáticamente cualquier menú que todavía no exista.

- Una descripción de su script, para ser mostrada en el visor de procedimientos.

- Su nombre (el autor del script).

- Información de los derechos de autor.

- La fecha en que se hizo el script, o la última revisión del mismo.

- El tipo de imágenes con las trabaja el script. Puede ser uno de los siguientes: RGB, RGBA, GRAY, GRAYA, INDEXED, INDEXEDA. O podría no ser ninguno de ellos, en este caso, se está creando una imagen, y no se necesita definir el tipo de imagen sobre la que se trabaja.

Figura 13.4. El menú del script.

#### 3.4.7. Registrar los parámetros del script

Una vez que se han listado los parámetros requeridos, se necesitan listar los parámetros que corresponden a los parámetros que su script necesita. Al listar estos parámetros, se dan indicaciones del tipo que son. Esto es por el diálogo que aparece cuando el usuario selecciona el script. También se pueden proporcionar valores predefinidos.

Esta sección del proceso de registro tiene el siguiente formato:

Tipo de parámetro | Descripción | Ejemplo
--- | --- | ---
`SF-IMAGE` | Si su script opera en una imagen nueva, esta debería ser el primer parámetro después de los parámetros requeridos. GIMP pasará una referencia a la imagen en este parámetro. | 3
`SF-DRAWABLE` | Si su script opera sobre una imagen abierta, este sería el segundo parámetro después de el parámetro `SF-IMAGE`. Se refiere a la capa activa. GIMP pasará una referencia a la capa activa en este parámetro. | 17
`SF-VALUE` | Acepta números y cadenas. Tenga en cuenta que las cuotas deben eludir el texto predefinido, por lo que es mejor usar `SF-STRING`. | 42
`SF-STRING` | Acepta cadenas. | «Un texto»
`SF-COLOR` | Indica que color se requiere en este parámetro. | '(0 102 255)
`SF-TOGGLE` | Se muestra una caja, para obtener un valor Booleano. | TRUE o FALSE

#### 3.4.8. Los parámetros API de Script-Fu[8]

| Nota
Junto a los tipos de parámetros anteriores hay más tipos para el modo interactivo, cada uno de ellos crea un widget en el control del diálogo. Encontrará una lista de estos parámetros con descripciones y ejemplos en el script de prueba `plug-ins/script-fu/scripts/test-sphere.scm` suministrado con el código fuente de GIMP.

Tipo de parámetro | Descripción
--- | ---

`SF-ADJUSTMENT`

Crea un widget de ajuste en el diálogo.

SF-ADJUSTMENT "etiqueta" '(valuer inferior superior incremento_del_paso incremento_tecla_página dígitos tipo)

Lista de argumentos del widget

Elemento | Descripción
--- | ---
"etiqueta" | Texto impreso antes del widget.
valor | Valor impreso al principio.
inferior / superior | Los valores inferior / superior (rango de elección)
incremento_del_paso | Incrementar/reducir el valor
incremento_tecla_página | Incrementar/reducir el valor usando la tecla página.
dígitos | Dígitos después del punto (parte decimal).
«type» | Uno de: SF-SLIDER o 0, SF-SPINNER o 1

`SF-COLOR`

Crea un botón de color en el diálogo.

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

o

SF-COLOR "etiqueta" "color"

Lista de argumentos del widget

Elemento | Descripción
--- | ---
"etiqueta" | Texto impreso antes del widget.
'(red green blue) | Lista de los tres valores para los componentes rojo, verde y azul.
"color" | Nombre de color en notación CSS.

`SF-FONT`

Crea un widget para la selección de la tipografía en el diálogo. Devuelve un nombre de tipografía en una cadena. Hay dos procedimientos nuevos de «gimp-text» para facilitar el uso de este parámetro de retorno:

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

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

en donde «font» es el nombre de la tipografía que obtiene. El tamaño especificado en nombre de la tipografía se ignora silenciosamente. Sólo se usa en el selector de la tipografía. Se le pregunta para que lo ajuste a un valor útil (24 píxeles es una buena elección).

SF-FONT "etiqueta" "nombre de la tipografía"

Lista de argumentos del widget

Elemento | Descripción
--- | ---
"etiqueta" | Texto impreso antes del widget.
"nombre de la tipografía" | Nombre de la tipografía predeterminada.

`SF-BRUSH`

Creará un widget en el diálogo de control. El widget consiste en un área de vista previa (que cuando se presiona produce una vista previa emergente) y un botón con la etiqueta «...». El botón abre un diálogo donde se pueden seleccionar los pinceles y modificar cada una de las características del pincel.

SF-BRUSH "Brush" '("Círculo (03)" 100 44 0)

Aquí el diálogo de pincel se abrirá con el pincel predeterminado «Círculo (03)», opacidad 100, espaciado 44 y el modo de pintura en normal (valor 0).

Si se cambió esta selección el valor pasado a la función como parámetro será '("Círculo (03)" 100 44 0).

`SF-PATTERN`

Creará un widget en el diálogo de control. El widget consiste en un área de vista previa (que cuando se presiona produce una vista previa emergente) y un botón con la etiqueta «...». El botón abre un diálogo donde se pueden seleccionar los patrones.

SF-PATTERN "Pattern" "Hojas de arce"

El valor devuelto cuando se llama al script es una cadena que contiene el nombre del patrón. Si la selección anterior no se ha cambiado la cadena contendrá «Hojas de arce».

`SF-GRADIENT`

Creará un widget en el diálogo de control. El widget consiste en un botón que contiene una vista previa del degradado seleccionado.

Si se presiona el botón se abre un diálogo de selección de degradado.

SF-GRADIENT "Gradient" "Azul profundo"

El valor devuelto cuando se llama al script es una cadena que contiene el nombre del patrón. Si la selección anterior no se ha cambiado la cadena contendrá «Azul profundo».

`SF-PALETTE`

Creará un widget en el diálogo de control. El widget consiste en un botón que contiene el nombre de la paleta seleccionada.

Si se presiona el botón se abre un diálogo de selección de paleta.

SF-PALETTE "Palette" "Colores con nombre"

El valor devuelto cuando se llama al script es una cadena que contiene el nombre del patrón. Si la selección anterior no se ha cambiado la cadena contendrá «Colores con nombre».

`SF-FILENAME` | Creará un widget en el diálogo de control. El widget consiste en un botón que contiene el nombre de un archivo. Si se presiona el botón se abre un diálogo de selección de archivo. SF-FILENAME "etiqueta" (string-append "" gimp-data-directory "/scripts/beavis.jpg") El valor devuelto cuando se llama al script es una cadena que contiene el nombre del archivo.
`SF-DIRNAME` | Sólo es útil en modo interactivo. Muy parecido a SF-FILENAME, pero el widget creado permite elegir una carpeta en lugar de un archivo. SF-DIRNAME "etiqueta" "/var/tmp/images" El valor devuelto cuando se llama al script es una cadena que contiene el nombre de la carpeta.
`SF-OPTION` | Creará un widget en el diálogo de control. El widget es una caja combinada que muestra las opciones pasadas como una lista. La primera opción es la predeterminada. SF-OPTION "etiqueta" '("opción1" "opción2") El valor devuelto cuando se llama al script es el número de la opción elegida, en donde la primera opción se cuenta como 0.

`SF-ENUM`

Creará un widget en el diálogo de control. El widget es una caja combinada que muestra todos los valores enumerados para el tipo de enumeración dado . Tiene que ser el nombre de un enumerado registrado, sin el prefijo «Gimp». El segundo parámetro especifica el valor predeterminado, usando el nombre corto del valor de enumeración.

SF-ENUM "Interpolación" '("InterpolationType" "lineal")

El valor devuelto cuando se llama al script corresponde al valor enumerado elegido.

[6] Antes de la versión 2.6, también se podía usar `<Toolbox>`, pero ahora el menú de la caja de herramientas se ha quitado, así que no lo use.

[7] El original, escrito por Mike, dice que pone la entrada de menú en el menú Script-Fu del menú Xtns en la caja de herramientas, pero desde la versión 2.6, el menú de la caja de herramientas se ha quitado y mezclado en la barra de menú de la ventana de la imagen.

[8] Esta sección no es parte del tutorial original.

3.3. Listas, listas y más listas |  | 3.5. Dar algo de sustancia a nuestro script

Informe de un error en Bugzilla