paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

pythonで自宅ネットワーク構成図に凡例を追加する

自宅環境の構成図を作るときに使ってるnwdiagもこなれてきて、色もつけられるようになりました。

f:id:paloma69:20191124162752p:plain

でもこうなってくると構成図に必要なものが出てきます。

凡例ですね。

私は

  • 灰色: 故障中
  • 水色: 未構築

を表したいのですが、これだけだと他の人がわかりませんね。
(別に困る人はいませんが)


画像編集で手動で追加してもいいんですが、ここはpythonでさくっと追加できる様にしましょう。

前回なるべくUNIXコマンドでやろうと決意したばかりですが、
画像処理は難しいので勘弁してpython使わせてください。

Pillowモジュール

なぜpythonでやろうと思ったかというと、以前読んだ「退屈なことはpythonにやらせよう」の画像処理の章を思い出したからです。

Pillowモジュールを使って図形の作成、別の画像の貼り付け、文字の追加などができます。
凡例を追加するのにぴったりですね。

nwdiagをインストールしたら依存関係で一緒にインストールされたと思います。

コード

いきなりですが、コードはこんな感じ。

凡例といえばサンプル図形と文字のセットなので、座標指定で図形の描画も行います。
右上に凡例を追加したいので、画像サイズを変数に入れてから描画したい位置まで座標を減らしています。

pythonでの指定ですが、他と一緒かもしれませんが
一番左上が(0, 0)で一番右下が画像のサイズ(400x300など)になります。

  • addledend.py

作成済みの「homelab.png」という構成図ファイルの右上に凡例を付けて
「legend_homelab.png」という名前で保存するスクリプトです。

from PIL import Image, ImageDraw

filename = 'homelab.png'

legend = """\
Out of service
Not built
"""

diag = Image.open(filename)

width, height = diag.size

# Setting rectangle position
start_x = width - 110
end_x = width - 120
start_y = 0
end_y = 10

draw = ImageDraw.Draw(diag)

# Add legend in top right
# end x, end y, start x, start y
draw.rectangle((end_x, end_y, start_x, start_y), fill='lightgray')
draw.rectangle((end_x, end_y + 15 , start_x, start_y + 15), fill='lightblue')

draw.text((width - 100 ,0), legend, fill='black')

diag.save('_'.join(['legend', filename]))

実行

C:\Users\masashi\python\nwdiag> python .\addledend.py

これだけ。
作成されたファイルを開きます。

f:id:paloma69:20191214182312p:plain

あれ、追記できたけど小さい。

フォント周りもいじれますので書き直します。
(ImageFontモジュールを追加)

ついでに構成図と同じフォントを使おうと思いますので
指定のためにosモジュールを追加します。

また、文字も大きくしますので、図形の位置も変更します。

from PIL import Image, ImageDraw, ImageFont
import os

filename = 'homelab.png'

legend = """\
Out of service
Not built
"""

diag = Image.open(filename)

width, height = diag.size

# Setting rectangle position
start_x = width - 210
end_x = width - 230
start_y = 5
end_y = 15

# Setting font
RictyFont = ImageFont.truetype(os.path.abspath('C:\Windows\Fonts\RictyDiminished-Regular.ttf'), 18)

draw = ImageDraw.Draw(diag)

# Add legend in top right
# Order: end x, end y, start x, start y
draw.rectangle((end_x, end_y, start_x, start_y), fill='lightgray')
draw.rectangle((end_x, end_y + 20 , start_x, start_y + 20), fill='lightblue')

draw.text((width - 200 ,0), legend, fill='black', font=RictyFont)

diag.save('_'.join(['legend', filename]))

再実行

f:id:paloma69:20191214182402p:plain

構成図ともう少し近づかせたいですが、まあいいでしょう。

visioとかで構成図を書くのも嫌いではないのですが、
コードを書くだけでそこそこのものができるようになってきましたね。
こりゃ楽だ。

むすび

画像の処理だと座標が重要になってくるのですが、
文字と図形の位置をいい感じに持ってくるのが非常に大変でした。
この記事ではコード一発ですが、書くまでに座標を結構チューニングしました。

いつもpythonでやってるのはテキスト処理系だけなのですが、
今回の件で画像処理もなんとなく使えるようになりましたね!
実際の業務では画像処理はほとんどやらないので使いどころは何ともですが…

今回は行いませんが、nwdiagとこのpythonファイルを一度に実行するスクリプトも作ろうと思います。

自宅構成図はGithubで随時更新しています。

github.com

参考サイト

nwdiagはこちら

nwdiagで自宅ネットワーク構成図を自動アップデート - paloma blog