Получить подслои из группового слоя с Python в Gimp

У меня есть XCD-файл со структурой вложенных слоев:

image
    front-layer
    content-layer
        content-layer-name-1
        content-layer-name-2
        content-layer-name-3
    back-layer

Я открываю файл с image = pdb.gimp_file_load(xcf_file, xcf_file) и может получить front-layer, content-layer а также back-layer как image.layers[0], image.layers[1] а также image.layers[2], Но Gimp не может получить подслои в content-layer по индексу списка.

я могу использовать pdb.gimp_image_get_layer_by_name(image, 'content-layer-name-3'), но я не знаю названия слоев.

я попробую pdb.gimp_item_get_children(image.layers[1]), но этот метод возврата INT32ARRAY со списком детей элемента, и я не нашел, как получить элемент по его идентификатору.

Как я могу получить подслои из группового слоя с Python в Gimp (2.8)?

2 ответа

Решение

В этом цикле разработки GIMP Python оставался в основном незатронутым (во многом вы можете винить меня в этом).

Одним из немногих обновлений было создание класса "Item" - и реализация метода класса, который позволяет использовать числовой идентификатор, возвращаемый методами PDB, для получения элемента.

Итак, вы можете использовать, как вы узнали pdb.gimp_item_get_children(group_layer), и на возвращенном удостоверении для детей используют gimp.Item.from_id чтобы получить фактический слой.

Вот раздел консоли GIMP, где я получаю подслой "вручную":

>>> img = gimp.image_list()[0]
>>> c = img.layers[0]
>>> c
<gimp.Layer 'Layer Group'>
>>> pdb.gimp_item_get_children(c)
(1, (4,))
>>> c2 = gimp.Item.from_id(4)
>>> c2
<gimp.Layer 'cam2'>
>>> 

** обновление **

Я потратил несколько часов на взлом, и в GIMP 2.8 final будет надлежащая поддержка групп слоев - вам понадобится взломать выше до gimp 2.8 RC 1, но если вы сейчас строите проект из git master, группы слоев показываются как примеры "GroupLayer" и имеет атрибут "Layers", который работает так же, как атрибут "Layers" в изображении.

http://git.gnome.org/browse/gimp/commit/?id=75242a03e45ce751656384480e747ca30d728206

 Date:   Fri Apr 20 04:49:16 2012 -0300

     pygimp: adds proper support for layer groups

     Layer groups where barely supported using numeric IDs and
     by calling gimp.Item.from_id. This adds a Python
     GroupLayer class.

Спасибо за срыв, я боролся с той же проблемой, что и сейчас, в процессе обновления моих плагинов с 2.6 до 2.7~2.8. Вот отредактированная функция:

def find_layer_by_name (image, name):
for layer in image.layers:
    #check if layer is a group and drill down if it is
    if pdb.gimp_item_is_group(layer):
        gr = layer
        gr_items = pdb.gimp_item_get_children(layer)
        for index in gr_items[1]:
            item = gimp.Item.from_id(index)
            if item.name == name:
                return item

    # if layer is on the first level     
    if layer.name == name:
        return layer
        return None
Другие вопросы по тегам