avisocncgcodewriter.pas 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. {
  2. Writes AvisoCNC G-Code
  3. License: The same modified LGPL as the Free Pascal RTL
  4. See the file COPYING.modifiedLGPL for more details
  5. AUTHORS: Felipe Monteiro de Carvalho
  6. Pedro Sol Pegorini L de Lima
  7. }
  8. unit avisocncgcodewriter;
  9. {$mode objfpc}{$H+}
  10. interface
  11. uses
  12. Classes, SysUtils,
  13. fpvectorial;
  14. type
  15. { TvAvisoCNCGCodeWriter }
  16. TvAvisoCNCGCodeWriter = class(TvCustomVectorialWriter)
  17. public
  18. { General reading methods }
  19. procedure WriteToStrings(AStrings: TStrings; AData: TvVectorialDocument); override;
  20. end;
  21. implementation
  22. { TvGCodeVectorialWriter }
  23. procedure TvAvisoCNCGCodeWriter.WriteToStrings(AStrings: TStrings;
  24. AData: TvVectorialDocument);
  25. var
  26. i, j: Integer;
  27. Str: string;
  28. APath: TPath;
  29. CurSegment: T2DSegment;
  30. Cur3DSegment: T3DSegment;
  31. Cur2DBezierSegment: T2DBezierSegment;
  32. Cur3DBezierSegment: T3DBezierSegment;
  33. begin
  34. AStrings.Clear;
  35. AStrings.Add('M216 // Ligar monitor de carga');
  36. AStrings.Add('G28 // Ir rapidamente para posição inicial');
  37. AStrings.Add('G00');
  38. // itera por todos os itens
  39. for i := 0 to AData.GetPathCount - 1 do
  40. begin
  41. APath := AData.GetPath(i);
  42. // levanta a broca
  43. AStrings.Add('P01 // Sobe a cabeça de gravação');
  44. // vai para o ponto inicial
  45. CurSegment := T2DSegment(APath.Points);
  46. AStrings.Add(Format('G01 X%f Y%f',
  47. [CurSegment.X, CurSegment.Y]));
  48. AStrings.Add('P02 // Abaixa a cabeça de gravação');
  49. for j := 1 to APath.Len - 1 do
  50. begin
  51. CurSegment := T2DSegment(CurSegment.Next);
  52. case CurSegment.SegmentType of
  53. st2DLine: AStrings.Add(Format('G01 X%f Y%f',
  54. [CurSegment.X, CurSegment.Y]));
  55. st3DLine:
  56. begin
  57. Cur3DSegment := T3DSegment(CurSegment);
  58. AStrings.Add(Format('G01 X%f Y%f Z%f',
  59. [Cur3DSegment.X, Cur3DSegment.Y, Cur3DSegment.Z]));
  60. end;
  61. st2DBezier:
  62. begin
  63. Cur2DBezierSegment := T2DBezierSegment(CurSegment);
  64. AStrings.Add(Format('B02 X%f Y%f X%f Y%f X%f Y%f',
  65. [Cur2DBezierSegment.X2, Cur2DBezierSegment.Y2,
  66. Cur2DBezierSegment.X3, Cur2DBezierSegment.Y3,
  67. Cur2DBezierSegment.X, Cur2DBezierSegment.Y]));
  68. end;
  69. st3DBezier:
  70. begin
  71. Cur3DBezierSegment := T3DBezierSegment(CurSegment);
  72. AStrings.Add(Format('B03 X%f Y%f Z%f X%f Y%f Z%f X%f Y%f Z%f',
  73. [Cur3DBezierSegment.X2, Cur3DBezierSegment.Y2, Cur3DBezierSegment.Z2,
  74. Cur3DBezierSegment.X3, Cur3DBezierSegment.Y3, Cur3DBezierSegment.Z3,
  75. Cur3DBezierSegment.X, Cur3DBezierSegment.Y, Cur3DBezierSegment.Z]));
  76. end;
  77. end;
  78. end;
  79. end;
  80. AStrings.Add('P01 // Sobe a cabeça de gravação');
  81. AStrings.Add('M30 // Parar o programa e retornar para posição inicial');
  82. AStrings.Add('M215 // Desligar monitor de carga');
  83. end;
  84. initialization
  85. RegisterVectorialWriter(TvAvisoCNCGCodeWriter, vfGCodeAvisoCNCPrototipoV5);
  86. end.