3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

G-coordinatorで3Dプリント(造形関数)

Last updated at Posted at 2024-06-24

関数を用いた造形

G-coordinatorを用いて造形を行う際に,重要な関数について述べていきます.
造形入門編において,簡単な円柱を造形するためのコードの解説は既に行なっています.
今回は,この円柱に,インフィルをつけたり,オフセットしたりする方法について解説します.

前回までの単純な円柱コードを以下に示します.

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)

内容としては,x, y, z座標列を作成して,それらを元にPathと呼ばれるオブジェクトを作成し,印刷順番に,full_objectというリストにそれらを格納することで造形を行なっていました.

Pathの変形

gc.Transformクラスの中に,入力されたパスを変形させる関数がまとまっています.

オフセット

壁を一層ではなく,2層3層に増やしたいとします.この時,以下のようにoffset関数を呼び出します

... 

    wall = gc.Path(x, y, z)
    full_object.append(wall)
+   outer_wall = gc.Transform.offset(wall, 0.4)
+   full_object.append(outer_wall)

... 

こうすることで,ノズルの直径0.4mm分だけ外側にオフセットしたパスが印刷されます.
オフセットの値をプラスで指定すると,外側に,マイナスで指定すると内側にオフセットされます.

スクリーンショット 2024-06-21 14.58.12.png

offset関数の引数はPathで,返り値もPathです.帰ってきたouter_wallをさらにoffsetすることも可能です.

... 

    wall = gc.Path(x, y, z)
    full_object.append(wall)
    outer_wall = gc.Transform.offset(wall, 0.4)
    full_object.append(outer_wall)
+   outer_wall_2 = gc.Transform.offset(outer_wall, 0.4)
+   full_object.append(outer_wall_2)

... 

スクリーンショット 2024-06-21 15.04.32.png

また,返り値がPathオブジェクトであるから,一番外側のパスのみ,印刷設定を変えたいというときには以下のようにすればいいです.

... 

    wall = gc.Path(x, y, z)
    full_object.append(wall)
    outer_wall = gc.Transform.offset(wall, 0.4)
    full_object.append(outer_wall)
    outer_wall_2 = gc.Transform.offset(outer_wall, 0.4)
    full_object.append(outer_wall_2)
+   outer_wall_2.print_speed = 3000

... 

このようにすれば,一番外側の壁を印刷する時の印刷速度を直接指定することができます.

その他のTransformクラスの関数

gc.Transform.move(wall, x=10) # wallをx方向に10移動させたPathを返す
gc.Transform.rotate_xy(wall, np.pi/4) # wallを原点中心にπ/4(45度)回転させたPathを返す
gc.Transform.stretch(wall, x_stretch_ratio=2) # x方向に2倍に引き伸ばしたPathを返す

インフィルの生成

G-coordinatorの目玉とも言えるインフィル生成に関して解説します.

... 

    wall = gc.Path(x, y, z)
    full_object.append(wall)
+   infill = gc.gyroid_infill(wall, infill_distance=4)
+   full_object.append(infill)

... 

実装自体は非常にシンプルで,gyroid_infillという関数にwallと,インフィルの間隔を入力することでその内部を埋めるパスを得ることができます.

スクリーンショット 2024-06-21 15.28.13.png

gc.gyroid_infill関数,gc.line_infill関数からの返り値は厳密にはPathクラスのオブジェクトではなく,PathListクラスのオブジェクトです.とある層において,インフィルは,複数のパスが集まって一塊のインフィルとなっているためです.しかし,G-coordinator内で,ユーザはPathListのオブジェクトもPathクラスのオブジェクトとほとんど同じように扱うことができるため,その違いをユーザが意識する必要なほとんどありません.

現在,G-coordinatorでは,上で示したgyroid_infillと,line_infillをサポートしています.
line_infillの使用においても,gyroid_infillとほとんど同じです.

... 

    wall = gc.Path(x, y, z)
    full_object.append(wall)
+   infill = gc.line_infill(wall, infill_distance=4)
+   full_object.append(infill)

... 

スクリーンショット 2024-06-21 15.44.12.png

互い違いに格子のようにインフィルを生成したい時は,一層ごとにインフィルの角度を変えることで可能です.

for height in range(100):
    ... 
    wall = gc.Path(x, y, z)
    full_object.append(wall)
+   infill = gc.line_infill(wall, infill_distance=4, angle=np.pi/4 + np.pi/2*height)
    full_object.append(infill)

... 

スクリーンショット 2024-06-21 15.48.59.png

height の値が1ずつ増えるため,インフィルの角度が最初はπ/4, 次が3π/4, 次が5π/4
になり,互い違いのインフィルを実装できます.

インフィルの印刷設定

インフィルも,他のパスと同じように印刷設定を調整することが可能です.
印刷設定の記事でも述べたように,基本は左のパラメータツリーの値が採用されますが,エディタで個別に調整することでできます.

注意点としては,印刷パスのリスト(full_object)に追加する前に,印刷設定を指定する必要があります.

... 

    wall = gc.Path(x, y, z)
    full_object.append(wall)
    infill = gc.gyroid_infill(wall, infill_distance=4)
+   infill.print_spedd = 3000
    full_object.append(infill)

... 

インフィルに穴を開けたい

パスの内側にインフィルを生成するにあたり,この部分にはインフィルを生成したくないということもよくあります.(穴を開けたい時など)

その時には,少し工夫が必要です.

スクリーンショット 2024-06-21 16.05.26.png

import math
import numpy as np
import gcoordinator as gc

LAYER = 100

full_object=[]
for height in range(LAYER):
    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)
+   inner_wall = gc.Transform.offset(wall, -5)
+   full_object.append(inner_wall)
+   walls = gc.PathList([wall, inner_wall])
+   infill = gc.gyroid_infill(walls, infill_distance=4)
+   full_object.append(infill)
gc.gui_export(full_object)

まず,外側のwallを作成します.
次に,穴のPathを生成します.今回は,5mm内側にオフセットしたパスを穴としました.
これらのwall, innner_wallの二つをリストにしたものを元にPathListクラスを生成します.PathListは複数のPathが一塊になったものと思ってください.今だと,wallとinner_wallが一塊として認識されるイメージです.
そのwallsというPathListをインフィルの入力とすれば,関数の中でよしなに計算して,内側の穴にはインフィルを生成しないようにしてれます,

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?