PDA

Vollständige Version anzeigen : Fehler im Skript


MontgomeryBurns
25.03.2010, 21:32
Hallo,

ich habe vor einiger Zeit ein kleines Skript geschrieben, welches automatisch Bilder skaliert, schärft und speichert. Ich hab es jetzt schon einige Zeit nicht benutzt. Einen neuen PC (Win7 64bit) und (wahrscheinlich) auch eine aktueller Version von Gimp (2.6.8 32bit).

Nun wollte ich das (unveränderte!!!) Skript nutzen, doch es kommt eine Fehlermeldung:

ERROR: EVAL: unbound variable: cadr

Aber es ging doch schonmal?:confused:

Wo liegt der Fehler?


(define (CutAndScale image drawable)
(let* (
(selection (cdr (gimp-selection-bounds image)))
(x1 (car selection))
(y1 (cadr selection))
(x2 (caddr selection))
(y2 (cadddr selection))
(width (- x2 x1))
(height (- y2 y1))
(xoffset x1)
(yoffset y1)
)

(if (or (< width 450)(< height 450))
(begin
(gimp-message-set-handler 2)
(gimp-message "Auswahl zu klein")
(list -1 -1)
(gimp-message-set-handler 0)
)
(begin



(gimp-image-crop image width height xoffset yoffset)
(if (< width height)
(gimp-image-scale image 450 600)
(gimp-image-scale image 600 450)
)
(plug-in-sharpen 1 image drawable 25) ;1-Menü wird angezeigt 0-wird nicht angezeigt
(let* (
(filename (car (gimp-image-get-filename image))); kompletter Pfad
(name (car (gimp-image-get-name image)))
(pathname (substring filename 0 (- (string-length filename) (string-length name))))
(prefix (substring name 0 (- (string-length name) 4)))
(filename_new (string-append pathname "_StudiVZ_"prefix ".jpg"))
)

; (gimp-file-save 1 image drawable filename_new filename_new)
(file-jpeg-save
1 ;run-mode
image ;image
drawable ;drawable
filename_new ;filename
filename_new ;raw-filename
0.9 ;quality
0 ;smoothing
1 ;optimize
1 ;progressive
"(c) xxx" ;comment
0 ;subsmp
1 ;baseline
0 ;restart
0;dct
)
)
(gimp-image-clean-all image) ;so tun, als wäre das Bild nicht geändert
(gimp-display-new image) ;zeigt das neu erzeugte Bild an
)
)
)
)
(script-fu-register
"CutAndScale"
"<Image>/Skripte/StudiVZ"
""
"xxx"
""
"2009-04-24"
""
SF-IMAGE "IMAGE" 0
SF-DRAWABLE "LAYER" 0
)

klaus_harrer
10.04.2010, 23:51
Hallo

Vielleicht funktioniert es so.


(define (CutAndScale image drawable)
(let* (
(x1 (cadr (gimp-selection-bounds image)))
(y1 (caddr (gimp-selection-bounds image)))
(x2 (cadddr (gimp-selection-bounds image)))
(y2 (car(caddddr (gimp-selection-bounds image))))
(width (- x2 x1))
(height (- y2 y1))
(xoffset x1)
(yoffset y1)
)

(if (or (< width 450)(< height 450))
(begin
(gimp-message-set-handler 2)
(gimp-message "Auswahl zu klein")
(list -1 -1)
(gimp-message-set-handler 0)
)
(begin



(gimp-image-crop image width height xoffset yoffset)
(if (< width height)
(gimp-image-scale image 450 600)
(gimp-image-scale image 600 450)
)
(plug-in-sharpen 1 image drawable 25) ;1-Menü wird angezeigt 0-wird nicht angezeigt
(let* (
(filename (car (gimp-image-get-filename image))); kompletter Pfad
(name (car (gimp-image-get-name image)))
(pathname (substring filename 0 (- (string-length filename) (string-length name))))
(prefix (substring name 0 (- (string-length name) 4)))
(filename_new (string-append pathname "_StudiVZ_"prefix ".jpg"))
)

; (gimp-file-save 1 image drawable filename_new filename_new)
(file-jpeg-save
1 ;run-mode
image ;image
drawable ;drawable
filename_new ;filename
filename_new ;raw-filename
0.9 ;quality
0 ;smoothing
1 ;optimize
1 ;progressive
"(c) xxx" ;comment
0 ;subsmp
1 ;baseline
0 ;restart
0;dct
)
)
(gimp-image-clean-all image) ;so tun, als wäre das Bild nicht geändert
(gimp-display-new image) ;zeigt das neu erzeugte Bild an
)
)
)
)
(script-fu-register
"CutAndScale"
"<Image>/Skripte/StudiVZ"
""
"xxx"
""
"2009-04-24"
""
SF-IMAGE "IMAGE" 0
SF-DRAWABLE "LAYER" 0
)

MontgomeryBurns
11.04.2010, 14:29
DANKE, aber leider kommt auch hier "Error: eval: unbound variable: cadr":confused:

klaus_harrer
11.04.2010, 17:37
Hallo

So funktioniert es

(define (CutAndScale image drawable)
(let* (
(selection-bounds (gimp-selection-bounds image))
(select-offset-x (cadr selection-bounds))
(select-offset-y (caddr selection-bounds))
(select-width (- (cadr (cddr selection-bounds)) select-offset-x))
(select-height (- (caddr (cddr selection-bounds)) select-offset-y))


(width (- x2 x1))
(height (- y2 y1))
(xoffset x1)
(yoffset y1)
)

(if (or (< width 450)(< height 450))
(begin
(gimp-message-set-handler 2)
(gimp-message "Auswahl zu klein")
(list -1 -1)
(gimp-message-set-handler 0)
)
(begin



(gimp-selection-none image)
(gimp-image-crop image select-width select-height select-offset-x select-offset-y)
(if (< width height)
(gimp-image-scale image 450 600)
(gimp-image-scale image 600 450)
)
(plug-in-sharpen 1 image drawable 25) ;1-Menü wird angezeigt 0-wird nicht angezeigt
(let* (
(filename (car (gimp-image-get-filename image))); kompletter Pfad
(name (car (gimp-image-get-name image)))
(pathname (substring filename 0 (- (string-length filename) (string-length name))))
(prefix (substring name 0 (- (string-length name) 4)))
(filename_new (string-append pathname "_StudiVZ_"prefix ".jpg"))
)

; (gimp-file-save 1 image drawable filename_new filename_new)
(file-jpeg-save
1 ;run-mode
image ;image
drawable ;drawable
filename_new ;filename
filename_new ;raw-filename
0.9 ;quality
0 ;smoothing
1 ;optimize
1 ;progressive
"(c) xxx" ;comment
0 ;subsmp
1 ;baseline
0 ;restart
0;dct
)
)
(gimp-image-clean-all image) ;so tun, als wäre das Bild nicht geändert
(gimp-display-new image) ;zeigt das neu erzeugte Bild an
)
)
)
)
(script-fu-register
"CutAndScale"
"<Image>/Skripte/StudiVZ"
""
"xxx"
""
"2009-04-24"
""
SF-IMAGE "IMAGE" 0
SF-DRAWABLE "LAYER" 0
)




Mfg Klaus Harrer

MontgomeryBurns
11.04.2010, 17:44
Leider genau die gleiche Fehlermeldung ;(
Kann es sein, dass es an irgendeiner anderen Einstellung liegt? Wie gesagt, das gleich (ursprüngliche) Skript hat ja auf meinem alten Rechner ohne Probleme funktioniert....

schumaml
11.04.2010, 18:05
Klaus, ein nicht definiertes cadr (http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_idx_404) behebt man nicht mit Änderungen an diesem Skript.

MontgomeryBurns
11.04.2010, 18:08
Ich habe jetzt mal ein Skript in Internet gesucht, in dem der gleiche Befehl vorkommt: http://people.pwf.cam.ac.uk/ssb22/notes/savearea.scm

und auch hier kommt genau die gleiche Fehlermeldung ;(

klaus_harrer
11.04.2010, 21:51
Hallo


Klaus, ein nicht definiertes cadr behebt man nicht mit Änderungen an diesem Skript.


schumaml, wenn du so gut bist, mach es doch besser.
Ich habe von dir noch nichts konstruktives zu je einem Script gehört.

Man man könnte auch "list-ref" nehmen. Aber schumaml weiß da mehr.

MfG
Klaus Harrer

schumaml
12.04.2010, 02:16
schumaml, wenn du so gut bist, mach es doch besser.

Es bringt nichts, das Skript ändern zu wollen, wenn eine library procedure des Scheme-Standards plötzlich nicht mehr verfügbar ist - vor allem dann nicht, wenn ein und dasselbe Skript schon einmal funktioniert hat. Es wird in dem Skript ja insbesondere nirgends versucht, cadr neu zu definieren.

Daher geht es darum, die Ursache dieses Problems herauszufinden. Ich würde das z.B. mal so machen:

1. Funktioniert (cadr ...) denn überhaupt noch, z.B. in der Skript-Fu Konsole? Zum Beispiel mit (cadr '(1 2 3 4))...

2. Was ist denn mit (car (cdr ...)? Z.B. (car (cdr '(1 2 3 4))

Funktioniert hier wie erwartet, aber das ist ja auch nicht verwunderlich.

3. Beliebige andere Skripte können da natürlich alles anders definieren. Ein (define cadr '()) sollte aber eher zu Error: illegal function statt undefined variable führen.

Interessant könnte es an der Stelle sein, einmal die Standarddefinition von cadr mit in das Skript zu packen: (define cadr (lambda (x) (car (cdr x))))

MontgomeryBurns
12.04.2010, 09:37
Wie gesagt (Posting weiter oben) habe ich mal ein Script aus dem Internet geladen, welches auch dieses cadr enthält, und es führte auch zu dieser Fehlermeldung. Es scheint also an GIMP selbst bzw. an irgendwelchen Einstellungen zu liegen, oder? Problem bei 64bit-Systemen?
Neuinstallation?

Sorry, aber ich hab vom dem Script-Zeugs null Plan (merkt man bestimmt). Hab mir das nur so surch trial-and-error aus einem anderen Script zusammengebastelt...

schumaml
12.04.2010, 13:11
Es scheint also an GIMP selbst bzw. an irgendwelchen Einstellungen zu liegen, oder? Problem bei 64bit-Systemen?

Möglich. Zur Verdeutlichung:

cadr ist keine irgendwie komplizierte und selten benötigte Funktion. Die holt aus einer Liste den zweiten Wert und wird zigfach in allen bei GIMP beiliegenden Skripten verwendet.

Die Funktion ist eine Abkürzung von (car (cdr liste)), was sich mit "erstes Element des Rest der Liste" ausdrücken lässt.

Also könnte man auch schreiben:

(x1 (car (cdr (gimp-selection-bounds image))))

caddr und cadddr usw. sind nur Aneinandereihungen dieser beiden einfachen Prozeduren. Das könntest du ersetzen und testen, allerdings sollen freilich auch die Abkürzungen einfach so funktionieren.

Neuinstallation?

Bringt bei GIMP erfahrungsgemäß meist nichts, und zerstört ansonsten alle Hinweise auf den eigentlichen Fehler.

Hier würde ich eher den Installationszustand in Bezug auf die Skripte wieder herstellen - alle verschieben, die nicht bei GIMP mit dabei waren. Wenn die sowieso im persönlichen GIMP-Verzeichnis liegen, dann ist das schnell erledigt. Das Erstellungs- oder Änderungsdatum der Dateien hilft dabei auch.

Wie verhalten sich denn Skripte, die bei GIMP mit dabei waren?

MontgomeryBurns
12.04.2010, 19:36
Also andere Skripte funktionieren (kannst Du mir evtl. ein spezielles nennen, welches dieses cadr enthält? Hab zwar schon danach gesucht und gesehen, dass es in dem Skript "circuit" enthalten sit, aber ich find das im Gimp nicht (evtl. weil es da anders heißt (deutsch)?)

Naja, und wenn ich den "Urzustand" wieder herstelle (also MEIN Skript nicht mehr einbinde) kann ich es natürlich auch nicht mehr testen....:shock:

MontgomeryBurns
12.04.2010, 20:55
So, ich hab jetzt Gimp runtergschmissen und folgendes versucht:

-Neuinstallation 2.6.8 -> selbe Fehlermeldung
-Neuinstallation 2.6.2 -> dto
-Neuinstallation 2.6.8 64bit -> dto
- kopieren des Porgrammverzeichnises von meinem XP-Rechner (auf dem das Skript läuft) -> dto
- Installieren von Gimp 2.6.8 PORTABLE-> SKRIPT LÄUFT:confused::confused::confused:

schumaml
13.04.2010, 10:58
Auskunft des Script-Fu-Betreuers Kevin Cozens (https://www.ohloh.net/accounts/kcozens):

Die Fehlermeldung tritt auf, wenn script-fu.init (liegt in share\gimp\2.0\scripts) nicht geladen wird. Darin sind die library procedures (== lassen sich mit primitive procedures ausdrücken) des Scheme-Standard definiert.

Jetzt ist die Frage, warum das bei dir passiert. Änderst du die Konfiguration der Skript-Fu Suchpfade, wenn du das Skript hinzufügst - vor allem: änderst oder löschst du vorhandene Pfade?

MontgomeryBurns
13.04.2010, 11:01
Ich habe EINEN Pfad bei den Skripten hinzugefügt (den, wo das fragliche Skript liegt). Entfernt habe ich keinen. Genau das gleiche habe ich jetzt mit Gimp Portable gemacht und es funktioniert...

btw: Hab jetzt einfach Gimp-Portable in das Programmverzeichnis kopiert und arbeite damit.... Ist keine Lösung für das Problem, aber es umgeht es =)