From 13fb76ccc7fdc93f26842aab165bec1a71f376a5 Mon Sep 17 00:00:00 2001 From: Dave Astels Date: Wed, 26 Jun 2019 21:22:01 -0400 Subject: [PATCH 1/8] Add a dot example/test --- examples/turtle_dots.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 examples/turtle_dots.py diff --git a/examples/turtle_dots.py b/examples/turtle_dots.py new file mode 100644 index 0000000..ada0612 --- /dev/null +++ b/examples/turtle_dots.py @@ -0,0 +1,36 @@ +import board +from adafruit_turtle import turtle, Color + +turtle = turtle(board.DISPLAY) +size = min(board.DISPLAY.width, board.DISPLAY.height) * 0.5 + +print("Turtle time! Lets draw a rainbow benzene") + + +turtle.pendown() + +turtle.dot(20) +turtle.forward(5) +turtle.right(90) +turtle.forward(5) +for _ in range(4): + turtle.right(90) + turtle.forward(10) + # turtle.forward(5) + # turtle.right(90) + # turtle.forward(20) + # turtle.left(90) + # turtle.forward(5) + # turtle.left(90) + + +# turtle.dot(40) +# turtle.left(90) +# turtle.forward(25) +# turtle.dot(30) +# turtle.left(90) +# turtle.forward(25) +# turtle.dot(20) + +while True: + pass From 7759bf7420a8166005c7729ac9c8594d1d8d7c6c Mon Sep 17 00:00:00 2001 From: Dave Astels Date: Wed, 26 Jun 2019 21:22:39 -0400 Subject: [PATCH 2/8] Start working on a dot implementation --- adafruit_turtle.py | 105 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 100 insertions(+), 5 deletions(-) diff --git a/adafruit_turtle.py b/adafruit_turtle.py index 298ff96..b6081db 100644 --- a/adafruit_turtle.py +++ b/adafruit_turtle.py @@ -185,6 +185,7 @@ def __init__(self, display=board.DISPLAY): self._penstate = False self._pencolor = None + self._pensize = 1 self.pencolor(Color.WHITE) self._display.show(self._splash) @@ -287,7 +288,8 @@ def goto(self, x1, y1=None): while (not rev and x0 <= x1) or (rev and x1 <= x0): if steep: try: - self._fg_bitmap[int(y0), int(x0)] = self._pencolor + self._plot(int(y0), int(x0), self._pencolor) +# self._fg_bitmap[int(y0), int(x0)] = self._pencolor except IndexError: pass self._x = y0 @@ -296,7 +298,8 @@ def goto(self, x1, y1=None): time.sleep(0.003) else: try: - self._fg_bitmap[int(x0), int(y0)] = self._pencolor + self._plot(int(x0), int(y0), self._pencolor) +# self._fg_bitmap[int(x0), int(y0)] = self._pencolor except IndexError: pass self._x = x0 @@ -357,6 +360,86 @@ def home(self): self.setheading(90) self.goto(0, 0) + def _plot(self, x, y, c): + try: + self._fg_bitmap[int(x), int(y)] = c +# self._logger.debug('Set fg_bitmap[%d, %d] to %d', x, y, self._fg_bitmap[int(x), int(y)]) + except IndexError: + self._logger.debug('IndexError plotting (%d, %d)', x, y) + + def _draw_disk(self, x, y, width, height, r, color, fill=True, outline=True, stroke=1): + self._logger.debug('_draw_disk(%d, %d, %d, %d, %d, %d)', x, y, width, height, r, color) + if fill: + # for i in range(0, width): # draw the center chunk + # for j in range(r, height - r): # draw the center chunk + # self._plot(x + i, y + j, color) + self._helper(x+r, y+r, r, color=color, fill=True, + x_offset=width-2*r-1, y_offset=height-2*r-1) + if outline: + # draw flat sides + # for w in range(r, width - r): + # for line in range(stroke): + # self._plot(x + w, y + line, color) + # self._plot(x + w, y + height - line - 1, color) + # for _h in range(r, height - r): + # for line in range(stroke): + # self._plot(x + line, y + _h, color) + # self._plot(x + width - line - 1, y + _h, color) + # draw round corners + self._helper(x+r, y+r, r, color=color, stroke=stroke, + x_offset=width-2*r-1, y_offset=height-2*r-1) + + # pylint: disable=invalid-name, too-many-locals, too-many-branches + def _helper(self, x0, y0, r, color, x_offset=0, y_offset=0, + stroke=1, corner_flags=0xF, fill=False): + self._logger.debug('_helper(%d, %d, %d, %d. %d, %d, %d, %d)', x0, y0, r, color, x_offset, y_offset, stroke, corner_flags) + f = 1 - r + ddF_x = 1 + ddF_y = -2 * r + x = 0 + y = r + + while x < y: + if f >= 0: + y -= 1 + ddF_y += 2 + f += ddF_y + x += 1 + ddF_x += 2 + f += ddF_x + if corner_flags & 0x8: + if fill: + for w in range(x0-y, x0+y+x_offset): + self._plot(w, y0 + x + y_offset, color) + for w in range(x0-x, x0+x+x_offset): + self._plot(w, y0 + y + y_offset, color) + else: + for line in range(stroke): + self._plot(x0 - y + line, y0 + x + y_offset, color) + self._plot(x0 - x, y0 + y + y_offset - line, color) + if corner_flags & 0x1: + if fill: + for w in range(x0-y, x0+y+x_offset): + self._plot(w, y0 - x, color) + for w in range(x0-x, x0+x+x_offset): + self._plot(w, y0 - y, color) + else: + for line in range(stroke): + self._plot(x0 - y + line, y0 - x, color) + self._plot(x0 - x, y0 - y + line, color) + if corner_flags & 0x4: + for line in range(stroke): + self._plot(x0 + x + x_offset, y0 + y + y_offset - line, color) + self._plot(x0 + y + x_offset - line, y0 + x + y_offset, color) + if corner_flags & 0x2: + for line in range(stroke): + self._plot(x0 + x + x_offset, y0 - y + line, color) + self._plot(x0 + y + x_offset - line, y0 - x, color) + self._drawturtle() + time.sleep(0.003) + + # pylint: enable=invalid-name, too-many-locals, too-many-branches + def circle(self, radius, extent=None, steps=None): """Not implemented @@ -380,7 +463,7 @@ def circle(self, radius, extent=None, steps=None): raise NotImplementedError #pylint:disable=keyword-arg-before-vararg - def dot(self, size=None, *color): + def dot(self, size=None, color=None): """Not implemented Draw a circular dot with diameter size, using color. @@ -391,7 +474,14 @@ def dot(self, size=None, *color): :param color: the color of the dot """ - raise NotImplementedError + if size is None: + size = max(self._pensize + 4, self._pensize * 2) + if color is None: + color = self._pencolor + else: + color = self._color_to_pencolor(color) + self._logger.debug('dot(%d)', size) + self._draw_disk(self._x - size, self._y - size, 2 * size + 1, 2 * size + 1, size, color) def stamp(self): """Not implemented @@ -555,7 +645,9 @@ def pensize(self, width=None): :param width: - a positive number """ - raise NotImplementedError + if width is not None: + self._pensize = width + return self._pensize width = pensize def pen(self, pen=None, **pendict): @@ -596,6 +688,9 @@ def isdown(self): ############################################################################ # Color control + def _color_to_pencolor(self, c): + return 1 + Color.colors.index(c) + def color(self, *args): """Not implemented From bf04d413e0e6208a61236bc37d508aee5d9089af Mon Sep 17 00:00:00 2001 From: Dave Astels Date: Thu, 27 Jun 2019 11:49:16 -0400 Subject: [PATCH 3/8] Get things working well --- adafruit_turtle.py | 7 +++---- examples/turtle_dots.py | 24 +++--------------------- 2 files changed, 6 insertions(+), 25 deletions(-) diff --git a/adafruit_turtle.py b/adafruit_turtle.py index b6081db..23e3b47 100644 --- a/adafruit_turtle.py +++ b/adafruit_turtle.py @@ -391,12 +391,12 @@ def _draw_disk(self, x, y, width, height, r, color, fill=True, outline=True, str # pylint: disable=invalid-name, too-many-locals, too-many-branches def _helper(self, x0, y0, r, color, x_offset=0, y_offset=0, - stroke=1, corner_flags=0xF, fill=False): + stroke=1, corner_flags=0x0F, fill=False): self._logger.debug('_helper(%d, %d, %d, %d. %d, %d, %d, %d)', x0, y0, r, color, x_offset, y_offset, stroke, corner_flags) f = 1 - r ddF_x = 1 ddF_y = -2 * r - x = 0 + x = -1 y = r while x < y: @@ -435,8 +435,6 @@ def _helper(self, x0, y0, r, color, x_offset=0, y_offset=0, for line in range(stroke): self._plot(x0 + x + x_offset, y0 - y + line, color) self._plot(x0 + y + x_offset - line, y0 - x, color) - self._drawturtle() - time.sleep(0.003) # pylint: enable=invalid-name, too-many-locals, too-many-branches @@ -482,6 +480,7 @@ def dot(self, size=None, color=None): color = self._color_to_pencolor(color) self._logger.debug('dot(%d)', size) self._draw_disk(self._x - size, self._y - size, 2 * size + 1, 2 * size + 1, size, color) + self._fg_sprite[0,0] = 0 def stamp(self): """Not implemented diff --git a/examples/turtle_dots.py b/examples/turtle_dots.py index ada0612..19e9dc6 100644 --- a/examples/turtle_dots.py +++ b/examples/turtle_dots.py @@ -9,28 +9,10 @@ turtle.pendown() -turtle.dot(20) -turtle.forward(5) -turtle.right(90) -turtle.forward(5) for _ in range(4): - turtle.right(90) - turtle.forward(10) - # turtle.forward(5) - # turtle.right(90) - # turtle.forward(20) - # turtle.left(90) - # turtle.forward(5) - # turtle.left(90) - - -# turtle.dot(40) -# turtle.left(90) -# turtle.forward(25) -# turtle.dot(30) -# turtle.left(90) -# turtle.forward(25) -# turtle.dot(20) + turtle.dot() + turtle.left(90) + turtle.forward(25) while True: pass From 2a17db56f622666cd9fec937e5dce9e22ac334c0 Mon Sep 17 00:00:00 2001 From: Dave Astels Date: Thu, 27 Jun 2019 12:25:29 -0400 Subject: [PATCH 4/8] Clean up disk code for use of dot --- adafruit_turtle.py | 63 +++++++++++++++------------------------------- 1 file changed, 20 insertions(+), 43 deletions(-) diff --git a/adafruit_turtle.py b/adafruit_turtle.py index 23e3b47..d44b763 100644 --- a/adafruit_turtle.py +++ b/adafruit_turtle.py @@ -365,34 +365,21 @@ def _plot(self, x, y, c): self._fg_bitmap[int(x), int(y)] = c # self._logger.debug('Set fg_bitmap[%d, %d] to %d', x, y, self._fg_bitmap[int(x), int(y)]) except IndexError: - self._logger.debug('IndexError plotting (%d, %d)', x, y) + pass def _draw_disk(self, x, y, width, height, r, color, fill=True, outline=True, stroke=1): - self._logger.debug('_draw_disk(%d, %d, %d, %d, %d, %d)', x, y, width, height, r, color) + """Draw a filled and/or outlined circle""" if fill: - # for i in range(0, width): # draw the center chunk - # for j in range(r, height - r): # draw the center chunk - # self._plot(x + i, y + j, color) self._helper(x+r, y+r, r, color=color, fill=True, x_offset=width-2*r-1, y_offset=height-2*r-1) if outline: - # draw flat sides - # for w in range(r, width - r): - # for line in range(stroke): - # self._plot(x + w, y + line, color) - # self._plot(x + w, y + height - line - 1, color) - # for _h in range(r, height - r): - # for line in range(stroke): - # self._plot(x + line, y + _h, color) - # self._plot(x + width - line - 1, y + _h, color) - # draw round corners self._helper(x+r, y+r, r, color=color, stroke=stroke, x_offset=width-2*r-1, y_offset=height-2*r-1) # pylint: disable=invalid-name, too-many-locals, too-many-branches def _helper(self, x0, y0, r, color, x_offset=0, y_offset=0, stroke=1, corner_flags=0x0F, fill=False): - self._logger.debug('_helper(%d, %d, %d, %d. %d, %d, %d, %d)', x0, y0, r, color, x_offset, y_offset, stroke, corner_flags) + """Draw quandrant wedges filled or outlined""" f = 1 - r ddF_x = 1 ddF_y = -2 * r @@ -407,34 +394,24 @@ def _helper(self, x0, y0, r, color, x_offset=0, y_offset=0, x += 1 ddF_x += 2 f += ddF_x - if corner_flags & 0x8: - if fill: - for w in range(x0-y, x0+y+x_offset): - self._plot(w, y0 + x + y_offset, color) - for w in range(x0-x, x0+x+x_offset): - self._plot(w, y0 + y + y_offset, color) - else: - for line in range(stroke): - self._plot(x0 - y + line, y0 + x + y_offset, color) - self._plot(x0 - x, y0 + y + y_offset - line, color) - if corner_flags & 0x1: - if fill: - for w in range(x0-y, x0+y+x_offset): - self._plot(w, y0 - x, color) - for w in range(x0-x, x0+x+x_offset): - self._plot(w, y0 - y, color) - else: - for line in range(stroke): - self._plot(x0 - y + line, y0 - x, color) - self._plot(x0 - x, y0 - y + line, color) - if corner_flags & 0x4: - for line in range(stroke): - self._plot(x0 + x + x_offset, y0 + y + y_offset - line, color) - self._plot(x0 + y + x_offset - line, y0 + x + y_offset, color) - if corner_flags & 0x2: + if fill: + for w in range(x0-y, x0+y+x_offset): + self._plot(w, y0 + x + y_offset, color) + self._plot(w, y0 - x, color) + for w in range(x0-x, x0+x+x_offset): + self._plot(w, y0 + y + y_offset, color) + self._plot(w, y0 - y, color) + else: for line in range(stroke): - self._plot(x0 + x + x_offset, y0 - y + line, color) - self._plot(x0 + y + x_offset - line, y0 - x, color) + self._plot(x0 - y + line, y0 + x + y_offset, color) + self._plot(x0 - x, y0 + y + y_offset - line, color) + self._plot(x0 - y + line, y0 - x, color) + self._plot(x0 - x, y0 - y + line, color) + for line in range(stroke): + self._plot(x0 + x + x_offset, y0 + y + y_offset - line, color) + self._plot(x0 + y + x_offset - line, y0 + x + y_offset, color) + self._plot(x0 + x + x_offset, y0 - y + line, color) + self._plot(x0 + y + x_offset - line, y0 - x, color) # pylint: enable=invalid-name, too-many-locals, too-many-branches From 09c98fb4d2292e3b444aab6d67c48e097629332a Mon Sep 17 00:00:00 2001 From: Dave Astels Date: Thu, 27 Jun 2019 12:25:49 -0400 Subject: [PATCH 5/8] Add a swirl demo --- examples/turtle_swirl.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 examples/turtle_swirl.py diff --git a/examples/turtle_swirl.py b/examples/turtle_swirl.py new file mode 100644 index 0000000..d7664af --- /dev/null +++ b/examples/turtle_swirl.py @@ -0,0 +1,17 @@ +import board +from adafruit_turtle import turtle, Color + +turtle = turtle(board.DISPLAY) + + +turtle.pendown() + +colors = [Color.ORANGE, Color.PURPLE] + +for x in range(300): + turtle.pencolor(colors[x % 2]) + turtle.forward(x) + turtle.left(91) + +while True: + pass From 819b488708d8b39c4b67a583063278eeb686364e Mon Sep 17 00:00:00 2001 From: Dave Astels Date: Thu, 27 Jun 2019 12:26:08 -0400 Subject: [PATCH 6/8] Test dot color --- examples/turtle_dots.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/turtle_dots.py b/examples/turtle_dots.py index 19e9dc6..0e1c0f1 100644 --- a/examples/turtle_dots.py +++ b/examples/turtle_dots.py @@ -10,7 +10,7 @@ turtle.pendown() for _ in range(4): - turtle.dot() + turtle.dot(8, Color.RED) turtle.left(90) turtle.forward(25) From ad672ff9d910e5c971bc40bd08df3657412aec87 Mon Sep 17 00:00:00 2001 From: Dave Astels Date: Thu, 27 Jun 2019 12:34:49 -0400 Subject: [PATCH 7/8] pylint tweaks --- adafruit_turtle.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/adafruit_turtle.py b/adafruit_turtle.py index d44b763..0041fdb 100644 --- a/adafruit_turtle.py +++ b/adafruit_turtle.py @@ -46,8 +46,9 @@ * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice """ -#pylint:disable=too-many-public-methods,invalid-name,too-many-instance-attributes -#pylint:disable=too-few-public-methods,too-many-lines +#pylint:disable=too-many-public-methods,too-many-instance-attributes +#pylint:disable=too-few-public-methods,too-many-lines,too-many-arguments +#pylint:disable=no-self-use,invalid-name import gc import math @@ -363,7 +364,6 @@ def home(self): def _plot(self, x, y, c): try: self._fg_bitmap[int(x), int(y)] = c -# self._logger.debug('Set fg_bitmap[%d, %d] to %d', x, y, self._fg_bitmap[int(x), int(y)]) except IndexError: pass @@ -378,7 +378,7 @@ def _draw_disk(self, x, y, width, height, r, color, fill=True, outline=True, str # pylint: disable=invalid-name, too-many-locals, too-many-branches def _helper(self, x0, y0, r, color, x_offset=0, y_offset=0, - stroke=1, corner_flags=0x0F, fill=False): + stroke=1, fill=False): """Draw quandrant wedges filled or outlined""" f = 1 - r ddF_x = 1 @@ -457,7 +457,7 @@ def dot(self, size=None, color=None): color = self._color_to_pencolor(color) self._logger.debug('dot(%d)', size) self._draw_disk(self._x - size, self._y - size, 2 * size + 1, 2 * size + 1, size, color) - self._fg_sprite[0,0] = 0 + self._fg_sprite[0, 0] = 0 def stamp(self): """Not implemented From 14d8d49b7edacbf6b1e72e17bbfee51d9c96b4ff Mon Sep 17 00:00:00 2001 From: Dave Astels Date: Thu, 27 Jun 2019 12:46:22 -0400 Subject: [PATCH 8/8] Clean up pylint complaints --- adafruit_turtle.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/adafruit_turtle.py b/adafruit_turtle.py index 0041fdb..743396f 100644 --- a/adafruit_turtle.py +++ b/adafruit_turtle.py @@ -46,9 +46,8 @@ * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice """ -#pylint:disable=too-many-public-methods,too-many-instance-attributes -#pylint:disable=too-few-public-methods,too-many-lines,too-many-arguments -#pylint:disable=no-self-use,invalid-name +#pylint:disable=too-many-public-methods, too-many-instance-attributes, invalid-name +#pylint:disable=too-few-public-methods, too-many-lines, too-many-arguments import gc import math @@ -376,7 +375,7 @@ def _draw_disk(self, x, y, width, height, r, color, fill=True, outline=True, str self._helper(x+r, y+r, r, color=color, stroke=stroke, x_offset=width-2*r-1, y_offset=height-2*r-1) - # pylint: disable=invalid-name, too-many-locals, too-many-branches + # pylint: disable=too-many-locals, too-many-branches def _helper(self, x0, y0, r, color, x_offset=0, y_offset=0, stroke=1, fill=False): """Draw quandrant wedges filled or outlined""" @@ -413,7 +412,7 @@ def _helper(self, x0, y0, r, color, x_offset=0, y_offset=0, self._plot(x0 + x + x_offset, y0 - y + line, color) self._plot(x0 + y + x_offset - line, y0 - x, color) - # pylint: enable=invalid-name, too-many-locals, too-many-branches + # pylint: enable=too-many-locals, too-many-branches def circle(self, radius, extent=None, steps=None): """Not implemented @@ -664,8 +663,10 @@ def isdown(self): ############################################################################ # Color control +#pylint:disable=no-self-use def _color_to_pencolor(self, c): return 1 + Color.colors.index(c) +#pylint:enable=no-self-use def color(self, *args): """Not implemented