2019年7月2日火曜日

SVGとか

 ためしに、ImageMagick.MagickImageでSVGを読み込んでみました。あまりうまくは動いていません。
 ImageMagick.MagickImageのコンストラクタでSVGのファイルパスを与え、インスタンスのToBitmapでSystem.Drawing.Bitmapが得られます。また、コンストラクタのいくつかのパラメーターで、倍率(SVGでの単位距離を何ピクセルとして扱うか)や、トリミング(倍率適用後のXYWHで指定)を設定できます。
 問題なのは、ベクタとラスタの変換がどこで行われているかで、おそらく、倍率を設定してラスタに変換し、その後トリミングする、という挙動のようです。トリミングして描画するより、描画してトリミングするほうが、処理としては遥かに簡単に書けるので、さもありなんという感じですが、細かい情報を拾おうとすると倍率を大きくせざるを得ず、大きな図を与えられるとメモリ不足っぽい感じで例外が発生してしまいます。
 今回の用途には、ImageMagick.MagickImageは使えない感じです。


 ラスタ画像からツールパスへの変換は、妄想や願望を大いに含めれば、そんなに難しくはない気がします。一番のネックは、KiCADからのデータの受け渡しのような気がします。

 KiCADでは、ガーバーやDXF、SVG、HPGL、といったいくつかのフォーマットで吐き出すことができます。
 HPGLはwikipediaの概要をちょっと読んだ程度ですが、面白そうなフォーマットですね。ガーバーもGコードもHPGLも似たようなフォーマットのような気もしますが。。プロッターとかに渡すためのデータフォーマットだと、自然と似たような形式になっていくのかもしれません。

 KiCADから直接ラスタ画像を出せないのかな、とググってみましたが、SVGやPostScriptを経由して外部プログラムでラスタ化するのがよくある方法のようです。
 PostScriptはImageMagick.MagickImageで読み込めるようですが、IM.MIを使うのでは意味がないわけで、それ以外ではPostScriptをサクッと読む手段はあまり無いようです。

 HPGLをC#で読み込むというネタはググってもほとんど出てきませんが、実態はASCIIベースの1行ごとにコマンドと引数が入っているデータですから、NCプログラム以上に扱いやすいフォーマットだと思います。情報量という点ではNCプログラムだとググれば様々な解説ページが出てきますが、幸いにしてHPGLはwikipediaにコマンドセットの一覧があるので、なんとかなりそうな気がします。まぁ、ちらっとKiCADが吐いたHPGLを見るだけでも、wikipediaに書かれていないコマンドが出てきているので、先が思いやられますが。

 たぶんガーバーもそれなりに情報量は多いでしょうから、HPGLが難しいようなら並行してガーバーも情報収集してみます。


/* CNCフライス1台買うだけで、いろんな知識が要求されるなぁ。。。ダイナミックレンジ広すぎるよ。。。 */

0 件のコメント:

コメントを投稿