Re: [Gimp-developer] Python-fu GIMP Layer "parent" property error
- From: "Joao S. O. Bueno" <gwidion gmail com>
- To: Seldom Needy <needthistool gmail com>
- Cc: gimp-developer <gimp-developer-list gnome org>
- Subject: Re: [Gimp-developer] Python-fu GIMP Layer "parent" property error
- Date: Thu, 19 Jun 2014 00:31:17 -0300
yes - this is a bug - and it can be open in the bugtracker.
On 18 June 2014 22:41, Seldom Needy <needthistool gmail com> 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 gnome org
List membership: https://mail.gnome.org/mailman/listinfo/gimp-developer-list
List archives: https://mail.gnome.org/archives/gimp-developer-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]