I think that this line is not returning the number of layers as we're
expecting.  I tried using gimp-message to write the number of layers out to
the console, but it generates another batch execution error.

Here is the code:

(define (batch-save-as-xcf pattern)
  (let* (
      (filelist (cadr (file-glob pattern 1)))
      (fileparts)
  (xcfname)
      (filename)
      (image)
  (newimage)
      (drawable)
  (num-layers)
  (layerIDs)
  (pos)
  (layerToKeep)
  (i)
      )
 (gimp-message-set-handler 2)
(gimp-message "Preparing to act on the following files")
(gimp-message pattern)

(while (pair? filelist)
 ; set filename to the name of the current file in the glob
(set! filename (car filelist))
(gimp-message "The current file is: ")
    (gimp-message filename)

; set xcfname by tokenizing on "." and taking everything but the last part
(set! fileparts (strbreakup filename "."))
(set! fileparts (butlast fileparts))
(set! xcfname (string-append (unbreakupstr fileparts ".") ".xcf"))
(gimp-message "The new filename will be: ")
(gimp-message xcfname)
 ; set image from the file, and then get the first layer and set it to
newimage
(gimp-message "Loading File.")
(set! newimage (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
 (set! num-layers (car (gimp-image-get-layers newimage)))
(set! layerIDs (cadr (gimp-image-get-layers newimage)))
(gimp-message "The current file has the following number of layers: ")
    (gimp-message num-layers)

;(set! layerToKeep 0)
;(set! pos 0)
;(while (< pos num-layers)
;(unless (= pos layerToKeep)
;(gimp-image-remove-layer newimage (vector-ref layerIDs pos))
;)
; (set! i (+ i 1))
    ; )

; set drawable to the newimage
(gimp-message "Setting the Drawable.")
(set! drawable (car (gimp-image-flatten newimage)))

; save the drawable from newimage as xcfname
(gimp-message "Saving the new file.")
(gimp-file-save RUN-NONINTERACTIVE newimage drawable xcfname xcfname)

;(gimp-image-delete image)
;(gimp-image-delete newimage)
    (set! filelist (cdr filelist))
    )
    )
  )


Here is the output:

script-fu.exe-Warning: Preparing to act on the following files

script-fu.exe-Warning: c:\test\ArroyoSanJose-014.tif

script-fu.exe-Warning: The current file is:

script-fu.exe-Warning: c:\test\ArroyoSanJose-014.tif

script-fu.exe-Warning: The new filename will be:

script-fu.exe-Warning: c:\test\ArroyoSanJose-014.xcf

script-fu.exe-Warning: Loading File.

TIFF image-Warning: Warning:
The image you are loading has 16 bits per channel. GIMP can only handle 8
bit, s
o it will be converted for you. Information will be lost because of this
convers
ion.

script-fu.exe-Warning: The current file has the following number of layers:

batch command experienced an execution error

(Type any character to close this window)


On Sat, Jul 24, 2010 at 9:39 AM, Dillon <dillonontheco...@gmail.com> wrote:

> It just says:
>
> batch command experienced an execution error
>
> (Type any character to close this window)
>
>
> Is there a way to get the batch engine to provide more verbose output?
>
> You're probably right about the variable declarations.  Doh!
>
> On Sat, Jul 24, 2010 at 4:11 AM, Cameron Gregory <c...@bloke.com> wrote:
>
>> what is the error?
>>
>> But you need to declare num-layers and layerID's at the top (like newimage
>> and drawable)
>>
>> Cameron
>>
>> On 24/07/2010, at 3:35 PM, Dillon wrote:
>>
>> As soon as I add in either of these lines:
>>
>> (set! num-layers (car (gimp-image-get-layers newimage)))
>> (set! layerIDs (cadr (gimp-image-get-layers newimage)))
>>
>>
>> I get batch command execution errors.
>>
>> The full script is:
>>
>> (define (batch-save-as-xcf pattern)
>>   (let* (
>>       (filelist (cadr (file-glob pattern 1)))
>>       (fileparts)
>>   (xcfname)
>>       (filename)
>>       (image)
>>   (newimage)
>>       (drawable)
>>       )
>>  (gimp-message-set-handler 2)
>> (gimp-message "Preparing to act on the following files")
>>  (gimp-message pattern)
>>
>> (while (pair? filelist)
>>  ; set filename to the name of the current file in the glob
>> (set! filename (car filelist))
>>  (gimp-message "The current file is: ")
>>     (gimp-message filename)
>>
>>  ; set xcfname by tokenizing on "." and taking everything but the last
>> part
>> (set! fileparts (strbreakup filename "."))
>>  (set! fileparts (butlast fileparts))
>> (set! xcfname (string-append (unbreakupstr fileparts ".") ".xcf"))
>>  (gimp-message "The new filename will be: ")
>> (gimp-message xcfname)
>>  ; set image from the file, and then get the first layer and set it to
>> newimage
>>  (gimp-message "Loading File.")
>> (set! newimage (car (gimp-file-load RUN-NONINTERACTIVE filename
>> filename)))
>>  (set! num-layers (car (gimp-image-get-layers newimage)))
>> (set! layerIDs (cadr (gimp-image-get-layers newimage)))
>>
>> ; set drawable to the newimage
>> (gimp-message "Setting the Drawable.")
>>
>> (set! drawable (car (gimp-image-flatten newimage)))
>>
>>
>> ; save the drawable from newimage as xcfname
>>   (gimp-message "Saving the new file.")
>>   (gimp-file-save RUN-NONINTERACTIVE newimage drawable xcfname xcfname)
>>
>>       (set! filelist (cdr filelist))
>>       )
>>     )
>>   )
>>
>>
>>
>>
>> Date: Sun, 06 Jun 2010 17:46:15 -0400
>> From: saulgo...@flashingtwelve.brickfilms.com
>> Subject: Re: [Gimp-user] Script-Fu for batch image conversion
>> To: gimp-user@lists.XCF.Berkeley.EDU
>> Message-ID:
>>        <20100606174615.awibbw09xk44k...@flashingtwelve.brickfilms.com>
>> Content-Type: text/plain;       charset=ISO-8859-1;     DelSp="Yes";
>>        format="flowed"
>>
>> Quoting Dillon <dillonontheco...@gmail.com>:
>>
>> > The reason I'm writing my own script-fu, rather than using Daves Batch
>> > Processor, is that my TIF files are multi-page, and when I load the
>> image
>> > and flatten it to a drawable, I end up with both pages flattened into
>> one
>> > drawable.  I only want one of the pages (I think the first).
>> >
>> > I need to find a way to select that page (which I assume is turned into
>> a
>> > layer when the TIF is loaded), and just set that layer to be my
>> drawable.
>>
>> In that case, you were on the right track originally with using
>> 'gimp-image-get-layers' (I am also assuming multi-page TIFFs load as
>> separate layers). However, you had incorrectly handled the value
>> returned by the function.
>>
>> 'gimp-image-get-layers' returns returns a list containing two
>> elements: the number of layers in the image and an array of the
>> layerIDs of those layers:
>>
>>   (set! num-layers (car (gimp-image-get-layers image)))
>>   (set! layerIDs (cadr (gimp-image-get-layers image)))
>>
>> You can obtain the layerID of the top layer with:
>>
>>   (set! top-layer (vector-ref layerIDs 0))
>>
>> The next down with:
>>
>>   (set! next-layer (vector-ref layerIDs 1))
>>
>> And so on:
>>
>>   (set! bottom-layer (vector-ref layerIDs (- num-layers 1)))
>>
>>
>> If you know the position of the layer you wish to keep (the TIFF
>> page), you can then remove all of the other layers from the image with:
>>
>>   (set! pos 0)
>>   (while (< pos num-layers)
>>     (unless (= pos TIFFpage)
>>       (gimp-image-remove-layer image (vector-ref layerIDs pos))
>>       )
>>     (set! i (+ i 1))
>>     )
>>
>> _______________________________________________
>> Gimp-user mailing list
>>
>> Gimp-user@lists.XCF.Berkeley.EDU
>> https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-user
>>
>>
>>
>
_______________________________________________
Gimp-user mailing list
Gimp-user@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-user

Reply via email to