mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-18 22:09:34 +02:00
120 lines
3.3 KiB
ObjectPascal
120 lines
3.3 KiB
ObjectPascal
{
|
|
Writes AvisoCNC G-Code
|
|
|
|
License: The same modified LGPL as the Free Pascal RTL
|
|
See the file COPYING.modifiedLGPL for more details
|
|
|
|
AUTHORS: Felipe Monteiro de Carvalho
|
|
Pedro Sol Pegorini L de Lima
|
|
}
|
|
unit avisocncgcodewriter;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils,
|
|
fpvectorial;
|
|
|
|
type
|
|
{ TvAvisoCNCGCodeWriter }
|
|
|
|
TvAvisoCNCGCodeWriter = class(TvCustomVectorialWriter)
|
|
private
|
|
procedure WritePageToStrings(AStrings: TStrings; AData: TvVectorialPage);
|
|
public
|
|
{ General reading methods }
|
|
procedure WriteToStrings(AStrings: TStrings; AData: TvVectorialDocument); override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TvGCodeVectorialWriter }
|
|
|
|
procedure TvAvisoCNCGCodeWriter.WritePageToStrings(AStrings: TStrings;
|
|
AData: TvVectorialPage);
|
|
var
|
|
i, j: Integer;
|
|
Str: string;
|
|
APath: TPath;
|
|
CurSegment: T2DSegment;
|
|
Cur3DSegment: T3DSegment;
|
|
Cur2DBezierSegment: T2DBezierSegment;
|
|
Cur3DBezierSegment: T3DBezierSegment;
|
|
lEntity: TvEntity;
|
|
begin
|
|
AStrings.Clear;
|
|
|
|
AStrings.Add('M216 // Ligar monitor de carga');
|
|
AStrings.Add('G28 // Ir rapidamente para posição inicial');
|
|
AStrings.Add('G00');
|
|
|
|
// itera por todos os itens
|
|
for i := 0 to AData.GetEntitiesCount - 1 do
|
|
begin
|
|
lEntity := AData.GetEntity(i);
|
|
if not (lEntity is TPath) then Continue;
|
|
APath := lEntity as TPath;
|
|
|
|
// levanta a broca
|
|
AStrings.Add('P01 // Sobe a cabeça de gravação');
|
|
// vai para o ponto inicial
|
|
CurSegment := T2DSegment(APath.Points);
|
|
AStrings.Add(Format('G01 X%f Y%f',
|
|
[CurSegment.X, CurSegment.Y]));
|
|
AStrings.Add('P02 // Abaixa a cabeça de gravação');
|
|
|
|
for j := 1 to APath.Len - 1 do
|
|
begin
|
|
CurSegment := T2DSegment(CurSegment.Next);
|
|
case CurSegment.SegmentType of
|
|
st2DLine: AStrings.Add(Format('G01 X%f Y%f',
|
|
[CurSegment.X, CurSegment.Y]));
|
|
st3DLine:
|
|
begin
|
|
Cur3DSegment := T3DSegment(CurSegment);
|
|
AStrings.Add(Format('G01 X%f Y%f Z%f',
|
|
[Cur3DSegment.X, Cur3DSegment.Y, Cur3DSegment.Z]));
|
|
end;
|
|
st2DBezier:
|
|
begin
|
|
Cur2DBezierSegment := T2DBezierSegment(CurSegment);
|
|
AStrings.Add(Format('B02 X%f Y%f X%f Y%f X%f Y%f',
|
|
[Cur2DBezierSegment.X2, Cur2DBezierSegment.Y2,
|
|
Cur2DBezierSegment.X3, Cur2DBezierSegment.Y3,
|
|
Cur2DBezierSegment.X, Cur2DBezierSegment.Y]));
|
|
end;
|
|
st3DBezier:
|
|
begin
|
|
Cur3DBezierSegment := T3DBezierSegment(CurSegment);
|
|
AStrings.Add(Format('B03 X%f Y%f Z%f X%f Y%f Z%f X%f Y%f Z%f',
|
|
[Cur3DBezierSegment.X2, Cur3DBezierSegment.Y2, Cur3DBezierSegment.Z2,
|
|
Cur3DBezierSegment.X3, Cur3DBezierSegment.Y3, Cur3DBezierSegment.Z3,
|
|
Cur3DBezierSegment.X, Cur3DBezierSegment.Y, Cur3DBezierSegment.Z]));
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
AStrings.Add('P01 // Sobe a cabeça de gravação');
|
|
AStrings.Add('M30 // Parar o programa e retornar para posição inicial');
|
|
AStrings.Add('M215 // Desligar monitor de carga');
|
|
end;
|
|
|
|
procedure TvAvisoCNCGCodeWriter.WriteToStrings(AStrings: TStrings;
|
|
AData: TvVectorialDocument);
|
|
var
|
|
lPage: TvVectorialPage;
|
|
begin
|
|
lPage := AData.GetPageAsVectorial(0);
|
|
WritePageToStrings(AStrings, lPage);
|
|
end;
|
|
|
|
initialization
|
|
|
|
RegisterVectorialWriter(TvAvisoCNCGCodeWriter, vfGCodeAvisoCNCPrototipoV5);
|
|
|
|
end.
|
|
|