Wood grain puzzle “Lovely relationship between Processing programming and laser cutter”
この記事はMFT2018 (Maker Faire Tokyo 2018 )エントリーシートの予稿です。
出展者のプロフィール
レーザー加工といえばイラストレーターで図案を描いてMDFを切り抜くものという風潮に抗って、Processingプログラムでパズル図案を描いて、地元の木材をレーザーカッターで切り抜いて木目のパズルを作っています。本業は計測の自動化と解析処理用のLabVIEWプログラムを提供していますので、LabVIEWホーム版を使ったArduino+FM音源YMF825の音作りツールも紹介する予定です。
出展内容
プログラムで描いた画像をレーザー光線がたどって切り取ってくれる。画面の中の五角形が厚みを持った五角形の木片になる。ジグソーパズルの無限の組み合わせをプログラムで描いて、地元の木材でパズルを作ってみよう。絵はいらない、木目が元の場所を教えてくれるから。久慈の南部アカマツ、遠野の桜、浄法寺のウルシ、木目は木の物語。プログラミングとレーザーカッターの素敵な関係を提案します。木目のパズルを見に来てね。
ジグソーパズルの製作
(1)Processingでピースの形状をランダムに作画します。
(2)レーザーカッターで切断します。
(3)パズルの完成です。
(4)画面の図形が厚みを持ってさわれる!!!
デモビデオ「プログラミングとレーザーカッターの素敵な関係」
https://www.facebook.com/koji.ohashi.12/videos/1696150310460940/
五角形のパズル
Processingでレーザー加工用図形をプログラムしよう!!
たくさんあるプログラムツールの中でProcessingを選ぶ理由は四つ。
(1) オープンソースなので無料で使うことができる。
(2)図形をPDFで出力できる。
(3)グラフィック関連の関数が一通り揃っている。
(4)プログラムサンプルが豊富で使いやすい。
タングラムという古典的な図形パズルを例にプログラム方法を紹介します。
プログラムで作成するタングラムの図案。
図案が少し違いますが、タングラムを切断加工している様子です。
プログラムサンプル
processingでのプログラムはディスプレイに表示することを主眼に作られているのでピクセルが基本単位です。72ピクセルが1インチ(25.4mm)ですから、1mmは72/25.4ピクセルとなります。長さ100mmは100*72/25.4ピクセルとなります。つまり、欲しい寸法(mm)とプログラムで使うピクセルの変換は72/25.4を掛ければ良いだけです。
また、ドキュメントサイズを変数で指定することとPDFライブラリを使用していることに注目してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
// タングラムの加工図の例です。 //********************************************************* //PDFが作成されるので加工の際にイラストレーターで開きます。 //イラストレーターで図形全体を選択した状態で、 //「オブジェクトメニュー>クリッピングマスク>解除」します。 //アートボード外周に不要なパスができているので削除します。 //イラストレータ形式で保存します。 //これでレーザー加工ができます。 //********************************************************* //テンプレートとして活用してください //計測・解析ラボ import processing.pdf.*; float artboardHeight=80; //実寸(mm) float artboardWidth=130; //実寸(mm) float frameHeight=70; //実寸(mm) float frameWidth=120; //実寸(mm) float puzzleHeight=50; //実寸(mm) float puzzleWidth=100; //実寸(mm) float pixConv=72/25.4; float artboardHeightP=artboardHeight*pixConv; float artboardWidthP=artboardWidth*pixConv; float frameHeightP=frameHeight*pixConv; float frameWidthP=frameWidth*pixConv; float puzzleHeightP=puzzleHeight*pixConv; float puzzleWidthP=puzzleWidth*pixConv; float frameTopP=(artboardHeightP-frameHeightP)/2;; float frameLeftP=(artboardWidthP-frameWidthP)/2; float puzzleTopP=frameTopP+(frameHeightP-puzzleHeightP)/2; float puzzleLeftP=frameLeftP+(frameWidthP-puzzleWidthP)/2; float strokeWidth = 0.001*pixConv;//( TrotecLaser LineWidth:0.001mm) void settings(){ int docWidth=(int)(artboardWidthP); int docHeight=(int)(artboardHeightP); size(docWidth,docHeight); } void setup() { noLoop(); // Run once and stop beginRecord(PDF, "Tangram.pdf"); noFill(); strokeWeight(strokeWidth); stroke(0,0,0); //black } void draw(){ translate(puzzleLeftP,puzzleTopP); line(0,puzzleHeightP/2,puzzleWidthP/4,0); line(puzzleWidthP/4,0,puzzleWidthP/4,puzzleHeightP/2); line(puzzleWidthP/4,puzzleHeightP/2,puzzleWidthP/2,puzzleHeightP/2); line(0,puzzleHeightP,puzzleWidthP/4,puzzleHeightP/2); line(puzzleWidthP/4,puzzleHeightP/2,puzzleWidthP/2,puzzleHeightP); line(puzzleWidthP/2,puzzleHeightP,puzzleWidthP/2,0); line(puzzleWidthP/2,0,puzzleWidthP,puzzleHeightP); rect(0, 0, puzzleWidthP, puzzleHeightP); translate(-puzzleLeftP,-puzzleTopP); rect(frameLeftP, frameTopP, frameWidthP, frameHeightP); endRecord(); } |