### 3.6. Utöka textruteskriptet

#### 3.6.1. Hantera ångring korrekt

När du skapar ett skript vill du ge dina användare förmågan att ångra sina åtgärder om de skulle göra ett misstag. Detta åstadkoms lätt genom att anropa funktionerna `gimp-image-undo-group-start` och `gimp-image-undo-group-end` runt koden som manipulerar bilden. Du kan tänka på dem som ett satspar som låter GIMP veta när det ska börja och sluta spela in manipulationer på bilden, så att dessa manipulationer sedan kan göras ogjorda.

Om du skapar en helt ny bild så är det inte meningsfullt att använda dessa funktioner eftersom du inte ändrar en befintlig bild. När du ändrar en befintlig bild kommer du dock säkerligen vilja använda dessa funktioner.

Att ångra ett skript fungerar nästan felfritt när dessa funktioner används.

#### 3.6.2. Utöka skriptet lite till

Vi har nu ett väldigt praktiskt skript för att skapa textrutor, så låt oss lägga till två funktioner till det:

- Bilden ändras för närvarande så att den passar precis runt texten det finns inte plats för något, som skuggkastning eller specialeffekter (även om många skript automatiskt kommer ändra storlek på bilden efter behov). Låt oss lägga till en buffert runt texten, och till och med låta användaren ange hur mycket buffert som ska läggas till som en procentsats av storleken på den resulterande texten.

- Detta skript skulle lätt kunna användas i andra skript som arbetar med text. Låt oss utöka det så att det returnerar bilden och lagren, så att andra skript kan anropa detta skript och använda bilden och lagren som vi skapar.

#### 3.6.3. Modifiera parametrarna och registreringsfunktionen

För att låta användaren ange mängden buffert lägger vi till en parameter till vår funktion och registreringsfunktionen:

      (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
      (let*
            (
               ; definiera våra lokala variabler
               ; skapa en ny bild:
               (theImageWidth  10)
               (theImageHeight 10)
               (theImage (car
                              (gimp-image-new
                               theImageWidth
                               theImageHeight
                               RGB
                              )
                         )
               )
               (theText)          ;en deklaration för texten
                                  ;vi skapar senare

               (theBuffer)        ;tillagd

               (theLayer
                         (car
                             (gimp-layer-new
                              theImage
                               "lager 1"
                              theImageWidth
                              theImageHeight
                              RGB-IMAGE
                              100
                              LAYER-MODE-NORMAL
                             )
                         )
               )
            ) ;slut på våra lokala variabler

       [Kod här]
     )

      (script-fu-register
        "script-fu-text-box"                        ;function 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
        SF-ADJUSTMENT  "Buffer amount" '(35 0 100 1 10 1 0)
                                                    ;a slider
      )
      (script-fu-menu-register "script-fu-text-box" "<Image>/Filters/Tutorial")

#### 3.6.4. Lägga till den nya koden

Vi kommer lägga till kod på två platser: just före vi ändrar storlek på bilden, och i slutet på skriptet (för att returnera den nya bilden, lagret och texten).

Efter att vi får textens höjd och bredd behöver vi ändra storleken på dessa värden baserat på buffertmängden som anges av användaren. Vi gör ingen felkontroll för att säkerställa att det är i intervallet 0-100% för att det inte är livshotande, och för att det inte finns någon anledning till att användaren inte skulle kunna ange exempelvis ”200” som buffertprocent att lägga till.

            (set! theBuffer (* theImageHeight (/ inBufferAmount 100) ) )

            (set! theImageHeight (+ theImageHeight theBuffer theBuffer) )
            (set! theImageWidth  (+ theImageWidth  theBuffer theBuffer) )

Allt som vi gör här är att ställa in bufferten baserat på textens höjd, och lägga till den två gånger till både höjden och bredden av vår nya bild. (Vi lägger till den två gånger till båda dimensionerna för att bufferten behöver läggas till på båda sidor om texten.)

Nu när vi ändrats storlek på bilden för att ge en buffert, så behöver vi centrera texten i bilden. Detta görs genom att flytta den till koordinaterna (x, y) för (`theBuffer`, `theBuffer`). Jag la till denna rad efter att ha ändrat storlek på lagret och bilden:

            (gimp-layer-set-offsets theText theBuffer theBuffer)

Ta nu och spara ditt skript, och prova det efter att du startat om GIMP.

Allt som återstår är att returnera vår bild, lagret och textlagret. Efter att ha visat bilden lägger vi till denna rad:

    (list theImage theLayer theText)

Detta är den sista raden i funktionen, vilket gör denna lista tillgänglig för andra skript som vill använda den.

För att använda vårt nya textruteskript i ett annat skript skulle vi kunna skriva något i stil med följande:

            (set! theResult (script-fu-text-box
                             "Någon text"
                             "Charter" "30"
                             '(0 0 0)
                             "35"
                            )
            )
            (gimp-image-flatten (car theResult))

Gratulerar, du är nu på väg mot ditt svarta bälte i Script-Fu!

3.5. Lägga till ytterligare funktionalitet |  | 3.7. Ditt skript och hur det fungerar

Report a bug in GIMP Rapportera ett dokumentationsfel