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

问题描述:

我正在尝试为GIMP编写一个基本脚本,但它似乎并不想正确工作。在进行我的选择后,它应该按照下面的顺序:降低活动层,扩大选择2px,填充w /前景色,提高活动层。最终产品应该是顶层图层下的纯色。但是随着我写的代码,它会跳转活动层,但是在顶层而不是下面的层填充。这里是我的代码有:Scriptfu没有按正确的顺序执行,为什么?

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

这可能是一个愚蠢的“插入其中”的评论,但是:一般的函数式语言和特别的方案并不一定保证执行顺序。 – drysdam 2011-04-25 12:20:29

+2

我想知道的是,当它绑定的'layer'变量根本没有被使用时,在那里做什么'let *'。 – 2011-04-25 12:23:36

+0

@drysdam:不是插入GIMP方案的情况 - 它按顺序做它的东西(否则它将不再作为图像脚本语言) – jsbueno 2013-03-25 10:07:48

如果你想使一个过滤器,通过使后面填写下面的层上,使围绕当前层上的对象的2个像素的边框(至少这就是它看起来你想-DO),试试这个:

(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不会绘制或填充活动图层或对活动图层做任何事情......相反它适用于活动绘图。如果你想在下面的图层上获得顶层的填充,那么这意味着你要传递顶层的drawable,所以它会填充顶层...切换active层到下面的层不会更改传入的drawable的值。因此,在此修改中,我在let*部分创建了一个新的active-drawable变量,该变量初始化为当前活动的可绘制您已将活动层从顶层更改为底层。这样你就填充了下面图层的drawable,而不是原来的顶层draw-drawable。事实上,你根本不需要传入一个可绘制的参数,因为你可以从活动层获取新的drawable(这是修改过的)。