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  
"Untitled" image).

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  
(car items))))
                          (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))  

(script-fu-register "script-fu-sg-save-tree"
   "Save image tree..."
   "Save each layer as a PNG retaining group information"
   "February 2011"
   SF-IMAGE   "The image"       0
   SF-DIRNAME "Image Directory" "/home/saul"

(script-fu-menu-register "script-fu-sg-save-tree"

Gimp-developer mailing list

Reply via email to