ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

2018年10月17日水曜日

CamOnLaser - 加工例

CamOnLaser - Top
動作環境
├ ダウンロード
使い方
バージョン情報
不具合情報


しおり
CAD : Jw_cad
CAM : CamOnLaser v1.3.0
加工機 : Fabool Laser Mini (3.5w)
出力 : 100%
回数 : 1回
加工速度 : 384mm/min
素材 : 色紙
ハニカムの頂点距離 : 2.5mm
ハニカムの間隔 : 0.5mm

しおり
CAD : Jw_cad
CAM : CamOnLaser v1.3.0
加工機 : Fabool Laser Mini (3.5w)
出力 : 100%
回数 : 1回
加工速度 : 352mm/min
素材 : 色紙
ハニカムの頂点距離 : 2.5mm
ハニカムの間隔 : 0.5mm

しおり
CAD : Jw_cad
CAM : CamOnLaser v1.3.0
加工機 : Fabool Laser Mini (3.5w)
出力 : 100%
回数 : 1回
加工速度 : 384mm/min
素材 : 色紙(薄黄緑)
穴直径 : 2.5mm

加工テスト
CAD : Jw_cad
CAM : CamOnLaser v1.3.0
加工機 : Fabool Laser Mini (3.5w)
出力 : 100%
回数 : 2回
加工速度 : 288mm/min
素材 : 工作用紙
穴直径 : 2mm、6mm
ハニカムの頂点距離 : 2.5mm
ハニカムの間隔 : 0.5mm


CamOnLaserのアイコン
CAD : Jw_cad
CAM : CamOnLaser v1.2.0
加工機 : Fabool Laser Mini (3.5w)
出力 : 100%
回数 : 1回
加工速度 : 512mm/min
素材 : 色紙
ハニカムの頂点距離 : 2.5mm
ハニカムの間隔 : 0.5mm

脚部品
CAD : Jw_cad
CAM : CamOnLaser v1.2.0
加工機 : Fabool Laser Mini (3.5w)
出力 : 100%
回数 : 2回
加工速度 : 256mm/min
素材 : 工作用紙
穴直径 : 2mm、6mm
ハニカムの頂点距離 : 2.5mm
ハニカムの間隔 : 0.5mm

しおり
CAD : Jw_cad
CAM : CamOnLaser v1.2.0
加工機 : Fabool Laser Mini (3.5w)
出力 : 100%
回数 : 1回
加工速度 : 512mm/min
加工時間 : 約45分
素材 : 色紙
ハニカムの頂点距離 : 2.5mm
ハニカムの間隔 : 0.5mm


しおり
CAD : Jw_cad
CAM : CamOnLaser v1.2.0
加工機 : Fabool Laser Mini (3.5w)
出力 : 100%
回数 : 1回
加工速度 : 384mm/min
素材 : 色紙
穴直径 : 5mm

しおり
CAD : Jw_cad
CAM : CamOnLaser v1.2.0
加工機 : Fabool Laser Mini (3.5w)
出力 : 100%
回数 : 1回
加工速度 : 512mm/min
加工時間 : 約45分
素材 : 色紙
穴直径 : 0.4 ~ 6.5 mm

CamOnLaser - 設定:引きずり誤差補正

CamOnLaser - Top
動作環境
├ ダウンロード
使い方
バージョン情報


引きずり誤差とは
名づけました。
良く分かる例がこれです。
機械的な調整を突き詰めた上で、「正円が加工できない」と表現上される現象の多くがこれかも知れません。

直径20mmの円の進入点
直上60mmの地点から加工開始
加工速度 : 384mm/min
CamOnLaser : v1.2.0
右回り


補正の内容
この「正円が加工できない」現象は既定のプログラム内部での数値の誤差と予想していましたが、ComOnLaser でも全く同様に発生しました。(ある意味正しく再現したといえる)
ですので、物理現象と予想し、試行した結果、Y方向に 0.075mm、X方向に 0.025mm、移動方向に対してプラスの補正を行ったところ改善しました。(数値は調整の結果です)


推測をたとえると、学校の校庭でラインマーカーを使って線を引くとき、手首に力を入れないで「自分」が「円の真上」を歩くと、白線はずれます。
綺麗な円を引こうと思うと、「自分」は「円の外側」を歩くことになると思います。座標系で言うと、「移動方向に対してプラス」となります。
それの補正が上記の 0.075mm と 0.025mm なのだろうと思っております。


レーザー加工機の個体差(推測)
上記の補正の値は ComOnLaser のアプリケーション初期値になっています。
が、ベルトの張りの強さに大きく依存すると推測され、調整が必要なことが多いと思います。


設定の方法
「設定」→「Advanced settings」の値を変更します。
問題は設定する数値を求める方法です。
少しややこしいのですが、以下に例示します。

工作用紙に直径20mmの円をくりぬきます。
このときに「右回り」だったのか「左回り」だったのかを把握しておきます。
例では右回りでした。

くりぬいた穴に1円玉をはめ、光にすかします。
直上60mmの地点から加工開始
加工回数 : 2回
加工速度 : 256mm/min
CamOnLaser : v1.2.0
右回り

この場合、Y方向にプラスの補正が必要になります。

Y方向の補正が過大になった場合は値を減らして追い込んでいきます。

Y方向の補正が進むと、X方向の誤差が顕在化してきます。
誤差が大きい方の補正を繰り返す形になります。

最終的にはこのようになりました。
直上60mmの地点から加工開始

真右60mmの地点から加工開始


今回は直径20mmのみで補正の設定を行いましたが、直径5mm や 2mm の円の加工結果を見るとさらなる補正の余地を感じます。
適した基準器があればさらに追い込めるかも知れません。

CamOnLaser - 不具合情報

CamOnLaser - Top
動作環境
├ ダウンロード
使い方
├ バージョン情報
加工例


■加工範囲ギリギリで加工を行おうとすると範囲エラーになる
・管理番号:不具合001
・ステータス:確認中
・対象機能:加工実行
・対象箇所:「チェック」ボタン
・発生動作:「チェック」ボタン押下時
・発生内容:原点 を 加工原点 にすると範囲のチェックでエラーになる
・原因:引きずり誤差補正 の補正量を考慮していない為と思われる
・不具合レベル:回避可能
・対処:次期バージョン(v1.3.1.x もしくは v1.4.x.x)にて改修の可能性
・記載日:2019/7/13

■「移動」の X軸の値 の範囲チェックが不正
・管理番号:不具合002
・ステータス:現象確認済み
・対象機能:加工位置
・対象箇所:「移動」の X値 のテキストボックス
・発生動作:範囲チェック (値を入力してフォーカスアウト時)
・発生内容:範囲に入っているのにエラーになることがある。範囲に入っていないのにエラーにならないことがある
・原因:誤って Y軸の範囲 と比較していると思われる
・不具合レベル:回避可能だが、それにより若干のリスクが発生する
・対処:次期バージョン(v1.3.1.x もしくは v1.4.x.x)にて改修予定
・記載日:2019/7/13



こちらに登録されていない不具合を発見された場合、コメント欄に記載いただけたら幸いです。
その場合、CamOnLaserのバージョン、PCのOS、レーザー加工機の機種 もあわせて記載をお願いします。

なお、各種の状況により対処に制限が発生する可能性もありますこと予めご了承ください。

CamOnLaser - バージョン情報

CamOnLaser - Top
動作環境
├ ダウンロード
使い方
バージョン情報


CamOnLaser v1.3.0.0
コンパイル : 2018/10/13
リリース : 2018/10/17
更新内容 : 新規リリース

CamOnLaser - 使い方

CamOnLaser - Top
動作環境
├ ダウンロード
使い方
バージョン情報


Jw_cadからの連携
事前に「設定」の「Jw_cadから連携の初期設定」を行う必要があります。
├ CamOnLaser.exe を起動します。
 「設定」→「Jw_cadから連携の初期設定」を実施します。
└ CamOnLaser.exe を終了します。

加工機を制御するPCにて 加工データを Jw_cad で開きます。
「その他」→「外部変形」で「CamOnLaser.exe-連携.bat」を選択します。

加工範囲を選択して、「選択確定」を押下します。


CamOnLaserの使い方
データが連携された状態で CamOnLaser が起動します。
タブの順番に「加工条件」「加工位置」「加工実行」の必要な操作を行います。

操作に必要な情報はアプリケーション内部に表示されます。


※送り移動後に一瞬停止する動作に関して
加工機のデータバッファの関係で意図して行っています。
加工の完了ではありませんので注意してください。
加工の完了時はレーザーユニットが原点に戻ります。

CamOnLaser - 動作環境

CamOnLaser - Top
動作環境
├ ダウンロード
使い方
バージョン情報


動作要件
PC : Windows 7、Windows 8.1、Windows 10 がストレスなく動作するPC
OS : Windows 7、Windows 8.1、Windows 10 (※A)
使用メモリ : 20 ~ 100 MB (およそ)
使用ディスク容量 : 2 MB (およそ)
ディスプレイサイズ(最低) : 800 * 600
ディスプレイサイズ(推奨) : 1280 * 800 以上
レーザー加工機 : Fabool Laser Mini、および シリーズ製品

※A)
ターゲットフレームワークは .NET Framework 4.5.2
Windows 7、Windows 8.1、Windows 10 に標準インストールされている .NET Framework で互換動作する
.NET Framework 4.5.2、もしくは互換の .NET Framework がインストールされているPCであれば、他のOSでも動作するかも知れない


動作確認済みOS
Windows 7 Home 64bit
Windows 7 Professional 32bit
Windows 10 Pro 64bit


動作確認済みレーザー加工機
Fabool Laser Mini (2016年7月版)

※動作確認情報をコメント欄にお寄せいただけるとありがたいです

CamOnLaser - Top

CamOnLaser - Top
動作環境
├ ダウンロード
使い方
バージョン情報


CamOnLaserとは
2016年の7月に Fabool Laser Mini を購入しました。
精度を求めてハードウェアの改修を行っていました。
つど精度は向上したものの、決定打と思われた改修で特段の効果が得られず。
いろいろ試してみたところ、制御ソフトウェアを改修すれば精度が向上する可能性が高いと分かりました。

あわせて、Jw_cad フレンドリーにする、操作に官能性を持たせる、などを要求定義としました。

そして、10ヶ月、そこそこいい感じにできましたです。
よろしければ使ってみてください。

これが
直径は内側から 2、5、10mm
出力 : 100%
回数 : 1回
加工速度 : 320mm/min

こうなりました。

CamOnLaser : v1.3.0
(加工条件は同じ)

※ハードウェア改修済みの Fabool Laser Mini (3.5w) にて動作

2018年10月14日日曜日

CamOnLaser - ダウンロード

CamOnLaser - Top
動作環境
├ ダウンロード
使い方
バージョン情報


注意事項
当アプリケーションの使用により発生したいかなる損害も責任を負いかねます。

証明書に関して
個人で作成していますので証明書は設置しておりません。

ダウンロード時の警告に関して
「使用実績がほとんどありません」等の警告メッセージが表示されることがあります。

ウィルス対策ソフトに関して
メジャーなアプリケーションではありませんので誤検知により駆除されることがあります。使用する場合には復元など行ってください。
また、画面の動作が極端に遅くなる現象も発生しました。このときは、設置ディレクトリを常時スキャンの対象から除外して現象は解消しました。
残念ながら、弊者から当アプリケーションの安全性を証明する手段はありません。

レーザー加工機に関して
当アプリケーションの動作確認を行っているレーザー加工機は、2016年の7月に購入し、1年半に渡ってハードウェアの改修を行った Fabool Laser Mini です。
当該以外のレーザー加工機での動作の安定性や精度に関しては未確認になっています。
※動作確認情報をお寄せいただけるとありがたいです

ダウンロード
CamOnLaser v1.3.0 @2018/10/17 → https://goo.gl/vmaapZ

設置
ダウンロードされたzipファイルを解凍します。
解凍された exeファイル を任意の場所に設置します。

動作環境(ソフトウェア関係)
CamOnLaser.exe を起動し、「バージョン情報など」→「各種情報」を参照してください。

2018年9月7日金曜日

Jw_cadの外部変形のデータをC#で処理したら楕円弧の角度がずれてしまい、三角関数での計算が必要とのことで数学的に頑張ったメソッド

Jw_cadに外部変形と言う機能があります。
本来の使い方とは少し違うかも知れませんが、書き出したデータを自作アプリケーション(CamOnLaser)で読み込むことにより連携する処理を作っています。
(Jw_cad --外部変形-> CamOnLaser --USBシリアル通信-> レーザー加工機)

アプリケーションの完成が見えてきて、テストを兼ねた実加工を順調に行っていましたが、一部の加工がずれた…

最外周とその内側が楕円弧です
内側の楕円弧が一見では不規則にカットされている


よくよく調べてみると、Jw_cadが書き出している、楕円弧の開始角度と終了角度が思っていたのと違う。
どうやら、数学的に意味があってこうなっているぽい、らしい。とのことで、三角関数で変換を行いました。

作図した楕円弧は緑の部分
対して、出力されるのは赤の円弧に対応する角度
黒の矢印の経路で必要とする角度を取得
(数式はいろいろ怪しいので省略)


ノートに数式を、しかも三角関数とか20年ぶり位じゃなかろうかと怪しげに書いては直して表計算スプシで確認しつつ1日、その後、実装してしたところカッチリ動いている。想定外だっ・・・
上手くいっています
穴の直径が2mm
6角形の頂点距離(?)2.5mm
肉抜きの結果、残った幅が0.5mm
ここまで拡大すると粗が目立ちますが・・・


/// 楕円に関する角度を取得(変換)する
/// (JWC_TEMP.TXTの角度は外接する正円の座標ベースの角度であるので楕円の場合は変換が必要)
/// ※※ 引数は傾ける前の値が必要 ※※
/// ※※ ごにょごにょ計算した結果、radius(半径)は打ち消されて消滅したが、アレなので引数に含めておく ※※
private float GetEllipseAngle(float radius, float aspectRatio, float angle)
{
    // 引数の確認
    if (radius < float.Epsilon) { return angle; }   // そのまま返す
    
    // 正円(弧)の確認
    if (aspectRatio == (float)1.0) { return angle; }
    
    // 90度単位の確認
    if (angle % (float)90.0 < float.Epsilon) { return angle; }
    
    // 角度の管理
    float temp_angle = angle % (float)360.0;
    
    // 象限の取得(0:第一象限~3:第四象限)
    int quadrant = (int)Math.Floor(temp_angle / (float)90.0);
    
    // 第二象限と第四象限の場合は、半径と扁平率をX方向とY方向で入れ替える
    float temp_radius = radius;
    float temp_aspectRatio = aspectRatio;
    if (quadrant == 1 || quadrant == 3)
    {
        temp_radius = radius * aspectRatio;     // 使用しない
        temp_aspectRatio = (float)1.0 / aspectRatio;
    }
    
    // 角度を第一象限に移動する
    temp_angle = temp_angle - ((float)quadrant * (float)90.0);
    
    // コサインの計算
    float cosA = (float)Math.Cos(temp_angle * Math.PI / (double)180.0);
    
    // 楕円上の座標のタンジェントを計算
    float temp_ret = temp_aspectRatio * (float)Math.Sqrt((float)1.0 - cosA * cosA) / cosA;
    
    // アークタンジェントを取る
    temp_ret = (float)Math.Atan(temp_ret);
    
    // ラジアンから戻す
    temp_ret = temp_ret * (float)180.0 / (float)Math.PI;
    
    // 象限を戻す
    float ret = temp_ret + ((float)quadrant * (float)90.0);
    
    // 返す
    return ret;
}


そういえば、「180」を「(double)180.0」とかしていますが、そんなことをしなくても内部的にdouble型になった後に計算されるはずです。が、覚えておくのが面倒なので明示的にキャストするようにしています。(思考停止)

2018年6月20日水曜日

C#でユーザコントロール側(参照先)からフォーム側(参照元)のメソッドをイベントを介して使用する方法を覚えないで毎度調べているのでメモ

--手っ取り早く済ます方法->

/// フォーム側
namespace HogeSpace
{
    public partial class formHoge : Form
    {
        (中略)
        
        /// ロードされたとき
        private void formHoge_Load(object sender, EventArgs e)
        {
            // ユーザコントロールにイベントハンドラーを設定する
            this.userControlHoge.SetHogeEventHandler += new EventHandler(this.SetHoge);
        }
        
        (中略)
        
        /// ユーザコントロールから使用されるメソッド
        private void SetHoge(object sender, EventArgs e)
        {
            // キャストして確認する
            string str = sender as string;
            if (str  == null) { return; }
            
            // ラベルに表示するとか
            this.lblHoge.Text = str;
        }
    }
}

/// ユーザコントロール側
namespace HogeSpace
{
    public partial class userControlHoge : UserControl
    {
        // イベントハンドラー
        public event EventHandler SetHogeEventHandler = null;
        
        (中略)
        
        /// テキストボックスからフォーカスアウトしたとき
        private void txtHoge_Leave(object sender, EventArgs e)
        {
            // イベントの設定の確認
            if (this.setHogeEventHandler  == null) { return; }
            
            // フォーム側に値を適用する
            this.SetHogeEventHandler (((TextBox)sender).Text, null);
        }
    }
}

<-手っ取り早く済ます方法--


--型を固定したり戻り値を取ったりする方法->

/// フォーム側
namespace PiyoSpace
{
    // イベントの型定義
    // (同じnamespace配下であればどの.csに記載しても大丈夫(のはず))
    public delegate string PiyoEventHandler(int index);    // <-
    
    public partial class formPiyo : Form
    {
        (中略)
        
        /// ロードされたとき
        private void formPiyo_Load(object sender, EventArgs e)
        {
            // ユーザコントロールにイベントハンドラーを設定する
            this.userControlPiyo.GetPiyoEventHandler += new PiyoEventHandler(this.GetPiyo);
        }
        
        (中略)
        
        /// ユーザコントロールから使用されるメソッド
        private string GetPiyo(int index)
        {
            // フォームのリストビューから指定されたインデックスの文字列を返すとか
            string ret = string.Empty;
            try
            {
                ret = this.listViewPiyo.Items[i].ToString();
            }
            catch
            {
                ret = string.Empty;
            }
            
            return  ret;
        }
    }
}

/// ユーザコントロール側
namespace PiyoSpace
{
    public partial class userControlPiyo : UserControl
    {
        // イベントハンドラー
        public event PiyoEventHandler GetPiyoEventHandler = null;
        
        (中略)
        
        /// コンボボックスの選択が変更されたとき
        private void cmbPiyo_SelectedIndexChanged(object sender, EventArgs e)
        {
            // イベントの設定の確認
            if (this.getPiyoEventHandler == null) { return; }
            
            // 選択しているインデックスを取得する
            int index = ((ComboBox)sender).Selectedindex;
            
            // フォーム側から値を取得する
            string str = this.GetPiyoEventHandler (index);
            
            // ラベルに表示してみるとか
            this.lblPiyo.Text = str;
        }
    }
}

<-型を固定したり戻り値を取ったりする方法--


動作しているコードからコピー/編集しました
※編集後のコンパイル/動作確認は行っていません

2018年2月17日土曜日

「変換くん」にレーザー加工機と通信する機能を追加して「fConnect」なるアプリを作ろうと思うのだけれど、それの要件定義と外部設計を兼ねたスケルトン

「fConnect」というアプリのスケルトン(画面のみで実際の動作が実装されていない)を作りました。
以降、「接続くんスケルトン」とします。

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

■「fConnect」は何をするものなのか
CAD(など)で作成した平面データを読み込みます。
線色毎に動作条件(順序、出力、速度)を設定します。
レーザー加工機(FABOOL Laser Mini など)にデータを送信して動作させます。
その他、原点復帰や範囲確認など動作上の基本的な動作を加工機に指示します。
以降、「接続くん」とします。
※接続くん : 実際に動作する、これから実装するモジュール
※接続くんスケルトン : 今回の画面動作のみのモジュール

■なぜ「接続くん」を作るのか
当者が求めるのは「できるだけ精度よく」「ベクター加工を行う」となります。レーザー加工機のユーザとしては少し偏っている可能性もあります。
そして、先日、メーカー純正のソフトウェアがアップデートされましたが、当者とはだいぶ異なる方向性でありました。
だったら作れば良いじゃないって自分の中のアントワ.NETがいうので、自分のほしい機能とスペックの段階的な実現を目指すことにしました。

■何を「接続くん」に求めるのか
「操作性」「動作精度」「実装のメンテナンス性」を重要視します。
具体的には「官能的(?)に操作ができ」「加工機の機械的電気的なポテンシャルを引き出し」「状況に応じた改修の容易なプログラムの実装」となります。
最後の項目は内部的な内容です。

■立脚点
当方の現在の環境と内容が、
・JW_CADでデータを作成する
加工したい箇所をJW_CADでDXFファイルに変換する
DXFファイルをInkscapeで開いてSVGファイルに変換する
メーカー純正のソフトウェアに取り込む
カットする
と、なっています。
これが、「接続くん」を使用する場合は。
・JW_CADでデータを作成する
・JW_CADの外部変形を使用して選択範囲のデータを「接続くん」に取り込む
・カットする
と、変更されます。
また、「変換くん」の実装を流用して、「DXFファイル」「SVGファイル」を入力対象に含めるのは比較的容易です。
※ラスター加工の実装は当面予定されないと思われる

■超上流工程的なもの
このドキュメント(?)がある程度、超上流工程の内容になっています。
それ以外は基本的に省略します。
必要になったら遡って作成/追加するかもしれません。

■想定する動作環境
OS : Windows 7 ~ Windows 10
加工機 : メーカー純正の「オフラインバージョン」ソフトウェアが動作する加工機

■想定する開発手法
スパイラル開発を行います。※用語の正確なところは軽くスルーの方向でよろしくです
事前に最終形態と思われる実装内容を仮で定義し、優先度をつけて段階的にかつ長すぎないスパンでリリースを行います。リリースを行うたびに以降の実装内容を検討し、これを繰り返します。

■実装における責任等
フルスピードで実装するのは不可能ですので、最初期バージョンで、夏頃リリース、何かの弾みで5月頃にリリースできるかも知れない、くらいに設定します。
また、なんらかの都合で実装の中断、中止も有りうるものとします。
モジュールのリリース後も責任を持った対応は基本的に期待できないものとします。
リリースにおいて、βリリースとし、ユーザにテスト等の負担とリスクを負ってもらう可能性もあるとします。
もし何らかの協力をいただける場合も、上記不利益の可能性を納得の上のこととします。
(それと・・・、自分の必要とする内容が実現したら急にテンションが下がるとかもありうるのがリスクかも知れません)

■今回のモジュール
「接続くん」のスケルトン(画面のみで実際の動作が実装されていない)になります。
動作のイメージを確認し、共有することができます。
画面操作(クリック、入力、Tab動作)に関しては、実装後の内容とほぼ同じとなります。
一部(Jogの移動量変更など)は多少動作します。(表示の数値の変化など)

■目的
基本的には上述の前提で実装を行おうと思いますが、無人の荒野を一人進んでしまうともったいないのでその可能性を下げるのがひとつ大きな目的になります。
また。想定外に大きく多くの要望があれば、全体プランの見直し等の検討もできます。
どうしても取捨や優先順序は発生してしまいますが、コメント欄に記載いただけると幸いです。
(コメント欄、多分、機能する、はず)
場合によってはアンケートを実施することもできるようです。

■動作方法と確認内容
・モジュールをダウンロードします → https://goo.gl/HfnvYR
・zipファイルをダウンロードし解凍します (2018/2/17時点でv1.0.0が最新です)
・exeファイルがひとつありますので、任意の場所に設置します
・アプリを起動します
起動直後の画面です
実質的にこのサイズがディスプレイの最小必要解像度になるかと思います

・メニューバー
シリアルポート関係の項目が設置されると思います
実装上、工夫の余地が少ない部分と思います

・機種選択(加工エリアサイズ指定)と図形描画エリア
機種選択を行うことによって加工エリアサイズを特定します
必要な場合は直接入力できます
図形の描画は長方形などの単純化した図形でも大丈夫なのかもしれません

・加工条件などのエリア
右側の4つのタブで「加工条件」「回転、繰り返し」「加工位置」「加工実行」の操作を行います
基本的にタブの順序で操作することになります
ここの部分の操作性が特に重要と思います
配色にセンス的なものを求めても無い袖は振れないのです
(無い袖は触れないと思ってました。すれ違うときにあたら無い的な)

・加工条件
各色まとめて条件の設定ができます
その後、色個別に条件の設定ができます
図形描画エリアとの間を動かせるようにして、各色の設定項目を横一列に・・・、する??
(現状でも部品の設置は相当複雑になっています)
(実装の確実性を考慮してここでとどめるか、操作性を優先して踏み込むか・・・)
設定されている色はJW_CADの標準色(?)になります
色の関係で初っ端はJW_CADの外部変形のみの対応になるかも・・・
設定値を保存する機能はPhase2以降の実装になると思います

・回転、繰り返し

「回転、反転」はCAD側での編集と管理が簡便になるような気がします
「繰り返し」は似た様な部品をたくさん作るときに便利かなー、と
実装はおそらくPhase3以降になると思います
(こう見ると回転のアイコン酷いな・・)


・加工位置
「移動」or「Jog」でレーザーユニット(?)を動かし、その座標を加工原点(?)に設定します
これはPhase1で必要な機能になります

・加工実行
「通知」と「一時休止(冷却)」はPhase2かPhase3での実装になると思います
「進捗」はPhase2になりそうですがPhase1にできれば入れたいとも思います

■開発環境
以下の環境で実装と動作確認を行う予定です。

--共通--
既定の.NETFramework:v4.5.2
Inkscape:Inkscape 0.91
SVGファイル:Inkscapeで出力した“Inkscape SVGファイル“、Inkscapeで出力した“プレーンSVGファイル“
DXFファイル:JW_CADで出力したDXFファイル
JW_CAD外部変形 : JW_CAD 8.01b

--実装--
OS:Windows 7 Home (64bit)
開発環境 : C# (Visual Studio Community 2017)

--加工動作--
OS:Windows 7 Pro (32bit)
加工機:Fabool Laser Mini 3.5


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への投稿を再編集