Python&HolePlateMakerで自作ユニバーサルプレートを作成する。

# ちょびっと連絡
穴の種類を増やしたり、バージョンアップしてみました。
使い方はこちらをご参照ください!

https://qiita.com/Inoue_Minoru/items/efdc38db026a81e1ac7e

# はじめに
- HolePlateMakerというユニバーサルプレート自動生成プログラムで自作ユニバーサルプレートのCADデータ(.stl)を作成する。
- 自動生成したCADデータから自作ユニバーサルプレートを出力する。

# そもそもユニバーサルプレートって何？
- 株式会社タミヤが提供している楽しい工作シリーズの製品の一つ(製品例：https://www.tamiya.com/japan/products/70157/index.html)
- 3 mmの穴が5 mm間隔で開けられており、[タミヤ製のギヤボックス](https://www.tamiya.com/japan/products/70167/index.html)などのギミック系パーツを自由に組み付けることができる。
- 一般的に手に入る3 mm径のネジが使用でき、また５ mm間隔に穴が空いていることによってキリのいい位置にタミヤ製じゃないギミックなどを組み合わせやすい。そのため、プロトタイピングに使われることも多い。

# 使用するもの
バージョンなどは特に揃える必要は無いと思う。

- パソコン(自分の環境はmacOS Big Sur、MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports))
- python 3.6.8
- 3Dプリンタ(自分の環境は[Da vinci nano w](https://www.xyzprinting.com/ja-JP/product/da-vinci-nano-w))
- [HolePlateMaker](https://github.com/henjin0/HolePlateMaker)

# 作業
実施することはこの3ステップだけ。ぶっちゃけ2番のコーディングはほぼコピペでOK。
また、3Dプリンタで出力する際には各自の環境に合わせること。

1. HolePlateMakerのインストール
2. コーディング
3. 3Dプリンタで出力。

## 1. HolePlateMakerのインストール

まず、pipを使ってHolePlateMakerを使うための環境を揃える。
ちなみに私はvenvを使って環境を構築した。

```bash:pipにてインストール
pip3 install numpy
pip3 install numpy-stl
pip3 install matplotlib
```

その後に、HolePlateMakerのgithubリポジトリ(https://github.com/henjin0/HolePlateMaker )からcloneするか、zipで作業フォルダまで持ってくる。また、zipの場合は解答して、HolePlateMakerのファイル郡の入ったフォルダが作業フォルダの中に入っている状態にする。

HolePlateMakerフォルダを用意できたら、フォルダ名が**HolePlateMaker**になっていることを確認する。(zipで持ってくるとHolePlateMaker-mainフォルダになっていた。この場合は-mainをフォルダ名から消す。)

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/86aa9af3-e43b-e178-0f52-1618f00e9f83.png" width="800"alt="出力例">



## 2. コーディング

作業フォルダで任意のファイル名でpyファイルを作成し、下記のコードをコピペする。

```python:stlmake.py
import numpy as np
from stl import mesh
from HolePlateMaker.NumpyArrayToPlate import NumpyBoolArrayToPlate

plateData = np.array([[True,False,True],
    [True,False,True],
    [True,True,True,],
    [False,False,True],
    [False,False,True],])

curMesh = NumpyBoolArrayToPlate(plateData)
curMesh.save('plate.stl')
```

ここで重要なのが、np.arrayの中身。自分の作りたいユニバーサルプレートをここで定義する。
この論理配列でtrueになっているところにユニバーサルプレートの穴部分が作成され、falseになっているところがそのまま空白になる。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/0b87fab8-1e0c-bca6-9003-e50457f59069.png" width="1000"alt="出力例">

コードの実装が完了したら、pyファイルを実行する。
特段エラーがなければ、CADデータとなるstlファイルが作業フォルダ直下に作成される。

```bash:実行
python stlmake.py # 環境によってはpython3 stlmake.pyかも
```

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/ba4acc90-84de-961f-9a9b-6230b7c96eae.png" width="800"alt="ファイル出力結果">

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/46978cfe-2858-e719-e36e-3299c0d4d8bc.png" width="800"alt="ファイル出力結果">


## 3Dプリンタで出力

ここからは各自の環境で実行する。
注意としては、３Dプリンタのスライサーソフトによって勝手に縮小されてしまうこともあるらしいので、必ず原寸ママで出力すること。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/adc90255-246e-6352-d3f0-1902089b3cd3.png" width="1000"alt="Da vinciスライサー画像">

# 結果
印刷した結果はこんな感じ。今回の例だとDa vinci nano wで18分で出力できる。
論理配列を操作すれば、自分好みなユニバーサルプレートをガンガン作ることができる。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/bd44d974-5d9a-6362-f809-4aab06eb0fe2.jpeg" width="300"alt="3Dプリンタ出力結果">


3 mm径のネジもこの通り入る。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/0c961d39-bfdd-7642-c315-2ac8db85d3c0.jpeg" width="300"alt="3Dプリンタ出力結果3 mmネジ付き">


# おわりに
- 自作ユニバーサルプレートのCADデータをpythonコードから自動生成できた。
- 自動生成したCADデータから自作ユニバーサルプレートを作成した。