### 3.6. Расширение сценария Tex Box

#### 3.6.1. Правильное использование функции «Отменить»

При создании сценария вы хотите дать пользователям возможность отменить свой действия, если они совершили ошибку. Это легко сделать, вызвав функции `gimp-image-undo-group-start` и `gimp-image-undo-group-end` вокруг кода, который управляет изображением. Их можно считать сопоставленными операторами, которые сообщают GIMP, когда начинать и прекращать запись манипуляций с изображением, чтобы эти манипуляции можно было позже отменить.

Если вы создаёте новое изображение, для отмены ничего нет. Если же изменяется существующее изображение, имеет смысл воспользоваться этими функциями.

Отмена сценария работает замечательно, когда используются эти функции.

#### 3.6.2. Дальнейшее расширение сценария

Давайте добавим к сценарию следующие две детали:

- Сейчас изображение становится по размеру равным размеру слоя текста — нет места для, например, тени или других спецэффектов (хотя некоторые сценарии при необходимости автоматически изменят размер изображения). Давайте добавим пустую область вокруг текста размером в каком-то процентном соотношении от размера текста.

- Такой сценарий может быть использован другими сценариями, работающими с текстом. Давайте его расширим и вернём изображение и слои, чтобы другие сценарии смогли бы вызвать наш сценарий и использовать созданные изображение и слои дальше.

#### 3.6.3. Изменение параметров и функции регистрации

Чтобы пользователь мог ввести размер пустой области, мы добавим параметр к нашей функции и к функции регистрации:

      (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
      (let*
            (
               ; декларация локальных переменных
               ; создать новое изображение:
               (theImageWidth  10)
               (theImageHeight 10)
               (theImage (car
                              (gimp-image-new
                               theImageWidth
                               theImageHeight
                               RGB
                              )
                         )
               )
               (theText)          ;переменная для текста,
                                  ;которой мы присвоим значение позже

               (theBuffer)        ;добавлен

               (theLayer
                         (car
                             (gimp-layer-new
                              theImage
                               "слой 1"
                              theImageWidth
                              theImageHeight
                              RGB-IMAGE
                              100
                              LAYER-MODE-NORMAL
                             )
                         )
               )
            ) ;конец локальных переменных

       [код сюда]
     )

      (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. Добавление нового кода

Мы добавим код в двух местах: сразу перед изменением размера изображения и к конце сценария (чтобы вернуть новые изображение, слой и текст).

После того, как мы получили высоту и ширину текста, мы должны изменить эти размеры в соответствии с размером пустой области, указанным пользователем. Мы не будем проверять ошибки, например, ограничивать введённое значение в диапазоне от 0 до 100%, потому что это не сильно важно и потому, что пользователю может захочется ввести «200» процентов буфера.

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

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

Мы добавляем размер пустой области к размеру текста дважды, потому что буфер нужно добавить по обе стороны текста.

После изменения размера изображения, чтобы дать место рамке нужно отцентровать текст внутри изображения. Это делается его передвижением в координаты (x, y) относительно (`theBuffer`, `theBuffer`). Эта строка добавлена после изменения размера изображения и слоя:

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

Сохраните сценарий и испытайте его после перезапуска GIMP.

Всё, что осталось сделать, это вернуть изображение, слой и слой текста. После показа изображения мы добавляем следующую строку:

    (list theImage theLayer theText)

Это последняя строка функции, что делает этот список результатом функции, доступным другим сценариям.

Чтобы использовать наш сценарий в другом сценарии, мы можем написать, например, следующее:

            (set! theResult (script-fu-text-box
                             "Некоторый текст"
                             "Charter" "30"
                             '(0 0 0)
                             "35"
                            )
            )
            (gimp-image-flatten (car theResult))

Вот и конец урока, примите наши поздравления, вы на пути стать мастером Script-Fu!

3.5. Добавление дополнительных функций |  | 3.7. Ваш сценарий и его работа

Report a bug in GIMP Сообщите об ошибке в нашем баг-трекере