Merge branch 'master' of git+ssh://gitbox/piccreate

This commit is contained in:
Eva Möller
2012-08-20 14:53:50 +02:00
7 changed files with 166 additions and 110 deletions
+7 -40
View File
@@ -10,6 +10,7 @@ Usage: `basename $0` [-h] [-i] [-j nb_jobs] command arg_list
-c give the path to the cfg file
-i give the path of the svg files without the last /
-k chek if the jpg already exist
-s set the sleeptime while there are too many simultanious jobs
-j Set number of simultanious jobs. Default is 2
-o directory where the files should be moved to after creation.
Default ist PICCREATE_OUT
@@ -17,40 +18,10 @@ Usage: `basename $0` [-h] [-i] [-j nb_jobs] command arg_list
`basename $0` -i file -c config
`basename $0` -j 3 -i file -c config"
function queue {
QUEUE="$QUEUE $1"
NUM=$(($NUM+1))
}
function regeneratequeue {
OLDREQUEUE=$QUEUE
QUEUE=""
NUM=0
for PID in $OLDREQUEUE
do
if [ -d /proc/$PID ] ; then
QUEUE="$QUEUE $PID"
NUM=$(($NUM+1))
fi
done
}
function checkqueue {
OLDCHQUEUE=$QUEUE
for PID in $OLDCHQUEUE
do
if [ ! -d /proc/$PID ] ; then
regeneratequeue # at least one PID has finished
echo $PID
break
fi
done
}
function cfg_parser {
INI_FILE=$1
SECTION=$2
echo $1
echo $2
eval `sed -n -e "/^\[$SECTION\]/,/^\s*\[/{/^[^;].*\=.*/p;}" < $INI_FILE`>> trr.txt
echo 'helololo'
}
function get_filepath {
# probiere alle möglichen Kombinationen wo das file stehen könnte je
@@ -116,8 +87,9 @@ if [ $# -eq 0 ]; then # must be at least one arg
fi
CHECKFILE=0
SLEEPTIME=0.5
while getopts "j:i:kc:o:hc:" OPT; do # "j:" waits for an argument "h" doesnt
while getopts "j:i:kc:s:o:hc:" OPT; do # "j:" waits for an argument "h" doesnt
case $OPT in
h) echo "$USAGE"
exit 0 ;;
@@ -125,6 +97,7 @@ while getopts "j:i:kc:o:hc:" OPT; do # "j:" waits for an argument "h" doesnt
k) CHECKFILE=1 ;;
c) CFG_FILENAME=$OPTARG ;;
o) OUTDIR=$OPTARG ;;
s) SLEEPTIME=$OPTARG ;;
i) INPUT_FILENAME=$OPTARG ;;
*) echo "$USAGE" >&2; exit 1; # Default.
esac
@@ -139,27 +112,21 @@ check_params
echo $INPUT_FILE
for i in `ls $INPUT_FILE| grep .svg `
do
echo $i
echo $CHECKFILE
ID=`echo "$i" | sed -e 's/;.*//g'`
PIC_NAME=`echo "$i" | sed -e 's/.svg/.jpg/g'`
FILE_PATH=$INPUT_FILE/$PIC_NAME
if [ -s $FILE_PATH ] && [ $CHECKFILE -eq 1 ]
then
echo $PIC_NAME exists!
echo $PIC_NAME exists
else
RESIZE="${width}x${height}"
SWITCHES="-density $density $INPUT_FILE/$ID -resize $RESIZE $INPUT_FILE/$PIC_NAME"
CMDLINE="$CMD $SWITCHES"
echo $CMDLINE
(echo $ID; $CMDLINE) &
PID=$!
queue $PID
while [ $NUM -ge $MAX_NPROC ]; do
checkqueue
sleep 0.5
while [ `ps -clx|grep -w 'convert' |wc -l` -ge $MAX_NPROC ]; do
sleep $SLEEPTIME
done
fi
done
+8 -5
View File
@@ -29,18 +29,21 @@ name = Name
# hier der Inhalt aus der Eingabedatei, der geschrieben werden soll
content=${name}
# Ab dem Punkt wird zu schreiben begonnen
x=0
x=-10
y=0
length=200
height=850
width=2640
# Fontname und Fonttyp
fontname=ausgangsschrift
glyph_space=20
counter_replace=True
#align=center,left,right
align=left
align=center
yalign=center
autoscale=True
[jpgs]
width=1900
height=700
width=2776
height=898
format=jpg
density=300
+3 -3
View File
@@ -39,7 +39,7 @@ NPATTERN=9
FONTNAME=d.svg
#
[e]
XSTEP=40
XSTEP=40.0
XMIN=34.977264
XMAX=67.112206
YSTEP=56.548093
@@ -69,7 +69,7 @@ NPATTERN=10
FONTNAME=g.svg
#
[h]
XSTEP=39.362423
XSTEP=45.0
XMIN=40.923481
XMAX=80.285904
YSTEP=83.657337
@@ -99,7 +99,7 @@ NPATTERN=4
FONTNAME=j.svg
#
[k]
XSTEP=39.362423
XSTEP=45.0
XMIN=40.923481
XMAX=80.285904
YSTEP=84.097073
+24 -24
View File
@@ -1,98 +1,98 @@
<g transform="translate(${posx},${posy})">
<text
x="46.606346"
x="26.606346"
y="93.957718"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#808080;fill-opacity:1;stroke:none;font-family:Sans"><tspan
x="46.606346"
x="26.606346"
y="93.957718"
style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">${x1}</tspan></text>
<text
x="56.4799"
x="36.4799"
y="59.880642"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#808080;fill-opacity:1;stroke:none;font-family:Sans"><tspan
x="56.4799"
x="36.4799"
y="59.880642"
style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;text-anchor:end;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">${x3}</tspan></text>
<text
x="60.868507"
x="40.868507"
y="87.16584"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#808080;fill-opacity:1;stroke:none;font-family:Sans"><tspan
x="60.868507"
x="40.868507"
y="87.16584"
style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">${x6}</tspan></text>
<text
x="80.285904"
x="60.285904"
y="104.04529"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#808080;fill-opacity:1;stroke:none;font-family:Sans"><tspan
x="80.285904"
x="60.285904"
y="104.04529"
style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">${x7}</tspan></text>
<text
x="53.390858"
x="33.390858"
y="110.72576"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#808080;fill-opacity:1;stroke:none;font-family:Sans"><tspan
x="53.390858"
x="33.390858"
y="110.72576"
style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">${x5}</tspan></text>
<text
x="41.175716"
x="21.175716"
y="140.00911"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#808080;fill-opacity:1;stroke:none;font-family:Sans"><tspan
x="41.175716"
x="21.175716"
y="140.00911"
style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">${x4}</tspan></text>
<text
x="73.59874"
x="53.59874"
y="61.912037"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#808080;fill-opacity:1;stroke:none;font-family:Sans"><tspan
x="73.59874"
x="53.59874"
y="61.912037"
style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">${x2}</tspan></text>
<text
x="74.532158"
x="54.532158"
y="139.71278"
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#808080;fill-opacity:1;stroke:none;font-family:Sans"><tspan
x="74.532158"
x="54.532158"
y="139.71278"
style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Ubuntu;-inkscape-font-specification:Ubuntu">${x8}</tspan></text>
<circle
r="2.2"
transform="translate(40.923481,129.55195)"
transform="translate(20.923481,129.55195)"
id="circle4" />
<circle
r="2.2"
transform="translate(60.861691,56.351773)"
transform="translate(40.861691,56.351773)"
id="circle4-6" />
<circle
r="2.2"
transform="translate(52.540236,100.51006)"
transform="translate(32.540236,100.51006)"
id="circle4-5" />
<circle
r="2.2"
transform="translate(74.433397,129.29941)"
transform="translate(54.433397,129.29941)"
id="circle4-9" />
<circle
r="2.2"
transform="translate(49.099514,90.933613)"
transform="translate(29.099514,90.933613)"
id="circle4-3" />
<circle
r="2.2"
transform="translate(65.637986,90.933613)"
transform="translate(45.637986,90.933613)"
id="circle4-91" />
<circle
r="2.2"
transform="translate(69.953063,59.165573)"
transform="translate(49.953063,59.165573)"
id="circle4-6-0" />
<circle
r="2.2"
transform="translate(76.771595,100.54595)"
transform="translate(56.771595,100.54595)"
id="circle4-6-7" />
</g>
+1 -1
View File
@@ -76,7 +76,7 @@ z;z
Z;Z
plus;+
scharfs;ß
slash;
slash;/
space;
minus;-
komma;,
1 Kennummer Name
76 Z Z
77 plus +
78 scharfs ß
79 slash /
80 space
81 minus -
82 komma ,
+5 -8
View File
@@ -1,9 +1,6 @@
Kennummer;Name
a-z;mnopqrstuvwxyzabcdefghijkl
A-Z;ABCDEFGHIJKLMNOPQRSTUVWXYZ
ü;:.:.:.:...---++!!&&
001;Michael
yxelbüxel;Eva
063453;Nicola Jane
333;&
12;ä Ä é è ëïóöÖß/-,:!'a&b+úüÜ
001;Au
002;Rau
003;Lux
004;May
005;Johnson-Kronh-Wattenberg
1 Kennummer Name
2 a-z 001 mnopqrstuvwxyzabcdefghijkl Au
3 A-Z 002 ABCDEFGHIJKLMNOPQRSTUVWXYZ Rau
4 ü 003 :.:.:.:...---++!!&& Lux
5 001 004 Michael May
6 yxelbüxel 005 Eva Johnson-Kronh-Wattenberg
063453 Nicola Jane
333 &
12 ä Ä é è ëïóöÖß/-,:!'a&b+úüÜ
+118 -29
View File
@@ -21,19 +21,34 @@ def create_picture_frame( config ):
params = dict()
params['width'] = config.get('globals', 'width')
params['height'] = config.get('globals', 'height')
params['background'] = config.get('globals', 'background')
#echo '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">'
begintpl = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="${width}"
height="${height}"
>
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="${width}"
height="${height}"
>
'''
imagetpl = ''' <image width="${width}" height="${height}"
xlink:href="file://${background}">
</image>
'''
svgbegin = Template( begintpl ).substitute(params)
# falls ein Hintergrundbild verwendet werden soll, dann das genauso gross
# machen...
try:
background = config.get('globals', 'background')
font_path = os.path.expandvars(os.path.join('$PICCREATE_BACKGROUNDS', background ))
params['background'] = os.path.normpath(font_path)
svgbegin = svgbegin + Template( imagetpl ).substitute(params)
except ConfigParser.NoOptionError:
# dann eben kein Hintergrundbild
pass
svgend = '</svg>'
return svgbegin, svgend
@@ -41,13 +56,76 @@ def write_font_line( content, font, params ):
''' erzeugt den SVG Teil des Bildes aus Einzelkomponenten
'''
w = Word(content, font, params)
return w.GetSVG()
wordsvg = w.GetSVG()
# falls das Wort nun skaliert werden soll
if params.has_key('scale'):
params['xscale'] = params['scale']
params['yscale'] = params['scale']
if not params.has_key('xscale'):
params['xscale'] = 1.0
if not params.has_key('yscale'):
params['yscale'] = 1.0
pic_width = float(params['width'])
pic_height = float(params['height'])
if params.has_key('autoscale'):
wordlength = w.calc_length()
wordheight = w.calc_height()
#print wordlength, wordheight
#print pic_width, pic_height
fw = pic_width / wordlength
fh = pic_height / wordheight
#print fw, fh
if fw < fh: scale_faktor = fw
else: scale_faktor = fh
params['xscale'] = scale_faktor
params['yscale'] = scale_faktor
else:
scale_faktor = 1.0
# berechne immer den richtigen Startpunkt, je nach Bündigkeit
if params.has_key('align'):
xstart = float(params['x'])
if params['align'] == 'left':
x = xstart
elif params['align'] == 'center':
word_length = w.calc_length()
x = xstart * scale_faktor + (pic_width - word_length * scale_faktor)/2.0
else:
word_length = w.calc_length()
x = xstart * scale_faktor + pic_width - word_length * scale_faktor
params['xstart'] = x
else:
params['xstart'] = params['x']
if params.has_key('yalign'):
ystart = float(params['y'])
if params['yalign'] == 'top':
y = 0.0
elif params['yalign'] == 'center':
word_height = w.calc_height()
y = ystart * scale_faktor + (pic_height - word_height * scale_faktor)/2.0
elif params['yalign'] == 'bottom':
y = ystart * scale_faktor + pic_height - word_height * scale_faktor
else:
y = ystart
params['ystart'] = y
else:
params['ystart'] = params['y']
scalebegin = '''<g transform="translate($xstart,$ystart) scale(${xscale},${yscale})">
'''
scaleend = ''' </g>'''
svg = Template( scalebegin ).substitute(params) + wordsvg + scaleend
return svg
def write_random_font_line( config, fontinfos, data ):
''' erzeugt den SVG Teil des Bildes aus einem Hintergrundbild und
mehreren in Einzelbereichen zufällig platzierten Einzelbildern '''
# TODO Bild aus Zufallspositionen von Einzelkomponenten
pass
return
class Word:
"""Berechnet die x/y Daten jedes Buchstabn zu einem Wort bzw. mehreren
@@ -59,22 +137,23 @@ class Word:
def __repr__(self):
return self.line
def calc_length(self):
deltax= 0.0
glyph_space = float(self.params['glyph_space'])
deltax = 0.0
for c in self.line:
g = self.font.GlyphGet(c)
deltax = g.GetLength() + deltax
deltax = g.GetLength() + deltax + glyph_space
return deltax
def calc_height(self):
max_y = 0.0
for c in self.line:
g = self.font.GlyphGet(c)
new_y = g.GetHeight()
if new_y > max_y:
max_y = new_y
return max_y
def GetSVG(self):
params = self.params
# berechne immer den richtigen Startpunkt, je nach Bündigkeit
if params['align'] == 'left':
x = float(params['x'])
elif params['align'] == 'center':
word_length = self.calc_length()
x = float(params['x'] + (params['length'] - word_length)/2.0)
else:
word_length = self.calc_length()
x = float(params['x'] + word_length - params['length'])
x = float(params['x'])
y = params['y']
glyph_space = float(params['glyph_space'])
@@ -91,7 +170,7 @@ class Word:
# diese durch den aktuellen Zählerstand ersetzen
if params['counter_replace']:
xn = g.GetAttribute('npattern')
for i in range(1,int(xn)+1):
for i in range(1, int(xn)+1):
counter = counter + 1
content['x'+str(i)] = counter
svgstr = svgstr + g.GetSVG(content)
@@ -110,7 +189,7 @@ class Glyph:
def GetLength(self):
return float(self.GetAttribute('xstep'))
def GetHeight(self):
return float(self.GetAttribute('ystep'))
return float(self.GetAttribute('ymax'))
def GetSVG(self, content):
t = Template(self.template)
svg = t.substitute(content)
@@ -177,8 +256,8 @@ def create_picture(config, fontinfos, data, pic_path):
svgstr = ''
begin, end = create_picture_frame( config )
svgstr = svgstr + begin
picbegin, picend = create_picture_frame( config )
svgstr = svgstr + picbegin
# gehe alle Zeilen die im Bild enthalten sein müssen durch
lines = config.get('globals', 'lines').split(',')
@@ -201,16 +280,26 @@ def create_picture(config, fontinfos, data, pic_path):
font = fontinfos[fontname]
# hol dir die Eckdaten für die Zeile
# x, y, align, length
params = dict(config.items(linename))
# x, y, align, width, height
lineparams = dict(config.items(linename))
picstr = write_font_line( content, font, params )
# falls nix angegeben, dann aus hol defaults aus globalen daten
if not lineparams.has_key('width'):
lineparams['width'] = config.get('globals', 'width')
if not lineparams.has_key('height'):
lineparams['height'] = config.get('globals', 'height')
if not lineparams.has_key('x'):
lineparams['x'] = 0.0
if not lineparams.has_key('y'):
lineparams['y'] = 0.0
picstr = write_font_line( content, font, lineparams )
if picstr: svgstr = svgstr + picstr
randstr = write_random_font_line( content, font, params)
randstr = write_random_font_line( content, font, lineparams)
if randstr: svgstr = svgstr + randstr
svgstr = svgstr + end
svgstr = svgstr + picend
if options.dry:
print svgstr