在Gimp中使用Python从组层获取子层

在Gimp中使用Python从组层获取子层,python,layer,gimp,xcf,python-fu,Python,Layer,Gimp,Xcf,Python Fu,我有一个嵌套层结构的XCD文件: image front-layer content-layer content-layer-name-1 content-layer-name-2 content-layer-name-3 back-layer 我用image=pdb.gimp\u file\u load(xcf\u file,xcf\u file)打开文件,可以将前层、内容层和后层作为image.layers[0]、im

我有一个嵌套层结构的XCD文件:

image
    front-layer
    content-layer
        content-layer-name-1
        content-layer-name-2
        content-layer-name-3
    back-layer
我用
image=pdb.gimp\u file\u load(xcf\u file,xcf\u file)
打开文件,可以将
前层
内容层
后层
作为
image.layers[0]
image.layers[1]
image.layers[2]
。但是Gimp不能通过列表索引获得
内容层中的子层

我可以使用
pdb.gimp\u image\u按名称获取层(image,'content-layer-name-3')
,但我不知道层的名称

我尝试了
pdb.gimp\u item\u get\u children(image.layers[1])
,但此方法返回带有项的子项列表的
INT32ARRAY
,我还没有找到如何通过其id检索项


如何使用Gimp(2.8)中的Python从组层获得子层?

Gimp Python在这个开发周期中几乎没有得到维护(这在很大程度上可以归咎于我自己)

为数不多的更新之一是创建了“Item”类,并在其上实现了一个class方法,该方法允许使用PDB方法返回的数字ID来检索一个项

因此,您可以使用
pdb.gimp\u item\u get\u children(组层)
,并在 返回的子项ID使用
gimp.Item.from\u ID
检索实际层

这里是一个GIMP控制台部分,我在其中“手动”检索子层:


多亏了这个故障,我在将插件从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
您现在只需检查“层”属性,然后从中检索子层。请记住,与包含其他组的组一样,可能有两个以上级别的层。
 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.
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