Gimpfu 插件未启动

Gimpfu Plugin is not starting

我目前正在尝试为 Gimp.It 编写我自己的插件,这是我的第一次,也是我在 python 中的第一行,所以请对我温柔一点。该代码用于让我的生活更轻松地为 DCS 创建 Liveries。为此,它需要能够按名称找到一个层并将其设为 visible/invisible(在我的例子中是 countrty 标志)。另外,还没有实现,我想从文本层更改文本。

*之后添加
详细说明:
最终目标是在名为“DCS”的飞行模拟器中更改飞机的涂装方案。
开发人员允许我们访问纹理模板。
它们带有不同的基础层和层组,无需更改。
在那里我添加了我自己的图层组,其中包含我所有的图层和图层组。
该脚本应该可以轻松地在高能见度和低能见度绘画方案之间切换。
(尚未实施)通过隐藏相应的“低可见度”、“高可见度”图层组应该更容易实现。
此外,我还想使用名称、呼号和选择的标志来个性化涂装方案。
Name 和 Callsign 还没有文本层,也没有实现。
飞机座舱盖两侧(左、右)会有一面旗帜。
每个旗帜都有自己的层,有 200 多个。
他们的层组结构将是“WA”/“Flag + Callsign”/“Flags Right”,“Flags Left”。
在他们的图层组中,我只想让 by input choosen Flag 可见。

#!/usr/bin/env python
from gimpfu import *

def ui_callsign(image, drawable, flag_var, vis_var, name_var, callsign_var):
    pdb.gimp_message("main function call")

    flag_list = ["ad", "ae", "af", "ag", "ai", "al", "am", "ao", "aq", "ar", "as", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "bj", "bl", "bm", "bn", "bo", "bq", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cu", "cv", "cw", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "er", "es", "et", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gb-eng", "gb-nir", "gb-sct", "gb-wls", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", "gq", "gr", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "me", "mf", "mg", "mh", "mk", "ml", "mm", "mn", "mo", "mp", "mq", "mr", "ms", "mt", "mu", "mv", "mw", "mx", "my", "mz", "na", "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "ps", "pt", "pt", "pw", "py", "qa", "re", "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "ss", "st", "sv", "sx", "sy", "sz", "tc", "td", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", "to", "tr", "tt", "tv", "tw", "tz", "ua", " ug", "um", "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws", "xk", "ye", "yt", "za", "zm", "zw" 
                ]                                                                               #List of all flags
    pdb.gimp_message("created list")            
    for x in flag_list:                                                                         #go through list one by one
        pdb.gimp_message(x)
        if x == flag_var:                                                                       #if at by user choosen flag:
            layer_name_right = x + ".png #1"                                                    #add ending to get right layer name
            layer_name_left = x + ".png"
            layer_right = pdb.gimp_image_get_layer_by_name(image, layer_name_right)             #find right layer by layer name
            layer_left = pdb.gimp_image_get_layer_by_name(image, layer_name_left)
            pdb.gimp_item_set_visible(layer_right, TRUE)                                        #set right layer to visible
            pdb.gimp_item_set_visible(layer_left, TRUE)
        else:                                                                                   #all other flag layers same procedure as above but set to invisible
            layer_name_right = x + ".png #1"
            layer_name_left = x + ".png"
            layer_right = pdb.gimp_image_get_layer_by_name(image, layer_name_right)
            layer_left = pdb.gimp_image_get_layer_by_name(image, layer_name_left)
            pdb.gimp_item_set_visible(layer_right, FALSE)
            pdb.gimp_item_set_visible(layer_left, FALSE)
    
    pdb.gimp_message("end loop")
    return
    
    

register(
    "python_fu_ui_callsign",
    "Enter Name, Callsign and Flag selection",
    "Let's you easily change Name, Callsign and Flag on DCS Livery"
    "David Buergel", "David Buergel", "2022",
    "Ui Callsign",
    "Ui Callsign",
    "",
    [
        (PF_IMAGE, "image", "takes current image", None),
        (PF_DRAWABLE, "drawable", "Input layer", None),
        (PF_OPTION, "flag_var", "Flag", 0,
            ["ad", "ae", "af", "ag", "ai", "al", "am", "ao", "aq", "ar", "as", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "bj", "bl", "bm", "bn", "bo", "bq", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cu", "cv", "cw", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "er", "es", "et", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gb-eng", "gb-nir", "gb-sct", "gb-wls", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", "gq", "gr", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "me", "mf", "mg", "mh", "mk", "ml", "mm", "mn", "mo", "mp", "mq", "mr", "ms", "mt", "mu", "mv", "mw", "mx", "my", "mz", "na", "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "ps", "pt", "pt", "pw", "py", "qa", "re", "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "ss", "st", "sv", "sx", "sy", "sz", "tc", "td", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", "to", "tr", "tt", "tv", "tw", "tz", "ua", " ug", "um", "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws", "xk", "ye", "yt", "za", "zm", "zw" 
            ]
        ),
        (PF_RADIO, "vis_var", "Vis", "vis_value",
            (
                ("High Vis", "high_vis_value"),
                ("Low Vis", "low_vis_value")
            )
        ),
        (PF_TEXT, "name_var", "Name", "enter Name"),
        (PF_TEXT, "callsign_var", "Callsign", "enter Callsign")
        
    ],
    [],
    ui_callsign, menu="<Image>/Filters")

main()

插件出现在 Gimp 中并为我提供了所有正确的选项。单击确定后,灰色显示正常并取消,没有任何反应。错误控制台中没有消息。

如果能得到所有帮助,我会很高兴

因为你在 Ubuntu,你可以在终端启动 Gimp 来检查错误(这在 OSX 也是可行的,在 Windows 你必须使用 gimp-console).当你这样做时,当你 运行 你的脚本时你会看到这个:

Traceback (most recent call last):
  File "/Gimp-dev/2.10.24/run/lib/gimp/2.0/python/gimpfu.py", line 735, in response
    params.append(wid.get_value())
  File "/Gimp-dev/2.10.24/run/lib/gimp/2.0/python/gimpfu.py", line 567, in get_value
    return self.active_value
AttributeError: 'RadioEntry' object has no attribute 'active_value'

由于您只有一个单选按钮小部件,原因不难找到,您的代码是:

        (PF_RADIO, "vis_var", "Vis", "vis_value",
            (
                ("High Vis", "high_vis_value"),
                ("Low Vis", "low_vis_value")
            )
        ),

... 其中第三个参数应该是默认设置的值。但是由于 "vis_value" 不是这两个可能值之一,所以这是行不通的。将其更改为 "high_vis_value""low_vis_value".

一些补充说明:

  • 在小部件声明中,您可以重复使用标志列表,这样可以确保一致性。
  • 迭代层可能比迭代标志更有效。
  • 您不需要“drawable”参数
  • 当您在终端中 运行 Gimp 时,您 Python 代码中的 print 语句将打印到控制台,这比使用 gimp_message()
  • 要优雅地处理您的选项,您可以检查 this
  • 一些调试策略见this(其中一些也适用于Linux)
  • 要更改文本图层中的文本,请使用 pdb.gimp_text_layer_set_text(layer, text)。但这假设图层仍然是纯文本图层。如果不是在某些情况下,可以恢复文本信息,您可以使用上一层的字体信息重新创建一个新层。在所有情况下,这都可能很棘手,因为如果图层大小发生变化,您可能必须重新定位图层。
  • 我真的不知道你在做什么,但我觉得使用足够的图层组会让事情变得更容易(你可以切换组的可见性)

您使用前四个建议进行编码:

#!/usr/bin/env python
from gimpfu import *

flag_list = ["ad", "ae", "af", "ag", "ai", "al", "am", "ao", "aq", "ar", "as", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "bj", "bl", "bm", "bn", "bo", "bq", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cu", "cv", "cw", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "er", "es", "et", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gb-eng", "gb-nir", "gb-sct", "gb-wls", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", "gq", "gr", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "me", "mf", "mg", "mh", "mk", "ml", "mm", "mn", "mo", "mp", "mq", "mr", "ms", "mt", "mu", "mv", "mw", "mx", "my", "mz", "na", "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "ps", "pt", "pt", "pw", "py", "qa", "re", "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "ss", "st", "sv", "sx", "sy", "sz", "tc", "td", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", "to", "tr", "tt", "tv", "tw", "tz", "ua", " ug", "um", "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws", "xk", "ye", "yt", "za", "zm", "zw" 
] #List of all flags
    
suffix_R="png #1"
suffix_L="png"
    
def ui_callsign(image, flag_var, vis_var, name_var, callsign_var):
    image.undo_group_start()
    flag_searched=flag_list[flag_var]
    for layer in image.layers:
        print "Processing %s" % layer.name
        tokens=layer.name.split(".",1) # Split on "."
        if len(tokens)!=2:
            print "No dot"
            continue # Not dot in name, ignore other layers
        flag,suffix=tokens
        if flag not in flag_list:  
            print "Not a known flag"
            continue # Ignore other layers
        if flag==flag_searched and suffix==suffix_R:  # Requested flag and on the right 
            print "Recognized"
            layer.visible=True
        else:
            print "%s!=%s or %s!=%s" % (flag,flag_searched,suffix,suffix_R)
            layer.visible=False
    image.undo_group_end()
    return

register(
    "python_fu_ui_callsign",
    "Enter Name, Callsign and Flag selection",
    "Let's you easily change Name, Callsign and Flag on DCS Livery"
    "David Buergel", "David Buergel", "2022",
    "Ui Callsign",
    "Ui Callsign",
    "*",
    [
        (PF_IMAGE, "image", "takes current image", None),
        (PF_OPTION, "flag_var", "Flag", 0,flag_list),
        (PF_RADIO, "vis_var", "Vis", "vis_value",
            (
                ("High Vis", "high_vis_value"),
                ("Low Vis", "low_vis_value")
            )
        ),
        (PF_TEXT, "name_var", "Name", "enter Name"),
        (PF_TEXT, "callsign_var", "Callsign", "enter Callsign")
        
    ],
    [],
    ui_callsign, menu="<Image>/Test")

main()