G-coordinatorで3Dプリント＃1

:::note alert
この記事内でのサンプルコードは，G-coordinatorの最新バージョンと互換性がありません．
:::




# G-coordinator とは
3Dプリンタを使用するためには，基本的には3Dモデルを用意し，それをスライスソフトにかけてG-codeを作成してプリンタに読み込ませる必要があります．今回開発した[G-coordinator](https://github.com/tomohiron907/G-coordinator)はpythonで直接G-codeを作成するためのオープンソースフトウェアです．(URL:https://github.com/tomohiron907/G-coordinator)
![modeling.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/8e9d69b8-f339-988a-646c-0b9fbf10ce9e.gif)




直接G-codeを作成することにより，従来の3Dモデルを作成する方法では実現が困難であった形状や造形を，容易に作り出すことができます．例えば，下のような編み形状を実現できます．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/a321cf0b-848a-03ec-4d60-96584881528c.jpeg" width=70%>



RhinocerosのGrasshopperではビジュアルプログラミングにて同様のことは可能ですが，G-coordinatorではそれをpythonで実現します．それにより，高い自由度の造形が可能となります．

左側のエディタにpythonスクリプトを描き，それを実行することにより，3Dプリンタのノズルパスが表示され造形のプレビューが確認できます．また，画面の左側で各種印刷設定を調整し，G-codeを出力することができます．

# 必要事項
多少のpython知識が造形を行っていく上で必要になります．
最終的に，出力されたG-cocdeを確認する作業のため，prusa-slicerやrepetierなどのソフトがあれば便利です．


# G-coordinator のインストール手順
現在，G-coordinatorはwindows向けのzipファイルと，Mac向けのdmgファイルを公開しています．それぞれのファイルは[ここ](https://github.com/tomohiron907/G-coordinator/releases)にあります．お使いのOSに合ったものを選択してダウンロードしてください．
windowsでは，ダウンロードして展開したexeファイルと同じ階層に印刷設定をまとめたprint_setting.iniという設定ファイルがないとエラーが発生します．展開したら設定ファイルがあることをご確認ください．
![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/3943d7f8-4f14-3eab-5f7b-d860c0972a33.png)



macユーザの方は，ダウンロードしたdmgの中の.appのファイルをアプリケーションフォルダに移してからお使いください．
![スクリーンショット 2023-03-03 22.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/57b84eb7-da1a-ccee-8807-67c39787df67.png)


ソフトウェアを起動して以下のようになれば正確にインストールされています．
![スクリーンショット 2023-03-03 22.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/5728ae45-ce9b-5675-631d-0bf8d23fce22.png)




# G-coordinatorのpythonスクリプトの実行方法
自作モジュールや他のライブラリをインストールしたいという場合には，pythonスクリプトをgithubからダウンロードしてmain.pyを実行することをお勧めします．

pythonに詳しくない方にも向けて少し丁寧に説明いたしますので，慣れている方々は読み飛ばしていただいて大丈夫です．
G-coordinator はgithub上の[ここ](https://github.com/tomohiron907/G-coordinator)にソースコードを公開していますので，ダウンロードをしてください．（緑のボタンの<>codeというボタンの下からzipをダウンドードできます）なお，メインのコードはsrcディレクトリに入れてますので，ダウンロードし展開したら，srcをエディタで開いてください．この中で，'main.py'が実行するメインのpytnon スクリプトになります．

あとは，pip で必要なライブラリをインストールします．必要なものはrequiremets.txtにまとめてあります．![スクリーンショット 2023-02-07 15.14.10（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/3fc3ff7e-a981-66ce-ac38-69efe385abd7.png)

ターミナルで以下を打ち込んで，実行に必要なライブラリをダウンロードします．
```pip install numpy```
```pip install pyqt5```
```pip install pyqtgraph```
```pip install pyopengl```


エラーが消えてmain.py を実行した結果，以下のような画面になれば，インストール完了です．

![スクリーンショット 2023-02-07 15.19.27（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/27dca86f-83f4-a210-b7f2-f83dd669f18c.png)


# エラーについて
もし，KeyError:'Nozzle'と出て下の画像のようなエラーが発生した場合には，カレントディレクトリがsrcになっていません．
![スクリーンショット 2023-03-03 22.44.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/5bf72eb9-6c31-838a-a530-6166c6145c74.png)
cd srcのコマンドを打ってカレントディレクトリをsrcに設定してください．参照する設定ファイルが同階層にないといけないというエラーです．


# G-codeの仕組み

造形の前に，G-codeの構造を簡単にでも把握しておくことは，今後，造形を行う上でも有用です．下の写真は，repetierでG-codeを開いたものです．
![スクリーンショット 2023-02-07 15.39.55（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/2cc96e34-7169-d8cb-59c9-2df12600a8ca.png)

基本的には，
```G1 F800 X114.97987 Y105.63424 Z2.00000 E0.00589```
こういった行が大量に繰り返されています．
これは，現在の位置からX114.97987 Y105.63424 Z2.00000の位置まで，分速800ｍｍで移動しながら，フィラメントを0.00589mm押し出すという命令です．

つまり，突き詰めれば，G-codeで制御すべき要素は，座標（x, y, z)の三要素とスピード，押し出し量の計５つです．さらに，スピードと，押し出しはG-coordinator から自動で決定できる（もちろん細かく個別に指定することも可能）なので，考えるべきは，どの位置にノズルが動くかという座標のみで良いです．


# テスト造形（円柱）
では，いよいよ，G-coordinatorで造形をしていきましょう．まずは，最も簡単なモデルとして，円柱の壁を作ります．
githubからダウンロードしたフォルダの中に，Exampleというフォルダがあります．左上のopen fileを押してexampleの中の’default_cylinder.py'を開いてください．

左のエディタにコードが表示され，reloadボタンを押すと，以下の写真のようになります．
![スクリーンショット 2023-02-07 16.09.07（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/ab89588f-41d5-1ca9-776b-f78318fc0fb2.png)

G-coordinator では，object_modeling()という関数の中でモデリングを行います．先ほど述べた通り，最終的に欲しいものは，座標のリストです．なので，通るべき点の座標を含んだ3次元listを作成しています．

full_objectというのがその三次元listの名前ですが，その細かい構造に関しては，別途記事を作成中です．

```ruby
def object_modeling():
    full_object=[]
    for height in range(LAYER):
        arg = np.linspace(0, np.pi*2,100)
        rad = 10
        x = rad*np.cos(arg)
        y = rad*np.sin(arg)
        z = np.full_like(arg, height*0.2+0.2)
        layer = print_layer(x,y,z)
        full_object.append(layer)
            

    return full_object
```
関数内で何をしているかについてです．
まず，for文で各レイヤーについて繰り返しをしています．現在のレイヤー数は10なので，0層目から9層目まで繰り返されるイメージです．


次に，円を描くために，角度（argument)をnumpy arrayで0から2πの範囲で設定しています．要素数は100としているため，正確には，正99角形が造形されます．
半径は10で固定すると，
x座標は，```半径×cos(arg)```
y座標は，```半径×sin(arg)```
より計算できます．
高さ方向のz座標に関しては，argと同じ要素数のarrayをheightに応じて値を初期化しています．0.2を足しているのは，heightが0から始まっても，第一層目は高さ0.2の場所に印刷して欲しいからです．

```layer = print_layer(x,y,z)```

この行は，x座標の配列，ｙ座標の配列，ｚ座標の配列をfull_objectに追加するために，整形をしています．内容はnp.column_stack()のようなものですが，引数として，F（スピード）やE（押し出し量の係数）を追加することもできます．この点に関しては，別途記事を作成予定です．
なお，n段目のレイヤーの終点とn+1段目のレイヤーの始点とは，自動でトラベルするようになっています．
そして，各レイヤーごとに，full_objectのlist にlayerを追加し，full_objectを返り値として設定しています．

# 印刷設定

造形が完了すれば，G-codeの準備をします．
![スクリーンショット 2023-02-07 16.09.07（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/a5a50459-f7ef-1f6d-9779-8cce3025871d.png)
現段階では，そこまで，複雑な印刷設定ができないです．最低限の設定項目のみです．
読んで字のごとくですが，nozzle_daimeterはノズル径，layer_heightはレイヤーの高さです．

少し注意の必要なのは，Origin の項目です．一般の3Dプリンタでは，原点をベッドの左手前に設定していますが，G-coordinatorでは，造形の数式を簡単に書くために，原点をベッドの中央に設定しています．
自分の今使用している3Dプリンタのベッドが210mm×210mmなので，その中心の105mm を原点と設定しています．

G-coordinator上で（10,-20)の座標が，G-code上では(115, 85)に変換されて記録されるイメージです．

他には，スピードの項目も設けています．ここでのプリントスピードは，何も設定しなかった場合のデフォルト値であり，エディタで細かくスピードを指定した場合には，そちらが優先されます．これは，一番下の項目のExtrusion_multiplierでも同様です．

travel_optionでは，リトラクションの有無とｚホップの設定が可能です．

extrusion_multiplier では，押し出し量（E値）に掛ける係数を決定できます．


# G-codeの出力
準備ができれば，Gcode Exportのボタンを押してください．
左下のメッセージコンソールにGcode Exportedの文字が出て新しいウィンドウにG-codeが表示されれば完了です．
![スクリーンショット 2023-03-03 22.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/9f3fe297-18db-d9aa-c9a6-7850127dbbdd.png)
あとはG-codeをお好きな場所に保存してください．なおG-codeはものによっては数十万行と長いコードになり，全文を表示すると重くなってしまう可能性があるので，最初の1000行のみを表示していますが，保存ボタンを押せば，もちろん全文がきちんと保存されます．


生成されたG-codeは，念の為，他のソフトウェアでも確認しておくことをおすすめします．


![スクリーンショット 2023-02-07 15.39.55（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/163d6766-d6f1-5401-3352-be9d2f778ec3.png)

以上がG-coordinator でG-codeを作成する手順になります．
造形の事例とそのためのスクリプトの解説は随時更新していく予定です．