OpenSCAD

Pythonで3Dデータをモデリングしたくて調べたところ、OpenSCADというGPL2のオープンソースソフトウェアを見つけた。

プログラムを記述してオブジェクトを生成し、簡単な演算で結合したり交差を取ったり出来る。GUIでの編集は出来ない。決まりきった形状をプログラム上で表現するのは楽。フィレットとかC面作れるともっと良い。

www.openscad.org

構文的にはJavaScriptに似てる気もしますが、ループなどはイテレータを使うようにも見えて不思議な感じ。

次のコードは立方体を生成して結合 (Union)するサンプル。

union(){
    cube(size=[10, 20, 10]);
    cube(size=[20, 10, 10]);
};

このようなオブジェクトが生成される。

f:id:key3:20200808121220p:plain

元カブクの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上で見るとこのような感じに。見にくい…。

f:id:key3:20200808121638p:plain

MacPreviewで開くとこの様になっています。

f:id:key3:20200808121705p:plain

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

フィレットやチャンファーかけられないようなのが残念ですが、プログラム上でモデリングしたい場合には有用かなと思いました。Fusion360RhinocerosでもPythonプラグインが書けるので、きちんとしたCADにプラグインを追加するか、コード上で全てを生成するかといういくつかの選択肢があります。また何か面白い話を見つけたら書こう。