2018年2月16日金曜日

SVG回りで円弧を平坦化したりDXFから変換したり、追ってはJW_CADと連携したり。変換くん?

「SvgConvForFab」というアプリを作りました。
(多分、バージョンアップか何かで「SvgConv」という名前に変わると思います)
以降、「変換くん」とします。


せっかち人のためのダウンロードはこちら → https://goo.gl/T96fKV

■平坦化とは
円弧(円、円弧、楕円、楕円弧)や曲線を近似の直線群に置き換えることを平坦化と呼ぶようです。少なくともC#のAPI仕様にはそう書いてあった、気がします。

■どういう動作をするのか
SVGファイル(XMLベースのベクターなんとか。Wiki)の「パス」の円弧を平坦化します。ベジエ曲線など、対応していないアレもあります。
DXFファイル(AutoCADのデータ形式とかなんとか。Wiki)はSVGに変換してから平坦化を行ってSVGファイルにしています。

■背景
格安のレーザー加工機を持っています。Fabool Laser Mini といいます。すでに1年以上、可用性と精度の向上が趣味になってしまっています。
(精度に関しては「加工機」という言葉から想定するものと自分的には隔たりがあったのですが、値段が値段ですし、いじることでいろいろ分かりますし、ひとつの趣味としてもまあありなんじゃないかと思っています。購入当初の目的がどんどん先延ばしではありますが)
いろいろクリアしてきましたが、現状では加工機ソフトウェアの曲線の処理がネックとなってきました。だったら、自前で事前に平坦化すればよくなくなくなくない?、って感じです。

加工機ソフトウェアとSVGファイルとDXFファイルとJW_CADとYシャツと私
加工機ソフトウェアの入力がSVGファイルなので、変換くんの出力はSVGファイルになります。
変換くんの入力(1)はSVGファイルです。加工機ソフトウェアの入力がSVGファイルなので、まずは押さえておきます。
変換くんの入力(2)はDXFファイルです。AutoCADを使っている人は多分InkscapaeでSVGファイルに変換していると思いますので少し手間が省けます。
(Inkscapeの起動が重くてですね・・・。あと、Windows版の場合、動作があちこちWindows的で無いというかなんというかであれですよ)
変換くんの入力(3)はJWW(JW_CADのファイル。Wiki)、といいたいところなのですが、バイナリの入出力がめんどく感じたのと、「外部変形」というものを知って、実装するのも使うのも良い感じポイのでこれにしようと思うそうしよう。

■将来的には加工機との通信を行いたい
変換くんが、SVGファイル、DXFファイル、JW_CAD外部変形、すべてに対応できた場合、入力側の実装は十分と思います。(なんせ自分が使っているのがJW_CADで、DXFファイルを入力に含めたのはほとんど行きがけの駄賃だったりしますです。JW_CADのJWWファイルをSVGにするには、JW_CADでDXFファイルを出力→InkscapeでSVGに変換、っていうなんともはぶられている感満載の手順が必要だったりします)
そいで、加工機へ動作指示をするのは、「シリアル通信で」「Gコードぽいなにか」を送ればよいらしいです。冷却休止とか進捗メールとか動作制御での精度向上とかVVVFインバータ鳴り響かせるとか、実装の手間の割りに実現できることが山盛りなのでどうにか実現したいです。
(名前も考えて有ってですね、fConnect、っつーんです。かっこいいっしょ)

■効果
変換を行わなかった場合(F384、100%。直径10mm)

変換を行った場合(F384、100%。直径10mm)
左:開始点と思われる箇所でぶれている
右:誘導に接線を追加したところスムースに

円を加工したら曲線が滑らかになりました。が、一部がいびつになっています。
接線を追加して動きを誘導したところ、きれいな円になりました。

レーザーユニットを左から見たところ
光学キャリアのローレットの高さがレーザーユニットの上下方向の重心
Y軸が動く度に右回り、左回りと動いている模様

どうやら、レーザーユニットがX軸を軸にしてぶれて(回転して)います。
これに関してはハードウェア的な変更か、制御的な変更を行わないと改善しないと思われます。
実際にはポツンと円を加工することは少ない(?)ので、写真ほど顕著ではないと思われる
カットで「一部が抜けていない」現象はこれが原因なのでは無いかと思われる
すなわち、この現象が解決できれば実質的に加工動作のスピードアップになる

■変換くんの使い方
・モジュールをダウンロードします → https://goo.gl/T96fKV
・zipファイルをダウンロードし解凍します (2018/1/28時点でv1.2.0が最新です)
・exeファイルがひとつありますので、任意の場所に設置します
・アプリを起動します
・SVGファイル or DXFファイル をウィンドウにドロップします

DXFファイルの場合、注意メッセージが表示されます

DXFファイルの場合、Inkscapeのダイアログが表示されます
「A4 サイズに自動調整する」のチェックは必ず外してください

・元のファイルと同じディレクトリにファイルが生成されます
ふたつ生成された場合、ファイル名の長い方が使用するファイルです

・およそ、96~128等分されます

・加工結果
上:変換なし
下:変換あり
(穴の直径は、1mm、5mm、10mm)


※DXFファイルを変換するにはInkscapeがインストールされている必要があります (Inkscape 0.91を推奨)
※そういえばWindows Defenderにウィルス検知されたと連絡を貰ったのですが、結局良く分からず。ウィルスは実装していません、って言っても潔白の証明にはならないんですよねぇ

■留意点
・留意事項のほとんどはアプリを動作させたときに表示されます。
・変換後のSVGファイルのサイズは最大で40倍ほどになります。これに起因してかFaboolソフトウェアの動作が不安定になることがありました。加工を行っているときは目を離さないで下さい。
何回も加工していると画面が表示されなくなる現象がたまに出てました(データ例:変換前200KB、変換後1.2MB)。加工する度にChromeを起動し直すようにしたら発生が無くなりました。また、プロジェクトに保存して使用するとさらに安定動作しました。加工機への送信処理よりも、SVGファイルの取り込みにリソースを必要としているようです
・なんらかの損害が発生しても責任は負いかねます。(一度だけ、暴走してぶつけました)
※加工機の動作上の仕様は知らずにアプリを実装しています。何らかの変化により効果が失われることあります。また、タイムリーに改修できない可能性もあります。

■開発環境
以下の環境で実装と動作確認を行っています。

--アプリ動作--
OS:Windows 7 Home (64bit)
既定の.NETFramework:v4.5.2
Inkscape:Inkscape 0.91
SVGファイル:Inkscapeで出力した“Inkscape SVGファイル“、Inkscapeで出力した“プレーンSVGファイル“
DXFファイル:JW_CADで出力したDXFファイル


--加工動作--
OS:Windows 7 Pro (32bit)
Faboolソフトウェア:オフラインバージョン
加工機:Fabool Laser Mini 3.5


※2018/1/28のFacebookへの投稿を再編集

2018年2月11日日曜日

2018年2月10日土曜日

C#で、JW_CADの外部変形用のファイル(JWC_TEMP.TXT)からSVG生成用のGraphicsPathを生成する

JW_CADには「外部変形」という機能があります。
JW_CADが指定のデータを一時ファイルに出力し、ユーザが機能を拡張できる仕組みです。

外部変形の使い方
JWのCADの使い方ー 外部変形プログラム

一時ファイルの仕様はこちらの
DAISY DAISY.. [CAD]
このあたり
jwc_temp.txtの解説(Jw_win)#単線
を参考にさせてもらいました。


コードは概要は下記のようになります。

・ほとんど置き換えているだけで特殊な処理は必要ありませんでした

・Y座標の上下が異なる(JW_CADは左下が原点)のでそこは反転しています

・参考にさせていただいた上記URLには、正円弧に関して
語尾の「1」と「0」は、それぞれ偏平率と軸角。正円弧の場合は「1」と「0」固定でよい
と記載がありましたが、私の環境(8.01b)では
正円弧を作成した後に回転すると末尾の「0」が「90」など回転させた数値になる
となりました

・「曲線」で作成された図形はJW_CADの内部では直線群として扱われているようです

・結果、「単線」「正円」「正円弧、楕円、楕円弧」の3種類のみの処理となりました

ということで、すっきりとした実装になりました。


※「jwwTempItem」はJWC_TEMP.TXTの情報を保持する自作オブジェクトクラス
※GraphicsPath : System.Drawing.Drawing2D.GraphicsPath
※「単線」は単純に座標を移しているだけなので割愛
※90DPIのSVGにするために、別途「(float)((float)90 / (float)25.4)」を乗じています


// --正円の生成 ->
GraphicsPath path = new GraphicsPath();
float x = jwwTempItem.Center.X - jwwTempItem.Radius;
float y = (jwwTempItem.Center.Y * (float)-1.0) - jwwTempItem.Radius;
float w = jwwTempItem.Radius * (float)2.0;
float h = jwwTempItem.Radius * (float)2.0;
path.AddEllipse(x, y, w, h);
// <-正円の生成 --


// -- 円弧、楕円、楕円弧の生成 ->
GraphicsPath path = new GraphicsPath();
float x = jwwTempItem.Center.X - jwwTempItem.Radius;
float y = (jwwTempItem.Center.Y * (float)-1.0) - (jwwTempItem.Radius * jwwTempItem.AspectRatio);
float w = jwwTempItem.Radius * (float)2.0;
float h = jwwTempItem.Radius * (float)2.0 * jwwTempItem.AspectRatio;
float startAngle = jwwTempItem.StartAngle * (float)(-1.0);
float sweepAngle = (jwwTempItem.EndAngle - jwwTempItem.StartAngle) * (float)-1.0;
if (jwwTempItem.EndAngle <= jwwTempItem.StartAngle)
{
    sweepAngle = (jwwTempItem.EndAngle + 360 - jwwTempItem.StartAngle) * (float)-1.0;
}
path.AddArc(x, y, w, h, startAngle, sweepAngle);

// 回転
Matrix matrix = new Matrix();
matrix.RotateAt(jwwTempItem.ShaftAngle * (float)(-1.0), new PointF(jwwTempItem.Center.X, jwwTempItem.Center.Y * (float)-1.0));
path.Transform(matrix);
// <- 円弧、楕円、楕円弧の生成 --



JW_CADで外部変形の範囲選択を行ったところ

変換後のSVGファイルをInkscapeで開いたところ

うぇーい

2018年2月6日火曜日

団塊ジュニアはITの神様に生暖かく祝福されているのかもしれない

第二次ベビーブーム、団塊ジュニア、ピークの学年は今年45歳になる。(まぢか)
イチロー、宮沢りえ。ひとつ下が松井秀樹、後藤久美子。

女子の体操着はブルマで男子は坊主頭、コンビにはどこかに存在はした。
めちゃ、昭和・・・

小学校の頃にファミコン及びMSXというものがありました。あと、超まれにPC98シリーズもいました。

20才台の前半に、エヴァンゲリオン、耳を澄ませば、千と千尋、Windows 95、98・・・、ISDN、ADSL、光ファイバー、自作パソコン、携帯電話、とか。

パソコンはバイトとか仕事で初めてまともに使ったような感じ。
インターネットも一般ユーザへの普及の黎明期。
2chなんて超危険地帯だった。犯罪者のスクツとか言われてた。

そして30才台の後半にスマホ。

結局、パソコンもインターネットもスマホも、気がついたら使いこなしていて、勉強したり頑張ったりしたとかがあんまり無い世代なんじゃないかと。

高校のときにバブルがはじけて、同世代との熾烈(?)な競争の中で生きてきて、実はそれも含めてこっそりラッキーなのかも知れない