Pythonで3Dデータをモデリングしたくて調べたところ、OpenSCADというGPL2のオープンソースソフトウェアを見つけた。
プログラムを記述してオブジェクトを生成し、簡単な演算で結合したり交差を取ったり出来る。GUIでの編集は出来ない。決まりきった形状をプログラム上で表現するのは楽。フィレットとかC面作れるともっと良い。
www.openscad.org
構文的にはJavaScriptに似てる気もしますが、ループなどはイテレータを使うようにも見えて不思議な感じ。
次のコードは立方体を生成して結合 (Union)するサンプル。
union(){
cube(size=[10, 20, 10]);
cube(size=[20, 10, 10]);
};
このようなオブジェクトが生成される。
元カブクのtaxponさんがPython製のOpenSCAD用コードジェネレータを書いていたので試してみた。
twitter.com
PyPiに登録されている。
pypi.org
適当な円筒を生成して足したり引いたりするサンプル。
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上で見るとこのような感じに。見にくい…。
MacのPreviewで開くとこの様になっています。
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にプラグインを追加するか、コード上で全てを生成するかといういくつかの選択肢があります。また何か面白い話を見つけたら書こう。