Lisp Scriptfu没有按照正确的顺序执行,为什么?

Lisp Scriptfu没有按照正确的顺序执行,为什么?,lisp,scheme,gimp,script-fu,Lisp,Scheme,Gimp,Script Fu,我正试图为GIMP编写一个基本脚本,但它似乎不想正常工作。在我做出选择后,它应该遵循以下顺序:降低活动层,展开选择2px,泛光填充(带前景颜色),升高活动层。最终的产品应该是一个纯色下面我的线在顶层。但在我编写的代码中,它跳过了活动层,但洪水会在顶层而不是底层填充。以下是我的代码: (define (quick-fill image drawable) (gimp-undo-push-group-start image) (let* ((layer (car (gimp-image-ge

我正试图为GIMP编写一个基本脚本,但它似乎不想正常工作。在我做出选择后,它应该遵循以下顺序:降低活动层,展开选择2px,泛光填充(带前景颜色),升高活动层。最终的产品应该是一个纯色下面我的线在顶层。但在我编写的代码中,它跳过了活动层,但洪水会在顶层而不是底层填充。以下是我的代码:

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

如果您试图制作一个过滤器,通过在当前层上的对象后面填充来在其周围生成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) 您从未在
let*
部分中使用
layer
变量,因此我将其删除


2) Gimp不绘制、填充或对活动层执行任何操作。。。相反,它适用于主动可拉丝。如果你想在最上面一层填充,而你想在最下面一层填充,那么这意味着你要在最上面一层通过可绘制的,所以它要在最上面一层填充。。。将活动层切换到下面的层不会更改传入的drawable的值。因此,在这次修改中,我在
let*
部分创建了一个新的
activedrawable
变量,在将活动层从顶层更改为底层后,该变量将初始化为当前活动的drawable。通过这种方式,您填充的是下层的可绘制文件,而不是最初传入的顶层可绘制文件。事实上,您根本不需要传入drawable参数,因为您可以从活动层获得新的drawable(这就是本次修改所做的)。

这可能是一个愚蠢的“是否插入”注释,但是:一般来说,函数式语言,特别是scheme,不一定保证执行顺序。我想知道的是,当它绑定的
变量根本没有被使用时,
let*
在那里做什么。@drysdam:插入GIMP的scheme不是这种情况-它按顺序执行它的内容(否则,作为一种图像脚本语言,它将毫无用处)