Attachment 'drawer3.py'

Download

   1 #!/usr/bin/env python
   2 # -*- coding: UTF-8 -*-
   3 '''
   4   Рисовальщик: программа , котороая читает из файла и отображает 
   5    0. Размер картинки (первая строка файла)
   6       <ширина> <высота>
   7    1. Линии, окружности, прямогуольники с цветом и шириной
   8       color <R,G,B>
   9       width <ширина>
  10       line <начало> <конец>
  11       cicrle <центр> <радиус>
  12       rect <угол1> <угол3>
  13    2. Ломаные и многоугольники
  14       lines <точка1> <точка2> ...
  15       polygon <точка1> <точка2> ...
  16    3. Заливка одноцветной области
  17       fill <откуда> <тип> [<показывать ли?>]
  18 '''
  19 
  20 from math import *
  21 import sys
  22 
  23 import pygame
  24 pygame.init()
  25 
  26 def int1(s):
  27   'Разбить строку на слова, пребразовать все элементы, кроме первого, в целые'
  28   if s.startswith('#'): return s,[]	# комментарий
  29   l=s.split(' ')
  30   return [l[0].lower()]+[int(e) for e in l[1:]]
  31 
  32 def pairs(s):
  33   'Разбить список на пары'
  34   return [s[i:i+2] for i in range(0,len(s),2)]
  35 
  36 def testdot(surf, dot, Fil):
  37   'Проверить, ннужно ли закрашивать точку dot при цвете фона Fil'
  38   return surf.get_rect().collidepoint(dot) and surf.get_at(dot) == Fil
  39 
  40 def fillsurface(surf, col, dot, depth = False, debug = False):
  41   '''Перекрасить все точки surface, непосредственно доступные
  42   от точки dot, в цвет col'''
  43   dif = ((-1,0),(0,1),(1,0),(0,-1))	# соседние точки
  44 
  45   def fillwidth(surf, queue, Col, Fil, dot, debug):
  46     'Если это нужно, закрасить каждую точку и добавить все их соседние в очередь'
  47     queue2=[]
  48     while queue:
  49       d = queue.pop()
  50       if testdot(surf, d, Fil):
  51 	surf.set_at(d,Col)
  52 	queue2.extend([(d[0]+dif[i][0],d[1]+dif[i][1]) for i in xrange(len(dif))])
  53     return queue2
  54 
  55   def filldepth(surf, queue, Col, Fil, dot, debug):
  56     'Если это нужно, закрасить точку и добавить 4 соседние в очередь'
  57     d = queue.pop()
  58     if testdot(surf, d, Fil):
  59       surf.set_at(d,Col)
  60       queue.extend([(d[0]+dif[i][0],d[1]+dif[i][1]) for i in xrange(len(dif))])
  61     return queue
  62 
  63   Col=pygame.Color(*col)
  64   Plane=surf.get_rect()
  65   surf.lock()
  66   fill = depth and filldepth or fillwidth
  67   if surf.get_at(dot) != Col:
  68     Fil = surf.get_at(dot)
  69     queue = [dot]			# точки, которые, возможно, надо закрасить
  70     while queue:
  71       queue = fill(surf, queue, Col, Fil, dot, debug)
  72       if debug: pygame.display.flip()
  73   surf.unlock()
  74 
  75 # как ввести имя файла?
  76 f = file(sys.argv[1],"r")
  77 fig = [int1(l) for l in f.readlines()]
  78 print fig
  79 W,H = int(fig[0][0]),int(fig[0][1])
  80 width,color = 1, (255,25,255)
  81 screen = pygame.display.set_mode((W,H))
  82 
  83 for l in fig[1:]:
  84   print l
  85   if not l[0] or l[0].startswith('#'):
  86     pass
  87   elif l[0] == 'width': width = l[1]
  88   elif l[0] == 'color': color = l[1:]
  89   elif l[0] == 'line': pygame.draw.line(screen, color, l[1:3], l[3:5], width)
  90   elif l[0] == 'rect': pygame.draw.rect(screen, color, l[1:5], width)
  91   elif l[0] == 'circle': pygame.draw.circle(screen, color, l[1:3], l[3], width)
  92   elif l[0] == 'lines': pygame.draw.lines(screen, color, False, pairs(l[1:]), width)
  93   elif l[0] == 'poly': pygame.draw.lines(screen, color, True, pairs(l[1:]), width)
  94   elif l[0] == 'fill': fillsurface(screen, color, l[1:3], False, False)
  95   else: print >> sys.stderr, "Warning: unknown '%s' figure"%l[0]
  96   pygame.display.flip()	# для медленного красивого отображения
  97 
  98 print "END"
  99 while pygame.event.wait().type != pygame.QUIT:
 100   pass

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.

You are not allowed to attach a file to this page.