Quoting Javier Candeira <jav...@candeira.com>:
> On Mon, Feb 7, 2011 at 2:30 AM,
> <saulgo...@flashingtwelve.brickfilms.com> wrote:
>> The PDB functions already exist for handling layer groups, and
>> Script-fu does not have any problem making use of these functions. The
>> Python-fu extension has not yet been updated to handle groups (there
>> is no 'group' class).
> Do you mean that the Python-fu extension doesn't yet have access to
> the proper script-fu functions from pdb?
Not exactly. In Python, a "layer" is a reference to a data structure
(in C terminology, a pointer to a struct). One of the fields is the
layer's ID number. The PDB only deals with these ID numbers, and
Python doesn't provide a direct way to handle IDs. The only thing you
could do is get a list of all layers/groups (which would be a list of
pointers to structures) and search that list for the structure
containing the appropriate ID. Since the 'gimp-image-get-layers'
procedure now only returns the IDs of the top-level layers/groups,
there is no way to perform such a search. At some point, this will be
remedied but to my knowledge there is currently no way to do what you
want with Python.
Script-fu does not encounter this problem because there is no
Script-fu data structure for a layer -- a layer is identified by the
same ID number that the PDB uses. It does not matter that the "layer"
IDs returned by 'gimp-image-get-layers' might actually be "group" IDs,
to Script-fu it is just a number. Script-fu can pass that same number
back to the PDB and the procedure will know what to do with it (for
example, a call to 'gimp-item-is-group ID-number' will inform
Script-fu that the ID belongs to a group object).
It is up to the script programmer to make sure that he passes the
proper IDs to procedures -- there is no "type safety" for these GIMP
objects. For example, if a layer's ID is passed to
'gimp-item-get-children' then a run-time error will occur because that
procedure is expecting a group object's ID number.
> If you can do this via script-fu, do you mind providing me with the
> calls, so I can try and call them from Python?
The following script will save your tree to the specified directory
using the flat naming approach I described earlier. I did not attempt
to get too fancy soas to keep the code simple. You will probably wish
to base your filename on the image's name, rather than the directory
name as I have done (be sure to handle the possibility of an
If you need further assistance, I recommend that you post to the GIMP
Users Group forum ( http://gug.criticalhit.dk/viewforum.php?f=8 ). I
visit there daily.
(define (script-fu-sg-save-tree image dir-name)
(define (process-items items prefix)
(set! prefix (string-append prefix "++"))
(while (not (null? items))
(if (zero? (car (gimp-item-is-group (car items))))
(let ((filename (string-append prefix (car
(gimp-item-get-name (car items))))))
(file-png-save-defaults RUN-NONINTERACTIVE image (car
items) filename filename)
(set! items (cdr items)) )
(process-items (vector->list (cadr (gimp-item-get-children
(string-append prefix (car
(gimp-item-get-name (car items)))) )
(set! items (cdr items)) ))))
(cadr (gimp-image-get-layers image)))
(unbreakupstr (last (strbreakup dir-name DIR-SEPARATOR))
"Save image tree..."
"Save each layer as a PNG retaining group information"
SF-IMAGE "The image" 0
SF-DIRNAME "Image Directory" "/home/saul"
Gimp-developer mailing list