【FreeCAD使い方講座】Draftでべシェ曲線・Bスプライン曲線を描く〜Pythonコンソールの使い方②
※ 当ページには【広告/PR】を含む場合があります。
2021/02/12
2022/08/18
前回はFreeCAD内部で利用するpythonコンソールからの簡単な操作の概要を記事として書きましたが、今回もFreeCAD内でPythonスクリプティングのお勉強をしていきます。
前回の続きの内容として、DraftベンチのPythonスクリプトの操作方法と、曲線の描き方を特集します。
pythonスクリプトで曲線を描くメリット
曲線の立体物を作成するとなると、定規を当てて寸法を測ることも出来ないので、なかなか手で制御しながら描いていくのは難しいものです。
FreeCADの強力なツールであるpythonスクリプトで曲線の制御点を指定しながらモデリングすると、全ての操作をスクリプトで管理することができるので、柔軟な形状が作成することも可能であり、モデリングの再現性も拡張性も高くなり、かなりいいこと尽くめです。
特に、流体工学などの流線型のデザイン設計で役に立つテクニックと言えます。
FreeCADにはベシェ曲線とBスプライン曲線の主に2つの曲線作成機能がありますが、今回はこの2つを比較しながら簡単なpythonスクリプティングの基礎を説明していきます。
べシェ曲線とBスプライン曲線
少し制御点付きの曲線作成の話を始めるにあたって、理屈の方を先に軽く触れておきたいと思います。
Draftベンチでべシェ曲線
ベシェ曲線に関しては、
ここでは3点($$P
Eq. (3points-bezier)
FreeCADではDraftベンチに切り替えて、ベシェ曲線ツールを選択することでベシェ曲線を描くことができます。

手始めに適当に以下のような3点のベシェ曲線を手動で作成して、pythonコンソールからどのようなメソッドで構成されているかを確認してみます。
ベシェ曲線にツールを押して、3点を適当な位置に連続してマウスをクリックし、最後にEscキーで図形作成を確定していきます。

すると以下のような出力がコンソールが得られていると思います。
points = [FreeCAD.Vector(0.0,0.0,0.0),FreeCAD.Vector(5.0,6.0,0.0),FreeCAD.Vector(10.0,0.0,0.0)]
bez = Draft.makeBezCurve(points,closed=False,support=None)
Draft.autogroup(bez)
ここで
points
FreeCAD.Vector
曲線をスクリプトで使うやり方としては、
points
Draft.makeBezCurve
DraftベンチでBスプライン曲線
先程の3点で構成されたベシェ曲線のときと比較するために、同じ3点でBスプライン曲線を作成してみます。
Bスプライン曲線は個数$$i$$個の制御点$$\{ P
Bスプラインの理解する上で重要なのが、ノット列と呼ばれる点の動く範囲を表すパラメータ$$t$$の集合$$\{ t
Eq. (N-base-func)
このとき0次の基底関数はノット列に対して、
Eq. (0-base-func)
を満たします。 つまりゼロ次のときには制御点の影響を及ぼす範囲が独立していることを意味しています。
これが1次になると、たとえばノット列の$$\{ t
Eq. (1-base-func)
と出来ます。 つまり1次のBスプラインは各制御点を順番に直線で繋いだ操作と等しいようです。
さらに2次になると、ノット列の$$\{ t
Eq. (2-base-func)
のようになり、制御点の影響は2点先まで広がります。
3次以上の基底関数の紹介は省きますが、一般に$$n$$次の場合には$$n$$点先までの制御点の影響を考慮するという具合にノット列が定まります。
FreeCADのBスプライン機能はというと、ソースコードは詳しく確認しておりませんが、2点先までの制御点が影響を受けるような挙動を示しますので、おそらくデフォルトでは2次のBスプライン曲線を念頭に設計されているものと推測します。
Bスプライン曲線でいうセグメント数$$L$$とは、$$n$$次のBスプライン曲線を描きたい場合において、その制御点数$$n + L$$を満たすような数です。 たとえば制御点3つ$$P
Eq. (3points-bspline)
このようにBスプライン曲線を理屈付けすると、ベシェ曲線よりもはるかに難解なものになりますが、スクリプトでモデリングする場合には実はBスプラインのほうが使いやすいことを、こちらも3点でBスプライン曲線を検証してみます。
まず先ほどと同じ手順でDraftベンチからBスプライン曲線を描いてみましょう。

ベシェ曲線を使ったときと比べて見た目で大きく違うのが、中間の制御点(ここで言うと2点目)が曲線近傍を通過していることです。
モデリングする側からすると、中間制御点を大きく逸脱する形状になるベシェ曲線よりは、制御点の近くで曲線を形成してくれるBスプライン曲線のほうが、最終的な図形をイメージしやすいメリットがあります。
このときに得られたpythonコンソールの出力も確認すると、
points = [FreeCAD.Vector(0.0,0.0,0.0),FreeCAD.Vector(5.0,6.0,0.0),FreeCAD.Vector(10.0,0.0,0.0)]
spline = Draft.makeBSpline(points,closed=False,face=False,support=None)
Draft.autogroup(spline)
となっています。
先程のベシェ曲線の場合同様、Bスプライン曲線もほぼ同じですが、スクリプトとしては
points
Draft.makeBSpline
曲線スクリプトを作成
ここからはFreeCADからPythonスクリプトを実行して、簡単な図形を出力させてみます。
先程説明したとおりで、スクリプトで図形を描く場合Bスプライン曲線で描いたほうが完成形状が想像しやすいので、ここではBスプラインをベースにスクリプトモデリングを行います。
今回はpythonコンソールからではなく、マクロから呼び出して利用してみます。
以下のスクリプトを
bspline.py
import FreeCAD
import Draft
App.newDocument("my_doc")
points = [FreeCAD.Vector(0.0,0.0,0.0),FreeCAD.Vector(5.0,6.0,0.0),FreeCAD.Vector(10.0,0.0,0.0)]
spl = Draft.makeBSpline(points,closed=False,face=False,support=None)
Draft.autogroup(spl)
#👇ファイルの保存先(絶対パスで指定) --> /home/user/ドキュメント/bspline.FCStd
App.getDocument("my_doc").saveAs("/home/user/ドキュメント/bspline.FCStd")
このスクリプトを適当な場所に保存し、FreeCAD側から呼び出してみます。
ツールメニューから
[記録されたマクロを開くためのダイアログボックスを開く]
[マクロの実行]

[ユーザーマクロの場所]
bspline.py
[実行]

正しく実行されると、Draftベンチ上で曲線が描かれ、指定した保存先に
bspline.FCStd
余談 ~ freecadcmdからBスプラインは使えない
FreeCADにはターミナルから呼び出せるCLI用のハンディなコマンド
freecadcmd
このfreecadcmdで注意が必要なのが、内部でQtを使っているようなグラフィカル関数が使えないので、今回の例で言えば、ベシェ曲線は使えても、Bスプラインは使えません。
たとえば上記の
bspline.py
$ freecadcmd bspline.py
FreeCAD 0.18, Libs: 0.18R
(c) Juergen Riegel, Werner Mayer, Yorik van Havre 2001-2019
##### #### ### ####
# # # # # #
# ## #### #### # # # # #
#### # # # # # # # ##### # #
# # #### #### # # # # #
# # # # # # # # # ## ## ##
# # #### #### ### # # #### ## ## ##
Exception while processing file: draft.py ['module' object has no attribute 'UiLoader']
という出力で正しく実行されません。
FreeCADのBスプラインの実装の一部に、Qtのライブラリを読み込む箇所があり、それがコマンドラインからでは使えないということです。
まとめ
今回はPythonスクリプトによるDraftベンチと曲線の生成方法を主に解説していきましたが、ドラフトだけでは3dモデルを作ったことになりません。
次回以降で、今回のテクニックを使ってより立体的にするための3dモデルで部品を作成するような手順を説明して行く予定です。