2016-12-22 2 views
0

Je suis occupé avec un Script-fu et continue d'obtenir "Erreur (: 1) fonction illégale". Je ne suis pas un expert Scheme/Lisp, essayant juste d'automatiser certaines tâches photographiques. La documentation est rare - soit GiMP n'écrit que sur ses propres actions internes, mais pas sur la syntaxe de Scheme dans Script-fu, ou je trouve des "trucs" pour GiMP v1.0 (c'est-à-dire si datés qu'ils sont inutiles).GiMP (Scheme) Erreur Script-fu "fonction illégale"

J'ai regardé un tas de scripts fournis avec GiMP, essayant d'en savoir plus et de comprendre cela, mais en vain. Je demande ici pour aider à supprimer le bug, pas mise en retrait ou le fait qui existe Python-fu, etc.

Et avec cela, le code (réduit à squelette fonctionnel):

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

Répondre

0

Il semble que vous utilisiez des parenthèses comme des blocs. par exemple:

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

Vous voyez les paren d'ouverture avant le commentaire de garder le bleu? Eh bien cela signifie que vous faites ceci:

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

Le premier bien sûr besoin de retourner une fonction pour être valide et le schéma retour de la seconde sera l'argument fourni. Si vous vouliez faire deux expressions à cause de leurs effets secondaires, vous devriez utiliser un bloc. Comme les Curlies dans les blocs dialectes C sont des formes commençant par begin dans le schéma:

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

Ainsi, ce évaluera les expressions et le résultat de la dernière expression est le résultat si elle est aussi la queue de la fonction.

également pour un if avec seulement une conséquence et aucune alternative à l'aide when vous donnera un début:

(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

Merci beaucoup, Sylwester. Votre explication du 'début' est tout à fait logique - j'ai négligé cela quand j'ai essayé de prendre un peu de Scheme. J'avais regardé tant d'exemples différents et d'autres scripts que je commençais à hypnotiser. Changer cela à la syntaxe correcte en utilisant quand tout fait fonctionner. J'avais mon C-brain traditionnel essayant de créer un bloc pour les deux instructions. Scheme, une autre petite histoire. Amusant à apprendre. Encore merci! – fotonix