# -*- 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")
#
# 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()