Pythonコードから、3Dプリンタデータ(STLファイル)を作成するよ
Pythonコードベースに、3Dプリンタデータ(STLファイル)を作成する方法について紹介します。
😟きっかけ
私の購入した3Dプリンタでは、印刷精度が悪いのか3Dデータと印刷物との誤差があります。
この場合、3Dデータ修正を行う必要があります。
3Dデータ修正には慣れていないため、これに時間がかかることが悩みでした。
コードベースに生成すれば、修正が楽になるのではないかと考えました。
いろいろと調べたところ、SolidPython, OpenSCADを使うことで実現できることが分かりました。
SolidPython, OpenSCADについて
以下が情報となります。
- SolidPython - documentation
- SolidPython - github
- OpenSCAD
また、参考サイトが以下となります。
3Dプリンタデータ(STLファイル)の作成
作業の流れ
- Pythonコードにて、SolidPythonモジュールを使ってコードを書く
- コードを実行すると、.scadファイル(OpenSCADコード)を出力
- .scadファイルをOpenSCADで開く
- 3Dデータを確認
- レンダリングを実施
- STLファイルを出力
- 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にあったインストーラをダウンロードします。
各手順に従って、インストールします。
⏹直方体をSTLファイルに変換する
直方体を例に記載します。
直方体のコード
下記となります。
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モデルをコードでかけるのは非常に助かります。
Discussion