キーレイアウトのjsonをもとに図形を複製するdxf自動生成スクリプト

この記事はキーボード#2 Advent Calendar 2022の11日目の記事です。昨日の記事はDaihukuさんの「2022年に組み立てた自作キーボードと携わったイベントについて」でした。1年で21個ものキーボードを組み立てて紹介動画まで制作・公開するなんて、いやー、すごいですね。

この記事ではキーボード自作で役立つ(かもしれない)小技を紹介します。キーボード打鍵音を心地よくさせるために、フォームシートをケース内にいれる人も多いのではないかと思います。最近では遊舎工房のレーザーカットサービスでフォームも対応可能となっており、オリジナルの自作キーボード用のフォームを作ることができます。ただしカットを依頼するためには図面を作成する必要があり、キー数が多かったり複雑な形状だったりすると結構面倒です。そこで図面を半自動的に作成するスクリプトをつくってみました。

目次

フォームカット用の図面の作成がしんどい

キーボードの打鍵音を意識するようになってからはフォームは必須と考え、キーボードを自作するたびに道具を使って手でフォームをカットしていた。これはキー数が多いとなかなか辛い。まあでもスイッチプレートのように四角い穴を空けるだけなら辛抱強くやればできなくはない。

現在は打鍵音エンドゲームを目指して自作キーボードを製作中。このために欲しいのはホットスワップ用のソケットとキースイッチの位置決めピンの部分を切り抜いたフォーム。曲線がありサイズが小さいので、これを手でカットするのは難しい。最近では遊舎工房のレーザーカットサービスでフォームもカットしてくれるので、それを利用するために図面を作成していた。

図面はAutodesk fusion 360とKiCad、Inkscapeを利用して次のような手順で作成していた。

  1. ソケット単体の3Dモデルを図面を参考にしながらFusionを使って作成、KiCadのフットプリントに3Dモデルを取り入れる
  2. KiCadのレイアウトエディターで基板のstepファイルをエクスポート、Fusionに取り込む
  3. スイッチを基板のボディに合わせて並べる
  4. スケッチを作成、それにスイッチ、ソケットを射影(プロジェクト)
  5. スケッチ上の不要な線を消し、外形線を加える
  6. 押し出しでフォームの3Dモデルを作る
  7. フォームの3Dモデルをスケッチに射影して加工依頼用のdxfを作成
  8. Inkscapeでdxfを取り込む
  9. 遊舎工房のテンプレートにしたがって色やレイヤーなどを編集し、svgで保存

この作業で最も面倒なのはスイッチを並べる作業。矩形状パターンを利用するとましにはなるが、Row staggeredだと1行ずつやることになる。また様々なキー幅が混ざっているとあまり楽にはならない。間隔を19.05*0.25/2mmにして「抑制」をすれば一応いっぺんにできるけれど、たくさんの数を抑制するために何度もマウスでポチポチやらないといけない。

矩形状パターンを利用して複数のスイッチを並べる。右図は間隔19.05*0.25/2mm+抑制を利用した例。たくさんクリックしないといけない…。

後になって気づいたけれど、たぶんもう少し賢いやり方はスイッチの3DモデルもKiCadのフットプリントに取り込んでしまえば並べる手間は省ける。ただし、スケッチ上に射影したあとに余計な線を消したり、あるいは線を追加するなどが必要になるので、ここは全然楽にならない...。皆さんこういう作業ってどうやっていますか?

とっても面倒な作業だったが、エンドゲームのキーボードを手に入れるための試練だと自分に言い聞かせて辛抱強く続けてできたのがこれ。

フォームのモデルができた?

ふー、と思って眺めていたらソケットのモデルにRをつけ忘れていることに気づく。ナンテコッタ…。

打鍵音にたいした影響はない気がするけれど、エンドゲームを目指しているのでピッタリになるように作り直したい。でも上の面倒な作業をもう一度したらきっと頭がおかしくなってしまう。それに1度修正したものというのは、そのあと2,3回修正を繰り返すことになる場合が多い。3回とか繰り返したら間違いなく狂ってしまう。

狂人化は避けたいのでこれはもう自動化するしかない。

どうすれば自動化できる?

キーボード自作を設計からやる人はKeybaord Layout Editor (以降KLE)を利用してキー配列を考えている人も多いと思う。本当にいつもお世話になっております。

www.keyboard-layout-editor.com

KLEが出力するjsonをファイルをPlate GeneratorPlate & Case Builderなどにインプットするとスイッチプレートのdxfが簡単に作成できる。このおかげでスイッチプレートの図面作成がすごい簡単に出来る。こちらにもいつもお世話になっております。

要するにこれと同じことを違う形でやればいい。KLEが出力するjsonを(雑に)解析するコードは昔pythonで書いたことがあったので、後はdxfの出力部分をコーディングするだけで実現できる。dxfは基本テキストファイルだし線と円とか書くだけなのでそこまで複雑ではないはず。

ちょっと調べてみるとezdxfというpythonのパッケージがあり、これを使えばすぐにdxfの読み書きができるみたい。自分でやれそうな気がしてきたのでコードを書いてみることにした。

自動化プログラムの概要

プログラムを書き始める前に概要を整理しておく。やりたいことは以下のこと。

  • KLEが生成するjsonファイルをインプットし、キーの中心位置を取得・計算する
  • さらに1キー分のdxfファイルもインプットする
  • 全てのキーの位置にインプットしたdxfファイルの図形を複製して配置し、dxfファイルを出力

はじめは複製する図形の形状をプログラム内でハードコーディングしてしまおうかと思ったけれど、修正したいと思ったときにやや面倒になる。少し頑張って複製する図形をインプットするようにしてチョットだけ汎用性を持たせることにした。

KLEのjsonファイルの構造

jsonファイルの中身はそれほど難しくはない。以下はKLEで作ったキーレイアウトとjsonの例。

KLEのjsonファイルの構造

一見したところ呪文のように見えるが構造は簡単。[ ]でくくられているのが各rowに対応している。各キーは" "で囲ってあってカンマで区切られ、キーの印字の入れ方によって\nが複数現れたりする。

キーの色が変わる場合やキー幅が1uでないと直前に{ }が現れる。c:"#ffffff"などは色、wはキー幅が何uであるかを示している。またキー同士が離れている場合はxが現れて離れ具合がキー幅の単位で与えられている。 ダウンロードしたファイルでは、上に加えて最初にname, authorなどの情報を含む{ }で囲まれたブロックがある。

以上はKLEのドキュメント見なくても簡単に推定できる。(コードが完成しただいぶ後にドキュメントを読みました。まずドキュメントをちゃんと読むのが正しいアプローチです。よい子はまねしないでね。)

このルールさえ分かってしまえば解析するのはそれほど難しくない。pythonjsonパッケージを利用するとファイルの読み込みが簡単になる。

dxfファイルの構造

dxfファイルも人が読めるものである。ファイルの中を覗けばLINEやCIRCLEなどをの文字列を見つけることができる。2次元ならLINEは始点、終点のx,y座標があれば描けるはずだし、CIRCLEは中心の座標と半径があれば良いはず。その文脈のもとで線や円を1個だけ描いたdxfファイルの中を見てみると理解しやすい。この記事が参考になる。

qiita.com

構造がわかれば1行ずつテキストを解析していけばいいけれど、ezdxfライブラリを利用して読み書きするほうがもちろん楽。簡単な例を書いてくれている人のwebの記事やezdxfのTutorialsを参考にすれば、dxfファイルを出力するコードはすぐに書けるようになった。

最も苦戦したのはpythonのバージョン更新。この記事を書いている時点ではezdxfはversion0.18.1。これにはpython3.7以降が必要らしい。私の自宅PCはWindowsでWSL1(Ubuntu)、pythonは3.5。これでは使えないのでより新しいversionのpythonを入れないといけない。なんやかんややって最終的にWSL上でversion3.9.14をソースからコンパイル・インストールした。

このpythonの環境構築が一番大変だった。pythonは複数のバージョンが共存することを許容するらしく、初めはそれがわからずにインストールやアンインストールなど試行錯誤していたらaptコマンドが一時使えなくなるなど混乱した。最終的には動かせるようになったけれど、検索するとpythonのバージョン管理の方法は複数あるっぽくて未だにどれが正解なのかわからない。使い慣れていない自分にとっては魔境過ぎる…。

python環境を構築した後ezdxfはpipコマンドで簡単にインストールすることができた。

dxf自動生成スクリプトの完成!

上記のpythonパッケージを利用したおかげでdxf自動生成スクリプトを作成できた。下図は実際にスクリプトを使用した例。

(左)インプットした1キー分のdxfファイル。(右)出力されたdxfファイル

左図はインプットとなる1キー分のdxfファイル。ホットスワップ用のソケットの外形とキースイッチ(5pin)の位置決めピンに加え、細すぎて加工が断られそうなところをカットするための線を加えたもの。

これをjsonファイルとともに入力して得られた出力dxfが右図。自動化って素晴らしい!

誤って位置を動かしてしまわないようにすぐに位置を固定し、外形線などを加えれば図面のできあがり。

ダウンロードはこちら

実際に作ったスクリプトこちらに置いておきます。自己責任でご自由にお使いいただければと思いますが、その場合は下記にあげた点にお気をつけください。

必要なパッケージ

注意点

  • 必ず出力が正しいかを確認してください。
  • インプットする1キー分のdxfではスイッチの中心が原点になるようにしてください。
  • 縦のキー幅が1uでない場合やキーが回転している場合には対応していません。
  • キーピッチを19.05mmとしています。
  • 出力dxfの単位はmm。
  • dxfの図形でLINE、CIRCLE、ARC、LWPOLYLINEに(たぶん)対応。

まとめと展望

Keyboard Layout Editorから得られるjsonファイルをもとに図形を複製してdxfを自動生成するスクリプトを作りました。おかげで頭がおかしくなることなくフォームカット用の図面を作成できるようになりました。めでたしめでたし。

こうした自動化は楽というのもあるけれど、それだけではなくてヒューマンエラーを減らす効果もある。似たような作業を2,3回やっている場合はきっとこの先でも複数回やることになるので自動化すると良さそうです。

Autodesk fusion 360の座標を拾うのもスクリプト化できるみたい。

これを利用すると他にもいろいろ自動化できそう!

今回作ったスクリプトは自分用に雑に作ったので汎用性はいまいち。多分一番良いのはPlate GeneratorやPlate & Case Builderで使われているコードを拝借あるいは参考にして改造するのが良いと思います。

自分はプログラミングが本業ではないのでとりあえず動く程度のものしか作れない。得意な方が汎用性を持たせて、さらにKLEみたいにwebフォームを作ってくれるのをお待ちしております。あるいはどこかの誰かがすでに作っていて、自分が見つけられていないだけかもしれない。もしご存じでしたら教えて下さいませ。

そもそもなんでフォームの図面なんか作っていたかというと、打鍵音エンドゲームに到達するために現在ちょっと変わった構造のキーボードを製作しています。本当はキーボードアドベントカレンダーの記事としてそのキーボードを題材にしたかったのですが、間に合わなかったので今回のような、ん?キーボード?な記事になってしまいました。そのうち製作中の自作キーボードのことを記事にできたらと思います。

このブログは自作したオリジナルキーボードrelief64で書きました。