☕
FreeCADのPythonスクリプトで反応槽モデルを自動作成
この記事について
本記事では、OpenFOAMによる流体解析で使用するCADモデルの作成方法を紹介します。オープンソースのFreeCADを用いて反応槽を作成する手順を備忘録として残します。
今回は、かねてから考えていたPythonスクリプトを使用して反応槽モデルを作成していきます。FreeCADによるモデリングはまだまだ手探りのところもありますので、アドバイスいただけると助かります。
PythonスクリプトによるCADモデル自動生成
FreeCADは、Pythonスクリプトで完全に制御可能な3D CADソフトウェアです。ユーザーインターフェース、3Dモデル、画面表示など、ほぼすべての機能をPythonから操作できます。
1. 豊富なPython APIで自動化を実現
FreeCADは広範なPython APIを提供しており、GUI操作で行える作業のほぼすべてをスクリプトで自動実行できます。
- パラメータの変更: モデリング履歴を遡ってパラメータを変更し、形状を自動更新。
- 高度な形状処理: ジオメトリエンジン「OpenCASCADE」の機能を活用した複雑な形状計算。
2. マクロ録画機能で簡単に自動化を開始
初心者でも簡単に自動化を始められるよう、マクロ録画機能が用意されています。
- 操作の記録: 「Macro > Macro recording」で録画を開始し、モデリング操作を行うと、その操作がPythonコードとして自動記録されます。
- 再利用と共有: 記録したコードを保存・実行することで、複雑な作業を瞬時に再現できます。作業効率化だけでなく、バグ報告時に問題を正確に伝える手段としても有効です。
今回はPythonスクリプトを直接コンソールに記述(コピー&ペースト)してモデリングしていきます。
反応槽モデル作成
1. 反応槽モデル条件
今回作成を想定している反応槽の条件を以下に示します。反応槽底部は楕円形に設定してあります。
- ID=1.5 [m]
- TL-TL=1.7 [m]
2. Pythonスクリプト実行
メニューバーの表示→パネル→Pythonにチェックを入れることでPythonのコンソールが出現します。

以下にPythonスクリプトを表示します。こちらのコードをコンソールにコピー&ペーストすることで反応槽モデルが作成されます。

reactor_vessel.py
import FreeCAD as App
import Part
from FreeCAD import Base
import math
# 反応槽パラメータ
ID = 1.5 # 内径 [m]
TL = 1.7 # TL間(胴体高さ) [m]
radius = ID / 2
head_height = ID / 4 # 半楕円鏡板高さ
# 新規ドキュメント作成
doc = App.newDocument("ReactorVessel")
# 底部鏡板用の輪郭を作成
# 1. 楕円弧の点列(Z軸から少し離れた位置から開始)
arc_points = []
for i in range(1, 51): # i=0を除外してZ軸上の点を避ける
t = math.pi / 2 * i / 50
x = radius * math.sin(t)
z = head_height * (1 - math.cos(t))
arc_points.append(App.Vector(x, 0, z))
# 2. B-スプラインで楕円弧を作成
ellipse_curve = Part.BSplineCurve()
ellipse_curve.interpolate(arc_points)
arc = ellipse_curve.toShape()
# 3. 閉じた輪郭を構成
# Z軸上の始点から楕円弧始点への直線
line1 = Part.LineSegment(App.Vector(0, 0, 0), arc_points[0]).toShape()
# 楕円弧終点からZ軸上の終点への直線
line2 = Part.LineSegment(arc_points[-1], App.Vector(0, 0, head_height)).toShape()
# Z軸上の直線(閉じるため)
line3 = Part.LineSegment(App.Vector(0, 0, head_height), App.Vector(0, 0, 0)).toShape()
# 4. ワイヤーを作成(閉じた輪郭)
wire = Part.Wire([line1, arc, line2, line3])
# 5. ワイヤーから面を作成
face = Part.Face(wire)
# 6. Z軸周りに回転して立体化
lower_head_shape = face.revolve(App.Vector(0, 0, 0), App.Vector(0, 0, 1), 360)
# 胴体(円筒)作成
cylinder = Part.makeCylinder(radius, TL)
cylinder.translate(Base.Vector(0, 0, head_height))
# 底部鏡板と胴体を結合
vessel_body = lower_head_shape.fuse(cylinder)
# 結合したボディをオブジェクトとして追加
body = doc.addObject("Part::Feature", "VesselBody")
body.Shape = vessel_body
body.ViewObject.ShapeColor = (0.8, 0.8, 0.9)
# 表示更新
doc.recompute()
3. 作成モデル
以下に実行結果を示します。想定していたような反応槽が作成されました。意外とPythonスクリプトが使えそうなので今後は、他の機器類も検討してみたいと思います。

Discussion