【问题标题】:Scriptfu not executing in the correct order, Why?Scriptfu 没有按正确的顺序执行,为什么?
【发布时间】:2011-04-25 11:44:36
【问题描述】:

我正在尝试为 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))

【问题讨论】:

  • 这可能是一个愚蠢的“它是否已插入”评论,但是:一般的函数式语言和特别是方案并不一定保证执行顺序。
  • 我想知道的是,let* 在那里做什么,当它绑定的layer 变量根本没有被使用时。
  • @drysdam:方案插件 GIMP 的情况并非如此 - 它按顺序执行其工作(否则它作为图像脚本语言将毫无用处)

标签: lisp scheme gimp script-fu


【解决方案1】:

如果您尝试通过在下面的图层上在其后面进行填充来制作过滤器,通过在当前图层上的对象周围制作 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 不对活动图层进行绘制或填充或做任何事情……而是在活动可绘制对象上工作。如果您想要在下面的图层上填充顶层,那么这意味着您正在为顶层传递可绘制对象,所以它将在顶层填充......切换活动layer 到下面的 layer 不会改变传入的 drawable 的值。所以在这个修改中,我在let* 部分创建了一个新的active-drawable 变量,它被初始化为当前活动的可绘制对象您将活动层从顶层更改为下面的层。这样,您将填充下面图层的可绘制对象,而不是顶层的原始传入可绘制对象。实际上,您根本不需要传入 drawable 参数,因为您可以从活动层获取新的可绘制对象(这就是本次修改所做的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多