From 327e8d1458887484b4ac5477e41e9af18d4e72de Mon Sep 17 00:00:00 2001 From: Sohel Date: Mon, 18 Nov 2024 14:33:46 +0100 Subject: [PATCH] text_to_gcode working, still need to implement return lines, and implement it in the web app --- plotter-app/Gcode_generator.py | 78 ++++++++ plotter-app/gcode_test.py | 22 +++ plotter-app/test_gcode.gcode | 334 +++++++++++++++++++++++++++++++++ plotter-app/text_to_gcode.py | 32 ++++ 4 files changed, 466 insertions(+) create mode 100644 plotter-app/Gcode_generator.py create mode 100644 plotter-app/gcode_test.py create mode 100644 plotter-app/test_gcode.gcode create mode 100644 plotter-app/text_to_gcode.py diff --git a/plotter-app/Gcode_generator.py b/plotter-app/Gcode_generator.py new file mode 100644 index 0000000..7369d91 --- /dev/null +++ b/plotter-app/Gcode_generator.py @@ -0,0 +1,78 @@ +from enum import Enum + +class Machine(Enum): + LASER = 1 + THREEAXIS = 2 + +class Gcode: + def __init__(self, file, mm_per_px, speed, machine, max_s=0, safe_z=0, work_z=0): + self.file = file + self.mm_per_px = mm_per_px + self.speed = speed + self.machine = machine + self.max_s = max_s + self.safe_z = safe_z + self.work_z = work_z + self.output = None + self.init_file() + + def init_file(self): + self.output = open(f"{self.file}.gcode", "w") + self.output.write("G21 ;Unit to mm\n") + self.output.write("G90 ;Absolute positioning\n\n") + self.output.write(f"F{self.speed}\n") + if self.machine == Machine.LASER: + self.output.write(f"S{self.max_s}\n") + self.output.write("M3\n\n") + + + def draw_line(self, x1, y1, x2, y2): + self.go_to(x1, y1) + self.write_to(x2, y2) + + def go_to(self, x, y): + x_mm = x * self.mm_per_px + y_mm = y * self.mm_per_px + + if self.machine == Machine.LASER: + self.output.write(f"G0 X{x_mm} Y{y_mm}\n") + elif self.machine == Machine.THREEAXIS: + self.output.write(f"G0 Z{self.safe_z}\n") + self.output.write(f"G0 X{x_mm} Y{y_mm} Z{self.safe_z}\n") + + def write_to(self, x, y): + x_mm = x * self.mm_per_px + y_mm = y * self.mm_per_px + + if self.machine == Machine.LASER: + self.output.write(f"G1 X{x_mm} Y{y_mm}\n") + elif self.machine == Machine.THREEAXIS: + self.output.write(f"G0 Z{self.work_z}\n") + self.output.write(f"G1 X{x_mm} Y{y_mm} Z{self.work_z}\n") + + def refill(self, x, y, depth, dip_number): + self.output.write(";#################\n") + + if self.machine == Machine.THREEAXIS: + self.go_to(x, y) + for _ in range(dip_number): + self.output.write(f"G1 Z{depth}\n") + self.output.write(f"G0 Z{self.safe_z}\n") + elif self.machine == Machine.LASER: + self.go_to(x, y) + self.set_pause() + + def set_pause(self): + self.output.write("M0\n") + + def end_gcode(self): + if self.machine == Machine.THREEAXIS: + self.go_to(0, 0) + + self.output.write("M5\n") + self.output.close() + + def new_file(self, new_file_name): + self.end_gcode() + self.file = new_file_name + self.init_file() diff --git a/plotter-app/gcode_test.py b/plotter-app/gcode_test.py new file mode 100644 index 0000000..192903c --- /dev/null +++ b/plotter-app/gcode_test.py @@ -0,0 +1,22 @@ +from Gcode_generator import Gcode +from Gcode_generator import Machine + +machine_type = Machine.LASER + + # Create an instance of the Gcode class +gcode = Gcode( + file="test_gcode", # Output file name (no .gcode extension) + mm_per_px=0.1, # Conversion factor: mm per pixel + speed=1000, # Speed in mm/min + machine=machine_type, + max_s=255 # Laser power (only for LASER machines) +) + +# Draw a line from (10, 20) to (30, 40) +gcode.draw_line(10, 20, 30, 40) + + +# Finish the G-code file +gcode.end_gcode() + +print("G-code file generated: example.gcode") \ No newline at end of file diff --git a/plotter-app/test_gcode.gcode b/plotter-app/test_gcode.gcode new file mode 100644 index 0000000..986d3a8 --- /dev/null +++ b/plotter-app/test_gcode.gcode @@ -0,0 +1,334 @@ +G21 ;Unit to mm +G90 ;Absolute positioning + +F1000 +S255 +M3 + +G0 X0.7142857142857144 Y10.0 +G1 X2.5 Y2.5 +G0 X4.2857142857142865 Y10.0 +G1 X2.5 Y2.5 +G0 X4.2857142857142865 Y10.0 +G1 X6.071428571428572 Y2.5 +G0 X7.857142857142858 Y10.0 +G1 X6.071428571428572 Y2.5 +G0 X13.92857142857143 Y7.5 +G1 X13.92857142857143 Y2.5 +G0 X13.92857142857143 Y6.42857142857143 +G1 X13.214285714285717 Y7.142857142857143 +G0 X13.214285714285717 Y7.142857142857143 +G1 X12.5 Y7.5 +G0 X12.5 Y7.5 +G1 X11.42857142857143 Y7.5 +G0 X11.42857142857143 Y7.5 +G1 X10.714285714285715 Y7.142857142857143 +G0 X10.714285714285715 Y7.142857142857143 +G1 X10.000000000000002 Y6.42857142857143 +G0 X10.000000000000002 Y6.42857142857143 +G1 X9.642857142857146 Y5.357142857142858 +G0 X9.642857142857146 Y5.357142857142858 +G1 X9.642857142857146 Y4.642857142857143 +G0 X9.642857142857146 Y4.642857142857143 +G1 X10.000000000000002 Y3.5714285714285716 +G0 X10.000000000000002 Y3.5714285714285716 +G1 X10.714285714285715 Y2.8571428571428577 +G0 X10.714285714285715 Y2.8571428571428577 +G1 X11.42857142857143 Y2.5 +G0 X11.42857142857143 Y2.5 +G1 X12.5 Y2.5 +G0 X12.5 Y2.5 +G1 X13.214285714285717 Y2.8571428571428577 +G0 X13.214285714285717 Y2.8571428571428577 +G1 X13.92857142857143 Y3.5714285714285716 +G0 X16.78571428571429 Y10.0 +G1 X16.78571428571429 Y2.5 +G0 X19.642857142857146 Y10.0 +G1 X19.642857142857146 Y2.5 +G0 X22.85714285714286 Y10.0 +G1 X22.85714285714286 Y3.9285714285714293 +G0 X22.85714285714286 Y3.9285714285714293 +G1 X23.21428571428572 Y2.8571428571428577 +G0 X23.21428571428572 Y2.8571428571428577 +G1 X23.928571428571434 Y2.5 +G0 X23.928571428571434 Y2.5 +G1 X24.64285714285715 Y2.5 +G0 X21.785714285714292 Y7.5 +G1 X24.285714285714292 Y7.5 +G0 X26.428571428571434 Y5.357142857142858 +G1 X30.71428571428572 Y5.357142857142858 +G0 X30.71428571428572 Y5.357142857142858 +G1 X30.71428571428572 Y6.071428571428572 +G0 X30.71428571428572 Y6.071428571428572 +G1 X30.35714285714286 Y6.7857142857142865 +G0 X30.35714285714286 Y6.7857142857142865 +G1 X30.000000000000007 Y7.142857142857143 +G0 X30.000000000000007 Y7.142857142857143 +G1 X29.285714285714292 Y7.5 +G0 X29.285714285714292 Y7.5 +G1 X28.21428571428572 Y7.5 +G0 X28.21428571428572 Y7.5 +G1 X27.500000000000007 Y7.142857142857143 +G0 X27.500000000000007 Y7.142857142857143 +G1 X26.785714285714292 Y6.42857142857143 +G0 X26.785714285714292 Y6.42857142857143 +G1 X26.428571428571434 Y5.357142857142858 +G0 X26.428571428571434 Y5.357142857142858 +G1 X26.428571428571434 Y4.642857142857143 +G0 X26.428571428571434 Y4.642857142857143 +G1 X26.785714285714292 Y3.5714285714285716 +G0 X26.785714285714292 Y3.5714285714285716 +G1 X27.500000000000007 Y2.8571428571428577 +G0 X27.500000000000007 Y2.8571428571428577 +G1 X28.21428571428572 Y2.5 +G0 X28.21428571428572 Y2.5 +G1 X29.285714285714292 Y2.5 +G0 X29.285714285714292 Y2.5 +G1 X30.000000000000007 Y2.8571428571428577 +G0 X30.000000000000007 Y2.8571428571428577 +G1 X30.71428571428572 Y3.5714285714285716 +G0 X33.214285714285715 Y7.5 +G1 X33.214285714285715 Y2.5 +G0 X33.214285714285715 Y5.357142857142858 +G1 X33.57142857142858 Y6.42857142857143 +G0 X33.57142857142858 Y6.42857142857143 +G1 X34.28571428571429 Y7.142857142857143 +G0 X34.28571428571429 Y7.142857142857143 +G1 X35.00000000000001 Y7.5 +G0 X35.00000000000001 Y7.5 +G1 X36.07142857142858 Y7.5 +G0 X43.21428571428572 Y10.0 +G1 X43.571428571428584 Y9.642857142857144 +G0 X43.571428571428584 Y9.642857142857144 +G1 X43.92857142857144 Y10.0 +G0 X43.92857142857144 Y10.0 +G1 X43.571428571428584 Y10.35714285714286 +G0 X43.571428571428584 Y10.35714285714286 +G1 X43.21428571428572 Y10.0 +G0 X43.571428571428584 Y7.5 +G1 X43.571428571428584 Y2.5 +G0 X50.00000000000001 Y6.42857142857143 +G1 X49.64285714285715 Y7.142857142857143 +G0 X49.64285714285715 Y7.142857142857143 +G1 X48.571428571428584 Y7.5 +G0 X48.571428571428584 Y7.5 +G1 X47.50000000000001 Y7.5 +G0 X47.50000000000001 Y7.5 +G1 X46.42857142857144 Y7.142857142857143 +G0 X46.42857142857144 Y7.142857142857143 +G1 X46.071428571428584 Y6.42857142857143 +G0 X46.071428571428584 Y6.42857142857143 +G1 X46.42857142857144 Y5.714285714285715 +G0 X46.42857142857144 Y5.714285714285715 +G1 X47.14285714285715 Y5.357142857142858 +G0 X47.14285714285715 Y5.357142857142858 +G1 X48.92857142857144 Y5.0 +G0 X48.92857142857144 Y5.0 +G1 X49.64285714285715 Y4.642857142857143 +G0 X49.64285714285715 Y4.642857142857143 +G1 X50.00000000000001 Y3.9285714285714293 +G0 X50.00000000000001 Y3.9285714285714293 +G1 X50.00000000000001 Y3.5714285714285716 +G0 X50.00000000000001 Y3.5714285714285716 +G1 X49.64285714285715 Y2.8571428571428577 +G0 X49.64285714285715 Y2.8571428571428577 +G1 X48.571428571428584 Y2.5 +G0 X48.571428571428584 Y2.5 +G1 X47.50000000000001 Y2.5 +G0 X47.50000000000001 Y2.5 +G1 X46.42857142857144 Y2.8571428571428577 +G0 X46.42857142857144 Y2.8571428571428577 +G1 X46.071428571428584 Y3.5714285714285716 +G0 X62.142857142857146 Y7.5 +G1 X62.142857142857146 Y2.5 +G0 X62.142857142857146 Y6.42857142857143 +G1 X61.42857142857144 Y7.142857142857143 +G0 X61.42857142857144 Y7.142857142857143 +G1 X60.71428571428572 Y7.5 +G0 X60.71428571428572 Y7.5 +G1 X59.642857142857146 Y7.5 +G0 X59.642857142857146 Y7.5 +G1 X58.92857142857144 Y7.142857142857143 +G0 X58.92857142857144 Y7.142857142857143 +G1 X58.21428571428572 Y6.42857142857143 +G0 X58.21428571428572 Y6.42857142857143 +G1 X57.85714285714286 Y5.357142857142858 +G0 X57.85714285714286 Y5.357142857142858 +G1 X57.85714285714286 Y4.642857142857143 +G0 X57.85714285714286 Y4.642857142857143 +G1 X58.21428571428572 Y3.5714285714285716 +G0 X58.21428571428572 Y3.5714285714285716 +G1 X58.92857142857144 Y2.8571428571428577 +G0 X58.92857142857144 Y2.8571428571428577 +G1 X59.642857142857146 Y2.5 +G0 X59.642857142857146 Y2.5 +G1 X60.71428571428572 Y2.5 +G0 X60.71428571428572 Y2.5 +G1 X61.42857142857144 Y2.8571428571428577 +G0 X61.42857142857144 Y2.8571428571428577 +G1 X62.142857142857146 Y3.5714285714285716 +G0 X70.35714285714286 Y7.5 +G1 X71.78571428571429 Y2.5 +G0 X73.21428571428572 Y7.5 +G1 X71.78571428571429 Y2.5 +G0 X73.21428571428572 Y7.5 +G1 X74.64285714285715 Y2.5 +G0 X76.07142857142858 Y7.5 +G1 X74.64285714285715 Y2.5 +G0 X82.5 Y7.5 +G1 X82.5 Y2.5 +G0 X82.5 Y6.42857142857143 +G1 X81.78571428571429 Y7.142857142857143 +G0 X81.78571428571429 Y7.142857142857143 +G1 X81.07142857142858 Y7.5 +G0 X81.07142857142858 Y7.5 +G1 X80.0 Y7.5 +G0 X80.0 Y7.5 +G1 X79.28571428571429 Y7.142857142857143 +G0 X79.28571428571429 Y7.142857142857143 +G1 X78.57142857142858 Y6.42857142857143 +G0 X78.57142857142858 Y6.42857142857143 +G1 X78.21428571428572 Y5.357142857142858 +G0 X78.21428571428572 Y5.357142857142858 +G1 X78.21428571428572 Y4.642857142857143 +G0 X78.21428571428572 Y4.642857142857143 +G1 X78.57142857142858 Y3.5714285714285716 +G0 X78.57142857142858 Y3.5714285714285716 +G1 X79.28571428571429 Y2.8571428571428577 +G0 X79.28571428571429 Y2.8571428571428577 +G1 X80.0 Y2.5 +G0 X80.0 Y2.5 +G1 X81.07142857142858 Y2.5 +G0 X81.07142857142858 Y2.5 +G1 X81.78571428571429 Y2.8571428571428577 +G0 X81.78571428571429 Y2.8571428571428577 +G1 X82.5 Y3.5714285714285716 +G0 X85.35714285714288 Y10.0 +G1 X85.35714285714288 Y2.5 +G0 X88.21428571428572 Y10.0 +G1 X88.21428571428572 Y2.5 +G0 X96.78571428571429 Y7.5 +G1 X96.78571428571429 Y0.0 +G0 X96.78571428571429 Y6.42857142857143 +G1 X97.5 Y7.142857142857143 +G0 X97.5 Y7.142857142857143 +G1 X98.21428571428572 Y7.5 +G0 X98.21428571428572 Y7.5 +G1 X99.28571428571429 Y7.5 +G0 X99.28571428571429 Y7.5 +G1 X100.0 Y7.142857142857143 +G0 X100.0 Y7.142857142857143 +G1 X100.71428571428572 Y6.42857142857143 +G0 X100.71428571428572 Y6.42857142857143 +G1 X101.07142857142857 Y5.357142857142858 +G0 X101.07142857142857 Y5.357142857142858 +G1 X101.07142857142857 Y4.642857142857143 +G0 X101.07142857142857 Y4.642857142857143 +G1 X100.71428571428572 Y3.5714285714285716 +G0 X100.71428571428572 Y3.5714285714285716 +G1 X100.0 Y2.8571428571428577 +G0 X100.0 Y2.8571428571428577 +G1 X99.28571428571429 Y2.5 +G0 X99.28571428571429 Y2.5 +G1 X98.21428571428572 Y2.5 +G0 X98.21428571428572 Y2.5 +G1 X97.5 Y2.8571428571428577 +G0 X97.5 Y2.8571428571428577 +G1 X96.78571428571429 Y3.5714285714285716 +G0 X103.57142857142858 Y10.0 +G1 X103.57142857142858 Y2.5 +G0 X107.85714285714288 Y7.5 +G1 X107.14285714285714 Y7.142857142857143 +G0 X107.14285714285714 Y7.142857142857143 +G1 X106.42857142857143 Y6.42857142857143 +G0 X106.42857142857143 Y6.42857142857143 +G1 X106.07142857142858 Y5.357142857142858 +G0 X106.07142857142858 Y5.357142857142858 +G1 X106.07142857142858 Y4.642857142857143 +G0 X106.07142857142858 Y4.642857142857143 +G1 X106.42857142857143 Y3.5714285714285716 +G0 X106.42857142857143 Y3.5714285714285716 +G1 X107.14285714285714 Y2.8571428571428577 +G0 X107.14285714285714 Y2.8571428571428577 +G1 X107.85714285714288 Y2.5 +G0 X107.85714285714288 Y2.5 +G1 X108.92857142857143 Y2.5 +G0 X108.92857142857143 Y2.5 +G1 X109.64285714285714 Y2.8571428571428577 +G0 X109.64285714285714 Y2.8571428571428577 +G1 X110.35714285714288 Y3.5714285714285716 +G0 X110.35714285714288 Y3.5714285714285716 +G1 X110.71428571428572 Y4.642857142857143 +G0 X110.71428571428572 Y4.642857142857143 +G1 X110.71428571428572 Y5.357142857142858 +G0 X110.71428571428572 Y5.357142857142858 +G1 X110.35714285714288 Y6.42857142857143 +G0 X110.35714285714288 Y6.42857142857143 +G1 X109.64285714285714 Y7.142857142857143 +G0 X109.64285714285714 Y7.142857142857143 +G1 X108.92857142857143 Y7.5 +G0 X108.92857142857143 Y7.5 +G1 X107.85714285714288 Y7.5 +G0 X113.57142857142858 Y10.0 +G1 X113.57142857142858 Y3.9285714285714293 +G0 X113.57142857142858 Y3.9285714285714293 +G1 X113.92857142857143 Y2.8571428571428577 +G0 X113.92857142857143 Y2.8571428571428577 +G1 X114.64285714285717 Y2.5 +G0 X114.64285714285717 Y2.5 +G1 X115.35714285714288 Y2.5 +G0 X112.5 Y7.5 +G1 X115.0 Y7.5 +G0 X117.85714285714288 Y10.0 +G1 X117.85714285714288 Y3.9285714285714293 +G0 X117.85714285714288 Y3.9285714285714293 +G1 X118.21428571428572 Y2.8571428571428577 +G0 X118.21428571428572 Y2.8571428571428577 +G1 X118.92857142857144 Y2.5 +G0 X118.92857142857144 Y2.5 +G1 X119.64285714285717 Y2.5 +G0 X116.78571428571429 Y7.5 +G1 X119.28571428571429 Y7.5 +G0 X121.42857142857144 Y5.357142857142858 +G1 X125.71428571428574 Y5.357142857142858 +G0 X125.71428571428574 Y5.357142857142858 +G1 X125.71428571428574 Y6.071428571428572 +G0 X125.71428571428574 Y6.071428571428572 +G1 X125.35714285714288 Y6.7857142857142865 +G0 X125.35714285714288 Y6.7857142857142865 +G1 X125.0 Y7.142857142857143 +G0 X125.0 Y7.142857142857143 +G1 X124.28571428571429 Y7.5 +G0 X124.28571428571429 Y7.5 +G1 X123.21428571428574 Y7.5 +G0 X123.21428571428574 Y7.5 +G1 X122.5 Y7.142857142857143 +G0 X122.5 Y7.142857142857143 +G1 X121.78571428571429 Y6.42857142857143 +G0 X121.78571428571429 Y6.42857142857143 +G1 X121.42857142857144 Y5.357142857142858 +G0 X121.42857142857144 Y5.357142857142858 +G1 X121.42857142857144 Y4.642857142857143 +G0 X121.42857142857144 Y4.642857142857143 +G1 X121.78571428571429 Y3.5714285714285716 +G0 X121.78571428571429 Y3.5714285714285716 +G1 X122.5 Y2.8571428571428577 +G0 X122.5 Y2.8571428571428577 +G1 X123.21428571428574 Y2.5 +G0 X123.21428571428574 Y2.5 +G1 X124.28571428571429 Y2.5 +G0 X124.28571428571429 Y2.5 +G1 X125.0 Y2.8571428571428577 +G0 X125.0 Y2.8571428571428577 +G1 X125.71428571428574 Y3.5714285714285716 +G0 X128.21428571428572 Y7.5 +G1 X128.21428571428572 Y2.5 +G0 X128.21428571428572 Y5.357142857142858 +G1 X128.57142857142858 Y6.42857142857143 +G0 X128.57142857142858 Y6.42857142857143 +G1 X129.2857142857143 Y7.142857142857143 +G0 X129.2857142857143 Y7.142857142857143 +G1 X130.0 Y7.5 +G0 X130.0 Y7.5 +G1 X131.07142857142858 Y7.5 +M5 diff --git a/plotter-app/text_to_gcode.py b/plotter-app/text_to_gcode.py new file mode 100644 index 0000000..99f93ac --- /dev/null +++ b/plotter-app/text_to_gcode.py @@ -0,0 +1,32 @@ +from Gcode_generator import Gcode +from Gcode_generator import Machine + +from HersheyFonts import HersheyFonts +import matplotlib.pyplot as plt + +machine_type = Machine.LASER + + # Create an instance of the Gcode class +gcode = Gcode( + file="test_gcode", # Output file name (no .gcode extension) + mm_per_px=0.1, # Conversion factor: mm per pixel + speed=1000, # Speed in mm/min + machine=machine_type, + max_s=255 # Laser power (only for LASER machines) +) + + +thefont = HersheyFonts() +thefont.load_default_font() +thefont.normalize_rendering(100) +for (x1, y1), (x2, y2) in thefont.lines_for_text('Wallter is a wall plotter'): + gcode.draw_line(x1, y1 ,x2 ,y2) + +# Draw a line from (10, 20) to (30, 40) +# gcode.draw_line(10, 20, 30, 40) + + +# Finish the G-code file +gcode.end_gcode() + +print("G-code file generated: example.gcode") \ No newline at end of file