Category tech.

node.js 用のコマンドラインパーサである minimist は必要最低限かつわかりやすくていいですね。

しかもサブコマンド用のオプションも用意されているので、ある程度複雑でも耐えられます。

以下がサブコマンドを実装したもののサンプルコードです。ポイントは親コマンド側では stopEarly を指定して、サブコマンド用の引数を解釈させないところです。

そのうえであらためてサブコマンド用の引数を minimist にかけることで必要な機能が実現できます。良いですね。

#!/usr/bin/env node

import * as minimist from "minimist";

const commands : { [key: string]: (argv: any[]) => void } = {
	foobar : function (_argv: any[]) {
		const argv = minimist(_argv, {
			boolean: true,
			alias: {
				"o": "output",
				"h": "help",
			}
		});
		console.log(argv);
	}
};

const argv = minimist(process.argv.slice(2), {
	stopEarly: true, // do not parse subcommand args
	boolean: true,
	alias: {
		"h": "help",
	}
});

const subcommand = argv._.shift() as string;
if (!subcommand || argv.help) {
	console.log('Options:');
	console.log('  -h --help: show help');
	console.log('Sub commands:');
	process.exit(argv.help ? 0 : 1);
}

const func = commands[subcommand];
if (!func) {
	console.warn(`Unknown subcommand ${subcommand}`);
	process.exit(1);
}

func(argv._);
  1. トップ
  2. tech
  3. minimist でサブコマンド付きコマンドを実装する

KiCAD の回路図ファイルを CUI で SVG に変換したり、そのままブラウザで見たりする kicad-utils | tech - 氾濫原 の続き。KiCAD の回路図ファイルをブラウザから直接見れるようにしている。

だいぶよくなってきた。完成度85%ぐらいかな?

  • 色がついた
  • 文字レンダリングを KiCAD 同様にストロークフォントを自力描画するように
    • これをやらないと SVG などでフォントメトリクスを正確に知る方法がないため文字位置がどうしてもずれてしまう
  • ウェブのビューワーでクエリパラメータを受けるようになった
  • ブックマークレット経由で即座にプレビューできるようになった

ブックマークレット

index ページから設定できる。

Open with Schematic Viewer をブックマークに追加した状態で github などにある回路図ファイルが入ったディレクトリ (例: KiwiSDR) で実行するとビューワーでひらける。

未解決の問題

回路図ファイルで、コンポーネントの名前や値を表示するときにずれることがある。

この問題はいまいちよくわからない。元のコードを読んでもかなりややこしいことをしてて、何がしたいコードなのかわからない。.sch を編集するときは、.lib 内で定義したラベル類は再配置可能なので、それのためにコードが入ってるのだが、どこ基準で再配置されているのかよくわからない。

今のところの理解ではコンポーネントの中心とラベルの中心が相対的になるように配置する、だと思ってるんだけど、そういうつもりの実装を書いてもうまくいかない。

普通にボックス計算が間違えていたので修正したらなおったっぽい

.lib ファイルが指定されてないときの挙動

  • ...-cache.lib には使っているコンポーネント類がすべてコピーされていると期待しているが、そうではないことがある。
  • ...-cache.lib を配布してないケースがある (KiCAD のヘルプではこれは配布しなくていいことになっている)

最初の問題はよくわからない。あんまり発生しないけどちゃんと調べてない。-cache.lib の生成タイミングがそもそもわかってない。

.lib ファイルを同梱してない .sch の場合、基本的には忠実に再現することはできない。デフォルトで https://github.com/KiCad/kicad-library の最新を読むようにする、とかはできそうだけど、互換性が保たれている保証はない気がする。

...-cache.lib は基本的には配布物に含めたほうがいいと思うんだけど、どうなんだろう。

  1. トップ
  2. tech
  3. KiCAD の回路図ファイルを見るツール (続き)

デモとレポジトリ

回路図ビューワ。開いてすぐ Load from url すると、github で公開されている回路図を読みこんで表示するようになっている。

レポジトリは https://github.com/cho45/kicad-utils

CUI

npx で実行できるようにしてみた。以下のようにすると同名の .svg ファイルを生成する。

npx -p kicad-utils sch2svg path/to/file.sch

経緯

github などに KiCAD の回路図ファイルをアップロードしても実際に閲覧するためにはダウンロードして KiCAD で開くという作業が必要で、これがなかなか面倒くさい。KiCAD は同時に1つしかプロジェクトを開けないので、他の作業をしてるときに別の回路図を開く気が起きない。というかそもそもダウンロードが面倒くさい。

たとえば回路図を複数人で開発するなり、レビューするなりしようと思うとかなり面倒なコンテキストスイッチが発生する。特に github のレビューフローに慣れている人間は github 上で見れないなら見ないので良くない。

他にも理由はあるけどおおむね以上のようなことが主因で、とりあえず CUI で回路図を png や SVG に変換できるツールが欲しいと思った。

実装言語としても検討した結果、使い慣れており応用例が広いブラウザ上で動くことを念頭に TypeScript とした。

実装

最初は KiCAD 自体のファイルを再利用 (emscriptenなど) することを考えたが、全体的に wxWidgets 依存があって無闇にハマりそうと感じた。

その過程で実装を読むと移植してもそれほど工数がかからないのではないかという感じがしたため、TypeScript でフル実装を書く方針とした。

まずコンポーネントライブラリ (.lib) ファイルのパーサーと canvas API を利用するプロッター(レンダラー) を書いた。

次の回路図 (.sch) ファイルのパーサーと対応するプロッターを書いた。この途中で SVG で出力するプロッター実装も書いた。プロッターレイヤーで、canvas 出力と SVG 出力を抽象化していて、これは KiCAD の実装と同様。

というか、できるだけミニマルな実装を書こうと思ったが、そうすると対応が不完全になりがちなのと頭を使いすぎるので、本体変更に比較的追従しやすいようにコードがほぼ1:1対応するような移植を行なった。とはいえもともと C++ なので TS であまりにも不自然なAPIは変更してる。

所感

完成度的にはまだ 70% ぐらい。SheetPin など全く実装してないものもある。色もない。とりあえず見るという目的にはある程度使えるかなというところ。

Chrome 拡張化して github 上に直接表示できるようにしたい。

元ファイルが行指向のフォーマットのため、diff をとって変更したコンポーネントやワイヤに色をつけるみたいなことも頑張ればできそう。

その他

いろいろ鑑みて webpack を初めて導入してみたが設定が辛かった。

  1. トップ
  2. tech
  3. KiCAD の回路図ファイルを CUI で SVG に変換したり、そのままブラウザで見たりする kicad-utils