* Tested in GIMP 2.99.14 *

The mix of lists and vectors in Script-Fu can be confusing at times. A vector is a type of list used for GIMP Object Array. For example, if you start GIMP and create an image, then in the Script-Fu console run:

(gimp-get-images)

It will give return the result (1 #(1))

Which is a vector and an integer in a list.

(list 1 (vector 1))

running… (car (gimp-get-images)) …is fine, returning 1, the first element of the list.
running… (cadr (gimp-get-images)) …is fine, returning a vector, the second element of the list.
running… (caadr (gimp-get-images)) …is bad, trying to return a list element from a vector.
running… (car (vector 1)) …is not allowed and gives an error like;
Error: car: argument 1 must be: pair …“pair” means a list.
running… (car (vector->list (vector 1))) …is fine, the vector is cast into a list prior to the car command.

The plug-in demonstrates some of the ways of working with vectors in Script-Fu.
The plug-in should appear in a Fu-Plugin menu.

To download vectors.scm
…follow the link, right click the page, Save as vectors.scm, in a folder called vectors, in a GIMP plug-ins location.
In Linux, set the file to be executable.

#!/usr/bin/env gimp-script-fu-interpreter-3.0

(define debug #f)

(define (script-fu-vectors)
  (let*
    (
      (emptyVector #())
      (myIntV #(1 2 3))
      (myStrV #("a" "b" "c"))
      (loopV (make-vector 3 #())) ; vector of 3 empty vectors
      (i 0) (tmpV 0)
    )

    (print-vector-list myIntV)

    ; set! can assign a vectors
    (set! emptyVector myStrV)
    (print-vector-list emptyVector)

    ; vector-set! for each vector index value)
    (vector-set! myStrV 0 "this")
    (vector-set! myStrV 1 "is a")
    (vector-set! myStrV 2 "vector")
    (print-vector-list myStrV)

    (set! myIntV (vector-append myIntV 4))
    (set! myIntV (vector-append myIntV 5))
    (set! myIntV (vector-append myIntV 6))
    (print-vector-list myIntV)
    
    ;(make-vector length value)
    (set! tmpV (make-vector 3 "testing"))
    (print-vector-list tmpV)

    ; fill a vector of vectors
    (while (< i 3)
      ; make a three element vector using append
      (set! tmpV (make-vector 3 "testing"))
      (vector-set! tmpV 0 "hello")
      (vector-set! tmpV 1 "vector")
      (vector-set! tmpV 2 (string-append "list # " (number->string i)))
      (vector-set! loopV i tmpV)
      (set! i (+ i 1))
    )

    ;print a vector of vectors
    (set! i 0)
    (while (< i 3)
      (print-vector-list (vector-ref loopV i))
      (set! i (+ i 1))
    )

  )
)

(script-fu-register"script-fu-vectors"
 "vectors" 
 "Demonstrating use of vectors" 
 "Mark Sweeney"
 "Under GNU GENERAL PUBLIC LICENSE Version 3"
 "2023"
 ""
)
(script-fu-menu-register "script-fu-vectors" "<Image>/Fu-Plugin")

; copyright 2023, Mark Sweeney, Under GNU GENERAL PUBLIC LICENSE Version 3

; utility functions
(define (boolean->string bool) (if bool "#t" "#f"))

(define (exit msg)
  (gimp-message-set-handler 0)
  (gimp-message (string-append " >>> " msg " <<<"))
  (gimp-message-set-handler 2)
  (quit)
)

(define (here x)(gimp-message(string-append " >>> " (number->string x) " <<<")))


; prints a vector as a single string
(define (print-vector-list vect)
  (let* ((i 0) (lstr "")(actV 0))

    (if (list? vect) (set! vect (list->vector vect)))
    (while (< i (vector-length vect))
      (set! actV (vector-ref vect i))
      (if (not (string? actV)) (set! actV (number->string actV)))
      (set! lstr (string-append lstr " vector element ->  " actV "\n" ))
      (set! i (+ i 1))
    )

    (gimp-message lstr)
  )
)


; adds a new value to the end of a vector
; (vector, value)
; returns the new vector
(define (vector-append vect v)
  (let*
    (
      (len (vector-length vect ))
      (tmpV (make-vector (+ 1 len) v))
      (i 0)
    )

    (when (> len 0)
      (while (< i len)
        (vector-set! tmpV i (vector-ref vect i))
        (set! i (+ i 1))
      )
    )

    (set! vect tmpV)
  )
)

vector element -> 1
vector element -> 2
vector element -> 3

vector element -> a
vector element -> b
vector element -> c

vector element -> this
vector element -> is a
vector element -> vector

vector element -> 1
vector element -> 2
vector element -> 3
vector element -> 4
vector element -> 5
vector element -> 6

vector element -> testing
vector element -> testing
vector element -> testing

vector element -> hello
vector element -> vector
vector element -> list # 0

vector element -> hello
vector element -> vector
vector element -> list # 1

vector element -> hello
vector element -> vector
vector element -> list # 2


<
Previous Post
Collapse All Groups
>
Next Post
Image Parasites