2016-12-22 4 views
0

Ich bin beschäftigt mit einem Script-fu und immer "Error (: 1) illegale Funktion". Ich bin kein Scheme/Lisp-Experte und versuche nur, einige fotografische Aufgaben zu automatisieren. Dokumentation ist selten - entweder GiMP schreibt nur über ihre eigenen internen Aktionen, aber nicht die Syntax von Scheme in Script-fu, oder ich finde "Tipps" für GiMP v1.0 (d. H. So veraltet, dass sie nutzlos sind).GiMP (Schema) Script-fu Fehler "illegale Funktion"

Ich habe eine Reihe von Skripten, die mit GiMP geliefert wurden, angeschaut und versucht, mehr zu erfahren und dies herauszufinden, aber ohne Erfolg. Ich bitte hier um Hilfe, den Fehler zu entfernen, nicht Einbuchtung Layout oder die Tatsache, dass Python-fu existiert usw.

Und damit der Code (reduziert auf funktionelles Skelett):

;; 
;; license, author, blah blah 
;; FOR ILLUSTRATION PURPOSES 
;; GiMP 2.8 LinuxMint 18.1 
;; does the work, but then blows up saying "Error (: 1) illegal function" 
;; 

(define (script-fu-ScriptFails InImage InLayer pickd mrge) 
    (let* (
     (CopyLayer (car (gimp-layer-copy InLayer TRUE))) 
    ) 
    (gimp-image-undo-group-start InImage) 
    (gimp-image-add-layer InImage CopyLayer -1) 
    (gimp-drawable-set-visible CopyLayer TRUE) 
    ;; Perform CHOSEN action on CopyLayer 
    (if (equal? pickd 0) ( ;; keep just the RED 
     (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 1.0 0 0 0 0 0 0 0 0) 
     (gimp-drawable-set-name CopyLayer "RED") 
    )) 
    (if (equal? pickd 1) ( ;; keep just the GREEN 
     (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 0 0 0 0 1.0 0 0 0 0) 
     (gimp-drawable-set-name CopyLayer "GRN") 
    )) 
    (if (equal? pickd 2) ( ;; keep just the BLUE 
     (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 0 0 0 0 0 0 0 0 1.0) 
     (gimp-drawable-set-name CopyLayer "BLU") 
    )) 
    (if (equal? mrge #t) ( ;; to merge or not to merge 
     (gimp-layers-flatten InImage) 
    )) 
    (gimp-image-undo-group-end InImage) 
    (gimp-display-flush) 
) 
) 

(script-fu-register "script-fu-ScriptFails" 
    _"<Image>/Script-Fu/ScriptFails..." 
    "Runs but fails at the end. Why? Please help!" 
    "JK" 
    "(pop-zip,G-N-U)" 
    "2016.12" 
    "RGB*" 
    SF-IMAGE  "The Image" 0 
    SF-DRAWABLE "The Layer" 0 
    ;; other variables: 
    SF-OPTION  "Effect" '("R_ed" "G_rn" "B_lu") 
    SF-TOGGLE  "Merge Layers" FALSE 
) 

Antwort

0

Es sieht so aus, als ob Sie Klammern als Blöcke verwenden. zB:

(if (equal? pickd 2) ( ;; keep just the BLUE 
     (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 0 0 0 0 0 0 0 0 1.0) 
     (gimp-drawable-set-name CopyLayer "BLU") 
    )) 

Sie sehen die Öffnung paren vor dem Kommentar über die blaue halten? Nun, das bedeutet, dass Sie dies tun:

((plu-in....) (gimp-drawable...)) 

Der erste natürlich brauchen eine Funktion gültig sein Schema und die Rückkehr aus dem zweiten zurückzubringen wird das gelieferte Argument sein. Wenn Sie wegen ihrer Nebenwirkungen zwei Ausdrücke verwenden wollten, sollten Sie einen Block verwenden. Wie die curlies in C Dialekte Blöcke sind Ausgangsformen mit begin in Schema:

(begin 
    (plu-in....) 
    (gimp-drawable...)) 

So wird dies die Ausdrücke und das Ergebnis des letzten Ausdrucks wird das Ergebnis bewerten, wenn sie auch das Ende der Funktion ist.

Auch für eine if mit nur einer Folge und keine Alternative when verwendet, wird Sie beginnen geben:

(when (equal? pickd 2) ;; keep just the BLUE (and no extra parens) 
    (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 0 0 0 0 0 0 0 0 1.0) 
    (gimp-drawable-set-name CopyLayer "BLU")) 
+0

Thank you so viel, Sylwester. Deine Erklärung von "beginne" macht vollkommen Sinn - ich habe das übersehen, als ich versucht habe, ein wenig von Scheme aufzuheben. Ich hatte so viele verschiedene Beispiele und andere Skripte gesehen, die ich zu hypnotisieren begann. Ändern Sie dies in die richtige Syntax mit, wenn alles funktioniert. Ich hatte mein traditionelles C-Gehirn versucht, einen Block für die beiden Anweisungen zu erstellen. Schema, eine andere kleine Geschichte. Spaß zu lernen. Noch einmal vielen Dank! – fotonix