diff --git a/bin/extract-font.sh b/bin/extract-font.sh index 8db65b3..88502ec 100755 --- a/bin/extract-font.sh +++ b/bin/extract-font.sh @@ -22,6 +22,5 @@ do $PICCREATE_BIN/extract-glyph.sh -i $i -e done -set -xv CONFIG=`basename $SOURCE` ( cd $TARGET; cat *.cfg >> $CONFIG.cfg_ ; rm *.cfg; mv $CONFIG.cfg_ $CONFIG.cfg) diff --git a/bin/extract-glyph.sh b/bin/extract-glyph.sh index d8abc07..df9756e 100755 --- a/bin/extract-glyph.sh +++ b/bin/extract-glyph.sh @@ -78,7 +78,8 @@ then echo '' >> $GLYPH else # schreib nur das extract zur Verwertung als Font in die Ausgabe - echo '' >> $GLYPH + #echo '' >> $GLYPH + echo '' >> $GLYPH cat text-$BASE.svg >> $GLYPH cat circles-$BASE.svg >> $GLYPH cat line-$BASE.svg >> $GLYPH @@ -89,13 +90,12 @@ rm circles-$BASE.svg rm text-$BASE.svg ## alle Zusatzinfos zum Buchstaben rausholen - XCOORDS=./xcoords # hole das Minium und Maxium der X-Koordinaten um die Schrittweite des Buchstabens zu bestimmen # zuerst aus den Texten -cat $GLYPH | grep x= | sed "s/^\s\+//g;s/x=//g;s/\"//g" > $XCOORDS +cat $GLYPH | egrep "\=" | sed "s/^\s\+//g;s/x=//g;s/\"//g" > $XCOORDS # dann aus Kreisen -cat $GLYPH | egrep "transform=" | sed 's/^\s\+//g;s/translate//g;s/transform=//g;s/["|(|)]//g;s/,.*//g' >> $XCOORDS +cat $GLYPH | egrep -v '> $XCOORDS # dann aus den Linien cat $GLYPH | grep x1= | sed "s/^\s\+//g;s/x1=//g;s/\"//g" >> $XCOORDS cat $GLYPH | grep x2= | sed "s/^\s\+//g;s/x2=//g;s/\"//g" >> $XCOORDS @@ -111,7 +111,7 @@ YCOORDS=./ycoords # zuerst aus den Texten cat $GLYPH | grep y= | sed "s/^\s\+//g;s/y=//g;s/\"//g" > $YCOORDS # dann aus Kreisen -cat $GLYPH | egrep "transform=" | sed 's/^\s\+//g;s/translate//g;s/transform=//g;s/["|(|)]//g;s/.*,//g' >> $YCOORDS +cat $GLYPH | egrep -v '> $YCOORDS # dann aus den Linien cat $GLYPH | grep y1= | sed "s/^\s\+//g;s/y1=//g;s/\"//g" >> $YCOORDS cat $GLYPH | grep y2= | sed "s/^\s\+//g;s/y2=//g;s/\"//g" >> $YCOORDS @@ -130,7 +130,7 @@ NPATTERN=`cat $GLYPH | egrep ">x[0-9]+<" | sed "s/.*\(x[0-9]\+\).*/\1/g" | wc - ## und in die Buchstabenconfig schreiben rm -f $CONFIG -echo [$BASE.svg] >> $CONFIG +echo [$BASE] >> $CONFIG echo "XSTEP=$XSTEP" >> $CONFIG echo "XMIN=$XMIN" >> $CONFIG echo "XMAX=$XMAX" >> $CONFIG @@ -138,6 +138,7 @@ echo "YSTEP=$YSTEP" >> $CONFIG echo "YMIN=$YMIN" >> $CONFIG echo "YMAX=$YMAX" >> $CONFIG echo "NPATTERN=$NPATTERN" >> $CONFIG +echo "FILENAME=$BASE.svg" >> $CONFIG echo "#" >> $CONFIG diff --git a/bin/piccreate b/bin/piccreate index 995744d..b496816 100755 --- a/bin/piccreate +++ b/bin/piccreate @@ -2,4 +2,4 @@ . setenv.sh # Startet das Programm -python $MAPSGEN_LIBS/routesgen.py "$@" +python $PICCREATE_LIBS/piccreate.py "$@" diff --git a/cfg/punkteraetsel.cfg b/cfg/punkteraetsel.cfg index 82664ae..2aec3c8 100644 --- a/cfg/punkteraetsel.cfg +++ b/cfg/punkteraetsel.cfg @@ -1,18 +1,26 @@ # wie gross soll das Bild werden [globals] +# angabe als default in punkt. Ansonsten mm hinten dran. width=1200 height=1200 -content=PunkteName +# was soll wohin geschrieben werden (,..,..) +lines=PunkteName - -# Die Eingabedatei sieht so aus +# Die Überschriften der csv-Eingabedatei werden so nach intern übersetzt: [translation] customerid=Kennummer name = Name -# das ist der erste und einzige Inhalt +# das ist die TextZeile die auf das Bild kommt [PunkteName] +# hier der Inhalt aus der Eingabedatei, der geschrieben werden soll content=${name} +# Ab dem Punkt wird zu schreiben begonnen x=10 y=20 -font=ausgangsschrift +length=200 +# Fontname und Fonttyp +fontname=ausgangsschrift +fonttype=replace_strings +#align=center,left,right +align=left diff --git a/fonts/ausgangsschrift/A.svg b/fonts/ausgangsschrift/A.svg index 6d82cf0..97c833f 100644 --- a/fonts/ausgangsschrift/A.svg +++ b/fonts/ausgangsschrift/A.svg @@ -1,4 +1,4 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ' + begintpl = ''' + +''' + svgbegin = Template( begintpl ).substitute(params) + svgend = '' + return svgbegin, svgend + +def write_font_line( content, font, params ): + ''' erzeugt den SVG Teil des Bildes aus Einzelkomponenten + ''' + w = Word(content, font, params) + return w.GetSVG() + +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 + +class Word: + """Berechnet die x/y Daten jedes Buchstabn zu einem Wort bzw. mehreren + Wörtern einer Zeile nach den Vorgaben """ + def __init__(self, line, font, params ): + self.line = line + self.font = font + self.params = params + def __repr__(self): + return self.line + def calc_length(self): + deltax= 0.0 + for c in self.line: + g = self.font.GlyphGet(c) + deltax = g.GetLength() + deltax + return deltax + def GetSVG(self): + params = self.params + content = dict() + content['posy'] = params['y'] + # 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']) + svgstr = '' + for c in self.line: + g = self.font.GlyphGet(c) + x = g.GetLength() + x + content['posx'] = str(x) + svgstr = svgstr + g.GetSVG(content) + return svgstr + +class Glyph: + """enthaelt alle Daten zu einem Buchstaben """ + def __init__(self, glyphname, attributes, template): + self.glyphname = glyphname + self.attributes = attributes + self.template = template + def __repr__(self): + return self.glyphname + def GetAttribute(self, att): + return self.attributes[att] + def GetLength(self): + return float(self.GetAttribute('xstep')) + def GetHeight(self): + return float(self.GetAttribute('ystep')) + def GetSVG(self, content): + t = Template(self.template) + return t.substitute(content) + +class Font: + """enthaelt alle Daten zu einem Font """ + def __init__(self, fontname, font_path ): + self.name = fontname + self.path = font_path + self.glyphs = dict() + + fontconfig = ConfigParser.RawConfigParser() + config_path = os.path.join(font_path, fontname+'.cfg') + fontconfig.read(config_path) + + # lies alle Zeichen des Fonts ein + for letter in fontconfig.sections(): + # hol die Fontattribute wie Ausdehnung usw. + content = dict(fontconfig.items(letter)) + # lade das svg template dazu ein + glyph_path = os.path.join( font_path, letter+'.svg') + f = open(glyph_path, 'r') + svgstr = f.read() + f.close() + # und bau das Zeichen auf + g = Glyph(letter, content, svgstr) + self.glyphs[letter] = g + def __repr__(self): + return repr(self.glyphs) + def GlyphGet(self, glyphname): + return self.glyphs[glyphname] + +def init_fonts( config ): + ''' lädt alle benötigten Fonts für den Auftrag in den Speicher + ''' + fontinfos = dict() + + #[globals] + ## was soll wohin geschrieben werden: + #lines=MeineZeile, bla + + ## das ist die TextZeile die auf das Bild kommt + #[MeineZeile] + #..inhalte und wohin es kommt + ## Fontname und Fonttyp + #font=ausgangsschrift + #fonttype=replace_strings + # + #[bla] + # ... + lines = config.get('globals', 'lines').split(',') + for linename in lines: + fontname = config.get(linename, 'fontname') + font_path = os.path.expandvars(os.path.join('$PICCREATE_FONTS', fontname )) + f = Font(fontname, font_path) + fontinfos[fontname] = f + return fontinfos + + +def create_picture(config, fontinfos, data, pic_path): + ''' schreibt den svg String des Bildes + ''' + + svgstr = '' + + begin, end = create_picture_frame( config ) + svgstr = svgstr + begin + + # gehe alle Zeilen die im Bild enthalten sein müssen durch + lines = config.get('globals', 'lines').split(',') + for linename in lines: + + #[ZeilenBezeichner] + #content=${name} + ## Ab dem Punkt wird zu schreiben begonnen + #x=10 + #y=20 + #lenght=2000 + + # hol den Inhalt der Zeile die ausgeben werden muss + content_template = config.get(linename, 'content') + t = Template( content_template ) + content = t.substitute(data) + + # hol dir dazu den Passenden Font für diese Zeile + fontname = config.get(linename, 'fontname') + font = fontinfos[fontname] + + # hol dir die Eckdaten für die Zeile + params = dict() + params['x'] = config.get(linename, 'x') + params['y'] = config.get(linename, 'y') + params['length']= config.get(linename, 'length') + params['align']= config.get(linename, 'align') + + picstr = write_font_line( content, font, params ) + if picstr: svgstr = svgstr + picstr + + randstr = write_random_font_line( content, font, params) + if randstr: svgstr = svgstr + randstr + + svgstr = svgstr + end + + if options.dry: + print svgstr + else: + f = open(pic_path, 'w') + f.write( svgstr ) + f.close() def main( config ): @@ -39,14 +234,20 @@ def main( config ): config = ConfigParser.RawConfigParser() config.read(config_path) - targets = config.get('globals', 'targets') Trans = get_translation(config_path, 'translation') Rows = CSVImport(in_path, translate=Trans) - for data in Rows: - filename = data.customerid - pic_path = os.path.join(out_path, filename )) - create_picture(data, ) + + fontinfos = init_fonts( config ) + for row in Rows: + filename = row.customerid + print filename + content = row.__dict__ + del content['firstrow'] + del content['row'] + pic_path = os.path.join(out_path, filename+'.svg') + + create_picture(config, fontinfos, content, pic_path) if __name__ == '__main__': @@ -84,4 +285,4 @@ Read Confg, create wakeup and scale this kind of jiffy box else: pass -# vim: set tw=75 ft=python ts=4 sw=4: +# vim: set tw=75 ft=python ts=4 sw=4 tw=80: