leo3065

[Python] drawing svg using turtle

Mar 24th, 2020
1,219
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.16 KB | None | 0 0
  1. from svgpathtools import svg2paths2
  2. from math import ceil
  3. import numpy as np
  4. import turtle
  5.  
  6. svg_file = r'D:\Pokemon data\dream-world\227.svg'
  7. sprite_path = r'D:\Pokemon data\Skarmory_resource\sprites\mystrey_dungeon_explorers_of_time\gif\a{}_{}.gif'
  8.  
  9. paths, attrs, svg_attr = svg2paths2(svg_file)
  10. svg_size = int(svg_attr['width'][:-2]), int(svg_attr['height'][:-2])
  11. mx = max(svg_size)
  12.  
  13. seg_res = 5
  14. polys = []
  15. for path in paths:
  16.     poly = []
  17.     for subpaths in path.continuous_subpaths():
  18.         points = []
  19.         for seg in subpaths:
  20.             interp_num = ceil(seg.length()/seg_res)
  21.             points.append(seg.point(np.arange(interp_num)/interp_num))
  22.         points = np.concatenate(points)
  23.         points = np.append(points, points[0])
  24.         poly.append(points)
  25.     polys.append([[(p.real, p.imag) for p in pl] for pl in poly])
  26.  
  27.  
  28. turtle_window = turtle.Screen()
  29. t = turtle
  30.  
  31. frame = 0
  32.  
  33. def change_shape(t, h):
  34.     i = int(round((h+90)/45)%8)
  35.    
  36.     global frame
  37.     frame += 1
  38.     f = (frame//20)%2
  39.     f = 2 if f else 3
  40.     t.shape(sprite_path.format(i, f))
  41.  
  42. def head_to(t, x, y, draw=True):
  43.     wasdown = t.isdown()
  44.     heading = t.towards(x,y)
  45.     t.pen(pendown=draw)
  46.     t.seth(heading)
  47.     t.clearstamps()
  48.     t.stamp()
  49.     change_shape(t, heading)
  50.     t.goto(x,y)
  51.     t.pen(pendown=wasdown)
  52.  
  53. def draw_polygon(t, poly, fill='black'):
  54.     t.color(fill,fill)
  55.     p = poly[0]
  56.     head_to(t,p[0],-(p[1]), False)
  57.     for p in poly[1:]:
  58.         head_to(t,p[0],-(p[1]))
  59.     t.up()
  60.  
  61. def draw_multipolygon(t, mpoly, fill='black'):
  62.     p = mpoly[0][0]
  63.     head_to(t,p[0],-(p[1]), False)
  64.     t.begin_fill()
  65.     for i, poly in enumerate(mpoly):
  66.         draw_polygon(t, poly, fill)
  67.         if i!=0:
  68.             head_to(t,p[0],-(p[1]), False)
  69.     t.end_fill()
  70.  
  71. t.reset()
  72. t.setworldcoordinates(-50, -(mx+50), mx+50, 50)
  73. t.mode(mode='world')
  74. t.tracer(n=8, delay=0)
  75. for i in range(8):
  76.     for f in [2, 3]:
  77.         t.register_shape(sprite_path.format(i,f))
  78.  
  79. for poly, attr in zip(polys, attrs):
  80.     draw_multipolygon(t, poly, fill=attr['fill'])
  81. head_to(t,mx/2,-(mx+40), False)
  82.  
  83. t.hideturtle()
  84. t.clearstamps()
  85. turtle.done()
Comments
Add Comment
Please, Sign In to add comment