【FreeCAD初心者ガイド】FreeCAD付属のmatplotlibを使って3次元モデリングに便利なプロトタイプ関数を思索する
※ 当ページには【広告/PR】を含む場合があります。
2023/10/06

3Dモデリング中やその他諸々の工学系の研究等で、関数形状を描画して確認したい場合、かつて(大昔?)は「gnuplot」や「matlab」が主流でしたが、現在は「matplotlib」を使う機会も多くなりました。
とはいえ、matplotlibを使えるようにpython周りを一からセットアップするのは、少々手間のかかる作業です。
FreeCADでは標準で「numpy」や「Scipy」といった高度数値計算ライブラリだけでなく、matlabライクな高機能関数プロッター・
また、2次元グラフ限定ではあるものの、ラベルやレジェンドなどをGUIからちょこっと変更したい場合に便利な
今回はFreeCADだけで、matplotlibをどんな感じに使えるかを軽い事例で紹介していきます。
FreeCADでmatplotlibを使うための基本操作
FreeCADでmatplotlibを使うとはいっても、特別な操作をする必要はありません。
他のスクリプト同様、「pythonスクリプト」を使いながらパスや座標点などの計算を行うことで作図が可能になります。
下の図は一連のpythonスクリプトの作成の流れを示しています。
1202x641

まず、メニューから
[マクロ]
[マクロの実行]
次にユーザーマクロ(ユーザーが自由に登録できるマクロ)に新しいマクロ(Pythonスクリプト)を登録します。
ちなみにユーザーマクロのファイルの置き場所は
[ユーザーマクロの場所]
[作成]
[OK]
では手始めに以下の正弦関数を描くだけのスクリプトを試してみます。
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ワークベンチのインストール
このブログではおなじみの「アドオンマネージャ」からインストールできます。
709x228

711x609

ワークベンチのインストール後に、FreeCADを再起動するとPlotワークベンチが利用できるようになっています。
491x165

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

まだ表示されていなければ
[表示] > [パネル] > [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のテクニックをより深めていきましょう。