Gimp script-fu带有非法功能错误

时间:2012-11-27 00:45:09

标签: scheme gimp script-fu

我正在制作我的第一个剧本,对我来说计划仍然不是很清楚。

我的脚本运行正常,但我想添加一个其他参数(仅可见),我有一行在某个地方导致非法功能错误,但在其他地方没有。

感谢您的帮助: - )

这是我的专栏:

(display " onlyvisible: ")(display onlyvisible)(newline)

这是我的代码:

(define (pitibalrog-test img filename onlyvisible)
(let*
    (
        (imgcopy (car ( gimp-image-duplicate img))) ; Copy to avoid changes on the original image
    )
    (display " onlyvisible: ")(display onlyvisible)(newline)
    (pitibalrog-export-layers imgcopy (gimp-image-get-layers imgcopy) filename onlyvisible) 
)
)


(define (pitibalrog-export-layers img listlayers filename onlyvisible)
(let*
    (
        (nblayers (car listlayers))
        (layers (cadr listlayers))
        (display "EXPORT LAYERS: LAYERS = ")(display layers)(newline)

        (display " onlyvisible: ")(display onlyvisible)(newline) ; <--- HERE IT WORKS
        (index 0)

        (basename (unbreakupstr (butlast (strbreakup filename ".")) "."))
        (extension (car (last (strbreakup filename "."))))
        (layer)
    )

    (display " onlyvisible: ")(display onlyvisible)(newline) ; <--- HERE IS THE PROBLEM


    (while (< index nblayers)
        (set! layer (aref layers index))
        (gimp-item-set-visible layer FALSE)
        (set! index (+ index 1))
    )
    (set! index 0)
    (while (< index nblayers)
        (set! layer (aref layers index))
        (set! filename (string-append basename (car(gimp-drawable-get-name layer)) "." extension))

        (pitibalrog-export-layer img layer filename onlyvisible)

        (set! index (+ index 1))
    )
)
)

(define (pitibalrog-export-layer img layer filename onlyvisible)
    (display " - export layer: ")(display layer)(newline)

    (gimp-item-set-visible layer TRUE)

    ; LAYER GROUP
    (when (= (car(gimp-item-is-group layer)) 1)
        (display "Layer ")(display layer)(display " is a group")(newline)
        (pitibalrog-export-layers img (gimp-item-get-children layer) filename onlyvisible)
    )
    ; REAL LAYER
    (when (= (car(gimp-item-is-group layer)) 0)
        (display "Layer ")(display layer)(display " is not a group")(newline)
        ; (gimp-file-save RUN-NONINTERACTIVE img layer filename filename) ; NO MASK HANDLING!!!
        (gimp-file-save RUN-WITH-LAST-VALS img layer filename filename)
    )

    (gimp-item-set-visible layer FALSE)
)

(script-fu-register "pitibalrog-test"
"<Image>/Script-Fu/Utils/pitibalrog-test..."
"Export all layers of the image in separete files" ;comment
"pitiBalrog" ;author
"pitiBalrog" ;copyright
"November 2012" ;date
"*A"
SF-IMAGE "img" 0
SF-FILENAME "destination" ""
SF-TOGGLE   "Export only visible layers" TRUE
)

1 个答案:

答案 0 :(得分:1)

免责声明:我从未使用过script-fu做过任何工作,所以我不知道那些脚本特定的程序是做什么的。然而,方案,我可以做。

请仔细查看let特殊表单所需的语法:

(let <List of forms that assign values>
   <body>)

我认为你的主要问题来自于在方案中你可以改变几乎任何东西的价值 - 很少有保留字像其他语言一样。因此,当您说(let ((display 3)) <body>)时,display不再指向向REPL显示内容的过程。然后,在您let*的正文中,当您说(display " onlyvisible")时,您试图将某事物称为不是函数的函数 - 在这种情况下,无论layers的值是什么。

通常,需要执行display之类的所有代码都应该在函数体中。例如:

(let ((foo 3)                 ; associate symbol foo with the value 3
      (bar "I'm a string!")   ; associate symbol bar with a string
      (* '(a b c)))           ; associate symbol * with a list '(a b c)
  (display foo)               ;\
  (newline)                   ; \    
  (display bar))              ;  }-- expressions that make up the body
  (newline)                   ;  /
  (display *)                 ; /
  (* 3 4))                    ;/ --- this is the same type of error you made

;;Output
3
I'm a string!
(a b c)
ERROR -- invalid function

最后,请不要像使用C或Java那样格式化方案代码等。这是您的第一个程序的计划友好版本:

(define (pitibalrog-test img filename onlyvisible)
  (let ((img copy (car (gimp-image-duplicate img))))
    (display " onlyvisible: ")
    (display onlyvisible)
    (newline)
    (pitibalrog-export-layers imgcopy (gimp-image-get-layers imgcopy) filename onlyvisible)))

格式良好的代码使计划者感到高兴,您更有可能获得快速帮助。