お世話になっているオープンソースソフトウェアの備忘録的ブログ

いつもお世話になっているオープンソースソフトウエアの備忘録です。ご利用に際しましては「このブログについて」をご覧くださいませ。

Python-Fuでコードを書く(main01.py) ―「Inkscape」と「GIMP」で万年カレンダーを作る(その4)

以下、コードです。名前は「main01.py」としていますが、こちらは「Python-Fu」のコンソールにコピペする方ですので、名前は何でも良いです。
では、大変ですが以下コピーしてお使いください。(何かうまいファイルの配布方法が有れば良いのですが・・・)

# Ver01-24011

import os, sys, datetime
# ver01 = sys.version
# print (ver01) #> 2.7.18 (default, Jul  1 2023, 20:56:56)  [GCC 13.1.0 64 bit (AMD64)]

# 年月
NENGETU01 = (2024,1)
# 年月の表示位置x-y
NENGETU_POS01 = (50,50)
# 年月の高さ
NENGETU_HEIGHT01 = 50

# 曜日の表示位置x-y、高さ
YOUB_POS01 = (80,580,30)

# 数字の配置範囲
SUUJI_POS01 = (63,640,100,670)
# 文字の配置位置
MOJI_POS01 = (48,682)
# ワンポイントの配置範囲
POINT_POS01 = (110,650,140,680)

# 枠のサイズ
WAKU_SIZ01 = (100,76.7)

# 数字の属性(前後月の透過率):前後月を非表示にするときはゼロに
SUUJI_ZOKU01 = (50,)
# 週開始曜日(月曜日=0、日曜日=6)
SYUU_START01 = 6
# 文字の属性(フォント名、フォントサイズ)
MOJI_ZOKU01 = ("Sans",10)
# MOJI_ZOKU01 = ("IPAexGothic",10)

# 年月の文字
MOJI_NEN01, MOJI_TUKI01 = "nen01.png", "tuki01.png"

# ファイルの置き場所
DIR01 = "D:\calender01"

# 記念日:月日、文言、ワンポイントのpng画像(だいたい正方形のpng)
KINENBI01 = (
    100,5,"この行は消さないでね!","",
    1,1,"","gantan.png",
    1,12,"結婚記念日","tan_b01.png",
    1,15,"花子誕生日","hana01.png",
    1,16,"かすみ誕生日","tan.png",
    2,25,"太郎誕生日","",
    )

# 背景になる画像ファイル
F_BACK01 = os.path.join(DIR01,"calender01.png")
# 出力するxcfファイル名:例:Calender202401.xcfとか
F_OUT01 = os.path.join(DIR01,"Calender%d%02d.xcf" % (NENGETU01[0], NENGETU01[1]))

################# 設定ここまで ####################

# 設定を辞書にまとめる
CONF01 = dict(NENGETU01 = NENGETU01,NENGETU_POS01 = NENGETU_POS01,
            NENGETU_HEIGHT01 = NENGETU_HEIGHT01, YOUB_POS01 = YOUB_POS01,
            SYUU_START01 = SYUU_START01, SUUJI_POS01 = SUUJI_POS01,
            SUUJI_ZOKU01 = SUUJI_ZOKU01, MOJI_POS01 = MOJI_POS01, WAKU_SIZ01 = WAKU_SIZ01,
            POINT_POS01 = POINT_POS01, MOJI_ZOKU01 = MOJI_ZOKU01,
            MOJI_NEN01 = MOJI_NEN01, MOJI_TUKI01 = MOJI_TUKI01,
            DIR01 = DIR01, KINENBI01 = KINENBI01)

sys.path.append(DIR01)
import date_prc01 # 日付関係の処理(別ファイル)

# ファイル関係の作成など。
img_back01 = pdb.gimp_file_load(F_BACK01, "")
tmp01 = pdb.gimp_image_get_active_drawable (img_back01)
pdb.gimp_xcf_save(0,img_back01, tmp01, F_OUT01, F_OUT01)
XCF_OUT01 = pdb.gimp_xcf_load(0,F_OUT01,F_OUT01) # 出力するxcfを読み込み

img_num01 = [] # 数字の画像を格納する配列
img_wed01 = [] # 曜日の画像を格納する配列

# 数字の画像(d01.pngとか)を配列に格納する関数
def kakunou01():
    for i in range (10):
        in_f_nam01 = "d%02d.png" % i
        img_tmp01 = os.path.join(DIR01,in_f_nam01)
        img_num01.append(pdb.gimp_file_load(img_tmp01, ""))
    for i in range (7):
        in_f_nam01 = "wd%02d.png" % i
        img_tmp01 = os.path.join(DIR01,in_f_nam01)
        img_wed01.append(pdb.gimp_file_load(img_tmp01, ""))

# 日付の数字のレイヤーを準備する関数
def lay_from_num01(i_num01, i_num02, month01, day01):

    i_width_num01 = pdb.gimp_image_width(i_num01)
    i_height_num01 = pdb.gimp_image_height(i_num01)
    
    i_width_num02 = pdb.gimp_image_width(i_num02)
    i_height_num02 = pdb.gimp_image_height(i_num02)
    
    if day01 >9:# 2つのを画像を1つにくっつけ名前を付ける
        
        lay01_act01 = pdb.gimp_layer_new_from_visible(i_num01,XCF_OUT01, "D%02d%02d" % (month01, day01))
        pdb.gimp_image_insert_layer(XCF_OUT01,lay01_act01,None,-1)
        
        lay01_act02 = pdb.gimp_layer_new_from_visible(i_num02,XCF_OUT01, "tmp01")
        pdb.gimp_image_insert_layer(XCF_OUT01,lay01_act02,None,-1)
        
        takasa01 = (i_height_num01 - i_height_num02)/2 # 高さ調整
        
        pdb.gimp_layer_set_offsets(lay01_act02, i_width_num01, takasa01)
        ret_layer01 = pdb.gimp_image_merge_down(XCF_OUT01, lay01_act02, 0)
        
    else:# 1つ目の画像はゼロなので無視。2桁分の空のレイヤーを作ってくっつけ名前を付ける
        
        lay01_act01 = pdb.gimp_layer_new(XCF_OUT01, i_width_num02*2, 
                      i_height_num02, 1, "D%02d%02d" % (month01, day01), 100, 0)
        #layer = pdb.gimp_layer_new(image, width, height, type, name, opacity, mode)
        
        pdb.gimp_image_insert_layer(XCF_OUT01,lay01_act01,None,-1)
        lay01_act02 = pdb.gimp_layer_new_from_visible(i_num02,XCF_OUT01, "tmp01")
        pdb.gimp_image_insert_layer(XCF_OUT01,lay01_act02,None,-1)
        takasa01 = 0 # 高さ調整(ダミー)
        
        pdb.gimp_layer_set_offsets(lay01_act02, i_width_num02/2, takasa01)
        ret_layer01 = pdb.gimp_image_merge_down(XCF_OUT01, lay01_act02, 0)
        
    return ret_layer01

# 文字の配置範囲(pos01)に押し込み日付を表示する関数
def lay_put_num01(CONF01):
    waku01 = list(date_prc01.make_waku01(CONF01))
    #枠に数字と文字を入れていく
    for l01 in waku01: # 1行づつ読んでl01に入れる(=一枠ずつ入れていく)
        
        month01 = l01["calender_month01"]
        day01 = l01["calender_day01"]
        opacity01 = l01["opacity01"]
        
        # 日にちの関係
        num_2keta = int(day01/10)
        num_1keta = day01 - num_2keta * 10
        
        layer_tmp01 = lay_from_num01(img_num01[num_2keta], img_num01[num_1keta] ,month01,day01)
        
        pdb.gimp_item_transform_scale(layer_tmp01, l01["suu_up_x01"], l01["suu_up_y01"],l01["suu_dw_x01"],l01["suu_dw_y01"])
        pdb.gimp_layer_set_opacity(layer_tmp01, opacity01)
        
        if l01["day_red01"] == True: #日曜日と祝日
            pdb.gimp_drawable_color_balance(layer_tmp01, 0, FALSE, 100, 0, 0) # 赤は1番目
        elif l01["day_blue01"] == True: #土曜日
            pdb.gimp_drawable_color_balance(layer_tmp01, 0, FALSE, 0, 0, 100) # 青は3番目
            
        # 文字の関係
        txt_tmp01 = l01["syukujitu_bun01"] + l01["kinenbi_bun01"]
        if len(txt_tmp01) > 0:
            text_layer01 = pdb.gimp_text_fontname(XCF_OUT01, None, l01["moji_x01"],l01["moji_y01"],
            txt_tmp01, 1, TRUE, MOJI_ZOKU01[1], 0, MOJI_ZOKU01[0])
            pdb.gimp_text_layer_resize(text_layer01, WAKU_SIZ01[0], MOJI_ZOKU01[1]*2)
            pdb.gimp_text_layer_set_justification(text_layer01, 2)
            
            if l01["kinenbi_png01"] <> "":
                img_tmp02 = os.path.join(DIR01,l01["kinenbi_png01"])
                layer_tmp02 = pdb.gimp_file_load_layer(XCF_OUT01, img_tmp02)
                pdb.gimp_image_insert_layer(XCF_OUT01,layer_tmp02,None,-1)
                pdb.gimp_item_transform_scale(layer_tmp02, l01["point_up_x01"], l01["point_up_y01"],l01["point_dw_x01"],l01["point_dw_y01"])

# 曜日の表示
def print_week01(CONF01):
    
    kd01 = CONF01["SYUU_START01"] # 週の初めの曜日
    
    for i in range(7):
        i_wek01 = img_wed01[kd01]
        i_width_wek01 = pdb.gimp_image_width(i_wek01)
        i_height_wek01 = pdb.gimp_image_height(i_wek01)
        
        lay01_act01 = pdb.gimp_layer_new_from_visible(i_wek01,XCF_OUT01, "wd%02d" % kd01)
        pdb.gimp_image_insert_layer(XCF_OUT01,lay01_act01,None,-1)
        
        rate01 = float(float(CONF01["YOUB_POS01"][2])/i_height_wek01)
        scale_x01, scale_y01 = rate01, rate01
        source_x01, source_y01 = i_width_wek01/2, i_height_wek01/2
        
        dest_x01 = CONF01["YOUB_POS01"][0] + CONF01["WAKU_SIZ01"][0]*i + i_width_wek01*rate01/2
        dest_y01 = CONF01["YOUB_POS01"][1] + i_height_wek01*rate01/2
        
        lay_wek_f010 = pdb.gimp_item_transform_2d(lay01_act01, source_x01, source_y01, scale_x01, scale_y01, 0, dest_x01, dest_y01)
        
        if kd01 >= 6:
            kd01 = 0
        else:
            kd01 += 1


# 年月の表示
def print_nen_getu01(CONF01):
    
    nen_tmp01 = CONF01["NENGETU01"][0]
    nen_keta4 = nen_tmp01//1000
    nen_keta3 = (nen_tmp01 - nen_keta4*1000)//100
    nen_keta2 = (nen_tmp01 - nen_keta4*1000 - nen_keta3*100)//10
    nen_keta1 = nen_tmp01 - nen_keta4*1000 - nen_keta3*100 - nen_keta2*10
    
    lay_nen01 = lay_from_num01(img_num01[nen_keta4], img_num01[nen_keta3], 99, 11)
    lay_nen02 = lay_from_num01(img_num01[nen_keta2], img_num01[nen_keta1], 99, 22)
    
    tuki_tmp01 = CONF01["NENGETU01"][1]
    tuki_keta2 = int(tuki_tmp01/10)
    tuki_keta1 = int(tuki_tmp01 - tuki_keta2*10)
    
    lay_tuki01 = lay_from_num01(img_num01[tuki_keta2], img_num01[tuki_keta1], 99, tuki_tmp01)
    
    tmp01 = os.path.join(CONF01["DIR01"], CONF01["MOJI_NEN01"]) # 年
    moji_nen01 = pdb.gimp_file_load_layer(XCF_OUT01, tmp01)
    pdb.gimp_image_insert_layer(XCF_OUT01,moji_nen01,None,-1)
    
    tmp01 = os.path.join(CONF01["DIR01"], CONF01["MOJI_TUKI01"]) # 月
    moji_tuki01 = pdb.gimp_file_load_layer(XCF_OUT01, tmp01)
    pdb.gimp_image_insert_layer(XCF_OUT01,moji_tuki01,None,-1)
    
    lay_nen_f01 = layer_comb01(lay_nen01, lay_nen02, 1)
    lay_nen_f01 = layer_comb01(lay_nen_f01, moji_nen01, 2)
    lay_nen_f01 = layer_comb01(lay_nen_f01, lay_tuki01, 1)
    lay_nen_f01 = layer_comb01(lay_nen_f01, moji_tuki01, 2)
    
    pdb.gimp_item_set_name(lay_nen_f01, "nengetu01")
    
    l_width_lay01 = pdb.gimp_drawable_width(lay_nen_f01)
    l_height_lay01 = pdb.gimp_drawable_height(lay_nen_f01)
    
    rate01 = float(float(CONF01["NENGETU_HEIGHT01"])/l_height_lay01)
    
    source_x01, source_y01 = l_width_lay01/2, l_height_lay01/2
    scale_x01, scale_y01 = rate01, rate01
    
    dest_x01 = CONF01["NENGETU_POS01"][0] + l_width_lay01*rate01/2
    dest_y01 = CONF01["NENGETU_POS01"][1] + l_height_lay01*rate01/2
    
    lay_nen_f010 = pdb.gimp_item_transform_2d(lay_nen_f01, source_x01, source_y01, scale_x01, scale_y01, 0, dest_x01, dest_y01)

# 二つのレイヤーを一つにまとめ、一番目のレイヤに吸収する。フラグが1の場合は単純にくっつける。
# フラグが1でないの場合は、2番目のレイヤーは縦横比率を保持したまま縮小拡大してくっつける。高さのサイズは一番目のレイヤーに合わせる。
def layer_comb01(arg_lay01, arg_lay02, flg01):
    l_width_lay01 = pdb.gimp_drawable_width(arg_lay01)
    l_height_lay01 = pdb.gimp_drawable_height(arg_lay01)
    l_width_lay02 = pdb.gimp_drawable_width(arg_lay02)
    l_height_lay02 = pdb.gimp_drawable_height(arg_lay02)
    takasa01 = (l_height_lay01 - l_height_lay02)/2
    
    if flg01 <> 1:
        #2番目のレイヤーを縦横比率を保存したまま拡大縮小する。
        ret_width_lay02 = l_width_lay02*l_height_lay01/l_height_lay02
        pdb.gimp_layer_scale(arg_lay02, ret_width_lay02, l_height_lay01, False)
        takasa01 = 0
    
    pdb.gimp_image_raise_item_to_top(XCF_OUT01, arg_lay01)
    pdb.gimp_image_raise_item_to_top(XCF_OUT01, arg_lay02)
    pdb.gimp_layer_set_offsets(arg_lay02, l_width_lay01, takasa01)
    
    ret_layer01 = pdb.gimp_image_merge_down(XCF_OUT01, arg_lay02, 0)
    
    return(ret_layer01)


def main01():
    kakunou01()
    lay_put_num01(CONF01)
    print_week01(CONF01)
    print_nen_getu01(CONF01)

main01()

disp01 = pdb.gimp_display_new(XCF_OUT01)
pass