GIMP Python - заполнить путь / вектор цветом - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь разработать скрипт, который можно запускать на открытых файлах SVG. Я хочу перебрать все пути и заполнить путь произвольным цветом (позже я заменю эту часть кода). Первым этапом этого является просто итерации по путям, и я не могу понять, как это сделать. Мой код ниже - почему я не вижу итераций по всем путям?

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import *

def plugin_main(image, layer, path):
    vectors_count, vectors = pdb.gimp_image_get_vectors(image)
    for n in vectors:
        pdb.gimp_image_select_item(image,CHANNEL-OP-REPLACE,n)
        foreground = pdb.gimp_context_get_foreground()
        pdb.gimp_edit_fill(image.layers[0], foreground)

register(
    "create_polygon_art",
    "Fills all the paths with the average color within path",
    "Fills all the paths with the average color within path",
    "Bryton Pilling",
    "Bryton Pilling",
    "2018",
    "<Image>/Filters/Fill all paths with average color",
    "RGB*, GRAY*",
    [],
    [],
    plugin_main
)

main()

Я также попробовал несколько различных подходов, которые я нашел путем поиска в Google, включая использование чего-то более простого для итерации, например:

for v in gimp.Vectors

Но независимо от того, что я пытаюсь, я не могу получить доказательства итерации по путям.

Я использую gimp 2.10.6 на 64-битной Windows 10.

1 Ответ

0 голосов
/ 08 ноября 2018

Это ловушка ... pdb.gimp_image_get_vectors(image) возвращает список целочисленных идентификаторов путей, но для более поздних вызовов требуется объект gimp.Vectors.

image.vectors действительно список gimp.Vectors, и вы можете перебрать все пути с помощью

for vector in image.vectors:

Больше проблем:

  • Вы объявляете два аргумента в register (), но их три в вашей функции. На практике вам не нужен аргумент пути, так как вы все равно собираетесь их итерировать.
  • Аргументом слоя вашей функции является активный слой, когда вызывается плагин, и обычно это тот, который вы хотите нарисовать
  • gimp-edit-fill принимает источник цвета, а не цвет. Когда вы пойдете дальше со своим кодом, вам нужно будет установить цвет переднего плана и нажать / выдвинуть контекст
  • CHANNEL-OP-REPLACE не является допустимым символом Python, в Python вы должны использовать CHANNEL_OP_REPLACE (с подчеркиванием)

Две коллекции сценариев Python здесь и там .

Если вы находитесь под Windows, некоторые подсказки для отладки ваших скриптов здесь

Ваш код с исправлениями:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import *

def plugin_main(image, layer):
    for p in image.vectors:
        pdb.gimp_image_select_item(image,CHANNEL_OP_REPLACE,p)
        pdb.gimp_edit_fill(layer, FOREGROUND_FILL)

register(
    "create_polygon_art",
    "Fills all the paths with the average color within path",
    "Fills all the paths with the average color within path",
    "Bryton Pilling",
    "Bryton Pilling",
    "2018",
    "<Image>/Test/Fill all paths with average color",
    "RGB*, GRAY*",
    [],
    [],
    plugin_main
)

main()

Вы можете сделать свой код более удобным для пользователя, рисуя «штрихи» (таким образом, у вас есть один путь с несколькими штрихами). Если вам нужны отдельные выделения для штрихов, вы можете скопировать их во временный путь. Код для этого можно найти в некоторых скриптах в коллекциях выше.

...