【PyFMI】最小構成のMBD事例 第2章 その118【リアルタイム描画⑫】

【PyFMI】最小構成のMBD事例 第2章 その118【リアルタイム描画⑫】 事例
【PyFMI】最小構成のMBD事例 第2章 その118【リアルタイム描画⑫】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回はtkinterのタイマ処理について確認した。
できてしまえば、それほど難しい実装ではなかった。

残りは以下。

  • 描画関連処理
  • FMU関連処理

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

次は何をする?

太郎くん
太郎くん

前回はタイマ処理の話だったけど
今回はどうする?
描画関連かFMU関連だと思うけど?

フクさん
フクさん

描画の方に行ってみるか。

太郎くん
太郎くん

でもFMU処理が居ないから何を描画したら良いのか・・・。

フクさん
フクさん

まぁダミーのデータを表示すればいいんじゃないかな?

太郎くん
太郎くん

そっか。
適当なsin波とか出してみればいいのか。

タイマハンドラ内で描画処理

フクさん
フクさん

とりあえず、以下のコードを追加してみよう。

def plot_handler():
        if pausebln.get() == False:
            times = np.linspace(time.perf_counter()-8, time.perf_counter(), 800)
            ax.lines[0].set_data( times, np.sin(times) )
            ax.relim()                  # recompute the data limits
            ax.set_xlim(times[0],times[-1])
            canvas.draw()
        
        root.after(200, plot_handler)

plot_handler()

root.mainloop()
太郎くん
太郎くん

前回と同じくタイマ処理をしているようだけど・・・。
afterメソッドを呼ばずにタイマハンドラを直接呼んでるけど、これっていいの?

フクさん
フクさん

まぁタイマ処理が走る前も描画するし、
結果的にその中でもafterメソッドは呼んでいるので、
今回の構成としてはOKだ。

太郎くん
太郎くん

なるほど。

太郎くん
太郎くん

あとは、現時刻を取得して、
そこから8秒前から現在までを800等分した等差数列を時間軸にして、
その時間軸をinputとしてsin波を作ってるのか。

太郎くん
太郎くん

canvas.draw()で実際の描画をしているんだろうけど、
ax.relim()ってなんだ?
初めて見た気がする。

フクさん
フクさん

描画データのリミットを自動調整してくれるmatplotlibのメソッドだね。

太郎くん
太郎くん

あー、なるほど。
自動調整してくれるのは有難い。

チェックボックスの判定

太郎くん
太郎くん

そういえば、if文でなんか判定してるよね?
これはなんだっけ?

フクさん
フクさん

チェックボックスの状態判定だねー。

太郎くん
太郎くん

あ、そっか。
そういえば、puaseを指示するチェックボックスを配置してたね。
ここで判定して、チェックが無ければ実行、チェックがあればスキップってことなのか。

フクさん
フクさん

折角だからチェックボックスが機能していることも確認しておきたかったんで入れておいた。

まとめ

フクさん
フクさん

まとめだよ。

  • タイマ処理にmatplotlibの描画更新処理を入れてみる。
    • 現時刻をベースに過去8秒分の時間軸を生成し、それをsin関数に入れてsin波生成。
    • relimメソッドを使うと縦軸が自動調整される。
  • pauseのチェックボックスを設置していたので、チェック状態を確認して更新するかしないかの判定に使う。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました