FreeCAD による OpenFOAM 用モデルの作成

2017年12月24日

はじめに

FreeCAD で OpenFOAM 用モデルを作成する。

使用バージョン

FreeCAD 0.15 Linux 版、OpenFOAM v1706

インストール

Ubuntu の場合、以下のように実行すればよい。

$ sudo add-apt-repository ppa:freecad-maintainers/freecad-stable
$ sudo apt-get update
$ apt-get install freecad

実行。

$ freecad

FreeCAD 入門

FreeCAD の起動

FreeCAD がインストールされていれば、デスクトップメニューからアイコンを選択するか、端末で "freecad" と打ち込むことで FreeCAD を起動できる。

新規

FreeCAD を起動したら、メニュー [ファイル]-[新規] で新規ドキュメントを作成する。

ワークベンチ

FreeCAD は "ワークベンチ" と呼ばれるモジュールを切り替えて使う。ワークベンチの切り替えはメニューの [表示]-[ワークベンチ] で行うか、以下のリストで行う。

よく使われるものは "Part"、"Draft"、"Part Design" などである。

ここでは説明を簡単にするために、主要なワークベンチを有効にする "Complete" を選択する。

マウスによる画面操作

3D 表示画面のマウス操作にはいくつかのスタイルがあり、右クリックで出るポップアップメニューの "ナビゲーションスタイル" で切り替える。ここでは 2 つ挙げる。

Inventor navigation

回転左ボタンドラッグ
平行移動中央ボタンドラッグ
拡大・縮小ホイール回転/中央ボタン + 左ボタン上下ドラッグ
オブジェクトの選択などCtrl + 左クリック

CAD navigation

回転中央ボタン + 左ボタンドラッグ
平行移動中央ボタンドラッグ
拡大・縮小ホイール回転
オブジェクトの選択など左クリック

視点の操作

全体を表示ポップアップメニューの "Fit all"/ツールバーの同アイコン
選択部分を拡大表示Ctrl + B の後、左ボタンドラッグで範囲を選択
各方向への視点の切り替え0 〜 6

オブジェクトの作成・削除

ソリッドの作成

ボタンを押したらすぐにソリッドが作られる。寸法などはツリーで編集する。

線などの作成

パラメタを問い合わせてくるので、マウスで指定する。

画面左上に問い合わせ内容が表示される。正確な数値の指定が必要な場合は、キーボードで指定できる (Enter で先に進む)。

オブジェクトの削除

オブジェクトの削除は、オブジェクトを選択してポップアップメニュー "削除" か、Del キーを押す。

オブジェクトのプロパティの編集

オブジェクトのプロパティの編集は "コンボビュー" で行う。

画面かツリーでオブジェクトを選択すると、そのプロパティが表示される。"データ" タブでオブジェクトの寸法や位置を参照できる。"Placement" でオブジェクトの位置や向きを設定できる。また、たとえば円柱の場合、"Height" 高さや "Radius" 半径を設定できる。

オブジェクトの移動

移動は視点の向きをベースにして行われる。

並行移動 (左のアイコン) では、始点と終点を指定する。

回転 (右のアイコン) では、回転中心と回転開始角度、回転終了角度を指定する。

面の掃引によるソリッドの作成

面を引き伸ばしたり (Extrude) 回転させたり (Revolve) してボリュームを作成できる。

ブーリアン演算

複数のオブジェクトを選択して、ブーリアン演算を行える。

アップグレード・ダウングレード

複数のオブジェクトをまとめ上げたり (アップグレード、上向き矢印)、バラバラにしたり (ダウングレード、下向き矢印) できる。ダウングレードでソリッドを面に分解したりできる。

オブジェクトの表示・非表示

オブジェクトを選択して Space で表示・非表示を切り替えられる。

作成するモデル

ミキシングエルボー

左下の入り口を in1、右下の入り口を in2 とする。右上を出口 out とする。

モデルの作成

基本方針

  • オブジェクトは、とりあえず作成して、あとから寸法や位置を調整する。
  • パラメタ指定は、マウス操作を参考にしながら、キーボードで指定する。

円柱 (Cylinder) のアイコンをクリックして、円柱を作る。円柱が見えるように "1" を押す。オブジェクトを選択して、"コンボビュー" の "データ" タブのプロパティで Height = 30、Radius = 5 とする。円柱が画面いっぱいになるので、ポップアップメニュー (画面右クリック) で "Fit all" する。オブジェクトのプロパティ "Placement" で Y 軸回りに 90°回転させる (Axis を (0, 1, 0) とし、Angle を 90°とする)。

円柱を作るアイコン

"3" を押して円だけが見えるようにする。円のアイコンをクリックする。円の中心と半径を聞かれるので、それぞれ (30, 0, 0)、5 を指定する。

円を作るアイコン

"1" を押す。回転 (Revolve) アイコンをクリックする。円 "Circle" を選択し、角度 90°、回転軸中心 (30, 0, 15)、回転軸は Axis の "ユーザー定義..." で (0, -1, 0) と設定する。

回転アイコン

円柱を作る。プロパティで高さ 30、半径 5、位置 (45, 0, 15) を設定する (位置は Position で設定)。

円柱を作る。プロパティで高さ 15、半径 2.5、位置 (0, 0, -10) を設定する。その円柱を選択した状態で回転 (Rotate) アイコンをクリックし、原点中心で左に 45°傾ける (視点は "1" を押した状態、(0, 0, 0)、0°、45°を指定する)。平行移動アイコンをクリックし、(50, 0, 15) だけ移動する ((0, 0, 0)、(50, 0, 15) を指定する。Relative のチェックははずす)。さらに回転アイコンをクリックし、(30, 0, 15) を中心に時計回りに 45°回転させる ((30, 0, 15)、0°、-45°を指定する)。

平行移動・回転アイコン

オブジェクトをすべて選んで Union アイコンをクリックする。

Union アイコン

メニュー [ファイル]-[名前を付けて保存] でデータを "mixing_elbow" という名前で保存する。

境界の設定

境界条件設定用に境界を指定したい。snappyHexMesh の利用を想定すると、完成した形状をダウングレードアイコンで面に分解し、境界ごとにまとめ (Union)、メニュー [メッシュ]-[図形からメッシュを作成する] でそれぞれの面からメッシュを作成し、それらを STL 形式で出力すればよい。

ダウングレードアイコン

STL ファイルの出力は、出力したいオブジェクトを選び、メニュー [ファイル]-[エクスポート...] で名前に ".ast" という拡張子を付けて保存する (".ast" は ASCII STL の拡張子)。それぞれファイルを開き、境界の名前を付ける。

solid in1

    ...

endsolid in1

名前を付けたらファイルを 1 つにまとめる。

$ cat *.ast > mixing_elbow.stl

境界がたくさんある場合、これを手動で実行するのは大変な作業になるので、自動化する。

export_stl.py

import os
import Mesh
import MeshPart

labels = []

doc = App.ActiveDocument
for obj in doc.Objects:
    if obj.Label[0:3] == 'bc:':
        mesh = doc.addObject("Mesh::Feature", "Mesh")

        # mefisto
        #mesh.Mesh = MeshPart.meshFromShape(Shape=obj.Shape, MaxLength=10)
        # standard
        mesh.Mesh = Mesh.Mesh(obj.Shape.tessellate(0.01))

        label = obj.Label[3:]
        labels.append(label)
        Mesh.export([mesh], './' + label + '.ast')
        doc.removeObject(mesh.Name)

with open('./' + doc.Label + '.stl', 'w') as f:
    for label in labels:
        with open('./' + label + '.ast', 'r') as fi:
            for line in fi:
                if line[:5] == 'solid':
                    line = 'solid ' + label + '\n'
                elif line[:8] == 'endsolid':
                    line = 'endsolid ' + label + '\n'
                f.write(line)

for label in labels:
    os.remove('./' + label + '.ast')

これを、たとえば "~/.FreeCAD/macro" などに置き、メニュー [マクロ]-[マクロ...] (あるいは [ツール]-[マクロ...]) の "マクロのコピー先" にパスを設定すれば、上記スクリプトが実行可能になる。

境界ごとに "コンボビュー" の "データ" タブの "Label" で "bc:" という文字列を頭に付けた名前を設定しておけば、上記のマクロを実行することでそれらだけが STL ファイルとしてカレントディレクトリに出力される。境界名はそれぞれの名前から "bc:" を取ったものになる。

ParaView で形状を確認する。

スケールの変換

STL ファイルのスケール (単位) の変換を行うには、OpenFOAM のユーティリティ surfaceConvert を使う。たとえば mm から m に変換する場合は次のようにする。

$ surfaceConvert -scale 0.001 mixing_elbow-mm.stl mixing_elbow.stl