FreeCAD

FreeCADで面を分割してstlファイル出力のマクロ(Netgenを使う)

こんにちは(@t_kun_kamakiri

本記事は前回の記事の続編になります。

前回の記事と今回の記事を書いた経緯としてはOpenFOAMのメッシュ作成の際にsnappyHexMeshやcfmeshを使う場合があり、その際にstlの品質が悪い場合にうまくメッシュ生成ができない場合がありました。
特に、cfmeshではstlの品質が問題となりメッシュ生成でエラーが出てしまいます。

そこで、メッシュ品質を直接良くなるかは確認できていませんが、FreeCADでのメッシュ生成方法を検討したので記事としてまとめました。

今回はFreeCADで以下のモデルを作成した状態からはじめます。

前回の記事で書いたFreeCADを使ったstlファイルの自動生成のマクロを使うと下記の一番左のようになります。

FreeCADには「Standard」、「Mefisto」、「Netgen」」、「gmsh」のメッシャーが備わっており四面体であればNetgenを使うことでメッシュ生成が簡単に行えます。
ただし、表面しかメッシュ生成していないのでstlにした際には、今回作成したstlを使ってsnappyHexMeshやcfMeshでメッシュ生成することになります。

では、本記事の内容です。

本記事の内容
  • FreeCADのNetgenを使ってメッシュ生成
  • FreeCADのNetgenの自動化(マクロの使い方)

※今回の記事はこちらのブログのコードを使わせていただいています。
手元のFreeCADでは動作しなかったので編集させていただきました。

FreeCAD 0.20.2

FreeCADのドキュメント

より詳細のFreeCADの使い方に関しては以下のドキュメントを参考にしてください。

Netgenについて

Netgen

パラメーター 意味
Fineness メッシュの粗密。

  • 非常に粗い
  • 粗い
  • 中程度
  • 細かい
  • 非常に細かい
  • ユーザー定義

から選択できる。

Mesh size grading メッシュサイズの等級。小さいほどメッシュが細かくなります。0.1-1の値。
Element per edge エッジあたりの要素数。大きいほどメッシュが細かくなります。0.1-10の値。
Element per curvature radius 曲率半径あたりの要素数。大きいほどメッシュが細かくなります。0.2-10の値。
Optimize surface 表面形状の最適化を行うかどうか。
Second order elements 2次要素の生成を行うかどうか。
Quad dominant 六面体的なメッシュ配置を行うかどうか。

FreeCADでマクロ作成方法

FreeCADにはPythonスクリプトが備わっており、スクリプトを書くことで名前を付けて面分割した状態でメッシュ生成からひとつのファイルにまとめてstlファイルとして出力することができます。

Pythonスクリプトのテンプレートして前回の記事のコードを持ってきます。

前回のコードがこちら。

export_stlAll.py

こちらを修正していきます。

FreeCADでメッシュ生成のマクロ記録

FreeCAD操作用のライブラリのPythonコードをいきなり書くのはきついので、マクロ記録の起動を使って動作を確認して、コードに埋め込んでいきます。

メッシュデザインワークベンチ「Mesh Design」に移動して以下のようになっている状態とします。

ひとつ面を選択した状態で「メッシュ(M)」>「シェイプからメッシュを生成」をクリックします。

そうすると以下のようにメッシュの生成の設定出てくるので、適当にメッシュを生成します。まずは、デフォルトのまま「OK」をクリックするとPythonコンソールにPythonのコードが記述されます。

これを確認することでメッシュ生成までに必要なコードであることがわかります。
ひとまずこちらはメインのコードにコピペしておきます。(後で編集します)

こちらを使って編集していきます。

Pythonコードの編集

必要なライブラリを先頭に書きます。

現在のディレクトリを以下のように書きます(確認)。

「doc.FileName」が今開いているFreeCADモデルまでの絶対パスになっています。
※例えば「’D:/OpenFOAM/model/model.FCStd’」のようになっているとしましょう。
re.findall(“(.*)/”,doc.FileName)とすることで”/”より前の文字列を抽出することができきます。re.findall(“(.*)/”,doc.FileName)で[‘D:/OpenFOAM/model/model.FCStd’]のようなリスト型として返ってきますので、リストからインデックス0の要素を抽出すると、現在のディレクトリの文字列を取得できるということです。
これはstlファイルの出力先として指定するときに使います。

今回出力したいstlの保存先を指定するところですね。

に関しては、上の

に相当するので削除します。

は以下のようにします。

こちらもPythonコンソールで動作を確認すると何が起こっているか確認できます。
面に名前を付けているのですが、デフォルトで以下のように「Face*」となっているのですね。
ですので、Name属性を使って「obj.Name)」としておくと確実です。

は下の

に相当するので削除します。

は、

のように書き換えます。

の中の__doc__はdocに相当して、__mesh__はmeshに相当します。
delをした後も使っているためここでは削除しないようにします。
以下のように変更します。

これで完成です。

全体のコード

全体のコードを少しまとめると以下のようになります。

メッシュの粗さに応じて、以下の部分を変更してください。

結果の例を以下に載せておきます。

Netgen(中程度)

Netgen(非常に細かい)

Netgen(ユーザ定義)

今回作成したPythonスクリプトは「ユーザマクロの場所」に保存するとFreeCADから呼び出す子ができます。

本記事のモデルとは異なりますが、マクロを使って面に名前を付けたstlファイルを作成する一連の流れを動画にしています。
ご参考ください。

参考書

本件の内容はFreeCADですが、FreeCADでモデル作成した先にはOpenFOAMで流体解析を行うのでOpenFOAMの参考書を紹介しておきます。

OpenFOAMによる熱移動と流れの数値解析(第2版)

OpenFOAMによる熱移動と流れの数値解析(第2版)

3,520円(11/21 07:56時点)
Amazonの情報を掲載しています
改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

川畑 真一
2,376円(11/20 18:43時点)
発売日: 2022/04/15
Amazonの情報を掲載しています
OpenFOAMライブラリリファレンス

OpenFOAMライブラリリファレンス

株式会社テラバイト, 人見 大輔
16,500円(11/20 20:24時点)
Amazonの情報を掲載しています

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です