🖨

Pythonコードから、3Dプリンタデータ(STLファイル)を作成するよ

2022/01/07に公開

Pythonコードベースに、3Dプリンタデータ(STLファイル)を作成する方法について紹介します。

😟きっかけ

私の購入した3Dプリンタでは、印刷精度が悪いのか3Dデータと印刷物との誤差があります。
この場合、3Dデータ修正を行う必要があります。
3Dデータ修正には慣れていないため、これに時間がかかることが悩みでした。
コードベースに生成すれば、修正が楽になるのではないかと考えました。
いろいろと調べたところ、SolidPython, OpenSCADを使うことで実現できることが分かりました。

SolidPython, OpenSCADについて

以下が情報となります。

  • SolidPython - documentation

https://solidpython.readthedocs.io/en/latest/

  • SolidPython - github

https://github.com/SolidCode/SolidPython

  • OpenSCAD

https://openscad.org/

また、参考サイトが以下となります。

https://qiita.com/bear_montblanc/items/5d6260ea9d20c32dcdf7

3Dプリンタデータ(STLファイル)の作成

作業の流れ

  1. Pythonコードにて、SolidPythonモジュールを使ってコードを書く
    • コードを実行すると、.scadファイル(OpenSCADコード)を出力
  2. .scadファイルをOpenSCADで開く
    • 3Dデータを確認
    • レンダリングを実施
    • STLファイルを出力
  3. STLファイルを3Dプリンタで印刷する

💻環境の構築

開発環境

確認した環境は以下となります。

  • Windowsの場合
    • Windows10 HomeEdition
    • Python3.8.10
  • Macの場合
    • macOS Big Sur 11.6.1
    • Python 3.7.9

インストール

SolidPython

  • windows
> python -m venv env
> env\Scripts\activate
(env) > pip install solidpython
(env) > pip install numpy
  • mac
> python -m venv env
> source env\bin\activate
(env) > pip install solidpython
(env) > pip install numpy

OpenSCAD

下記のダウンロードサイトより、OSにあったインストーラをダウンロードします。

https://openscad.org/downloads.html

各手順に従って、インストールします。

⏹直方体をSTLファイルに変換する

直方体を例に記載します。

直方体のコード

下記となります。

example.py
from solid import *
from solid.utils import *

# cube - x:100mm, y:50mm, z:20mm
c = cube([100, 50, 20], center=True)

# Output scad file
scad_render_to_file(c, "example.scad")

上記を実行すると、OpenSCADコード : example.scadを出力します。

(env) > python .\example.py
(env) > ls
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
略
-a----        2022/01/06     23:05            242 example.py
-a----        2022/01/06     23:05            806 example.scad
(env) > 

STLファイルを出力する

OpenSCADを起動し、example.scadを開きます。

メニューバー - "Design" -> "Render"を選択します。

STLのアイコンをクリックします。

STLファイルとして保存します。

これで印刷できる形式となります。

サンプルコード集

よく使うサンプルコードについて記載します。

オブジェクト関連

直方体

100mm x 50mmの高さ20mmの直方体を描画。

from solid import *
from solid.utils import *

c = cube([100, 50, 20])
scad_render_to_file(c, "example.scad")

円柱 - cylinder()

高さ:50mm、半径20mmの円柱を描画。

from solid import *
from solid.utils import *

cy = cylinder(h=50, r=20)
scad_render_to_file(cy, "example.scad")

球体 - sphere()

半径 - 20mmの球体を描画。

from solid import *
from solid.utils import *

sp = sphere(r=20)
scad_render_to_file(sp, "example.scad")

座標移動関連

原点 / オブジェクトの中心を基準

  • 原点を基準に描画
    • center=False

from solid import *
from solid.utils import *

c = cube([100, 50, 20], center=False)
scad_render_to_file(c, "example.scad")
  • オブジェクトの中心を基準に描画
    • center=True

from solid import *
from solid.utils import *

c = cube([100, 50, 20], center=True)
scad_render_to_file(c, "example.scad")

移動 - translate(), up()...

x方向に+20mm、y方向に+30mm。

from solid import *
from solid.utils import *

c = cube([100, 50, 20], center=False)
c = translate([20, 30, 0])(c)
scad_render_to_file(c, "example.scad")

シンプルにも書けます。
z方向に+40mm。

from solid import *
from solid.utils import *

c = cube([100, 50, 20], center=False)
c = up(40)(c)
scad_render_to_file(c, "example.scad")

※right(), left()なども使用できます。

回転 - rotate()

x軸を基準に、45度回転。

from solid import *
from solid.utils import *

c = cube([100, 50, 20], center=False)
c = rotate([45, 0, 0])(c)

scad_render_to_file(c, "example.scad")

ポリゴン - polygon と 押し出し - linear_extrude()

凹を座標指定して描画、そのあとに40mm押し出す。

from solid import *
from solid.utils import *
import numpy as np

points = np.array([
    [0, 0],
    [90, 0],
    [90, 90],
    [60, 90],
    [60, 60],
    [30, 60],
    [30, 90],
    [0, 90]
])

p = polygon(points)
p = linear_extrude(40)(p)
scad_render_to_file(p, "example.scad")

ブーリアン演算関連 - Boolean Combination

union - or

球体(r=20mm)と立方体(30mm x 30mm x 30mm)の和集合。

from solid import *
from solid.utils import *

cu = cube(30, center=True)
sp = sphere(r=20)
scad_render_to_file((cu + sp), "example.scad")

difference - and not

立方体(30mm x 30mm x 30mm) - 球体(r=20mm)との集合。

from solid import *
from solid.utils import *

cu = cube(30, center=True)
sp = sphere(r=20)
scad_render_to_file((cu - sp), "example.scad")

intersection - and

立方体(30mm x 30mm x 30mm)と球体(r=20mm)の共通集合。

from solid import *
from solid.utils import *

cu = cube(30, center=True)
sp = sphere(r=20)
scad_render_to_file((sp * cu), "example.scad")

その他

色を変える

立方体(10mm)を赤, 緑, 青で並べて表示

from solid import *
from solid.utils import *

cu = cube(10)
cu_red = color("red")(cu)
cu_green = right(20)(color("green")(cu))
cu_blue = right(40)(color("blue")(cu))

scad_render_to_file((cu_red + cu_green + cu_blue), "example.scad")

さいごに

3Dモデルをコードでかけるのは非常に助かります。

GitHubで編集を提案

Discussion