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

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

 



Issue fixed in master and 2.8 branch.  (It will be generally
available as of gimp 2.8.12)

Thanks for spotting that.

  js
 -><-

On 19 June 2014 00:31, Joao S. O. Bueno <gwidion@xxxxxxxxx> wrote:
> 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