mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 09:41:39 +01: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.
 | |
| 
 | 
