単純な四角形パス
G-coordinatorでは,基本的にあらゆる造形を座標を用いて行います.
ここでは最も単純に,座標を直接手入力してみましょう.
ノズルが移動する座標は順番に以下のようになります.
(x, y, z) = (0, 0, 0.2),
(10, 0, 0.2),
(10, 10, 0.2),
(0, 10, 0.2),
(0, 0, 0.2)
ノズルが移動する座表のx座標列,y座標列,z座標列が必要なので,以下のようなコードを書きます.
import gcoordinator as gc
full_object=[]
x = [0, 10, 10, 0, 0]
y = [0, 0, 10, 10, 0]
z = [0.2, 0.2, 0.2, 0.2, 0.2]
layer = gc.Path(x, y, z)
full_object.append(layer)
gc.gui_export(full_object)
x, y, z座標列を用いて,gc.Path()というクラスのインスタンスを作成します.
作成したlayerというインスタンスをfull_objectというリストに追加します.
これは,一般に印刷するパスは複数存在するので,それらを格納するリストです.(詳細は次章で述べます)
印刷するパスを格納したリストをGUIに渡すことで.プレビューに表示されます.
四角形壁の造形
ご存知の通り,3Dプリンタでは,積層をするため,パス一つでは,造形物にはなりません.先ほど作ったパスを縦に積み重ねる必要があります.
for文を用いて,それぞれのパスのz座標列をパスごとに高くすればいいです.
import gcoordinator as gc
full_object = []
for height in range(100):
x = [0, 10.0, 10.0, 0, 0]
y = [0, 0, 10.0, 10.0, 0]
z = [(height+1)*0.2] * 5
path = gc.Path(x, y, z)
full_object.append(path)
gc.gui_export(full_object)
forループをする中でheightという変数がループごとに値が1ずつ増えていきます.
それをもちいて,z座標列では,x座標列と同じ項数で値が(height+1)*0.2となる座標列を作成しています.
heightに1を足しているのは,forループで,heightの値が0からスタートしても,z座標は,0.2から始まって欲しいからです.また,0.2は,一般的なレイヤー厚さとして例に挙げています.
円形パスの作成
次に,円を作成してみましょう.これは,先ほどの,四角の頂点を十分大きいものにすれば実現できます.頂点の数が非常に多いので,numpyを用いて,座標列を作成します.
まずは,1レイヤーだけの円形パスの造形コードを以下に示します.
import numpy as np
import gcoordinator as gc
full_object=[]
arg = np.linspace(0, 2*np.pi, 100)
x = 10 * np.cos(arg)
y = 10 * np.sin(arg)
z = np.full_like(arg, 0.2)
wall = gc.Path(x, y, z)
full_object.append(wall)
gc.gui_export(full_object)
argという変数で,0から2π(単位はrad)までの項数100の角度に関する等差数列を作成しています.
この角度列のcos()がx座標列,sin()がy座標列になっています.z座標列は,argと項数が同じで,値が全て0.2で初期化しています.
これらのx, y, z座標列からPathを作成し,guiにexportしています.
このコードは正確には,円を出力するコードというより,正99角形を出力するコードです.
G-codeには,G3のように弧を印刷するコマンドも存在しますが,現在のG-coordinatorではそれらに対応していないので,このように実装します.
この分割を多くすると,より円に近づき,精密な表現になりますが,その分,G-codeのデータが重たくなります.半径10mm程度の円柱であれば,100分割ほどで十分です.
円柱壁
前節で,作成した円を縦に積み重ねることで,円柱を作成可能です.
四角柱と同様に,for分でループしながらループごとにzの値を大きくしていきます.
import numpy as np
import gcoordinator as gc
full_object=[]
for height in range(100):
arg = np.linspace(0, 2*np.pi, 100)
x = 10 * np.cos(arg)
y = 10 * np.sin(arg)
z = np.full_like(arg, (height+1) * 0.2)
wall = gc.Path(x, y, z)
full_object.append(wall)
gc.gui_export(full_object)