Source code for turtlethread.visualise

from pyembroidery import JUMP, STITCH, TRIM

USE_SPHINX_GALLERY = False


def centered_dot(turtle, diameter):
    pensize = turtle.pensize()
    turtle.pensize(diameter)
    turtle.goto(turtle.position())
    turtle.pensize(pensize)


def centered_cross(turtle, length):
    r = length / 2
    x, y = turtle.position()
    turtle.goto(x + r, y + r)
    turtle.goto(x - r, y - r)
    turtle.goto(x, y)
    turtle.goto(x + r, y - r)
    turtle.goto(x - r, y + r)
    turtle.goto(x, y)


def centered_line(turtle, length):
    r = length / 2
    tr = turtle._tracer()
    dl = turtle._delay()
    turtle._tracer(0, 0)
    x, y = turtle.position()
    turtle.right(90)
    turtle.forward(r)
    turtle.penup()
    turtle.backward(r)
    turtle.pendown()
    turtle.backward(r)
    turtle.penup()
    turtle.forward(r)
    turtle.left(90)
    turtle.pendown()
    turtle._tracer(tr, dl)


def _finish_visualise(done, bye):
    import turtle  # Import turtle only here to avoid cluttering module namespace

    if done:
        try:
            turtle.done()
        except turtle.Terminator:
            pass
    if bye:
        try:
            turtle.bye()
        except turtle.Terminator:
            pass


[docs] def visualise_pattern(pattern, turtle=None, width=800, height=800, scale=1, done=True, bye=True): """Use the builtin ``turtle`` library to visualise an embroidery pattern. Parameters ---------- pattern : pyembroidery.EmbPattern Embroidery pattern to visualise turtle : turtle.Turtle (optional) Python turtle object to use for drawing. If not specified, then the default turtle is used. width : int Canvas width height : int Canvas height scale : int Factor the embroidery length's are scaled by. done : bool If True, then ``turtle.done()`` will be called after drawing. bye : bool If True, then ``turtle.bye()`` will be called after drawing. """ if USE_SPHINX_GALLERY: return # Lazy import of 'turtle' module just for visualization so that the rest of # the library can be used on Python installs where the GUI libraries are not # available. # # (This looks like it would conflict with the 'turtle' variable but it does not) from turtle import Screen, Turtle if turtle is None: # If turtle is None, grab the default turtle and set its speed to fastest if Turtle._pen is None: Turtle._pen = Turtle() turtle = Turtle._pen turtle.speed("fastest") screen = Screen() screen.setup(width, height) if len(pattern.stitches) == 0: _finish_visualise(done=done, bye=bye) return turtle.penup() turtle.goto(pattern.stitches[0][0], pattern.stitches[0][1]) turtle.pendown() raise_error = False for x, y, command in pattern.stitches: x = scale * x y = scale * y if command == JUMP: turtle.color("red") turtle.goto(x, y) speed = turtle.speed() turtle.speed("fastest") centered_dot(turtle, 25 * scale) turtle.speed(speed) elif command == TRIM: turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color("black") speed = turtle.speed() turtle.speed("fastest") centered_cross(turtle, 25 * scale) turtle.speed(speed) elif command == STITCH: turtle.setheading(turtle.towards(x, y)) turtle.pendown() turtle.color("blue") turtle.goto(x, y) speed = turtle.speed() turtle.speed("fastest") centered_line(turtle, 10 * scale) turtle.speed(speed) else: raise_error = True break _finish_visualise(done=done, bye=bye) if raise_error: ValueError(f"Command not supported: {command}")