【FreeCAD初心者ガイド】FreeCAD付属のmatplotlibを使って3次元モデリングに便利なプロトタイプ関数を思索する


※ 当ページには【広告/PR】を含む場合があります。
2023/10/06
【FreeCAD使い方講座】翼形状をスクリプトで生成する〜Pythonコンソールの使い方③
【FreeCAD使い方講座】FreeCADのmatplotlibを使ってGyroid関数を3次元プロットしてみる
蛸壺の中の工作室|FreeCAD付属のmatplotlibを使って3次元モデリングに便利なプロトタイプ関数を思索する



3Dモデリング中やその他諸々の工学系の研究等で、関数形状を描画して確認したい場合、かつて(大昔?)は「gnuplot」や「matlab」が主流でしたが、現在は「matplotlib」を使う機会も多くなりました。
とはいえ、matplotlibを使えるようにpython周りを一からセットアップするのは、少々手間のかかる作業です。
FreeCADでは標準で「numpy」や「Scipy」といった高度数値計算ライブラリだけでなく、matlabライクな高機能関数プロッター・
「matplotlib」 を使うことができます。
また、2次元グラフ限定ではあるものの、ラベルやレジェンドなどをGUIからちょこっと変更したい場合に便利な
「Plot」ワークベンチ というものも外部ワークベンチとして提供されています。

参考|Plot Workbench

今回はFreeCADだけで、matplotlibをどんな感じに使えるかを軽い事例で紹介していきます。


FreeCADでmatplotlibを使うための基本操作



FreeCADでmatplotlibを使うとはいっても、特別な操作をする必要はありません。
他のスクリプト同様、「pythonスクリプト」を使いながらパスや座標点などの計算を行うことで作図が可能になります。
下の図は一連のpythonスクリプトの作成の流れを示しています。
1202x641
合同会社タコスキングダム|蛸壺の技術ブログ


まず、メニューから
[マクロ] を選ぶか、メモ帳のようなアイコンをクリックして、 [マクロの実行] ダイアログを呼び出します。
次にユーザーマクロ(ユーザーが自由に登録できるマクロ)に新しいマクロ(Pythonスクリプト)を登録します。
ちなみにユーザーマクロのファイルの置き場所は
[ユーザーマクロの場所] から任意のフォルダを登録することができます。

[作成] ボタンから新規で作成したいファイル名を入力し、 [OK] を押すとFreeCAD上でpythonスクリプトが編集できるようになります。
では手始めに以下の正弦関数を描くだけのスクリプトを試してみます。

            import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.sin(x)

plt.plot(x,y)
plt.show()

        

スクリプトを保存し、実行ボタン(緑色の三角アイコン)を押すと、
986x651
合同会社タコスキングダム|蛸壺の技術ブログ


いつのものmatplotlibが使えます。



FreeCADで2次元グラフを描く〜Plotワークベンチ編



FreeCADで2次元グラフを描く場合には、先程も説明したように標準のmatplotlibでも十分機能するのですが、作業がちょっとだけ便利になるかもしれない
「Plotワークベンチ」 を導入しておきましょう。

Plotワークベンチのインストール



このブログではおなじみの「アドオンマネージャ」からインストールできます。
709x228
合同会社タコスキングダム|蛸壺の技術ブログ


711x609
合同会社タコスキングダム|蛸壺の技術ブログ


ワークベンチのインストール後に、FreeCADを再起動するとPlotワークベンチが利用できるようになっています。
491x165
合同会社タコスキングダム|蛸壺の技術ブログ

Plotワークベンチを利用して関数を描画する



Plotワークベンチも基本的には、Pythonマクロからpythonスクリプトを呼び出して利用することができます。
先程のようなPythonマクロから作図する方法でも良いのですが、ここでは少しやり方を変えて、FreeCAD標準のpythonコンソールからmatplotlibを扱う手法で2次元グラフを作ってみましょう。
まずFreeCADのGUIウィンドウの一つである「Pythonコンソール」を表示させましょう。
645x407
合同会社タコスキングダム|蛸壺の技術ブログ


まだ表示されていなければ
[表示] > [パネル] > [Pythonコンソール] でpythonコンソールを表示させて、ここから対話的に簡単な関数を描画させてみます。
二次元グラフを描く場合、matplotlibのラッパーモジュールである「Plot」モジュールを使うと少し楽に作図できます。


            from FreeCAD.Plot import Plot

        

なおFreeCADv0.20より以前のバージョンでは、

            from freecad.plot import Plot

        

となって名前空間の呼び出しが少し違います。
試しに2点間の直線を描画させてみましょう。

            Plot.plot([0, 1], [0, 2])

        

すると、FreeCADの画面上で、
990x597
合同会社タコスキングダム|蛸壺の技術ブログ


対話的にmatplotlibによるグラフの描画できていることがわかります。
プロットの再描画や消去を行いたい場合、表示されているページを閉じるだけです。 左下の
plot☓ をクリックすることで気に入らないグラフページを消去できます。
もう少し対話的な手法で、Plotワークベンチの機能をいくつか試してみましょう。

Plotワークベンチでグラフを装飾する



Plotワークベンチは主に、作図した2次元グラフのちょっとした見栄えをGUIから修正するためのツールです。

            from FreeCAD.Plot import Plot
import numpy as np
t = np.linspace(0, 1, 101)
s = np.sin(2.0*np.pi*t)
c = np.cos(2.0*np.pi*t)
Plot.plot(t,s)
Plot.plot(t,c)

        

というようにシンプルな関数の作図ができました。
979x530
合同会社タコスキングダム|蛸壺の技術ブログ


とはいえ、何も設定しなければ軸のキャプションもなければ、スケールの調整もしていない状態です。
ここからpythonコードでゴリゴリと設定を書いていっても良いですが、ちょっとした修正をサッとスマートに済ませることができます。
1000x648
合同会社タコスキングダム|蛸壺の技術ブログ


主に4つのツールがGUI的にグラフを編集でき、

            1. 横軸/縦軸の表示範囲を調整
2. ブロットの線種・点種・配色
3. ラベル(タイトル・x軸・y軸)の文字・フォントサイズ
4. ラベル・レジェンドの表示位置を修正

        

が可能です。


FreeCADで3次元グラフを描く



FreeCAD中のmatplotlibでも当然ながら3次元グラフに対応しています。
むしろFreeCAD内のmatplotlibを利用したいケースのほとんどは、おそらく計算後のデータ点の確認のために3次元グラフとして視覚化したいという目的で使われると思います。
例えば、円筒座標系で簡単な直方体を描いてみましょう。

            from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection="3d")

z = np.linspace(0, 10, 2)
theta = np.linspace(-np.pi, np.pi, 5)
Theta, Z = np.meshgrid(theta, z)

r0 = 10
X = r0 * np.cos(Theta)
Y = r0 * np.sin(Theta)

ax.plot_wireframe(X, Y, Z, color='darkblue')

plt.show()

        

これをpythonマクロで実行すると、
439x468
合同会社タコスキングダム|蛸壺の技術ブログ


この直方体を、分割数を増やして円筒に変形させてみましょう。

            from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection="3d")

z = np.linspace(0, 10, 5)
theta = np.linspace(-np.pi, np.pi, 100)
Theta, Z = np.meshgrid(theta, z)

r0 = 10
X = r0 * np.cos(Theta)
Y = r0 * np.sin(Theta)

ax.plot_wireframe(X, Y, Z, color='darkblue')

plt.show()

        

だいたい円周を100等分くらいしたら円筒に見えると思います。
450x481
合同会社タコスキングダム|蛸壺の技術ブログ


こういった3DCAD上での関数計算的な手法でモデリングできるのは、「パラメトリック」を謳うFreeCADの大きな利点の一つと言えるでしょう。


まとめ



今回はFreeCADでmatplotlibを操作する方法について紹介してみました。
matplotlib、numpy、scipyをPythonマクロとして使いこなすことができれば、FreeCADでのモデリングの表現能力も格段に向上します。
色々とPythonスクリプトの組み立てになれながら、FreeCADのテクニックをより深めていきましょう。