# -*- coding: utf-8 -*- #Copyright (c) 2009, Walter Bender #Permission is hereby granted, free of charge, to any person obtaining a copy #of this software and associated documentation files (the "Software"), to deal #in the Software without restriction, including without limitation the rights #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #copies of the Software, and to permit persons to whom the Software is #furnished to do so, subject to the following conditions: #The above copyright notice and this permission notice shall be included in #all copies or substantial portions of the Software. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. import os from gettext import gettext as _ import random from math import sin, cos, pi RED_STROKE = "#FF6040" RED_FILL = "#FFC4B8" BLUE_STROKE = "#0060C8" BLUE_FILL = "#ACC8E4" GREEN_STROKE = "#00B418" GREEN_FILL = "#AFE8A8" # PURPLE_STROKE = "#780078" # PURPLE_FILL = "#E4AAE4" color_pairs = ([RED_STROKE,RED_FILL], [GREEN_STROKE,GREEN_FILL], [BLUE_STROKE,BLUE_FILL]) fill_styles = ("none","gradient","solid") card_types = ("X","O","C") roman_numerals = {5:'V',7:'VII',10:'X',11:'XI',14:'XIV',15:'XV',\ 21:'XXI',22:'XXII',33:'XXXIII'} number_names = {5:_('five'),7:_('seven'),11:_('eleven'),10:_('ten'),\ 14:_('fourteen'),15:_('fifteen'),22:_('twenty two'),\ 21:_('twenty one'),33:_('thirty three')} # # SVG generators # def svg_rect(f,w,h,rx,ry,x,y,stroke,fill,stroke_width): f.write(" \n") def svg_circle(f,cx,cy,r,stroke,fill,stroke_width): f.write(" \n") def svg_line(f,x1,y1,x2,y2,stroke,stroke_width): f.write("\n") def svg_text(f,x,y,size,stroke,font,style,string): f.write(" \n") f.write(" "+string+"\n") f.write(" \n") def svg_check(f, x, style, stroke, fill): f.write("\n") elif style == "gradient": f.write(" style=\"fill:"+fill+";stroke:"+stroke+\ ";stroke-width:1.8;\" />\n") else: f.write(" style=\"fill:"+stroke+";stroke:"+stroke+\ ";stroke-width:1.8;\" />\n") def svg_cross(f, x, style, stroke, fill): f.write("\n") elif style == "gradient": f.write(" style=\"fill:"+fill+";stroke:"+stroke+\ ";stroke-width:1.8;\" />\n") else: f.write(" style=\"fill:"+stroke+";stroke:"+stroke+\ ";stroke-width:1.8;\" />\n") def background(f,stroke,fill,width): svg_rect(f,124.5,74.5,11,9,0.25,0.25,stroke,fill,width) def header(f,stroke,fill,width): f.write("\n") f.write("\n") f.write("\n") background(f,stroke,fill,width) f.write("\n") def footer(f): f.write("\n") f.write("\n") # # Card pattern generators # def line_of_dots(f, n, x, y, stroke): f.write("\n") if n%5 == 0: cx = 37.5 elif n%7 == 0: cx = 27.5 else: cx = 7.5 cy = 5 for i in range(n): svg_circle(f,cx,cy,3,stroke,stroke,2) cx += 10 f.write("\n") def hash(f, n, x, y, stroke): f.write("\n") if n%5 == 0: cx = 42.5 elif n%7 == 0: cx = 32.5 else: cx = 22.5 cy = 5 x1 = 7.5+cx x2 = cx for i in range(n): if (i+1)%5==0: svg_line(f,x1-40,7.5,x2,7.5,stroke,1.8) else: svg_line(f,x1,0,x2,15,stroke,1.8) x1 += 7.5 x2 += 7.5 f.write("\n") def dots_in_a_line(f, t, n, stroke): if n%3 == 0: y = 12.5 nn = n/3 elif n%2 == 0: y = 22.5 nn = n/2 else: y = 32.5 nn = n if n%5 == 0: n/=5 elif n%7 == 0: n/=7 else: n/=11 for i in range(n): line_of_dots(f, nn, 5, y, stroke) y += 20 def circle_of_dots(f, n, x, y, stroke): f.write("\n") j = n ox = 0 oy = 32.5 if j == 5: r = 9 elif j == 7: r = 13 else: r = 17 da = pi*2/j a = 0 x = ox+sin(a)*r y = oy+cos(a)*r for i in range(n): svg_circle(f,x,y,3,stroke,stroke,2) a += da x = ox+sin(a)*r y = oy+cos(a)*r f.write("\n") def points_in_a_star(f, t, n, stroke): if n%3 == 0: x = 25 nn = n/3 elif n%2 == 0: x = 37.5 nn = n/2 else: x = 62.5 nn = n if n%5 == 0: n/=5 y = 15 elif n%7 == 0: n/=7 y = 15 else: n/=11 y = 15 for i in range(n): if n == 3: if i == 0: y+=12 elif i == 1: y-=24 else: y+=24 star(f, nn, x, y, stroke) if n == 2: x += 50 else: x += 37.5 def dots_in_a_circle(f, t, n, stroke): if n%3 == 0: x = 25 nn = n/3 elif n%2 == 0: x = 37.5 nn = n/2 else: x = 62.5 nn = n if n%5 == 0: n/=5 y = 5 elif n%7 == 0: n/=7 y = 5 else: n/=11 y = 5 for i in range(n): if n == 3: if i == 0: y+=12 elif i == 1: y-=24 else: y+=24 circle_of_dots(f, nn, x, y, stroke) if n == 2: x += 50 else: x += 37.5 def die(f, n, x, y, stroke): f.write("\n") svg_rect(f,25,25,2,2,0,0,stroke,"none",1.5) if n in [2,3,4,5,6]: svg_circle(f,6,6,1.5,stroke,stroke,2) svg_circle(f,19,19,1.5,stroke,stroke,2) if n in [1,3,5]: svg_circle(f,12.5,12.5,1.5,stroke,stroke,2) if n in [4,5,6]: svg_circle(f,19,6,1.5,stroke,stroke,2) svg_circle(f,6,19,1.5,stroke,stroke,2) if n in [6]: svg_circle(f,6,12.5,1.5,stroke,stroke,2) svg_circle(f,19,12.5,1.5,stroke,stroke,2) f.write("\n") def number_hash(f, t, n, stroke): if n%3 == 0: y = 12.5 nn = n/3 elif n%2 == 0: y = 22.5 nn = n/2 else: y = 32.5 nn = n if n%5 == 0: n/=5 elif n%7 == 0: n/=7 else: n/=11 for i in range(n): hash(f, nn, 5, y, stroke) y += 20 def dice(f, t, n, stroke): if n == 5: die(f, 5, 50, 25, stroke) elif n == 10: die(f, 5, 30, 25, stroke) die(f, 5, 70, 25, stroke) elif n == 15: die(f, 5, 15, 25, stroke) die(f, 5, 50, 25, stroke) die(f, 5, 85, 25, stroke) elif n == 7: die(f, 3, 50, 10, stroke) die(f, 4, 50, 40, stroke) elif n == 14: die(f, 4, 30, 10, stroke) die(f, 3, 70, 10, stroke) die(f, 3, 30, 40, stroke) die(f, 4, 70, 40, stroke) elif n == 21: die(f, 3, 15, 10, stroke) die(f, 4, 50, 10, stroke) die(f, 3, 85, 10, stroke) die(f, 4, 15, 40, stroke) die(f, 3, 50, 40, stroke) die(f, 4, 85, 40, stroke) elif n == 11: die(f, 5, 50, 10, stroke) die(f, 6, 50, 40, stroke) elif n == 22: die(f, 6, 30, 10, stroke) die(f, 5, 70, 10, stroke) die(f, 5, 30, 40, stroke) die(f, 6, 70, 40, stroke) elif n == 33: die(f, 5, 15, 10, stroke) die(f, 6, 50, 10, stroke) die(f, 5, 85, 10, stroke) die(f, 6, 15, 40, stroke) die(f, 5, 50, 40, stroke) die(f, 6, 85, 40, stroke) def star(f, n, x, y, stroke): turntable = {5:3,7:3,11:5} f.write("\n") turns = turntable[n] x1 = 0 y1 = 0 a = 0 for i in range(n*turns): x2 = x1+sin(a)*40 y2 = y1+cos(a)*40 svg_line(f,x1,y1,x2,y2,stroke,1.8) x1 = x2 y1 = y2 a += turns*2*pi/n f.write("\n") def circle(f, x, style, stroke, fill): if style == "none": svg_circle(f,x+17,38,16,stroke,"#FFFFFF",1.8) elif style == "gradient": svg_circle(f,x+17,38,16,stroke,fill,1.8) else: svg_circle(f,x+17,38,16,stroke,stroke,1.8) svg_circle(f,x+17,38,8,stroke,fill,1.8) def check_card(f, n, style, stroke, fill): if n == 1: svg_check(f, 45.5, style, stroke, fill) elif n == 2: svg_check(f, 25.5, style, stroke, fill) svg_check(f, 65.5, style, stroke, fill) else: svg_check(f, 5.5, style, stroke, fill) svg_check(f, 45.5, style, stroke, fill) svg_check(f, 85.5, style, stroke, fill) def cross_card(f, n, style, stroke, fill): if n == 1: svg_cross(f, 45.5, style, stroke, fill) elif n == 2: svg_cross(f, 25.5, style, stroke, fill) svg_cross(f, 65.5, style, stroke, fill) else: svg_cross(f, 5.5, style, stroke, fill) svg_cross(f, 45.5, style, stroke, fill) svg_cross(f, 85.5, style, stroke, fill) def circle_card(f, n, style, stroke, fill): if n == 1: circle(f, 45.5, style, stroke, fill) elif n == 2: circle(f, 25.5, style, stroke, fill) circle(f, 65.5, style, stroke, fill) else: circle(f, 5.5, style, stroke, fill) circle(f, 45.5, style, stroke, fill) circle(f, 85.5, style, stroke, fill) def number_arabic(f, t, n, stroke): x = 63.5 string = str(n) svg_text(f,x,55.25,48,stroke,"DejaVu","",string) def number_roman(f, t, n, stroke): x = 63.5 string = roman_numerals[n] svg_text(f,x,53.25,32,stroke,"DejaVu Serif","",string) def number_word(f, t, n, stroke): x = 63.5 strings = number_names[n].split(' ') if len(strings) == 1: svg_text(f,x,48.25,26,stroke,"DejaVu Serif","",strings[0]) else: svg_text(f,x,35.25,26,stroke,"DejaVu Serif","",strings[0]) svg_text(f,x,63.25,26,stroke,"DejaVu Serif","",strings[1]) def number_card(f, t, n, stroke, methodX, methodO, methodC): if t == 'X': methodX(f, t, n, stroke) elif t == 'O': methodO(f, t, n, stroke) else: methodC(f, t, n, stroke) def word_card(f, t, s, string, stroke): if t == 'X': svg_text(f,63.5,45.5,30,stroke,"DejaVu","font-weight:bold;",string[s]) elif t == 'O': svg_text(f,63.5,45.5,30,stroke,"DejaVu Serif","font-style:italic;",\ string[s]) else: svg_text(f,63.5,45.5,30,stroke,"DejaVu","",string[s]) def open_file(datapath, filename): return file(os.path.join(datapath, filename), "w") def close_file(f): f.close() def generator(datapath): # pattern cards i = 0 for t in card_types: for c in color_pairs: for n in range(1,4): for s in fill_styles: filename = "pattern-%d.svg" % (i) f = open_file(datapath, filename) header(f,"#000000",c[1],"0.5") if t == "O": circle_card(f,n,s,c[0],c[1]) elif t == "C": check_card(f,n,s,c[0],c[1]) else: cross_card(f,n,s,c[0],c[1]) footer(f) close_file(f) i += 1 # number cards # choose different card styles each time methodX = number_arabic r = random.randrange(3) if r == 0: methodO = number_roman elif r == 1: methodO = number_hash else: methodO = number_word r = random.randrange(4) if r == 0: methodC = dots_in_a_line elif r == 1: methodC = dots_in_a_circle elif r == 2: methodC = points_in_a_star else: methodC = dice i = 0 for t in card_types: # ignoring this field for c in color_pairs: for n in range(1,4): for s in [5,7,11]: filename = "number-%d.svg" % (i) f = open_file(datapath, filename) header(f,"#000000",c[1],"0.5") number_card(f,t,n*s,c[0],methodX,methodO,methodC) footer(f) close_file(f) i += 1 # word cards i = 0 for t in card_types: # ignoring this field for c in color_pairs: for n in range(0,3): for s in range(0,3): filename = "word-%d.svg" % (i) f = open_file(datapath, filename) header(f,"#000000",c[1],"0.5") if n == 0: word_card(f,t,s,[_("dog"),_("cat"),_("mouse")],c[0]) elif n == 1: word_card(f,t,s,[_("apple"),_("bread"),_("cheese")], c[0]) else: word_card(f,t,s,[_("sun"),_("moon"),_("earth")],c[0]) footer(f) close_file(f) i += 1 f = open_file(datapath, "match.svg") header(f,"#A0A0A0","#F0F0F0","3.0") footer(f) close_file(f) f = open_file(datapath, "selected.svg") header(f,"#000000","none","3.0") footer(f) close_file(f) def main(): return 0 if __name__ == "__main__": if not os.path.exists(os.path.join(os.path.abspath('.'), 'images')): os.mkdir(os.path.join(os.path.abspath('.'), 'images')) generator(os.path.join(os.path.abspath('.'), 'images')) main()