# ---------------------------------------------------------------------------- #
## \file gcode_oera_linda.py
## \author Sebastien Beaugrand
## \sa http://beaugrand.chez.com/
## \copyright CeCILL 2.1 Free Software license
# ---------------------------------------------------------------------------- #
from math import *
from gcodefont import *
class GcodeOeraLinda(GcodeFont):
def __init__(self, width, sep):
super().__init__(width, sep)
self.r = width / 2
self.x = 0
self.y = 0
self.a = 0
def __semi_circle(self, direction, a, b, init=False):
x = self.r * cos(self.a + a)
y = self.r * sin(self.a + a)
if init:
print("G0 X{:.3f} Y{:.3f}".format(self.x + x, self.y + y))
print("M3")
print("{} X{:.3f} Y{:.3f} I{:.3f} J{:.3f}".format(
direction,
self.x + self.r * cos(self.a + b),
self.y + self.r * sin(self.a + b),
-x,
-y,
))
def __line_from_center(self, a):
x = self.r * cos(self.a + a)
y = self.r * sin(self.a + a)
print("G1 X{:.3f} Y{:.3f}".format(self.x + x, self.y + y))
def __line_to_center(self, a=999):
if a != 999:
x = self.r * cos(self.a + a)
y = self.r * sin(self.a + a)
print("G0 X{:.3f} Y{:.3f}".format(self.x + x, self.y + y))
print("M3")
print("G1 X{:.3f} Y{:.3f}".format(self.x, self.y))
def __draw_char(self, d):
if d == '0':
self.__semi_circle("G3", pi / 2, -pi / 2, init=True)
self.__semi_circle("G3", -pi / 2, pi / 2)
elif d == '1':
self.__line_to_center(pi / 2)
self.__line_from_center(-pi / 2)
elif d == '2':
self.__semi_circle("G2", pi * 5 / 6, pi / 6, init=True)
self.__line_to_center()
self.__line_from_center(-pi * 5 / 6)
self.__semi_circle("G3", -pi * 5 / 6, -pi / 6)
elif d == '3':
self.__semi_circle("G2", pi / 2, pi / 6, init=True)
self.__line_to_center()
self.__line_from_center(-pi / 6)
self.__semi_circle("G2", -pi / 6, -pi / 2)
elif d == '4':
self.__line_to_center(-pi / 2)
self.__line_from_center(pi / 2)
self.__semi_circle("G3", pi / 2, pi * 5 / 6)
self.__line_from_center(-pi / 6)
elif d == '5':
self.__semi_circle("G3", pi / 6, pi / 2, init=True)
self.__line_to_center()
self.__line_from_center(-pi / 6)
self.__semi_circle("G2", -pi / 6, -pi / 2)
elif d == '6':
self.__line_to_center(pi / 6)
self.__line_from_center(-pi * 5 / 6)
self.__semi_circle("G3", -pi * 5 / 6, -pi / 6)
self.__line_to_center()
elif d == '7':
self.__semi_circle("G2", pi * 5 / 6, pi / 6, init=True)
self.__line_to_center()
self.__line_from_center(-pi * 5 / 6)
elif d == '8':
self.__semi_circle("G3", pi / 6, pi * 5 / 6, init=True)
self.__line_to_center()
self.__line_from_center(-pi / 6)
self.__semi_circle("G2", -pi / 6, -pi * 5 / 6)
self.__line_to_center()
self.__line_from_center(pi / 6)
elif d == '9':
self.__line_to_center(-pi * 5 / 6)
self.__line_from_center(pi / 6)
self.__semi_circle("G3", pi / 6, pi * 5 / 6)
self.__line_to_center()
print("M5")
def draw(self, s, x, y, a=0):
self.x = x + self.width / 2
self.y = y + self.height / 2
self.a = a
w = (self.width + self.sep) * (len(s) - 1)
self.x -= cos(self.a) * w / 2
self.y -= sin(self.a) * w / 2
for c in s:
self.__draw_char(c)
self.x += (self.width + self.sep) * cos(self.a)
self.y += (self.width + self.sep) * sin(self.a)