from turtle import Turtle
default_count_point = 15 #количество узлов в сетке
default_scale = 1
default_step_grid = 40


def init_drawman():
    global t, x_current, y_current, _drawman_scale, _step_grid, _count_point
    t = Turtle()
    t.penup()
    x_current = 0
    y_current = 0
    t.goto(x_current, y_current)
    _count_point = default_count_point
    _step_grid = default_step_grid
    drawman_scale(default_scale,default_step_grid)

def drawman_scale(scale , new_step_grid ):
    global _drawman_scale, _step_grid
##
    _drawman_scale = new_step_grid / scale
    _step_grid = new_step_grid


def set_size_square():
    """
    Установка размера канвы
    count_point - количество единиц, видимых слева, справа, сверху, снизу
    """
    global  _count_point, _step_grid

    t.screen.screensize (_count_point*_step_grid, _count_point*_step_grid)

def get_size_square():
    """
    Возвращает ширину и высоту канвы
    """
    return t.screen.screensize()

def set_color(new_color):
    """
    Установка цвета
    """
    t.color (new_color)

def draw_grid():
    """
    Нарисовать сетку серым цветом
    в конце перо поднято и Черепашка стоит в центре, цвет восстанавливается до черного
    """
    global _step_grid
    set_color("gray")

    w,h = get_size_square()

    w2 = w / 2
    h2 = h / 2
    # вертикальные линии снизу вверх
    x = 0
    print(_step_grid,w2)
    while x <=w2:
        pen_up()
        t.goto(x, -h2)
        pen_down()
        t.goto(x,h2)
        x += _step_grid
    x = 0
    while x >=-w2:
        pen_up()
        t.goto(x, -h2)
        pen_down()
        t.goto(x,h2)
        x -= _step_grid
    # горизонтальные линии слева направо
    y = 0
    while y <= h2:
        pen_up()
        t.goto(-w2, y)
        pen_down()
        t.goto(w2,y)
        y +=_step_grid
    y = 0
    while y >= -h2:
        pen_up()
        t.goto(-w2, y)
        pen_down()
        t.goto(w2,y)
        y -= _step_grid

    # окончание работы
    pen_up()
    to_point(0,0)
    set_color("black")

def pen_width(_width):
    t.width (_width)

def draw_axis(number):
    """
    Нарисовать оси координат  с подписями черным цветом, толщиной 2 пикселя
    number - вид подписи:
    0 - без подписей, 1 - только точка (0,0), 2 - единичный интервал, 3 - все числа
    подписи выводятся коричневым цветом
    """

    set_color("black")

    pen_width(2)
    w,h = get_size_square()
    # горизонтальная ось слева направо
    pen_up()
    t.goto(-w/2+_step_grid/2,0)
    pen_down()
    t.goto(w/2-_step_grid/2,0)
    t.stamp ()
    t.right(90)
    pen_up()
    t.forward(15)
    t.left(90)
    t.write('X')
    # вертикальная ось снизу вверх
    pen_up()
    t.goto(0,-h/2+_step_grid/2)
    pen_down()
    t.goto(0,h/2-_step_grid/2)
    t.left(90)
    t.stamp()
    t.left(90)
    pen_up()
    t.forward(15)

    t.write('Y')
    # подписи к осям
    pen_up()
    set_color("brown")

    if number == 0:
        pass
    elif number == 1:
        t.goto(0,0)
        t.write('0')
    elif number == 2:
        t.goto(0,0)
        t.write('0')
        t.goto(0,_step_grid)
        t.write(str(int(_default_scale)))
        t.goto(0,-_step_grid)
        t.write(str(int(-_default_scale)))
        t.goto(_step_grid,0)
        t.write(str(int(_default_scale)))
        t.goto(-_step_grid,0)
        t.write(str(int(-_default_scale)))
    else:
        # подписи к горизонтальной оси
        t.goto(0,0)
        t.write('0')
        x = _step_grid
        t.goto(x, 0)
        i = _step_grid /_drawman_scale
        step_i = i
        while x < w/2:
            t.write(str(i))
            i += step_i
            x += _step_grid
            t.goto(x,0)
        x = -_step_grid
        t.goto(x, 0)
        i = -step_i
        while x > -w/2:
            t.write(str(i))
            i -= step_i
            x -= _step_grid
            t.goto(x,0)

        # подписи к вертикальной оси
        y = _step_grid
        t.goto(0, y)
        i = step_i
        while y < h/2:
            t.write(str(i))
            i += step_i
            y += _step_grid
            t.goto(0, y)
        y = -_step_grid
        t.goto(0, y)
        i = -step_i
        while y > -h/2:
            t.write(str(i))
            i -= step_i
            y -= _step_grid
            t.goto(0, y)

def speed(new_speed):
    t.speed(new_speed)


def test_drawman():
    """
    Тестирование работы Чертёжника
    :return: None
    """
    global _drawman_scale
    def f(x):

        return x*x
    pen_down()
    drawman_scale(2,50)
    set_size_square()
    speed(10)
    draw_grid()
    draw_axis(3)

##    for i in range(5):
##        on_vector(10, 20)
##        on_vector(0, -20)
##    pen_up()
##    to_point(0, 0)


    pen_up()

    x = -5.0
    to_point(x,f(x))
    pen_down()
    while x<5:
        to_point(x, f(x))
        x += 0.1
    pen_up()



def pen_down():
    t.pendown()


def pen_up():
    t.penup()


def on_vector(dx, dy):
    global x_current, y_current, _drawman_scale
    to_point(x_current +  dx, y_current + dy)


def to_point(x, y):
    global x_current, y_current, _drawman_scale
    x_current = x
    y_current = y
    t.goto(_drawman_scale*x_current, _drawman_scale*y_current)


init_drawman()

if __name__ == '__main__':
    import time

    test_drawman()
    time.sleep(3)
