Gコードパーサー-1

Adventurer3コントローラーで作成したGコード編集機能を、切り出して、単独で利用できるように公開した。

ソースコードは、Githubから。

何回かに分けて説明を記載。

概要

プログラムはC#で作成しており、全体の構成は次のようになっている。

  • rs274ngcparser
    Gコードファイルの構造を解析する、基本的なライブラリ
  • Translator
    Adventurer3コントローラーで使用している、FlashPrint, Simplify3D, Slic3rで出力したGコードファイルに対して、各種修正を行い、Adventurer3に読み込ませることが可能なような形式に変換するためのライブラリ
  • TranlatorToAdventurer3
    Translatorを使用し、Adevneture3コントローラーのGコードファイル変更をコマンドプロンプトで使用できるようにしたバッチプログラム
  • CalcGcode
    rs274ngcparserを使用し、データを集計する機能を実装した、サンプルプログラム

rs274ngcparser

Gコードを解析するための基本的なライブラリ。

ParseGCodeStreamが解析のためのベースとなるクラスで、実際に解析を行うのはICommandActorインターフェースを実装したクラスになる。

LineCommandは、ファイルから1行読み込み、その行にあるGコードの情報を解析しした結果を保存したもので、ICommandActorではLineCommandをもらい受け、各種処理を行うようにしている。

処理の基本的な流れ

PlantUML Syntax:</p>
<p>actor program</p>
<p>program-> ParseGCodeStream : Parse(Stream, ICommandActor)</p>
<p>activate ParseGCodeStream</p>
<p>ParseGCodeStream -> ICommandActor : PreAction</p>
<p>alt !Stream.EndOfStream</p>
<p>ParseGCodeStream -> Stream : LineRead</p>
<p>Create LineCommand</p>
<p>ParseGCodeStream -> LineCommand : Parse(LineData)</p>
<p>ParseGCodeStream -> ICommandActor : ActionLine(LineCommand )</p>
<p>end</p>
<p>ParseGCodeStream -> ICommandActor : PostAction</p>
<p>deactivate ParseGCodeStream</p>
<p>

ParseGCodeStream

解析のためのベースとなるクラスで、Parseメソッドを主に利用する。

ParseGCodeStream内では読み込んだファイルから1行読み込み、その1行の中にある、コメントやXYZGなどのコード類を解析し、LineCommandを構築する。その構築したLineCommandをICommandActorに渡している。

読み込み可能なファイルはASCIIテキストファイル。ただしFlashPrintはファイルの先頭にバイナリ情報が書き込まれているので、それをそのまま通すと正しく読み込むことができない。

そこで、SkipXGcodeというメソッドを用意しているので、事前にそれを通すことで、先頭のバイナリ情報をスキップして、処理を続行することができる。

そのため、実際のコードは次のようになる。

var actor = new CalcLength(); // これはICommandActor派生
var modifier = new ParseGCodeStream();
ParseGCodeStream.SkipXGcode(stream);
modifier.Parse(stream, actor);

LineCommand

Gコードファイルの1行を解析し、利用しやすいようにした情報。

;から始まるコメントは、Commentプロパティに保存され、X??.?? Y??.??などのフィールド情報は、1文字目の識別子とその後の数値に分解した組を保存しておく。

識別子と数値は、ValuePositionクラスで管理し、保持している情報は、識別子(Key)、値(Value)、フィールドがどの位置にあったか(Position)、浮動小数点桁数(FP)を保持している。

Modifyメソッドを使うことで、ValuePositionデータの更新を行うこともできる。

ICommandActor

ParseGCodeStreamから呼び出される、Gコードについての処理を記述するためのインターフェースクラス。

実際の処理は、このインターフェースを継承したクラスを用意し、その中に記述する。

書き方などについては、CalcGcodeを一部参考にしてもらえれば。CalcGcodeの説明については、別途記述する。

まずはここまで。

コメント

タイトルとURLをコピーしました