仕事柄3DCADを使うことも数値計算(主にPythonを使って)を行う機会が多く、数値計算をもとに3D用のデータ(STEP, IGES, STL)を生成したい(しないといけない)という要求が増えていった中での解決策です。
結論
結論としてはOpenCASCADEを使います。
C++と死の秘宝OpenCascade Technologyで有名な、OpenCASCADEですが、オリジナルはC++で100万行で構成されたライブラリのため、使おうとするととっても大変です。
そこで、OpenCASCADEをほぼすべてPythonにWrapした偉大なコードpythonocc-coreを使います。
Install方法
# Python 3.8
conda install -c conda-forge pythonocc-core
# Python 3.7 or 3.6
conda install -c dlr-sc pythonocc-core
追加で入れておくと良いコード群です。
- https://github.com/tpaviot/pythonocc-core
- https://github.com/tpaviot/pythonocc-demos
- https://github.com/tpaviot/pythonocc-utils
使い方
ごく簡単な使用例です。
from OCC.Display.SimpleGui import init_display
from OCC.Core.gp import gp_Pnt, gp_Vec, gp_Dir
from OCC.Core.gp import gp_Ax1, gp_Ax2, gp_Ax3
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge
from OCC.Extend.DataExchange import write_step_file, read_step_file
display, start_display, add_menu, add_function = init_display()
display.DisplayShape(gp_Pnt())
p1 = gp_Pnt(0, 0, 0)
p2 = gp_Pnt(0, 0, 10)
edge = BRepBuilderAPI_MakeEdge(p1, p2)
result = edge.Edge()
write_step_file(result, "pythonocc-core.stp")
display.DisplayShape(result)
display.FitAll()
display.View.Dump("pythonocc-core.png")
start_display()
実行すると3D ViewerとそのViewerの写真とpythonocc-core.stpというSTEP fileが出てきます。
使い方はこれからです。あとは、3D Viewerをぐりぐり動かすもよし、STEP以外のファイル(IGES, STL, BRep)を吐き出すもよし、好きな形状を作るもよしです。
サンプルはdemoにたくさんあります。
利点
3D Viewerとしてもそこそこ優秀(STEP, IGES, STLが表示できる)ということもありますが、なによりお仕事上有用な点はSTEPの吐き出しができる点です。これがあることで商用CADとの互換性がぐんとあがります。
ほかにも、Vector演算や座標系の変換、SpilneやBooleanが使えたりといわゆるCADとして最低限必要な演算機能が実装されているため、CADというより基本的な幾何演算ライブラリとして優秀という側面があります。
もちろん、変換の演算程度であれば、ちまちまコードを書いていけば実装は難しくないのですが、ほぼすべての幾何演算が実装済みというのは非常にありがたいです。
余談
使い始めて数年経ちますが、正直3D Viewerについてはどうやって動いているのかわかりません。
OpenCASCADEの描画機能をQt(PyQt)に埋め込んでいるんだろうな~程度の理解です。
普段はWindowsを主に使っていますが、WindowsのNative環境でQtで3Dがconda installを実行するだけで動いたときは、かなり衝撃的でした。(そして、描画まで含めてC++でやるのは私の技量では無理だなとも悟りました)