Re: Python-fu GIMP Layer "parent" property error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



yes - this is a bug - and it can be open in the bugtracker.

On 18 June 2014 22:41, Seldom Needy <needthistool@xxxxxxxxx> wrote:
> As stated at http://www.gimp.org/bugs/ I'm supposed to mention issues
> here before throwing them into the tracker so here goes.
>
> Working on a plugin that does some layer manipulation and kept
> encountering the error:
> AttributeError: 'gimp.Layer' object has no attribute 'layers'
> when trying to access the layer structure in a tree-like fashion to
> find "sibling" layers in the same grouplayer/layergroup. After being
> puzzled, I found the issue, which seems to essentially be that the
> "parent" attribute of a layer automatically "upcasts" to gimp.Layer,
> rather than yielding a gimp.GroupLayer, as I think should be expected.
>
> The behavior can be reproduced as follows from Python console in GIMP 2.8.8:
>>>> image = gimp.image_list()[0]
>>>> image.layers[0].layers[0].parent.layers # again with the result:
> AttributeError: 'gimp.Layer' object has no attribute 'layers'
>
> Assuming an image's layer-structure is similar to:
> [root image]
> +--------GROUPLAYER ZERO
> +--------+--------LAYER ZERO OF ZERO
> +--------GROUPLAYER ONE
> +--------+--------LAYER ZERO OF ONE
> +--------+--------LAYER ONE OF ONE
> +--------LAYER BACKGROUND
>
> From the console we have a hint as to why this is.
>>>> image.layers[0]
> <gimp.GroupLayer "GROUPLAYER ZERO">
>>>> image.layers[0].layers[0].parent # should return the same layer as above but gives
> <gimp.Layer "GROUPLAYER ZERO">
>
> I haven't seen this on the bugtracker nor was I able to find
> discussion about it on the listserv archive. I assume it is a
> platform-independent bug. Can anyone confirm that? I develop on
> Windows XP at present.
>
> Workarounds for this bug exist I'm not in love with them (inelegant).
> Regardless, a sketch of what might work without using globals:
>
> def get_all_layers(parent):
>     """-> list. recursively get all layers from either an image, or a GroupLayer
>     Proceeds depth-first.
>     """
>     container=[]
>     for layer in parent.layers:
>         container.append(layer)
>         if hasattr(layer,"layers"):
>             container.extend( get_all_layers(layer) )
>     return container
>
> def get_parent(child):
>     if hasattr(child,"parent"):
>         for layer in get_all_layers(child.image):
>             if layer.name==child.parent.name: return layer
>             #^ layer will have the proper data-type of
> gimp.GroupLayer, so return it.
>             #^.. We do this because child.parent yields a gimp.Layer,
> which is undesired.
>     else:
>         return child.image # if we're already top-level, parent must
> just be the image.
>
> Cheers
> - Seldom
> _______________________________________________
> gimp-developer-list mailing list
> List address:    gimp-developer-list@xxxxxxxxx
> List membership: https://mail.gnome.org/mailman/listinfo/gimp-developer-list
> List archives:   https://mail.gnome.org/archives/gimp-developer-list
_______________________________________________
gimp-developer-list mailing list
List address:    gimp-developer-list@xxxxxxxxx
List membership: https://mail.gnome.org/mailman/listinfo/gimp-developer-list
List archives:   https://mail.gnome.org/archives/gimp-developer-list




[Index of Archives]     [Video For Linux]     [Photo]     [Yosemite News]     [gtk]     [GIMP for Windows]     [KDE]     [GEGL]     [Gimp's Home]     [Gimp on GUI]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux