2024年4月8日月曜日

GIMP 2.99.19 Python 奮闘記 其の壱 基本的なもの

GIMP も いよいよ 3 の時代が すぐ其処! ですね。
でも、旧版で活躍していた スクリプト群 は書き換えが必須。
其のまま では動きません。
なので、トライ!。


LISP(Scheme) を採用する Script-Fu に対して、
Python Script (Python-Fu) は ガラッ と変わっていて、
簡単な手直しで動くと言う訳には行きません。

そのうち、正式なガイドライン が示されるかも?、ですが、
取り敢えず、ウォーミングアップの心算で少し書き出しています。


GIMP 2.99.7 の頃に、少し手を入れたのですが、
其の後、また、変わって来ているので、
暫しの間、傍観していました。
此処に来て、GIMP 3 RC が出て来るのに、そう月日は掛からないでしょう。
ですから、手を入れ出す準備に取り掛かろう!、と。

GIMP 2.99.19 が Nightly で Windows 版にも提供されていますから、
RC1 が来る前に、馴染んで置こうか!、 と。
極端に化ける事も少ない、と踏んでの事です。
変化があるとしても、微細である事を願って、です。

因みに、Python Console で動かす分には、
まだ壁は低い気がします。

問題は GUI 絡み (Dialog) の 記述 が全く異なる点でしょう。
Script には 通常 入力や選択 の GUI が不可欠だから、
避けて通れ無いと思われます。


では、最初に、
基本的な GUI (Dialog) を出す為の トレーニング から。

文字列、実数、整数、真偽 の4項目を受け入れるものを。

此れ等の変数は 極基本的なもの で、
GIMP 独自の機能とは異なる為、
GUI 操作を見るには 打って付け と思われます。

此れ以外の項目も 頻繁に使う事になるのでしょうが、
先ずは、基本を押さえよう、 と。


では、いきなり、Code を。

  素人の 悪足掻き ですから、
  記述が不十分だったり、遠回りだったり、と思った上で、見て下さいね。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Python for GIMP 2.99.19 +

import gi
gi.require_version('Gimp', '3.0')
from gi.repository import Gimp
gi.require_version('GimpUi', '3.0')
from gi.repository import GimpUi
gi.require_version('Gegl', '0.4')
from gi.repository import Gegl
from gi.repository import GObject
from gi.repository import GLib
from gi.repository import Gio

def N_(message): return message
def _(message): return GLib.dgettext(None, message)

import sys

# Procedure 関数(関数名・引数・処理)
def shiro_dialog_args4_test2_api3(procedure, run_mode, image, n_drawables, drawables, config, data):
    Gegl.init(None)    # for Color Handling

    # Pre-Start of proc for GIMP3
    if run_mode == Gimp.RunMode.INTERACTIVE:
       GimpUi.init('python-fu-shiro-dialog-args4-test2-api3')
       dialog = GimpUi.ProcedureDialog.new(procedure, config)

       dialog.fill(None)
    if not dialog.run():
      dialog.destroy()
      return procedure.new_return_values(Gimp.PDBStatusType.CANCEL, GLib.Error())
    else:
      dialog.destroy()

    lyr_name1  = config.get_property('lyr_name1')
    float_val  = config.get_property('float_val')
    int_val    = config.get_property('int_val')
    is_ok      = config.get_property('is_ok')

    # Start
    img = image
    lyr = drawables[0]

    # Message EndWith ¥n : Dialog, WithOut ¥n : ErrorConsole/StatusBar
    Gimp.message("Dialog Args ---------   ¥n" + ¥
               "   image : (id#" + str(img.get_id()) + ")  " + img.get_name() + "     ¥n" + ¥
               "   drawables count : " + str(n_drawables) + "     ¥n" + ¥
               "   layer : (id#" + str(lyr.get_id()) + ")  " + lyr.get_name() + "     ¥n" + ¥
               "   -------------   ¥n" + ¥
               "   lyr_name1 : " + str(type(lyr_name1)) + "  " + lyr_name1 + "     ¥n" + ¥
               "   float_val : " + str(type(float_val)) + "  " + str(float_val) + "     ¥n" + ¥
               "   int_val : " + str(type(int_val)) + "  " + str(int_val) + "     ¥n" + ¥
               "   is_ok : " + str(type(is_ok)) + "  " + str(is_ok) + "     ¥n" + ¥
               ""
              )    
   
    # End of proc for GIMP3
    return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())

class ShiroDialogArgs4Test2Api3 (Gimp.PlugIn):
    ## Parameters ##
    __gproperties__ = {
        "lyr_name1": (str,
                 _("Add Layer Name"),
                 _("Add Layer Name Tooltip"),
                 _("_Test"),
                 GObject.ParamFlags.READWRITE),
        "float_val" : (float,
                 _("Set Double : "),
                 _("Set Double Value Tooltip"),
                 0.0, 100.0, 50.0,
                 GObject.ParamFlags.READWRITE),
        "int_val" : (int,
                 _("Set Integer : "),
                 _("Set Integer Value Tooltip"),
                 0, 100, 30,
                 GObject.ParamFlags.READWRITE),
        "is_ok": (bool,
                 _("  :  Is OK ? "),
                 _("Is OK ?  Tooltip"),
                 False,
                 GObject.ParamFlags.READWRITE),
    }

    ## GimpPlugIn virtual methods ##
    def do_set_i18n(self, procname):
           return True, 'gimp30-python', None

    def do_query_procedures(self):
        return [ 'python-fu-shiro-dialog-args4-test2-api3' ]

    def do_create_procedure(self, name):
        procedure = Gimp.ImageProcedure.new(self, name,
                                          Gimp.PDBProcType.PLUGIN,
                                          shiro_dialog_args4_test2_api3, None)            
        procedure.set_image_types("RGB*");
        procedure.set_sensitivity_mask (Gimp.ProcedureSensitivityMask.DRAWABLE |
                                        Gimp.ProcedureSensitivityMask.DRAWABLES)
        procedure.set_documentation (_("Args In Dialog Test2 4-Args"),
                                     _("Args In Dialog Test2 For GIMP 2.99.19 +"),
                                     name)
        procedure.set_menu_label(_("Dialog Args4 Test2 Api3"))
        procedure.set_attribution("ShiroYuki_Mot",
                                  "Copyright 2024- ShiroYuki_Mot",
                                  "2024/04/05")
        procedure.add_menu_path ("<Image>/Script-Py/Test/")

        # procedure.add_argument_from_property(self, "<<arg_name_n>>") ...
        # Args Order In Dialog
        procedure.add_argument_from_property(self, "lyr_name1")
        procedure.add_argument_from_property(self, "float_val")
        procedure.add_argument_from_property(self, "int_val")
        procedure.add_argument_from_property(self, "is_ok")

        return procedure

Gimp.main(ShiroDialogArgs4Test2Api3.__gtype__, sys.argv)



ざっと、こんな感じ です。


因みに、Dialog と 実行結果 との表示を例示します。



次回以降 は少しずつ項目種類を足す例を紹介したいと思っています。



0 件のコメント:

コメントを投稿