Hello Carlbcx,
Carlbcx Wrote:I'm working on a poster without date. I need, from this file, make 30 similar posters, just adding a different date to each one.
Chapter 1: Learning basic string operations in Script-Fu
- Run Gimp
 
- Gimp menu Filters > Scrip-Fu > Console
 
- Copy in the clipboard the following Script-Fu expression:
 
Code:
(string-append "C:\\Tool\\Gimp\\forum\\gimp-forum.net\\WriteDate" DIR-SEPARATOR "template" ".png")
 
- Paste the content of the clipboard in the input area of the Script-Fu console.
 
- Validate by ENTER.
 
;-> the result should be, in Windows, the full path of your poster:
"C:\\Tool\\Gimp\\forum\\gimp-forum.net\\WriteDate\\template.png"
In Linux, adapt the following path "/home/Tool/Gimp/gimp-forum.net/WriteDate" to your needs:
- DIR-SEPARATOR is "\\" in Windows
 
- DIR-SEPARATOR is "/" in Linux
 
Consider that the 
path-in parameter is the root folder of the project called WriteDate.
path-in contains 
template.png that is to say the poster of reference.
The goal is to generate the dated posters in the subfolder 
target.
According to your operating system, you must create 
manually the 
target folder under 
path-in.
path-in  = 
C:\\Tool\\Gimp\\forum\\gimp-forum.net\\WriteDate
path-out = 
C:\\Tool\\Gimp\\forum\\gimp-forum.net\\WriteDate\\target
We generate the dated posters in the subfolder 
target in order to remove quickly its content before running 
again the script.
Regards.
Chapter 2: Defining and running your first Script-Fu function
Define your first Script-Fu function called 
GenFileOut.
let* introduces the initialization of local variables such as 
filePoster until 
file-out.
As usual, copy in the clipboard the following code and paste it in the Script-Fu console:
Code:
(define (GenFileOut path-in template ext date counter)
    (let*    (    (filePoster    (string-append path-in DIR-SEPARATOR template ext))
                (strIdx (number->string counter))
                (strZidx (if (< counter 10) (string-append "0" strIdx) strIdx))
                (path-out (string-append path-in DIR-SEPARATOR "target" DIR-SEPARATOR))
                (file-out (string-append path-out template strZidx ext))
            )
        (display "filePoster: ")    (displayln filePoster)        
        (display "strIdx: ")        (displayln strIdx)        
        (display "strZidx: ")        (displayln strZidx)        
        (display "path-out: ")        (displayln path-out)        
        (display "file-out: ")        (displayln file-out)
)    )
 
;-> the result of the Script-Fu console should be:
GenFileOut
meaning that your definition is ok. The aligned parenthesis are well balanced.
Run your first function.
We split the full path of the poster of reference as several parameters in order to avoid scanning and parsing the path.
Code:
(GenFileOut "C:\\Tool\\Gimp\\forum\\gimp-forum.net\\WriteDate" "template" ".png" "10/15/2021" 0)
 
;-> the result of the Script-Fu console should be:
Code:
filePoster: C:\Tool\Gimp\forum\gimp-forum.net\WriteDate\template.png
strIdx: 0
strZidx: 00
path-out: C:\Tool\Gimp\forum\gimp-forum.net\WriteDate\target\
file-out: C:\Tool\Gimp\forum\gimp-forum.net\WriteDate\target\template00.png#t
 
The return code 
#t of the function 
GenFileOut is concatenated with the 
file-out full path.
If 
displayln is unknown, it is normally defined in 
C:\Program Files\GIMP 2\share\gimp\2.0\scripts\palette-export.scm by:
Code:
(define displayln (lambda (obj) (display obj) (display "\n")))
 
The 
if instruction is followed by the condition, "Then" part and "Else" part.
In Pascal or Basic-like:
Code:
If counter < 10 then strZidx = "0" + strIdx Else strZidx = strIdx 
 
However the keywords "Then" and "Else" are implicit in Script-Fu:
Code:
(if (closure? GenFileOut)(display "GenFileOut is a known function")(display "GenFileOut is UNknown"))
 
;-> GenFileOut is a known function#t
Code:
(if (closure? 'rascalFiloute)(display "rascalFiloute is a known function")(display "rascalFiloute is UNknown"))
 
;-> will fail: rascalFiloute  
 is UNknown#t
Chapter 3: WriteDate from template.png
Ofnuts Wrote:Doable with script-fu
We are ready to experiment our new function WriteDate.
Before running 
WriteDate, prepare with Gimp an empty square image 500 x 500 pixels of yellow color RGB ffff00
Gimp menu 
File> 
Export as "template.png" in your working folder "C:\\Tool\\Gimp\\forum\\gimp-forum.net\\WriteDate".
Code:
(define (WriteDate path-in template ext date counter)
    (let*    (    (filePoster    (string-append path-in DIR-SEPARATOR template ext))
                (strIdx (number->string counter))
                (strZidx (if (< counter 10) (string-append "0" strIdx) strIdx))
                (path-out (string-append path-in DIR-SEPARATOR "target" DIR-SEPARATOR))
                (file-out (string-append path-out template strZidx ext))
                (posX 100) (posY 100)
                (imgDat        (car (gimp-image-new 1 1 RGB))) ; Empty poster
                (layerDat     (car (gimp-layer-new imgDat 1 1 RGB-IMAGE "layer_date" 100 LAYER-MODE-NORMAL-LEGACY)))
            )
        (gimp-image-insert-layer imgDat layerDat 0 0)
        (gimp-context-set-foreground '(0 0 0)) ; black
        (gimp-context-set-background '(255 255 255)) ; white
        (gimp-drawable-fill layerDat BACKGROUND-FILL) ; Empty white poster
        (let* ((layerPoster (car (gimp-file-load-layer 1 imgDat filePoster)))) ; load template
            (gimp-image-insert-layer imgDat layerPoster 0 0) ; as a layer to the empty poster
            (script-fu-util-image-resize-from-layer imgDat layerPoster) ; same size than the template
            (gimp-layer-resize-to-image-size layerDat)
            (display "file-out: ") (display file-out) (display " date: ") (displayln date)
            ; Write the date in posX, posY Sans font (private joke)
            (let* ((layerTxt (car (gimp-text-fontname imgDat layerPoster posX posY date 0 TRUE 18 POINTS "Sans"))))
                (gimp-floating-sel-anchor layerTxt)
        )    ) ; Anchor the floating selection to its associated drawable
        (let* ((layerSav (car (gimp-image-flatten imgDat)))) ; Save the dated poster
            (gimp-displays-flush)
            (gimp-file-save RUN-NONINTERACTIVE imgDat layerSav file-out file-out)
            (gimp-image-delete imgDat)        
)    )    )
 
;-> the result of the Script-Fu console should be:
WriteDate
Code:
(WriteDate "C:\\Tool\\Gimp\\forum\\gimp-forum.net\\WriteDate" "template" ".png" "10/15/2021" 0)
 
;-> the result of execution should be:
file-out: C:\Tool\Gimp\forum\gimp-forum.net\WriteDate\target\template00.png date: 10/15/2021
(#t)
template00.png has been SUCCESSFULLY generated in the 
target folder.
We recognize the yellow square of template.png but with the written date "10/15/2021"!
Chapter 4: Basic iterator WriteDates
We wish to call 
WriteDate for each date of the given list: 
'("10/15/2021" "10/11/2021")
To get the first date:  
 
Code:
(car '("10/15/2021" "10/11/2021"))
 
;-> "10/15/2021"
To get the remaining dates in a list:
Code:
(cdr '("10/15/2021" "10/11/2021"))
 
;-> ("10/11/2021")
car and 
cdr are the basic extractors of a Script-Fu list.
WriteDates is a basic iterator based on 
let loop that increments 
counter from 
idxStart = 0.
Note that we save the Gimp context by 
gimp-context-push because we change the fore and background colors.
We restore this context before the end by 
gimp-context-pop.
Before running WriteDates, remove 
manually all previously generated *.png from the 
target folder.
Code:
; Main iterator
(define (WriteDates path-in template ext lstDate idxStart)
    (gimp-context-push)
    (displayln "") (displayln "WriteDates is running...")
    (let loop ((lstStr lstDate) (counter idxStart))
        (if (pair? lstStr)
            (begin    (WriteDate path-in template ext (car lstStr) counter)
                    (loop (cdr lstStr) (+ counter 1))
            )
            (begin    (display  counter)
                    (displayln " posters have been SUCCESSFULLY generated!")
    )    )    )
    (gimp-context-pop)
)
 
;-> WriteDates
Let us generate two posters dated from the list of dates 
'("10/15/2021" "10/11/2021")
Code:
(WriteDates "C:\\Tool\\Gimp\\forum\\gimp-forum.net\\WriteDate" "template" ".png" '("10/15/2021" "10/11/2021") 0)
 
;-> generates template00.png dated "10/15/2021" and template01.png dated "11/10/2021" in the target folder.
WriteDates is running...
file-out: C:\Tool\Gimp\forum\gimp-forum.net\WriteDate\target\template00.png date: 10/15/2021
file-out: C:\Tool\Gimp\forum\gimp-forum.net\WriteDate\target\template01.png date: 10/11/2021
2 posters have been SUCCESSFULLY generated!
(#t)
Take in consideration that, in the 
if that checks if the list of dates is not empty,
the 
Then and 
Else parts have more than one statement. We need to encapsulated them in 
begin.
If you read this thread until here, it will be a first step in the Script-Fu world of another era.
Would you also share your experimentation with ImageMagick according to the rich2005's bash file?
Regards.