Pythonで3Dデータをモデリングしたくて調べたところ、OpenSCADというGPL2のオープンソースソフトウェアを見つけた。
プログラムを記述してオブジェクトを生成し、簡単な演算で結合したり交差を取ったり出来る。GUIでの編集は出来ない。決まりきった形状をプログラム上で表現するのは楽。フィレットとかC面作れるともっと良い。
構文的にはJavaScriptに似てる気もしますが、ループなどはイテレータを使うようにも見えて不思議な感じ。
次のコードは立方体を生成して結合 (Union)するサンプル。
union(){ cube(size=[10, 20, 10]); cube(size=[20, 10, 10]); };
このようなオブジェクトが生成される。
元カブクのtaxponさんがPython製のOpenSCAD用コードジェネレータを書いていたので試してみた。
PyPiに登録されている。
適当な円筒を生成して足したり引いたりするサンプル。
import openpyscad as ops cyl_outer_tube = ops.Cylinder(40, r1=30, r2=30) cyl_bottom = ops.Cylinder(2, r1=28, r2=28) cyl_inner_tube = ops.Cylinder(30, r1=10, r2=10) (cyl_outer_tube - (cyl_bottom + cyl_inner_tube)).write("sample.scad")
OpenSCAD用のコードを生成します。
difference(){ cylinder(h=40, r1=30, r2=30); union(){ cylinder(h=2, r1=28, r2=28); cylinder(h=30, r1=10, r2=10); }; };
OpenSCAD上で見るとこのような感じに。見にくい…。
OpenSCADからSTLファイルを生成することも可能で、良いなと思ったのがCLIで触れること。サーバー上などヘッドレスで動かしたい環境で使いやすく、個人的にかなりの高得点。
Makefile
を書いてバッチでゴリゴリ回せる。
.PHONY: sample sample: clean pipenv run python sample.py openscad -o sample.stl sample.scad .PHONY: clean clean: rm -f *.scad rm -f *.stl rm -f *.png
フィレットやチャンファーかけられないようなのが残念ですが、プログラム上でモデリングしたい場合には有用かなと思いました。Fusion360やRhinocerosでもPythonのプラグインが書けるので、きちんとしたCADにプラグインを追加するか、コード上で全てを生成するかといういくつかの選択肢があります。また何か面白い話を見つけたら書こう。