Scriptfu не выполняется в правильном порядке, почему? - PullRequest
1 голос
/ 25 апреля 2011

Я пытаюсь написать базовый скрипт для GIMP, но, похоже, он не хочет работать правильно.После выбора я должен следовать этому порядку: опустить активный слой, расширить выделение на 2 пикселя, залить цветом переднего плана, поднять активный слой.Конечный продукт должен быть сплошным цветом под моими линиями на верхнем слое.Но с кодом, который я написал, он переходит на активные слои, но заливает верхний слой, а не тот, что ниже.Вот код, который у меня есть:

(define (quick-fill image drawable)
  (gimp-undo-push-group-start image)
  (let* ((layer (car (gimp-image-get-active-layer image))))
    (gimp-selection-grow image 2)
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 1))
    (gimp-bucket-fill drawable FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 0)))
  (gimp-undo-push-group-end image)
  (gimp-displays-flush))

1 Ответ

2 голосов
/ 26 апреля 2011

Если вы пытаетесь создать фильтр, который создает 2-пиксельную рамку вокруг объекта в текущем слое, сделав заливку позади него в слое ниже (по крайней мере, это то, что вы пытаетесь сделать)), попробуйте это:

(define (quick-fill image)
  (gimp-undo-push-group-start image)
  (gimp-selection-grow image 2)
  (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 1))
  (let* ((active-drawable (car (gimp-image-get-active-drawable image))))
    (gimp-bucket-fill active-drawable FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 0)))
  (gimp-undo-push-group-end image)
  (gimp-displays-flush))

Пара замечаний:

1) Вы никогда не используете переменную layer в своем разделе let*, поэтому я удалил ее.

2) Gimp не рисует, не заливает и ничего не делает с активным слоем ... скорее он работает с активным рисунком.Если вы получаете заливку на верхнем слое, когда вы хотите его на нижнем слое, то это означает, что вы передаете рисование для верхнего слоя, поэтому оно будет заполняться на верхнем слое ... переключение активногослой к слою ниже не изменяет значение переданного объекта рисования.Итак, в этой модификации я создал новую переменную active-drawable в секции let*, которая инициализируется для текущей активной прорисовки после того, как вы изменили активный слой с верхнего слоя наслой под.Таким образом, вы заполняете рисованный слой, который находится ниже, а не исходный переданный рисунок, который является верхним слоем.На самом деле вам вообще не нужно передавать аргумент drawable, поскольку вы можете получить новый drawable из активного слоя (что и сделано в этой модификации).

...