OpenSCADコマンド

OpenSCADはスクリプトで3Dプリンタのモデルを作ることができるCADです。 スクリプトをベースとしているため、モデルを記述してコマンドラインから3Dプリンタ用のSTLファイルを出力することもできます。

以下では、 Practical Solid Modeling For 3D Printing With OpenSCAD の記事をベースにjupyter notebookを使ってOpenSCADの使い方を紹介します。

OpenSCADとnumpy-stlのインストール

OpenSCADと生成されたSTLファイルを表示するために、numpy-stlをインストールします。

MacOSXのbrewを使って以下のコマンドでOpenSCADをインストールします。

$ brew install caskroom/cask/openscad

STLファイルを可視化するnumpy-stlは、pipコマンドを使ってインストールします。

$ pip install numpy-stl

後半で使用するpythonからSCADファイルを生成するツールsolidpythonもインストールします。

$ pip install solidpython

前準備

jupyter NotebookでSTLファイルを表示するため、必要なモジュールをインポートします。

In [1]:
%matplotlib notebook

from stl import mesh
from mpl_toolkits import mplot3d
from matplotlib import pyplot as plt

また、STLファイルを表示するための関数としてPlotStlを定義します。

In [2]:
def PlotStl(stlFile):
    # Create a new plot
    figure = plt.figure(figsize=(6,4))
    axes = mplot3d.Axes3D(figure)

    # Load the STL files and add the vectors to the plot
    your_mesh = mesh.Mesh.from_file(stlFile)
    axes.add_collection3d(mplot3d.art3d.Poly3DCollection(your_mesh.vectors))

    # Auto scale to the mesh size
    #scale = your_mesh.points.flatten(-1)
    scale = your_mesh.points.flatten(order='C')
    axes.auto_scale_xyz(scale, scale, scale)

    # Show the plot to the screen
    plt.show()

使い方は引数に表示させたいSTLファイルを指定するだけです。

In [3]:
PlotStl('models/example.stl')

サンプルモデル

上記のSTLファイルは、 Practical Solid Modeling For 3D Printing With OpenSCAD の例題で、以下の内容をOpenSCADで3Dモデル化してSTLファイルに出力したものです。

In [4]:
%cat models/example.scad
difference() {   
    union() {    
    translate([0,3.4,0])
        color("lightgreen")
            cylinder(r=5.0,h=16.0);
    translate([-15.0,0,0])
        rotate([0,90,0])
            color("lightyellow")
                cylinder(r=6.0,h=30.0);
    }
    
    translate([0,3.4,-15.0])
        cylinder(r=3.0,h=3*15.0);
    translate([-30.0,0,0])
        rotate([0,90,0])
            cylinder(r=3.0,h=2*30.0);
    translate([0,0,-5.0])
        cube([50,50,10.0],center=true);
}

3Dプリンタ出力

example.stlを手元の3Dプリンタ(2万円で購入できるダビンチNano)で出力してみました。22分程度で完成しました。

OpenSCADの初歩

OpenSCADの最初の例としてcube関数で直方体を作ってみましょう。

%%writefileコマンドを使ってmodelsディレクトリにex_1.scadファイルを作ります。

In [5]:
%%writefile models/ex_1.scad
cube([30, 20, 10], center=true);
Overwriting models/ex_1.scad

次に、%%bashコマンドでopenscadを起動して、scadファイルからSTLファイルを生成します。

%%bashのみでは、CGALの情報がたくさんでるので、以降の例では --err /dev/nullオプションを付けてstderrの出力を抑制することにします。

In [6]:
%%bash 
openscad -o models/ex_1.stl models/ex_1.scad
CGAL Cache insert: cube(size=[30,20,10],center=true); (10872 bytes)
CGAL Cache insert: group(){cube(size=[30,20,10],center=true (10872 bytes)

生成されたSTLファイルをPlotStlで表示すれば、期待した通りの直方体が生成されたことを確認できます。

In [7]:
PlotStl('models/ex_1.stl')

次は、円柱(cylinder)を作ります。

In [8]:
%%writefile models/ex_2.scad
cylinder(r=20, h=100, center=true);
Overwriting models/ex_2.scad
In [9]:
%%bash --err /dev/null
openscad -o models/ex_2.stl models/ex_2.scad
In [10]:
PlotStl('models/ex_2.stl')

$fnでcylinderの側面の数をしていすることができます。

$fn=3を指定すると、3角柱となります。

cylinder(r=20, h=100, center=true, $fn=3);
In [11]:
%%writefile models/ex_3.scad
cylinder(r=20, h=100, center=true, $fn=3);
Overwriting models/ex_3.scad
In [12]:
%%bash --err /dev/null
openscad -o models/ex_3.stl models/ex_3.scad
In [13]:
PlotStl('models/ex_3.stl')

図形の演算

OpenSCADが提供している図形の演算は、以下の通りです。

  • 図形の和: union
  • 図形の差: difference
  • 図形の積(重なる部分を抽出): intersection

次の例は、立方体(cube)と円柱(cyliner)の和をとったものです。

In [14]:
%%writefile models/ex_4.scad
union() {
    cube(50, center=true);
    cylinder(r=20, h=100, center=true);
}
Overwriting models/ex_4.scad
In [15]:
%%bash --err /dev/null
openscad -o models/ex_4.stl models/ex_4.scad
In [16]:
PlotStl('models/ex_4.stl')

次に、立方体から円柱を引いた図形を描いて見ます。立方体に円柱の穴が空いています。

In [17]:
%%writefile models/ex_5.scad
difference() {
    cube(50, center=true);
    cylinder(r=20, h=100, center=true);
}
Overwriting models/ex_5.scad
In [18]:
%%bash --err /dev/null
openscad -o models/ex_5.stl models/ex_5.scad
In [19]:
PlotStl('models/ex_5.stl')

GUI版のOpenSCADでは、differenceで引いたオブジェクトをViewメニューのThrow togetherで表示することができます。

引く順序を変えると変な図形になります。

In [20]:
%%writefile models/ex_6.scad
difference() {
    cylinder(r=20, h=100, center=true);
    cube(50, center=true);
}
Overwriting models/ex_6.scad
In [21]:
%%bash --err /dev/null
openscad -o models/ex_6.stl models/ex_6.scad
In [22]:
PlotStl('models/ex_6.stl')

図形の重なった部分のみを表示するのが、intersectionです。

In [23]:
%%writefile models/ex_7.scad
intersection() {
    cube(50, center=true);
    cylinder(r=20, h=100, center=true);
}
Overwriting models/ex_7.scad
In [24]:
%%bash --err /dev/null
openscad -o models/ex_7.stl models/ex_7.scad
In [25]:
PlotStl('models/ex_7.stl')

移動と回転

平行移動は、対象とする図形の前に、translate関数を付けて指定します。

In [59]:
%%writefile models/ex_8.scad
translate([0,3.4,0])
  cylinder(r=5.0, h=16.0);
Writing models/ex_8.scad
In [23]:
%%bash --err /dev/null
openscad -o models/ex_8.stl models/ex_8.scad
In [24]:
PlotStl('models/ex_8.stl')

同様に回転は、対象とする図形の前に、rotate関数を付けて指定します。

In [26]:
%%writefile models/ex_9.scad
translate([0,3.4,0])
  cylinder(r=5.0, h=16.0);
translate([-15.0,0,0])
  rotate([0,90,0])
    cylinder(r=6.0, h=30.0);
Overwriting models/ex_9.scad
In [27]:
%%bash --err /dev/null
openscad -o models/ex_9.stl models/ex_9.scad
In [28]:
PlotStl('models/ex_9.stl')

円柱に穴を開けて、最初の例題に近づけてみましょう。

In [29]:
%%writefile models/ex_10.scad
difference() {
    union() {
        translate([0,3.4,0])
          cylinder(r=5.0, h=16.0);
        translate([-15.0,0,0])
          rotate([0,90,0])
            cylinder(r=6.0, h=30.0);        
    }
    
    translate([0, 3.4, -15.0])
        cylinder(r=3.0, h=3*15.0);
    translate([-30.0, 0,0])
        rotate([0,90,0])
            cylinder(r=3.0, h=2*30.0);
}
Overwriting models/ex_10.scad
In [30]:
%%bash --err /dev/null
openscad -o models/ex_10.stl models/ex_10.scad
In [31]:
PlotStl('models/ex_10.stl')