[効率化検討]ユニット画像の製作(8/E)

つづき

9.プログラムソース

(1)プログラムソースを最後に示す(長いので)。

(2)プログラムの考え方メモ

 (A)画像を製作するユニットに条件を付ける。

   表画像が未作成、且つ移動力が空白でないこととする。

  これは、移動力の有無で製作の有無を制御する為である。

  指揮官、砲兵、騎兵を含めて、個別に製作するので、製作の

  有無を選択出来る機能は必要である。

 (B)製作参照情報のインデックスは、軍団番号とする。

   10以上はaからmの表記とし、インデックスに変換する場合は、

  コードポイントを使う。なお、jからm(更に必要ならd,e,f)は個々の

  ゲームに固有な軍団・部隊略号に使う。

 (C)ユニットの部隊番号は、連隊と大隊では種類が異なる。

   処理の面では、表示位置の変数は同じとして内容を変えるようにする。

(3)プログラムソースの登録フォルダは、下記である。

   ・C:\Users\(ユーザー名)\AppData\Roaming\GIMP\2.10\plug-ins

10.その他

 今後は指揮官、砲兵、騎兵、および他の国のユニット用のプログラムを作る予定である。

なお、基本的な考え方は同じで対応できると思うので、内容は記載しない。

 

<個人的な感想>

 フランス軍歩兵の標準ユニット画像を自動製作できるようになったので、

良かった。途中では苦戦したが、何とか目標を達成できた。それで、今後の

製作も完成できると信じている。

 

<リンク>

ブログのトップページは、こちら

バタイユゲーム情報班のホームページは、こちら

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gimpfu import *
import os
import csv
import re
import time
def plugin_main(image, layer):
gimp.message("Hello French Infantry")
#ファイル保存
save_files(image, layer)
def save_file(image, layer, file_name):
file_path = "D:/WORK/temp/working/gimp_python/"+file_name
#画像を保存
new_image = pdb.gimp_image_duplicate(image)
layer = pdb.gimp_image_merge_visible_layers(new_image, CLIP_TO_IMAGE)
pdb.file_jpeg_save(image, layer, file_path, file_path, 1.0, 0, 0, 0, 0, 0, 0, 0, 0)
def save_files(image, layer ):
with open(r'D:\WORK\temp\BatailleWK\UnitInfo_1805Shoen_Frtest.csv', 'r') as f:
rearid = csv.reader(f)
datax=[i for i in rearid]
f.close()
with open(r'D:\WORK\temp\BatailleWK\UnitImg_ref.csv', 'r') as f:
rearid = csv.reader(f)
datay=[i for i in rearid]
f.close()
belt_color=''
disp_layer=''
imax=len(datax)
for i in range(1,imax):
if datax[i][6]=='' and datax[i][10]!='':
deckname=datax[i][8]
xfiles=re.search('Fr.*ch(.*)_(.*)',deckname)
corps_no=xfiles.group(1)
div_no=xfiles.group(2)
file_C=corps_no.zfill(2)
if belt_color=='':
corps_cpoint=ord(corps_no) #コードポイントに変換
if corps_cpoint>57: #'9'よりも大きいか
cidy=corps_cpoint-86 #'a'のコードポイントが97。それを基にUnitImg_refファイルのアドレスを計算。
else:
cidy=corps_cpoint-47
wpointer=int(datay[cidy][0])
color_r=int(datay[cidy][2])
color_g=int(datay[cidy][3])
color_b=int(datay[cidy][4])
corps_str=datay[cidy][5]
color_change(image, layer, color_r, color_g, color_b)
belt_color='done'
name_x=re.search('(.*) [R|r]eg',datax[i][0])
if name_x is not None:
unit_type='r'
reg_wk=name_x.group(1)
bnregno=re.sub('[^0-9]',"",reg_wk) #実際は連隊番号
regdivno=div_no #実際は師団番号
divcorno=corps_str #実際は軍団番号(ローマ数字)
else:
unit_type='b'
xfiles=re.search('(.*)/(.*)',datax[i][0])
bnregno=xfiles.group(1) #実際は大隊番号
reg_wk=xfiles.group(2)
regdivno=re.sub('[^0-9]',"",reg_wk) #実際は連隊番号
divcorno=div_no #実際は師団番号
if unit_type=='r':
if disp_layer != 'reg':
a_layer = pdb.gimp_image_get_layer_by_name(image, "大隊記号")
pdb.gimp_item_set_visible(a_layer, 0)
a_layer = pdb.gimp_image_get_layer_by_name(image, "連隊記号")
pdb.gimp_item_set_visible(a_layer, 1)
disp_layer ='reg'
else:
if disp_layer != 'bn':
a_layer = pdb.gimp_image_get_layer_by_name(image, "大隊記号")
pdb.gimp_item_set_visible(a_layer, 1)
a_layer = pdb.gimp_image_get_layer_by_name(image, "連隊記号")
pdb.gimp_item_set_visible(a_layer, 0)
disp_layer ='bn'
a_layer = pdb.gimp_image_get_layer_by_name(image, "所属師団")
text=divcorno
pdb.gimp_text_layer_set_text(a_layer,text)
a_layer = pdb.gimp_image_get_layer_by_name(image, "連隊・大隊No")
reg_len=len(regdivno)
if reg_len<3:
regnos="{:>4}".format(regdivno)
else:
regnos=regdivno
bn_len=len(bnregno)
if bn_len<3:
bnnos="{:>2}".format(bnregno)
else:
bnnos=bnregno
text=regnos+" "+bnnos
pdb.gimp_text_layer_set_text(a_layer,text)
a_layer = pdb.gimp_image_get_layer_by_name(image, "戦力・移動力")
stno=datax[i][5]
st_len=len(stno)
if st_len<2:
stnos="{:<2}".format(stno)
else:
stnos=stno
speedno=datax[i][10]
sp_len=len(speedno)
if sp_len<2:
speednos="{:>2}".format(speedno)
else:
speednos=speedno
text=stnos+"-"+speednos
pdb.gimp_text_layer_set_text(a_layer,text)
wpointer +=1
wpointer_str=str(wpointer)
file_no=wpointer_str.zfill(2)
file_namep ="F"+ file_C+ file_no
file_name=file_namep+ ".jpg"
save_file(image, layer, file_name)
datax[i][6]=file_namep
time.sleep(2) #セーブ時間を考慮して、少し待つ
datay[cidy][0]=wpointer
with open(r'D:\WORK\temp\BatailleWK\UnitInfo_1805Shoen_Frtest.csv', 'wb') as f:
rearid = csv.writer(f)
rearid.writerows(datax)
f.close()
with open(r'D:\WORK\temp\BatailleWK\UnitImg_ref.csv', 'wb') as f:
rearid = csv.writer(f)
rearid.writerows(datay)
f.close()
def color_change(image, layer, color_r, color_g, color_b ):
a_layer = pdb.gimp_image_get_layer_by_name(image, "コート・ズボン")
color_to_edit = (170, 170, 170) #this is an RGB value without alpha channel
#部品にalpha channelが含まれる場合は、上記と下記の第4パラメータに255を指定する。
#また、この場合、下記のgimp_drawable_set_pixel関数の第4パラメータを4に変更する。
new_color = (color_r, color_g, color_b) #the new color
for i in range(100):
for j in range(100):
num_channels, pixel = pdb.gimp_drawable_get_pixel(a_layer, i, j)
if all([p == q for p, q in zip(pixel, color_to_edit)]):
pdb.gimp_drawable_set_pixel(a_layer, i, j, 3, new_color)
pdb.gimp_displays_flush() #this will update the image.
register(
"python_fu_Frinf",
"image save test",
"Save image file",
"am",
"am",
"2019/12/18",
"<Image>/Filters/Languages/Python-Fu/Frinf",
"RGB*, GRAY*",
[],
[],
plugin_main)
main()
view raw Frinf.py hosted with ❤ by GitHub