4
License: The same modified LGPL as the Free Pascal RTL
5
See the file COPYING.modifiedLGPL for more details
7
AUTHORS: Felipe Monteiro de Carvalho
8
Pedro Sol Pegorini L de Lima
10
unit avisocncgcodereader;
22
{ Used by tcutils.SeparateString }
23
T10Strings = array[0..9] of shortstring;
25
{ TvAvisoCNCGCodeReader }
27
TvAvisoCNCGCodeReader = class(TvCustomVectorialReader)
29
LastX, LastY, LastZ: Double;
30
function SeparateString(AString: string; ASeparator: Char): T10Strings;
31
procedure ReadString(AStr: string; AData: TvVectorialPage);
32
function GetCoordinate(AStr: shortstring): Integer;
33
function GetCoordinateValue(AStr: shortstring): Double;
35
{ General reading methods }
36
procedure ReadFromStrings(AStrings: TStrings; AData: TvVectorialDocument); override;
42
{ Coordinate constants }
44
INT_COORDINATE_NONE = 0;
51
STR_GCODE_LINEAR_MOVE = 'G01';
52
STR_GCODE_STEPPER_MOVE = 'S01';
53
STR_GCODE_2DBEZIER_MOVE = 'B02';
54
STR_GCODE_3DBEZIER_MOVE = 'B03';
55
STR_GCODE_DRILL_UP = 'P01';
56
STR_GCODE_DRILL_DOWN = 'P02';
58
{ TvAvisoCNCGCodeReader }
61
Reads a string and separates it in substring
62
using ASeparator to delimite them.
66
Number of substrings: 10 (indexed 0 to 9)
67
Length of each substring: 255 (they are shortstrings)
69
function TvAvisoCNCGCodeReader.SeparateString(AString: string; ASeparator: Char): T10Strings;
71
i, CurrentPart: Integer;
76
for i := 0 to 9 do Result[i] := '';
78
{ Iterates througth the string, filling strings }
79
for i := 1 to Length(AString) do
81
if Copy(AString, i, 1) = ASeparator then
85
{ Verifies if the string capacity wasn't exceeded }
86
if CurrentPart > 9 then Exit;
89
Result[CurrentPart] := Result[CurrentPart] + Copy(AString, i, 1);
93
procedure TvAvisoCNCGCodeReader.ReadString(AStr: string;
94
AData: TvVectorialPage);
97
DestX, DestY, DestZ: Double;
100
{$ifdef FPVECTORIALDEBUG}
101
WriteLn('TvAvisoCNCGCodeReader.ReadString ', AStr);
103
AParams := SeparateString(AStr, ' ');
111
if AParams[0] = STR_GCODE_DRILL_UP then
113
AData.AddLineToPath(LastX, LastY, 0);
116
else if AParams[0] = STR_GCODE_DRILL_DOWN then
118
AData.AddLineToPath(LastX, LastY, 50);
121
else if AParams[0] = STR_GCODE_LINEAR_MOVE then
129
case GetCoordinate(AParams[i]) of
130
INT_COORDINATE_X: DestX := GetCoordinateValue(AParams[i]);
131
INT_COORDINATE_Y: DestY := GetCoordinateValue(AParams[i]);
132
INT_COORDINATE_Z: DestZ := GetCoordinateValue(AParams[i]);
138
AData.AddLineToPath(DestX, DestY, DestZ);
144
else if AParams[0] = STR_GCODE_2DBEZIER_MOVE then
146
AData.AddBezierToPath(
147
GetCoordinateValue(AParams[1]),
148
GetCoordinateValue(AParams[2]),
149
GetCoordinateValue(AParams[3]),
150
GetCoordinateValue(AParams[4]),
151
GetCoordinateValue(AParams[5]),
152
GetCoordinateValue(AParams[6])
155
LastX := GetCoordinateValue(AParams[5]);
156
LastY := GetCoordinateValue(AParams[6]);
158
else if AParams[0] = STR_GCODE_3DBEZIER_MOVE then
160
AData.AddBezierToPath(
161
GetCoordinateValue(AParams[1]),
162
GetCoordinateValue(AParams[2]),
163
GetCoordinateValue(AParams[3]),
164
GetCoordinateValue(AParams[4]),
165
GetCoordinateValue(AParams[5]),
166
GetCoordinateValue(AParams[6]),
167
GetCoordinateValue(AParams[7]),
168
GetCoordinateValue(AParams[8]),
169
GetCoordinateValue(AParams[9])
172
LastX := GetCoordinateValue(AParams[7]);
173
LastY := GetCoordinateValue(AParams[8]);
174
LastZ := GetCoordinateValue(AParams[9]);
178
Ignore any of these codes:
180
STR_GCODE_STEPPER_MOVE
186
function TvAvisoCNCGCodeReader.GetCoordinate(AStr: shortstring): Integer;
188
Result := INT_COORDINATE_NONE;
190
if AStr = '' then Exit
191
else if AStr[1] = 'X' then Result := INT_COORDINATE_X
192
else if AStr[1] = 'Y' then Result := INT_COORDINATE_Y
193
else if AStr[1] = 'Z' then Result := INT_COORDINATE_Z;
196
function TvAvisoCNCGCodeReader.GetCoordinateValue(AStr: shortstring): Double;
200
if Length(AStr) <= 1 then Exit;
202
Result := StrToFloat(Copy(AStr, 2, Length(AStr) - 1));
206
The information of each separate path is lost in G-Code files
207
Only one path uniting all of them is created when reading G-Code
209
procedure TvAvisoCNCGCodeReader.ReadFromStrings(AStrings: TStrings;
210
AData: TvVectorialDocument);
213
FirstPage: TvVectorialPage;
215
{$ifdef FPVECTORIALDEBUG}
216
WriteLn('TvAvisoCNCGCodeReader.ReadFromStrings AStrings = ', PtrInt(AStrings), ' AData = ', PtrInt(AData));
219
FirstPage := AData.AddPage();
220
FirstPage.StartPath(0, 0);
222
for i := 0 to AStrings.Count - 1 do
223
ReadString(AStrings.Strings[i], FirstPage);
225
{$ifdef FPVECTORIALDEBUG}
226
WriteLn('AData.EndPath');
233
RegisterVectorialReader(TvAvisoCNCGCodeReader, vfGCodeAvisoCNCPrototipoV5);