pythonのテンプレートエンジンを使って簡単に解析入力ファイルを作成する

RESP-Dを始め画面上で操作するプログラムが増えてきたとは言え、入力用のテキストファイルが必要になるタイミングがあります。小規模なモデルでしたら一から書き上げることもできますが、モデルが大きくなってくるとどうしても自分でスクリプトを書きたくなるのではないでしょうか。その際に便利になるテンプレートエンジンについてご紹介したいと思います。

目次

 

テンプレートエンジンとは?

テンプレートエンジンはWebシステム開発でよく使用される技術です。よく下図のようなログインした後、自分のログイン名が表示されるページを見かけることが多いのではないでしょうか。

これは決してユーザーごとにhtmlファイルを用意しているわけではなく、ユーザー認証後の名前をhtmlファイルに割り当てています。
このような動作を可能にする仕組みがテンプレートエンジンと呼ばれます。

例のhtmlファイルを下に示します。

<main> 
{% if name %} 
こんにちは {{ name }} さん 
{% else %} 
{{ message }} 
{% endif %} 
</main>

 

テンプレートエンジンを使用するメリット

なぜこのテンプレートエンジンを使うと便利なのでしょうか。それはテンプレートエンジンを用いることで、テキストファイルの見栄えとオブジェクト操作(プログラム内部で節点や梁などを生成する操作)を分離することができる点にあります。

より具体的には

* 変更しない値はプログラムに組み込む必要がない(テンプレートファイルに書いておけばよい)
* 開発初期段階から完成形のイメージを明確にできる
* テンプレートファイルを複数用意しておけば、同じプログラムをほとんど変更することなく複数種類のテキストファイルを用意できる。

などが挙げられます。

 

プロトタイピング(RESP-F3Tの入力ファイルを作る)

では早速、テンプレートエンジンを用いてプロトタイピングをしてみたいと思います。
サンプルとして弊社のRESP-F3T用の入力ファイルを作ってみたいと思います。あくまでテキストファイルですので、本プログラムを参考に皆さまのご利用目的に沿ってファイル拡張子やその内容は変更ください。
pythonで用いることができるテンプレートエンジンには色々ありますが、今回はjinja2というライブラリを使ってみます。
参考URL: jinja2

 

完成例

モデルを構成するスクリプトも合わせて作る必要がありますので、完成したプログラム全体はGitHubに公開しています。
下記よりご覧いただけます。

テンプレートエンジンによるRESP-F3T解析プログラム作成(全体)

構成としては下図のようです。

まずはテンプレートファイルから解析入力ファイルを作るスクリプトを見てみます。

 

テンプレートファイルから解析入力ファイルを生成するプログラム(main_ftc_maker.ftc)

# -*- coding: utf-8 -*- 
from jinja2 import Environment, FileSystemLoader 
from Modeler.model import ModelManager 

def generate_analysis_file(length_X:float,length_Y:float,span_X:int,span_Y:int): 
    # モデルの生成(サンプル) 
    Manager = ModelManager(trifunc.sin_sin,length_X,length_Y,span_X,span_Y) 
    nodes = Manager.get_nodes_generator() 
    columns = Manager.get_columns_generator(2,2) 
    girders = Manager.get_girders_generator() 

    # テンプレートファイルが配置されているディレクトリの指定 
    env = Environment(loader=FileSystemLoader(("./Template"),encoding="utf-8")) 

    # テンプレートファイル名の指定 
    template = env.get_template("template.ftc") 

    # テンプレートファイルを基に書き込む内容を作成 
    # 辞書のキーはテンプレートファイル内の変数名 
    out = template.render({"Nodes":nodes,"Columns":columns,"Girders":girders}) 

    # ファイルを新規作成し、書き込み 
    with open("./FtcFiles/new_file.ftc","w",encoding="utf-8") as fw: 
        fw.write(out) 

if __name__ == "__main__": 
    #長さX,長さY,長さZ,スパン数X,スパン数Y,スパン数Z 
    length_X = 2000 #mm 
    length_Y = 2000 #mm 
    div_X = 10 
    div_Y = 12 
    generate_analysis_file(length_X,length_Y,div_X,div_Y)

 

テンプレートファイル(template.ftc)


<<< 単位系
InputUnit kN mm 

<<< 材料指定 
Material SS400 E 205 G 79.4 

<<< 断面
Section SC1 Box SS400 H 400 B 400 W 16 F 16 
Section SG1 I-Shape SS400 H 500 B 200 W 9 F 16 

<<< 性能名 
BeamProperty PC1 SC1 
BeamProperty PG1 SG1 

<<< 節点 
{%- for Node in Nodes %} 
Node {{Node.name}} {{Node.Coordinate.X}} {{Node.Coordinate.Y}} {{Node.Coordinate.Z}} 
{%- endfor %} 

<<< 柱 
{%- for Column in Columns %} 
Beam {{Column.name}} PC1 {{Column.NodeI.name}} {{Column.NodeJ.name}} 
{%- endfor %} 

<<< 梁 
{%- for Girder in Girders %} 
Beam {{Girder.name}} PG1 {{Girder.NodeI.name}} {{Girder.NodeJ.name}} 
{%- endfor %} 

今回のプログラムを用いると下図のような複雑な形状の解析モデルも簡単に作成できます。

プログラム解説

以前のプログラムTipsで紹介した事柄は割愛したいと思います。
```if __name__ == "__main__"```の意味やクラスの呼び出し方などは過去の記事をご覧ください。

【プログラムTips】PythonでCSVファイルを固定書式に変換する

 

テンプレートエンジンの設定

テンプレートエンジンであるjinja2の読み込みは以下のように行います。
厳密にはjinja2のライブラリからEnvironmentとFileSystemLoaderだけを読み込んでいます。

from jinja2 import Environment, FileSystemLoader

テンプレートエンジンの設定は主に以下の三行分のコードで完結します。

# テンプレートファイルが配置されているディレクトリの指定 
env = Environment(loader=FileSystemLoader(("./template"),encoding="utf-8")) 

# テンプレートファイル名の指定 
template = env.get_template("template.ftc") 

# テンプレートファイルを基に書き込む内容を作成 
# 辞書のキーはテンプレートファイル内の変数名 
out = template.render({"Nodes":nodes,"Columns":columns,"Girders":girders})

 

最後の行でテンプレートファイルとの対応をとっています。
すなわち、テンプレートファイル上の変数("Nodes","Columns","Girders")にpythonスクリプト上のnodes,columns,girdersを渡しています。

 

テンプレートファイルの書き方

テンプレートファイルの記法はpythonと似通っています。

 

for文の書き方

 

{%- for Column in Columns %}
中略
{%- endfor %}

 

 

```{% %}```で囲った部分にfor文やif文を書くことができます。
だだし、最後に{% endfor %}や{% endif %}で囲う必要があります。

 

改行を消す(WhiteSpaceControl)

前節のコードをよく見ると"%"の前に"-"がついています。
これはWhiteSpace Controlと呼ばれ、改行や空白を削除する処理になります。デフォルトの状態では、for文が回るたびに改行が自動的に入力されてしまいます。それらの改行を削除するために"-"符号を入れています。

 

変数の扱い

変数の値を埋め込みたい場合は、"{{}}"で囲います。

 

{{Column.name}}

 

まとめ

テンプレートエンジンを用いることで、ファイルを生成する仕組みがシンプルで明確になり、保守性に優れたシステムにできることをご紹介しました。今回はRESP-F3T用の入力ファイルを作成しましたが、テキストファイルであればどのようなファイルでも生成できますので、ぜひ皆様がお使いのプログラムに合わせて作ってみてください。

完成したプログラム全体はGitHubに公開しています。下記よりご覧いただけます。
テンプレートエンジンによるRESP-F3T解析プログラム作成(全体)

関連する製品 RESP-F3T

RESP-F3T
3次元フレーム汎用解析プログラム

詳細はこちらから

採用情報

構造計画研究所 RESPチームでは、いっしょに働いていただけるエンジニアを募集しています。
構造設計・構造解析だけでなく、プログラミング技術を活かして新しいものを生み出したいと思っている方、ぜひご応募ください。

採用HPはこちら→https://www.kke.co.jp/recruit/

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です