#!/usr/bin/env python # easyFig.py Written by: Mitchell Sullivan mjsull@gmail.com # Supervisor: Dr. Scott Beatson and Dr. Nico Petty University of Queensland # Version 3.0.0 08.11.2016 # License: GPLv3 import os import subprocess from math import ceil, hypot import threading import time import struct import base64 import string from ftplib import FTP import tarfile import platform import shutil import webbrowser import operator import sys def colorstr(rgb): return "#%02x%02x%02x" % (rgb[0],rgb[1],rgb[2]) def binar(s): transdict = {'0':'0000', '1':'0001', '2':'0010', '3':'0011', '4':'0100', '5':'0101', '6':'0110', '7':'0111', '8':'1000', '9':'1001', 'a':'1010', 'b':'1011', 'c':'1100', 'd':'1101', 'e':'1110', 'f':'1111' } outstring = '' for i in s: outstring += transdict[i] return outstring class scalableVectorGraphics: def __init__(self, height, width): self.height = height self.width = width self.out = ''' image/svg+xml Easyfig Easyfig ''' % (self.height, self.width) def drawLine(self, x1, y1, x2, y2, th=1, cl=(0, 0, 0)): self.out += ' \n' % (x1, y1, x2, y2, th, colorstr(cl)) def writesvg(self, filename): outfile = open(filename, 'w') outfile.write(self.out + ' \n') outfile.close() def drawRightArrow(self, x, y, wid, ht, fc, oc=(0,0,0), lt=1): if lt > ht /2: lt = ht/2 x1 = x + wid y1 = y + ht/2 x2 = x + wid - ht / 2 ht -= 1 if wid > ht/2: self.out += ' ht /2: lt = ht/2 x1 = x + wid y1 = y + ht/2 x2 = x + ht / 2 ht -= 1 if wid > ht/2: self.out += ' ht /2: lt = ht //2 if frame == 1: y1 = y + ht/2 y2 = y + ht * 3/8 y3 = y + ht * 1/4 elif frame == 2: y1 = y + ht * 3/8 y2 = y + ht * 1/4 y3 = y + ht * 1/8 elif frame == 0: y1 = y + ht * 1/4 y2 = y + ht * 1/8 y3 = y + 1 x1 = x x2 = x + wid - ht/8 x3 = x + wid if wid > ht/8: self.out += ' ht /2: lt = ht //2 if frame == 1: y1 = y + ht / 4 elif frame == 2: y1 = y + ht /8 elif frame == 0: y1 = y + 1 hei = ht /4 x1 = x self.out += ' ht /2: lt = ht //2 if frame == 1: y1 = y + ht y2 = y + ht * 7/8 y3 = y + ht * 3/4 elif frame == 2: y1 = y + ht * 7/8 y2 = y + ht * 3/4 y3 = y + ht * 5/8 elif frame == 0: y1 = y + ht * 3/4 y2 = y + ht * 5/8 y3 = y + ht / 2 x1 = x + wid x2 = x + ht/8 x3 = x if wid > ht/8: self.out += ' ht /2: lt = ht //2 if frame == 1: y1 = y + ht * 3/4 elif frame == 2: y1 = y + ht * 5/8 elif frame == 0: y1 = y + ht / 2 hei = ht /4 x1 = x self.out += ' \n' # class of blast hit data class BlastHit: def __init__(self, query, ref, ident, length, mismatch, gaps, qStart, qEnd, rStart, rEnd, eValue, bitscore): self.query = query self.ref = ref self.ident = float(ident) self.length = int(length) self.mismatch = int(mismatch) self.gaps = int(gaps) self.qStart = int(qStart) self.qEnd = int(qEnd) self.rStart = int(rStart) self.rEnd = int(rEnd) self.eValue = float(eValue) self.bitscore = float(bitscore) # class for feature data class feature: def __init__(self, start, stop, type, strand, colour, name): self.start = start self.stop = stop self.type = type self.strand = strand self.colour = colour self.name = name def length(self): if type(self.start) == int: return self.stop - self.start else: return self.stop[-1] - self.start[0] # method for converting base pair position into pixel position def convertPos(length, maxlength, width, pos, aln): if aln == 'centre': return int(((((maxlength - length) * 1.0 /2) + pos) * 1.0 /maxlength) * width) elif aln == 'left': return int(((pos * 1.0 /maxlength) * width)) elif aln == 'right': return int(((((maxlength - length) * 1.0) + pos) * 1.0 /maxlength) * width) elif aln == 'best blast': return int((((pos + shifter) * 1.0 /maxlength) * width)) # method for converting base pair position into pixel position if the genome has been reversed def convertPosR(length, maxlength, width, pos, aln): if aln == 'centre': return int(width - (((((maxlength - length) * 1.0 /2) + pos) * 1.0 /maxlength) * width)) elif aln == 'left': return int(width - (((((maxlength - length) * 1.0) + pos) * 1.0 /maxlength) * width)) elif aln == 'right': return int(width - ((pos * 1.0 /maxlength) * width)) elif aln == 'best blast': return int(width - (((((maxlength - length) * 1.0) + pos - shifter) * 1.0 /maxlength) * width)) ''' Functions and classes for the bmp module. This section of the code uses a modified version of Paul McGuire's (http://www.geocities.com/ptmcg/) (RIP geocities/under constuction gifs) bmp.py - module for constructing simple BMP graphics files It is freely avaiable under the following license license for all code contained: 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. ''' def shortToString(i): hi = (i & 0xff00) >> 8 lo = i & 0x00ff return chr(lo) + chr(hi) def longToString(i): hi = (i & 0x7fff0000) >> 16 lo = i & 0x0000ffff return shortToString(lo) + shortToString(hi) # class class Color(object): """class for specifying s while drawing BitMap elements""" __slots__ = [ 'red', 'grn', 'blu' ] __shade = 32 def __init__( self, r=0, g=0, b=0 ): self.red = r self.grn = g self.blu = b def __setattr__(self, name, value): if hasattr(self, name): raise AttributeError else: object.__setattr__(self, name, value) def __str__( self ): return "R:%d G:%d B:%d" % (self.red, self.grn, self.blu ) def __hash__( self ): return ( ( self.blu ) + ( self.grn << 8 ) + ( self.red << 16 ) ) def lighten( self ): return Color( min( self.red + Color.__shade, 255), min( self.grn + Color.__shade, 255), min( self.blu + Color.__shade, 255) ) def darken( self ): return Color( max( self.red - Color.__shade, 0), max( self.grn - Color.__shade, 0), max( self.blu - Color.__shade, 0) ) def toLong( self ): return self.__hash__() def fromLong( l ): b = l & 0xff l = l >> 8 g = l & 0xff l = l >> 8 r = l & 0xff return Color( r, g, b ) fromLong = staticmethod(fromLong) # define class constants for common s Color.BLACK = Color( 0, 0, 0 ) Color.RED = Color( 255, 0, 0 ) Color.GREEN = Color( 0, 255, 0 ) Color.BLUE = Color( 0, 0, 255 ) Color.CYAN = Color( 0, 255, 255 ) Color.MAGENTA = Color( 255, 0, 255 ) Color.YELLOW = Color( 255, 255, 0 ) Color.WHITE = Color( 255, 255, 255 ) Color.DKRED = Color( 128, 0, 0 ) Color.DKGREEN = Color( 0, 128, 0 ) Color.DKBLUE = Color( 0, 0, 128 ) Color.TEAL = Color( 0, 128, 128 ) Color.PURPLE = Color( 128, 0, 128 ) Color.BROWN = Color( 128, 128, 0 ) Color.GRAY = Color( 128, 128, 128 ) class BitMap(object): """class for drawing and saving simple Windows bitmap files""" LINE_SOLID = 0 LINE_DASHED = 1 LINE_DOTTED = 2 LINE_DOT_DASH=3 _DASH_LEN = 12.0 _DOT_LEN = 6.0 _DOT_DASH_LEN = _DOT_LEN + _DASH_LEN def __init__( self, width, height, bkgd = Color.WHITE, frgd = Color.BLACK ): self.wd = int( ceil(width) ) self.ht = int( ceil(height) ) self.bg = 0 self.fg = 1 self.palette = [] self.palette.append( bkgd.toLong() ) self.palette.append( frgd.toLong() ) self.setDefaultPenColor() tmparray = [ self.bg ] * self.wd self.bitarray = [ tmparray[:] for i in range( self.ht ) ] self.currentPen = 1 self.fontName = "%s-%d-%s" % ( "none", 0, "none" ) self.defsize = 64 self.amatrixwid = 41 self.amatrixhei = 48 self.amatrixori = 16 self.amatrix = '3ff8000001ffffc00003fffff80003fffffe0003ffffff8003ffffffe003\ fffffff801ff801ffc01ff0001fe00ff00007f80ff00003fc07f80000fe0\ 3fc00007f01fc00003f80fe00001fc00000000fe000000007f000000007f\ 800000003fc0000000ffe000000ffff00003fffff8001ffffffc003fffff\ fe007fffff7f00fffff83f807fff001fc07ff8000fe07fe00007f03fc000\ 03f81fe00001fc1fe00000fe0fe000007f07f000003f83f800001fc1fc00\ 001fe0fe00000ff07f00000ff83fc0000ffc0ff0001ffe07fc001fff01ff\ 807fffc0ffffffcffe3fffffc7ff0fffffc3ff83ffff80ffc07fff007fe0\ 07f8000fe' self.bmatrixwid = 40 self.bmatrixhei = 64 self.bmatrixori = 0 self.bmatrix = '7f000000007f000000007f000000007f000000007f000000007f00000000\ 7f000000007f000000007f000000007f000000007f000000007f00000000\ 7f000000007f000000007f000000007f000000007f007fc0007f03fff800\ 7f07fffe007f1fffff007f3fffff807f7fffffc07f7fffffe07fff00fff0\ 7ffc003ff07ff8000ff87ff00007f87fe00003fc7fe00003fc7fc00001fe\ 7fc00001fe7f800000fe7f800000fe7f800000fe7f000000ff7f0000007f\ 7f0000007f7f0000007fff0000007fff0000007fff0000007fff0000007f\ ff0000007fff0000007fff0000007fff800000feff800000feff800000fe\ ff800000feffc00001feffc00001fcffe00003fcffe00007f8fff00007f8\ fff8000ff8fffe003ff0ffff80ffe0feffffffe0fe7fffffc0fe3fffff80\ fe1ffffe00fe0ffffc000003fff00000003f0000' self.cmatrixwid = 37 self.cmatrixhei = 48 self.cmatrixori = 16 self.cmatrix = '1ff0000007fff00000ffffe0001fffff8001ffffff001ffffff801ffffff\ e00ffc01ff80ff8007fc0ff8001ff07f80007f87f80001fe3fc0000ff1fc\ 00003f9fe00001fcfe00000fe7f00000003f80000001f80000001fc00000\ 00fe00000007f00000003f80000001fc0000000fe00000007f00000003f8\ 0000001fc0000000fe00000007f00000001fc0000000fe000007f7f00000\ 3fbfc00003f8fe00001fc7f80000fe3fc0000ff0ff0000ff07fc000ff81f\ f000ff807fe01ffc03ffffffc00ffffffc003fffffc000fffffc0001ffff\ c00003fff8000001fc000' self.dmatrixwid = 40 self.dmatrixhei = 64 self.dmatrixori = 0 self.dmatrix = '7f000000007f000000007f000000007f000000007f000000007f00000000\ 7f000000007f000000007f000000007f000000007f000000007f00000000\ 7f000000007f000000007f000000007f0003ff007f001fffc07f003ffff0\ 7f00fffffc7f01fffffe7f03ffffff7f07ffffffff0fff00ffff0ffc003f\ ff1ff0000fff1fe00007ff3fe00003ff3fc00003ff7f800001ff7f800001\ ff7f000000ff7f000000ff7f000000ffff000000fffe0000007ffe000000\ 7ffe0000007ffe0000007ffe0000007ffe0000007ffe0000007ffe000000\ 7ffe0000007ffe0000007f7f000000ff7f000000ff7f000000ff7f000000\ ff7f800001ff3f800001ff3fc00003ff3fe00003ff1ff00007ff1ff8000f\ ff0ffc003fff07ff00ffff07ffffff7f03fffffe7f01fffffc7f00fffff8\ 7f003ffff07f000fffc0000000fc0000' self.ematrixwid = 39 self.ematrixhei = 48 self.ematrixori = 16 self.ematrix = '1ff0000001fffe00000fffff00003fffff0001ffffff0007ffffff001fff\ ffff003ff007ff00ff8003ff03fe0003fe07f80001fe0fe00003fc3f8000\ 03fc7f000003f9fc000007f3f800000fe7f000000fcfc000001fff800000\ 3fff0000007fffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffffffff800000007f00000000fe00000001fc00000001f800000003\ f800000007f000001fcfe000003f8fe00000ff1fc00001fc3fc00007f83f\ c0001fe07fc0003fc07fe001ff007ff00ffe00fffffff800ffffffe000ff\ ffff80007ffffe00007ffff000003fff80000007f8000' self.fmatrixwid = 20 self.fmatrixhei = 62 self.fmatrixori = 0 self.fmatrix = '7f003ff007ff00fff01fff01fff01fe003fc003f8003f8003f8003f8003f\ 8003f8003f8003f8003f80ffffffffffffffffffffffffffffff03f8003f\ 8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f\ 8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f\ 8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f\ 8003f80' self.gmatrixwid = 39 self.gmatrixhei = 65 self.gmatrixori = 16 self.gmatrix = '1ff0000000fff80fe007fffc1fc03ffffc3f80fffffc7f03fffffcfe0fff\ fffdfc1ff807fff87fc003fff1ff0003ffe3fc0003ffcff00003ff9fe000\ 03ff3f800007feff000007fdfc00000ffbf800001ff7f000003fefc00000\ 3fff8000007fff000000fffe000001fffc000003fff8000007fff000000f\ ffe000001fffc000003fff8000007fff000000fffe000001fefe000007fd\ fc00000ffbf800001ff7f800007fe7f00000ffcff00001ff9fe00007ff1f\ e0001ffe3fe0007ffc3fe001fff83ff00feff07fffffdfe07fffff3fc07f\ fffc7f807ffff0ff003fff81fe001ffe03f80007c007f00000000fe00000\ 003fc00000007f9fc00000ff3f800001fc7f800007f87f00000ff0ff0000\ 3fc1ff0000ff81ff0007fe01ff803ff803fffffff003ffffffc003fffffe\ 0001fffff80000ffff8000001ff8000' self.hmatrixwid = 35 self.hmatrixhei = 62 self.hmatrixori = 0 self.hmatrix = '3f80000007f0000000fe0000001fc0000003f80000007f0000000fe00000\ 01fc0000003f80000007f0000000fe0000001fc0000003f80000007f0000\ 000fe0000001fc0000003f803fe007f03fffc0fe0ffffc1fc7ffffe3f9ff\ fffe7f7fffffcfffe01ffdfff000ffbffc000ff7ff0000ffffc0001ffff0\ 0001fffe00003fff800007fff00000fffe00001fff800003fff000007ffe\ 00000fffc00001fff800003fff000007ffe00000fffc00001fff800003ff\ f000007ffe00000fffc00001fff800003fff000007ffe00000fffc00001f\ ff800003fff000007ffe00000fffc00001fff800003fff000007ffe00000\ fffc00001fff800003fff000007ffe00000fffc00001fff800003fff0000\ 07f' self.imatrixwid = 7 self.imatrixhei = 63 self.imatrixori = 0 self.imatrix = '1fffffffffffffffc0000000000000007fffffffffffffffffffffffffff\ fffffffffffffffffffffffffffffffffffffffffffffffffff' self.jmatrixwid = 14 self.jmatrixhei = 80 self.jmatrixori = 0 self.jmatrix = '1fc07f01fc07f01fc07f01fc07f01fc00000000000000000000000000000\ 7f01fc07f01fc07f01fc07f01fc07f01fc07f01fc07f01fc07f01fc07f01\ fc07f01fc07f01fc07f01fc07f01fc07f01fc07f01fc07f01fc07f01fc07\ f01fc07f01fc07f01fc07f01fc07f01fc07f01fc07f01fc07f01fc07f01f\ c07f01fc0ff03fc1fffffbffefff3ff8ffc3f00' self.kmatrixwid = 38 self.kmatrixhei = 62 self.kmatrixori = 0 self.kmatrix = 'fe00000003f80000000fe00000003f80000000fe00000003f80000000fe0\ 0000003f80000000fe00000003f80000000fe00000003f80000000fe0000\ 0003f80000000fe00000003f80000000fe00000003f80001ff8fe0000ff8\ 3f80007fc0fe0003fe03f8001ff00fe000ff803f8007fc00fe003fe003f8\ 01ff000fe00ff8003f807fc000fe03fe0003f81ff0000fe0ff80003f87fc\ 0000fe3fe00003f9ffc0000fe7ff80003fbffe0000fffffc0003fffff000\ 0fffbfe0003ffc7fc000ffe0ff0003ff03fe000ff807fc003fc01ff000fe\ 003fe003f8007f800fe001ff003f8003fe00fe0007f803f8001ff00fe000\ 3fe03f8000ff80fe0001ff03f80003fc0fe0000ff83f80001ff0fe00003f\ c3f80000ff8fe00001fe3f800007fcfe00000ffbf800001ff' self.lmatrixwid = 7 self.lmatrixhei = 62 self.lmatrixori = 0 self.lmatrix = '3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ fffffffffffffffffffffffffffffffffffffffffffffffff' self.mmatrixwid = 59 self.mmatrixhei = 46 self.mmatrixori = 16 self.mmatrix = '3fe0001ff007f03fff001fffc0fe0ffff807fffe1fc7ffff83ffffe3f9ff\ fff8fffffe7f7fffffbfffffcfffc07ffff01ffdffe003fff800ffbff800\ 3ffe000ffffe0003ff8000ffff80007fe0001ffff00007fc0001fffc0000\ ff00003fff80001fe00007ffe00003f80000fffc00007f00001fff80000f\ e00003fff00001fc00007ffe00003f80000fffc00007f00001fff80000fe\ 00003fff00001fc00007ffe00003f80000fffc00007f00001fff80000fe0\ 0003fff00001fc00007ffe00003f80000fffc00007f00001fff80000fe00\ 003fff00001fc00007ffe00003f80000fffc00007f00001fff80000fe000\ 03fff00001fc00007ffe00003f80000fffc00007f00001fff80000fe0000\ 3fff00001fc00007ffe00003f80000fffc00007f00001fff80000fe00003\ fff00001fc00007ffe00003f80000fffc00007f00001fff80000fe00003f\ ff00001fc00007f' self.nmatrixwid = 35 self.nmatrixhei = 46 self.nmatrixori = 16 self.nmatrix = '1fe007f01fff80fe0ffffc1fc3ffffc3f8fffffc7f3fffffcfefe01ffdff\ f001ffbffc000ff7ff0001ffffc0001ffff00001fffe00003fff800007ff\ f00000fffe00001fff800003fff000007ffe00000fffc00001fff800003f\ ff000007ffe00000fffc00001fff800003fff000007ffe00000fffc00001\ fff800003fff000007ffe00000fffc00001fff800003fff000007ffe0000\ 0fffc00001fff800003fff000007ffe00000fffc00001fff800003fff000\ 007ffe00000fffc00001fff800003fff000007f' self.omatrixwid = 40 self.omatrixhei = 48 self.omatrixori = 16 self.omatrix = '1ff8000000ffff000003ffffc0000ffffff0001ffffff8003ffffffc007f\ fffffe00fff00fff00ffc003ff01ff0000ff81fe00007f83fc00003fc3fc\ 00003fc3f800001fc7f800001fe7f000000fe7f000000fe7f000000fefe0\ 00000fffe0000007ffe0000007ffe0000007ffe0000007ffe0000007ffe0\ 000007ffe0000007ffe0000007ffe0000007ffe0000007fff000000ff7f0\ 00000fe7f000000fe7f000000fe7f800001fe3f800001fc3fc00003fc3fc\ 00003fc1fe00007f81ff0000ff80ffc003ff007ff00ffe007ffffffe003f\ fffffc001ffffff8000fffffe00003ffffc00000ffff0000000ff0000' self.pmatrixwid = 40 self.pmatrixhei = 64 self.pmatrixori = 16 self.pmatrix = '7fc000fe03fff800fe0ffffe00fe1fffff00fe3fffff80fe7fffffc0feff\ ffffe0ffff00fff0fffc003ff0fff8000ff8fff00007f8ffe00003fcffe0\ 0003fcffc00001fcffc00001feff800000feff800000feff800000feff00\ 0000ffff0000007fff0000007fff0000007fff0000007fff0000007fff00\ 00007f7f0000007f7f0000007f7f0000007f7f0000007f7f800000ff7f80\ 0000fe7f800000fe7f800000fe7fc00001fe7fc00001fc7fe00003fc7fe0\ 0007fc7ff0000ff87ff8001ff87ffc003ff07fff80fff07fffffffe07f7f\ ffffc07f3fffff807f1fffff007f07fffc007f01fff0007f003f80007f00\ 0000007f000000007f000000007f000000007f000000007f000000007f00\ 0000007f000000007f000000007f000000007f000000007f000000007f00\ 0000007f000000007f000000007f00000000' self.qmatrixwid = 40 self.qmatrixhei = 64 self.qmatrixori = 16 self.qmatrix = '1fe0000000fffc07f003ffff07f00fffff87f01fffffe7f03ffffff7f07f\ fffff7f07ff007fff0ffc003fff1ff0000fff1fe00007ff3fe00003ff3fc\ 00003ff3f800001ff7f800001ff7f000000ff7f000000ff7f000000ff7f0\ 00000fffe0000007ffe0000007ffe0000007ffe0000007ffe0000007ffe0\ 000007ffe0000007ffe0000007ffe0000007ffe0000007fff000000ff7f0\ 00000ff7f000000ff7f000000ff7f800001ff7f800001ff3fc00003ff3fe\ 00003ff1ff00007ff1ff8000fff0ffc003fff0fff00ffff07ffffff7f03f\ fffff7f01fffffe7f00fffff87f003ffff07f000fffc07f0001fc007f000\ 000007f000000007f000000007f000000007f000000007f000000007f000\ 000007f000000007f000000007f000000007f000000007f000000007f000\ 000007f000000007f000000007f000000007f' self.rmatrixwid = 22 self.rmatrixhei = 46 self.rmatrixori = 16 self.rmatrix = '3bf80fffe07fff87fffe3ffff9ffffe7ffffbfe0fffc03ffc00ffe003ff0\ 00ff8003fe000ff0003fc000ff0003f8000fe0003f8000fe0003f8000fe0\ 003f8000fe0003f8000fe0003f8000fe0003f8000fe0003f8000fe0003f8\ 000fe0003f8000fe0003f8000fe0003f8000fe0003f8000fe0003f8000fe\ 0003f8000' self.smatrixwid = 36 self.smatrixhei = 48 self.smatrixori = 16 self.smatrix = '7fe000003fffc0001fffff0003fffffc007fffffe00fffffff01fffffff0\ 1ff803ff83fe0007f83f80007f87f80003fc7f00001fc7f00001fc7f0000\ 1fc7f00000007f00000007f80000003fc0000003ff8000003fff000001ff\ ff00000fffff00007fffff0001fffffc0007fffff0001fffff80001ffffc\ 00001fffc000001ffe0000003fe0000001ff0000000ff00000007ffe0000\ 07ffe000007fff000007f7f000007f7f80000fe7f80001fe7fe0007fe3ff\ 801ffc3fffffff81fffffff80fffffff007fffffc001fffff80007fffc00\ 0007fc000' self.tmatrixwid = 20 self.tmatrixhei = 59 self.tmatrixori = 5 self.tmatrix = '3f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f80f\ fffffffffffffffffffffffffffff03f8003f8003f8003f8003f8003f800\ 3f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f800\ 3f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f8003f800\ 3f8003f8003f8003f8003fc003fff03fff01fff00fff007ff001fe' self.umatrixwid = 35 self.umatrixhei = 47 self.umatrixori = 17 self.umatrix = '1fc00001fff800003fff000007ffe00000fffc00001fff800003fff00000\ 7ffe00000fffc00001fff800003fff000007ffe00000fffc00001fff8000\ 03fff000007ffe00000fffc00001fff800003fff000007ffe00000fffc00\ 001fff800003fff000007ffe00000fffc00001fff800003fff000007ffe0\ 0000fffc00001fff800003fff000007ffe00001fffc00003fff800007fff\ 00001fffe00003fffe0000ffffe0003ffbfc000fff7fe003ffeffe03fdfc\ ffffff3f8fffffc7f0fffff0fe0ffffc1fc07ffe000001fe0000' self.vmatrixwid = 40 self.vmatrixhei = 45 self.vmatrixori = 17 self.vmatrix = 'ff000000ffff000000ff7f800001fe7f800001fe7f800001fe3fc00003fc\ 3fc00003fc3fc00003f81fe00007f81fe00007f81fe00007f00ff0000ff0\ 0ff0000ff007f0000fe007f8001fe007f8001fc003f8001fc003fc003fc0\ 03fc003f8001fc003f8001fe007f8001fe007f0000fe007f0000ff00fe00\ 00ff00fe00007f00fe00007f01fc00007f81fc00003f83f800003f83f800\ 003fc3f800001fc7f000001fc7f000000fe7f000000fefe000000fefe000\ 0007ffc0000007ffc0000007ffc0000003ff80000003ff80000003ff8000\ 0001ff00000001ff00000001fe0000' self.wmatrixwid = 60 self.wmatrixhei = 45 self.wmatrixori = 17 self.wmatrix = 'ff00003fc0000ff7f00007fe0000ff7f80007fe0001fe7f80007fe0001fe\ 7f80007fe0001fe3f8000fff0001fc3fc000fff0003fc3fc000fff0003fc\ 1fc000fff0003f81fc001fff8003f81fe001fff8007f81fe001fbf8007f8\ 0fe001fbf8007f00fe003f9fc007f00ff003f9fc00ff007f003f1fc00fe0\ 07f003f1fc00fe007f007f0fe00fe007f807f0fe01fe003f807e0fe01fc0\ 03f807e07f01fc003fc0fe07f01fc001fc0fe07f03f8001fc0fc07f03f80\ 01fc0fc03f83f8001fe1fc03f83f8000fe1fc03f87f0000fe1f803f87f00\ 00fe1f801fc7f00007f3f801fc7e00007f3f801fcfe00007f3f001fcfe00\ 007f3f000fefe00003fff000fefc00003fff000fffc00003ffe000fffc00\ 001ffe0007ff800001ffe0007ff800001ffe0007ff800001ffc0007ff800\ 000ffc0003ff000000ffc0003ff000000ffc0003ff0000007f80003fe000\ 0007f80001fe000' self.xmatrixwid = 39 self.xmatrixhei = 45 self.xmatrixori = 17 self.xmatrix = '3fe00000ff3fc00003fc3fc0000ff03fc0001fc07f80007f807f8001fe00\ 7f8003f800ff000ff000ff003fc000ff007f0001fe01fe0001fe07f80001\ fe0fe00003fc3fc00003fcff000003fdfc000007fff0000007ffe0000007\ ff8000000ffe0000000ffc0000000ff00000001fe00000007fe0000000ff\ e0000003ffc000000fffc000003fffc000007f7f800001fe7f800007f87f\ 80000fe0ff00003fc0ff0000ff00ff0001fc01fe0007f801fe001fe001fe\ 003f8003fc00ff0003fc03fc0007fc0ff00007f81fe00007f87f80000ff9\ fe00000ff7fc00000ff' self.ymatrixwid = 39 self.ymatrixhei = 64 self.ymatrixori = 17 self.ymatrix = 'fe000001fffe000007f9fc00000ff3f800001fc7f800007f8ff00000ff0f\ e00001fc1fe00007f83fc0000ff03f80001fc07f80007f80ff0000ff00fe\ 0001fc01fe0007f803fc000fe003f8001fc007f8007f800ff000fe000fe0\ 01fc001fe007f8003fc00fe0003f803fc0007f807f8000ff00fe0000fe03\ fc0001fc07f00003fc0fe00003f83fc00007f07f00000ff0fe00000fe3fc\ 00001fc7f000003fcfe000003fbfc000007f7f000000fffe000000fff800\ 0001fff0000003ffe0000003ff80000007ff0000000ffe0000000ff80000\ 001ff00000003fe00000003f80000000ff00000001fe00000003f8000000\ 0ff00000001fc00000007f80000000ff00000001fc00000007f80000001f\ f00000007fc000003fff8000007ffe000000fff8000001ffe0000003ff80\ 000007fe00000003e0000000' self.zmatrixwid = 36 self.zmatrixhei = 45 self.zmatrixori = 17 self.zmatrix = '7fffffffe7fffffffe7fffffffe7fffffffe7fffffffe7fffffffe000000\ 3fc0000007f8000000ff8000001ff0000001fe0000003fc0000007f80000\ 00ff8000001ff0000003fe0000003fc0000007f8000000ff8000001ff000\ 0003fe0000003fc0000007f8000000ff8000001ff0000003fe0000003fc0\ 000007f8000000ff8000001ff0000003fe0000003fc0000007fc000000ff\ 8000001ff0000003fe0000003fc0000007fc000000ff8000000fffffffff\ fffffffffffffffffffffffffffffffffffffffffffff' self.Amatrixwid = 55 self.Amatrixhei = 62 self.Amatrixori = 0 self.Amatrix = 'ffe00000000001ffc00000000003ffc0000000000fff80000000001fff00\ 000000003fff0000000000fffe0000000001fffc0000000003fffc000000\ 000ff7f8000000001feff0000000007fcff000000000ff1fe000000001fe\ 3fc000000007f83fc00000000ff07f800000001fe0ff800000007f80ff00\ 000000ff01fe00000001fe03fe00000007f803fc0000000ff007f8000000\ 1fe00ff80000007f800ff0000000ff001fe0000003fe003fe0000007f800\ 3fc000000ff0007f8000003fc000ff8000007f8000ff000000ff0001fe00\ 0003fc0003fe000007f80003fc00000ff00007fc00003fc0000ff800007f\ 80000ff00000ff00001ff00003ffffffffe00007ffffffffc0001fffffff\ ffc0003fffffffff80007fffffffff0001ffffffffff0003fffffffffe00\ 07f8000003fc001ff0000007fc003fc000000ff8007f8000000ff001ff00\ 00001ff003fc0000003fe007f80000003fc01ff00000007fc03fc0000000\ ff80ff80000000ff81ff00000001ff03fc00000003fe0ff800000003fe1f\ e000000007fc3fc00000000ff8ff800000000ff9fe000000001ff7fc0000\ 00001ff' self.Bmatrixwid = 46 self.Bmatrixhei = 62 self.Bmatrixori = 0 self.Bmatrix = 'fffffffc0003ffffffff000fffffffff003ffffffffe00fffffffffc03ff\ fffffff80ffffffffff03fc00001ffe0ff000001ff83fc000003ff0ff000\ 0007fc3fc000000ff0ff0000003fe3fc0000007f8ff0000001fe3fc00000\ 07f8ff0000001fe3fc0000007f8ff0000001fe3fc0000007f0ff0000001f\ c3fc000000ff0ff0000003f83fc000001fe0ff000000ff83fc000007fc0f\ f00000ffe03fffffffff00fffffffff003ffffffff800fffffffff803fff\ ffffff80ffffffffff03ffffffffff0ff000001ffc3fc000001ff8ff0000\ 001ff3fc0000003feff0000000ffbfc0000001feff00000007fbfc000000\ 0ffff00000003fffc0000000ffff00000003fffc0000000ffff00000003f\ bfc0000000feff00000007fbfc0000001feff00000007fbfc0000003fcff\ 0000001ff3fc000000ff8ff000000ffe3ffffffffff0ffffffffff83ffff\ fffffc0fffffffffe03fffffffff00fffffffff003fffffffc000' self.Cmatrixwid = 53 self.Cmatrixhei = 65 self.Cmatrixori = -1 self.Cmatrix = '3ff8000000001ffffc00000007fffffc000000fffffff000001fffffffe0\ 0001ffffffff80001ffffffffe0001fff000fff8001ffc0001ffc001ffc0\ 0003ff001ff800000ffc00ff8000003fe00ff8000000ff807f80000003fc\ 07fc0000001fe03fc00000007f83fc00000003fc1fe00000001fe1fe0000\ 00007f8ff000000003fc7f800000000007f800000000003fc00000000001\ fe00000000000ff000000000007f800000000003f800000000003fc00000\ 000001fe00000000000ff000000000007f800000000003fc00000000001f\ e00000000000ff000000000007f800000000003fc00000000001fe000000\ 00000ff000000000007f800000000001fe00000000000ff000000000ff7f\ 8000000007fbfc000000003fdfe000000003fc7f800000001fe3fc000000\ 00ff1ff000000007f87f800000007fc3fe00000003fc0ff00000003fe07f\ c0000001ff01ff0000001ff00ffc000000ff803ff000000ff801ffc00000\ ffc007ff00000ffc001ffe0001ffc0007ffe007ffc0001ffffffffe00007\ fffffffc00001fffffffc000003ffffffc0000007fffff800000007fffe0\ 000000003ff00000' self.Dmatrixwid = 49 self.Dmatrixhei = 62 self.Dmatrixori = 0 self.Dmatrix = '3ffffffe00001ffffffff0000ffffffffe0007ffffffffc003fffffffff0\ 01fffffffffe00ffffffffff807f800007ffe03fc000007ff01fe000000f\ fc0ff0000003ff07f8000000ff83fc0000003fe1fe0000000ff0ff000000\ 07fc7f80000001fe3fc0000000ff9fe00000003fcff00000001fe7f80000\ 0007fbfc00000003fdfe00000001feff00000000ff7f800000007fbfc000\ 00001fffe00000000ffff000000007fff800000003fffc00000001fffe00\ 000000ffff000000007fff800000003fffc00000001fffe00000000ffff0\ 00000007fff800000003fffc00000001fffe00000000ffff00000000ff7f\ 800000007fbfc00000003fdfe00000001feff00000000ff7f80000000ff3\ fc00000007f9fe00000007fcff00000003fc7f80000003fe3fc0000001fe\ 1fe0000001ff0ff0000001ff07f8000001ff83fc000001ff81fe000003ff\ 80ff00000fffc07fffffffffc03fffffffff801fffffffff800fffffffff\ 8007ffffffff0003fffffffe0001fffffff00000' self.Ematrixwid = 44 self.Ematrixhei = 62 self.Ematrixori = 0 self.Ematrix = 'ffffffffffeffffffffffeffffffffffeffffffffffeffffffffffefffff\ fffffeffffffffffeff000000000ff000000000ff000000000ff00000000\ 0ff000000000ff000000000ff000000000ff000000000ff000000000ff00\ 0000000ff000000000ff000000000ff000000000ff000000000ff0000000\ 00ff000000000ff000000000ff000000000ff000000000ff000000000fff\ fffffffcffffffffffcffffffffffcffffffffffcffffffffffcffffffff\ ffcffffffffffcff000000000ff000000000ff000000000ff000000000ff\ 000000000ff000000000ff000000000ff000000000ff000000000ff00000\ 0000ff000000000ff000000000ff000000000ff000000000ff000000000f\ f000000000ff000000000ff000000000ff000000000ff000000000ff0000\ 00000fffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffffffffffffffffff' self.Fmatrixwid = 42 self.Fmatrixhei = 62 self.Fmatrixori = 0 self.Fmatrix = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ fffffffffffffffc00000000ff000000003fc00000000ff000000003fc00\ 000000ff000000003fc00000000ff000000003fc00000000ff000000003f\ c00000000ff000000003fc00000000ff000000003fc00000000ff0000000\ 03fc00000000ff000000003fc00000000ff000000003fffffffff0ffffff\ fffc3fffffffff0fffffffffc3fffffffff0fffffffffc3fffffffff0ff0\ 00000003fc00000000ff000000003fc00000000ff000000003fc00000000\ ff000000003fc00000000ff000000003fc00000000ff000000003fc00000\ 000ff000000003fc00000000ff000000003fc00000000ff000000003fc00\ 000000ff000000003fc00000000ff000000003fc00000000ff000000003f\ c00000000ff000000003fc00000000ff000000003fc00000000' self.Gmatrixwid = 56 self.Gmatrixhei = 65 self.Gmatrixori = -1 self.Gmatrix = 'ffe0000000001fffff000000007fffffc0000001fffffff0000007ffffff\ fc00000ffffffffe00003fffffffff00007fff000fff8000fff80003ffc0\ 00ffe00000ffe001ff8000003ff003ff0000001ff007fe0000000ff807fc\ 0000000ff80ff800000007fc0ff800000003fc1ff000000003fc1fe00000\ 0003fc1fe000000001fe3fc000000001fe3fc000000000003fc000000000\ 007f8000000000007f8000000000007f8000000000007f8000000000007f\ 000000000000ff000000000000ff000000000000ff000000000000ff0000\ 03ffffffff000003ffffffff000003ffffffff000003ffffffff000003ff\ ffffff000003ffffffff000003ffffffff00000000007f7f80000000007f\ 7f80000000007f7f80000000007f7f80000000007f7fc0000000007f3fc0\ 000000007f3fc000000000ff3fe000000000ff1fe000000000ff1ff00000\ 0001ff1ff000000001ff0ff800000003ff0ffc00000007ff07fc00000007\ ff03fe0000000fff03ff0000001fff01ffc000007fff00ffe00000ffff00\ 7ffc0003ff7f003fff001ffe3f001ffffffffc3f000ffffffff83f0007ff\ ffffe03f0001ffffff801f00007fffff001f00000ffff80000000000ff00\ 0000' self.Hmatrixwid = 48 self.Hmatrixhei = 62 self.Hmatrixori = 0 self.Hmatrix = 'ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffffffffffffffffffffffffffffffffffffff\ ffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ff' self.Imatrixwid = 8 self.Imatrixhei = 62 self.Imatrixori = 0 self.Imatrix = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ffff' self.Jmatrixwid = 35 self.Jmatrixhei = 64 self.Jmatrixori = 0 self.Jmatrix = '1fe0000003fc0000007f8000000ff0000001fe0000003fc0000007f80000\ 00ff0000001fe0000003fc0000007f8000000ff0000001fe0000003fc000\ 0007f8000000ff0000001fe0000003fc0000007f8000000ff0000001fe00\ 00003fc0000007f8000000ff0000001fe0000003fc0000007f8000000ff0\ 000001fe0000003fc0000007f8000000ff0000001fe0000003fc0000007f\ 8000000ff0000001fe0000003fc0000007f8000000ff0000001fe0000003\ fffc00007fff80000ffff00001fffe00003fffc00007fff80000ffff0000\ 1fffe00003fffc0000ffffc0001fe7f80003fcff8000ff9ff8003fe1ff80\ 0ffc3ffc07ff03ffffffe03ffffff803fffffe003fffff0001ffffc0000f\ ffe000003fc000' self.Kmatrixwid = 49 self.Kmatrixhei = 62 self.Kmatrixori = 0 self.Kmatrix = '3fc0000000ffffe0000000ffeff0000000ffe7f8000000ffe3fc000000ff\ e1fe000000ffe0ff000000ffe07f800000ffe03fc00000ffe01fe00000ff\ e00ff000007fe007f800007fe003fc00007fe001fe00007fe000ff00007f\ e0007f80007fe0003fc0007fe0001fe0007fe0000ff0007fe00007f8007f\ e00003fc007fe00001fe007fe00000ff007fe000007f807fe000003fc07f\ e000001fe07fe000000ff07ff8000007f87ffc000003fc7fff000001fe7f\ ffc00000ff7fffe000007fffcff800003fffc3fe00001fffc1ff00000fff\ c07fc00007ffc01ff00003ffc00ffc0001ffc003fe0000ffc000ff80007f\ c0007fe0003fc0001ff0001fe00007fc000ff00001ff0007f80000ff8003\ fc00003fe001fe00000ff800ff000007fe007f800001ff003fc000007fc0\ 1fe000003ff00ff000000ff807f8000003fe03fc000001ff81fe0000007f\ c0ff0000001ff07f8000000ffc3fc0000003fe1fe0000000ff8ff0000000\ 3fe7f80000001ffbfc00000007fdfe00000001ff' self.Lmatrixwid = 39 self.Lmatrixhei = 62 self.Lmatrixori = 0 self.Lmatrix = '3fc00000007f80000000ff00000001fe00000003fc00000007f80000000f\ f00000001fe00000003fc00000007f80000000ff00000001fe00000003fc\ 00000007f80000000ff00000001fe00000003fc00000007f80000000ff00\ 000001fe00000003fc00000007f80000000ff00000001fe00000003fc000\ 00007f80000000ff00000001fe00000003fc00000007f80000000ff00000\ 001fe00000003fc00000007f80000000ff00000001fe00000003fc000000\ 07f80000000ff00000001fe00000003fc00000007f80000000ff00000001\ fe00000003fc00000007f80000000ff00000001fe00000003fc00000007f\ 80000000ff00000001fe00000003fc00000007f80000000ff00000001fff\ ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ fffff' self.Mmatrixwid = 57 self.Mmatrixhei = 62 self.Mmatrixori = 0 self.Mmatrix = '3ff800000000fffffc000000007ffffe000000003fffff800000003fffff\ c00000001fffffe00000000ffffff80000000ffffffc00000007fffffe00\ 000003ffffff80000003ffffffc0000001ffffffe0000000fffffbf80000\ 00fefffdfc0000007f7ffefe0000003fbfff3f8000003f9fff9fc000001f\ cfffcfe000000fe7ffe3f800000fe3fff1fc000007f1fff8fe000003f8ff\ fc3f800003f87ffe1fc00001fc3fff0fe00000fe1fff83f80000fe0fffc1\ fc00007f07ffe0fe00003f83fff03f80003f81fff81fc0001fc0fffc0fe0\ 000fe07ffe03f8000fe03fff01fc0007f01fff807e0003f80fffc03f8003\ f807ffe01fc001fc03fff007e000fe01fff803f800fe00fffc01fc007f00\ 7ffe007e003f803fff003f803f801fff801fc01fc00fffc007e00fe007ff\ e003f80fe003fff001fc07f001fff8007e03f800fffc003f83f8007ffe00\ 1fc1fc003fff0007e0fe001fff8003f8fe000fffc001fc7f0007ffe0007e\ 3f8003fff0003fbf8001fff8001fdfc000fffc0007ffe0007ffe0003ffe0\ 003fff0001fff0001fff80007ff8000fffc0003ff80007ffe0001ffc0003\ fff00007fe0001fff80003fe0000fffc0001ff00007f' self.Nmatrixwid = 48 self.Nmatrixhei = 62 self.Nmatrixori = 0 self.Nmatrix = 'ff000000007fff800000007fffc00000007fffc00000007fffe00000007f\ fff00000007ffff00000007ffff80000007ffffc0000007ffffc0000007f\ fffe0000007fffff0000007fffff0000007ffeff8000007ffe7f8000007f\ fe7fc000007ffe3fe000007ffe1fe000007ffe1ff000007ffe0ff800007f\ fe07f800007ffe07fc00007ffe03fe00007ffe01fe00007ffe01ff00007f\ fe00ff80007ffe007f80007ffe007fc0007ffe003fe0007ffe003fe0007f\ fe001ff0007ffe000ff8007ffe000ff8007ffe0007fc007ffe0003fe007f\ fe0003fe007ffe0001ff007ffe0000ff007ffe0000ff807ffe00007fc07f\ fe00003fc07ffe00003fe07ffe00001ff07ffe00000ff07ffe00000ff87f\ fe000007fc7ffe000003fc7ffe000003fe7ffe000001ff7ffe000001ff7f\ fe000000fffffe0000007ffffe0000007ffffe0000003ffffe0000001fff\ fe0000001ffffe0000000ffffe00000007fffe00000007fffe00000003ff\ fe00000001fffe00000001ff' self.Omatrixwid = 60 self.Omatrixhei = 65 self.Omatrixori = -1 self.Omatrix = 'fff00000000000fffff0000000007fffffe00000000fffffff80000003ff\ fffffc000000fffffffff000001fffffffff800003fff000fffc00007ff8\ 0001ffe0000ffe000007ff0001ffc000003ff8003ff0000000ffc003fe00\ 000007fc007fc00000003fe00ff800000001ff00ff800000001ff01ff000\ 000000ff81fe0000000007f83fe0000000007f83fe0000000007fc3fc000\ 0000003fc3fc0000000003fc7f80000000001fe7f80000000001fe7f8000\ 0000001fe7f80000000001fe7f00000000000feff00000000000ffff0000\ 0000000ffff00000000000ffff00000000000ffff00000000000ffff0000\ 0000000ffff00000000000ffff00000000000ffff00000000000ffff0000\ 0000000ffff00000000000ff7f00000000000fe7f80000000001fe7f8000\ 0000001fe7f80000000001fe7f80000000001fe3fc0000000003fc3fc000\ 0000003fc3fe0000000007fc1fe0000000007f81ff000000000ff80ff000\ 000000ff00ff800000001ff00ffc00000003ff007fc00000003fe003ff00\ 00000ffc003ff8000001ff8001ffc000003ff8000fff00000fff00007ffc\ 0003ffe00003fff801fffc00001fffffffff800000fffffffff0000003ff\ fffffc0000000fffffff000000003fffffc0000000007fffe00000000000\ 3fe000000' self.Pmatrixwid = 44 self.Pmatrixhei = 62 self.Pmatrixori = 0 self.Pmatrix = 'fffffffe000ffffffffc00fffffffff00fffffffffc0fffffffffe0fffff\ fffff0ffffffffff8ff000007ff8ff000001ffcff0000007fcff0000003f\ eff0000003feff0000001feff0000001feff0000000ffff0000000ffff00\ 00000ffff0000000ffff0000000ffff0000000ffff0000000ffff0000000\ ffff0000001ffff0000001feff0000003feff0000007feff000000ffcff0\ 00001ffcff000007ff8ffffffffff8ffffffffff0fffffffffe0ffffffff\ fc0fffffffff00ffffffffc00fffffffe000ff000000000ff000000000ff\ 000000000ff000000000ff000000000ff000000000ff000000000ff00000\ 0000ff000000000ff000000000ff000000000ff000000000ff000000000f\ f000000000ff000000000ff000000000ff000000000ff000000000ff0000\ 00000ff000000000ff000000000ff000000000ff000000000ff000000000\ ff000000000ff000000000' self.Qmatrixwid = 60 self.Qmatrixhei = 68 self.Qmatrixori = -1 self.Qmatrix = 'fff00000000000fffff0000000007fffffe00000000fffffff00000003ff\ fffffc000000fffffffff000001fffffffff800003fff000fffc00007ff8\ 0001ffe0000ffe000007ff0001ffc000003ff8003ff0000000ffc003fe00\ 000007fc007fc00000003fe00ff800000001ff00ff800000001ff01ff000\ 000000ff81fe0000000007f83fe0000000007fc3fe0000000007fc3fc000\ 0000003fc3fc0000000003fc7f80000000001fe7f80000000001fe7f8000\ 0000001fe7f80000000001fe7f00000000000feff00000000000ffff0000\ 0000000ffff00000000000ffff00000000000ffff00000000000ffff0000\ 0000000ffff00000000000ffff00000000000ffff00000000000ffff0000\ 0000000ffff00000000000ff7f00000000000fe7f80000000001fe7f8000\ 0000001fe7f80000000001fe7f80000000001fe3fc0000000003fc3fc000\ 0000003fc3fe0000000007fc1fe0000006007f81ff000000f00ff80ff000\ 001f80ff00ff800001fc1ff00ffc00003ff3ff007fc00001ffbfe003fe00\ 000ffffc003ff800007fffc001ffc00001fff8000fff00000fff00007ff8\ 0003ffe00003fff801ffff00001ffffffffff80000ffffffffffe00003ff\ ffffffff00000fffffff9ff800003fffffe07fc000007ffff003fe000000\ 3fe0001fc0000000000000f8000000000000070000000000000010' self.Rmatrixwid = 50 self.Rmatrixhei = 62 self.Rmatrixori = 0 self.Rmatrix = 'ffffffffc0003fffffffff000ffffffffff003fffffffffe00ffffffffff\ e03ffffffffff80fffffffffff03fc000001ffe0ff0000001ff83fc00000\ 03ff0ff00000007fc3fc0000000ff0ff00000003fe3fc00000007f8ff000\ 00001fe3fc00000007f8ff00000001fe3fc00000007f8ff00000001fe3fc\ 00000007f8ff00000001fc3fc00000007f0ff00000003fc3fc0000000ff0\ ff00000007f83fc0000003fc0ff0000001ff03fc000003ff80ffffffffff\ c03fffffffffc00fffffffffe003fffffffff800ffffffffff803fffffff\ fff00ffffffffffe03fc000001ffc0ff0000001ff03fc0000003fe0ff000\ 00007f83fc0000000fe0ff00000003fc3fc00000007f0ff00000001fc3fc\ 00000007f0ff00000001fc3fc00000007f0ff00000001fc3fc00000007f0\ ff00000001fc3fc00000007f0ff00000001fc3fc00000007f0ff00000001\ fc3fc00000007f0ff00000001fc3fc00000007f8ff00000001fe3fc00000\ 007f8ff00000000ff3fc00000003feff00000000ffffc00000003ff' self.Smatrixwid = 49 self.Smatrixhei = 65 self.Smatrixori = -1 self.Smatrix = '7ff800000003ffffc0000007fffff800000fffffff00000fffffffc0001f\ fffffff8001ffffffffe001fff000fff000ffc0000ffc00ffc00003ff007\ fc000007f807fc000001fe03fc000000ff01fe0000003f81fe0000001fc0\ ff0000000ff07f80000003f83fc0000001fc1fe0000000fe0ff000000000\ 07fc0000000003fe0000000000ff80000000007fe0000000003ffc000000\ 000fff8000000007fff800000001ffffc00000007ffffe0000001ffffff0\ 000003ffffff8000007ffffff800000fffffff0000007fffffc0000003ff\ fff80000003ffffe00000001ffff800000000fffc000000001fff0000000\ 003ff80000000007fe0000000001ff00000000007fbf800000003fffc000\ 00000fffe000000007fff000000003fff800000001fefe00000000ff7f00\ 0000007fbfc00000007f9fe00000003fc7f80000003fe3fe0000001fe0ff\ 8000001ff07fe000003ff01ffc00007ff007ffe001fff801fffffffff800\ 7ffffffff8001ffffffff00003fffffff000007fffffe000000fffff8000\ 00003ff80000' self.Tmatrixwid = 48 self.Tmatrixhei = 62 self.Tmatrixori = 0 self.Tmatrix = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffffffffffffffffffff00000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff0000000000ff0000000000ff0000000000ff00000\ 00000ff0000000000ff00000' self.Umatrixwid = 48 self.Umatrixhei = 64 self.Umatrixori = 0 self.Umatrix = 'ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ff\ ff00000000ffff00000000ffff00000000ff7f80000001fe7f80000001fe\ 7fc0000003fe7fc0000003fc3fe0000007fc3ff000000ff81ff800003ff8\ 0ffe0000fff007ffc007ffe007ffffffffc003ffffffff8000ffffffff00\ 007ffffffc00000ffffff0000003ffffc00000001ff80000' self.Vmatrixwid = 52 self.Vmatrixhei = 62 self.Vmatrixori = 0 self.Vmatrix = 'ff800000000ff7f800000000fe7fc00000001fe7fc00000001fe3fc00000\ 001fc3fe00000003fc1fe00000003fc1fe00000003f81ff00000007f80ff\ 00000007f80ff00000007f00ff8000000ff007f8000000ff007f8000000f\ e007fc000001fe003fc000001fe003fc000001fc003fe000003fc001fe00\ 0003fc001fe000003f8000ff000007f8000ff000007f8000ff000007f000\ 07f80000ff00007f80000ff00007fc0000fe00003fc0001fe00003fc0001\ fe00003fe0001fc00001fe0003fc00001fe0003fc00000ff0003f800000f\ f0007f800000ff0007f8000007f8007f0000007f800ff0000007f800ff00\ 00003fc00fe0000003fc01fe0000003fc01fe0000001fe01fc0000001fe0\ 3fc0000001fe03fc0000000ff03f80000000ff07f800000007f07f800000\ 007f87f000000007f87f000000003fcff000000003fcfe000000003fcfe0\ 00000001fffe000000001fffc000000001fffc000000000fff8000000000\ fff80000000007ff80000000007ff00000000007ff00000000003ff00000\ 000003fe00000000003fe00000' self.Wmatrixwid = 77 self.Wmatrixhei = 62 self.Wmatrixori = 0 self.Wmatrix = '3fe000000ff8000003ffff0000007fc000001ff7f8000003fe000000ff3f\ e000003ff800000ff9ff000001ffc000007fcff800000ffe000003fe3fc0\ 0000fff000001fe1ff000007ffc00001ff0ff800003ffe00000ff87fc000\ 01fff000007fc1fe00001fffc00003fc0ff80000fffe00003fe07fc00007\ f7f00001ff01fe00003fbf80000ff80ff00003f9fe00007f807f80001fc7\ f00003fc03fe0000fe3f80003fe00ff0000ff1fe0001fe007f80007f0ff0\ 000ff003fc0003f83f80007f801ff0001fc1fc0007fc007f8001fe0ff000\ 3fc003fc000fe03f8001fe001fe0007f01fc000ff000ff8003f80ff0007f\ 8003fc003f807f8007f8001fe001fc01fc003fc000ff000fe00fe001fe00\ 07f800ff007f800ff0001fe007f001fc00ff0000ff003f800fe007f80007\ f801fc007f003fc0003fc01fe003fc01fe0000ff00fe000fe00fe00007f8\ 07f0007f00ff00003fc03f8003fc07f80001fe03f8001fe03fc00007f81f\ c0007f01fc00003fc0fe0003f81fe00001fe0ff0001fe0ff00000ff07f00\ 007f07f800003f83f80003f83f800001fe1fc0001fe1fc00000ff1fe0000\ ff1fe000007f8fe00003f8ff000001fc7f00001fc7f000000ff3f80000ff\ 3f8000007fbf800003fbfc000001fdfc00001fdfe000000fefe00000fffe\ 0000007fff000007fff0000003fff000001fff8000000fff800000fffc00\ 00007ffc000007ffc0000003ffe000001ffe0000001ffe000000fff00000\ 007ff0000007ff80000003ff8000003ff80000001ffc000000ffc0000000\ ffc0000007fe00000003fe0000003ff00000001ff0000001ff0000' self.Xmatrixwid = 53 self.Xmatrixhei = 62 self.Xmatrixori = 0 self.Xmatrix = '1ff80000000ffc7fe00000007fc1ff00000007fc07fc0000007fe03ff000\ 0003fe00ff8000003fe003fe000003ff001ff800001ff0007fc00001ff00\ 01ff00000ff8000ffc0000ff80003fe0000ff80000ff80007fc00007fe00\ 07fc00001ff0007fc000007fc003fc000003ff003fe000000ff803fe0000\ 003fe01fe0000001ff81ff00000007fc1ff00000001ff0ff000000007fcf\ f800000003feff800000000ffff8000000003fff8000000001fffc000000\ 0007ffc0000000001ffc0000000000ffe00000000003fe00000000003ff8\ 0000000003ffe0000000001fff8000000001fffc000000001ffff0000000\ 01ff7fc00000000ffbfe00000000ff8ff80000000ff83fe00000007fc1ff\ 00000007fc07fc0000007fc01ff0000003fe00ff8000003fe003fe000003\ fe000ff800001ff0007fe00001ff0001ff00001ff00007fc0001ff80003f\ f0000ff80000ff8000ff800003fe000ffc00001ff8007fc000007fc007fc\ 000001ff007fe000000ffc03fe0000003fe03fe0000001ff83ff00000007\ fe1ff00000001ff1ff00000000ffdff800000003ff' self.Ymatrixwid = 55 self.Ymatrixhei = 62 self.Ymatrixori = 0 self.Ymatrix = '3ff000000000ffbff000000003fe3fe00000000ffc7fe00000001ff07fe0\ 0000007fc07fc0000000ff80ffc0000003fe00ff8000000ffc00ff800000\ 1ff001ff8000007fc001ff000000ff8003ff000003fe0003fe000007fc00\ 03fe00001ff00007fe00007fc00007fc0000ff800007fc0003fe00000ff8\ 0007f800000ff8001ff000000ff8007fc000001ff000ff8000001ff003fe\ 0000003fe007f80000003fe01ff00000003fe07fc00000007fc0ff000000\ 007fc3fe000000007fc7f800000000ff9ff000000000ffbfc000000000ff\ ff0000000001fffe0000000001fff80000000003fff00000000003ffc000\ 00000003ff000000000007fe000000000007f800000000000ff000000000\ 001fe000000000003fc000000000007f800000000000ff000000000001fe\ 000000000003fc000000000007f800000000000ff000000000001fe00000\ 0000003fc000000000007f800000000000ff000000000001fe0000000000\ 03fc000000000007f800000000000ff000000000001fe000000000003fc0\ 00000000007f800000000000ff000000000001fe000000000003fc000000\ 000007f800000' self.Zmatrixwid = 48 self.Zmatrixhei = 62 self.Zmatrixori = 0 self.Zmatrix = '1ffffffffffe1ffffffffffe1ffffffffffe1ffffffffffe1ffffffffffe\ 1ffffffffffe1ffffffffffe0000000007fe000000000ffc000000001ff8\ 000000001ff8000000003ff0000000007fe000000000ffc000000000ffc0\ 00000001ff8000000003ff0000000007fe0000000007fc000000000ffc00\ 0000001ff8000000003ff0000000007fe0000000007fe000000000ffc000\ 000001ff8000000003ff0000000003ff0000000007fe000000000ffc0000\ 00001ff8000000001ff8000000003ff0000000007fe000000000ffc00000\ 0000ff8000000001ff8000000003ff0000000007fe000000000ffc000000\ 000ffc000000001ff8000000003ff0000000007fe0000000007fe0000000\ 00ffc000000001ff8000000003ff0000000003ff0000000007fe00000000\ 0ffc000000001ff8000000001ff0000000003ff0000000007fe000000000\ ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffffffffffffffffffff' self.onematrixwid = 21 self.onematrixhei = 60 self.onematrixori = 2 self.onematrix = 'f80007c0007e0003f0001f8001fc000fe000ff000ff800ffc03ffe1fffff\ fffffffffffffffffffffffff8003fc001fe000ff0007f8003fc001fe000\ ff0007f8003fc001fc000fe0007f0003f8001fc000fe0007f0003f8001fc\ 000fe0007f0003f8001fc000fe0007f0003f8001fc000fe0007f0003f800\ 1fc000fe0007f0003f8001fc000fe0007f0003f8001fc000fe0007f0003f\ 8001fc000fe' self.twomatrixwid = 40 self.twomatrixhei = 60 self.twomatrixori = 2 self.twomatrix = '1ffc000000ffff800003ffffe0000ffffff8001ffffffc003ffffffe007f\ ffffff007ff007ff80ffc000ffc1ff00007fc1fe00003fe1fe00001fe3fc\ 00000fe3f800000fe3f800000ff3f8000007f7f8000007f7f0000007f7f0\ 000007f7f0000007f7f0000007f00000000ff00000000fe00000001fe000\ 00001fe00000003fc00000007fc0000000ff80000003ff00000007ff0000\ 001ffe0000007ffc000000fff8000003ffe000000fffc000003fff000000\ 7ffe000001fff8000003ffe000000fff8000001ffe0000003ff80000007f\ e00000007fc0000000ff80000001fe00000001fc00000003fc00000003f8\ 00000007f000000007f000000007f000000007f00000000fffffffffffff\ fffffffffffffffffffffffffffffffffffffffffffffffffffffffff' self.threematrixwid = 40 self.threematrixhei = 62 self.threematrixori = 2 self.threematrix = '1ff8000001ffff800007ffffe0000ffffff0003ffffff8007ffffffc007f\ fffffe00ffe007ff01ff8001ff01fe0000ff81fc00007f83fc00003f83f8\ 00003fc3f800001fc3f800001fc7f000001fc7f000001fc7f000001fc7f0\ 00001fc00000001fc00000003f800000003f800000007f80000000ff0000\ 0001ff0000001ffe00000ffffc00000ffff000000fffe000000ffff80000\ 0ffffc00000fffff00000003ff80000000ffc00000003fc00000001fe000\ 00001fe00000000fe00000000ff000000007f000000007f000000007ffe0\ 000007ffe0000007ffe0000007ffe0000007f7f0000007f7f000000fe7f0\ 00000fe7f800001fe3f800001fe3fc00003fc3fe00007fc1ff8001ff81ff\ e007ff80ffffffff007ffffffe003ffffffc001ffffff00007ffffe00001\ ffff0000001ff0000' self.fourmatrixwid = 41 self.fourmatrixhei = 60 self.fourmatrixori = 2 self.fourmatrix = '1f000000001f800000001fc00000001fe00000000ff00000000ff8000000\ 0ffc00000007fe00000007ff00000007ff80000007ffc0000003ffe00000\ 03fff0000003fff8000003fdfc000001fcfe000001fc7f000001fe3f8000\ 00fe1fc00000fe0fe00000ff07f00000ff03f800007f01fc00007f00fe00\ 007f807f00003f803f80003f801fc0003fc00fe0003fc007f0001fc003f8\ 001fc001fc001fe000fe000fe0007f000fe0003f800ff0001fc00ff0000f\ e007f00007f007f00003f803f80001fc01ffffffffffffffffffffffffff\ fffffffffffffffffffffffffffffffffffffffffffffc000001fc000000\ 00fe000000007f000000003f800000001fc00000000fe000000007f00000\ 0003f800000001fc00000000fe000000007f000000003f800000001fc000\ 00000fe00' self.fivematrixwid = 40 self.fivematrixhei = 62 self.fivematrixori = 2 self.fivematrix = '3fffffff803fffffff803fffffff803fffffff807fffffff807fffffff80\ 7fffffff807f000000007f000000007f000000007e00000000fe00000000\ fe00000000fe00000000fe00000000fe00000000fe00000000fc00000000\ fc00000001fc00000001fc07f80001fc3fff0001fcffffe001fffffff001\ fffffff801fffffffe01fffffffe03ffe00fff03ff8003ff83fe0000ff83\ fc00007fc3f800003fc00000001fe00000001fe00000000fe00000000fe0\ 0000000ff000000007f000000007f000000007f000000007f000000007f0\ 00000007f000000007f000000007ffe0000007efe000000fe7f000000fe7\ f000001fe7f800001fc3f800003fc3fc00007f83fe0000ff81ff8001ff00\ ffe00ffe00fffffffe007ffffffc003ffffff8000fffffe00007ffffc000\ 00fffe0000001ff0000' self.sixmatrixwid = 39 self.sixmatrixhei = 62 self.sixmatrixori = 2 self.sixmatrix = '1ff0000001fffc00000ffffe00007ffffe0001fffffe0007fffffe001fff\ fffe007ff00ffc01ff8007fc03fc0007f80ff00007f81fe00007f07f8000\ 0fe0fe00000fe1fc00001fc7f00000000fe00000001fc00000007f800000\ 00fe00000001fc00000003f800000007f003f8000fe07ffe003fc3ffff00\ 7f8fffff80ff3fffff81feffffff83ffffffff87fff807ff8fffc001ff1f\ fe0001ff3ff80001fe7ff00001feffc00003fdff000003fbfe000007f7fc\ 00000ffff000000fffe000001fdfc000003fbf8000007f7f000000fefe00\ 0001fdfc000003fbf8000007f3f800001fc7f000003f8ff000007f0fe000\ 01fe1fe00007f81fe0000ff03fe0007fc07fe001ff807ff00ffe007fffff\ f8007fffffe0007fffff80007ffffe00007ffff000001fff80000003f800\ 0' self.sevenmatrixwid = 40 self.sevenmatrixhei = 60 self.sevenmatrixori = 2 self.sevenmatrix = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffffff00000000fe00000000fe00000001fc00000003f800000003f8\ 00000007f00000000fe00000000fc00000001fc00000003f800000003f80\ 0000007f00000000fe00000000fe00000001fc00000001fc00000003f800\ 000003f000000007f00000000fe00000000fe00000001fc00000001fc000\ 00003f800000003f800000007f000000007f00000000ff00000000fe0000\ 0001fe00000001fc00000001fc00000003f800000003f800000007f80000\ 0007f000000007f00000000ff00000000fe00000000fe00000001fe00000\ 001fe00000001fc00000003fc00000003fc00000003f800000003f800000\ 007f800000007f800000007f800000007f00000000ff00000000ff000000' self.eightmatrixwid = 40 self.eightmatrixhei = 62 self.eightmatrixori = 2 self.eightmatrix = 'ff80000007fff000003ffffe00007fffff0000ffffff8001ffffffc003ff\ ffffe007ff007ff007fc001ff00ff8000ff80ff00007f80fe00003f81fe0\ 0003fc1fc00001fc1fc00001fc1fc00001fc1fc00001fc1fc00001fc1fc0\ 0001fc1fe00003fc0fe00003f80ff00007f807f8000ff007fe003ff003ff\ 80ffe001ffffffc0007fffff00003ffffe00007ffffe0001ffffff8003ff\ ffffc007ff00fff00ff8001ff01ff0000ff83fc00003fc3f800001fc7f80\ 0001fe7f000000fe7f000000fefe0000007ffe0000007ffe0000007ffe00\ 00007ffe0000007ffe0000007ffe0000007ffe0000007f7f000000fe7f00\ 0000fe7f800001fe7f800001fe3fc00003fc3fe0000ffc1ff8001ff80ffe\ 00fff007ffffffe007ffffffe001ffffff8000ffffff00003ffffc00000f\ fff0000000ff0000' self.ninematrixwid = 39 self.ninematrixhei = 62 self.ninematrixori = 2 self.ninematrix = 'ffc000000ffff000007ffff80001fffff80007fffff8003ffffff8007fff\ fff801ff803ff807fe001ff80ff0000ff03fc0000ff07f00001fe1fe0000\ 1fe3f800001fc7f000003f8fe000007f3f8000007f7f000000fefe000001\ fdfc000003fbf8000007f7f000000fefe000001fffc000003fdfc00000ff\ bf800001ff7f800007feff00000ffcff00003ff9ff0000fff1ff0007ffe3\ ff803fffc3ffffffff83fffffeff03fffff9fe03ffffe3fc01ffff07f800\ fffc0fe0003f801fc00000003f800000007f00000000fe00000003fc0000\ 0007f00000000fe00000001fc7f000007f8fe00000fe0fe00003fc1fc000\ 07f03fc0001fe07fc0007fc07f8001ff00ffc007fc00ffc03ff800ffffff\ e001ffffff8001fffffe0001fffff80000ffffc000007ffe0000001fc000\ 0' self.tenmatrixwid = 39 self.tenmatrixhei = 62 self.tenmatrixori = 2 self.tenmatrix = '7fc0000007fff000003ffff80000fffff80003fffff8000ffffff8003fff\ fff800ffe03ff801ff001ff007f8001ff00ff0001fe03fc0001fe07f0000\ 1fc1fe00003fc3f800003f87f000007f0fe00000fe3f800000fe7f000001\ fcfe000003f9fc000007f3f800000fe7e000000fdfc000001fff8000003f\ ff0000007ffe000000fffc000001fff8000003fff0000007ffe000000fff\ c000001fff8000003fff0000007ffe000000fffc000001fff8000003fff0\ 000007ffe000000fefc000001fdfc000007f3f800000fe7f000001fcfe00\ 0003f9fc000007f3f800000fe3f800003f87f000007f0ff00000fe0fe000\ 03f81fc00007f03fc0001fc03fc0007f807fc001ff007fc007fc007fe03f\ f0007fffffc000ffffff00007ffffc00007ffff000003fff8000000ff800\ 0' self._matrixwid = 51 self._matrixhei = 4 self._matrixori = 73 self._matrix = 'fffffffffffffffffffffffffffffffffffffffffffffffffff' self.minusmatrixwid = 20 self.minusmatrixhei = 6 self.minusmatrixori = 36 self.minusmatrix = 'ffffffffffffffffffffffffffffff' self.plusmatrixwid = 42 self.plusmatrixhei = 42 self.plusmatrixori = 21 self.plusmatrix = '3f000000000fc000000003f000000000fc000000003f000000000fc00000\ 0003f000000000fc000000003f000000000fc000000003f000000000fc00\ 0000003f000000000fc000000003f000000000fc000000003f000000000f\ c0000fffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffff00003f000000000fc000000003f000000000fc000000003f0000\ 00000fc000000003f000000000fc000000003f000000000fc000000003f0\ 00000000fc000000003f000000000fc000000003f000000000fc00000000\ 3f000000000fc0000' self.equalmatrixwid = 41 self.equalmatrixhei = 21 self.equalmatrixori = 32 self.equalmatrix = '1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ff8000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000003fffffffffffffffffffffffff\ ffffffffffffffffffffffffffffffffffff' self.exclmatrixwid = 7 self.exclmatrixhei = 62 self.exclmatrixori = 0 self.exclmatrix = '3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffbe\ 7cf9f3e7cf9f3e3870e1c3870000000007fffffffffffffff' self.atmatrixwid = 78 self.atmatrixhei = 75 self.atmatrixori = -1 self.atmatrix = '3ffc000000000000001fffff80000000000003ffffffc000000000003fff\ ffffc00000000007ffffffffc0000000003fffffffffc000000003ffffff\ ffff800000003fffc000ffff80000001fff000007fff0000000fff000000\ 3ffe000000fff00000003ffc000007ff000000003ff800003ff000000000\ 7ff00001ff80000000007fe0000ffc0000000000ffc0007fc00000000001\ ff8001fe000000000003fe000ff0000000000007fc007fc000000000000f\ f801fe000003f800003fe00ff00000fff800007f807f80000ffff03f80ff\ 01fc00007ffff1fc03fc0ff00007ffffc7f007f83f80003ff03fbfc01fe1\ fe0001ff003ffe003f87f0000ff0007ff800fe1fc0007f8000ffe003fcfe\ 0001fc0003ff0007f3f8000fe00007fc001fcfc0007f80001ff0007f7f00\ 01fc00007fc001fdfc000fe00001fe0007f7f0003f800007f8001fdf8001\ fe00001fe0007f7e0007f000007f0001fff8001fc00003fc0007ffe0007f\ 00000ff0001fbf8003f800003f8000fefe000fe00000fe0003fbf8003f80\ 0007f8000fefe000fe00001fc0007f3f8003f800007f0001fcfe000fe000\ 03fc000ff3f8003f80000fe0003f8fe000fe00007f8001fe1fc003fc0001\ fe0007f07f0007f0000ff0003fc1fc001fe0007fc001fe07f8007f8003ff\ 000ff00fe000ff001ffe007fc03fc003fe00fff807fe00ff0007fe0feff8\ 7ff001fe000fffff3fffff8007f8001ffff8fffffc000ff0003fffc1ffff\ c0003fe0007ffc03fffc00007fc0003f8003ff800001ff80000000000000\ 0003ff000000000000000007fe00000000000000000ffc00000000000000\ 001ffc00000000000000003ff800000000000000007ff800000000000000\ 00fff80000000000000001fffc000003c000000001ffff0001ff80000000\ 03fffffffffe0000000003fffffffff80000000003fffffffff000000000\ 03ffffffff800000000001fffffff0000000000000fffffc000000000000\ 001ffc00000000' self.hashmatrixwid = 45 self.hashmatrixhei = 60 self.hashmatrixori = 3 self.hashmatrix = '7e003f000007f003f800003f801fc00001f800fe00000fc007e000007e00\ 3f000007f003f800003f801fc00001fc00fe00000fc007e000007e003f00\ 0003f001f800003f801fc00001fc00fe00000fc007e000007e003f001fff\ fffffff8ffffffffffc7fffffffffe3ffffffffff1ffffffffff8fffffff\ fffc003f801fc00001fc00fe00000fe007f000007e003f000003f001f800\ 001f800fc00001fc00fe00000fe007f000007f003f800003f001f800001f\ 800fc00000fc007e00000fe007f000007f003f800003f001fc007fffffff\ ffe3ffffffffff1ffffffffff8ffffffffffc7fffffffffe3ffffffffff0\ 00fc007e00000fe003f000007f003f800003f801fc00001f800fe00000fc\ 007e000007e003f000007f003f800003f801fc00001f800fe00000fc007e\ 000007e003f000007f003f800003f801fc00001f800fe00000fc007e0000\ 07e003f0000' self.dollarmatrixwid = 41 self.dollarmatrixhei = 77 self.dollarmatrixori = -4 self.dollarmatrix = '7c000000003e000000001f000000000f8000000007c00000000ffc000000\ 7fffc00000fffff80001ffffff0003ffffffc003fffffff003ffcf8ffc01\ ff07c1fe01fe03e07f80fe01f01fc0fe00f80ff07f007c03f83f003e01fc\ 3f801f007f1fc00f803f8fe007c01fc7f003e00fe3f801f00001fc00f800\ 00fe007c00007f803e00001fc01f00000ff00f800007fc07c00001ff83e0\ 00007ff1f000003ffff800000ffffe000003fffff00000ffffff00001fff\ ffe00003fffff800003fffff000003ffffc00000fffff000007c7ff80000\ 3e0ffe00001f01ff00000f807fc00007c01fe00003e007f00001f001f800\ 00f800fffc007c007ffe003e003fff001f001fff800f800fffc007c007ff\ f003e003f3f801f001f9fc00f801fcff007c00fe3f803e00fe1fe01f00ff\ 0ff80f80ff03ff07c1ff80ffe3e3ff803fffffff800fffffff8003ffffff\ 80007fffff00000ffffe0000007ff000000007c000000003e000000001f0\ 00000000f8000000007c000000003e000000001f000000000f8000000007\ c0000' self.percentmatrixwid = 71 self.percentmatrixhei = 61 self.percentmatrixori = 2 self.percentmatrix = '1f00000000000000007e0000003fc0000001f8000003fff0000003e00000\ 0ffff800000fc000007ffff800001f000001fffff800007e000007fffff8\ 0000f800000ff81ff80003f000003fc00ff00007c00000ff000ff0001f80\ 0001fc000fe0003e000003f0000fc000fc00000fe0001fc003f000001f80\ 001f8007e000003f00003f001f8000007e00007e003e000000fc0000fc00\ fc000001f80001f801f0000003f80007f007e0000003f0000fc00f800000\ 07f0003f803f0000000ff000ff00fc0000000ff003fc01f80000000ff81f\ f007e00000001fffffe00fc00000001fffff803f000000001ffffe007c00\ 0000000ffff001f80000000007ff8003e00000000001fc000fc000000000\ 0000001f00000000000000007e0000000000000001f80007f00000000003\ f0007ffc000000000fc003fffe000000001f800ffffe000000007e003fff\ fe00000000f800fffffe00000003f003fe03fe00000007c007f803fc0000\ 001f801fc001fc0000007e003f8003f8000000fc007e0003f0000003f001\ f80003f0000007e003f00007e000001f8007e0000fc000003f000fc0001f\ 800000fc001f80003f000001f0003f00007e000007e0003f0001f800000f\ 80007f0007f000003f0000fe000fe00000fc0000ff007f800001f80001ff\ 01ff000007e00001fffffc00000fc00001fffff000003f000001ffffc000\ 007e000001ffff000001f8000000fff8000007f00000003f800' self.hatmatrixwid = 32 self.hatmatrixhei = 32 self.hatmatrixori = 2 self.hatmatrix = '7e000000ff000000ff000001ff000001ff800001ff800003ffc00003ffc0\ 0007e7c00007e7e00007c7e0000fc3f0000fc3f0001f81f0001f81f8001f\ 01f8003f00fc003f00fc007e007c007e007e007c007e00fc003f00fc003f\ 01f8001f81f8001f81f0001f83f0000fc3f0000fc7e00007e7e00007efc0\ 0003efc00003f' self.ampmatrixwid = 50 self.ampmatrixhei = 62 self.ampmatrixori = 2 self.ampmatrix = '3fc0000000007ffe000000007fffc00000003ffffc0000001fffff800000\ 0fffffe0000007fc07fc000001fe00ff800000fe001fe000003f8003f800\ 001fc0007f000007f0001fc00001fc0007f000007f0001fc00001fc0007f\ 000007f0001fc00000fe000fe000003f8003f800000ff001fe000001fe00\ ff0000007f80ffc000000ff07fe0000001fe3ff00000007ffff80000000f\ fff800000001fffc000000007ffc000000001ffe000000001fff00000000\ 0fffe00000000ffffc00000007feff80000003ff1ff003f801ff07fe00fe\ 00ff80ff803f807fc01ff00fe03fe003fe07f00ff0007fc1fc07f8000ff8\ 7f01fc0003ff3fc07f00007fcfe03f80000ffff80fe00001fffc03f80000\ 3fff00fe000007ff803f800001ffe00fe000003ff003f8000007fc00ff00\ 0001ff801fc00000fff007f800007ffe01ff00003fffc03fe0001ffff00f\ fc001ffbfe01ffe03ffc7fc07ffffffe0ff80fffffff03ff01ffffff807f\ c03fffff800ff803ffffc001ff003fff8000000000ff0000000' self.strixmatrixwid = 25 self.strixmatrixhei = 24 self.strixmatrixori = 0 self.strixmatrix = '3e00001f00000f800007c00003e00001f00100f804e07c0efe3e3fffffff\ fffffffffffff0ffff8007fc0003fe0003ff8001ffc001fbf001f8fc01f8\ 3f01fc1fc0fc07e01c01c00600c0' self.opencparmatrixwid = 18 self.opencparmatrixhei = 80 self.opencparmatrixori = 0 self.opencparmatrix = '3c001f000f8007e001f000f8003e001f000fc003f001f8007e001f000fc0\ 03e001f8007e003f800fc003f001fc007e001f8007e003f800fc003f000f\ c007f001fc007f001f8007e001f800fe003f800fe003f800fe003f800fe0\ 03f800fe003f800fe003f8007e001f8007e001fc007f001fc003f000fc00\ 3f000fe003f8007e001f8007f000fc003f000fc001f8007e000f8003f000\ fc001f8007e000f8003f0007c000f8003e0007c001f0003e0007c001f' self.closecparmatrixwid = 18 self.closecparmatrixhei = 80 self.closecparmatrixori = 0 self.closecparmatrix = 'f0003e0007c001f8003e0007c001f0007e000fc003f0007e001f8003e000\ fc003f0007e001f8007f000fc003f000fe001f8007e001f8007f000fc003\ f000fc003f800fe003f8007e001f8007e001fc007f001fc007f001fc007f\ 001fc007f001fc007f001fc007f001f8007e001f800fe003f800fe003f00\ 0fc003f001fc007f001f8007e003f800fc003f000fc007e001f8007c003f\ 000fc007e001f8007c003f000f8007c001f000f8003e001f000f8003e000' self.opensparmatrixwid = 16 self.opensparmatrixhei = 80 self.opensparmatrixori = 0 self.opensparmatrix = 'fffffffffffffffffffffffffe00fe00fe00fe00fe00fe00fe00fe00fe00\ fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00\ fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00\ fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00\ fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00fe00ffff\ ffffffffffffffffffff' self.closesparmatrixwid = 16 self.closesparmatrixhei = 80 self.closesparmatrixori = 0 self.closesparmatrix = 'ffffffffffffffffffffffff007f007f007f007f007f007f007f007f007f\ 007f007f007f007f007f007f007f007f007f007f007f007f007f007f007f\ 007f007f007f007f007f007f007f007f007f007f007f007f007f007f007f\ 007f007f007f007f007f007f007f007f007f007f007f007f007f007f007f\ 007f007f007f007f007f007f007f007f007f007f007f007f007f007fffff\ ffffffffffffffffffff' self.backslashmatrixwid = 25 self.backslashmatrixhei = 63 self.backslashmatrixori = 0 self.backslashmatrix = '7c00001e00000f800007c00001e00000f800007c00003e00000f000007c0\ 0003e00000f000007c00003e00000f000007c00003e00000f000007c0000\ 3e00000f000007c00003e00000f000007c00003e00000f000007c00003e0\ 0000f000007c00003e00001f000007800003e00001f000007800003e0000\ 1f000007800003e00001f000007800003e00001f000007800003e00001f0\ 00007800003e00001f000007800003e00001f000007800003e00001f0000\ 0f800003c00001f00000f800003c00001f' self.semicolmatrixwid = 9 self.semicolmatrixhei = 57 self.semicolmatrixori = 17 self.semicolmatrix = '1ffffffffffffffffffff000000000000000000000000000000000000000\ 0000000000000000000001ffffffffffffffffffff0783c1e0f078383c1e\ 1e7e3e1c0' self.postmatrixwid = 8 self.postmatrixhei = 21 self.postmatrixori = 2 self.postmatrix = 'ffffffffffffffffffffffff7e7e7e7e7e3c3c3c3c' self.commamatrixwid = 9 self.commamatrixhei = 21 self.commamatrixori = 53 self.commamatrix = '1ffffffffffffffffffff0783c1e0f078383c1e1e7e3e1c0' self.fullstopmatrixwid = 9 self.fullstopmatrixhei = 9 self.fullstopmatrixori = 53 self.fullstopmatrix = '1ffffffffffffffffffff' self.forslashmatrixwid = 25 self.forslashmatrixhei = 63 self.forslashmatrixori = 0 self.forslashmatrix = '7c00003c00003e00001f00000f00000f800007c00003e00001e00001f000\ 00f800007800007c00003e00001e00001f00000f800007800007c00003e0\ 0001e00001f00000f800007800007c00003e00001e00001f00000f800007\ 800007c00003e00001f00000f00000f800007c00003c00003e00001f0000\ 0f00000f800007c00003c00003e00001f00000f00000f800007c00003c00\ 003e00001f00000f00000f800007c00003c00003e00001f00000f8000078\ 00007c00003e00001e00001f00000' self.lesthanmatrixwid = 41 self.lesthanmatrixhei = 41 self.lesthanmatrixori = 22 self.lesthanmatrix = '10000000003800000000fc00000001fe00000007ff0000000fff8000001f\ ffc000007fff800000ffff000001fffc000007fff800000fffe000001fff\ c000007fff000000fffe000003fffc000007fff000000fffe0000007ff80\ 000003ff00000001fe00000000ffe00000007ffc0000003fffc0000003ff\ f80000007fff0000000ffff0000000fffe0000001fffe0000003fffc0000\ 003fff80000007fff8000000ffff0000000ffff0000001fffc0000001ffe\ 00000003ff000000007f8000000007c000000000e0000000001' self.greatthanmatrixwid = 42 self.greatthanmatrixhei = 41 self.greatthanmatrixori = 22 self.greatthanmatrix = '30000000000f0000000003f000000000ff800000003ff80000000fffc000\ 0003fffc0000003fffc0000001fffe0000001fffe0000000fffe0000000f\ fff0000000ffff00000007fff00000007fff80000003fff80000003fffc0\ 000003fffc0000001fff00000001ffc00000000ff00000001ffc0000001f\ ff0000003fff8000003fff8000003fff8000007fff0000007fff000000ff\ ff000000fffe000001fffe000001fffe000003fffc000003fffc000003ff\ f8000000fff80000003ff80000000ff000000003f000000000f000000000\ 20000000000' self.questionmatrixwid = 36 self.questionmatrixhei = 63 self.questionmatrixori = -1 self.questionmatrix = '7fe000003fffe0000fffff8003fffffc007fffffe00fffffff00fffffff8\ 1ff801ffc3fe0007fc3fc0003fe3f80001fe7f80000fe7f00000ff7f0000\ 07f7e000007ffe000007ffe000007ffe000007ffe000007ffe000007f000\ 0000fe0000000fe0000001fe0000003fc0000003fc0000007f8000000ff0\ 000001ff0000003fe0000007fc000000ff8000001ff0000003fc0000007f\ 8000000ff0000000ff0000001fe0000001fc0000003fc0000003f8000000\ 3f80000003f80000003f80000003f80000003f80000003f8000000000000\ 000000000000000000000000000000000000000000000000000000000000\ 0000003f80000003f80000003f80000003f80000003f80000003f8000000\ 3f80000003f80000003f8000' self.colonmatrixwid = 9 self.colonmatrixhei = 45 self.colonmatrixori = 17 self.colonmatrix = '1ffffffffffffffffffff000000000000000000000000000000000000000\ 0000000000000000000001ffffffffffffffffffff' self.quotematrixwid = 22 self.quotematrixhei = 21 self.quotematrixori = 2 self.quotematrix = '3fc0ffff03fffc0ffff03fffc0ffff03fffc0ffff03fffc0ffff03fffc0f\ ffffffdf807e7e01f9f807e7e01f9f807e3c00f0f003c3c00f0f003c' self.opensquigmatrixwid = 19 self.opensquigmatrixhei = 80 self.opensquigmatrixori = 0 self.opensquigmatrix = '7e007fc01ff807ff00ffe03ffc07f800fe003f8007f000fe001fc003f800\ 7f000fe001fc003f8007f000fe001fc003f8007f000fe001fc003f8007f0\ 00fe001fc003f8007f000fe001fc007f000fe003fc00ff007fc01ff803fc\ 007f000fe001fe003fe001fe001fe001fc001fc003f8003f0007e000fe00\ 1fc003f8007f000fe001fc003f8007f000fe001fc003f8007f000fe001fc\ 003f8007f000fe001fc003f8007f000fe001fc001fc003fc007ff807ff00\ ffe00ffc00ff8003f' self.closesquigmatrixwid = 20 self.closesquigmatrixhei = 80 self.closesquigmatrixori = 0 self.closesquigmatrix = 'fe000ffc00ffe00fff00fff00fff8007f8003f8001fc001fc001fc001fc0\ 01fc001fc001fc001fc001fc001fc001fc001fc001fc001fc001fc001fc0\ 01fc001fc001fc001fc001fc001fc001fc000fc000fe000fe0007f0007f8\ 003fe001ff000ff0007f0007f000ff001ff003fe007f8007f000fe000fe0\ 00fc001fc001fc001fc001fc001fc001fc001fc001fc001fc001fc001fc0\ 01fc001fc001fc001fc001fc001fc001fc001fc001fc001fc001fc001fc0\ 03f8007f80fff80fff00fff00ffe00ff800fe000' self.barmatrixwid = 5 self.barmatrixhei = 80 self.barmatrixori = 0 self.barmatrix = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffffffffffffffffffffffffffffffffffff' self.miscmatrixwid = 46 self.miscmatrixhei = 80 self.miscmatrixori = 0 self.miscmatrix = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffffff8000000007fe000000001ff8000000007fe000000001ff8000\ 000007fe000000001ff8000000007fe000000001ff8000000007fe000000\ 001ff8000000007fe000000001ff8000000007fe000000001ff800000000\ 7fe000000001ff8000000007fe000000001ff8000000007fe000000001ff\ 8000000007fe000000001ff8000000007fe000000001ff8000000007fe00\ 0000001ff8000000007fe000000001ff8000000007fe000000001ff80000\ 00007fe000000001ff8000000007fe000000001ff8000000007fe0000000\ 01ff8000000007fe000000001ff8000000007fe000000001ff8000000007\ fe000000001ff8000000007fe000000001ff8000000007fe000000001ff8\ 000000007fe000000001ff8000000007fe000000001ff8000000007fe000\ 000001ff8000000007fe000000001ff8000000007fe000000001ff800000\ 0007fe000000001ff8000000007fe000000001ff8000000007fe00000000\ 1ff8000000007fe000000001ff8000000007fe000000001ff8000000007f\ e000000001ffffffffffffffffffffffffffffffffffffffffffffffffff\ ffffffffffffffffffff' def writea(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.amatrix) charstring = (self.amatrixwid * self.amatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.amatrixwid * self.amatrixhei: charstring = charstring[0 - self.amatrixwid * self.amatrixhei:] for i in range(0, len(charstring), self.amatrixwid): for j in range(i, i + self.amatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.amatrixori - self.amatrixwid + j / self.amatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.amatrixori + j / self.amatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.amatrixori + j / self.amatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.amatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.amatrixori + j / self.amatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.amatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.amatrixwid) * sizeratio) - k, y + int((self.defsize - (self.amatrixori + j / self.amatrixwid)) * sizeratio) - l) def writeb(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.bmatrix) charstring = (self.bmatrixwid * self.bmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.bmatrixwid * self.bmatrixhei: charstring = charstring[0 - self.bmatrixwid * self.bmatrixhei:] for i in range(0, len(charstring), self.bmatrixwid): for j in range(i, i + self.bmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.bmatrixori - self.bmatrixwid + j / self.bmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.bmatrixori + j / self.bmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.bmatrixori + j / self.bmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.bmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.bmatrixori + j / self.bmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.bmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.bmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.bmatrixori + j / self.bmatrixwid)) * sizeratio) - l) def writec(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.cmatrix) charstring = (self.cmatrixwid * self.cmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.cmatrixwid * self.cmatrixhei: charstring = charstring[0 - self.cmatrixwid * self.cmatrixhei:] for i in range(0, len(charstring), self.cmatrixwid): for j in range(i, i + self.cmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.cmatrixori - self.cmatrixwid + j / self.cmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.cmatrixori + j / self.cmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.cmatrixori + j / self.cmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.cmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.cmatrixori + j / self.cmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.cmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.cmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.cmatrixori + j / self.cmatrixwid)) * sizeratio) - l) def writed(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.dmatrix) charstring = (self.dmatrixwid * self.dmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.dmatrixwid * self.dmatrixhei: charstring = charstring[0 - self.dmatrixwid * self.dmatrixhei:] for i in range(0, len(charstring), self.dmatrixwid): for j in range(i, i + self.dmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.dmatrixori - self.dmatrixwid + j / self.dmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.dmatrixori + j / self.dmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.dmatrixori + j / self.dmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.dmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.dmatrixori + j / self.dmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.dmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.dmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.dmatrixori + j / self.dmatrixwid)) * sizeratio) - l) def writee(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.ematrix) charstring = (self.ematrixwid * self.ematrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.ematrixwid * self.ematrixhei: charstring = charstring[0 - self.ematrixwid * self.ematrixhei:] for i in range(0, len(charstring), self.ematrixwid): for j in range(i, i + self.ematrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.ematrixori - self.ematrixwid + j / self.ematrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.ematrixori + j / self.ematrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.ematrixori + j / self.ematrixwid) * sizeratio) - l - self.defsize, x + int((j % self.ematrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.ematrixori + j / self.ematrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.ematrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.ematrixwid) * sizeratio) - k, y + int((self.defsize - (self.ematrixori + j / self.ematrixwid)) * sizeratio) - l) def writef(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.fmatrix) charstring = (self.fmatrixwid * self.fmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.fmatrixwid * self.fmatrixhei: charstring = charstring[0 - self.fmatrixwid * self.fmatrixhei:] for i in range(0, len(charstring), self.fmatrixwid): for j in range(i, i + self.fmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.fmatrixori - self.fmatrixwid + j / self.fmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.fmatrixori + j / self.fmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.fmatrixori + j / self.fmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.fmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.fmatrixori + j / self.fmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.fmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.fmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.fmatrixori + j / self.fmatrixwid)) * sizeratio) - l) def writeg(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.gmatrix) charstring = (self.gmatrixwid * self.gmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.gmatrixwid * self.gmatrixhei: charstring = charstring[0 - self.gmatrixwid * self.gmatrixhei:] for i in range(0, len(charstring), self.gmatrixwid): for j in range(i, i + self.gmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.gmatrixori - self.gmatrixwid + j / self.gmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.gmatrixori + j / self.gmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.gmatrixori + j / self.gmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.gmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.gmatrixori + j / self.gmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.gmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.gmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.gmatrixori + j / self.gmatrixwid)) * sizeratio) - l) def writeh(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.hmatrix) charstring = (self.hmatrixwid * self.hmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.hmatrixwid * self.hmatrixhei: charstring = charstring[0 - self.hmatrixwid * self.hmatrixhei:] for i in range(0, len(charstring), self.hmatrixwid): for j in range(i, i + self.hmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.hmatrixori - self.hmatrixwid + j / self.hmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.hmatrixori + j / self.hmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.hmatrixori + j / self.hmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.hmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.hmatrixori + j / self.hmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.hmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.hmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.hmatrixori + j / self.hmatrixwid)) * sizeratio) - l) def writei(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.imatrix) charstring = (self.imatrixwid * self.imatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.imatrixwid * self.imatrixhei: charstring = charstring[0 - self.imatrixwid * self.imatrixhei:] for i in range(0, len(charstring), self.imatrixwid): for j in range(i, i + self.imatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.imatrixori - self.imatrixwid + j / self.imatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.imatrixori + j / self.imatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.imatrixori + j / self.imatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.imatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.imatrixori + j / self.imatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.imatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.imatrixwid) * sizeratio) - k, y + int((self.defsize - (self.imatrixori + j / self.imatrixwid)) * sizeratio) - l) def writej(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.jmatrix) charstring = (self.jmatrixwid * self.jmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.jmatrixwid * self.jmatrixhei: charstring = charstring[0 - self.jmatrixwid * self.jmatrixhei:] for i in range(0, len(charstring), self.jmatrixwid): for j in range(i, i + self.jmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.jmatrixori - self.jmatrixwid + j / self.jmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.jmatrixori + j / self.jmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.jmatrixori + j / self.jmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.jmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.jmatrixori + j / self.jmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.jmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.jmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.jmatrixori + j / self.jmatrixwid)) * sizeratio) - l) def writek(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.kmatrix) charstring = (self.kmatrixwid * self.kmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.kmatrixwid * self.kmatrixhei: charstring = charstring[0 - self.kmatrixwid * self.kmatrixhei:] for i in range(0, len(charstring), self.kmatrixwid): for j in range(i, i + self.kmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.kmatrixori - self.kmatrixwid + j / self.kmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.kmatrixori + j / self.kmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.kmatrixori + j / self.kmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.kmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.kmatrixori + j / self.kmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.kmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.kmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.kmatrixori + j / self.kmatrixwid)) * sizeratio) - l) def writel(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.lmatrix) charstring = (self.lmatrixwid * self.lmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.lmatrixwid * self.lmatrixhei: charstring = charstring[0 - self.lmatrixwid * self.lmatrixhei:] for i in range(0, len(charstring), self.lmatrixwid): for j in range(i, i + self.lmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.lmatrixori - self.lmatrixwid + j / self.lmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.lmatrixori + j / self.lmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.lmatrixori + j / self.lmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.lmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.lmatrixori + j / self.lmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.lmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.lmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.lmatrixori + j / self.lmatrixwid)) * sizeratio) - l) def writem(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.mmatrix) charstring = (self.mmatrixwid * self.mmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.mmatrixwid * self.mmatrixhei: charstring = charstring[0 - self.mmatrixwid * self.mmatrixhei:] for i in range(0, len(charstring), self.mmatrixwid): for j in range(i, i + self.mmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.mmatrixori - self.mmatrixwid + j / self.mmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.mmatrixori + j / self.mmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.mmatrixori + j / self.mmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.mmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.mmatrixori + j / self.mmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.mmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.mmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.mmatrixori + j / self.mmatrixwid)) * sizeratio) - l) def writen(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.nmatrix) charstring = (self.nmatrixwid * self.nmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.nmatrixwid * self.nmatrixhei: charstring = charstring[0 - self.nmatrixwid * self.nmatrixhei:] for i in range(0, len(charstring), self.nmatrixwid): for j in range(i, i + self.nmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.nmatrixori - self.nmatrixwid + j / self.nmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.nmatrixori + j / self.nmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.nmatrixori + j / self.nmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.nmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.nmatrixori + j / self.nmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.nmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.nmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.nmatrixori + j / self.nmatrixwid)) * sizeratio) - l) def writeo(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.omatrix) charstring = (self.omatrixwid * self.omatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.omatrixwid * self.omatrixhei: charstring = charstring[0 - self.omatrixwid * self.omatrixhei:] for i in range(0, len(charstring), self.omatrixwid): for j in range(i, i + self.omatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.omatrixori - self.omatrixwid + j / self.omatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.omatrixori + j / self.omatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.omatrixori + j / self.omatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.omatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.omatrixori + j / self.omatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.omatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.omatrixwid) * sizeratio) - k, y + int((self.defsize - (self.omatrixori + j / self.omatrixwid)) * sizeratio) - l) def writep(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.pmatrix) charstring = (self.pmatrixwid * self.pmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.pmatrixwid * self.pmatrixhei: charstring = charstring[0 - self.pmatrixwid * self.pmatrixhei:] for i in range(0, len(charstring), self.pmatrixwid): for j in range(i, i + self.pmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.pmatrixori - self.pmatrixwid + j / self.pmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.pmatrixori + j / self.pmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.pmatrixori + j / self.pmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.pmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.pmatrixori + j / self.pmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.pmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.pmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.pmatrixori + j / self.pmatrixwid)) * sizeratio) - l) def writeq(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.qmatrix) charstring = (self.qmatrixwid * self.qmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.qmatrixwid * self.qmatrixhei: charstring = charstring[0 - self.qmatrixwid * self.qmatrixhei:] for i in range(0, len(charstring), self.qmatrixwid): for j in range(i, i + self.qmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.qmatrixori - self.qmatrixwid + j / self.qmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.qmatrixori + j / self.qmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.qmatrixori + j / self.qmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.qmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.qmatrixori + j / self.qmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.qmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.qmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.qmatrixori + j / self.qmatrixwid)) * sizeratio) - l) def writer(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.rmatrix) charstring = (self.rmatrixwid * self.rmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.rmatrixwid * self.rmatrixhei: charstring = charstring[0 - self.rmatrixwid * self.rmatrixhei:] for i in range(0, len(charstring), self.rmatrixwid): for j in range(i, i + self.rmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.rmatrixori - self.rmatrixwid + j / self.rmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.rmatrixori + j / self.rmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.rmatrixori + j / self.rmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.rmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.rmatrixori + j / self.rmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.rmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.rmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.rmatrixori + j / self.rmatrixwid)) * sizeratio) - l) def writes(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.smatrix) charstring = (self.smatrixwid * self.smatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.smatrixwid * self.smatrixhei: charstring = charstring[0 - self.smatrixwid * self.smatrixhei:] for i in range(0, len(charstring), self.smatrixwid): for j in range(i, i + self.smatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.smatrixori - self.smatrixwid + j / self.smatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.smatrixori + j / self.smatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.smatrixori + j / self.smatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.smatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.smatrixori + j / self.smatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.smatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.smatrixwid) * sizeratio) - k, y + int((self.defsize - (self.smatrixori + j / self.smatrixwid)) * sizeratio) - l) def writet(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.tmatrix) charstring = (self.tmatrixwid * self.tmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.tmatrixwid * self.tmatrixhei: charstring = charstring[0 - self.tmatrixwid * self.tmatrixhei:] for i in range(0, len(charstring), self.tmatrixwid): for j in range(i, i + self.tmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.tmatrixori - self.tmatrixwid + j / self.tmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.tmatrixori + j / self.tmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.tmatrixori + j / self.tmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.tmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.tmatrixori + j / self.tmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.tmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.tmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.tmatrixori + j / self.tmatrixwid)) * sizeratio) - l) def writeu(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.umatrix) charstring = (self.umatrixwid * self.umatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.umatrixwid * self.umatrixhei: charstring = charstring[0 - self.umatrixwid * self.umatrixhei:] for i in range(0, len(charstring), self.umatrixwid): for j in range(i, i + self.umatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.umatrixori - self.umatrixwid + j / self.umatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.umatrixori + j / self.umatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.umatrixori + j / self.umatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.umatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.umatrixori + j / self.umatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.umatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.umatrixwid) * sizeratio) - k, y + int((self.defsize - (self.umatrixori + j / self.umatrixwid)) * sizeratio) - l) def writev(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.vmatrix) charstring = (self.vmatrixwid * self.vmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.vmatrixwid * self.vmatrixhei: charstring = charstring[0 - self.vmatrixwid * self.vmatrixhei:] for i in range(0, len(charstring), self.vmatrixwid): for j in range(i, i + self.vmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.vmatrixori - self.vmatrixwid + j / self.vmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.vmatrixori + j / self.vmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.vmatrixori + j / self.vmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.vmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.vmatrixori + j / self.vmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.vmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.vmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.vmatrixori + j / self.vmatrixwid)) * sizeratio) - l) def writew(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.wmatrix) charstring = (self.wmatrixwid * self.wmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.wmatrixwid * self.wmatrixhei: charstring = charstring[0 - self.wmatrixwid * self.wmatrixhei:] for i in range(0, len(charstring), self.wmatrixwid): for j in range(i, i + self.wmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.wmatrixori - self.wmatrixwid + j / self.wmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.wmatrixori + j / self.wmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.wmatrixori + j / self.wmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.wmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.wmatrixori + j / self.wmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.wmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.wmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.wmatrixori + j / self.wmatrixwid)) * sizeratio) - l) def writex(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.xmatrix) charstring = (self.xmatrixwid * self.xmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.xmatrixwid * self.xmatrixhei: charstring = charstring[0 - self.xmatrixwid * self.xmatrixhei:] for i in range(0, len(charstring), self.xmatrixwid): for j in range(i, i + self.xmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.xmatrixori - self.xmatrixwid + j / self.xmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.xmatrixori + j / self.xmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.xmatrixori + j / self.xmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.xmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.xmatrixori + j / self.xmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.xmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.xmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.xmatrixori + j / self.xmatrixwid)) * sizeratio) - l) def writey(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.ymatrix) charstring = (self.ymatrixwid * self.ymatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.ymatrixwid * self.ymatrixhei: charstring = charstring[0 - self.ymatrixwid * self.ymatrixhei:] for i in range(0, len(charstring), self.ymatrixwid): for j in range(i, i + self.ymatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.ymatrixori - self.ymatrixwid + j / self.ymatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.ymatrixori + j / self.ymatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.ymatrixori + j / self.ymatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.ymatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.ymatrixori + j / self.ymatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.ymatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.ymatrixwid) * sizeratio) - k, y + int((self.defsize - (self.ymatrixori + j / self.ymatrixwid)) * sizeratio) - l) def writez(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.zmatrix) charstring = (self.zmatrixwid * self.zmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.zmatrixwid * self.zmatrixhei: charstring = charstring[0 - self.zmatrixwid * self.zmatrixhei:] for i in range(0, len(charstring), self.zmatrixwid): for j in range(i, i + self.zmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.zmatrixori - self.zmatrixwid + j / self.zmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.zmatrixori + j / self.zmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.zmatrixori + j / self.zmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.zmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.zmatrixori + j / self.zmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.zmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.zmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.zmatrixori + j / self.zmatrixwid)) * sizeratio) - l) def writeA(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Amatrix) charstring = (self.Amatrixwid * self.Amatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Amatrixwid * self.Amatrixhei: charstring = charstring[0 - self.Amatrixwid * self.Amatrixhei:] for i in range(0, len(charstring), self.Amatrixwid): for j in range(i, i + self.Amatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Amatrixori - self.Amatrixwid + j / self.Amatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Amatrixori + j / self.Amatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Amatrixori + j / self.Amatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Amatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Amatrixori + j / self.Amatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Amatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Amatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Amatrixori + j / self.Amatrixwid)) * sizeratio) - l) def writeB(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Bmatrix) charstring = (self.Bmatrixwid * self.Bmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Bmatrixwid * self.Bmatrixhei: charstring = charstring[0 - self.Bmatrixwid * self.Bmatrixhei:] for i in range(0, len(charstring), self.Bmatrixwid): for j in range(i, i + self.Bmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Bmatrixori - self.Bmatrixwid + j / self.Bmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Bmatrixori + j / self.Bmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Bmatrixori + j / self.Bmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Bmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Bmatrixori + j / self.Bmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Bmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Bmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Bmatrixori + j / self.Bmatrixwid)) * sizeratio) - l) def writeC(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Cmatrix) charstring = (self.Cmatrixwid * self.Cmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Cmatrixwid * self.Cmatrixhei: charstring = charstring[0 - self.Cmatrixwid * self.Cmatrixhei:] for i in range(0, len(charstring), self.Cmatrixwid): for j in range(i, i + self.Cmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Cmatrixori - self.Cmatrixwid + j / self.Cmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Cmatrixori + j / self.Cmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Cmatrixori + j / self.Cmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Cmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Cmatrixori + j / self.Cmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Cmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Cmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Cmatrixori + j / self.Cmatrixwid)) * sizeratio) - l) def writeD(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Dmatrix) charstring = (self.Dmatrixwid * self.Dmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Dmatrixwid * self.Dmatrixhei: charstring = charstring[0 - self.Dmatrixwid * self.Dmatrixhei:] for i in range(0, len(charstring), self.Dmatrixwid): for j in range(i, i + self.Dmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Dmatrixori - self.Dmatrixwid + j / self.Dmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Dmatrixori + j / self.Dmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Dmatrixori + j / self.Dmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Dmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Dmatrixori + j / self.Dmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Dmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Dmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Dmatrixori + j / self.Dmatrixwid)) * sizeratio) - l) def writeE(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Ematrix) charstring = (self.Ematrixwid * self.Ematrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Ematrixwid * self.Ematrixhei: charstring = charstring[0 - self.Ematrixwid * self.Ematrixhei:] for i in range(0, len(charstring), self.Ematrixwid): for j in range(i, i + self.Ematrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Ematrixori - self.Ematrixwid + j / self.Ematrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Ematrixori + j / self.Ematrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Ematrixori + j / self.Ematrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Ematrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Ematrixori + j / self.Ematrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Ematrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Ematrixwid) * sizeratio) - k, y + int((self.defsize - (self.Ematrixori + j / self.Ematrixwid)) * sizeratio) - l) def writeF(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Fmatrix) charstring = (self.Fmatrixwid * self.Fmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Fmatrixwid * self.Fmatrixhei: charstring = charstring[0 - self.Fmatrixwid * self.Fmatrixhei:] for i in range(0, len(charstring), self.Fmatrixwid): for j in range(i, i + self.Fmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Fmatrixori - self.Fmatrixwid + j / self.Fmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Fmatrixori + j / self.Fmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Fmatrixori + j / self.Fmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Fmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Fmatrixori + j / self.Fmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Fmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Fmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Fmatrixori + j / self.Fmatrixwid)) * sizeratio) - l) def writeG(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Gmatrix) charstring = (self.Gmatrixwid * self.Gmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Gmatrixwid * self.Gmatrixhei: charstring = charstring[0 - self.Gmatrixwid * self.Gmatrixhei:] for i in range(0, len(charstring), self.Gmatrixwid): for j in range(i, i + self.Gmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Gmatrixori - self.Gmatrixwid + j / self.Gmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Gmatrixori + j / self.Gmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Gmatrixori + j / self.Gmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Gmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Gmatrixori + j / self.Gmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Gmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Gmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Gmatrixori + j / self.Gmatrixwid)) * sizeratio) - l) def writeH(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Hmatrix) charstring = (self.Hmatrixwid * self.Hmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Hmatrixwid * self.Hmatrixhei: charstring = charstring[0 - self.Hmatrixwid * self.Hmatrixhei:] for i in range(0, len(charstring), self.Hmatrixwid): for j in range(i, i + self.Hmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Hmatrixori - self.Hmatrixwid + j / self.Hmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Hmatrixori + j / self.Hmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Hmatrixori + j / self.Hmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Hmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Hmatrixori + j / self.Hmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Hmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Hmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Hmatrixori + j / self.Hmatrixwid)) * sizeratio) - l) def writeI(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Imatrix) charstring = (self.Imatrixwid * self.Imatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Imatrixwid * self.Imatrixhei: charstring = charstring[0 - self.Imatrixwid * self.Imatrixhei:] for i in range(0, len(charstring), self.Imatrixwid): for j in range(i, i + self.Imatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Imatrixori - self.Imatrixwid + j / self.Imatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Imatrixori + j / self.Imatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Imatrixori + j / self.Imatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Imatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Imatrixori + j / self.Imatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Imatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Imatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Imatrixori + j / self.Imatrixwid)) * sizeratio) - l) def writeJ(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Jmatrix) charstring = (self.Jmatrixwid * self.Jmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Jmatrixwid * self.Jmatrixhei: charstring = charstring[0 - self.Jmatrixwid * self.Jmatrixhei:] for i in range(0, len(charstring), self.Jmatrixwid): for j in range(i, i + self.Jmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Jmatrixori - self.Jmatrixwid + j / self.Jmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Jmatrixori + j / self.Jmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Jmatrixori + j / self.Jmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Jmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Jmatrixori + j / self.Jmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Jmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Jmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Jmatrixori + j / self.Jmatrixwid)) * sizeratio) - l) def writeK(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Kmatrix) charstring = (self.Kmatrixwid * self.Kmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Kmatrixwid * self.Kmatrixhei: charstring = charstring[0 - self.Kmatrixwid * self.Kmatrixhei:] for i in range(0, len(charstring), self.Kmatrixwid): for j in range(i, i + self.Kmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Kmatrixori - self.Kmatrixwid + j / self.Kmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Kmatrixori + j / self.Kmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Kmatrixori + j / self.Kmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Kmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Kmatrixori + j / self.Kmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Kmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Kmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Kmatrixori + j / self.Kmatrixwid)) * sizeratio) - l) def writeL(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Lmatrix) charstring = (self.Lmatrixwid * self.Lmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Lmatrixwid * self.Lmatrixhei: charstring = charstring[0 - self.Lmatrixwid * self.Lmatrixhei:] for i in range(0, len(charstring), self.Lmatrixwid): for j in range(i, i + self.Lmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Lmatrixori - self.Lmatrixwid + j / self.Lmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Lmatrixori + j / self.Lmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Lmatrixori + j / self.Lmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Lmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Lmatrixori + j / self.Lmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Lmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Lmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Lmatrixori + j / self.Lmatrixwid)) * sizeratio) - l) def writeM(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Mmatrix) charstring = (self.Mmatrixwid * self.Mmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Mmatrixwid * self.Mmatrixhei: charstring = charstring[0 - self.Mmatrixwid * self.Mmatrixhei:] for i in range(0, len(charstring), self.Mmatrixwid): for j in range(i, i + self.Mmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Mmatrixori - self.Mmatrixwid + j / self.Mmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Mmatrixori + j / self.Mmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Mmatrixori + j / self.Mmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Mmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Mmatrixori + j / self.Mmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Mmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Mmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Mmatrixori + j / self.Mmatrixwid)) * sizeratio) - l) def writeN(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Nmatrix) charstring = (self.Nmatrixwid * self.Nmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Nmatrixwid * self.Nmatrixhei: charstring = charstring[0 - self.Nmatrixwid * self.Nmatrixhei:] for i in range(0, len(charstring), self.Nmatrixwid): for j in range(i, i + self.Nmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Nmatrixori - self.Nmatrixwid + j / self.Nmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Nmatrixori + j / self.Nmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Nmatrixori + j / self.Nmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Nmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Nmatrixori + j / self.Nmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Nmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Nmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Nmatrixori + j / self.Nmatrixwid)) * sizeratio) - l) def writeO(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Omatrix) charstring = (self.Omatrixwid * self.Omatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Omatrixwid * self.Omatrixhei: charstring = charstring[0 - self.Omatrixwid * self.Omatrixhei:] for i in range(0, len(charstring), self.Omatrixwid): for j in range(i, i + self.Omatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Omatrixori - self.Omatrixwid + j / self.Omatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Omatrixori + j / self.Omatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Omatrixori + j / self.Omatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Omatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Omatrixori + j / self.Omatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Omatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Omatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Omatrixori + j / self.Omatrixwid)) * sizeratio) - l) def writeP(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Pmatrix) charstring = (self.Pmatrixwid * self.Pmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Pmatrixwid * self.Pmatrixhei: charstring = charstring[0 - self.Pmatrixwid * self.Pmatrixhei:] for i in range(0, len(charstring), self.Pmatrixwid): for j in range(i, i + self.Pmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Pmatrixori - self.Pmatrixwid + j / self.Pmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Pmatrixori + j / self.Pmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Pmatrixori + j / self.Pmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Pmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Pmatrixori + j / self.Pmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Pmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Pmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Pmatrixori + j / self.Pmatrixwid)) * sizeratio) - l) def writeQ(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Qmatrix) charstring = (self.Qmatrixwid * self.Qmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Qmatrixwid * self.Qmatrixhei: charstring = charstring[0 - self.Qmatrixwid * self.Qmatrixhei:] for i in range(0, len(charstring), self.Qmatrixwid): for j in range(i, i + self.Qmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Qmatrixori - self.Qmatrixwid + j / self.Qmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Qmatrixori + j / self.Qmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Qmatrixori + j / self.Qmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Qmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Qmatrixori + j / self.Qmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Qmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Qmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Qmatrixori + j / self.Qmatrixwid)) * sizeratio) - l) def writeR(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Rmatrix) charstring = (self.Rmatrixwid * self.Rmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Rmatrixwid * self.Rmatrixhei: charstring = charstring[0 - self.Rmatrixwid * self.Rmatrixhei:] for i in range(0, len(charstring), self.Rmatrixwid): for j in range(i, i + self.Rmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Rmatrixori - self.Rmatrixwid + j / self.Rmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Rmatrixori + j / self.Rmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Rmatrixori + j / self.Rmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Rmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Rmatrixori + j / self.Rmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Rmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Rmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Rmatrixori + j / self.Rmatrixwid)) * sizeratio) - l) def writeS(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Smatrix) charstring = (self.Smatrixwid * self.Smatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Smatrixwid * self.Smatrixhei: charstring = charstring[0 - self.Smatrixwid * self.Smatrixhei:] for i in range(0, len(charstring), self.Smatrixwid): for j in range(i, i + self.Smatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Smatrixori - self.Smatrixwid + j / self.Smatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Smatrixori + j / self.Smatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Smatrixori + j / self.Smatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Smatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Smatrixori + j / self.Smatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Smatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Smatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Smatrixori + j / self.Smatrixwid)) * sizeratio) - l) def writeT(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Tmatrix) charstring = (self.Tmatrixwid * self.Tmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Tmatrixwid * self.Tmatrixhei: charstring = charstring[0 - self.Tmatrixwid * self.Tmatrixhei:] for i in range(0, len(charstring), self.Tmatrixwid): for j in range(i, i + self.Tmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Tmatrixori - self.Tmatrixwid + j / self.Tmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Tmatrixori + j / self.Tmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Tmatrixori + j / self.Tmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Tmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Tmatrixori + j / self.Tmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Tmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Tmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Tmatrixori + j / self.Tmatrixwid)) * sizeratio) - l) def writeU(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Umatrix) charstring = (self.Umatrixwid * self.Umatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Umatrixwid * self.Umatrixhei: charstring = charstring[0 - self.Umatrixwid * self.Umatrixhei:] for i in range(0, len(charstring), self.Umatrixwid): for j in range(i, i + self.Umatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Umatrixori - self.Umatrixwid + j / self.Umatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Umatrixori + j / self.Umatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Umatrixori + j / self.Umatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Umatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Umatrixori + j / self.Umatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Umatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Umatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Umatrixori + j / self.Umatrixwid)) * sizeratio) - l) def writeV(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Vmatrix) charstring = (self.Vmatrixwid * self.Vmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Vmatrixwid * self.Vmatrixhei: charstring = charstring[0 - self.Vmatrixwid * self.Vmatrixhei:] for i in range(0, len(charstring), self.Vmatrixwid): for j in range(i, i + self.Vmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Vmatrixori - self.Vmatrixwid + j / self.Vmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Vmatrixori + j / self.Vmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Vmatrixori + j / self.Vmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Vmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Vmatrixori + j / self.Vmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Vmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Vmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Vmatrixori + j / self.Vmatrixwid)) * sizeratio) - l) def writeW(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Wmatrix) charstring = (self.Wmatrixwid * self.Wmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Wmatrixwid * self.Wmatrixhei: charstring = charstring[0 - self.Wmatrixwid * self.Wmatrixhei:] for i in range(0, len(charstring), self.Wmatrixwid): for j in range(i, i + self.Wmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Wmatrixori - self.Wmatrixwid + j / self.Wmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Wmatrixori + j / self.Wmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Wmatrixori + j / self.Wmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Wmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Wmatrixori + j / self.Wmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Wmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Wmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Wmatrixori + j / self.Wmatrixwid)) * sizeratio) - l) def writeX(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Xmatrix) charstring = (self.Xmatrixwid * self.Xmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Xmatrixwid * self.Xmatrixhei: charstring = charstring[0 - self.Xmatrixwid * self.Xmatrixhei:] for i in range(0, len(charstring), self.Xmatrixwid): for j in range(i, i + self.Xmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Xmatrixori - self.Xmatrixwid + j / self.Xmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Xmatrixori + j / self.Xmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Xmatrixori + j / self.Xmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Xmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Xmatrixori + j / self.Xmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Xmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Xmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Xmatrixori + j / self.Xmatrixwid)) * sizeratio) - l) def writeY(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Ymatrix) charstring = (self.Ymatrixwid * self.Ymatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Ymatrixwid * self.Ymatrixhei: charstring = charstring[0 - self.Ymatrixwid * self.Ymatrixhei:] for i in range(0, len(charstring), self.Ymatrixwid): for j in range(i, i + self.Ymatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Ymatrixori - self.Ymatrixwid + j / self.Ymatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Ymatrixori + j / self.Ymatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Ymatrixori + j / self.Ymatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Ymatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Ymatrixori + j / self.Ymatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Ymatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Ymatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Ymatrixori + j / self.Ymatrixwid)) * sizeratio) - l) def writeZ(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.Zmatrix) charstring = (self.Zmatrixwid * self.Zmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.Zmatrixwid * self.Zmatrixhei: charstring = charstring[0 - self.Zmatrixwid * self.Zmatrixhei:] for i in range(0, len(charstring), self.Zmatrixwid): for j in range(i, i + self.Zmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.Zmatrixori - self.Zmatrixwid + j / self.Zmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.Zmatrixori + j / self.Zmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.Zmatrixori + j / self.Zmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.Zmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.Zmatrixori + j / self.Zmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.Zmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.Zmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.Zmatrixori + j / self.Zmatrixwid)) * sizeratio) - l) def writeone(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.onematrix) charstring = (self.onematrixwid * self.onematrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.onematrixwid * self.onematrixhei: charstring = charstring[0 - self.onematrixwid * self.onematrixhei:] for i in range(0, len(charstring), self.onematrixwid): for j in range(i, i + self.onematrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.onematrixori - self.onematrixwid + j / self.onematrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.onematrixori + j / self.onematrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.onematrixori + j / self.onematrixwid) * sizeratio) - l - self.defsize, x + int((j % self.onematrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.onematrixori + j / self.onematrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.onematrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.onematrixwid) * sizeratio) - k, y + int((self.defsize - (self.onematrixori + j / self.onematrixwid)) * sizeratio) - l) def writetwo(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.twomatrix) charstring = (self.twomatrixwid * self.twomatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.twomatrixwid * self.twomatrixhei: charstring = charstring[0 - self.twomatrixwid * self.twomatrixhei:] for i in range(0, len(charstring), self.twomatrixwid): for j in range(i, i + self.twomatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.twomatrixori - self.twomatrixwid + j / self.twomatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.twomatrixori + j / self.twomatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.twomatrixori + j / self.twomatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.twomatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.twomatrixori + j / self.twomatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.twomatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.twomatrixwid) * sizeratio) - k, y + int((self.defsize - (self.twomatrixori + j / self.twomatrixwid)) * sizeratio) - l) def writethree(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.threematrix) charstring = (self.threematrixwid * self.threematrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.threematrixwid * self.threematrixhei: charstring = charstring[0 - self.threematrixwid * self.threematrixhei:] for i in range(0, len(charstring), self.threematrixwid): for j in range(i, i + self.threematrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.threematrixori - self.threematrixwid + j / self.threematrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.threematrixori + j / self.threematrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.threematrixori + j / self.threematrixwid) * sizeratio) - l - self.defsize, x + int((j % self.threematrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.threematrixori + j / self.threematrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.threematrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.threematrixwid) * sizeratio) - k, y + int((self.defsize - (self.threematrixori + j / self.threematrixwid)) * sizeratio) - l) def writefour(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.fourmatrix) charstring = (self.fourmatrixwid * self.fourmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.fourmatrixwid * self.fourmatrixhei: charstring = charstring[0 - self.fourmatrixwid * self.fourmatrixhei:] for i in range(0, len(charstring), self.fourmatrixwid): for j in range(i, i + self.fourmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.fourmatrixori - self.fourmatrixwid + j / self.fourmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.fourmatrixori + j / self.fourmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.fourmatrixori + j / self.fourmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.fourmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.fourmatrixori + j / self.fourmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.fourmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.fourmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.fourmatrixori + j / self.fourmatrixwid)) * sizeratio) - l) def writefive(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.fivematrix) charstring = (self.fivematrixwid * self.fivematrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.fivematrixwid * self.fivematrixhei: charstring = charstring[0 - self.fivematrixwid * self.fivematrixhei:] for i in range(0, len(charstring), self.fivematrixwid): for j in range(i, i + self.fivematrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.fivematrixori - self.fivematrixwid + j / self.fivematrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.fivematrixori + j / self.fivematrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.fivematrixori + j / self.fivematrixwid) * sizeratio) - l - self.defsize, x + int((j % self.fivematrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.fivematrixori + j / self.fivematrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.fivematrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.fivematrixwid) * sizeratio) - k, y + int((self.defsize - (self.fivematrixori + j / self.fivematrixwid)) * sizeratio) - l) def writesix(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.sixmatrix) charstring = (self.sixmatrixwid * self.sixmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.sixmatrixwid * self.sixmatrixhei: charstring = charstring[0 - self.sixmatrixwid * self.sixmatrixhei:] for i in range(0, len(charstring), self.sixmatrixwid): for j in range(i, i + self.sixmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.sixmatrixori - self.sixmatrixwid + j / self.sixmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.sixmatrixori + j / self.sixmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.sixmatrixori + j / self.sixmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.sixmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.sixmatrixori + j / self.sixmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.sixmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.sixmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.sixmatrixori + j / self.sixmatrixwid)) * sizeratio) - l) def writeseven(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.sevenmatrix) charstring = (self.sevenmatrixwid * self.sevenmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.sevenmatrixwid * self.sevenmatrixhei: charstring = charstring[0 - self.sevenmatrixwid * self.sevenmatrixhei:] for i in range(0, len(charstring), self.sevenmatrixwid): for j in range(i, i + self.sevenmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.sevenmatrixori - self.sevenmatrixwid + j / self.sevenmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.sevenmatrixori + j / self.sevenmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.sevenmatrixori + j / self.sevenmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.sevenmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.sevenmatrixori + j / self.sevenmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.sevenmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.sevenmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.sevenmatrixori + j / self.sevenmatrixwid)) * sizeratio) - l) def writeeight(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.eightmatrix) charstring = (self.eightmatrixwid * self.eightmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.eightmatrixwid * self.eightmatrixhei: charstring = charstring[0 - self.eightmatrixwid * self.eightmatrixhei:] for i in range(0, len(charstring), self.eightmatrixwid): for j in range(i, i + self.eightmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.eightmatrixori - self.eightmatrixwid + j / self.eightmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.eightmatrixori + j / self.eightmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.eightmatrixori + j / self.eightmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.eightmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.eightmatrixori + j / self.eightmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.eightmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.eightmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.eightmatrixori + j / self.eightmatrixwid)) * sizeratio) - l) def writenine(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.ninematrix) charstring = (self.ninematrixwid * self.ninematrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.ninematrixwid * self.ninematrixhei: charstring = charstring[0 - self.ninematrixwid * self.ninematrixhei:] for i in range(0, len(charstring), self.ninematrixwid): for j in range(i, i + self.ninematrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.ninematrixori - self.ninematrixwid + j / self.ninematrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.ninematrixori + j / self.ninematrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.ninematrixori + j / self.ninematrixwid) * sizeratio) - l - self.defsize, x + int((j % self.ninematrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.ninematrixori + j / self.ninematrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.ninematrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.ninematrixwid) * sizeratio) - k, y + int((self.defsize - (self.ninematrixori + j / self.ninematrixwid)) * sizeratio) - l) def writeten(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.tenmatrix) charstring = (self.tenmatrixwid * self.tenmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.tenmatrixwid * self.tenmatrixhei: charstring = charstring[0 - self.tenmatrixwid * self.tenmatrixhei:] for i in range(0, len(charstring), self.tenmatrixwid): for j in range(i, i + self.tenmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.tenmatrixori - self.tenmatrixwid + j / self.tenmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.tenmatrixori + j / self.tenmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.tenmatrixori + j / self.tenmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.tenmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.tenmatrixori + j / self.tenmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.tenmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.tenmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.tenmatrixori + j / self.tenmatrixwid)) * sizeratio) - l) def write_(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self._matrix) charstring = (self._matrixwid * self._matrixhei - len(charstring)) * '0' + charstring if len(charstring) > self._matrixwid * self._matrixhei: charstring = charstring[0 - self._matrixwid * self._matrixhei:] for i in range(0, len(charstring), self._matrixwid): for j in range(i, i + self._matrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self._matrixori - self._matrixwid + j / self._matrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self._matrixori + j / self._matrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self._matrixori + j / self._matrixwid) * sizeratio) - l - self.defsize, x + int((j % self._matrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self._matrixori + j / self._matrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self._matrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self._matrixwid) * sizeratio) - k, y + int((self.defsize - (self._matrixori + j / self._matrixwid)) * sizeratio) - l) def writeminus(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.minusmatrix) charstring = (self.minusmatrixwid * self.minusmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.minusmatrixwid * self.minusmatrixhei: charstring = charstring[0 - self.minusmatrixwid * self.minusmatrixhei:] for i in range(0, len(charstring), self.minusmatrixwid): for j in range(i, i + self.minusmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.minusmatrixori - self.minusmatrixwid + j / self.minusmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.minusmatrixori + j / self.minusmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.minusmatrixori + j / self.minusmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.minusmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.minusmatrixori + j / self.minusmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.minusmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.minusmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.minusmatrixori + j / self.minusmatrixwid)) * sizeratio) - l) def writeplus(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.plusmatrix) charstring = (self.plusmatrixwid * self.plusmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.plusmatrixwid * self.plusmatrixhei: charstring = charstring[0 - self.plusmatrixwid * self.plusmatrixhei:] for i in range(0, len(charstring), self.plusmatrixwid): for j in range(i, i + self.plusmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.plusmatrixori - self.plusmatrixwid + j / self.plusmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.plusmatrixori + j / self.plusmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.plusmatrixori + j / self.plusmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.plusmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.plusmatrixori + j / self.plusmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.plusmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.plusmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.plusmatrixori + j / self.plusmatrixwid)) * sizeratio) - l) def writeequal(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.equalmatrix) charstring = (self.equalmatrixwid * self.equalmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.equalmatrixwid * self.equalmatrixhei: charstring = charstring[0 - self.equalmatrixwid * self.equalmatrixhei:] for i in range(0, len(charstring), self.equalmatrixwid): for j in range(i, i + self.equalmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.equalmatrixori - self.equalmatrixwid + j / self.equalmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.equalmatrixori + j / self.equalmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.equalmatrixori + j / self.equalmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.equalmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.equalmatrixori + j / self.equalmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.equalmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.equalmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.equalmatrixori + j / self.equalmatrixwid)) * sizeratio) - l) def writeexcl(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.exclmatrix) charstring = (self.exclmatrixwid * self.exclmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.exclmatrixwid * self.exclmatrixhei: charstring = charstring[0 - self.exclmatrixwid * self.exclmatrixhei:] for i in range(0, len(charstring), self.exclmatrixwid): for j in range(i, i + self.exclmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.exclmatrixori - self.exclmatrixwid + j / self.exclmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.exclmatrixori + j / self.exclmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.exclmatrixori + j / self.exclmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.exclmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.exclmatrixori + j / self.exclmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.exclmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.exclmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.exclmatrixori + j / self.exclmatrixwid)) * sizeratio) - l) def writeat(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.atmatrix) charstring = (self.atmatrixwid * self.atmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.atmatrixwid * self.atmatrixhei: charstring = charstring[0 - self.atmatrixwid * self.atmatrixhei:] for i in range(0, len(charstring), self.atmatrixwid): for j in range(i, i + self.atmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.atmatrixori - self.atmatrixwid + j / self.atmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.atmatrixori + j / self.atmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.atmatrixori + j / self.atmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.atmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.atmatrixori + j / self.atmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.atmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.atmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.atmatrixori + j / self.atmatrixwid)) * sizeratio) - l) def writehash(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.hashmatrix) charstring = (self.hashmatrixwid * self.hashmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.hashmatrixwid * self.hashmatrixhei: charstring = charstring[0 - self.hashmatrixwid * self.hashmatrixhei:] for i in range(0, len(charstring), self.hashmatrixwid): for j in range(i, i + self.hashmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.hashmatrixori - self.hashmatrixwid + j / self.hashmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.hashmatrixori + j / self.hashmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.hashmatrixori + j / self.hashmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.hashmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.hashmatrixori + j / self.hashmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.hashmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.hashmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.hashmatrixori + j / self.hashmatrixwid)) * sizeratio) - l) def writedollar(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.dollarmatrix) charstring = (self.dollarmatrixwid * self.dollarmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.dollarmatrixwid * self.dollarmatrixhei: charstring = charstring[0 - self.dollarmatrixwid * self.dollarmatrixhei:] for i in range(0, len(charstring), self.dollarmatrixwid): for j in range(i, i + self.dollarmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.dollarmatrixori - self.dollarmatrixwid + j / self.dollarmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.dollarmatrixori + j / self.dollarmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.dollarmatrixori + j / self.dollarmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.dollarmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.dollarmatrixori + j / self.dollarmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.dollarmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.dollarmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.dollarmatrixori + j / self.dollarmatrixwid)) * sizeratio) - l) def writepercent(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.percentmatrix) charstring = (self.percentmatrixwid * self.percentmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.percentmatrixwid * self.percentmatrixhei: charstring = charstring[0 - self.percentmatrixwid * self.percentmatrixhei:] for i in range(0, len(charstring), self.percentmatrixwid): for j in range(i, i + self.percentmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.percentmatrixori - self.percentmatrixwid + j / self.percentmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.percentmatrixori + j / self.percentmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.percentmatrixori + j / self.percentmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.percentmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.percentmatrixori + j / self.percentmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.percentmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.percentmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.percentmatrixori + j / self.percentmatrixwid)) * sizeratio) - l) def writehat(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.hatmatrix) charstring = (self.hatmatrixwid * self.hatmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.hatmatrixwid * self.hatmatrixhei: charstring = charstring[0 - self.hatmatrixwid * self.hatmatrixhei:] for i in range(0, len(charstring), self.hatmatrixwid): for j in range(i, i + self.hatmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.hatmatrixori - self.hatmatrixwid + j / self.hatmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.hatmatrixori + j / self.hatmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.hatmatrixori + j / self.hatmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.hatmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.hatmatrixori + j / self.hatmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.hatmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.hatmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.hatmatrixori + j / self.hatmatrixwid)) * sizeratio) - l) def writeamp(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.ampmatrix) charstring = (self.ampmatrixwid * self.ampmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.ampmatrixwid * self.ampmatrixhei: charstring = charstring[0 - self.ampmatrixwid * self.ampmatrixhei:] for i in range(0, len(charstring), self.ampmatrixwid): for j in range(i, i + self.ampmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.ampmatrixori - self.ampmatrixwid + j / self.ampmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.ampmatrixori + j / self.ampmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.ampmatrixori + j / self.ampmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.ampmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.ampmatrixori + j / self.ampmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.ampmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.ampmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.ampmatrixori + j / self.ampmatrixwid)) * sizeratio) - l) def writestrix(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.strixmatrix) charstring = (self.strixmatrixwid * self.strixmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.strixmatrixwid * self.strixmatrixhei: charstring = charstring[0 - self.strixmatrixwid * self.strixmatrixhei:] for i in range(0, len(charstring), self.strixmatrixwid): for j in range(i, i + self.strixmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.strixmatrixori - self.strixmatrixwid + j / self.strixmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.strixmatrixori + j / self.strixmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.strixmatrixori + j / self.strixmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.strixmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.strixmatrixori + j / self.strixmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.strixmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.strixmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.strixmatrixori + j / self.strixmatrixwid)) * sizeratio) - l) def writeopencpar(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.opencparmatrix) charstring = (self.opencparmatrixwid * self.opencparmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.opencparmatrixwid * self.opencparmatrixhei: charstring = charstring[0 - self.opencparmatrixwid * self.opencparmatrixhei:] for i in range(0, len(charstring), self.opencparmatrixwid): for j in range(i, i + self.opencparmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.opencparmatrixori - self.opencparmatrixwid + j / self.opencparmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.opencparmatrixori + j / self.opencparmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.opencparmatrixori + j / self.opencparmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.opencparmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.opencparmatrixori + j / self.opencparmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.opencparmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.opencparmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.opencparmatrixori + j / self.opencparmatrixwid)) * sizeratio) - l) def writeclosecpar(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.closecparmatrix) charstring = (self.closecparmatrixwid * self.closecparmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.closecparmatrixwid * self.closecparmatrixhei: charstring = charstring[0 - self.closecparmatrixwid * self.closecparmatrixhei:] for i in range(0, len(charstring), self.closecparmatrixwid): for j in range(i, i + self.closecparmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.closecparmatrixori - self.closecparmatrixwid + j / self.closecparmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.closecparmatrixori + j / self.closecparmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.closecparmatrixori + j / self.closecparmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.closecparmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.closecparmatrixori + j / self.closecparmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.closecparmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.closecparmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.closecparmatrixori + j / self.closecparmatrixwid)) * sizeratio) - l) def writeopenspar(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.opensparmatrix) charstring = (self.opensparmatrixwid * self.opensparmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.opensparmatrixwid * self.opensparmatrixhei: charstring = charstring[0 - self.opensparmatrixwid * self.opensparmatrixhei:] for i in range(0, len(charstring), self.opensparmatrixwid): for j in range(i, i + self.opensparmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.opensparmatrixori - self.opensparmatrixwid + j / self.opensparmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.opensparmatrixori + j / self.opensparmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.opensparmatrixori + j / self.opensparmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.opensparmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.opensparmatrixori + j / self.opensparmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.opensparmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.opensparmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.opensparmatrixori + j / self.opensparmatrixwid)) * sizeratio) - l) def writeclosespar(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.closesparmatrix) charstring = (self.closesparmatrixwid * self.closesparmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.closesparmatrixwid * self.closesparmatrixhei: charstring = charstring[0 - self.closesparmatrixwid * self.closesparmatrixhei:] for i in range(0, len(charstring), self.closesparmatrixwid): for j in range(i, i + self.closesparmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.closesparmatrixori - self.closesparmatrixwid + j / self.closesparmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.closesparmatrixori + j / self.closesparmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.closesparmatrixori + j / self.closesparmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.closesparmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.closesparmatrixori + j / self.closesparmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.closesparmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.closesparmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.closesparmatrixori + j / self.closesparmatrixwid)) * sizeratio) - l) def writebackslash(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.backslashmatrix) charstring = (self.backslashmatrixwid * self.backslashmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.backslashmatrixwid * self.backslashmatrixhei: charstring = charstring[0 - self.backslashmatrixwid * self.backslashmatrixhei:] for i in range(0, len(charstring), self.backslashmatrixwid): for j in range(i, i + self.backslashmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.backslashmatrixori - self.backslashmatrixwid + j / self.backslashmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.backslashmatrixori + j / self.backslashmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.backslashmatrixori + j / self.backslashmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.backslashmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.backslashmatrixori + j / self.backslashmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.backslashmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.backslashmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.backslashmatrixori + j / self.backslashmatrixwid)) * sizeratio) - l) def writesemicol(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.semicolmatrix) charstring = (self.semicolmatrixwid * self.semicolmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.semicolmatrixwid * self.semicolmatrixhei: charstring = charstring[0 - self.semicolmatrixwid * self.semicolmatrixhei:] for i in range(0, len(charstring), self.semicolmatrixwid): for j in range(i, i + self.semicolmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.semicolmatrixori - self.semicolmatrixwid + j / self.semicolmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.semicolmatrixori + j / self.semicolmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.semicolmatrixori + j / self.semicolmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.semicolmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.semicolmatrixori + j / self.semicolmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.semicolmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.semicolmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.semicolmatrixori + j / self.semicolmatrixwid)) * sizeratio) - l) def writepost(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.postmatrix) charstring = (self.postmatrixwid * self.postmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.postmatrixwid * self.postmatrixhei: charstring = charstring[0 - self.postmatrixwid * self.postmatrixhei:] for i in range(0, len(charstring), self.postmatrixwid): for j in range(i, i + self.postmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.postmatrixori - self.postmatrixwid + j / self.postmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.postmatrixori + j / self.postmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.postmatrixori + j / self.postmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.postmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.postmatrixori + j / self.postmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.postmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.postmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.postmatrixori + j / self.postmatrixwid)) * sizeratio) - l) def writecomma(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.commamatrix) charstring = (self.commamatrixwid * self.commamatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.commamatrixwid * self.commamatrixhei: charstring = charstring[0 - self.commamatrixwid * self.commamatrixhei:] for i in range(0, len(charstring), self.commamatrixwid): for j in range(i, i + self.commamatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.commamatrixori - self.commamatrixwid + j / self.commamatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.commamatrixori + j / self.commamatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.commamatrixori + j / self.commamatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.commamatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.commamatrixori + j / self.commamatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.commamatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.commamatrixwid) * sizeratio) - k, y + int((self.defsize - (self.commamatrixori + j / self.commamatrixwid)) * sizeratio) - l) def writefullstop(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.fullstopmatrix) charstring = (self.fullstopmatrixwid * self.fullstopmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.fullstopmatrixwid * self.fullstopmatrixhei: charstring = charstring[0 - self.fullstopmatrixwid * self.fullstopmatrixhei:] for i in range(0, len(charstring), self.fullstopmatrixwid): for j in range(i, i + self.fullstopmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.fullstopmatrixori - self.fullstopmatrixwid + j / self.fullstopmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.fullstopmatrixori + j / self.fullstopmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.fullstopmatrixori + j / self.fullstopmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.fullstopmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.fullstopmatrixori + j / self.fullstopmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.fullstopmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.fullstopmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.fullstopmatrixori + j / self.fullstopmatrixwid)) * sizeratio) - l) def writeforslash(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.forslashmatrix) charstring = (self.forslashmatrixwid * self.forslashmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.forslashmatrixwid * self.forslashmatrixhei: charstring = charstring[0 - self.forslashmatrixwid * self.forslashmatrixhei:] for i in range(0, len(charstring), self.forslashmatrixwid): for j in range(i, i + self.forslashmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.forslashmatrixori - self.forslashmatrixwid + j / self.forslashmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.forslashmatrixori + j / self.forslashmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.forslashmatrixori + j / self.forslashmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.forslashmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.forslashmatrixori + j / self.forslashmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.forslashmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.forslashmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.forslashmatrixori + j / self.forslashmatrixwid)) * sizeratio) - l) def writelesthan(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.lesthanmatrix) charstring = (self.lesthanmatrixwid * self.lesthanmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.lesthanmatrixwid * self.lesthanmatrixhei: charstring = charstring[0 - self.lesthanmatrixwid * self.lesthanmatrixhei:] for i in range(0, len(charstring), self.lesthanmatrixwid): for j in range(i, i + self.lesthanmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.lesthanmatrixori - self.lesthanmatrixwid + j / self.lesthanmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.lesthanmatrixori + j / self.lesthanmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.lesthanmatrixori + j / self.lesthanmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.lesthanmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.lesthanmatrixori + j / self.lesthanmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.lesthanmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.lesthanmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.lesthanmatrixori + j / self.lesthanmatrixwid)) * sizeratio) - l) def writegreatthan(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.greatthanmatrix) charstring = (self.greatthanmatrixwid * self.greatthanmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.greatthanmatrixwid * self.greatthanmatrixhei: charstring = charstring[0 - self.greatthanmatrixwid * self.greatthanmatrixhei:] for i in range(0, len(charstring), self.greatthanmatrixwid): for j in range(i, i + self.greatthanmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.greatthanmatrixori - self.greatthanmatrixwid + j / self.greatthanmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.greatthanmatrixori + j / self.greatthanmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.greatthanmatrixori + j / self.greatthanmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.greatthanmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.greatthanmatrixori + j / self.greatthanmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.greatthanmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.greatthanmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.greatthanmatrixori + j / self.greatthanmatrixwid)) * sizeratio) - l) def writequestion(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.questionmatrix) charstring = (self.questionmatrixwid * self.questionmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.questionmatrixwid * self.questionmatrixhei: charstring = charstring[0 - self.questionmatrixwid * self.questionmatrixhei:] for i in range(0, len(charstring), self.questionmatrixwid): for j in range(i, i + self.questionmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.questionmatrixori - self.questionmatrixwid + j / self.questionmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.questionmatrixori + j / self.questionmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.questionmatrixori + j / self.questionmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.questionmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.questionmatrixori + j / self.questionmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.questionmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.questionmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.questionmatrixori + j / self.questionmatrixwid)) * sizeratio) - l) def writecolon(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.colonmatrix) charstring = (self.colonmatrixwid * self.colonmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.colonmatrixwid * self.colonmatrixhei: charstring = charstring[0 - self.colonmatrixwid * self.colonmatrixhei:] for i in range(0, len(charstring), self.colonmatrixwid): for j in range(i, i + self.colonmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.colonmatrixori - self.colonmatrixwid + j / self.colonmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.colonmatrixori + j / self.colonmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.colonmatrixori + j / self.colonmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.colonmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.colonmatrixori + j / self.colonmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.colonmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.colonmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.colonmatrixori + j / self.colonmatrixwid)) * sizeratio) - l) def writequote(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.quotematrix) charstring = (self.quotematrixwid * self.quotematrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.quotematrixwid * self.quotematrixhei: charstring = charstring[0 - self.quotematrixwid * self.quotematrixhei:] for i in range(0, len(charstring), self.quotematrixwid): for j in range(i, i + self.quotematrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.quotematrixori - self.quotematrixwid + j / self.quotematrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.quotematrixori + j / self.quotematrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.quotematrixori + j / self.quotematrixwid) * sizeratio) - l - self.defsize, x + int((j % self.quotematrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.quotematrixori + j / self.quotematrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.quotematrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.quotematrixwid) * sizeratio) - k, y + int((self.defsize - (self.quotematrixori + j / self.quotematrixwid)) * sizeratio) - l) def writeopensquig(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.opensquigmatrix) charstring = (self.opensquigmatrixwid * self.opensquigmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.opensquigmatrixwid * self.opensquigmatrixhei: charstring = charstring[0 - self.opensquigmatrixwid * self.opensquigmatrixhei:] for i in range(0, len(charstring), self.opensquigmatrixwid): for j in range(i, i + self.opensquigmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.opensquigmatrixori - self.opensquigmatrixwid + j / self.opensquigmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.opensquigmatrixori + j / self.opensquigmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.opensquigmatrixori + j / self.opensquigmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.opensquigmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.opensquigmatrixori + j / self.opensquigmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.opensquigmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.opensquigmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.opensquigmatrixori + j / self.opensquigmatrixwid)) * sizeratio) - l) def writeclosesquig(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.closesquigmatrix) charstring = (self.closesquigmatrixwid * self.closesquigmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.closesquigmatrixwid * self.closesquigmatrixhei: charstring = charstring[0 - self.closesquigmatrixwid * self.closesquigmatrixhei:] for i in range(0, len(charstring), self.closesquigmatrixwid): for j in range(i, i + self.closesquigmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.closesquigmatrixori - self.closesquigmatrixwid + j / self.closesquigmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.closesquigmatrixori + j / self.closesquigmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.closesquigmatrixori + j / self.closesquigmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.closesquigmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.closesquigmatrixori + j / self.closesquigmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.closesquigmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.closesquigmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.closesquigmatrixori + j / self.closesquigmatrixwid)) * sizeratio) - l) def writebar(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.barmatrix) charstring = (self.barmatrixwid * self.barmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.barmatrixwid * self.barmatrixhei: charstring = charstring[0 - self.barmatrixwid * self.barmatrixhei:] for i in range(0, len(charstring), self.barmatrixwid): for j in range(i, i + self.barmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.barmatrixori - self.barmatrixwid + j / self.barmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.barmatrixori + j / self.barmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.barmatrixori + j / self.barmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.barmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.barmatrixori + j / self.barmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.barmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.barmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.barmatrixori + j / self.barmatrixwid)) * sizeratio) - l) def writemisc(self, x, y, size, ital, bold, sans, rotate): xpos = x sizeratio = size * 1.0 / self.defsize sizeint = (size - 1) // self.defsize + 1 if bold: sizeint = sizeint + 2 + int(sizeratio) charstring = binar(self.miscmatrix) charstring = (self.miscmatrixwid * self.miscmatrixhei - len(charstring)) * '0' + charstring if len(charstring) > self.miscmatrixwid * self.miscmatrixhei: charstring = charstring[0 - self.miscmatrixwid * self.miscmatrixhei:] for i in range(0, len(charstring), self.miscmatrixwid): for j in range(i, i + self.miscmatrixwid): if charstring[j] == '1': for k in range(sizeint): for l in range(sizeint): if ital and rotate == -1: x = xpos + (int(((self.miscmatrixori - self.miscmatrixwid + j / self.miscmatrixwid)) * sizeratio) - l) / 3 elif ital: x = xpos + (int((self.defsize - (self.miscmatrixori + j / self.miscmatrixwid)) * sizeratio) - l) / 3 if rotate == 1: self.plotPoint(y + int((self.miscmatrixori + j / self.miscmatrixwid) * sizeratio) - l - self.defsize, x + int((j % self.miscmatrixwid) * sizeratio) - k) elif rotate == -1: self.plotPoint(y + int((self.defsize - (self.miscmatrixori + j / self.miscmatrixwid)) * sizeratio) - l, 2 * x - (x + int((j % self.miscmatrixwid) * sizeratio) - k)) else: self.plotPoint(x + int((j % self.miscmatrixwid) * sizeratio) - k, y + int((self.defsize - (self.miscmatrixori + j / self.miscmatrixwid)) * sizeratio) - l) def writeString(self, thestring, x, y, size, ital=False, bold=False, rotate=0, justify='left'): xpos = x if rotate != 0: xpos, y = y, xpos if justify == 'right': xpos -= self.lengthString(thestring, size) for i in thestring: if i == 'a': self.writea(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.amatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.amatrixwid * size / self.defsize + 1 + size / 20 elif i == 'b': self.writeb(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.bmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.bmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'c': self.writec(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.cmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.cmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'd': self.writed(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.dmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.dmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'e': self.writee(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.ematrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.ematrixwid * size / self.defsize + 1 + size / 20 elif i == 'f': self.writef(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.fmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.fmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'g': self.writeg(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.gmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.gmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'h': self.writeh(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.hmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.hmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'i': self.writei(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.imatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.imatrixwid * size / self.defsize + 1 + size / 20 elif i == 'j': self.writej(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.jmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.jmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'k': self.writek(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.kmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.kmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'l': self.writel(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.lmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.lmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'm': self.writem(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.mmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.mmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'n': self.writen(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.nmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.nmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'o': self.writeo(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.omatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.omatrixwid * size / self.defsize + 1 + size / 20 elif i == 'p': self.writep(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.pmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.pmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'q': self.writeq(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.qmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.qmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'r': self.writer(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.rmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.rmatrixwid * size / self.defsize + 1 + size / 20 elif i == 's': self.writes(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.smatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.smatrixwid * size / self.defsize + 1 + size / 20 elif i == 't': self.writet(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.tmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.tmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'u': self.writeu(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.umatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.umatrixwid * size / self.defsize + 1 + size / 20 elif i == 'v': self.writev(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.vmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.vmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'w': self.writew(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.wmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.wmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'x': self.writex(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.xmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.xmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'y': self.writey(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.ymatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.ymatrixwid * size / self.defsize + 1 + size / 20 elif i == 'z': self.writez(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.zmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.zmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'A': self.writeA(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Amatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Amatrixwid * size / self.defsize + 1 + size / 20 elif i == 'B': self.writeB(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Bmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Bmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'C': self.writeC(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Cmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Cmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'D': self.writeD(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Dmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Dmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'E': self.writeE(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Ematrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Ematrixwid * size / self.defsize + 1 + size / 20 elif i == 'F': self.writeF(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Fmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Fmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'G': self.writeG(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Gmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Gmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'H': self.writeH(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Hmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Hmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'I': self.writeI(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Imatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Imatrixwid * size / self.defsize + 1 + size / 20 elif i == 'J': self.writeJ(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Jmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Jmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'K': self.writeK(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Kmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Kmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'L': self.writeL(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Lmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Lmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'M': self.writeM(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Mmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Mmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'N': self.writeN(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Nmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Nmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'O': self.writeO(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Omatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Omatrixwid * size / self.defsize + 1 + size / 20 elif i == 'P': self.writeP(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Pmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Pmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'Q': self.writeQ(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Qmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Qmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'R': self.writeR(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Rmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Rmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'S': self.writeS(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Smatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Smatrixwid * size / self.defsize + 1 + size / 20 elif i == 'T': self.writeT(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Tmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Tmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'U': self.writeU(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Umatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Umatrixwid * size / self.defsize + 1 + size / 20 elif i == 'V': self.writeV(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Vmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Vmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'W': self.writeW(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Wmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Wmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'X': self.writeX(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Xmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Xmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'Y': self.writeY(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Ymatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Ymatrixwid * size / self.defsize + 1 + size / 20 elif i == 'Z': self.writeZ(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.Zmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.Zmatrixwid * size / self.defsize + 1 + size / 20 elif i == '1': self.writeone(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.onematrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.onematrixwid * size / self.defsize + 1 + size / 20 elif i == '2': self.writetwo(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.twomatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.twomatrixwid * size / self.defsize + 1 + size / 20 elif i == '3': self.writethree(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.threematrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.threematrixwid * size / self.defsize + 1 + size / 20 elif i == '4': self.writefour(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.fourmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.fourmatrixwid * size / self.defsize + 1 + size / 20 elif i == '5': self.writefive(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.fivematrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.fivematrixwid * size / self.defsize + 1 + size / 20 elif i == '6': self.writesix(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.sixmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.sixmatrixwid * size / self.defsize + 1 + size / 20 elif i == '7': self.writeseven(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.sevenmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.sevenmatrixwid * size / self.defsize + 1 + size / 20 elif i == '8': self.writeeight(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.eightmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.eightmatrixwid * size / self.defsize + 1 + size / 20 elif i == '9': self.writenine(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.ninematrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.ninematrixwid * size / self.defsize + 1 + size / 20 elif i == '0': self.writeten(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.tenmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.tenmatrixwid * size / self.defsize + 1 + size / 20 elif i == '_': self.write_(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self._matrixwid * size / self.defsize + 1 + size / 20 else: xpos += self._matrixwid * size / self.defsize + 1 + size / 20 elif i == '-': self.writeminus(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.minusmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.minusmatrixwid * size / self.defsize + 1 + size / 20 elif i == '+': self.writeplus(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.plusmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.plusmatrixwid * size / self.defsize + 1 + size / 20 elif i == '=': self.writeequal(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.equalmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.equalmatrixwid * size / self.defsize + 1 + size / 20 elif i == '!': self.writeexcl(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.exclmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.exclmatrixwid * size / self.defsize + 1 + size / 20 elif i == '@': self.writeat(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.atmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.atmatrixwid * size / self.defsize + 1 + size / 20 elif i == '#': self.writehash(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.hashmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.hashmatrixwid * size / self.defsize + 1 + size / 20 elif i == '$': self.writedollar(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.dollarmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.dollarmatrixwid * size / self.defsize + 1 + size / 20 elif i == '%': self.writepercent(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.percentmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.percentmatrixwid * size / self.defsize + 1 + size / 20 elif i == '^': self.writehat(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.hatmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.hatmatrixwid * size / self.defsize + 1 + size / 20 elif i == '&': self.writeamp(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.ampmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.ampmatrixwid * size / self.defsize + 1 + size / 20 elif i == '*': self.writestrix(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.strixmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.strixmatrixwid * size / self.defsize + 1 + size / 20 elif i == '(': self.writeopencpar(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.opencparmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.opencparmatrixwid * size / self.defsize + 1 + size / 20 elif i == ')': self.writeclosecpar(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.closecparmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.closecparmatrixwid * size / self.defsize + 1 + size / 20 elif i == '[': self.writeopenspar(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.opensparmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.opensparmatrixwid * size / self.defsize + 1 + size / 20 elif i == ']': self.writeclosespar(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.closesparmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.closesparmatrixwid * size / self.defsize + 1 + size / 20 elif i == '\\': self.writebackslash(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.backslashmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.backslashmatrixwid * size / self.defsize + 1 + size / 20 elif i == ';': self.writesemicol(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.semicolmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.semicolmatrixwid * size / self.defsize + 1 + size / 20 elif i == '\'': self.writepost(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.postmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.postmatrixwid * size / self.defsize + 1 + size / 20 elif i == ',': self.writecomma(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.commamatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.commamatrixwid * size / self.defsize + 1 + size / 20 elif i == '.': self.writefullstop(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.fullstopmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.fullstopmatrixwid * size / self.defsize + 1 + size / 20 elif i == '/': self.writeforslash(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.forslashmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.forslashmatrixwid * size / self.defsize + 1 + size / 20 elif i == '<': self.writelesthan(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.lesthanmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.lesthanmatrixwid * size / self.defsize + 1 + size / 20 elif i == '>': self.writegreatthan(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.greatthanmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.greatthanmatrixwid * size / self.defsize + 1 + size / 20 elif i == '?': self.writequestion(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.questionmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.questionmatrixwid * size / self.defsize + 1 + size / 20 elif i == ':': self.writecolon(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.colonmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.colonmatrixwid * size / self.defsize + 1 + size / 20 elif i == '"': self.writequote(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.quotematrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.quotematrixwid * size / self.defsize + 1 + size / 20 elif i == '{': self.writeopensquig(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.opensquigmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.opensquigmatrixwid * size / self.defsize + 1 + size / 20 elif i == '}': self.writeclosesquig(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.closesquigmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.closesquigmatrixwid * size / self.defsize + 1 + size / 20 elif i == '|': self.writebar(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.barmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.barmatrixwid * size / self.defsize + 1 + size / 20 elif i == ' ': if rotate == -1: xpos -= 24 * size / self.defsize + 1 + size / 20 else: xpos += 24 * size / self.defsize + 1 + size / 20 else: self.writemisc(xpos, y, size, ital, bold, True, rotate) if rotate == -1: xpos -= self.miscmatrixwid * size / self.defsize + 1 + size / 20 else: xpos += self.miscmatrixwid * size / self.defsize + 1 + size / 20 def lengthString(self, theString, size): xpos = 0 for i in theString: if i == 'a': xpos += self.amatrixwid * size / self.defsize + 1 + size / 20 elif i == 'b': xpos += self.bmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'c': xpos += self.cmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'd': xpos += self.dmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'e': xpos += self.ematrixwid * size / self.defsize + 1 + size / 20 elif i == 'f': xpos += self.fmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'g': xpos += self.gmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'h': xpos += self.hmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'i': xpos += self.imatrixwid * size / self.defsize + 1 + size / 20 elif i == 'j': xpos += self.jmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'k': xpos += self.kmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'l': xpos += self.lmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'm': xpos += self.mmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'n': xpos += self.nmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'o': xpos += self.omatrixwid * size / self.defsize + 1 + size / 20 elif i == 'p': xpos += self.pmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'q': xpos += self.qmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'r': xpos += self.rmatrixwid * size / self.defsize + 1 + size / 20 elif i == 's': xpos += self.smatrixwid * size / self.defsize + 1 + size / 20 elif i == 't': xpos += self.tmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'u': xpos += self.umatrixwid * size / self.defsize + 1 + size / 20 elif i == 'v': xpos += self.vmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'w': xpos += self.wmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'x': xpos += self.xmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'y': xpos += self.ymatrixwid * size / self.defsize + 1 + size / 20 elif i == 'z': xpos += self.zmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'A': xpos += self.Amatrixwid * size / self.defsize + 1 + size / 20 elif i == 'B': xpos += self.Bmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'C': xpos += self.Cmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'D': xpos += self.Dmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'E': xpos += self.Ematrixwid * size / self.defsize + 1 + size / 20 elif i == 'F': xpos += self.Fmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'G': xpos += self.Gmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'H': xpos += self.Hmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'I': xpos += self.Imatrixwid * size / self.defsize + 1 + size / 20 elif i == 'J': xpos += self.Jmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'K': xpos += self.Kmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'L': xpos += self.Lmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'M': xpos += self.Mmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'N': xpos += self.Nmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'O': xpos += self.Omatrixwid * size / self.defsize + 1 + size / 20 elif i == 'P': xpos += self.Pmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'Q': xpos += self.Qmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'R': xpos += self.Rmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'S': xpos += self.Smatrixwid * size / self.defsize + 1 + size / 20 elif i == 'T': xpos += self.Tmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'U': xpos += self.Umatrixwid * size / self.defsize + 1 + size / 20 elif i == 'V': xpos += self.Vmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'W': xpos += self.Wmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'X': xpos += self.Xmatrixwid * size / self.defsize + 1 + size / 20 elif i == 'Y': xpos += self.Ymatrixwid * size / self.defsize + 1 + size / 20 elif i == 'Z': xpos += self.Zmatrixwid * size / self.defsize + 1 + size / 20 elif i == '1': xpos += self.onematrixwid * size / self.defsize + 1 + size / 20 elif i == '2': xpos += self.twomatrixwid * size / self.defsize + 1 + size / 20 elif i == '3': xpos += self.threematrixwid * size / self.defsize + 1 + size / 20 elif i == '4': xpos += self.fourmatrixwid * size / self.defsize + 1 + size / 20 elif i == '5': xpos += self.fivematrixwid * size / self.defsize + 1 + size / 20 elif i == '6': xpos += self.sixmatrixwid * size / self.defsize + 1 + size / 20 elif i == '7': xpos += self.sevenmatrixwid * size / self.defsize + 1 + size / 20 elif i == '8': xpos += self.eightmatrixwid * size / self.defsize + 1 + size / 20 elif i == '9': xpos += self.ninematrixwid * size / self.defsize + 1 + size / 20 elif i == '0': xpos += self.tenmatrixwid * size / self.defsize + 1 + size / 20 elif i == '_': xpos += self._matrixwid * size / self.defsize + 1 + size / 20 elif i == '-': xpos += self.minusmatrixwid * size / self.defsize + 1 + size / 20 elif i == '+': xpos += self.plusmatrixwid * size / self.defsize + 1 + size / 20 elif i == '=': xpos += self.equalmatrixwid * size / self.defsize + 1 + size / 20 elif i == '!': xpos += self.exclmatrixwid * size / self.defsize + 1 + size / 20 elif i == '@': xpos += self.atmatrixwid * size / self.defsize + 1 + size / 20 elif i == '#': xpos += self.hashmatrixwid * size / self.defsize + 1 + size / 20 elif i == '$': xpos += self.dollarmatrixwid * size / self.defsize + 1 + size / 20 elif i == '%': xpos += self.percentmatrixwid * size / self.defsize + 1 + size / 20 elif i == '^': xpos += self.hatmatrixwid * size / self.defsize + 1 + size / 20 elif i == '&': xpos += self.ampmatrixwid * size / self.defsize + 1 + size / 20 elif i == '*': xpos += self.strixmatrixwid * size / self.defsize + 1 + size / 20 elif i == '(': xpos += self.opencparmatrixwid * size / self.defsize + 1 + size / 20 elif i == ')': xpos += self.closecparmatrixwid * size / self.defsize + 1 + size / 20 elif i == '[': xpos += self.opensparmatrixwid * size / self.defsize + 1 + size / 20 elif i == ']': xpos += self.closesparmatrixwid * size / self.defsize + 1 + size / 20 elif i == '\\': xpos += self.backslashmatrixwid * size / self.defsize + 1 + size / 20 elif i == ';': xpos += self.semicolmatrixwid * size / self.defsize + 1 + size / 20 elif i == '\'': xpos += self.postmatrixwid * size / self.defsize + 1 + size / 20 elif i == ',': xpos += self.commamatrixwid * size / self.defsize + 1 + size / 20 elif i == '.': xpos += self.fullstopmatrixwid * size / self.defsize + 1 + size / 20 elif i == '/': xpos += self.forslashmatrixwid * size / self.defsize + 1 + size / 20 elif i == '<': xpos += self.lesthanmatrixwid * size / self.defsize + 1 + size / 20 elif i == '>': xpos += self.greatthanmatrixwid * size / self.defsize + 1 + size / 20 elif i == '?': xpos += self.questionmatrixwid * size / self.defsize + 1 + size / 20 elif i == ':': xpos += self.colonmatrixwid * size / self.defsize + 1 + size / 20 elif i == '"': xpos += self.quotematrixwid * size / self.defsize + 1 + size / 20 elif i == '{': xpos += self.opensquigmatrixwid * size / self.defsize + 1 + size / 20 elif i == '}': xpos += self.closesquigmatrixwid * size / self.defsize + 1 + size / 20 elif i == '|': xpos += self.barmatrixwid * size / self.defsize + 1 + size / 20 elif i == ' ': xpos += 24 * size / self.defsize + 1 + size / 20 else: xpos += self.miscmatrixwid * size / self.defsize + 1 + size / 20 return xpos def setDefaultPenColor( self ): self.currentPen = self.fg def setPenColor( self, p ): oldColor = self.currentPen # look for c in palette pnum = p.toLong() try: self.currentPen = self.palette.index( pnum ) except ValueError: if len( self.palette ) < 256 : self.palette.append( pnum ) self.currentPen = len( self.palette ) - 1 else: self.currentPen = self.fg return Color.fromLong( self.palette[oldColor] ) def getPenColor( self ): return Color.fromLong( self.palette[self.currentPen] ) def plotPoint( self, x, y ): if ( 0 <= x < self.wd and 0 <= y < self.ht ): x = int(x) y = int(y) self.bitarray[y][x] = self.currentPen def drawOutRect(self, x, y, wid, ht, lt): if wid == 1: if lt != 0: temp = self.getPenColor() self.setPenColor(Color.BLACK) self.drawLine(x, y, x, y+ht-1) self.setPenColor(temp) else: self.drawLine(x,y,x,y+ht-1) else: if lt > wid/2 and lt != 1: lt = wid//2 if lt > ht/2 and lt != 1: lt = ht/2 self.drawRect(x,y,wid,ht,True) temp = self.getPenColor() self.setPenColor(Color.BLACK) for i in range(lt): self.drawRect(x+i,y+i,wid - i,ht -i) self.setPenColor(temp) def drawRect( self, x, y, wid, ht, fill=False ): x = int(x) y = int(y) cury = y # subtract one for line width wid -= 1 ht -= 1 self.drawLine( x, y, x+wid, y ) if fill: cury = y while cury < y+ht: self.drawLine( x, cury, x+wid, cury ) cury += 1 else: self.drawLine( x, y, x, y+ht ) self.drawLine( x+wid, y, x+wid, y+ht ) self.drawLine( x, y+ht, x+wid, y+ht ) def drawSquare( self, x, y, wid, fill=False ): self.drawRect( x, y, wid, wid, fill ) def drawDash(self, x1, y1, x2, y2, wid=1, dashl=3, dashg=3): currX = x1 currY = y1 if x1 == x2: for i in range(wid): currY = y1 while (y1 < y2 and currY + dashl < y2) or (y1 > y2 and currY - dashl > y2): if y1 < y2: self.drawLine(currX, currY, currX, currY + dashl) currY = currY + dashl + dashg else: self.drawLine(currX, currY, currX, currY - dashl) currY = currY - dashl - dashg if (y1 < y2 and currY < y2) or (y2 < y1 and currY > y2): self.drawLine(currX, currY, currX, y2) currX -= 1 elif y1 == y2: for i in range(wid): currX = x1 while (x1 < x2 and currX + dashl < x2) or (x1 > x2 and currX - dashl > x1): if x1 < x2: self.drawLine(currX, currY, currX + dashl, currY) currX = currX + dashl + dashg else: self.drawLine(currX, currY, currX - dashl, currY) currX = currX - dashl - dashg if (x1 < x2 and currX < x2) or (x2 < x1 and currX > x2): self.drawLine(currX, currY, x2, currY) currY -= 1 else: ratio = abs(x1-x2) * 1.0 / abs(y1-y2) while (x1 < x2 and currX + dashl * min([ratio, 1]) < x2) or (x1 > x2 and currX - dashl * min([ratio, 1]) > x2): if ratio > 1: if x1 < x2: nextX = currX + dashl currXt = currX + dashl + dashg else: nextX = currX - dashl currXt = currX - dashl - dashg if y1 < y2: nextY = currY + dashl / ratio currYt = currY + (dashl + dashg) / ratio else: nextY = currY - dashl / ratio currYt = currY - (dashl + dashg) / ratio else: if x1 < x2: nextX = currX + dashl * ratio currXt = currX + (dashl + dashg) * ratio else: nextX = currX - dashl * ratio currXt = currX - (dashl + dashg) * ratio if y1 < y2: nextY = currY + dashl currYt = currY + dashl + dashg else: nextY = currY - dashl currYt = currY - (dashl + dashg) self.drawLine(currX, currY, nextX, nextY) currX = currXt currY = currYt if currX + dashl * min([ratio, 1]) < x2: self.drawLine(currX, currY, x2, y2) def drawRightArrow(self, x, y, wid, ht, lt, outline=True): if lt > ht /2: lt = ht/2 x1 = x + wid y1 = y + ht/2 x2 = x + wid - ht / 2 ht -= 1 if wid > ht/2: for i in range(y, y+ht+1): self.drawLine(x2, i, x1, y1) self.drawRect(x, y + ht/4, wid - ht/2, ht/2, True) if outline: temp = self.getPenColor() self.setPenColor(Color.BLACK) for i in range(lt): self.drawLine(x + i, y+ht/4 + i, x2 + i, y+ht/4 + i) self.drawLine(x2 + i, y+ht/4 + i, x2 + i, y + i *2) self.drawLine(x2 + i, y + i * 2, x1 -i, y1) self.drawLine(x1 - i, y1, x2 + i, y+ht - i * 2) self.drawLine(x2 + i, y+ht-i * 2, x2 + i, y+ht/4+ht/2 - i) self.drawLine(x2 + i, y+ht/4+ht/2 - i, x + i, y+ht/4+ht/2 - i) self.drawLine(x + i, y+ht/4+ht/2 - i, x + i, y+ht/4 + i) self.setPenColor(temp) else: for i in range(y, y+ht+1): self.drawLine(x, i, x1, y1) if outline and lt != 0: temp = self.getPenColor() self.setPenColor(Color.BLACK) for i in range(lt): self.drawLine(x, y+ht-i, x1-i, y1) self.drawLine(x, y+i, x1-i, y1) if x1 != x: crapliney1 = (y1 - y)/(x1 - x)*(x+i - x + 1) + y crapliney2 = y + ht - (y1 - y)/(x1 - x)*(x+i - x + 1) self.drawLine(x+i, crapliney1, x+i, crapliney2) self.setPenColor(temp) def drawLeftArrow(self, x, y, wid, ht, lt, outline=True): if lt > ht /2: lt = ht//2 y1 = y + (ht/2) x1 = x + wid x2 = x + ht/2 ht -= 1 if wid > ht/2: for i in range(y, y+ht+1): self.drawLine(x, y1, x2, i) self.drawRect(x2, y+ht/4, wid - ht/2, ht/2, True) if outline: temp = self.getPenColor() self.setPenColor(Color.BLACK) for i in range(lt): self.drawLine(x+i, y1, x2-i, y+i*2) self.drawLine(x2-i, y+i*2, x2-i, y+ht/4+i) self.drawLine(x2-i, y+ht/4+i, x1-i, y+ht/4+i) self.drawLine(x1-i, y+ht/4+i, x1-i, y+ht/4 + ht/2-i) self.drawLine(x1-i, y+ht/4+ht/2-i, x2-i, y+ht/4+ht/2-i) self.drawLine(x2-i, y+ht/4+ht/2-i, x2-i, y+ht-i*2) self.drawLine(x2-i, y+ht-i*2, x+i, y1) self.setPenColor(temp) else: if lt > wid /2: lt = wid//2 for i in range(y, y+ht+1): self.drawLine(x, y1, x1, i) if outline and lt != 0: temp = self.getPenColor() self.setPenColor(Color.BLACK) for i in range(lt): self.drawLine(x+i, y1, x1, y+i) if x1 != x: crapliney1 = (y1 - y)/(x1 - x)*(x+i - x + 1) + y crapliney2 = y + ht - (y1 - y)/(x1 - x)*(x+i - x + 1) self.drawLine(x1-i, crapliney1, x1-i, crapliney2) self.drawLine(x1, y+ht-i, x+i, y1) self.setPenColor(temp) def drawRightFrame(self, x, y, wid, ht, lt, frame, outline=True): if lt > ht /2: lt = ht //2 if frame == 1: y1 = y + ht/2 y2 = y + ht * 5/8 y3 = y + ht * 3/4 elif frame == 2: y1 = y + ht * 5/8 y2 = y + ht * 3/4 y3 = y + ht * 7/8 elif frame == 0: y1 = y + ht * 3/4 y2 = y + ht * 7/8 y3 = y + ht - 1 x1 = x x2 = x + wid - ht/8 x3 = x + wid if wid > ht/8: for i in range(y1, y3 + 1): self.drawLine(x1, i, x2, i) self.drawLine(x2, i, x3, y2) if outline: temp = self.getPenColor() self.setPenColor(Color.BLACK) for i in range(lt): self.drawLine(x1, y1 + i, x2, y1 + i) self.drawLine(x2, y1 + i, x3 - i, y2) self.drawLine(x3 - i, y2, x2, y3 - i) self.drawLine(x2, y3 - i, x1, y3 -i) self.drawLine(x1 + i, y3 - i, x1 + i, y1 + i) self.setPenColor(temp) else: for i in range(y1, y3 + 1): self.drawLine(x1, i, x3, y2) if outline: temp = self.getPenColor() self.setPenColor(Color.BLACK) self.drawLine(x1, y1, x3, y2) self.drawLine(x3, y2, x1, y3) self.drawLine(x1, y1, x1, y3) self.setPenColor(temp) def drawRightFrameRect(self, x, y, wid, ht, lt, frame, outline=True): if lt > ht /2: lt = ht //2 if frame == 1: y1 = y + ht/2 y3 = y + ht * 3/4 elif frame == 2: y1 = y + ht * 5/8 y3 = y + ht * 7/8 elif frame == 0: y1 = y + ht * 3/4 y3 = y + ht - 1 x1 = x x2 = x + wid for i in range(y1, y3 + 1): self.drawLine(x1, i, x2, i) if outline: temp = self.getPenColor() self.setPenColor(Color.BLACK) for i in range(lt): self.drawLine(x1, y1 + i, x2, y1 + i) self.drawLine(x2, y1 + i, x2 - i, y3) self.drawLine(x2, y3 - i, x1, y3 -i) self.drawLine(x1 + i, y3 - i, x1 + i, y1 + i) self.setPenColor(temp) def drawLeftFrame(self, x, y, wid, ht, lt, frame, outline=True): if lt > ht /2: lt = ht //2 if frame == 1: y1 = y y2 = y + ht /8 y3 = y + ht/4 elif frame == 2: y1 = y + ht /8 y2 = y + ht/4 y3 = y + ht * 3/8 elif frame == 0: y1 = y + ht / 4 y2 = y + ht * 3/8 y3 = y + ht / 2 x1 = x + wid x2 = x + ht/8 x3 = x if wid > ht/8: for i in range(y1, y3 + 1): self.drawLine(x1, i, x2, i) self.drawLine(x2, i, x3, y2) if outline: temp = self.getPenColor() self.setPenColor(Color.BLACK) for i in range(lt): self.drawLine(x1, y1 + i, x2, y1 + i) self.drawLine(x2, y1 + i, x3 - i, y2) self.drawLine(x3 - i, y2, x2, y3 - i) self.drawLine(x2, y3 - i, x1, y3 -i) self.drawLine(x1 + i, y3 - i, x1 + i, y1 + i) self.setPenColor(temp) else: for i in range(y1, y3 + 1): self.drawLine(x1, i, x3, y2) if outline: temp = self.getPenColor() self.setPenColor(Color.BLACK) self.drawLine(x1, y1, x3, y2) self.drawLine(x3, y2, x1, y3) self.drawLine(x1, y1, x1, y3) self.setPenColor(temp) def drawLeftFrameRect(self, x, y, wid, ht, lt, frame, outline=True): if lt > ht /2: lt = ht //2 if frame == 1: y1 = y y3 = y + ht/4 elif frame == 2: y1 = y + ht /8 y3 = y + ht * 3/8 elif frame == 0: y1 = y + ht / 4 y3 = y + ht / 2 x1 = x + wid x2 = x for i in range(y1, y3 + 1): self.drawLine(x1, i, x2, i) if outline: temp = self.getPenColor() self.setPenColor(Color.BLACK) for i in range(lt): self.drawLine(x1, y1 + i, x2, y1 + i) self.drawLine(x2 - i, y1, x2 - i, y3) self.drawLine(x2, y3 - i, x1, y3 -i) self.drawLine(x1 + i, y3, x1 + i, y1) self.setPenColor(temp) def drawPointer(self, x, y, ht, lt, outline=True): x1 = x - int(round(0.577350269 * ht/2)) x2 = x + int(round(0.577350269 * ht/2)) y1 = y + ht/2 y2 = y + ht - 1 for i in range(x1, x2 + 1): self.drawLine(i, y2, x, y1) if outline: temp = self.getPenColor() self.setPenColor(Color.BLACK) self.drawLine(x, y1, x1, y2) self.drawLine(x, y1, x2, y2) self.drawLine(x1, y2, x2, y2) self.setPenColor(temp) def bresLine(x,y,x2,y2): """Bresenham line algorithm""" steep = 0 coords = [] dx = int(abs(x2 - x)+0.5) if (x2 - x) > 0: sx = 1 else: sx = -1 dy = int(abs(y2 - y)+0.5) if (y2 - y) > 0: sy = 1 else: sy = -1 if dy > dx: steep = 1 x,y = y,x dx,dy = dy,dx sx,sy = sy,sx dx2 = dx*2 dy2 = dy*2 d = dy2 - dx for i in range(0,dx): coords.append( (x,y) ) while d >= 0: y += sy d -= dx2 x += sx d += dy2 if steep: #transpose x's and y's coords = [ (c[1],c[0]) for c in coords ] coords.append( (x2,y2) ) return coords bresLine = staticmethod( bresLine ) def _drawLine( self, x1, y1, x2, y2 ): # special checks for vert and horiz lines if ( x1 == x2 ): if 0 <= x1 < self.wd: if ( y2 < y1 ): y1,y2 = y2,y1 cury = max( y1, 0 ) maxy = min( y2, self.ht-1 ) while cury <= maxy : self.plotPoint( x1, cury ) cury += 1 return if ( y1 == y2 ): if ( 0 <= y1 < self.ht ): if ( x2 < x1 ): x1,x2 = x2,x1 curx = max( x1, 0 ) maxx = min( x2, self.wd-1 ) while curx <= maxx: self.plotPoint( curx, y1 ) curx += 1 return for pt in BitMap.bresLine(x1, y1, x2, y2): self.plotPoint( pt[0], pt[1] ) def _drawLines( self, lineSegs ): for x1,y1,x2,y2 in lineSegs: self._drawLine( x1, y1, x2, y2 ) def drawLine( self, x1, y1, x2, y2, type=LINE_SOLID ): if type == BitMap.LINE_SOLID: self._drawLine( x1, y1, x2, y2 ) elif type == BitMap.LINE_DASHED: # how many segs? len = hypot( x2-x1, y2-y1 ) numsegs = len / BitMap._DASH_LEN dx = ( x2 - x1 ) / numsegs dy = ( y2 - y1 ) / numsegs dx2 = dx / 2.0 dy2 = dy / 2.0 if ( x2 < x1 ): x1,x2 = x2,x1 y1,y2 = y2,y1 segs = [] curx = x1 cury = y1 for i in range( int(numsegs) ): segs.append( ( curx, cury, curx + dx2, cury + dy2 ) ) curx += dx cury += dy if curx + dx2 > x2: segs.append( ( curx, cury, x2, y2 ) ) else: segs.append( ( curx, cury, curx + dx2, cury + dy2 ) ) self._drawLines( segs ) elif type == BitMap.LINE_DOTTED: len = hypot( x2-x1, y2-y1 ) numsegs = len / BitMap._DOT_LEN dx = ( x2 - x1 ) / numsegs dy = ( y2 - y1 ) / numsegs dx2 = dx / 2.0 dy2 = dy / 2.0 if ( x2 < x1 ): x1,x2 = x2,x1 y1,y2 = y2,y1 segs = [] curx = x1 cury = y1 for i in range( int(numsegs) ): segs.append( ( curx, cury, curx + dx2, cury + dy2 ) ) curx += dx cury += dy if curx + dx2 > x2: segs.append( ( curx, cury, x2, y2 ) ) else: segs.append( ( curx, cury, curx + dx2, cury + dy2 ) ) self._drawLines( segs ) elif type == BitMap.LINE_DOT_DASH: len = hypot( x2-x1, y2-y1 ) numsegs = len / BitMap._DOT_DASH_LEN dx = ( x2 - x1 ) / numsegs dy = ( y2 - y1 ) / numsegs dx3 = dx / 3.0 dy3 = dy / 3.0 dx23 = 0.62*dx dy23 = 0.62*dy dx56 = 0.78*dx dy56 = 0.78*dy if ( x2 < x1 ): x1,x2 = x2,x1 y1,y2 = y2,y1 segs = [] curx = x1 cury = y1 for i in range( int(numsegs) ): segs.append( ( curx, cury, curx + dx3, cury + dy3 ) ) segs.append( ( curx + dx23, cury + dy23, curx + dx56, cury + dy56 ) ) curx += dx cury += dy if curx + dx3 > x2: segs.append( ( curx, cury, x2, y2 ) ) else: segs.append( ( curx, cury, curx + dx3, cury + dy3 ) ) if curx + dx23 < x2: if curx + dx56 > x2: segs.append( ( curx + dx23, cury + dy23, x2, y2 ) ) else: segs.append( ( curx + dx23, cury + dy23, curx + dx56, cury + dy56 ) ) else: pass #segs.append( ( curx, cury, curx + dx3, cury + dy3 ) ) segs.append( ( curx, cury, x2, y2 ) ) self._drawLines( segs ) def drawCircle( self, cx, cy, r, fill=False ): x = 0 y = r d = 1 - r self.plotPoint(cx, cy + y) self.plotPoint(cx, cy - y) if fill: self.drawLine(cx - y, cy, cx + y, cy) else: self.plotPoint(cx + y, cy) self.plotPoint(cx - y, cy) while( y > x ): if ( d < 0 ): d += ( 2*x + 3 ) else: d += ( 2*(x-y) + 5 ) y -= 1 x += 1 if fill: self.drawLine(cx + x - 1, cy + y, cx - x + 1, cy + y) self.drawLine(cx - x + 1, cy - y, cx + x - 1, cy - y) self.drawLine(cx + y - 1, cy + x, cx - y + 1, cy + x) self.drawLine(cx - y + 1, cy - x, cx + y - 1, cy - x) else: self.plotPoint(cx + x, cy + y) self.plotPoint(cx + y, cy + x) self.plotPoint(cx - x, cy - y) self.plotPoint(cx - y, cy - x) self.plotPoint(cx + x, cy - y) self.plotPoint(cx - y, cy + x) self.plotPoint(cx - x, cy + y) self.plotPoint(cx + y, cy - x) # method for creating gif string def createGIFString(self, oneistone): if not oneistone: if self.wd > 1000: modifier = 1000.0 / self.wd self.wd = 1000 self.ht = int(self.ht * modifier) else: oneistone = True binarystring = 'GIF89a' # header binarystring += struct.pack('h', self.wd) + struct.pack('h', self.ht) + chr(int('10010110', 2)) + '\x00\x00' if len(self.palette) <= 128: for i in self.palette: colour = Color.fromLong(i) binarystring += chr(colour.red) + chr(colour.grn) + chr(colour.blu) for i in range(128 - len(self.palette)): binarystring += chr(255) + chr(255) + chr(255) else: for i in range(8): # 128 colour table for j in range(4): for k in range(4): binarystring += chr(int(i*36.5)) + chr(j*85) + chr(k*85) binarystring += ',\x00\x00\x00\x00' + struct.pack('h', self.wd) + struct.pack('h', self.ht) + '\x00' # image descriptor binarystring += '\x07' # LZW Minimum code size pixstring = '' self.bitarray.reverse() for a, i in enumerate(self.bitarray): for b, j in enumerate(i): if len(self.palette) <= 128: if oneistone: pixstring += chr(j) else: if (int(a*modifier) != int((a-1) * modifier) or a == 0) and (int(b*modifier) != int((b-1)*modifier) or b == 0): pixstring += chr(j) else: colourhash = self.palette[j] colour = Color.fromLong(colourhash) colbin = "{0:b}".format(colour.red / 32).zfill(3) + "{0:b}".format(colour.grn / 64).zfill(2) + "{0:b}".format(colour.blu / 64).zfill(2) if oneistone: pixstring += chr(int(colbin, 2)) else: if (int(a*modifier) != int((a-1) * modifier) or a == 0) and (int(b*modifier) != int((b-1)*modifier) or b == 0): pixstring += chr(int(colbin, 2)) for i in range(0, len(pixstring), 8): binarystring += '\x09\x80' + pixstring[i:i+8] binarystring += '\x01\x81' binarystring += '\x00;' return base64.b64encode(binarystring) def _saveBitMapNoCompression( self, filename ): # open file with open( filename, "wb" ) as f: # write bitmap header f.write((b"BM") ) f.write(( 54 + 256*4 + self.ht*self.wd ).to_bytes(4, byteorder='little', signed=False )) # DWORD size in bytes of the file f.write( ( 0 ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD 0 f.write( ( 54 + 256*4 ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD offset to the data f.write( ( 40 ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD header size = 40 f.write( ( self.wd ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD image width f.write( ( self.ht ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD image height f.write( ( 1 ).to_bytes(2, byteorder='little', signed=False ) ) # WORD planes = 1 f.write( ( 8 ).to_bytes(2, byteorder='little', signed=False ) ) # WORD bits per pixel = 8 f.write( ( 0 ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD compression = 0 f.write( ( self.wd * self.ht ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD sizeimage = size in bytes of the bitmap = width * height f.write( ( 0 ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD horiz pixels per meter (?) f.write( ( 0 ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD ver pixels per meter (?) f.write( ( 256 ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD number of s used = 256 f.write( ( len(self.palette) ).to_bytes(4, byteorder='little', signed=False ) ) # DWORD number of "import s = len( self.palette ) # write bitmap palette for clr in self.palette: f.write( ( clr ).to_bytes(4, byteorder='little', signed=False ) ) for i in range( len(self.palette), 256 ): f.write( ( 0 ).to_bytes(4, byteorder='little', signed=False ) ) # write pixels for row in self.bitarray: for pixel in row: f.write( ( pixel ).to_bytes(1, byteorder='little', signed=False ) ) padding = ( 4 - len(row) % 4 ) % 4 for i in range(padding): f.write( ( 0 ).to_bytes(1, byteorder='little', signed=False ) ) def saveFile( self, filename ): self._saveBitMapNoCompression( filename ) # For converting arttemis colour codes to an RGB value def artColourTable(x): if x == 0: y = (255, 255, 255) elif x == 1: y = (100, 100, 100) elif x == 2: y = (255, 0, 0) elif x == 3: y = (0, 255, 0) elif x == 4: y = (0, 0, 255) elif x == 5: y = (0, 255, 255) elif x == 6: y = (255, 0, 255) elif x == 7: y = (255, 255, 0) elif x == 8: y = (152, 255, 152) elif x == 9: y = (135, 206, 250) elif x == 10: y = (255, 165, 0) elif x == 11: y = (200, 150, 100) elif x == 12: y = (255, 200, 200) elif x == 13: y = (170, 170, 170) elif x == 14: y = (0, 0, 0) elif x == 15: y = (255, 63, 63) elif x == 16: y = (255, 127, 127) elif x == 17: y = (255, 191, 191) return y # For reading in genbank or EMBL files def getArrows(filename, legname): length = None theseq = '' genbank = open(filename) outlist = [] getFeats = False emblcheck = False getColour = False getemblseq = False getgenseq = False getmultifasta = False for line in genbank: if '\t' in line: sys.stderr.write('Tab found in genbank file, this may cause some Features to be missed, please remove tabs.') if line.startswith('FEATURES') or line.startswith(' source'): getFeats = True elif line.startswith('FT'): getFeats = True emblcheck = True elif line.startswith('>') and not getFeats: if getmultifasta: theseq += 'qqq' else: getmultifasta = True elif getmultifasta: theseq += line.rstrip() elif not line.startswith(' ') and not emblcheck: getFeats = False elif emblcheck: getFeats = False if line[2:].startswith(' ') and line[5] != ' ' and getFeats: feat, loc = line[2:].split() if 'join(' in loc or 'order(' in loc: if loc.startswith('join('): temp2 = loc[5:-1].split(',') strand = '+' elif loc.startswith('complement('): temp2 = loc[11:-1].split(',') strand = '-' elif loc.startswith('order('): temp2 = loc[6:-1].split(',') temp = [[], []] gotit = True for i in temp2: if ':' in i: i = i.split(':')[1] if '<' in i: i = i.replace('<', '') if '>' in i: i = i.replace('>', '') if ')' in i: i = i.replace(')', '') if i.startswith('complement('): strand = '-' i = i[11:] if i.startswith('join('): i = i[5:] if i.startswith('order('): i = i[6:] if '..' in i: try: start, stop = i.split('..') except: start, stop = 'x', 'y' elif '^' in i: try: start, stop = i.split('^') except: start, stop = 'x', 'y' elif '.' in i: try: start, stop = i.split('.') except: start, stop = 'x', 'y' else: if i.startswith('gap('): start = None else: start = i stop = i try: if start != None: temp[0].append(int(start)) temp[1].append(int(stop)) except: if gotit: sys.stderr.write('feature could not be processed:\n{}\n'.format(line)) gotit = False if gotit: aninstance = feature(temp[0], temp[1], feat, strand, None, None) outlist.append(aninstance) if feat == 'source': try: lengtht = max([max(temp[0]), max(temp[1])]) if lengtht > length: length = lengtht except: pass else: if loc.startswith('complement('): strand = '-' loc = loc[11:-1] else: strand = '+' if ':' in loc: loc = loc.split(':')[1] if '<' in loc: loc = loc.replace('<', '') if '>' in loc: loc = loc.replace('>', '') if '..' in loc: try: start, stop = loc.split('..') except: start, stop = 'x', 'y' elif '^' in loc: try: start, stop = loc.split('^') except: start, stop = 'x', 'y' elif '.' in loc: try: start, stop = loc.split('.') except: start, stop = 'x', 'y' else: start = loc stop = loc try: aninstance = feature(int(start), int(stop), feat, strand, None, None) outlist.append(aninstance) except: sys.stderr.write('feature could not be processed:\n{}\n'.format(line)) if feat == 'source': try: lengtht = max([int(start), int(stop)]) if lengtht > length: length = lengtht except: pass elif line[2:].startswith(' /colour=') and getFeats: temp = line[27:-1] temp = temp.replace('"', '') temp = temp.replace("'", "") artColourF = temp.split() try: if len(artColourF) == 1: artColour = artColourTable(int(artColourF[0])) else: artColour = (int(artColourF[0]), int(artColourF[1]), int(artColourF[2])) outlist[-1].colour = artColour except: sys.stderr.write('Colour could not be processed:\n{}\n'.format(line)) elif line[2:].startswith(' /color=') and getFeats: temp = line[26:-1] temp = temp.replace('"', '') temp = temp.replace("'", "") artColourF = temp.split() try: if len(artColourF) == 1: artColour = artColourTable(int(artColourF[0])) else: artColour = (int(artColourF[0]), int(artColourF[1]), int(artColourF[2])) outlist[-1].colour = artColour except: sys.stderr.write('Colour could not be processed:\n{}\n'.format(line)) elif line[2:].startswith(' /colour=') and getFeats: temp = line[29:-1] temp = temp.replace('"', '') temp = temp.replace("'", "") artColourF = temp.split() try: if len(artColourF) == 1: artColour = artColourTable(int(artColourF[0])) else: artColour = (int(artColourF[0]), int(artColourF[1]), int(artColourF[2])) outlist[-1].colour = artColour except: sys.stderr.write('Colour could not be processed:\n{}\n'.format(line)) elif line[2:].startswith(' /color=') and getFeats: temp = line[28:-1] temp = temp.replace('"', '') temp = temp.replace("'", "") try: artColourF = temp.split() if len(artColourF) == 1: artColour = artColourTable(int(artColourF[0])) else: artColour = (int(artColourF[0]), int(artColourF[1]), int(artColourF[2])) except: sys.stderr.write('Colour could not be processed:\n{}\n'.format(line)) outlist[-1].colour = artColour elif line[2:].startswith(' /gene=') and getFeats and legname == 'gene': outlist[-1].name = line.rstrip()[27:].replace('"', '') elif line[2:].startswith(' /product=') and getFeats and legname == 'product': outlist[-1].name = line.rstrip()[30:].replace('"', '') elif line[2:].startswith(' /locus_tag=') and getFeats and legname == 'locus_tag': outlist[-1].name = line.rstrip()[32:].replace('"', '') elif line[2:].startswith(' /note=') and getFeats and legname == 'note': outlist[-1].name = line.rstrip()[27:].replace('"', '') elif line.startswith('ORIGIN') and length == None: getgenseq = True elif line.startswith('SQ Sequence ') and length == None: getemblseq = True elif line.startswith('//'): getemblseq = False getgenseq = False if length == None: length = len(theseq) elif getemblseq: theseq += ''.join(line.split()[:-1]) elif getgenseq: theseq += ''.join(line.split()[1:]) if getmultifasta: insertSize = len(theseq) // 500 multifastapos = 1 for i in theseq.split('qqq'): aninstance = feature(multifastapos, multifastapos + len(i) - 1, 'contig', '+', None, None) outlist.append(aninstance) multifastapos += len(i) -1 + insertSize theseq = theseq.replace('qqq', 'n' * (len(theseq) // 500)) if length == None and theseq != '': length = len(theseq) return length, outlist # detects whether blast+ is in your path def isNewBlastDB(): path = os.environ["PATH"].split(os.pathsep) isit = False for i in path: if os.path.exists(i + '/' + 'makeblastdb.exe') or os.path.exists(i + '/' 'makeblastdb'): isit = True return isit def isNewBlastn(): path = os.environ["PATH"].split(os.pathsep) isit = False for i in path: if os.path.exists(i + '/' + 'blastn.exe') or os.path.exists(i + '/' 'blastn'): isit = True return isit def isNewTblastx(): path = os.environ["PATH"].split(os.pathsep) isit = False for i in path: if os.path.exists(i + '/' + 'tblastx.exe') or os.path.exists(i + '/' 'tblastx'): isit = True return isit # detects legacy blast in your path def isLegBlastDB(): path = os.environ["PATH"].split(os.pathsep) isit = False for i in path: if os.path.exists(i + '/' + 'formatdb.exe') or os.path.exists(i + '/' 'formatdb'): isit = True return isit def isLegBlastall(): path = os.environ["PATH"].split(os.pathsep) isit = False for i in path: if os.path.exists(i + '/' + 'blastall.exe') or os.path.exists(i + '/' 'blastall'): isit = True return isit # gets all blast hits length >minlength and e value < mineval and identity > minident def getBlast(filename, minlength, mineval, minident): if filename == '': return [] blast = open(filename) testline = blast.readline() try: query, subject, ident, length, mismatch, indel, qStart, qEnd, rStart, rEnd, eVal, bitScore = testline.split() ident = float(ident) length = int(length) mismatch = int(mismatch) indel = int(indel) qStart = int(qStart) qEnd = int(qEnd) rStart = int(rStart) rEnd = int(rEnd) eVal = float(eVal) bitScore = float(bitScore) crunch = False except: crunch = True blast.close() blast = open(filename) outlist = [] for line in blast: if crunch: score, ident, qStart, qEnd, query, rStart, rEnd, subject = line.split()[:8] qStart = int(qStart) qEnd = int(qEnd) eVal = 0 length = abs(qStart - qEnd) else: query, subject, ident, length, mismatch, indel, qStart, qEnd, rStart, rEnd, eVal, bitScore = line.split() eVal = float(eVal) ident = float(ident) length = int(length) qStart = int(qStart) qEnd = int(qEnd) rStart = int(rStart) rEnd = int(rEnd) eVal = float(eVal) if length >= minlength and eVal <= mineval and ident >= minident: outlist.append((qStart, qEnd, rStart, rEnd, ident)) return outlist #draws teh image def draw(filename, minlength, mineval, minIdent, inputlist, width, height1, height2, minblastc, maxblastc, minblastci, maxblastci, drawfig1, drawfig2, drawfig3, reverseList, featDict, glt, exont, genet, featlengths, aln, graphit, blastoutline, minmaxlist, autodetect, legend, legname, writebmp=0): # global variable for stopping script midway global abortCaptain secondlist = [] maxlength = 0 totalheight = 0 # returning a minident value of 101 means the script has been aborted minident = 101 # gets feature file and blast information for i in range(0, len(inputlist)): if i % 2 == 0: temp = getArrows(inputlist[i], legname) thirdlist = [] if minmaxlist[i//2][1] == 'Max': if temp[0] == None: maxcut = featlengths[i//2] else: maxcut = temp[0] if minmaxlist[i//2][0] == 1: minmaxopt = 0 else: minmaxopt = 1 mincut = minmaxlist[i//2][0] else: mincut = minmaxlist[i//2][0] maxcut = minmaxlist[i//2][1] if minmaxlist[i//2][0] < minmaxlist[i//2][1]: minmaxopt = 1 else: minmaxopt = 2 for j in temp[1]: if j.type in featDict: if j.colour == None: j.colour = featDict[j.type][1] if minmaxopt == 0: thirdlist.append(j) elif minmaxopt == 1: if type(j.start) == int: if j.start >= mincut and j.stop <= maxcut: aninstance = feature(j.start - mincut + 1, j.stop - mincut + 1, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) else: if j.start[0] >= mincut and j.stop[-1] <= maxcut: tempstart = [] for k in j.start: tempstart.append(k - mincut + 1) tempstop = [] for k in j.stop: tempstop.append(k - mincut + 1) aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) elif minmaxopt == 2: if temp[0] == None: templength = featlengths[i//2] else: templength = temp[0] if type(j.start) == int: if j.stop <= maxcut: tempstart = j.start + templength - mincut + 1 tempstop = j.stop + templength - mincut + 1 aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) elif j.start >= mincut: tempstart = j.start - mincut + 1 tempstop = j.stop - mincut + 1 aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) else: if j.stop[-1] <= maxcut: tempstart = [] for k in j.start: tempstart.append(k + templength - mincut + 1) tempstop = [] for k in j.stop: tempstop.append(k + templength - mincut + 1) aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) elif j.start[0] >= mincut: tempstart = [] for k in j.start: tempstart.append(k - mincut + 1) tempstop = [] for k in j.stop: tempstop.append(k - mincut + 1) aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) thirdlist.sort(key=lambda ii: ii.length(), reverse=True) if minmaxopt == 0: if temp[0] == None: secondlist.append((featlengths[i//2], thirdlist)) if featlengths[i//2] > maxlength: maxlength = featlengths[i//2] else: secondlist.append((temp[0], thirdlist)) if temp[0] > maxlength: maxlength = temp[0] elif minmaxopt == 1: secondlist.append((maxcut - mincut + 1, thirdlist)) if maxcut - mincut + 1 > maxlength: maxlength = maxcut - mincut + 1 elif minmaxopt == 2: if temp[0] == None: templength = featlengths[i//2] else: templength = temp[0] secondlist.append((templength - mincut + maxcut + 1, thirdlist)) if templength - mincut + maxcut + 1 > maxlength: maxlength = templength - mincut + maxlength + 1 totalheight += height1 else: totalheight += height2 temp = getBlast(inputlist[i], minlength, mineval, minIdent) for j in temp: if j[4] < minident: minident = j[4] secondlist.append(temp) # calculates offsets for genomes if best blast alignment is selected if autodetect and maxlength > 100000: tempsecond = [] minident = 101 for i in range(len(secondlist)): temp = [] if i % 2 == 0: for j in secondlist[i][1]: if type(j.start) == int: if (j.stop - j.start) * 1.0/ maxlength * width > 4: temp.append(j) else: if (j.stop[0] - j.start[0]) * 1.0/ maxlength * width > 4: temp.append(j) tempsecond.append((secondlist[i][0], temp)) else: for j in secondlist[i]: if (j[1] - j[0]) * 1.0 / maxlength * width > 3: temp.append(j) if j[4] < minident: minident = j[4] tempsecond.append(temp) secondlist = tempsecond if minIdent != 0: minident = minIdent if aln == 'best blast': blastmatch = [0] for i in range(1, len(secondlist), 2): maxbitscore = 0 for j in secondlist[i]: if j[1] - j[0] > maxbitscore: qstart, qend, rstart, rend = j[0], j[1], j[2], j[3] maxbitscore = j[1] - j[0] if len(secondlist[i]) == 0: theQstart = 0 elif reverseList[i//2]: theQstart = secondlist[i-1][0] - qend else: theQstart = qstart if reverseList[(i+1)//2]: if len(secondlist[i]) == 0: theRstart = 0 elif rstart < rend: theRstart = secondlist[i+1][0] - rend else: theRstart = secondlist[i+1][0] - rstart else: if len(secondlist[i]) == 0: theRstart = 0 elif rstart < rend: theRstart = rstart else: theRstart = rend blastmatch.append(blastmatch[-1] + theQstart - theRstart) theminblast = min(blastmatch) templist = [] for i in blastmatch: templist.append(i - theminblast) blastmatch = templist for i in range(0, len(secondlist) + 1, 2): if secondlist[i][0] + blastmatch[i//2] > maxlength: maxlength = secondlist[i][0] + blastmatch[i//2] leghei = 0 if legend == 'Single column' or legend == 'Two columns': legendArrows = set() legendList = [] for i in range(len(secondlist)): if i % 2 == 0: legendList.append([]) for j in secondlist[i][1]: if j.name != None and (j.name, j.colour, featDict[j.type][0]) not in legendArrows: legendArrows.add((j.name, j.colour, featDict[j.type][0])) if type(j.start) == int: tempjstart = j.start else: tempjstart = j.start[0] legendList[i//2].append((j.name, j.colour, featDict[j.type][0], tempjstart)) if legend == 'Single column': leghei += min([5000, len(legendArrows) * 90]) elif legend == 'Two columns': leghei = min([5000, (len(legendArrows) + 1) / 2 * 90]) global shifter if legend == 'Top' or legend == 'Top & Bottom': toplegpos = [0, 0, 0, set(), set(), set()] legendTop = [] testbmp = BitMap(10, 10) if aln == 'best blast': shifter = blastmatch[0] genrev1 = reverseList[0] for j in secondlist[0][1]: if j.name != None: if type(j.start) == int: firstleg = True secondleg = True thirdleg = True if genrev1: legpos = convertPosR(secondlist[0][0], maxlength, width, (j.start + j.stop)/2, aln) else: legpos = convertPos(secondlist[0][0], maxlength, width, (j.start + j.stop)/2, aln) for q in range(legpos - 40, legpos + 50): if q in toplegpos[3]: firstleg = False if q in toplegpos[4]: secondleg = False if q in toplegpos[5]: thirdleg = False if firstleg: therung = 1 if testbmp.lengthString(j.name[:10], 64) > toplegpos[0]: toplegpos[0] = testbmp.lengthString(j.name[:10], 64) for q in range(legpos - 40, legpos + 50): toplegpos[3].add(q) # elif secondleg: # therung = 2 # if testbmp.lengthString(j.name[:10], 64) > toplegpos[1]: # toplegpos[1] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # toplegpos[4].add(q) # elif thirdleg: # therung = 3 # if testbmp.lengthString(j.name[:10], 64) > toplegpos[2]: # toplegpos[2] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # toplegpos[5].add(q) else: therung = None legendTop.append((j.name[:10], legpos, therung)) else: firstleg = True secondleg = True thirdleg = True if genrev1: legpos = convertPosR(secondlist[0][0], maxlength, width, (j.start[0] + j.stop[0])/2, aln) else: legpos = convertPos(secondlist[0][0], maxlength, width, (j.start[0] + j.stop[0])/2, aln) for q in range(legpos - 40, legpos + 50): if q in toplegpos[3]: firstleg = False if q in toplegpos[4]: secondleg = False if q in toplegpos[5]: thirdleg = False if firstleg: therung = 1 if testbmp.lengthString(j.name[:10], 64) > toplegpos[0]: toplegpos[0] = testbmp.lengthString(j.name[:10], 64) for q in range(legpos - 40, legpos + 50): toplegpos[3].add(q) # elif secondleg: # therung = 2 # if testbmp.lengthString(j.name[:10], 64) > toplegpos[1]: # toplegpos[1] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # toplegpos[4].add(q) # elif thirdleg: # therung = 3 # if testbmp.lengthString(j.name[:10], 64) > toplegpos[2]: # toplegpos[2] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # toplegpos[5].add(q) else: therung = None legendTop.append((j.name[:10], legpos, therung)) totalheight += sum(toplegpos[:3]) + 40 if legend == 'Bottom' or legend == 'Top & Bottom': botlegpos = [0, 0, 0, set(), set(), set()] legendBot = [] testbmp = BitMap(10, 10) if aln == 'best blast': shifter = blastmatch[-1] genrev1 = reverseList[-1] for j in secondlist[-1][1]: if j.name != None: if type(j.start) == int: firstleg = True secondleg = True thirdleg = True if genrev1: legpos = convertPosR(secondlist[-1][0], maxlength, width, (j.start + j.stop)/2, aln) else: legpos = convertPos(secondlist[-1][0], maxlength, width, (j.start + j.stop)/2, aln) for q in range(legpos - 40, legpos + 50): if q in botlegpos[3]: firstleg = False if q in botlegpos[4]: secondleg = False if q in botlegpos[5]: thirdleg = False if firstleg: therung = 1 if testbmp.lengthString(j.name[:10], 64) > botlegpos[0]: botlegpos[0] = testbmp.lengthString(j.name[:10], 64) for q in range(legpos - 40, legpos + 50): botlegpos[3].add(q) # elif secondleg: # therung = 2 # if testbmp.lengthString(j.name[:10], 64) > botlegpos[1]: # botlegpos[1] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # botlegpos[4].add(q) # elif thirdleg: # therung = 3 # if testbmp.lengthString(j.name[:10], 64) > botlegpos[2]: # botlegpos[2] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # botlegpos[5].add(q) else: therung = None legendBot.append((j.name[:10], legpos, therung)) else: firstleg = True secondleg = True thirdleg = True if genrev1: legpos = convertPosR(secondlist[-1][0], maxlength, width, (j.start[0] + j.stop[0])/2, aln) else: legpos = convertPos(secondlist[-1][0], maxlength, width, (j.start[0] + j.stop[0])/2, aln) for q in range((j.start[0] + j.stop[0])/2 - 40, (j.start[0] + j.stop[0])/2 + 50): if q in botlegpos[3]: firstleg = False if q in botlegpos[4]: secondleg = False if q in botlegpos[5]: thirdleg = False if firstleg: therung = 1 if testbmp.lengthString(j.name[:10], 64) > botlegpos[0]: botlegpos[0] = testbmp.lengthString(j.name[:10], 64) for q in range((j.start[0] + j.stop[0])/2 - 40, (j.start[0] + j.stop[0])/2 + 50): botlegpos[3].add(q) # elif secondleg: # therung = 2 # if testbmp.lengthString(j.name[:10], 64) > botlegpos[1]: # botlegpos[1] = testbmp.lengthString(j.name[:10], 64) # for q in range((j.start[0] + j.stop[0])/2 - 40, (j.start[0] + j.stop[0])/2 + 50): # botlegpos[4].add(q) # elif thirdleg: # therung = 3 # if testbmp.lengthString(j.name[:10], 64) > botlegpos[2]: # botlegpos[2] = testbmp.lengthString(j.name[:10], 64) # for q in range((j.start[0] + j.stop[0])/2 - 40, (j.start[0] + j.stop[0])/2 + 50): # botlegpos[5].add(q) else: therung = None legendBot.append((j.name[:10], (j.start[0] + j.stop[0])/2, therung)) totalheight += sum(botlegpos[:3]) + 40 # creates extra width for blast identity legend drawfig1hei = 0 if drawfig1 and minident != 101: drawfig1hei = 500 extraheight = 0 # creates extra height for scale legend drawfig2hei = 0 if drawfig2: drawfig2hei = height1 + 70 # creates extra height for graph totalheight += max([leghei, drawfig1hei, drawfig2hei]) hei = totalheight if graphit != None: hei += graphit[3] * len(graphit[0]) + 2 * graphit[7] * len(graphit[0]) extraheight = (graphit[3] + 20) * len(graphit[0]) bmp = BitMap(width, hei + 1) # draws the scale figure columnhei = max([leghei, drawfig1hei, drawfig2hei]) if legend == 'Single column': index = 0 legendArrows = [] for i in range(len(legendList)): x = legendList[i] x.sort(key=operator.itemgetter(3)) if reverseList[i]: x.reverse() legendArrows += x for i in range(columnhei - 74, 10, -90): if index < len(legendArrows) and legendArrows[index][2] == 'rect': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawOutRect(5, i, 96, 64, genet) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'arrow': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawRightArrow(5, i, 96, 64, genet) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'frame': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawRightFrame(5, i - 48, 96, 128, genet, 1) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'pointer': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawPointer(34, i, 64, genet) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0], 106, i, 64) index += 1 elif legend == 'Two columns': index = 0 legendArrows = [] for i in range(len(legendList)): x = legendList[i] x.sort(key=operator.itemgetter(3)) if reverseList[i]: x.reverse() legendArrows += x for i in range(columnhei - 74, 10, -90): if index < len(legendArrows) and legendArrows[index][2] == 'rect': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawOutRect(5, i, 96, 64, genet) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0][:45], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'arrow': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawRightArrow(5, i, 96, 64, genet) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0][:45], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'frame': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawRightFrame(5, i - 48, 96, 128, genet, 1) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0][:45], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'pointer': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawPointer(34, i, 64, genet) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0][:45], 106, i, 64) index += 1 for i in range(columnhei - 74, 10, -90): if index < len(legendArrows) and legendArrows[index][2] == 'rect': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawOutRect(5 + width/3, i, 96, 64, genet) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0][:45], 106 + width/3, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'arrow': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawRightArrow(5 + width/3, i, 96, 64, genet) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0][:45], 106 + width/3, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'frame': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawRightFrame(5 + width/3, i - 48, 96, 128, genet, 1) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0][:45], 106 + width/3, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'pointer': theColor = Color(legendArrows[index][1][0], legendArrows[index][1][1], legendArrows[index][1][2]) bmp.setPenColor(theColor) bmp.drawPointer(34 + width/3, i, 64, genet) bmp.setPenColor(Color.BLACK) bmp.writeString(legendArrows[index][0][:45], 106 + width/3, i, 64) index += 1 if legend == 'Top' or legend == 'Top & Bottom': rung1 = totalheight - sum(toplegpos[:3]) - 30 rung2 = rung1 + toplegpos[0] + 10 rung3 = rung2 + toplegpos[1] + 10 for i in legendTop: if i[0][0].lower() == i[0][0]: xpos = i[1] + 24 else: xpos = i[1] + 32 if i[2] == 1: bmp.writeString(i[0], xpos, rung1, 64, False, False, 1) elif i[2] == 2: bmp.writeString(i[0], xpos, rung2, 64, False, False, 1) elif i[2] == 3: bmp.writeString(i[0], xpos, rung3, 64, False, False, 1) if legend == 'Bottom' or legend == 'Top & Bottom': rung1 = sum(botlegpos[:3]) + 30 + columnhei rung2 = rung1 - botlegpos[0] - 10 rung3 = rung2 - botlegpos[1] - 10 for i in legendBot: if i[0][-1].lower() == i[0][-1]: xpos = i[1] + 24 else: xpos = i[1] + 32 if i[2] == 1: bmp.writeString(i[0], xpos, rung1, 64, False, False, 1, 'right') elif i[2] == 2: bmp.writeString(i[0], xpos, rung2, 64, False, False, 1, 'right') elif i[2] == 3: bmp.writeString(i[0], xpos, rung3, 64, False, False, 1, 'right') if drawfig2 != False: bmp.setPenColor(Color.BLACK) x1 = width - 600 - drawfig2 * 1.0 / maxlength * width x2 = width - 600 bmp.drawLine(x1, columnhei - height1/2 - 74, x2, columnhei - height1/2 - 74) bmp.drawLine(x1, columnhei - height1/2-1 - 74, x2, columnhei - height1/2-1 - 74) bmp.drawLine(x1, columnhei - height1/2+1 - 74, x2, columnhei - height1/2+1 - 74) bmp.drawLine(x1-1, columnhei - height1 /4 - 74, x1-1, columnhei - height1 /4 * 3 - 74) bmp.drawLine(x1+1, columnhei - height1 /4 - 74, x1+1, columnhei - height1 /4 * 3 - 74) bmp.drawLine(x1, columnhei - height1 /4 - 74, x1, columnhei - height1 /4 * 3 - 74) bmp.drawLine(x2, columnhei - height1 /4 - 74, x2, columnhei - height1 /4 * 3 - 74) bmp.drawLine(x2+1, columnhei - height1 /4 - 74, x2+1, columnhei - height1 /4 * 3 - 74) bmp.drawLine(x2-1, columnhei - height1 /4 - 74, x2-1, columnhei - height1 /4 * 3 - 74) strfig2 = str(drawfig2) if strfig2[-6:] == '000000': strfig2 = strfig2[:-6] + ' Mbp' elif strfig2[-3:] == '000': strfig2 = strfig2[:-3] + ' Kbp' testbmp = BitMap(10, 10) bmp.writeString(strfig2, (x1 + x2)/2 - testbmp.lengthString(strfig2, 64)/2, columnhei - height1 /4 - 59, 64) # draws the graph if graphit != None: thearray, maxgc, mingc, gheight, glinet, gtype, gmaxy, ggap = graphit widthpixellist = [] leftpixellist = [] rightpixellist = [] for i in range(len(thearray)): if aln == 'best blast': shifter = blastmatch[i] if reverseList[i]: rightpixel = convertPosR(secondlist[i*2][0], maxlength, width, 0, aln) leftpixel = convertPosR(secondlist[i*2][0], maxlength, width, secondlist[i*2][0], aln) thearray[i].reverse() else: leftpixel = convertPos(secondlist[i*2][0], maxlength, width, 0, aln) rightpixel = convertPos(secondlist[i*2][0], maxlength, width, secondlist[i*2][0], aln) widthpixel = rightpixel - leftpixel + 1 widthpixellist.append(widthpixel) leftpixellist.append(leftpixel) rightpixellist.append(rightpixel) neg = False if gmaxy == 'Auto': gmaxy = 0 for i in range(0, len(thearray)): if min(thearray[i]) < 0: neg = True for j in range(0, widthpixellist[i]): aa = int(j * (len(thearray[i]) * 1.0 / widthpixellist[i])) bb = int((j + 1) * (len(thearray[i]) * 1.0/ widthpixellist[i])) if aa == bb: bb += 1 temparr = thearray[i][aa:bb] gyval = abs(sum(temparr) * 1.0 / len(temparr)) if gyval > gmaxy: gmaxy = gyval else: gmaxy = float(gmaxy) for i in range(0, len(thearray)): if min(thearray[i]) < 0: neg = True if neg: axispos = hei - ggap - gheight/2 - glinet/2 else: axispos = hei - ggap - gheight - glinet gc1, gc2, gc3 = maxgc maxgcColour = Color(gc1, gc2, gc3) bmp.setPenColor(maxgcColour) gc1, gc2, gc3 = mingc mingcColour = Color(gc1, gc2, gc3) for qq in range(len(thearray)): bmp.setPenColor(Color.BLACK) lastgypos = None for i in range(axispos, axispos + glinet): bmp.drawLine(leftpixellist[qq], i, rightpixellist[qq], i) bmp.setPenColor(maxgcColour) for i in range(0, widthpixellist[qq]): aa = int(i * (len(thearray[qq]) * 1.0 / widthpixellist[qq])) bb = int((i + 1) * (len(thearray[qq]) * 1.0/ widthpixellist[qq])) if aa == bb: bb += 1 temparr = thearray[qq][aa:bb] gyval = sum(temparr) * 1.0 / len(temparr) yvalpixratio = gyval/gmaxy if yvalpixratio > 1: yvalpixratio = 1 if yvalpixratio < -1: yvalpixratio = -1 if neg: if yvalpixratio < 0: gc1, gc2, gc3 = mingc bmp.setPenColor(mingcColour) yvalpix = round(yvalpixratio * (gheight /2 - glinet/2)) if gtype == 'Line': if lastgypos != None: bmp.drawLine(leftpixellist[qq] + i-1, lastgypos, leftpixellist[qq] + i, axispos + yvalpix) lastgypos = axispos + yvalpix elif gtype == 'Histogram': bmp.drawLine(leftpixellist[qq] + i, axispos -1, leftpixellist[qq] + i, axispos + yvalpix) else: gc1, gc2, gc3 = maxgc yvalpix = round(yvalpixratio * (gheight /2 - (glinet - glinet/2))) bmp.setPenColor(maxgcColour) if gtype == 'Line': if lastgypos != None: bmp.drawLine(leftpixellist[qq] + i-1, lastgypos, leftpixellist[qq] + i, axispos + glinet + yvalpix) lastgypos = axispos + glinet + yvalpix elif gtype == 'Histogram' and round(yvalpix) != 0.0: bmp.drawLine(leftpixellist[qq] + i, axispos + glinet, leftpixellist[qq] + i, axispos + yvalpix) else: yvalpix = round(yvalpixratio * (gheight - glinet)) if gtype == 'Line': if lastgypos != None: bmp.drawLine(leftpixellist[qq] + i-1, lastgypos, i, leftpixellist[qq] + axispos + glinet + yvalpix) lastgypos = axispos + glinet + 1 + yvalpix elif gtype == 'Histogram' and round(yvalpix) != 0.0: bmp.drawLine(leftpixellist[qq] + i, axispos + glinet , leftpixellist[qq] + i, axispos + glinet + yvalpix) axispos -= gheight + 2 * ggap + height1 + height2 modfig1 = (graphit[3] + 2 * ggap) * len(graphit[0]) else: modfig1 = 0 # draws the blast gradient legend if drawfig1 and minident != 101: bmp.setPenColor(Color.BLACK) bmp.writeString(str(int(round(minident))) + '%', width - 300, columnhei - 480, 64) bmp.writeString('100%', width - 300, columnhei - 84, 64) for i in range(columnhei - 480, columnhei - 20): ratio = round((i - (columnhei - 480) * 1.0) / 460, 2) r1 = int(minblastc[0] * (1 - ratio) + maxblastc[0] * ratio) r2 = int(minblastc[1] * (1 - ratio) + maxblastc[1] * ratio) r3 = int(minblastc[2] * (1 - ratio) + maxblastc[2] * ratio) theColor = Color(r1, r2, r3) bmp.setPenColor(theColor) bmp.drawLine(width - 400, i, width - 360, i) r1 = int(minblastci[0] * (1 - ratio) + maxblastci[0] * ratio) r2 = int(minblastci[1] * (1 - ratio) + maxblastci[1] * ratio) r3 = int(minblastci[2] * (1 - ratio) + maxblastci[2] * ratio) theColor = Color(r1, r2, r3) bmp.setPenColor(theColor) bmp.drawLine(width - 360, i, width - 320, i) # draws feature and blast figures for i in range(0, len(secondlist)): # draws the blast figure if i % 2 == 0: if aln == 'best blast': shifter = blastmatch[i//2] genrev1 = reverseList[i//2] ymod = totalheight - (height1 * i//2 + height2 * i//2) - height1 if graphit != None and len(thearray) > 1: ymod += (gheight + 2 * ggap) * (len(thearray) - i//2 - 1) if legend == 'Top' or legend == 'Top & Bottom': ymod -= sum(toplegpos[:3]) + 40 length = secondlist[i][0] bmp.setPenColor(Color.BLACK) jj = height1 / 2 + glt / 2 for j in range(glt): bmp.drawLine(convertPos(length, maxlength, width, 0, aln), (ymod +jj), convertPos(length, maxlength, width, length, aln), (ymod + jj)) jj -= 1 bmp.setPenColor(Color.RED) for j in secondlist[i][1]: if abortCaptain: return None if (j.strand == '+' and not genrev1) or (j.strand == '-' and genrev1): theColor = Color(j.colour[0], j.colour[1], j.colour[2]) bmp.setPenColor(theColor) if type(j.start) == int: if genrev1: x2 = convertPosR(length, maxlength, width, j.start, aln) x1 = convertPosR(length, maxlength, width, j.stop, aln) else: x1 = convertPos(length, maxlength, width, j.start, aln) x2 = convertPos(length, maxlength, width, j.stop, aln) if featDict[j.type][0] == 'rect': bmp.drawOutRect(x1, ymod, x2-x1, height1, genet) elif featDict[j.type][0] == 'arrow': bmp.drawRightArrow(x1, ymod, x2-x1, height1, genet) elif featDict[j.type][0] == 'frame': bmp.drawRightFrame(x1, ymod, x2-x1, height1, genet, j.start % 3) elif featDict[j.type][0] == 'pointer': bmp.drawPointer(x1, ymod, height1, genet) else: if genrev1: x2 = convertPosR(length, maxlength, width, j.start[-1], aln) x1 = convertPosR(length, maxlength, width, j.stop[-1], aln) else: x1 = convertPos(length, maxlength, width, j.start[-1], aln) x2 = convertPos(length, maxlength, width, j.stop[-1], aln) if featDict[j.type][0] == 'rect': bmp.drawOutRect(x1, ymod, x2-x1, height1, genet) elif featDict[j.type][0] == 'arrow': bmp.drawRightArrow(x1, ymod, x2-x1, height1, genet) elif featDict[j.type][0] == 'frame': bmp.drawRightFrame(x1, ymod, x2-x1, height1, genet, j.start[-1] % 3) elif featDict[j.type][0] == 'pointer': bmp.drawPointer(x1, ymod, height1, genet) for k in range(2, len(j.start) + 1): if genrev1: x4 = convertPosR(length, maxlength, width, j.start[-k], aln) x3 = convertPosR(length, maxlength, width, j.stop[-k], aln) else: x3 = convertPos(length, maxlength, width, j.start[-k], aln) x4 = convertPos(length, maxlength, width, j.stop[-k], aln) if featDict[j.type][0] == 'arrow' or featDict[j.type][0] == 'rect': if x1 - x4 > 2: bmp.setPenColor(Color.BLACK) bmp.drawDash(x4, ymod + 3*height1/4, x4, ymod + height1, exont) bmp.drawDash(x4, ymod + height1, x1, ymod + height1, exont) bmp.drawDash(x1, ymod + height1, x1, ymod + 3*height1/4, exont) bmp.setPenColor(theColor) bmp.drawOutRect(x3, ymod + height1/4, x4-x3, height1/2, genet) elif featDict[j.type][0] == 'frame': if x1 - x4 > 2: bmp.setPenColor(Color.BLACK) bmp.drawDash(x4, ymod + 3*height1/4, x4, ymod + height1, exont) bmp.drawDash(x4, ymod + height1, x1, ymod + height1, exont) bmp.drawDash(x1, ymod + height1, x1, ymod + 3*height1/4, exont) bmp.setPenColor(theColor) bmp.drawRightFrameRect(x3, ymod, x4-x3, height1, genet, j.start[-k] % 3) x1, x2 = x3, x4 else: theColor = Color(j.colour[0], j.colour[1], j.colour[2]) bmp.setPenColor(theColor) if type(j.start) == int: if genrev1: x2 = convertPosR(length, maxlength, width, j.start, aln) x1 = convertPosR(length, maxlength, width, j.stop, aln) else: x1 = convertPos(length, maxlength, width, j.start, aln) x2 = convertPos(length, maxlength, width, j.stop, aln) if featDict[j.type][0] == 'rect': bmp.drawOutRect(x1, ymod, x2-x1, height1, genet) elif featDict[j.type][0] == 'arrow': bmp.drawLeftArrow(x1, ymod, x2-x1, height1, genet) elif featDict[j.type][0] == 'frame': bmp.drawLeftFrame(x1, ymod, x2-x1, height1, genet, j.stop%3) elif featDict[j.type][0] == 'pointer': bmp.drawPointer(x2, ymod, height1, genet) else: if genrev1: x2 = convertPosR(length, maxlength, width, j.start[0], aln) x1 = convertPosR(length, maxlength, width, j.stop[0], aln) else: x1 = convertPos(length, maxlength, width, j.start[0], aln) x2 = convertPos(length, maxlength, width, j.stop[0], aln) if featDict[j.type][0] == 'rect': bmp.drawOutRect(x1, ymod, x2-x1, height1, genet) elif featDict[j.type][0] == 'arrow': bmp.drawLeftArrow(x1, ymod, x2-x1, height1, genet) elif featDict[j.type][0] == 'frame': bmp.drawLeftFrame(x1, ymod, x2-x1, height1, genet, j.stop[0] % 3) elif featDict[j.type][0] == 'pointer': bmp.drawPointer(x2, ymod, height1, genet) for k in range(1, len(j.start)): if genrev1: x4 = convertPosR(length, maxlength, width, j.start[k], aln) x3 = convertPosR(length, maxlength, width, j.stop[k], aln) else: x3 = convertPos(length, maxlength, width, j.start[k], aln) x4 = convertPos(length, maxlength, width, j.stop[k], aln) if featDict[j.type][0] == 'rect' or featDict[j.type][0] == 'arrow': if x3 - x2 > 2: bmp.setPenColor(Color.BLACK) bmp.drawDash(x2, ymod + 3*height1/4, x2, ymod + height1, exont) bmp.drawDash(x2, ymod + height1, x3, ymod + height1, exont) bmp.drawDash(x3, ymod + height1, x3, ymod + 3*height1/4, exont) bmp.setPenColor(theColor) bmp.drawOutRect(x3, ymod + height1/4, x4-x3, height1/2, genet) elif featDict[j.type][0] == 'frame': if x3 - x2 > 2: bmp.setPenColor(Color.BLACK) bmp.drawDash(x2, ymod + height1/4, x2, ymod, exont) bmp.drawDash(x2, ymod, x3, ymod, exont) bmp.drawDash(x3, ymod, x3, ymod + height1/4, exont) bmp.setPenColor(theColor) bmp.drawLeftFrameRect(x3, ymod, x4-x3, height1, genet, j.stop[k] % 3) x1, x2 = x3, x4 else: # draws teh blast hits genrev2 = reverseList[(i+1)//2] length1 = secondlist[i-1][0] length2 = secondlist[i+1][0] ymod = totalheight - (height1 * (i - 1)/2 + height2 * (i - 1)/2) - height1 - 1 if graphit != None and len(thearray) > 1: ymod += (gheight + 2 * ggap) * (len(thearray) - i//2 - 1) if legend == 'Top' or legend == 'Top & Bottom': ymod -= sum(toplegpos[:3]) + 40 y1 = ymod y2 = y1 - height2 + 1 for j in secondlist[i]: if abortCaptain: return None qStart, qEnd, rStart, rEnd, ident = j # is the blast hit inverted if (rStart < rEnd and not genrev1 and not genrev2) or \ (rStart > rEnd and not genrev1 and genrev2) or \ (rStart < rEnd and genrev1 and genrev2) or \ (rStart > rEnd and genrev1 and not genrev2): crisscross = False else: crisscross = True try: ratio = round((ident - minident) / (100 - minident), 2) except: ratio = 1 if crisscross: r1 = int(minblastci[0] * (1 - ratio) + maxblastci[0] * ratio) r2 = int(minblastci[1] * (1 - ratio) + maxblastci[1] * ratio) r3 = int(minblastci[2] * (1 - ratio) + maxblastci[2] * ratio) else: r1 = int(minblastc[0] * (1 - ratio) + maxblastc[0] * ratio) r2 = int(minblastc[1] * (1 - ratio) + maxblastc[1] * ratio) r3 = int(minblastc[2] * (1 - ratio) + maxblastc[2] * ratio) theColor = Color(r1, r2, r3) bmp.setPenColor(theColor) if aln == 'best blast': shifter = blastmatch[i//2] if genrev1: x1e = convertPosR(length1, maxlength, width, qStart, aln) x1s = convertPosR(length1, maxlength, width, qEnd, aln) else: x1s = convertPos(length1, maxlength, width, qStart, aln) x1e = convertPos(length1, maxlength, width, qEnd, aln) if aln == 'best blast': shifter = blastmatch[(i+1)//2] if genrev2 and rStart < rEnd: x2e = convertPosR(length2, maxlength, width, rStart, aln) x2s = convertPosR(length2, maxlength, width, rEnd, aln) elif genrev2 and rStart >= rEnd: x2s = convertPosR(length2, maxlength, width, rStart, aln) x2e = convertPosR(length2, maxlength, width, rEnd, aln) elif not genrev2 and rStart < rEnd: x2s = convertPos(length2, maxlength, width, rStart, aln) x2e = convertPos(length2, maxlength, width, rEnd, aln) else: x2e = convertPos(length2, maxlength, width, rStart, aln) x2s = convertPos(length2, maxlength, width, rEnd, aln) if crisscross: if x1e - x1s >= x2e - x2s: for k in range(x1s, x1e): try: x2 = x2e - (k - x1s) * 1.0 / (x1e - x1s) * (x2e - x2s) bmp.drawLine(k, y1, x2, y2) except: pass else: for k in range(x2s, x2e): x1 = x1e - (k - x2s) * 1.0 / (x2e - x2s) * (x1e - x1s) bmp.drawLine(x1, y1, k, y2) if blastoutline: bmp.setPenColor(Color.BLACK) bmp.drawLine(x1s, y1, x2e, y2) bmp.drawLine(x1e, y1, x2s, y2) else: if x1e - x1s >= x2e - x2s: for k in range(x1s, x1e): try: x2 = (k - x1s) * 1.0 / (x1e - x1s) * (x2e - x2s) + x2s bmp.drawLine(k, y1, x2, y2) bmp.drawLine(k+1, y1, x2, y2) except: pass else: for k in range(x2s, x2e): x1 = (k - x2s) * 1.0 / (x2e - x2s) * (x1e - x1s) + x1s bmp.drawLine(x1, y1, k, y2) bmp.drawLine(x1, y1, k+1, y2) if blastoutline: bmp.setPenColor(Color.BLACK) bmp.drawLine(x1s, y1, x2s, y2) bmp.drawLine(x1e, y1, x2e, y2) if writebmp == 0: bmp.saveFile(filename) return minident elif writebmp == 1: return bmp.createGIFString(True), minident, bmp.wd, bmp.ht elif writebmp == 2: return bmp.createGIFString(False), minident, bmp.wd, bmp.ht def drawsvg(filename, minlength, mineval, minIdent, inputlist, width, height1, height2, minblastc, maxblastc, minblastci, maxblastci, drawfig1, drawfig2, drawfig3, reverseList, featDict, glt, exont, genet, featlengths, aln, graphit, blastoutline, minmaxlist, autodetect, legend, legname): # global variable for stopping script midway global abortCaptain secondlist = [] maxlength = 0 totalheight = 0 # returning a minident value of 101 means the script has been aborted minident = 101 # gets feature file and blast information for i in range(0, len(inputlist)): if i % 2 == 0: temp = getArrows(inputlist[i], legname) thirdlist = [] if minmaxlist[i//2][1] == 'Max': if temp[0] == None: maxcut = featlengths[i//2] else: maxcut = temp[0] if minmaxlist[i//2][0] == 1: minmaxopt = 0 else: minmaxopt = 1 mincut = minmaxlist[i//2][0] else: mincut = minmaxlist[i//2][0] maxcut = minmaxlist[i//2][1] if minmaxlist[i//2][0] < minmaxlist[i//2][1]: minmaxopt = 1 else: minmaxopt = 2 for j in temp[1]: if j.type in featDict: if j.colour == None: j.colour = featDict[j.type][1] if minmaxopt == 0: thirdlist.append(j) elif minmaxopt == 1: if type(j.start) == int: if j.start >= mincut and j.stop <= maxcut: aninstance = feature(j.start - mincut + 1, j.stop - mincut + 1, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) else: if j.start[0] >= mincut and j.stop[-1] <= maxcut: tempstart = [] for k in j.start: tempstart.append(k - mincut + 1) tempstop = [] for k in j.stop: tempstop.append(k - mincut + 1) aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) elif minmaxopt == 2: if temp[0] == None: templength = featlength[i//2] else: templength = temp[0] if type(j.start) == int: if j.stop <= maxcut: tempstart = j.start + templength - mincut + 1 tempstop = j.stop + templength - mincut + 1 aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) elif j.start >= mincut: tempstart = j.start - mincut + 1 tempstop = j.stop - mincut + 1 aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) else: if j.stop[-1] <= maxcut: tempstart = [] for k in j.start: tempstart.append(k + templength - mincut + 1) tempstop = [] for k in j.stop: tempstop.append(k + templength - mincut + 1) aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) elif j.start[0] >= mincut: tempstart = [] for k in j.start: tempstart.append(k - mincut + 1) tempstop = [] for k in j.stop: tempstop.append(k - mincut + 1) aninstance = feature(tempstart, tempstop, j.type, j.strand, j.colour, j.name) thirdlist.append(aninstance) thirdlist.sort(key=lambda i: i.length(), reverse=True) if minmaxopt == 0: if temp[0] == None: secondlist.append((featlengths[i//2], thirdlist)) if featlengths[i//2] > maxlength: maxlength = featlengths[i//2] else: secondlist.append((temp[0], thirdlist)) if temp[0] >= maxlength: maxlength = temp[0] elif minmaxopt == 1: if maxcut == 'Max': maxcut = temp[0] secondlist.append((maxcut - mincut + 1, thirdlist)) if maxcut - mincut + 1 > maxlength: maxlength = maxcut - mincut + 1 elif minmaxopt == 2: if temp[0] == None: templength = featlengths[i//2] else: templength = temp[0] secondlist.append((templength - mincut + maxcut + 1, thirdlist)) if templength - mincut + maxcut + 1 > maxlength: maxlength = templength - mincut + maxlength + 1 totalheight += height1 else: totalheight += height2 temp = getBlast(inputlist[i], minlength, mineval, minIdent) for j in temp: if j[4] < minident: minident = j[4] secondlist.append(temp) # calculates offsets for genomes if best blast alignment is selected if autodetect and maxlength > 100000: tempsecond = [] minident = 101 for i in range(len(secondlist)): temp = [] if i % 2 == 0: for j in secondlist[i][1]: if type(j.start) == int: if (j.stop - j.start) * 1.0/ maxlength * width > 4: temp.append(j) else: if (j.stop[0] - j.start[0]) * 1.0/ maxlength * width > 4: temp.append(j) tempsecond.append((secondlist[i][0], temp)) else: for j in secondlist[i]: if (j[1] - j[0]) * 1.0 / maxlength * width > 3: temp.append(j) if j[4] < minident: minident = j[4] tempsecond.append(temp) secondlist = tempsecond if minIdent != 0: minident = minIdent if aln == 'best blast': blastmatch = [0] for i in range(1, len(secondlist), 2): maxbitscore = 0 for j in secondlist[i]: if j[1] - j[0] > maxbitscore: qstart, qend, rstart, rend = j[0], j[1], j[2], j[3] maxbitscore = j[1] - j[0] if len(secondlist[i]) == 0: theQstart = 0 elif reverseList[i//2]: theQstart = secondlist[i-1][0] - qend else: theQstart = qstart if reverseList[(i+1)//2]: if len(secondlist[i]) == 0: theRstart = 0 elif rstart < rend: theRstart = secondlist[i+1][0] - rend else: theRstart = secondlist[i+1][0] - rstart else: if len(secondlist[i]) == 0: theRstart = 0 elif rstart < rend: theRstart = rstart else: theRstart = rend blastmatch.append(blastmatch[-1] + theQstart - theRstart) theminblast = min(blastmatch) templist = [] for i in blastmatch: templist.append(i - theminblast) blastmatch = templist for i in range(0, len(secondlist) + 1, 2): if secondlist[i][0] + blastmatch[i//2] > maxlength: maxlength = secondlist[i][0] + blastmatch[i//2] fighei = 0 if legend == 'Single column' or legend == 'Two columns': legendArrows = set() legendList = [] for i in range(len(secondlist)): if i % 2 == 0: legendList.append([]) for j in secondlist[i][1]: if j.name != None and (j.name, j.colour, featDict[j.type][0]) not in legendArrows: legendArrows.add((j.name, j.colour, featDict[j.type][0])) if type(j.start) == int: tempjstart = j.start else: tempjstart = j.start[0] legendList[i//2].append((j.name, j.colour, featDict[j.type][0], tempjstart)) if legend == 'Single column': fighei = min([5000, len(legendArrows) * 90]) elif legend == 'Two columns': fighei = min([5000, (len(legendArrows) + 1) / 2 * 90]) global shifter if legend == 'Top' or legend == 'Top & Bottom': toplegpos = [0, 0, 0, set(), set(), set()] legendTop = [] testbmp = BitMap(10, 10) if aln == 'best blast': shifter = blastmatch[0] genrev1 = reverseList[0] for j in secondlist[0][1]: if j.name != None: if type(j.start) == int: firstleg = True secondleg = True thirdleg = True if genrev1: legpos = convertPosR(secondlist[0][0], maxlength, width, (j.start + j.stop)/2, aln) else: legpos = convertPos(secondlist[0][0], maxlength, width, (j.start + j.stop)/2, aln) for q in range(legpos - 40, legpos + 50): if q in toplegpos[3]: firstleg = False if q in toplegpos[4]: secondleg = False if q in toplegpos[5]: thirdleg = False if firstleg: therung = 1 if testbmp.lengthString(j.name[:10], 64) > toplegpos[0]: toplegpos[0] = testbmp.lengthString(j.name[:10], 64) for q in range(legpos - 40, legpos + 50): toplegpos[3].add(q) # elif secondleg: # therung = 2 # if testbmp.lengthString(j.name[:10], 64) > toplegpos[1]: # toplegpos[1] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # toplegpos[4].add(q) # elif thirdleg: # therung = 3 # if testbmp.lengthString(j.name[:10], 64) > toplegpos[2]: # toplegpos[2] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # toplegpos[5].add(q) else: therung = None legendTop.append((j.name[:10], legpos, therung)) else: firstleg = True secondleg = True thirdleg = True if genrev1: legpos = convertPosR(secondlist[0][0], maxlength, width, (j.start[0] + j.stop[0])/2, aln) else: legpos = convertPos(secondlist[0][0], maxlength, width, (j.start[0] + j.stop[0])/2, aln) for q in range(legpos - 40, legpos + 50): if q in toplegpos[3]: firstleg = False if q in toplegpos[4]: secondleg = False if q in toplegpos[5]: thirdleg = False if firstleg: therung = 1 if testbmp.lengthString(j.name[:10], 64) > toplegpos[0]: toplegpos[0] = testbmp.lengthString(j.name[:10], 64) for q in range(legpos - 40, legpos + 50): toplegpos[3].add(q) # elif secondleg: # therung = 2 # if testbmp.lengthString(j.name[:10], 64) > toplegpos[1]: # toplegpos[1] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # toplegpos[4].add(q) # elif thirdleg: # therung = 3 # if testbmp.lengthString(j.name[:10], 64) > toplegpos[2]: # toplegpos[2] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # toplegpos[5].add(q) else: therung = None legendTop.append((j.name[:10], legpos, therung)) totalheight += sum(toplegpos[:3]) + 40 if legend == 'Bottom' or legend == 'Top & Bottom': botlegpos = [0, 0, 0, set(), set(), set()] legendBot = [] testbmp = BitMap(10, 10) if aln == 'best blast': shifter = blastmatch[-1] genrev1 = reverseList[-1] if aln == 'best blast': shifter = blastmatch[-1] genrev1 = reverseList[-1] for j in secondlist[-1][1]: if j.name != None: if type(j.start) == int: firstleg = True secondleg = True thirdleg = True if genrev1: legpos = convertPosR(secondlist[-1][0], maxlength, width, (j.start + j.stop)/2, aln) else: legpos = convertPos(secondlist[-1][0], maxlength, width, (j.start + j.stop)/2, aln) for q in range(legpos - 40, legpos + 50): if q in botlegpos[3]: firstleg = False if q in botlegpos[4]: secondleg = False if q in botlegpos[5]: thirdleg = False if firstleg: therung = 1 if testbmp.lengthString(j.name[:10], 64) > botlegpos[0]: botlegpos[0] = testbmp.lengthString(j.name[:10], 64) for q in range(legpos - 40, legpos + 50): botlegpos[3].add(q) # elif secondleg: # therung = 2 # if testbmp.lengthString(j.name[:10], 64) > botlegpos[1]: # botlegpos[1] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # botlegpos[4].add(q) # elif thirdleg: # therung = 3 # if testbmp.lengthString(j.name[:10], 64) > botlegpos[2]: # botlegpos[2] = testbmp.lengthString(j.name[:10], 64) # for q in range(legpos - 40, legpos + 50): # botlegpos[5].add(q) else: therung = None legendBot.append((j.name[:10], legpos, therung)) else: firstleg = True secondleg = True thirdleg = True if genrev1: legpos = convertPosR(secondlist[-1][0], maxlength, width, (j.start[0] + j.stop[0])/2, aln) else: legpos = convertPos(secondlist[-1][0], maxlength, width, (j.start[0] + j.stop[0])/2, aln) for q in range((j.start[0] + j.stop[0])/2 - 40, (j.start[0] + j.stop[0])/2 + 50): if q in botlegpos[3]: firstleg = False if q in botlegpos[4]: secondleg = False if q in botlegpos[5]: thirdleg = False if firstleg: therung = 1 if testbmp.lengthString(j.name[:10], 64) > botlegpos[0]: botlegpos[0] = testbmp.lengthString(j.name[:10], 64) for q in range((j.start[0] + j.stop[0])/2 - 40, (j.start[0] + j.stop[0])/2 + 50): botlegpos[3].add(q) # elif secondleg: # therung = 2 # if testbmp.lengthString(j.name[:10], 64) > botlegpos[1]: # botlegpos[1] = testbmp.lengthString(j.name[:10], 64) # for q in range((j.start[0] + j.stop[0])/2 - 40, (j.start[0] + j.stop[0])/2 + 50): # botlegpos[4].add(q) # elif thirdleg: # therung = 3 # if testbmp.lengthString(j.name[:10], 64) > botlegpos[2]: # botlegpos[2] = testbmp.lengthString(j.name[:10], 64) # for q in range((j.start[0] + j.stop[0])/2 - 40, (j.start[0] + j.stop[0])/2 + 50): # botlegpos[5].add(q) else: therung = None legendBot.append((j.name[:10], (j.start[0] + j.stop[0])/2, therung)) totalheight += sum(botlegpos[:3]) + 40 # creates extra width for blast identity legend drawfig1hei = 0 if drawfig1 and minident != 101: drawfig1hei = 500 extraheight = 0 # creates extra height for scale legend drawfig2hei = 0 if drawfig2: drawfig2hei = height1 columnhei = max([fighei, drawfig1hei, drawfig2hei]) totalheight += columnhei hei = totalheight # creates extra height for graph if graphit != None: hei += graphit[3] * len(graphit[0]) + 2 * graphit[7] * len(graphit[0]) extraheight = (graphit[3] + 20) * len(graphit[0]) svg = scalableVectorGraphics(hei + 1, width) if legend == 'Single column': index = 0 legendArrows = [] for i in range(len(legendList)): x = legendList[i] x.sort(key=operator.itemgetter(3)) if reverseList[i]: x.reverse() legendArrows += x for i in range(hei - columnhei + 74, hei, 90): if index < len(legendArrows) and legendArrows[index][2] == 'rect': svg.drawOutRect(5, i - 64, 96, 64, legendArrows[index][1], genet) svg.writeString(legendArrows[index][0], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'arrow': svg.drawRightArrow(5, i - 64, 96, 64, legendArrows[index][1], (0, 0, 0), genet) svg.writeString(legendArrows[index][0], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'frame': svg.drawRightFrame(5, i - 16, 96, 128, genet, 1, legendArrows[index][1]) svg.writeString(legendArrows[index][0], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'pointer': svg.drawPointer(34, i - 64, 64, genet, legendArrows[index][1]) svg.writeString(legendArrows[index][0], 106, i, 64) index += 1 elif legend == 'Two columns': index = 0 legendArrows = [] for i in range(len(legendList)): x = legendList[i] x.sort(key=operator.itemgetter(3)) if reverseList[i]: x.reverse() legendArrows += x for i in range(hei - columnhei + 74, hei, 90): if index < len(legendArrows) and legendArrows[index][2] == 'rect': svg.drawOutRect(5, i - 64, 96, 64, legendArrows[index][1], genet) svg.writeString(legendArrows[index][0][:45], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'arrow': svg.writeString(legendArrows[index][0][:45], 106, i, 64) svg.drawRightArrow(5, i - 64, 96, 64, legendArrows[index][1], (0, 0, 0), genet) elif index < len(legendArrows) and legendArrows[index][2] == 'frame': svg.drawRightFrame(5, i - 16, 96, 128, genet, 1, legendArrows[index][1]) svg.writeString(legendArrows[index][0][:45], 106, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'pointer': svg.drawPointer(34, i - 64, 64, genet, legendArrows[index][1]) svg.writeString(legendArrows[index][0][:45], 76, i, 64) index += 1 for i in range(hei - columnhei + 74, hei, 90): if index < len(legendArrows) and legendArrows[index][2] == 'rect': svg.drawOutRect(5 + width/3, i - 64, 96, 64, legendArrows[index][1], genet) svg.writeString(legendArrows[index][0][:45], 106 + width/3, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'arrow': svg.drawRightArrow(5 + width/3, i - 64, 96, 64, legendArrows[index][1], (0, 0, 0), genet) svg.writeString(legendArrows[index][0][:45], 106 + width/3, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'frame': svg.drawRightFrame(5 + width/3, i - 16, 96, 128, genet, 1, legendArrows[index][1]) svg.writeString(legendArrows[index][0][:45], 106 + width/3, i, 64) elif index < len(legendArrows) and legendArrows[index][2] == 'pointer': svg.drawPointer(34 + width/3, i - 64, 64, genet, legendArrows[index][1]) svg.writeString(legendArrows[index][0][:45], 76 + width/3, i, 64) index += 1 if legend == 'Top' or legend == 'Top & Bottom': rung1 = sum(toplegpos[:3]) + 30 rung2 = rung1 - toplegpos[0] - 10 rung3 = rung2 - toplegpos[1] - 10 for i in legendTop: if i[0][0].lower() == i[0][0]: xpos = i[1] + 16 else: xpos = i[1] + 32 if i[2] == 1: svg.writeString(i[0], xpos, rung1, 64, False, False, 1) elif i[2] == 2: svg.writeString(i[0], xpos, rung2, 64, False, False, 1) elif i[2] == 3: svg.writeString(i[0], xpos, rung3, 64, False, False, 1) if legend == 'Bottom' or legend == 'Top & Bottom': rung1 = hei - sum(botlegpos[:3]) - 30 - columnhei rung2 = rung1 + botlegpos[0] + 10 rung3 = rung2 + botlegpos[1] + 10 for i in legendBot: if i[0][-1].lower() == i[0][-1]: xpos = i[1] + 16 else: xpos = i[1] + 32 if i[2] == 1: svg.writeString(i[0], xpos, rung1, 64, False, False, 1, 'right') elif i[2] == 2: svg.writeString(i[0], xpos, rung2, 64, False, False, 1, 'right') elif i[2] == 3: svg.writeString(i[0], xpos, rung3, 64, False, False, 1, 'right') # draws the scale figure if drawfig2 != False: testbmp = BitMap(5, 5) x1 = width - 600 - drawfig2 * 1.0 / maxlength * width x2 = width - 600 svg.drawLine(x1, hei - columnhei + height1/2 + 70, x2, hei - columnhei + height1/2 + 70, 3) svg.drawLine(x1, hei - columnhei + height1 /4 + 70, x1, hei - columnhei + height1 /4 * 3 + 70, 3) svg.drawLine(x2, hei - columnhei + height1 /4 + 70, x2, hei - columnhei + height1 /4 * 3 + 70, 3) strfig2 = str(drawfig2) if strfig2[-6:] == '000000': strfig2 = strfig2[:-6] + ' Mbp' elif strfig2[-3:] == '000': strfig2 = strfig2[:-3] + ' Kbp' svg.writeString(strfig2, (x1 + x2)/2 - testbmp.lengthString(strfig2, 64) / 2, hei - columnhei + height1 /4 + 65, 64) # draws the graph if graphit != None: thearray, maxgc, mingc, gheight, glinet, gtype, gmaxy, ggap = graphit widthpixellist = [] leftpixellist = [] rightpixellist = [] for i in range(len(thearray)): if aln == 'best blast': shifter = blastmatch[i] if reverseList[i]: rightpixel = convertPosR(secondlist[i*2][0], maxlength, width, 0, aln) leftpixel = convertPosR(secondlist[i*2][0], maxlength, width, secondlist[i*2][0], aln) thearray[i].reverse() else: leftpixel = convertPos(secondlist[i*2][0], maxlength, width, 0, aln) rightpixel = convertPos(secondlist[i*2][0], maxlength, width, secondlist[i*2][0], aln) widthpixel = rightpixel - leftpixel + 1 widthpixellist.append(widthpixel) leftpixellist.append(leftpixel) rightpixellist.append(rightpixel) neg = False if gmaxy == 'Auto': gmaxy = 0 for i in range(0, len(thearray)): if min(thearray[i]) < 0: neg = True for j in range(0, widthpixellist[i]): aa = int(j * (len(thearray[i]) * 1.0 / widthpixellist[i])) bb = int((j + 1) * (len(thearray[i]) * 1.0/ widthpixellist[i])) if aa == bb: bb += 1 temparr = thearray[i][aa:bb] gyval = abs(sum(temparr) * 1.0 / len(temparr)) if gyval > gmaxy: gmaxy = gyval else: gmaxy = float(gmaxy) for i in range(0, len(thearray)): if min(thearray[i]) < 0: neg = True if neg: axispos = ggap + gheight/2 + glinet/2 else: axispos = ggap + gheight for qq in range(len(thearray)): lastgypos = None svg.drawLine(leftpixellist[qq], axispos + glinet/2, rightpixellist[qq], axispos + glinet/2, glinet) for i in range(0, widthpixellist[qq]): aa = int(i * (len(thearray[qq]) * 1.0 / widthpixellist[qq])) bb = int((i + 1) * (len(thearray[qq]) * 1.0/ widthpixellist[qq])) if aa == bb: bb += 1 temparr = thearray[qq][aa:bb] gyval = sum(temparr) * 1.0 / len(temparr) yvalpixratio = gyval/gmaxy if yvalpixratio > 1: yvalpixratio = 1 if yvalpixratio < -1: yvalpixratio = -1 if neg: if yvalpixratio < 0: gc1, gc2, gc3 = mingc yvalpix = round(yvalpixratio * (gheight /2 - glinet/2)) if gtype == 'Line': if lastgypos != None: svg.drawLine(leftpixellist[qq] + i-1, lastgypos, leftpixellist[qq] + i, axispos - yvalpix, 1, mingc) lastgypos = axispos - yvalpix elif gtype == 'Histogram': svg.drawLine(leftpixellist[qq] + i, axispos + glinet/2, leftpixellist[qq] + i, axispos - yvalpix, 1, mingc) else: gc1, gc2, gc3 = maxgc yvalpix = round(yvalpixratio * (gheight /2 - (glinet - glinet/2))) if gtype == 'Line': if lastgypos != None: svg.drawLine(leftpixellist[qq] + i-1, lastgypos, leftpixellist[qq] + i, axispos - glinet - yvalpix, 1, maxgc) lastgypos = axispos - glinet - yvalpix elif gtype == 'Histogram' and round(yvalpix) != 0.0: svg.drawLine(leftpixellist[qq] + i, axispos - glinet /2, leftpixellist[qq] + i, axispos - yvalpix, 1, maxgc) else: yvalpix = round(yvalpixratio * (gheight - glinet)) if gtype == 'Line': if lastgypos != None: svg.drawLine(leftpixellist[qq] + i-1, lastgypos, i, leftpixellist[qq] - axispos - glinet - yvalpix, 1, maxgc) lastgypos = axispos - glinet - 1 - yvalpix elif gtype == 'Histogram' and round(yvalpix) != 0.0: svg.drawLine(leftpixellist[qq] + i, axispos , leftpixellist[qq] + i, axispos - yvalpix, 1, maxgc) axispos += gheight + 2 * ggap + height1 + height2 modfig1 = (graphit[3] + 2 * ggap) * len(graphit[0]) else: modfig1 = 0 # draws the blast gradient legend if drawfig1 and minident != 101: svg.writeString(str(int(round(minident))) + '%', width - 300, hei - columnhei + 480, 64) svg.writeString('100%', width - 300, hei - columnhei + 84, 64) svg.drawGradient(width -400, hei - columnhei + 20, 40, 460, minblastc, maxblastc) svg.drawGradient2(width -360, hei - columnhei + 20, 40, 460, minblastci, maxblastci) # draws feature and blast figures for i in range(0, len(secondlist)): # draws the blast figure if i % 2 == 0: if aln == 'best blast': shifter = blastmatch[i//2] genrev1 = reverseList[i//2] ymod = (height1 * i//2 + height2 * i//2) if graphit != None: ymod += (gheight + 2 * ggap) * (min([len(thearray), i//2 + 1])) if legend == 'Top' or legend == 'Top & Bottom': ymod += sum(toplegpos[:3]) + 40 length = secondlist[i][0] svg.drawLine(convertPos(length, maxlength, width, 0, aln), ymod + height1/2, convertPos(length, maxlength, width, length, aln), ymod + height1/2, glt) for j in secondlist[i][1]: if abortCaptain: return None if (j.strand == '+' and not genrev1) or (j.strand == '-' and genrev1): if type(j.start) == int: if genrev1: x2 = convertPosR(length, maxlength, width, j.start, aln) x1 = convertPosR(length, maxlength, width, j.stop, aln) else: x1 = convertPos(length, maxlength, width, j.start, aln) x2 = convertPos(length, maxlength, width, j.stop, aln) if featDict[j.type][0] == 'rect': svg.drawOutRect(x1, ymod, max([x2-x1, 1]), height1, j.colour, genet) elif featDict[j.type][0] == 'arrow': svg.drawRightArrow(x1, ymod, max([x2-x1, 1]), height1, j.colour, (0, 0, 0), genet) elif featDict[j.type][0] == 'frame': svg.drawRightFrame(x1, ymod, max([x2-x1, 1]), height1, genet, j.start % 3, j.colour) elif featDict[j.type][0] == 'pointer': svg.drawPointer(x1, ymod, height1, genet, j.colour) else: if genrev1: x2 = convertPosR(length, maxlength, width, j.start[-1], aln) x1 = convertPosR(length, maxlength, width, j.stop[-1], aln) else: x1 = convertPos(length, maxlength, width, j.start[-1], aln) x2 = convertPos(length, maxlength, width, j.stop[-1], aln) if featDict[j.type][0] == 'rect': svg.drawOutRect(x1, ymod, max([x2-x1, 1]), height1, j.colour, genet) elif featDict[j.type][0] == 'arrow': svg.drawRightArrow(x1, ymod, max([x2-x1, 1]), height1, j.colour, (0, 0, 0), genet) elif featDict[j.type][0] == 'frame': svg.drawRightFrame(x1, ymod, max([x2-x1, 1]), height1, genet, j.start[-1] % 3, j.colour) elif featDict[j.type][0] == 'pointer': svg.drawPointer(x1, ymod, height1, genet, j.colour) for k in range(2, len(j.start) + 1): if genrev1: x4 = convertPosR(length, maxlength, width, j.start[-k], aln) x3 = convertPosR(length, maxlength, width, j.stop[-k], aln) else: x3 = convertPos(length, maxlength, width, j.start[-k], aln) x4 = convertPos(length, maxlength, width, j.stop[-k], aln) if featDict[j.type][0] == 'arrow' or featDict[j.type][0] == 'rect': if x1 - x4 > 2: svg.drawDash(x4, ymod + height1/4, x4, ymod, exont) svg.drawDash(x4, ymod, x1, ymod, exont) svg.drawDash(x1, ymod, x1, ymod + height1/4, exont) svg.drawOutRect(x3, ymod + height1/4, x4-x3, height1/2, j.colour, genet) elif featDict[j.type][0] == 'frame': if x1 - x4 > 2: svg.drawDash(x4, ymod + height1/4, x4, ymod, exont) svg.drawDash(x4, ymod, x1, ymod, exont) svg.drawDash(x1, ymod, x1, ymod + height1/4, exont) svg.drawRightFrameRect(x3, ymod, x4-x3, height1, genet, j.start[-k] % 3, j.colour) # need to get exons working for other types x1, x2 = x3, x4 else: if type(j.start) == int: if genrev1: x2 = convertPosR(length, maxlength, width, j.start, aln) x1 = convertPosR(length, maxlength, width, j.stop, aln) else: x1 = convertPos(length, maxlength, width, j.start, aln) x2 = convertPos(length, maxlength, width, j.stop, aln) if featDict[j.type][0] == 'rect': svg.drawOutRect(x1, ymod, x2-x1, height1, j.colour, genet) elif featDict[j.type][0] == 'arrow': svg.drawLeftArrow(x1, ymod, x2-x1, height1, j.colour, (0, 0, 0), genet) elif featDict[j.type][0] == 'frame': svg.drawLeftFrame(x1, ymod, x2-x1, height1, genet, j.stop % 3, j.colour) elif featDict[j.type][0] == 'pointer': svg.drawPointer(x1, ymod, height1, genet, j.colour) else: if genrev1: x2 = convertPosR(length, maxlength, width, j.start[0], aln) x1 = convertPosR(length, maxlength, width, j.stop[0], aln) else: x1 = convertPos(length, maxlength, width, j.start[0], aln) x2 = convertPos(length, maxlength, width, j.stop[0], aln) if featDict[j.type][0] == 'rect': svg.drawOutRect(x1, ymod, x2-x1, height1, j.colour, genet) elif featDict[j.type][0] == 'arrow': svg.drawLeftArrow(x1, ymod, x2-x1, height1, j.colour, (0, 0, 0), genet) elif featDict[j.type][0] == 'frame': svg.drawLeftFrame(x1, ymod, x2-x1, height1, genet, j.stop[0] % 3, j.colour) elif featDict[j.type][0] == 'pointer': svg.drawPointer(x1, ymod, height1, genet, j.colour) for k in range(1, len(j.start)): if genrev1: x4 = convertPosR(length, maxlength, width, j.start[k], aln) x3 = convertPosR(length, maxlength, width, j.stop[k], aln) else: x3 = convertPos(length, maxlength, width, j.start[k], aln) x4 = convertPos(length, maxlength, width, j.stop[k], aln) if featDict[j.type][0] == 'rect' or featDict[j.type][0] == 'arrow': if x3 - x2 > 2: svg.drawDash(x2, ymod + 3*height1/4, x2, ymod + height1, exont) svg.drawDash(x2, ymod + height1, x3, ymod + height1, exont) svg.drawDash(x3, ymod + height1, x3, ymod + 3*height1/4, exont) elif featDict[j.type][0] == 'frame': if x3 - x2 > 2: svg.drawDash(x2, ymod + 3*height1/4, x2, ymod + height1, exont) svg.drawDash(x2, ymod + height1, x3, ymod + height1, exont) svg.drawDash(x3, ymod + height1, x3, ymod + 3*height1/4, exont) svg.drawLeftFrameRect(x3, ymod, x4-x3, height1, genet, j.stop[k] % 3, j.colour) x1, x2 = x3, x4 else: # draws teh blast hits genrev2 = reverseList[(i+1)//2] length1 = secondlist[i-1][0] length2 = secondlist[i+1][0] ymod = (height1 * (i - 1)/2 + height2 * (i - 1)/2) - 1 + height1 if graphit != None: ymod += (gheight + 2 * ggap) * (min([len(thearray), i//2 + 1])) if legend == 'Top' or legend == 'Top & Bottom': ymod += sum(toplegpos[:3]) + 40 y1 = ymod y2 = y1 + height2 + 1 for j in secondlist[i]: if abortCaptain: return None qStart, qEnd, rStart, rEnd, ident = j # is the blast hit inverted if (rStart < rEnd and not genrev1 and not genrev2) or \ (rStart > rEnd and not genrev1 and genrev2) or \ (rStart < rEnd and genrev1 and genrev2) or \ (rStart > rEnd and genrev1 and not genrev2): crisscross = False else: crisscross = True try: ratio = round((ident - minident) / (100 - minident), 2) except: ratio = 1 if crisscross: r1 = int(minblastci[0] * (1 - ratio) + maxblastci[0] * ratio) r2 = int(minblastci[1] * (1 - ratio) + maxblastci[1] * ratio) r3 = int(minblastci[2] * (1 - ratio) + maxblastci[2] * ratio) else: r1 = int(minblastc[0] * (1 - ratio) + maxblastc[0] * ratio) r2 = int(minblastc[1] * (1 - ratio) + maxblastc[1] * ratio) r3 = int(minblastc[2] * (1 - ratio) + maxblastc[2] * ratio) if aln == 'best blast': shifter = blastmatch[i//2] if genrev1: x1e = convertPosR(length1, maxlength, width, qStart, aln) x1s = convertPosR(length1, maxlength, width, qEnd, aln) else: x1s = convertPos(length1, maxlength, width, qStart, aln) x1e = convertPos(length1, maxlength, width, qEnd, aln) if aln == 'best blast': shifter = blastmatch[(i+1)//2] if genrev2 and rStart < rEnd: x2e = convertPosR(length2, maxlength, width, rStart, aln) x2s = convertPosR(length2, maxlength, width, rEnd, aln) elif genrev2 and rStart >= rEnd: x2s = convertPosR(length2, maxlength, width, rStart, aln) x2e = convertPosR(length2, maxlength, width, rEnd, aln) elif not genrev2 and rStart < rEnd: x2s = convertPos(length2, maxlength, width, rStart, aln) x2e = convertPos(length2, maxlength, width, rEnd, aln) else: x2e = convertPos(length2, maxlength, width, rStart, aln) x2s = convertPos(length2, maxlength, width, rEnd, aln) if crisscross: svg.drawBlastHit(x1s, y1, x1e, y1, x2s, y2, x2e, y2, (r1, r2, r3)) if blastoutline: svg.drawLine(x1s, y1, x2e, y2) svg.drawLine(x1e, y1, x2s, y2) else: svg.drawBlastHit(x1s, y1, x1e, y1, x2e, y2, x2s, y2, (r1, r2, r3)) if blastoutline: svg.drawLine(x1s, y1, x2s, y2) svg.drawLine(x1e, y1, x2e, y2) svg.writesvg(filename) return minident # The GUI class App: def __init__(self, master): self.pwd = os.getcwd() self.menubar = Menu(master) self.filemenu = Menu(self.menubar, tearoff=0) self.filemenu.add_command(label="New Figure", command=self.defaultoptions) self.filemenu.add_command(label="Save Settings", command=self.saveOptions) self.filemenu.add_command(label="Load Settings", command=self.openOptions) self.filemenu.add_separator() self.filemenu.add_command(label="Preferences", command=self.preferencewindow) self.filemenu.add_separator() self.filemenu.add_command(label="Exit", command=root.quit) self.menubar.add_cascade(label="File", menu=self.filemenu) # create more pulldown menus self.confmenu = Menu(self.menubar, tearoff=0) self.confmenu.add_command(label="Figure", command=self.figureoptions) self.confmenu.add_command(label="Annotation", command=self.annotateoptions) self.confmenu.add_command(label="Blast", command=self.blastoptions) self.confmenu.add_command(label="Graph", command=self.graphoptions) self.confmenu.add_command(label="Subregions", command=self.annmod) self.menubar.add_cascade(label="Image", menu=self.confmenu) self.blastmenu = Menu(self.menubar, tearoff=0) self.blastmenu.add_command(label="Download Blast Automatically", command=self.downloadBlastAuto) self.blastmenu.add_command(label="Download Blast Manually", command=self.downloadBlastMan) self.blastmenu.add_command(label="Choose Blast Location", command=self.chooseBlastDir) self.menubar.add_cascade(label="Blast", menu=self.blastmenu) self.helpmenu = Menu(self.menubar, tearoff=0) self.helpmenu.add_command(label="Help", command=self.openhelpsite) self.helpmenu.add_command(label="Support", command=self.supportwin) self.helpmenu.add_separator() self.helpmenu.add_command(label="About", command=self.openabout) self.helpmenu.add_command(label="Reference", command=self.openref) self.menubar.add_cascade(label="Help", menu=self.helpmenu) master.config(menu=self.menubar) frame1 = Frame(master) frame1.grid(row=0, column=0, padx=40, pady=10) master.geometry('+10+20') self.showit = False self.running = False self.graphshow = False self.cutstate = None self.orderstate = None self.blastlDir = None self.blastnDir = None self.dblDir = None self.dbnDir = None self.workingDir = 'test' self.mincutlist = {} self.maxcutlist = {} self.revlist = {} self.entrynum = 0 self.theTitle = Label(frame1, text='Easyfig 3.0.0', font='Helvetica 22 bold') self.theTitle.grid(row=0, column=1, columnspan=3, padx=10, sticky='W') self.annLab = Label(frame1, text="Annotation Files", font='Helvetica 13 bold underline') self.annLab.grid(row=1, column=2, pady=10) self.scrollbar = Scrollbar(frame1, orient=VERTICAL) self.genlist = DDlistbox(frame1, yscrollcommand=self.scrollbar.set) self.genlist.bind('', self.annmod) self.genlist.config(height=10) self.blastlist = DDlistbox(frame1, yscrollcommand=self.scrollbar.set) self.blastlist.config(height=9) self.scrollbar.config(command=self.yview) self.scrollbar.grid(row=2, column=1, rowspan=9, sticky=NS) self.genlist.grid(row=2, column=2, rowspan=9) self.annLab = Label(frame1, text="Blast Files", font='Helvetica 13 bold underline') self.annLab.grid(row=1, column=3) self.blastlist.grid(row=2, column=3, rowspan=9) self.addgenbutton = Button(frame1, text='Add feature file', command=self.addfeat) self.addgenbutton.grid(row=11, column=2, sticky=EW) self.addgenbutton = Button(frame1, text='Add folder', command=self.addfolder) self.addgenbutton.grid(row=12, column=2, sticky=EW) self.removegenbutton = Button(frame1, text='Remove feature file', command=self.removefeat) self.removegenbutton.grid(row=13, column=2, sticky=EW) self.addblastbutton = Button(frame1, text='Add blast file', command=self.addblast) self.addblastbutton.grid(row=11, column=3, sticky=EW) self.removeblastbutton = Button(frame1, text='Remove blast file', command=self.removeblast) self.removeblastbutton.grid(row=12, column=3, sticky=EW) self.spacefiller = Label(frame1, text=' ') self.spacefiller.grid(row=12, column=0) self.blastit = Button(frame1, text='Generate blastn Files', command=self.genBlast) self.blastit.grid(row=14, column=3, sticky='EW') self.blastx = Button(frame1, text='Generate tblastx Files', command=self.genBlastX) self.blastx.grid(row=15, column=3, sticky='EW') self.outfile = StringVar(value='') self.outopen = Button(frame1, text="Save As", command=self.getoutfile) self.outopen.grid(row=17, column=2, columnspan=2, sticky=W) self.outfilename = Entry(frame1, textvariable=self.outfile) self.outfilename.grid(row=17, column=2, columnspan=2) self.filetype = StringVar(value='Bitmap (bmp)') self.filetypelabel = Label(frame1, text='File type:') self.filetypelabel.grid(row=18, column=2, columnspan=2, pady=5, sticky=W) self.filetypeentry = OptionMenu(frame1, self.filetype, 'Bitmap (bmp)', 'Vector file (svg)', 'Preview (shrink)', 'Preview (1:1)') self.filetypeentry.grid(row=18, column=2, columnspan=2, pady=5) self.createFigure = Button(frame1, text="Create Figure", font='Helvetica 12 bold', width=20, command=self.makeFigure) self.createFigure.grid(row=19, column=2, columnspan=2, rowspan=3, sticky='NS') self.processLab = Label(frame1, bg='#FFFF99', relief=SUNKEN) self.processLab.grid(row=14, column=1, rowspan=3, columnspan=2, sticky='NSEW', padx=5, pady=5) self.gap = Label(frame1, text=' ') self.gap.grid(row=18, column=3) self.gap2 = Label(frame1, text=' ') self.gap2.grid(row=16, column=3) self.gap3 = Label(frame1, text=' ') self.gap3.grid(row=19, column=4) self.gap4 = Label(frame1, text=' ') self.gap4.grid(row=20, column=4) self.gap4 = Label(frame1, text=' ') self.gap4.grid(row=21, column=4) self.defaultpreferences() if os.path.exists('.easyfig.pref'): self.opendefault() def yview(self, *args): if args[0] == "moveto": self.genlist.yview_moveto(args[1]) self.blastlist.yview_moveto(args[1]) else: self.genlist.yview_scroll(args[1], args[2]) self.blastlist.yview_scroll(args[1], args[2]) def addfolder(self): tempfolder = tkFileDialog.askdirectory(title='Please select a directory with feature files.') if tempfolder == () or tempfolder == '': return for i in os.listdir(tempfolder): if self.entrynum == 99: if self.genlist.size() == 99: tkMessageBox.showerror('Maximum feature files reached.', 'At this time easyfig only supports 99 genomes.\nEasyfig_CL does not have a maximum limit.') return self.renumbergen() filename = tempfolder + '/' + i self.entrynum += 1 entryname = '%02d' % self.entrynum + '. ' + filename self.genlist.insert(END, entryname) self.mincutlist[entryname[:2]] = '1' self.maxcutlist[entryname[:2]] = 'Max' self.revlist[entryname[:2]] = False self.genlist.xview_moveto(1) def addfeat(self): if self.entrynum == 99: if self.genlist.size() == 99: tkMessageBox.showerror('Maximum feature files reached.', 'At this time easyfig only supports 99 genomes.\nEasyfig_CL does not have a maximum limit.') return self.renumbergen() filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) if filename == (): return self.entrynum += 1 entryname = '%02d' % self.entrynum + '. ' + filename self.genlist.insert(END, entryname) self.genlist.xview_moveto(1) self.mincutlist[entryname[:2]] = '1' self.maxcutlist[entryname[:2]] = 'Max' self.revlist[entryname[:2]] = False def renumbergen(self): try: self.annwindow.destroy() except: pass tempmincutlist = {} tempmaxcutlist = {} temprevlist = {} for i in range(self.genlist.size()): tempgen = self.genlist.get(i) self.genlist.delete(i) self.genlist.insert(i, '%02d' % (i + 1) + tempgen[2:]) tempmincutlist['%02d' % (i + 1)] = self.mincutlist[tempgen[:2]] tempmaxcutlist['%02d' % (i + 1)] = self.maxcutlist[tempgen[:2]] temprevlist['%02d' % (i + 1)] = self.revlist[tempgen[:2]] self.mincutlist = tempmincutlist self.maxcutlist = tempmaxcutlist self.revlist = temprevlist self.entrynum = self.genlist.size() self.genlist.xview_moveto(1) def removefeat(self): self.genlist.delete(ANCHOR) self.renumbergen() def addblast(self): filename = tkFileDialog.askopenfilename() self.blastlist.insert(END, filename) self.blastlist.xview_moveto(1) self.orderstate = None self.cutstate = None def removeblast(self): self.blastlist.delete(ANCHOR) def defaultoptions(self): try: self.prefwin.destroy() except: pass try: self.figureoptionswindow.destroy() except: pass try: self.blastoptionswindow.destroy() except: pass try: self.annotateoptionswindow.destroy() except: pass try: self.graphoptionswindow.destroy() except: pass try: self.annwindow.destroy() except: pass try: self.doublecutswin.destroy() except: pass self.outfile.set('') self.genlist.delete(0, END) self.blastlist.delete(0, END) self.defaultpreferences() self.entrynum = 0 self.cutstate = None self.orderstate = None if os.path.exists('.easyfig.pref'): self.opendefault() else: self.defaultpreferences() def defaultpreferences(self): self.filetype.set('Bitmap (bmp)') self.figwidthvar = StringVar(value='5000') self.height1var = StringVar(value='150') self.height2var = StringVar(value='500') self.aln = StringVar(value='centre') self.autodetect = IntVar() self.autodetect.set(1) self.drawfig1 = IntVar() self.drawfig1.set(1) self.drawfig2var = StringVar(value='0') self.minlengthvar = StringVar(value='0') self.minevalvar = StringVar(value='0.001') self.minIdentvar = StringVar(value='0') self.minblastc = (200, 200, 200) self.minblastchex = '#C8C8C8' self.minblastci = (200, 200, 200) self.minblastcihex = '#C8C8C8' self.maxblastc = (100, 100, 100) self.maxblastchex = '#646464' self.maxblastci = (100, 100, 100) self.maxblastcihex = '#646464' self.blastoutline = IntVar() self.blastoutline.set(1) self.leg = StringVar(value='None') self.leg2 = StringVar(value='None') self.legname = StringVar(value='gene') self.gltvar = StringVar(value='20') self.exontvar = StringVar(value='2') self.genetvar = StringVar(value='1') self.genef = IntVar() self.genef.set(1) self.genefcolour = (64, 224, 208) self.genefcolourhex = '#40e0d0' self.genefrect = StringVar(value='arrow') self.cdsf = IntVar() self.cdsfcolour = (255, 140, 0) self.cdsfcolourhex = '#ff8c00' self.cdsfrect = StringVar(value='arrow') self.trnaf = IntVar() self.trnafcolour = (165, 42, 42) self.trnafcolourhex = '#a52a2a' self.trnafrect = StringVar(value='rect') self.miscf = IntVar() self.miscfcolour = (0, 191, 255) self.miscfcolourhex = '#00bfff' self.miscfrect = StringVar(value='rect') self.randfeat = StringVar() self.randf = IntVar() self.randfcolour = (72, 61, 139) self.randfcolourhex = '#483d8b' self.randfrect = StringVar(value='arrow') self.graphtype = StringVar(value='None') self.allorone = IntVar() self.graphfile = StringVar() self.step = StringVar(value='1000') self.windsize = StringVar(value='1000') self.graphheight = StringVar(value='200') self.maxy = StringVar(value='Auto') self.logit = IntVar() self.histo = StringVar(value='Histogram') self.graphlinet = StringVar(value='1') self.poscol = (255, 0, 0) self.poscolhex ='#FF0000' self.negcol = (0, 0, 255) self.negcolhex = '#0000FF' self.ggap = StringVar(value='10') self.blastnDir = None self.dbnDir = None def saveOptions(self): filename = '' filename = tkFileDialog.asksaveasfilename(filetypes = [('easycfg', '*.easycfg'), ('All files','*')]) if filename == '' or filename == (): return savefile = open(filename, 'w') savefile.write('\t'.join(self.genlist.get(0, END)) + '\n') for i in self.genlist.get(0, END): savefile.write(i[:2] + '\t' + self.mincutlist[i[:2]] + '\t' + self.maxcutlist[i[:2]] + '\t' + str(self.revlist[i[:2]]) + '\n') savefile.write('\t'.join(self.blastlist.get(0, END)) + '\n') savefile.write(self.outfile.get() + '\n') savefile.write(self.filetype.get() + '\n') savefile.write(self.figwidthvar.get() + '\n') savefile.write(self.height1var.get() + '\n') savefile.write(self.height2var.get() + '\n') savefile.write(self.aln.get() + '\n') savefile.write(str(self.autodetect.get()) + '\n') savefile.write(str(self.drawfig1.get()) + '\n') savefile.write(self.drawfig2var.get() + '\n') savefile.write(self.minlengthvar.get() + '\n') savefile.write(self.minevalvar.get() + '\n') savefile.write(self.minIdentvar.get() + '\n') savefile.write(str(self.minblastc[0]) + '\n') savefile.write(str(self.minblastc[1]) + '\n') savefile.write(str(self.minblastc[2]) + '\n') savefile.write(self.minblastchex + '\n') savefile.write(str(self.minblastci[0]) + '\n') savefile.write(str(self.minblastci[1]) + '\n') savefile.write(str(self.minblastci[2]) + '\n') savefile.write(self.minblastcihex + '\n') savefile.write(str(self.maxblastc[0]) + '\n') savefile.write(str(self.maxblastc[1]) + '\n') savefile.write(str(self.maxblastc[2]) + '\n') savefile.write(self.maxblastchex + '\n') savefile.write(str(self.maxblastci[0]) + '\n') savefile.write(str(self.maxblastci[1]) + '\n') savefile.write(str(self.maxblastci[2]) + '\n') savefile.write(self.maxblastcihex + '\n') savefile.write(str(self.blastoutline.get()) + '\n') savefile.write(self.leg.get() + '\n') savefile.write(self.leg2.get() + '\n') savefile.write(self.legname.get() + '\n') savefile.write(self.gltvar.get() + '\n') savefile.write(self.exontvar.get() + '\n') savefile.write(self.genetvar.get() + '\n') savefile.write(str(self.genef.get()) + '\n') savefile.write(str(self.genefcolour[0]) + '\n') savefile.write(str(self.genefcolour[1]) + '\n') savefile.write(str(self.genefcolour[2]) + '\n') savefile.write(self.genefcolourhex + '\n') savefile.write(self.genefrect.get() + '\n') savefile.write(str(self.cdsf.get()) + '\n') savefile.write(str(self.cdsfcolour[0]) + '\n') savefile.write(str(self.cdsfcolour[1]) + '\n') savefile.write(str(self.cdsfcolour[2]) + '\n') savefile.write(self.cdsfcolourhex + '\n') savefile.write(self.cdsfrect.get() + '\n') savefile.write(str(self.trnaf.get()) + '\n') savefile.write(str(self.trnafcolour[0]) + '\n') savefile.write(str(self.trnafcolour[1]) + '\n') savefile.write(str(self.trnafcolour[2]) + '\n') savefile.write(self.trnafcolourhex + '\n') savefile.write(self.trnafrect.get() + '\n') savefile.write(str(self.miscf.get()) + '\n') savefile.write(str(self.miscfcolour[0]) + '\n') savefile.write(str(self.miscfcolour[1]) + '\n') savefile.write(str(self.miscfcolour[2]) + '\n') savefile.write(self.miscfcolourhex + '\n') savefile.write(self.miscfrect.get() + '\n') savefile.write(self.randfeat.get() + '\n') savefile.write(str(self.randf.get()) + '\n') savefile.write(str(self.randfcolour[0]) + '\n') savefile.write(str(self.randfcolour[1]) + '\n') savefile.write(str(self.randfcolour[2]) + '\n') savefile.write(self.randfcolourhex + '\n') savefile.write(self.randfrect.get() + '\n') savefile.write(self.graphtype.get() + '\n') savefile.write(str(self.allorone.get()) + '\n') savefile.write(self.graphfile.get() + '\n') savefile.write(self.step.get() + '\n') savefile.write(self.windsize.get() + '\n') savefile.write(self.graphheight.get() + '\n') savefile.write(self.maxy.get() + '\n') savefile.write(str(self.logit.get()) + '\n') savefile.write(self.histo.get() + '\n') savefile.write(self.graphlinet.get() + '\n') savefile.write(str(self.poscol[0]) + '\n') savefile.write(str(self.poscol[1]) + '\n') savefile.write(str(self.poscol[2]) + '\n') savefile.write(self.poscolhex + '\n') savefile.write(str(self.negcol[0]) + '\n') savefile.write(str(self.negcol[1]) + '\n') savefile.write(str(self.negcol[2]) + '\n') savefile.write(self.negcolhex + '\n') savefile.write(self.ggap.get() + '\n') savefile.close() def openOptions(self): try: filename = tkFileDialog.askopenfilename(filetypes = [('easycfg', '*.easycfg'), ('All files','*')]) if filename == '' or filename == (): return openfile = open(filename) templist = openfile.readline().rstrip().split('\t') self.genlist.delete(0, END) if templist == ['']: templist = [] for i in templist: self.genlist.insert(END, i) self.genlist.xview_moveto(1) for i in range(len(templist)): name, mincut, maxcut, rev = openfile.readline().rstrip().split('\t') self.mincutlist[name] = mincut self.maxcutlist[name] = maxcut if rev == 'True': self.revlist[name] = True else: self.revlist[name] = False templist = openfile.readline().rstrip().split('\t') if templist == ['']: templist = [] self.blastlist.delete(0, END) for i in templist: self.blastlist.insert(END, i) self.blastlist.xview_moveto(1) self.outfile.set(openfile.readline().rstrip()) self.filetype.set(openfile.readline().rstrip()) self.figwidthvar.set(openfile.readline().rstrip()) self.height1var.set(openfile.readline().rstrip()) self.height2var.set(openfile.readline().rstrip()) self.aln.set(openfile.readline().rstrip()) self.autodetect.set(int(openfile.readline().rstrip())) self.drawfig1.set(int(openfile.readline().rstrip())) self.drawfig2var.set(openfile.readline().rstrip()) self.minlengthvar.set(openfile.readline().rstrip()) self.minevalvar.set(openfile.readline().rstrip()) self.minIdentvar.set(openfile.readline().rstrip()) x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.minblastc = (x, y, z) self.minblastchex = openfile.readline().rstrip() x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.minblastci = (x, y, z) self.minblastcihex = openfile.readline().rstrip() x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.maxblastc = (x, y, z) self.maxblastchex = openfile.readline().rstrip() x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.maxblastci = (x, y, z) self.maxblastcihex = openfile.readline().rstrip() self.blastoutline.set(int(openfile.readline().rstrip())) self.leg.set(openfile.readline().rstrip()) self.leg2.set(openfile.readline().rstrip()) self.legname.set(openfile.readline().rstrip()) self.gltvar.set(openfile.readline().rstrip()) self.exontvar.set(openfile.readline().rstrip()) self.genetvar.set(openfile.readline().rstrip()) self.genef.set(int(openfile.readline().rstrip())) x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.genefcolour = (x, y, z) self.genefcolourhex = openfile.readline().rstrip() self.genefrect.set(openfile.readline().rstrip()) self.cdsf.set(int(openfile.readline().rstrip())) x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.cdsfcolour = (x, y, z) self.cdsfcolourhex = openfile.readline().rstrip() self.cdsfrect.set(openfile.readline().rstrip()) self.trnaf.set(int(openfile.readline().rstrip())) x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.trnafcolour = (x, y, z) self.trnafcolourhex = openfile.readline().rstrip() self.trnafrect.set(openfile.readline().rstrip()) self.miscf.set(int(openfile.readline().rstrip())) x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.miscfcolour = (x, y, z) self.miscfcolourhex = openfile.readline().rstrip() self.miscfrect.set(openfile.readline().rstrip()) self.randfeat.set(openfile.readline().rstrip()) self.randf.set(int(openfile.readline().rstrip())) x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.randfcolour = (x, y, z) self.randfcolourhex = openfile.readline().rstrip() self.randfrect.set(openfile.readline().rstrip()) self.graphtype.set(openfile.readline().rstrip()) self.allorone.set(int(openfile.readline().rstrip())) self.graphfile.set(openfile.readline().rstrip()) self.step.set(openfile.readline().rstrip()) self.windsize.set(openfile.readline().rstrip()) self.graphheight.set(openfile.readline().rstrip()) self.maxy.set(openfile.readline().rstrip()) self.logit.set(openfile.readline().rstrip()) self.histo.set(openfile.readline().rstrip()) self.graphlinet.set(openfile.readline().rstrip()) x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.poscol = (x, y, z) self.poscolhex = openfile.readline().rstrip() x = int(openfile.readline().rstrip()) y = int(openfile.readline().rstrip()) z = int(openfile.readline().rstrip()) self.negcol = (x, y, z) self.negcolhex = openfile.readline().rstrip() self.ggap.set(openfile.readline().rstrip()) openfile.close() except: tkMessageBox.showerror('Try again.', 'Easyfig config file invalid.') def opendefault(self): try: if not os.path.exists('.easyfig.pref'): self.defaultpreferences() return preffile = open('.easyfig.pref') gotpref = False for line in preffile: if line.startswith('>'): preflist = line.split('\t')[1:] gotpref = True preffile.close() if not gotpref: self.defaultpreferences() return self.filetype.set(preflist.pop(0)) self.figwidthvar.set(preflist.pop(0)) self.height1var.set(preflist.pop(0)) self.height2var.set(preflist.pop(0)) self.aln.set(preflist.pop(0)) self.autodetect.set(int(preflist.pop(0))) self.drawfig1.set(int(preflist.pop(0))) self.drawfig2var.set(preflist.pop(0)) self.minlengthvar.set(preflist.pop(0)) self.minevalvar.set(preflist.pop(0)) self.minIdentvar.set(preflist.pop(0)) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.minblastc = (x, y, z) self.minblastchex = preflist.pop(0) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.minblastci = (x, y, z) self.minblastcihex = preflist.pop(0) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.maxblastc = (x, y, z) self.maxblastchex = preflist.pop(0) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.maxblastci = (x, y, z) self.maxblastcihex = preflist.pop(0) self.blastoutline.set(int(preflist.pop(0))) self.leg.set(preflist.pop(0)) self.leg2.set(preflist.pop(0)) self.legname.set(preflist.pop(0)) self.gltvar.set(preflist.pop(0)) self.exontvar.set(preflist.pop(0)) self.genetvar.set(preflist.pop(0)) self.genef.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.genefcolour = (x, y, z) self.genefcolourhex = preflist.pop(0) self.genefrect.set(preflist.pop(0)) self.cdsf.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.cdsfcolour = (x, y, z) self.cdsfcolourhex = preflist.pop(0) self.cdsfrect.set(preflist.pop(0)) self.trnaf.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.trnafcolour = (x, y, z) self.trnafcolourhex = preflist.pop(0) self.trnafrect.set(preflist.pop(0)) self.miscf.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.miscfcolour = (x, y, z) self.miscfcolourhex = preflist.pop(0) self.miscfrect.set(preflist.pop(0)) self.randfeat.set(preflist.pop(0)) self.randf.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.randfcolour = (x, y, z) self.randfcolourhex = preflist.pop(0) self.randfrect.set(preflist.pop(0)) self.graphtype.set(preflist.pop(0)) self.allorone.set(int(preflist.pop(0))) self.graphfile.set(preflist.pop(0)) self.step.set(preflist.pop(0)) self.windsize.set(preflist.pop(0)) self.graphheight.set(preflist.pop(0)) self.maxy.set(preflist.pop(0)) self.logit.set(preflist.pop(0)) self.histo.set(preflist.pop(0)) self.graphlinet.set(preflist.pop(0)) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.poscol = (x, y, z) self.poscolhex = preflist.pop(0) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.negcol = (x, y, z) self.negcolhex = preflist.pop(0) self.ggap.set(preflist.pop(0)) self.blastnDir = preflist.pop(0) if self.blastnDir == 'None': self.blastnDir = None self.dbnDir = preflist.pop(0).rstrip() if self.dbnDir == 'None': self.dbnDir = None except: self.defaultpreferences() def openhelpsite(self): webbrowser.open_new('https://github.com/mjsull/Easyfig/wiki') def openabout(self): try: self.aboutpanel.destroy() except: pass self.aboutpanel = Toplevel() self.frame7 = Frame(self.aboutpanel) self.about1label = Label(self.frame7, text='Easyfig', font='Helvetica 13 bold') self.about1label.grid(row=0, column=0) self.about2label = Label(self.frame7, text='Easyfig is a Python application for creating linear\n\ comparison figures of multiple genomic loci\n with an easy-to-use graphical user interface (GUI).\n\n\ Version 3.0.0\n\nIf Easyfig is used to generate figures for publication,\n\ please cite our paper:\n\n\ Sullivan MJ, Petty NK, Beatson SA. (2011)\nEasyfig: a genome comparison visualiser.\nBioinformatics; 27 (7): 1009-1010') self.about2label.grid(row=1, column=0) self.frame7.grid(padx=10, pady=10) def supportwin(self): try: self.supportpanel.destroy() except: pass self.supportpanel = Toplevel() self.frame9 = Frame(self.supportpanel) self.about1label1 = Label(self.frame9, text='Easyfig', font='Helvetica 13 bold') self.about1label1.grid(row=0, column=0) self.supportlabel2 = Label(self.frame9, text='written by Mitchell Sullivan - mjsull@gmail.com\n\ To submit a bug please visit https://github.com/mjsull/Easyfig/issues.') self.supportlabel2.grid(row=1, column=0) self.frame9.grid(padx=10, pady=10) def preferencewindow(self): try: self.prefwin.destroy() except: pass self.prefwin = Toplevel() self.frame8 = Frame(self.prefwin) self.prefwin.title('preferences') self.scrollbar3 = Scrollbar(self.frame8) self.preflist = Listbox(self.frame8, yscrollcommand=self.scrollbar3.set) templist = ['easyfig_standard'] validfile = True if os.path.exists('.easyfig.pref'): preffile = open('.easyfig.pref') for line in preffile: if len(line.split('\t')) == 87: templist.append(line.split('\t')[0]) else: validfile = False if not validfile: nocompare = tkMessageBox.askquestion('Preference file not valid', 'Do you wish to create a new preference file at ' + os.getcwd() + '/.easyfig.pref?', parent=self.frame8) if nocompare == 'no': return else: preffile = open('.easyfig.pref', 'w') preffile.close() templist.sort(key=str.lower) for i in templist: self.preflist.insert(END, i) self.preflist.grid(column=1, row=0, rowspan=10) self.scrollbar3.config(command=self.preflist.yview) self.scrollbar3.grid(column=0, row=0, rowspan=10, sticky=NS) self.addprefbut = Button(self.frame8, text='Save preferences as', command=self.addpref) self.addprefbut.grid(column=2, row=0, sticky=EW) self.loadprefbut = Button(self.frame8, text='Load preferences', command=self.loadpref) self.loadprefbut.grid(column=2, row=1, sticky=EW) self.removeprefbut = Button(self.frame8, text='Remove', command=self.removepref) self.removeprefbut.grid(column=2, row=2, sticky=EW) self.setdefaultbut = Button(self.frame8, text='Set as default', command=self.setdefault) self.setdefaultbut.grid(column=2, row=3, sticky=EW) self.closeprefwinbut = Button(self.frame8, text='close', command=self.closeprefwin) self.closeprefwinbut.grid(column=2, row=9, sticky=E) self.frame8.grid(padx=20, pady=20) def addpref(self): preffile = open('.easyfig.pref', 'a') savename = tkSimpleDialog.askstring('Input name', 'Please choose name to save preferences under.', parent=self.frame8) if savename == None: return None while savename in self.preflist.get(0, END): savename = tkSimpleDialog.askstring('Name taken', 'Please choose name to save preferences under.', parent=self.frame8) if savename == None: return None savestring = savename + '\t' savestring += self.filetype.get() + '\t' savestring += self.figwidthvar.get() + '\t' savestring += self.height1var.get() + '\t' savestring += self.height2var.get() + '\t' savestring += self.aln.get() + '\t' savestring += str(self.autodetect.get()) + '\t' savestring += str(self.drawfig1.get()) + '\t' savestring += self.drawfig2var.get() + '\t' savestring += self.minlengthvar.get() + '\t' savestring += self.minevalvar.get() + '\t' savestring += self.minIdentvar.get() + '\t' savestring += str(self.minblastc[0]) + '\t' savestring += str(self.minblastc[1]) + '\t' savestring += str(self.minblastc[2]) + '\t' savestring += self.minblastchex + '\t' savestring += str(self.minblastci[0]) + '\t' savestring += str(self.minblastci[1]) + '\t' savestring += str(self.minblastci[2]) + '\t' savestring += self.minblastcihex + '\t' savestring += str(self.maxblastc[0]) + '\t' savestring += str(self.maxblastc[1]) + '\t' savestring += str(self.maxblastc[2]) + '\t' savestring += self.maxblastchex + '\t' savestring += str(self.maxblastci[0]) + '\t' savestring += str(self.maxblastci[1]) + '\t' savestring += str(self.maxblastci[2]) + '\t' savestring += self.maxblastcihex + '\t' savestring += str(self.blastoutline.get()) + '\t' savestring += self.leg.get() + '\t' savestring += self.leg2.get() + '\t' savestring += self.legname.get() + '\t' savestring += self.gltvar.get() + '\t' savestring += self.exontvar.get() + '\t' savestring += self.genetvar.get() + '\t' savestring += str(self.genef.get()) + '\t' savestring += str(self.genefcolour[0]) + '\t' savestring += str(self.genefcolour[1]) + '\t' savestring += str(self.genefcolour[2]) + '\t' savestring += self.genefcolourhex + '\t' savestring += self.genefrect.get() + '\t' savestring += str(self.cdsf.get()) + '\t' savestring += str(self.cdsfcolour[0]) + '\t' savestring += str(self.cdsfcolour[1]) + '\t' savestring += str(self.cdsfcolour[2]) + '\t' savestring += self.cdsfcolourhex + '\t' savestring += self.cdsfrect.get() + '\t' savestring += str(self.trnaf.get()) + '\t' savestring += str(self.trnafcolour[0]) + '\t' savestring += str(self.trnafcolour[1]) + '\t' savestring += str(self.trnafcolour[2]) + '\t' savestring += self.trnafcolourhex + '\t' savestring += self.trnafrect.get() + '\t' savestring += str(self.miscf.get()) + '\t' savestring += str(self.miscfcolour[0]) + '\t' savestring += str(self.miscfcolour[1]) + '\t' savestring += str(self.miscfcolour[2]) + '\t' savestring += self.miscfcolourhex + '\t' savestring += self.miscfrect.get() + '\t' savestring += self.randfeat.get() + '\t' savestring += str(self.randf.get()) + '\t' savestring += str(self.randfcolour[0]) + '\t' savestring += str(self.randfcolour[1]) + '\t' savestring += str(self.randfcolour[2]) + '\t' savestring += self.randfcolourhex + '\t' savestring += self.randfrect.get() + '\t' savestring += self.graphtype.get() + '\t' savestring += str(self.allorone.get()) + '\t' savestring += self.graphfile.get() + '\t' savestring += self.step.get() + '\t' savestring += self.windsize.get() + '\t' savestring += self.graphheight.get() + '\t' savestring += self.maxy.get() + '\t' savestring += str(self.logit.get()) + '\t' savestring += self.histo.get() + '\t' savestring += self.graphlinet.get() + '\t' savestring += str(self.poscol[0]) + '\t' savestring += str(self.poscol[1]) + '\t' savestring += str(self.poscol[2]) + '\t' savestring += self.poscolhex + '\t' savestring += str(self.negcol[0]) + '\t' savestring += str(self.negcol[1]) + '\t' savestring += str(self.negcol[2]) + '\t' savestring += self.negcolhex + '\t' savestring += self.ggap.get() + '\t' if self.blastnDir == None: savestring += 'None\t' else: savestring += self.blastnDir + '\t' if self.dbnDir == None: savestring += 'None\n' else: savestring += self.dbnDir + '\n' if savestring.count('\t') == 86: if savestring.startswith('>'): tkMessageBox.showerror('Try again.', 'Please remove > from start of preference name.') else: preffile.write(savestring) self.preflist.insert(END, savename) else: tkMessageBox.showerror('Try again.', ' character in variable, please remove.') preffile.close() def loadpref(self): try: prefname = self.preflist.get(ACTIVE) if prefname == 'easyfig_standard': self.defaultpreferences() return if not os.path.exists('.easyfig.pref'): tkMessageBox.showerror('Try again.', 'Where\'d the preference file go?') return preffile = open('.easyfig.pref') for line in preffile: splitline = line.split('\t') if splitline[0] == prefname: preflist = splitline[1:] preffile.close() self.filetype.set(preflist.pop(0)) self.figwidthvar.set(preflist.pop(0)) self.height1var.set(preflist.pop(0)) self.height2var.set(preflist.pop(0)) self.aln.set(preflist.pop(0)) self.autodetect.set(int(preflist.pop(0))) self.drawfig1.set(int(preflist.pop(0))) self.drawfig2var.set(preflist.pop(0)) self.minlengthvar.set(preflist.pop(0)) self.minevalvar.set(preflist.pop(0)) self.minIdentvar.set(preflist.pop(0)) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.minblastc = (x, y, z) self.minblastchex = preflist.pop(0) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.minblastci = (x, y, z) self.minblastcihex = preflist.pop(0) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.maxblastc = (x, y, z) self.maxblastchex = preflist.pop(0) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.maxblastci = (x, y, z) self.maxblastcihex = preflist.pop(0) self.blastoutline.set(int(preflist.pop(0))) self.leg.set(preflist.pop(0)) self.leg2.set(preflist.pop(0)) self.legname.set(preflist.pop(0)) self.gltvar.set(preflist.pop(0)) self.exontvar.set(preflist.pop(0)) self.genetvar.set(preflist.pop(0)) self.genef.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.genefcolour = (x, y, z) self.genefcolourhex = preflist.pop(0) self.genefrect.set(preflist.pop(0)) self.cdsf.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.cdsfcolour = (x, y, z) self.cdsfcolourhex = preflist.pop(0) self.cdsfrect.set(preflist.pop(0)) self.trnaf.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.trnafcolour = (x, y, z) self.trnafcolourhex = preflist.pop(0) self.trnafrect.set(preflist.pop(0)) self.miscf.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.miscfcolour = (x, y, z) self.miscfcolourhex = preflist.pop(0) self.miscfrect.set(preflist.pop(0)) self.randfeat.set(preflist.pop(0)) self.randf.set(int(preflist.pop(0))) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.randfcolour = (x, y, z) self.randfcolourhex = preflist.pop(0) self.randfrect.set(preflist.pop(0)) self.graphtype.set(preflist.pop(0)) self.allorone.set(int(preflist.pop(0))) self.graphfile.set(preflist.pop(0)) self.step.set(preflist.pop(0)) self.windsize.set(preflist.pop(0)) self.graphheight.set(preflist.pop(0)) self.maxy.set(preflist.pop(0)) self.logit.set(preflist.pop(0)) self.histo.set(preflist.pop(0)) self.graphlinet.set(preflist.pop(0)) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.poscol = (x, y, z) self.poscolhex = preflist.pop(0) x = int(preflist.pop(0)) y = int(preflist.pop(0)) z = int(preflist.pop(0)) self.negcol = (x, y, z) self.negcolhex = preflist.pop(0) self.ggap.set(preflist.pop(0)) self.blastnDir = preflist.pop(0) if self.blastnDir == 'None': self.blastnDir = None self.dbnDir = preflist.pop(0).rstrip() if self.dbnDir == 'None': self.dbnDir = None except: self.defaultpreferences() tkMessageBox.showerror('Preference File Invalid', 'Loaded default preferences.') nocompare = tkMessageBox.askquestion('Preference file not valid', 'Do you wish to create a new preference file at ' + os.getcwd() + '/.easyfig.pref?', parent=self.frame8) if nocompare == 'no': return else: preffile = open('.easyfig.pref', 'w') preffile.close() self.preflist.delete(0, END) self.preflist.insert('easyfig_standard') def removepref(self): nocompare = tkMessageBox.askquestion('Delete?', 'Are you sure you wish to delete this preference?', parent=self.frame8) if nocompare == 'no': return preffile = open('.easyfig.pref') preflist = [] prefname = self.preflist.get(ACTIVE) self.preflist.delete(ACTIVE) for line in preffile: if not line.split('\t')[0] == prefname: preflist.append(line) preffile.close() preffile = open('.easyfig.pref', 'w') for i in preflist: preffile.write(i) preffile.close() def setdefault(self): preffile = open('.easyfig.pref') preflist = [] prefname = self.preflist.get(ACTIVE) if prefname.startswith('>'): return templist = [] for line in preffile: if line.startswith('>'): line = line[1:] elif line.split('\t')[0] == prefname: line = '>' + line templist.append(line.split('\t')[0]) preflist.append(line) preffile.close() preffile = open('.easyfig.pref', 'w') for i in preflist: preffile.write(i) self.preflist.delete(0, END) templist.append('easyfig_standard') templist.sort(key=str.lower) for i in templist: self.preflist.insert(END, i) preffile.close() def closeprefwin(self): self.prefwin.destroy() def openref(self): webbrowser.open_new('http://www.ncbi.nlm.nih.gov/pubmed/21278367') def pickposcol(self): colour = tkColorChooser.askcolor(self.poscol, parent=self.graphoptionswindow) if colour != None: self.poscol = colour[0] self.poscolhex = colour[1] self.poscollabel.configure(bg=colour[1]) def picknegcol(self): colour = tkColorChooser.askcolor(self.negcol, parent=self.graphoptionswindow) if colour != None: self.negcol = colour[0] self.negcolhex = colour[1] self.negcollabel.configure(bg=colour[1]) def getGCcontent(self, filename, mincut, maxcut): try: gen = open(filename) getseq = False getembl = False seq = '' for line in gen: if line.startswith('ORIGIN'): getseq = True elif line.startswith('SQ Sequence'): getembl = True elif line.startswith('//'): getseq = False getembl = False elif getseq: seq += ''.join(line.split()[1:]) elif getembl: seq += ''.join(line.split()[:-1]) gen.close() seq = seq.upper() except: tkMessageBox.showerror('Try again.', 'feature file ' + filename + ' not valid, or does not exist.') return None if len(seq) == 0: tkMessageBox.showerror('Try again.', 'Sequence not found in feature file ' + filename + '.') return None if maxcut == 'Max': seq = seq[int(mincut)-1:] elif int(maxcut) <= int(mincut): seq = seq[int(mincut)-1:] + seq[:int(maxcut)+1] else: seq = seq[int(mincut)-1:int(maxcut)+1] window1 = int(self.windsize.get()) / 2 window2 = int(self.windsize.get()) - window1 thearray = [] for i in range(0, len(seq), int(self.step.get())): seqstring = seq[max([0, i-window1]):i+window2] thearray.append((seqstring.count('G') + seqstring.count('C')) * 1.0 / len(seqstring) - 0.5) return thearray def getGCskew(self, filename, mincut, maxcut): try: getseq = False getembl = False seq = '' gen = open(filename) for line in gen: if line.startswith('ORIGIN'): getseq = True elif line.startswith('SQ Sequence'): getembl = True elif line.startswith('//'): getseq = False getembl = False elif getseq: seq += ''.join(line.split()[1:]) elif getembl: seq += ''.join(line.split()[:-1]) gen.close() seq = seq.upper() except: tkMessageBox.showerror('Try again.', 'feature file ' + filename + ' not valid, or does not exist.') return None if len(seq) == 0: tkMessageBox.showerror('Try again.', 'Sequence not found in feature file ' + filename + '.') return None window1 = int(self.windsize.get()) / 2 window2 = int(self.windsize.get()) - window1 if maxcut == 'Max': seq = seq[int(mincut)-1:] elif int(maxcut) <= int(mincut): seq = seq[int(mincut)-1:] + seq[:int(maxcut)+1] else: seq = seq[int(mincut)-1:int(maxcut)+1] thearray = [] for i in range(0, len(seq), int(self.step.get())): seqstring = seq[max([0, i-window1]):i+window2] gcount = seqstring.count('G') ccount = seqstring.count('C') try: thearray.append((gcount - ccount) * 1.0 / (gcount + ccount)) except: thearray.append(0) return thearray def getCoverage(self): # DEFNIITION: takes a file and reads in all contigs, their start positions and the reads located within the contig # REQUIRES: a valid ace file # RETURNS: A list of objects of class contig seq = '' getseq = False getembl = False try: gen = open(self.gen1.get()) for line in gen: if line.startswith('ORIGIN'): getseq = True elif line.startswith('SQ Sequence'): getembl = True elif line.startswith('//'): getseq = False getembl = False elif getseq: seq += ''.join(line.split()[1:]) elif getembl: seq += ''.join(line.split()[:-1]) gen.close() except: tkMessageBox.showerror('Try again.', 'feature file not valid, or does not exist.') return None if len(seq) == 0: tkMessageBox.showerror('Try again.', 'Sequence not found in feature file.') return None seq = seq.lower() if self.gen1maxcut.get() == 'Max': seq = seq[int(self.gen1mincut.get())-1:] elif int(self.gen1maxcut) <= int(self.gen1mincut): seq = seq[int(self.gen1mincut)-1:] + seq[:int(self.gen1maxcut)+1] else: seq = seq[int(self.gen1mincut.get())-1:(self.gen1maxcut.get())+1] outlist = [0 for i in range(len(seq))] readlist = [] # list of reads to be added to the contig class index = 0 # switches to 1 once program has dealt with the initial contig # iterates through the file determines what information is contained in each line then reads it to the # right locationregular expressions python transtab = string.maketrans('atgc', 'tacg') for line in file: # puts name in file and starts reading sequence below if line.startswith("CO "): if index != 0: freqDict = {} for j in readlist: for k in range(j.startpos, (j.startpos + j.readLength)): if k in freqDict: freqDict[k] += 1 else: freqDict[k] = 1 coverageList = [] for j in range(1, len(contigSeq) + 1): if contigSeq[j - 1] != '*': coverageList.append(freqDict[j]) contigSeq = contigSeq.lower() thepos = seq.find(contigSeq) if thepos != -1: outlist = outlist[:thepos] + coverageList + outlist[thepos + len(coverageList):] else: contigSeq = contigSeq[::-1] contigSeq = contigSeq.translate(transtab) thepos = seq.find(contigSeq) if thepos != -1: coverageList.reverse() outlist = outlist[:thepos] + coverageList + outlist[thepos + len(coverageList):] readlist = [] index = 1 contigSeq = '' contigName = line.split()[1] # splits the line into a list with elements seperated by whitespace characters # then returns the second element of that list (the name) readnumber = 0 # initiates the read number used to determine where the readsequence will be added # creates a object of class read with the name and location within the contig, leaves sequence as the # empty string to be read in later elif line.startswith('BQ'): index = 2 elif line.startswith("AF "): readIt = line.split() # splits the line into a list of strings seperated by whitespace characters readName = readIt[1] # the name of the read readPos = int(readIt[3]) # the position of the read within the contig readInstance = read(readName, readPos, None) # creates an instance of class read readlist.append(readInstance) # appends to list elif index == 1: contigSeq += line[:-1] elif line.startswith("QA "): readlist[readnumber].startpos = readlist[readnumber].startpos + int(line.split()[1]) - 1 readlist[readnumber].readLength = int(line.split()[2]) - int(line.split()[1]) + 1 readnumber += 1 freqDict = {} for j in readlist: for k in range(j.startpos, (j.startpos + j.readLength)): if k in freqDict: freqDict[k] += 1 else: freqDict[k] = 1 coverageList = [] for j in range(1, len(contigSeq) + 1): if contigSeq[j - 1] != '*': coverageList.append(freqDict[j]) contigSeq = contigSeq.lower() thepos = seq.find(contigSeq) if thepos != -1: outlist = outlist[:thepos] + coverageList + outlist[thepos + len(coverageList):] else: contigSeq = contigSeq[::-1] contigSeq = contigSeq.translate(transtab) thepos = seq.find(contigSeq) if thepos != -1: coverageList.reverse() outlist = outlist[:thepos] + coverageList + outlist[thepos + len(coverageList):] return outlist def getCustom(self): try: thearray = [] gen = open(self.graphfile.get()) templine = gen.readline().rstrip().split('\t') linelen = len(templine) for i in templine: thearray.append([float(i)]) for line in gen: templine = line.rstrip().split('\t') for i in range(len(templine)): if templine[i] != '': thearray[i].append(float(templine[i])) return thearray except: tkMessageBox.showerror('Try again.', 'graph file not valid, or does not exist.') return None def graphtypechanges(self, something): if something == 'None': self.alloroneentry.config(state=DISABLED) self.graphfileentry.config(state=DISABLED) self.graphfilebut.config(state=DISABLED) self.stepentry.config(state=DISABLED) self.windsizeentry.config(state=DISABLED) self.graphheightentry.config(state=DISABLED) self.maxyentry.config(state=DISABLED) self.histoentry.config(state=DISABLED) self.graphlinetentry.config(state=DISABLED) self.poscolbutton.config(state=DISABLED) self.negcolbutton.config(state=DISABLED) self.logitbut.config(state=DISABLED) self.ggapentry.config(state=DISABLED) elif something == 'GC Content': self.alloroneentry.config(state=NORMAL) self.graphfileentry.config(state=DISABLED) self.graphfilebut.config(state=DISABLED) self.stepentry.config(state=NORMAL) self.windsizeentry.config(state=NORMAL) self.graphheightentry.config(state=NORMAL) self.maxyentry.config(state=NORMAL) self.histoentry.config(state=NORMAL) self.graphlinetentry.config(state=NORMAL) self.poscolbutton.config(state=NORMAL) self.negcolbutton.config(state=NORMAL) self.logitbut.config(state=DISABLED) self.ggapentry.config(state=NORMAL) elif something == 'GC Skew': self.alloroneentry.config(state=NORMAL) self.graphfileentry.config(state=DISABLED) self.graphfilebut.config(state=DISABLED) self.stepentry.config(state=NORMAL) self.windsizeentry.config(state=NORMAL) self.graphheightentry.config(state=NORMAL) self.maxyentry.config(state=NORMAL) self.histoentry.config(state=NORMAL) self.graphlinetentry.config(state=NORMAL) self.poscolbutton.config(state=NORMAL) self.negcolbutton.config(state=NORMAL) self.logitbut.config(state=DISABLED) self.ggapentry.config(state=NORMAL) elif something == 'Coverage': self.alloroneentry.config(state=DISABLED) self.graphfileentry.config(state=NORMAL) self.graphfilebut.config(state=NORMAL) self.stepentry.config(state=DISABLED) self.windsizeentry.config(state=NORMAL) self.graphheightentry.config(state=NORMAL) self.maxyentry.config(state=NORMAL) self.histoentry.config(state=NORMAL) self.graphlinetentry.config(state=NORMAL) self.poscolbutton.config(state=NORMAL) self.negcolbutton.config(state=DISABLED) self.logitbut.config(state=NORMAL) self.ggapentry.config(state=NORMAL) elif something == 'Custom': self.alloroneentry.config(state=NORMAL) self.graphfileentry.config(state=NORMAL) self.graphfilebut.config(state=NORMAL) self.stepentry.config(state=DISABLED) self.windsizeentry.config(state=DISABLED) self.graphheightentry.config(state=NORMAL) self.maxyentry.config(state=NORMAL) self.histoentry.config(state=NORMAL) self.graphlinetentry.config(state=NORMAL) self.poscolbutton.config(state=NORMAL) self.negcolbutton.config(state=NORMAL) self.logitbut.config(state=NORMAL) self.ggapentry.config(state=NORMAL) def figureoptions(self): try: self.figureoptionswindow.destroy() except: pass self.figureoptionswindow = Toplevel() self.figureoptionswindow.title('Figure') self.frame2 = Frame(self.figureoptionswindow) self.mainoptionslab = Label(self.frame2, text='Figure Options', font='Helvetica 13 bold underline') self.mainoptionslab.grid(row=0, column=0) self.figwidthlabel = Label(self.frame2, text='Width of Figure (pixels):') self.figwidthlabel.grid(row=1, column=0) self.figwidthentry = Entry(self.frame2, textvariable=self.figwidthvar) self.figwidthentry.grid(row=1, column=1) self.gltlabel = Label(self.frame2, text='Thickness of genome line:') self.gltlabel.grid(row=2, column=0) self.gltentry = Entry(self.frame2, textvariable=self.gltvar) self.gltentry.grid(row=2, column=1) self.height1label = Label(self.frame2, text='Height of genes in figure:') self.height1label.grid(row=3, column=0) self.height1entry = Entry(self.frame2, textvariable=self.height1var) self.height1entry.grid(row=3, column=1) self.height2label = Label(self.frame2, text='Height of Blast hits in figure:') self.height2label.grid(row=4, column=0) self.height2entry = Entry(self.frame2, textvariable=self.height2var) self.height2entry.grid(row=4, column=1) self.alnlabel = Label(self.frame2, text='Alignment of genomes:') self.alnlabel.grid(row=5, column=0) self.alnentry = OptionMenu(self.frame2, self.aln, 'left', 'centre', 'right', 'best blast') self.alnentry.config(width=5) self.alnentry.grid(row=5, column=1, sticky=EW) self.legendoptionslab = Label(self.frame2, text='Legend Options', font='Helvetica 13 bold') self.legendoptionslab.grid(row=6, column=0) self.drawfig1label = Label(self.frame2, text='Draw Blast identity legend?') self.drawfig1label.grid(row=7, column=0) self.drawfig1entry = Checkbutton(self.frame2, variable=self.drawfig1) self.drawfig1entry.grid(row=7, column=1) self.drawfig2label = Label(self.frame2, text='Length of scale legend (in base pairs):') self.drawfig2label.grid(row=8, column=0) self.drawfig2entry = Entry(self.frame2, textvariable=self.drawfig2var) self.drawfig2entry.grid(row=8, column=1) self.leg2label = Label(self.frame2, text='Feature Legend:') self.leg2label.grid(row=9, column=0) self.leg2entry = OptionMenu(self.frame2, self.leg2, 'None', 'Single column', 'Two columns') self.leg2entry.grid(row=9, column=1, sticky=EW) self.legnamelabel = Label(self.frame2, text='Get feature name from') self.legnamelabel.grid(row=10, column=0) self.legnameentry = OptionMenu(self.frame2, self.legname, 'gene', 'product', 'locus_tag', 'note') self.legnameentry.grid(row=10, column=1, sticky=EW) self.figureoptionsclosebutton = Button(self.frame2, text='close', command=self.figureoptionsclose) self.figureoptionsclosebutton.grid(row=11, column=1, sticky=E, pady=5) self.figureoptionswindow.geometry('+30+40') self.frame2.grid(padx=30, pady=10) def figureoptionsclose(self): self.figureoptionswindow.destroy() def blastoptions(self): try: self.blastoptionswindow.destroy() except: pass self.blastoptionswindow = Toplevel() self.blastoptionswindow.title('Blast') self.frame3 = Frame(self.blastoptionswindow) self.blastoptionslab = Label(self.frame3, text='Blast Options', font='Helvetica 13 bold underline') self.blastoptionslab.grid(row=0, column=0) self.minlengthlabel = Label(self.frame3, text='Min. length:') self.minlengthlabel.grid(row=1, column=0) self.minlengthentry = Entry(self.frame3, textvariable=self.minlengthvar) self.minlengthentry.grid(row=1, column=1, columnspan=4) self.minevallabel = Label(self.frame3, text='Max. e Value:') self.minevallabel.grid(row=2, column=0) self.minevalentry = Entry(self.frame3, textvariable=self.minevalvar) self.minevalentry.grid(row=2, column=1, columnspan=4) self.minIdentlabel = Label(self.frame3, text='Min. Identity value:') self.minIdentlabel.grid(row=3, column=0) self.minIdententry = Entry(self.frame3, textvariable=self.minIdentvar) self.minIdententry.grid(row=3, column=1, columnspan=4) self.blastlabel = Label(self.frame3, text='normal') self.blastlabel.grid(row=4, column=1, columnspan=2) self.blastilabel = Label(self.frame3, text='inverted') self.blastilabel.grid(row=4, column=3, columnspan=2) self.minblastctag = Label(self.frame3, text='Choose minimum blast colour:') self.minblastctag.grid(row=5, column=0) self.minblastcentry = Button(self.frame3, text='...', command=self.getminblastc) self.minblastcentry.grid(row=5, column=2) self.minblastclabel = Label(self.frame3, width=3, bg=self.minblastchex, relief=RIDGE) self.minblastclabel.grid(row=5, column=1) self.minblastcentryi = Button(self.frame3, text='...', command=self.getminblastci) self.minblastcentryi.grid(row=5, column=4) self.minblastclabeli = Label(self.frame3, width=3, bg=self.minblastcihex, relief=RIDGE) self.minblastclabeli.grid(row=5, column=3) self.maxblastctag = Label(self.frame3, text='Choose maximum blast colour:') self.maxblastctag.grid(row=6, column=0) self.maxblastcentry = Button(self.frame3, text='...', command=self.getmaxblastc) self.maxblastcentry.grid(row=6, column=2) self.maxblastclabel = Label(self.frame3, width=3, bg=self.maxblastchex, relief=RIDGE) self.maxblastclabel.grid(row=6, column=1) self.maxblastcentryi = Button(self.frame3, text='...', command=self.getmaxblastci) self.maxblastcentryi.grid(row=6, column=4) self.maxblastclabeli = Label(self.frame3, width=3, bg=self.maxblastcihex, relief=RIDGE) self.maxblastclabeli.grid(row=6, column=3) self.blastoutlinetag = Label(self.frame3, text='Outline blast hits in black:') self.blastoutlinetag.grid(row=7, column=0) self.blastoutlineentry = Checkbutton(self.frame3, variable=self.blastoutline) self.blastoutlineentry.grid(row=7, column=1, columnspan=4) self.autodetectlab = Label(self.frame3, text='Filter small blast hits/annotations:') self.autodetectlab.grid(row=8, column=0) self.autodetectentry = Checkbutton(self.frame3, variable=self.autodetect) self.autodetectentry.grid(row=8, column=1, columnspan=4) self.blastoptionsclosebutton = Button(self.frame3, text='close', command=self.blastoptionsclose) self.blastoptionsclosebutton.grid(row=9, column=1, columnspan=4, sticky=E, pady=5) self.blastoptionswindow.geometry('+30+40') self.frame3.grid(padx=30, pady=10) def blastoptionsclose(self): self.blastoptionswindow.destroy() def annotateoptions(self): try: self.annotateoptionswindow.destroy() except: pass self.annotateoptionswindow = Toplevel() self.annotateoptionswindow.title('Annotation') self.frame4 = Frame(self.annotateoptionswindow) self.annotLab = Label(self.frame4, text='Annotation Options', font='Helvetica 13 bold underline') self.annotLab.grid(row=0, column=0) self.leglabel = Label(self.frame4, text='Feature Labels:') self.leglabel.grid(row=1, column=0) self.leg = StringVar(value='None') self.legentry = OptionMenu(self.frame4, self.leg, 'None', 'Top', 'Bottom', 'Top & Bottom') self.legentry.config(width=5) self.legentry.grid(row=1, column=1, columnspan=4, sticky=EW) self.legnamelabel = Label(self.frame4, text='Get feature name from:') self.legnamelabel.grid(row=2, column=0) self.legnameentry = OptionMenu(self.frame4, self.legname, 'gene', 'product', 'locus_tag', 'note') self.legnameentry.grid(row=2, column=1, columnspan=4, sticky=EW) self.exontlabel = Label(self.frame4, text='Thickness of exon lines:') self.exontlabel.grid(row=3, column=0) self.exontentry = Entry(self.frame4, textvariable=self.exontvar) self.exontentry.grid(row=3, column=1, columnspan=4) self.genetlabel = Label(self.frame4, text='Thickness of gene outlines:') self.genetlabel.grid(row=4, column=0) self.genetentry = Entry(self.frame4, textvariable=self.genetvar) self.genetentry.grid(row=4, column=1, columnspan=4) self.featlabel = Label(self.frame4, text='Include following features', font='Helvetica 13 bold') self.featlabel.grid(row=5, column=0) self.featcolour = Label(self.frame4, text='Colour', font='Helvetica 13 bold') self.featcolour.grid(row=5, column=1, columnspan=2) self.featshape = Label(self.frame4, text='type', font='Helvetica 13 bold') self.featshape.grid(row=5, column=3, columnspan=2) self.geneflabel = Label(self.frame4, text='gene') self.geneflabel.grid(row=6, column=0) self.genefentry = Checkbutton(self.frame4, variable=self.genef) self.genefentry.grid(row=6, column=0, sticky=E) self.genefcolourBut = Button(self.frame4, width=1, height=1, text='...', command=self.pickcolourgene) self.genefcolourBut.grid(row=6, column=2) self.genefcolourlabel = Label(self.frame4, width=3, bg=self.genefcolourhex, relief=RIDGE) self.genefcolourlabel.grid(row=6, column=1) self.genefrectentry = OptionMenu(self.frame4, self.genefrect, 'arrow', 'rect', 'frame', 'pointer') self.genefrectentry.config(width=10) self.genefrectentry.grid(row=6, column=3, columnspan=2, sticky=EW) self.cdsflabel = Label(self.frame4, text='CDS') self.cdsflabel.grid(row=7, column=0) self.cdsfentry = Checkbutton(self.frame4, variable=self.cdsf) self.cdsfentry.grid(row=7, column=0, sticky=E) self.cdsfcolourBut = Button(self.frame4, width=1, height=1, text='...', command=self.pickcolourcds) self.cdsfcolourBut.grid(row=7, column=2) self.cdsfcolourlabel = Label(self.frame4, width=3, bg=self.cdsfcolourhex, relief=RIDGE) self.cdsfcolourlabel.grid(row=7, column=1) self.cdsfrectentry = OptionMenu(self.frame4, self.cdsfrect, 'arrow', 'rect', 'frame', 'pointer') self.cdsfrectentry.config(width=6) self.cdsfrectentry.grid(row=7, column=3, columnspan=2, sticky=EW) self.trnaflabel = Label(self.frame4, text='tRNA') self.trnaflabel.grid(row=8, column=0) self.trnafentry = Checkbutton(self.frame4, variable=self.trnaf) self.trnafentry.grid(row=8, column=0, sticky=E) self.trnafcolourBut = Button(self.frame4, width=1, height=1, text='...', command=self.pickcolourtrna) self.trnafcolourBut.grid(row=8, column=2) self.trnafcolourlabel = Label(self.frame4, width=3, bg=self.trnafcolourhex, relief=RIDGE) self.trnafcolourlabel.grid(row=8, column=1) self.trnafrectentry = OptionMenu(self.frame4, self.trnafrect, 'arrow', 'rect', 'frame', 'pointer') self.trnafrectentry.config(width=6) self.trnafrectentry.grid(row=8, column=3, columnspan=2, sticky=EW) self.miscflabel = Label(self.frame4, text='misc_feature') self.miscflabel.grid(row=9, column=0) self.miscfentry = Checkbutton(self.frame4, variable=self.miscf) self.miscfentry.grid(row=9, column=0, sticky=E) self.miscfcolourBut = Button(self.frame4, width=1, height=1, text='...', command=self.pickcolourmisc) self.miscfcolourBut.grid(row=9, column=2) self.miscfcolourlabel = Label(self.frame4, width=3, bg=self.miscfcolourhex, relief=RIDGE) self.miscfcolourlabel.grid(row=9, column=1) self.miscfrectentry = OptionMenu(self.frame4, self.miscfrect, 'arrow', 'rect', 'frame', 'pointer') self.miscfrectentry.config(width=6) self.miscfrectentry.grid(row=9, column=3, columnspan=2, sticky=EW) self.randflabel = Entry(self.frame4, textvariable=self.randfeat) self.randflabel.grid(row=10, column=0) self.randfentry = Checkbutton(self.frame4, variable=self.randf) self.randfentry.grid(row=10, column=0, sticky=E) self.randfcolourBut = Button(self.frame4, width=1, height=1, text='...', command=self.pickcolourrand) self.randfcolourBut.grid(row=10, column=2) self.randfcolourlabel = Label(self.frame4, width=3, bg=self.randfcolourhex, relief=RIDGE) self.randfcolourlabel.grid(row=10, column=1) self.randfrectentry = OptionMenu(self.frame4, self.randfrect, 'arrow', 'rect', 'frame', 'pointer') self.randfrectentry.config(width=6) self.randfrectentry.grid(row=10, column=3, columnspan=2, sticky=EW) self.annotateoptionsclosebutton = Button(self.frame4, text='close', command=self.annotateoptionsclose) self.annotateoptionsclosebutton.grid(row=11, column=3, columnspan=2, sticky=E, pady=5) self.annotateoptionswindow.geometry('+30+40') self.frame4.grid(padx=30, pady=10) def annotateoptionsclose(self): self.annotateoptionswindow.destroy() def graphoptions(self): try: self.graphoptionswindow.destroy() except: pass self.graphoptionswindow = Toplevel() self.graphoptionswindow.title('Graph') self.frame5 = Frame(self.graphoptionswindow) self.graphlabel = Label(self.frame5, text='Graph options', font='Helvetica 13 bold') self.graphlabel.grid(row=0, column=0) self.graphtypelabel = Label(self.frame5, text='Graph:') self.graphtypelabel.grid(row=1, column=0) self.graphtypeentry = OptionMenu(self.frame5, self.graphtype, 'None', 'GC Content', 'GC Skew', 'Coverage', 'Custom', command=self.graphtypechanges) self.graphtypeentry.grid(row=1, column=1) self.alloronelabel = Label(self.frame5, text='Multiple graphs:') self.alloronelabel.grid(row=2, column=0) self.alloroneentry = Checkbutton(self.frame5, variable=self.allorone, state=DISABLED) self.alloroneentry.grid(row=2, column=1) self.graphfilelabel = Label(self.frame5, text='Input file:') self.graphfilelabel.grid(row=3, column=0) self.graphfileentry = Entry(self.frame5, textvariable=self.graphfile, state=DISABLED) self.graphfileentry.grid(row=3, column=1) self.graphfilebut = Button(self.frame5, width=1, height=1, text='...', command=self.opengraphfile, state=DISABLED) self.graphfilebut.grid(row=3, column=2) self.steplabel = Label(self.frame5, text='Step size:') self.steplabel.grid(row=4, column=0) self.stepentry = Entry(self.frame5, textvariable=self.step, state=DISABLED) self.stepentry.grid(row=4, column=1) self.windsizelabel = Label(self.frame5, text='Window size:') self.windsizelabel.grid(row=5, column=0) self.windsizeentry = Entry(self.frame5, textvariable=self.windsize, state=DISABLED) self.windsizeentry.grid(row=5, column=1) self.graphheightlabel = Label(self.frame5, text='Graph Height:') self.graphheightlabel.grid(row=6, column=0) self.graphheightentry = Entry(self.frame5, textvariable=self.graphheight, state=DISABLED) self.graphheightentry.grid(row=6, column=1) self.maxylabel = Label(self.frame5, text='Maximum Y:') self.maxylabel.grid(row=7, column=0) self.maxyentry = Entry(self.frame5, textvariable=self.maxy, state=DISABLED) self.maxyentry.grid(row=7, column=1) self.logitlabel = Label(self.frame5, text='Log scale (log10):') self.logitlabel.grid(row=8, column=0) self.logitbut = Checkbutton(self.frame5, variable=self.logit, state=DISABLED) self.logitbut.grid(row=8, column=1) self.histolabel = Label(self.frame5, text='Graph Type:') self.histolabel.grid(row=9, column=0) self.histoentry = OptionMenu(self.frame5, self.histo, 'Histogram', 'Line') self.histoentry.config(state=DISABLED) self.histoentry.grid(row=9, column=1) self.graphlinetlabel = Label(self.frame5, text='Axis line thickness:') self.graphlinetlabel.grid(row=10, column=0) self.graphlinetentry = Entry(self.frame5, textvariable=self.graphlinet, state=DISABLED) self.graphlinetentry.grid(row=10, column=1) self.poslabel = Label(self.frame5, text='Positive value colour:') self.poslabel.grid(row=11, column=0) self.poscollabel = Label(self.frame5, width=3, bg=self.poscolhex, relief=RIDGE) self.poscollabel.grid(row=11, column=1, sticky=EW) self.poscolbutton = Button(self.frame5, width=1, height=1, text='...', command=self.pickposcol, state=DISABLED) self.poscolbutton.grid(row=11, column=2) self.neglabel = Label(self.frame5, text='Negative value colour:') self.neglabel.grid(row=12, column=0) self.negcollabel = Label(self.frame5, width=3, bg=self.negcolhex, relief=RIDGE) self.negcollabel.grid(row=12, column=1, sticky=EW) self.negcolbutton = Button(self.frame5, width=1, height=1, text='...', command=self.picknegcol, state=DISABLED) self.negcolbutton.grid(row=12, column=2) self.ggaplabel = Label(self.frame5, text='Gap between graph and figure:') self.ggaplabel.grid(row=13, column=0) self.ggapentry = Entry(self.frame5, textvariable=self.ggap, state=DISABLED) self.ggapentry.grid(row=13, column=1) self.graphoptionsclosebutton = Button(self.frame5, text='close', command=self.graphoptionsclose) self.graphoptionsclosebutton.grid(row=14, column=1, columnspan=2, sticky=E, pady=5) self.graphoptionswindow.geometry('+30+40') self.graphtypechanges(self.graphtype.get()) self.frame5.grid(padx=30, pady=10) def graphoptionsclose(self): self.graphoptionswindow.destroy() def opengraphfile(self): filename = tkFileDialog.askopenfilename(parent=self.graphoptionswindow) self.graphfile.set(filename) def pickcolourgene(self): colour = tkColorChooser.askcolor(self.genefcolour, parent=self.annotateoptionswindow) if colour != None: self.genefcolour = colour[0] self.genefcolourhex = colour[1] self.genefcolourlabel.configure(bg=colour[1]) def pickcolourcds(self): colour = tkColorChooser.askcolor(self.cdsfcolour, parent=self.annotateoptionswindow) if colour != None: self.cdsfcolour = colour[0] self.cdsfcolourhex = colour[1] self.cdsfcolourlabel.configure(bg=colour[1]) def pickcolourtrna(self): colour = tkColorChooser.askcolor(self.trnafcolour, parent=self.annotateoptionswindow) if colour != None: self.trnafcolour = colour[0] self.trnafcolourhex = colour[1] self.trnafcolourlabel.configure(bg=colour[1]) def pickcolourrand(self): colour = tkColorChooser.askcolor(self.randfcolour, parent=self.annotateoptionswindow) if colour != None: self.randfcolour = colour[0] self.randfcolourhex = colour[1] self.randfcolourlabel.configure(bg=colour[1]) def pickcolourmisc(self): colour = tkColorChooser.askcolor(self.miscfcolour, parent=self.annotateoptionswindow) if colour != None: self.miscfcolour = colour[0] self.miscfcolourhex = colour[1] self.miscfcolourlabel.configure(bg=colour[1]) def getminblastc(self): colour = tkColorChooser.askcolor(self.minblastc, parent=self.blastoptionswindow) if colour != None: self.minblastc = colour[0] self.minblastchex = colour[1] self.minblastclabel.configure(bg=colour[1]) def getmaxblastc(self): colour = tkColorChooser.askcolor(self.maxblastc, parent=self.blastoptionswindow) if colour != None: self.maxblastc = colour[0] self.maxblastchex = colour[1] self.maxblastclabel.configure(bg=colour[1]) def getminblastci(self): colour = tkColorChooser.askcolor(self.minblastci, parent=self.blastoptionswindow) if colour != None: self.minblastci = colour[0] self.minblastcihex = colour[1] self.minblastclabeli.configure(bg=colour[1]) def getmaxblastci(self): colour = tkColorChooser.askcolor(self.maxblastci, parent=self.blastoptionswindow) if colour != None: self.maxblastci = colour[0] self.maxblastcihex = colour[1] self.maxblastclabeli.configure(bg=colour[1]) def makeFigure(self): global abortCaptain if self.outfile.get() == '' and not self.filetype.get().startswith('Preview'): self.getoutfile() if self.outfile.get() == '' and not self.filetype.get().startswith('Preview'): return None try: if self.thegenblast.is_alive(): tkMessageBox.showerror('Please wait', 'BLAST already running.') return None except: pass if self.running: abortCaptain = True else: abortCaptain = False self.running = True self.createFigure.config(text='Cancel Figure') try: self.minlength = int(self.minlengthvar.get()) except: tkMessageBox.showerror('Try again.', 'Please enter a valid integer for minimum length.') self.running = False self.createFigure.config(text="Create Figure") return None try: self.mineval = float(self.minevalvar.get()) except: tkMessageBox.showerror('Try again.', 'Please enter a valid floating point number for minimum e value.') self.running = False self.createFigure.config(text="Create Figure") return None try: self.minIdent = float(self.minIdentvar.get()) except: tkMessageBox.showerror('Try again.', 'Please enter a valid floating point number for minimum identity.') self.running = False self.createFigure.config(text="Create Figure") return None try: self.figwidth = int(self.figwidthvar.get()) except: tkMessageBox.showerror('Try again.', 'Please enter a valid integer for figure width.') self.running = False self.createFigure.config(text="Create Figure") return None try: self.height1 = int(self.height1var.get()) except: tkMessageBox.showerror('Try again.', 'Please enter a valid integer for height of genes.') self.running = False self.createFigure.config(text="Create Figure") return None try: self.height2 = int(self.height2var.get()) except: tkMessageBox.showerror('Try again.', 'Please enter a valid integer for height of blast matches.') self.running = False self.createFigure.config(text="Create Figure") return None try: self.glt = int(self.gltvar.get()) except: tkMessageBox.showerror('Try again.', 'Please enter a valid integer for genome line thickness.') self.running = False self.createFigure.config(text="Create Figure") return None try: self.exont = int(self.exontvar.get()) except: tkMessageBox.showerror('Try again.', 'Please enter a valid integer for exon line thickeness.') self.running = False self.createFigure.config(text="Create Figure") return None try: self.genet = int(self.genetvar.get()) except: tkMessageBox.showerror('Try again.', 'Please enter a valid integer for exon line thickeness.') self.running = False self.createFigure.config(text="Create Figure") return None self.featDict = {} if self.genef.get() == 1: self.featDict['gene'] = (self.genefrect.get(), self.genefcolour) if self.cdsf.get() == 1: self.featDict['CDS'] = (self.cdsfrect.get(), self.cdsfcolour) if self.trnaf.get() == 1: self.featDict['tRNA'] = (self.trnafrect.get(), self.trnafcolour) if self.miscf.get() == 1: self.featDict['misc_feature'] = (self.miscfrect.get(), self.miscfcolour) if self.randf.get() == 1: self.featDict[self.randfeat.get()] = (self.randfrect.get(), self.randfcolour) self.reverseList = [] self.minmaxlist = [] for i in self.genlist.get(0, END): self.reverseList.append(self.revlist[i[:2]]) try: if self.maxcutlist[i[:2]] == 'Max': self.minmaxlist.append((int(self.mincutlist[i[:2]]), 'Max')) else: self.minmaxlist.append((int(self.mincutlist[i[:2]]), int(self.maxcutlist[i[:2]]))) except: tkMessageBox.showerror('Try again.', 'Please enter a valid integer cut off points for annotation file ' + i[:2] + '.') self.running = False self.createFigure.config(text="Create Figure") return None if self.graphtype.get() != 'None' and (self.leg.get() == 'Top' or self.leg.get() == 'Top & Bottom'): tkMessageBox.showerror('Try again.', 'Please Choose either the graph or the legend to be displayed above the figure.') self.running = False self.createFigure.config(text="Create Figure") return None if self.leg.get() != 'None' and self.leg2.get() != 'None': tkMessageBox.showerror('Try again.', 'Please Choose either feature labels or a feature legend.') self.running = False self.createFigure.config(text="Create Figure") return None else: if self.leg.get() == 'None': self.theleg = self.leg2.get() else: self.theleg = self.leg.get() self.inputlist = [] self.graphlist = [] getit = True nocompare = False if self.genlist.size() > 1 and self.blastlist.size() == 0: nocompare = tkMessageBox.askquestion('No blast files.', 'Only gene figures will be drawn, continue?\n(To create a comparison figure please generate or manually input a blast file)') if nocompare == 'no': self.running = False self.createFigure.config(text="Create Figure") return None else: nocompare = True if self.genlist.size() > 0: if self.graphtype.get() == 'GC Content': self.graphlist.append(self.getGCcontent(self.genlist.get(0)[4:], self.mincutlist[self.genlist.get(0)[:2]], self.maxcutlist[self.genlist.get(0)[:2]])) elif self.graphtype.get() == 'GC Skew': self.graphlist.append(self.getGCskew(self.genlist.get(0)[4:], self.mincutlist[self.genlist.get(0)[:2]], self.maxcutlist[self.genlist.get(0)[:2]])) self.inputlist.append(self.genlist.get(0)[4:]) tempfile = open(self.genlist.get(0)[4:]) getline = True line = tempfile.readline() while getline and line != '': if line.startswith('FT source') or line.startswith(' source')\ or line.startswith('ORIGIN') or line.startswith('SQ Sequence') or line.startswith('>'): getline = False line = tempfile.readline() if getline: self.genlengths = [tkSimpleDialog.askinteger('Length not in file', 'Please enter the length of genome in file 1')] else: self.genlengths = [None] tempfile.close() else: tkMessageBox.showerror('Try again.', 'Please enter at least one feature file.') self.running = False self.createFigure.config(text="Create Figure") return None if self.genlist.size() - 1 == self.blastlist.size() or nocompare: for i in range(self.genlist.size() - 1): self.inputlist.append(self.blastlist.get(i)) if self.graphtype.get() == 'GC Content' and self.allorone.get() == 1: self.graphlist.append(self.getGCcontent(self.genlist.get(i + 1)[4:], self.mincutlist[self.genlist.get(i + 1)[:2]], self.maxcutlist[self.genlist.get(i + 1)[:2]])) elif self.graphtype.get() == 'GC Skew' and self.allorone.get() == 1: self.graphlist.append(self.getGCcontent(self.genlist.get(i + 1)[4:], self.mincutlist[self.genlist.get(i + 1)[:2]], self.maxcutlist[self.genlist.get(i + 1)[:2]])) self.inputlist.append(self.genlist.get(i + 1)[4:]) tempfile = open(self.genlist.get(i + 1)[4:]) getline = True line = tempfile.readline() while getline and line != '': if line.startswith('FT source') or line.startswith(' source')\ or line.startswith('ORIGIN') or line.startswith('SQ Sequence') or line.startswith('>'): getline = False line = tempfile.readline() if getline: self.genlengths.append(tkSimpleDialog.askinteger('Length not in file', 'Please enter the length of genome in file ' + str(i + 1) + '.')) else: self.genlengths.append(None) tempfile.close() else: if self.blastlist.size() >= self.genlist.size(): tkMessageBox.showerror('Try again.', 'Too many blast files.') else: tkMessageBox.showerror('Try again.', 'Too few blast files.') self.running = False self.createFigure.config(text="Create Figure") return None try: self.drawfig2 = int(self.drawfig2var.get()) if self.drawfig2 == 0: self.drawfig2 = False except: tkMessageBox.showerror('Try again.', 'Please enter a valid integer for length of figure 2.') self.running = False self.createFigure.config(text="Create Figure") return None if self.drawfig1.get() == 1: self.vardrawfig1 = True else: self.vardrawfig1 = False if self.blastoutline.get() == 1: self.varblastoutline = True else: self.varblastoutline = False if self.graphtype.get() == 'None': self.vargraphit = None elif self.graphtype.get() == 'GC Content': self.vargraphit = [self.graphlist, self.poscol, self.negcol, int(self.graphheight.get()), int(self.graphlinet.get()), self.histo.get(), self.maxy.get(), int(self.ggap.get())] if None in self.vargraphit[0]: self.running = False self.createFigure.config(text="Create Figure") return None elif self.graphtype.get() == 'GC Skew': self.vargraphit = [self.graphlist, self.poscol, self.negcol, int(self.graphheight.get()), int(self.graphlinet.get()), self.histo.get(), self.maxy.get(), int(self.ggap.get())] if None in self.vargraphit[0] == None: self.running = False self.createFigure.config(text="Create Figure") return None elif self.graphtype.get() == 'Coverage': self.vargraphit = [[self.getCoverage()], self.poscol, self.negcol, int(self.graphheight.get()), int(self.graphlinet.get()), self.histo.get(), self.maxy.get(), int(self.ggap.get())] if None in self.vargraphit[0]: self.running = False self.createFigure.config(text="Create Figure") return None elif self.graphtype.get() == 'Custom': tempcustom = self.getCustom() if self.allorone.get() != 1: tempcustom = [tempcustom[0]] self.vargraphit = [tempcustom, self.poscol, self.negcol, int(self.graphheight.get()), int(self.graphlinet.get()), self.histo.get(), self.maxy.get(), int(self.ggap.get())] if None in self.vargraphit[0]: self.running = False self.createFigure.config(text="Create Figure") return None if self.cutstate != None and self.cutstate != (str(self.mincutlist), str(self.maxcutlist)): tkMessageBox.showerror('Try again.', 'Please generate blast files again, blast files do not match modified annotation files.') self.running = False self.createFigure.config(text="Create Figure") return None if self.orderstate != None and self.orderstate != self.genlist.get(0, END): tkMessageBox.showerror('Try again.', 'Please generate blast files again, order of annotation files has been changed.') self.running = False self.createFigure.config(text="Create Figure") return None getit = True for i in self.inputlist: if not os.path.exists(i): if not i == '' and not nocompare: getit = False if not getit: tkMessageBox.showerror('Try again.', 'A selected file does not exist.') self.running = False self.createFigure.config(text="Create Figure") return None else: self.thethread = threading.Thread(target=self.makeFigure2) self.thethread.start() self.thethread2 = threading.Thread(target=self.dotdotdot) self.thethread2.start() def dotdotdot(self): while self.thethread.is_alive(): time.sleep(0.5) self.processLab.config(text='Drawing figure..') time.sleep(0.5) self.processLab.config(text='Drawing figure...') time.sleep(0.5) self.processLab.config(text='Drawing figure.') if self.theminblast == 101: self.processLab.config(text='Drawing figure...\ncomplete.') elif self.theminblast == None: self.processLab.config(text='Drawing figure...\nfailed.') else: self.processLab.config(text='Drawing figure...\ncomplete.') self.running = False self.createFigure.config(text="Create Figure") def makeFigure2(self): if self.filetype.get() == 'Bitmap (bmp)': if self.outfile.get()[-4:].lower() != '.bmp': theoutfile = self.outfile.get() + '.bmp' else: theoutfile = self.outfile.get() self.theminblast = draw(theoutfile, self.minlength, self.mineval, self.minIdent, self.inputlist, self.figwidth, self.height1, self.height2, self.minblastc, self.maxblastc, self.minblastci, self.maxblastci, self.vardrawfig1, self.drawfig2, False, self.reverseList, self.featDict, self.glt, self.exont, self.genet, self.genlengths, self.aln.get(), self.vargraphit, self.varblastoutline, self.minmaxlist, self.autodetect.get() == 1, self.theleg, self.legname.get()) elif self.filetype.get() == 'Vector file (svg)': if self.outfile.get()[-4:].lower() != '.svg': theoutfile = self.outfile.get() + '.svg' else: theoutfile = self.outfile.get() self.theminblast = drawsvg(theoutfile, self.minlength, self.mineval, self.minIdent, self.inputlist, self.figwidth, self.height1, self.height2, self.minblastc, self.maxblastc, self.minblastci, self.maxblastci, self.vardrawfig1, self.drawfig2, False, self.reverseList, self.featDict, self.glt, self.exont, self.genet, self.genlengths, self.aln.get(), self.vargraphit, self.varblastoutline, self.minmaxlist, self.autodetect.get() == 1, self.theleg, self.legname.get()) else: self.theminblast = self.getPreview() def getPreview(self): try: self.prevwindow.destroy() except: pass theoutfile = None if self.filetype.get() == 'Preview (1:1)': testit, self.theminblast, width, height = draw(theoutfile, self.minlength, self.mineval, self.minIdent, self.inputlist, self.figwidth, self.height1, self.height2, self.minblastc, self.maxblastc, self.minblastci, self.maxblastci, self.vardrawfig1, self.drawfig2, False, self.reverseList, self.featDict, self.glt, self.exont, self.genet, self.genlengths, self.aln.get(), self.vargraphit, self.varblastoutline, self.minmaxlist, self.autodetect.get() == 1, self.theleg, self.legname.get(), 1) else: testit, self.theminblast, width, height = draw(theoutfile, self.minlength, self.mineval, self.minIdent, self.inputlist, self.figwidth, self.height1, self.height2, self.minblastc, self.maxblastc, self.minblastci, self.maxblastci, self.vardrawfig1, self.drawfig2, False, self.reverseList, self.featDict, self.glt, self.exont, self.genet, self.genlengths, self.aln.get(), self.vargraphit, self.varblastoutline, self.minmaxlist, self.autodetect.get() == 1, self.theleg, self.legname.get(), 2) self.prevwindow = Toplevel() self.prevwindow.title('Preview') self.prevframe = Frame(self.prevwindow) self.prevwindow.grid_rowconfigure(0, weight=1) self.prevwindow.grid_columnconfigure(0, weight=1) self.prevwindow.geometry('+30+40') self.prevframe.grid(row=0, column=0, sticky=NSEW) self.prevframe.grid_rowconfigure(0, weight=1) self.prevframe.grid_columnconfigure(0, weight=1) xscrollbar = Scrollbar(self.prevframe, orient=HORIZONTAL) xscrollbar.grid(row=1, column=0, sticky=E+W) yscrollbar = Scrollbar(self.prevframe) yscrollbar.grid(row=0, column=1, sticky=N+S) self.canvas = Canvas(self.prevframe, bd=0, bg='#000000', scrollregion=(0, 0, width, height), xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) test = PhotoImage(data=testit) self.canvas.create_image(0, 0, image=test, anchor=NW) self.canvas.grid(row=0, column=0, sticky=NSEW) self.canvas.image = test xscrollbar.config(command=self.canvas.xview) yscrollbar.config(command=self.canvas.yview) #label = Label(self.prevframe, image=test) #label.image = test #label.grid() #self.canvas.image = test return self.theminblast def gbk2fasta(self, genbank, out, mincut, maxcut): getseq = False getembl = False getmultifa = False seq = '' try: mincut = int(mincut) if mincut < 1: mincut = 1 if maxcut != 'Max': maxcut = int(maxcut) if maxcut < 1: maxcut = 1 except: tkMessageBox.showerror('Try again.', 'Annotation slice values not valid.') try: gen = open(genbank) outfile = open(out, 'w') for line in gen: if line.startswith('ORIGIN'): getseq = True elif line.startswith('SQ Sequence'): getembl = True elif line.startswith('>'): if getmultifa: seq += 'qqq' else: getmultifa = True elif line.startswith('//'): getseq = False getembl = False elif getseq: seq += ''.join(line.split()[1:]) elif getembl: seq += ''.join(line.split()[:-1]) elif getmultifa: seq += line.rstrip() if getmultifa: getset = set(seq) rightchars = set('atgcATGCqnNuUyYkKmMsSwWbBdDhHvVxXrR-') isitgood = True for i in getset: if not i in rightchars: isitgood = False if not isitgood: tkMessageBox.showerror('Try again.', 'Annotation file contains invalid characters.\ Check genbank/EMBL contains no lines starting with > or that\ fasta file contains only valid nucleotides') return 0 if '/' in out: outfile.write('>' + out.split('/')[1] + '\n') else: outfile.write('>' + out + '\n') if maxcut == 'Max': maxcut = len(seq) if mincut == 1 and maxcut == len(seq): if getmultifa: seq = seq.replace('qqq', 'n' * (len(seq) // 500)) outfile.write(seq) elif mincut < maxcut: seq = seq[mincut-1:maxcut] if getmultifa: seq = seq.replace('qqq', 'n' * (len(seq) // 500)) outfile.write(seq) else: seq = seq[mincut-1:] + seq[:maxcut] if getmultifa: seq = seq.replace('qqq', 'n' * (len(seq) // 500)) outfile.write(seq) if len(seq) == 0: tkMessageBox.showerror('Try again.', 'There is no sequence in ' + genbank + '.') return 0 else: return 1 except: tkMessageBox.showerror('Try again.', genbank + ' does not exist.') return 0 def genBlast(self): try: if self.thegenblast.is_alive(): tkMessageBox.showerror('Please wait', 'BLAST already running.') return None except: pass try: if self.thethread.is_alive(): tkMessageBox.showerror('Please wait', 'easyfig creating figure.') return None except: pass try: if self.thedlblast.is_alive(): tkMessageBox.showerror('Please wait', 'Blast is downloading.') return None except: pass self.processLab.config(text='Performing blastn...') self.workingDir = tkFileDialog.askdirectory(title='Please select a working directory.') if self.workingDir == (): self.processLab.config(text='Performing blastn...\nCancelled.') return None os.chdir(self.workingDir) index = 0 if self.genlist.size() < 2: tkMessageBox.showerror('Try again.', 'easyfig needs at least 2 genbank files to create blast files.') self.processLab.config(text='Performing blastn...\nCancelled.') return None else: thegenlist = self.genlist.get(0, END) for i in thegenlist: index += 1 temp = self.gbk2fasta(i[4:], str(index) + '.easyfig.fa', self.mincutlist[i[:2]], self.maxcutlist[i[:2]]) if temp == 0: return None self.cutstate = (str(self.mincutlist), str(self.maxcutlist)) self.orderstate = self.genlist.get(0, END) if self.blastnDir == None: pass elif self.blastnDir[-11:] == 'tblastx.exe': if os.path.exists(self.blastnDir[:-11] + 'blastn.exe'): self.blastnDir = self.blastnDir[:-11] + 'blastn.exe' else: self.blastnDir = None elif self.blastnDir[-7:] == 'tblastx': if os.path.exists(self.blastnDir[:-7] + 'blastn'): self.blastnDir = self.blastnDir[:-7] + 'blastn' else: self.blastnDir = None if self.dbnDir != None: if not os.path.exists(self.dbnDir): self.dbnDir = None if self.blastnDir != None: if not os.path.exists(self.blastnDir): self.blastnDir = None if self.dbnDir != None: pass elif isNewBlastDB(): self.dbnDir = 'makeblastdb' elif isLegBlastDB(): self.dblDir = 'formatdb' elif os.path.exists('~/bin/makeblastdb'): self.dbnDir = '~/bin/makeblastdb' elif os.path.exists('/usr/local/ncbi/bin/makeblastdb'): self.blastnDir = '/usr/local/ncbi/bin/makeblastdb' elif os.path.exists('/usr/local/bin/makeblastdb'): self.dbnDir = '/usr/local/bin/makeblastdb' elif os.path.exists(self.pwd + '/makeblastdb'): self.dbnDir = self.pwd + '/makeblastdb' elif os.path.exists('/usr/local/ncbi/blast/bin/makeblastdb'): self.dbnDir = '/usr/local/ncbi/blast/bin/makeblastdb' elif os.path.exists('/usr/local/bin/formatdb'): self.dblDir = '/usr/local/bin/formatdb' elif os.path.exists('~/bin/formatdb'): self.dblDir = '~/bin/formatdb' elif os.path.exists(self.pwd + '/formatdb'): self.dblDir = self.pwd + '/formatdb' elif os.path.exists(self.pwd + '/makeblastdb.exe'): self.dbnDir = self.pwd + '/makeblastdb.exe' elif os.path.exists(self.pwd + '/formatdb.exe'): self.dblDir = self.pwd + '/formatdb.exe' else: folderlist = [] for letter in string.uppercase: if os.path.exists(letter + ':/program files/ncbi/'): folders = os.listdir(letter + ':/program files/ncbi/') for f in folders: if f.upper().startswith('BLAST'): folderlist.append(letter + ':/program files/ncbi/' + f) folderlist.sort(reverse=True) blastgot = False if len(folderlist) > 0: for f in folderlist: if not blastgot and os.path.exists(f + '/bin/makeblastdb.exe'): blastgot = True self.dblDir = '"' + f + '/bin/makeblastdb"' if self.blastnDir != None: pass elif isNewBlastn(): self.blastnDir = 'blastn' elif isLegBlastall(): self.blastlDir = 'blastall' elif os.path.exists('~/bin/blastn'): self.blastnDir = '~/bin/blastn' elif os.path.exists('/usr/local/ncbi/bin/blastn'): self.blastnDir = '/usr/local/ncbi/bin/blastn' elif os.path.exists('/usr/local/bin/blastn'): self.blastnDir = '/usr/local/bin/blastn' elif os.path.exists(self.pwd + '/blastn'): self.blastnDir = self.pwd + '/blastn' elif os.path.exists('/usr/local/ncbi/blast/bin/blastn'): self.blastnDir = '/usr/local/ncbi/blast/bin/blastn' elif os.path.exists('/usr/local/bin/blastall'): self.blastlDir = '/usr/local/bin/blastall' elif os.path.exists('~/bin/blastall'): self.blastlDir = '~/bin/blastall' elif os.path.exists(self.pwd + '/blastall'): self.blastlDir = self.pwd + '/blastall' elif os.path.exists(self.pwd + '/blastall.exe'): self.blastlDir = self.pwd + '/blastall.exe' elif os.path.exists(self.pwd + '/blastn.exe'): self.blastnDir = self.pwd + '/blastn.exe' else: folderlist = [] for letter in string.uppercase: if os.path.exists(letter + ':/program files/ncbi/'): folders = os.listdir(letter + ':/program files/ncbi/') for f in folders: if f.upper().startswith('BLAST'): folderlist.append(letter + ':/program files/ncbi/' + f) folderlist.sort(reverse=True) blastgot = False if len(folderlist) > 0: for f in folderlist: if not blastgot and os.path.exists(f + '/bin/blastn.exe'): blastgot = True self.blastnDir = '"' + f + '/bin/blastn"' if self.blastnDir == None and self.blastlDir == None or self.dbnDir == None and self.dblDir == None: dlblast = tkMessageBox.askquestion('Blast not found', 'Do you wish to download Blast?') if dlblast != 'no': self.thedlblast = threading.Thread(target=self.downloadBlast) self.thedlblast.start() return None tempdir = tkFileDialog.askdirectory(title='Please select a directory with blastn and makeblastdb.') if tempdir == (): tempdir = '' if os.path.exists(tempdir + '/blastn.exe') and os.path.exists(tempdir + '/makeblastdb.exe'): self.blastnDir = tempdir + '/blastn.exe' self.dbnDir = tempdir + '/makeblastdb.exe' elif os.path.exists(tempdir + '/blastn') and os.path.exists(tempdir + '/makeblastdb'): self.blastnDir = tempdir + '/blastn' self.dbnDir = tempdir + '/makeblastdb' else: self.processLab.config(text='Performing blastn...\nInvadild directory.\nBlast not found.') self.blastnDir = None self.dbnDir = None return None if self.workingDir == '': self.processLab.config(text='Performing blastn...\nCancelled.') return None self.thegenblast = threading.Thread(target=self.genBlast2) self.thegenblast.start() self.thegenblast2 = threading.Thread(target=self.genBlastDot) self.thegenblast2.start() def genBlastDot(self): while self.thegenblast.is_alive(): time.sleep(0.5) self.processLab.config(text='Performing blastn.') time.sleep(0.5) self.processLab.config(text='Performing blastn..') time.sleep(0.5) self.processLab.config(text='Performing blastn...') if self.blastlist.size() == self.genlist.size() - 1: self.processLab.config(text='Performing blastn...\ncomplete.') else: self.processLab.config(text='Blast has failed, please check genbank files and rerun.') def genBlast2(self): self.blastlist.delete(0, END) the_tempdb_dir = os.path.abspath('.') + '/tempdb' for i in range(self.genlist.size() - 1): if self.dbnDir != None: subprocess.Popen(self.dbnDir + ' -dbtype nucl -out ' + the_tempdb_dir + ' -in ' + str(i + 2) + '.easyfig.fa', shell=True, env={"BLASTDB_LMDB_MAP_SIZE":"1000000"}).wait() elif self.dblDir != None: subprocess.Popen(self.dblDir + ' -p F -t tempdb -n tempdb -i ' + str(i + 2) + '.easyfig.fa', shell=True).wait() if self.blastnDir: subprocess.Popen(self.blastnDir + ' -task blastn -db ' + the_tempdb_dir + ' -outfmt 6 -query ' + str(i+1) + '.easyfig.fa -out ' + str(i + 1) + str(i+2) + '.easyfig.out', shell=True).wait() elif self.blastlDir: subprocess.Popen(self.blastlDir + ' -p blastn -d ' + the_tempdb_dir + ' -F F -m 8 -a 8 -i ' + str(i + 1) + '.easyfig.fa -o ' + str(i+1) + str(i+2) + '.easyfig.out', shell=True).wait() self.blastlist.insert(END, self.workingDir + '/' + str(i + 1) + str(i+2) + '.easyfig.out') self.blastlist.xview_moveto(1) if os.path.exists('tempdb.nhr'): os.remove('tempdb.nhr') if os.path.exists('tempdb.nin'): os.remove('tempdb.nin') if os.path.exists('error.log'): os.remove('error.log') if os.path.exists('tempdb.nsq'): os.remove('tempdb.nsq') if os.path.exists('formatdb.log'): os.remove('formatdb.log') os.chdir(self.pwd) def genBlastX(self): try: if self.thegenblast.is_alive(): tkMessageBox.showerror('Please wait', 'BLAST already running.') return None except: pass try: if self.thethread.is_alive(): tkMessageBox.showerror('Please wait', 'easyfig creating figure.') return None except: pass try: if self.thedlblast.is_alive(): tkMessageBox.showerror('Please wait', 'Blast is downloading.') return None except: pass self.workingDir = tkFileDialog.askdirectory(title='Please select a working directory.') if self.workingDir == (): self.processLab.config(text='Performing tblastx...\nCancelled.') return os.chdir(self.workingDir) index = 0 if self.genlist.size() < 2: tkMessageBox.showerror('Try again.', 'easyfig needs at least 2 genbank files to create blast files.') else: thegenlist = self.genlist.get(0, END) for i in thegenlist: index += 1 temp = self.gbk2fasta(i[4:], str(index) + '.easyfig.fa', self.mincutlist[i[:2]], self.maxcutlist[i[:2]]) if temp == 0: return None self.cutstate = (str(self.mincutlist), str(self.maxcutlist)) self.orderstate = self.genlist.get(0, END) if self.blastnDir == None: pass elif self.blastnDir[-10:] == 'blastn.exe': if os.path.exists(self.blastnDir[:-10] + 'tblastx.exe'): self.blastnDir = self.blastnDir[:-10] + 'tblastx.exe' else: self.blastnDir = None elif self.blastnDir[-6:] == 'blastn': if os.path.exists(self.blastnDir[:-6] + 'tblastx'): self.blastnDir = self.blastnDir[:-6] + 'tblastx' else: self.blastnDir = None if self.dbnDir != None: if not os.path.exists(self.dbnDir): self.dbnDir = None if self.blastnDir != None: if not os.path.exists(self.blastnDir): self.blastnDir = None if self.dbnDir != None: pass elif isNewBlastDB(): self.dbnDir = 'makeblastdb' elif isLegBlastDB(): self.dblDir = 'formatdb' elif os.path.exists('~/bin/makeblastdb'): self.dbnDir = '~/bin/makeblastdb' elif os.path.exists('/usr/local/bin/makeblastdb'): self.dbnDir = '/usr/local/bin/makeblastdb' elif os.path.exists('./makeblastdb'): self.dbnDir = './makeblastdb' elif os.path.exists('/usr/local/ncbi/bin/makeblastdb'): self.blastnDir = '/usr/local/ncbi/bin/makeblastdb' elif os.path.exists('/usr/local/ncbi/blast/bin/makeblastdb'): self.dbnDir = '/usr/local/ncbi/blast/bin/makeblastdb' elif os.path.exists('/usr/local/bin/formatdb'): self.dblDir = '/usr/local/bin/formatdb' elif os.path.exists('~/bin/formatdb'): self.dblDir = '~/bin/formatdb' elif os.path.exists('./formatdb'): self.dblDir = './formatdb' elif os.path.exists('./makeblastdb.exe'): self.dbnDir = './makeblastdb.exe' elif os.path.exists('./formatdb.exe'): self.dblDir = './formatdb.exe' else: folderlist = [] for letter in string.uppercase: if os.path.exists(letter + ':/program files/ncbi/'): folders = os.listdir(letter + ':/program files/ncbi/') for f in folders: if f.upper().startswith('BLAST'): folderlist.append(letter + ':/program files/ncbi/' + f) folderlist.sort(reverse=True) blastgot = False if len(folderlist) > 0: for f in folderlist: if not blastgot and os.path.exists(f + '/bin/makeblastdb.exe'): blastgot = True self.dblDir = '"' + f + '/bin/makeblastdb"' if self.blastnDir != None: pass elif isNewTblastx(): self.blastnDir = 'tblastx' elif isLegBlastall(): self.blastlDir = 'blastall' elif os.path.exists('~/bin/tblastx'): self.blastnDir = '~/bin/tblastx' elif os.path.exists('/usr/local/ncbi/bin/tblastx'): self.blastnDir = '/usr/local/ncbi/bin/tblastx' elif os.path.exists('/usr/local/bin/tblastx'): self.blastnDir = '/usr/local/bin/tblastx' elif os.path.exists('./tblastx'): self.blastnDir = './tblastx' elif os.path.exists('/usr/local/ncbi/blast/bin/tblastx'): self.blastnDir = '/usr/local/ncbi/blast/bin/tblastx' elif os.path.exists('/usr/local/bin/blastall'): self.blastlDir = '/usr/local/bin/blastall' elif os.path.exists('~/bin/blastall'): self.blastlDir = '~/bin/blastall' elif os.path.exists('./blastall'): self.blastlDir = './blastall' elif os.path.exists('./tblastx.exe'): self.blastnDir = './tblastx.exe' else: folderlist = [] for letter in string.uppercase: if os.path.exists(letter + ':/program files/ncbi/'): folders = os.listdir(letter + ':/program files/ncbi/') for f in folders: if f.upper().startswith('BLAST'): folderlist.append(letter + ':/program files/ncbi/' + f) folderlist.sort(reverse=True) blastgot = False if len(folderlist) > 0: for f in folderlist: if not blastgot and os.path.exists(f + '/bin/tblastx.exe'): blastgot = True self.blastnDir = '"' + f + '/bin/tblastx.exe"' if self.blastnDir == None and self.blastlDir == None or self.dbnDir == None and self.dbl == None: dlblast = tkMessageBox.askquestion('Blast not found', 'Do you wish to download Blast?') if dlblast: self.thedlblast = threading.Thread(target=self.downloadBlast) self.thedlblast.start() return None tempdir = tkFileDialog.askdirectory(title='Please select a directory with tblastx and makeblastdb.') if os.path.exists(tempdir + '/tblastx.exe') and os.path.exists(tempdir + '/makeblastdb.exe'): self.blastnDir = tempdir + '/tblastx.exe' self.dbnDir = tempdir + '/makeblastdb.exe' elif os.path.exists(tempdir + '/tblastx') and os.path.exists(tempdir + '/makeblastdb'): self.blastnDir = tempdir + '/tblastx' self.dbnDir = tempdir + '/makeblastdb' else: self.processLab.config(text='Performing blastn...\nInvadild directory.\nBlast not found.') return None if self.workingDir == '': self.processLab.config(text='Performing blastn...\nCancelled.') return None self.thegenblast = threading.Thread(target=self.genBlastX2) self.thegenblast.start() self.thegenblast2 = threading.Thread(target=self.genBlastXdot) self.thegenblast2.start() def genBlastXdot(self): while self.thegenblast.is_alive(): time.sleep(0.5) self.processLab.config(text='Performing tblastx.') time.sleep(0.5) self.processLab.config(text='Performing tblastx..') time.sleep(0.5) self.processLab.config(text='Performing tblastx...') self.processLab.config(text='Performing tblastx...\ncomplete.') def genBlastX2(self): self.blastlist.delete(0, END) for i in range(self.genlist.size() - 1): if self.dbnDir != None: subprocess.Popen(self.dbnDir + ' -dbtype nucl -out tempdb -in ' + str(i + 2) + '.easyfig.fa', shell=True).wait() elif self.dblDir != None: subprocess.Popen(self.dblDir + ' -p F -t tempdb -n tempdb -i ' + str(i + 2) + '.easyfig.fa', shell=True).wait() if self.blastnDir: subprocess.Popen(self.blastnDir + ' -db tempdb -outfmt 6 -query ' + str(i+1) + '.easyfig.fa -out ' + str(i + 1) + str(i+2) + '.easyfig.out', shell=True).wait() elif self.blastlDir: subprocess.Popen(self.blastlDir + ' -p tblastx -d tempdb -F F -m 8 -a 8 -i ' + str(i + 1) + '.easyfig.fa -o ' + str(i+1) + str(i+2) + '.easyfig.out', shell=True).wait() self.blastlist.insert(END, self.workingDir + '/' + str(i + 1) + str(i+2) + '.easyfig.out') self.blastlist.xview_moveto(1) if os.path.exists('tempdb.nhr'): os.remove('tempdb.nhr') if os.path.exists('tempdb.nin'): os.remove('tempdb.nin') if os.path.exists('error.log'): os.remove('error.log') if os.path.exists('tempdb.nsq'): os.remove('tempdb.nsq') if os.path.exists('formatdb.log'): os.remove('formatdb.log') os.chdir(self.pwd) def annmod(self, event=None): try: self.annwindow.destroy() except: pass self.annwindow = Toplevel() self.frame6 = Frame(self.annwindow) self.annwindow.title('Subregions') self.frangelab = Label(self.frame6, text='Range', font='Helvetica 13 bold') self.frangelab.grid(row=0, column=2, columnspan=3) self.ffilelab = Label(self.frame6, text='Ann. file', font='Helvetica 13 bold') self.ffilelab.grid(row=1, column=1, pady=10) self.fminlab = Label(self.frame6, text='Min', font='Helvetica 13 bold') self.fminlab.grid(row=1, column=2, pady=10) self.fdotdot = Label(self.frame6, text=' .. ') self.fdotdot.grid(row=1, column=3) self.fmaxlab = Label(self.frame6, text='Max', font='Helvetica 13 bold') self.fmaxlab.grid(row=1, column=4, pady=10) self.frevlab = Label(self.frame6, text='Reverse', font='Helvetica 13 bold') self.frevlab.grid(row=1, column=5, pady=10) self.scrollbar2 = Scrollbar(self.frame6, orient=VERTICAL) self.fgenlist = Listbox(self.frame6, yscrollcommand=self.scrollbar2.set, exportselection=0) self.fgenlist.bind('', self.setselectedcuts) self.fgenlist.bind('', self.doublecuts) self.fgenlist.bind('', self.onmousewheel) self.fgenlist.bind('', self.onmousewheel) self.fgenlist.bind('', self.onmousewheel) self.fgenlist.grid(row=2, column=1) self.fgenminlist = Listbox(self.frame6, yscrollcommand=self.scrollbar2.set, exportselection=0) self.fgenminlist.config(width=7) self.fgenminlist.bind('', self.setselectedcuts) self.fgenminlist.bind('', self.doublecuts) self.fgenminlist.bind('', self.onmousewheel) self.fgenminlist.bind('', self.onmousewheel) self.fgenminlist.bind('', self.onmousewheel) self.fgenminlist.grid(row=2, column=2) self.fgenmaxlist = Listbox(self.frame6, yscrollcommand=self.scrollbar2.set, exportselection=0) self.fgenmaxlist.config(width=7) self.fgenmaxlist.bind('', self.setselectedcuts) self.fgenmaxlist.bind('', self.doublecuts) self.fgenmaxlist.bind('', self.onmousewheel) self.fgenmaxlist.bind('', self.onmousewheel) self.fgenmaxlist.bind('', self.onmousewheel) self.fgenmaxlist.grid(row=2, column=4) self.fgenrevlist = Listbox(self.frame6, yscrollcommand=self.scrollbar2.set, exportselection=0) self.fgenrevlist.config(width=5) self.fgenrevlist.bind('', self.setselectedcuts) self.fgenrevlist.bind('', self.doublecuts) self.fgenrevlist.bind('', self.onmousewheel) self.fgenrevlist.bind('', self.onmousewheel) self.fgenrevlist.bind('', self.onmousewheel) self.fgenrevlist.grid(row=2, column=5) self.scrollbar2.config(command=self.yview2) self.scrollbar2.grid(row=2, column=0, sticky=NS) annlist = self.genlist.get(0, END) annlistpostemp = self.genlist.curselection() for i in annlist: self.fgenlist.insert(END, i) self.fgenminlist.insert(END, self.mincutlist[i[:2]]) self.fgenmaxlist.insert(END, self.maxcutlist[i[:2]]) if self.revlist[i[:2]]: self.fgenrevlist.insert(END, 'yes') else: self.fgenrevlist.insert(END, 'no') self.fgenlist.xview_moveto(1) self.genmincut = StringVar() self.genmaxcut = StringVar() self.genrev = IntVar() self.mincutentry = Entry(self.frame6, textvariable=self.genmincut) self.mincutentry.config(width=7) self.mincutentry.grid(row=3, column=2) self.maxcutentry = Entry(self.frame6, textvariable=self.genmaxcut) self.maxcutentry.config(width=7) self.maxcutentry.grid(row=3, column=4) self.genrentry = Checkbutton(self.frame6, variable=self.genrev) self.genrentry.grid(row=3, column=5) if len(annlist) > 0 and annlistpostemp != (): self.fgenlist.selection_set(annlistpostemp) self.fgenminlist.selection_set(annlistpostemp) self.fgenmaxlist.selection_set(annlistpostemp) self.fgenrevlist.selection_set(annlistpostemp) self.fgenlist.see(annlistpostemp) self.fgenminlist.see(annlistpostemp) self.fgenmaxlist.see(annlistpostemp) self.fgenrevlist.see(annlistpostemp) self.genmincut.set(self.fgenminlist.get(annlistpostemp)) self.genmaxcut.set(self.fgenmaxlist.get(annlistpostemp)) if self.fgenrevlist.get(annlistpostemp) == 'yes': self.genrev.set(1) else: self.genrev.set(0) self.changecutsbutton = Button(self.frame6, text=' change cutoffs ', command=self.changecuts) self.changecutsbutton.grid(row=3, column=1, pady=10) self.annwindowclosebutton = Button(self.frame6, text='close', command=self.annwindowclose) self.annwindowclosebutton.grid(row=12, column=4, columnspan=2, sticky=E, pady=10) self.annwindow.geometry('+30+40') self.frame6.grid(padx=30, pady=10) def changecuts(self): thepost = self.fgenlist.curselection() if thepost == (): tkMessageBox.showerror('Try again.', 'Please select genome to change.') return else: thepost = int(thepost[0]) self.fgenminlist.delete(thepost) self.fgenminlist.insert(thepost, self.genmincut.get()) self.mincutlist[self.fgenlist.get(thepost)[:2]] = self.genmincut.get() self.fgenmaxlist.delete(thepost) self.fgenmaxlist.insert(thepost, self.genmaxcut.get()) self.maxcutlist[self.fgenlist.get(thepost)[:2]] = self.genmaxcut.get() self.fgenrevlist.delete(thepost) if self.genrev.get() == 1: self.fgenrevlist.insert(thepost, 'yes') self.revlist[self.fgenlist.get(thepost)[:2]] = True else: self.fgenrevlist.insert(thepost, 'no') self.revlist[self.fgenlist.get(thepost)[:2]] = False if not thepost == self.fgenlist.size() - 1: self.fgenlist.selection_clear(0, END) self.fgenlist.selection_set(thepost + 1, thepost + 1) self.fgenlist.see(thepost + 1) self.fgenminlist.selection_clear(0, END) self.fgenminlist.selection_set(thepost + 1, thepost + 1) self.fgenminlist.see(thepost + 1) self.fgenmaxlist.selection_clear(0, END) self.fgenmaxlist.selection_set(thepost + 1, thepost + 1) self.fgenmaxlist.see(thepost+1) self.fgenrevlist.selection_clear(0, END) self.fgenrevlist.selection_set(thepost + 1, thepost + 1) self.fgenrevlist.see(thepost + 1) def yview2(self, *args): apply(self.fgenlist.yview, args) apply(self.fgenminlist.yview, args) apply(self.fgenmaxlist.yview, args) apply(self.fgenrevlist.yview, args) def onmousewheel(self, event): return "break" def setselectedcuts(self, event): selected = self.fgenlist.nearest(event.y) tempypos = self.fgenlist.yview()[0] self.fgenminlist.yview_moveto(tempypos) self.fgenmaxlist.yview_moveto(tempypos) self.fgenrevlist.yview_moveto(tempypos) self.fgenlist.selection_clear(0, END) self.fgenlist.selection_set(selected, selected) self.fgenminlist.selection_clear(0, END) self.fgenminlist.selection_set(selected, selected) self.fgenmaxlist.selection_clear(0, END) self.fgenmaxlist.selection_set(selected, selected) self.fgenrevlist.selection_clear(0, END) self.fgenrevlist.selection_set(selected, selected) self.genmincut.set(self.fgenminlist.get(selected)) self.genmaxcut.set(self.fgenmaxlist.get(selected)) if self.fgenrevlist.get(selected) == 'yes': self.genrev.set(1) else: self.genrev.set(0) def doublecuts(self, event): try: self.doublecutswin.destroy() except: pass self.doublecutsel = self.fgenlist.nearest(event.y) self.doublecutswin = Toplevel(self.frame6) self.doublecutswin.title('Change subregion') self.frame10 = Frame(self.doublecutswin) self.dublabel1 = Label(self.frame10, text='Modify file ' + self.fgenlist.get(self.doublecutsel)[:3], font='Helvetica 13 bold') self.dublabel1.grid(row=0, column=0, pady=5) self.dublabel2 = Label(self.frame10, text='Min Cutoff:') self.dublabel2.grid(row=1, column=0) self.dublabel3 = Label(self.frame10, text='Max Cutoff:') self.dublabel3.grid(row=2, column=0) self.dublabel4 = Label(self.frame10, text='Reverse:') self.dublabel4.grid(row=3, column=0) self.dublabel2str = StringVar(value=self.fgenminlist.get(self.doublecutsel)) self.dublabel3str = StringVar(value=self.fgenmaxlist.get(self.doublecutsel)) if self.fgenrevlist.get(self.doublecutsel) == 'yes': self.dublabel4int = IntVar(value=1) else: self.dublabel4int = IntVar(value=0) self.dublabel2ent = Entry(self.frame10, textvariable=self.dublabel2str) self.dublabel2ent.grid(row=1, column=1) self.dublabel3ent = Entry(self.frame10, textvariable=self.dublabel3str) self.dublabel3ent.grid(row=2, column=1) self.dublabel4ent = Checkbutton(self.frame10, variable=self.dublabel4int) self.dublabel4ent.grid(row=3, column=1) self.doublecutsclosebut = Button(self.frame10, text='Save & Close', command=self.doublecutsclose) self.doublecutsclosebut.grid(row=4, column=1, sticky=E) self.doublecutswin.geometry('+40+50') self.frame10.grid(padx=20, pady=20) def doublecutsclose(self): self.fgenminlist.delete(self.doublecutsel) self.fgenminlist.insert(self.doublecutsel, self.dublabel2str.get()) self.mincutlist[self.fgenlist.get(self.doublecutsel)[:2]] = self.dublabel2str.get() self.fgenmaxlist.delete(self.doublecutsel) self.fgenmaxlist.insert(self.doublecutsel, self.dublabel3str.get()) self.maxcutlist[self.fgenlist.get(self.doublecutsel)[:2]] = self.dublabel3str.get() self.fgenrevlist.delete(self.doublecutsel) if self.dublabel4int.get() == 1: self.fgenrevlist.insert(self.doublecutsel, 'yes') self.revlist[self.fgenlist.get(self.doublecutsel)[:2]] = True else: self.fgenrevlist.insert(self.doublecutsel, 'no') self.revlist[self.fgenlist.get(self.doublecutsel)[:2]] = False self.doublecutswin.destroy() def annwindowclose(self): self.annwindow.destroy() def openFile1(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen1.set(filename) def openFile2(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen2.set(filename) def openFile3(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen3.set(filename) def openFile4(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen4.set(filename) def openFile5(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen5.set(filename) def openFile6(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen6.set(filename) def openFile7(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen7.set(filename) def openFile8(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen8.set(filename) def openFile9(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen9.set(filename) def openFile0(self): filename = tkFileDialog.askopenfilename(filetypes = [('genbank/embl/fasta', ('*.gbk', '*.embl', '*.gb', '*.fa', '*.fna', '*.dna', '*.fas', '*.fasta')), ('All files','*')]) self.gen0.set(filename) def openBlast1(self): filename = tkFileDialog.askopenfilename() self.blast1.set(filename) def openBlast2(self): filename = tkFileDialog.askopenfilename() self.blast2.set(filename) def openBlast3(self): filename = tkFileDialog.askopenfilename() self.blast3.set(filename) def openBlast4(self): filename = tkFileDialog.askopenfilename() self.blast4.set(filename) def openBlast5(self): filename = tkFileDialog.askopenfilename() self.blast5.set(filename) def openBlast6(self): filename = tkFileDialog.askopenfilename() self.blast6.set(filename) def openBlast7(self): filename = tkFileDialog.askopenfilename() self.blast7.set(filename) def openBlast8(self): filename = tkFileDialog.askopenfilename() self.blast8.set(filename) def openBlast9(self): filename = tkFileDialog.askopenfilename() self.blast9.set(filename) def getoutfile(self): if self.filetype.get() == 'Bitmap (bmp)': filename = tkFileDialog.asksaveasfilename(filetypes = [('bmp', '*.bmp'), ('All files','*')]) else: filename = tkFileDialog.asksaveasfilename(filetypes = [('svg', '*.svg'), ('All files','*')]) self.outfile.set(filename) def handleDownload(self, block): self.downloadFile.write(block) if self.thecount * 100 / self.totalBytes != (self.thecount + len(block)) * 100 / self.totalBytes: try: self.processLab.config(text='Finding Blast... Done\nDownloading... ' + str((self.thecount + len(block)) * 100 // self.totalBytes) + '%') except: pass self.thecount += len(block) def downloadBlastAuto(self): self.thedlblast = threading.Thread(target=self.downloadBlast) self.thedlblast.start() def downloadBlastMan(self): theplatform = platform.system() architecture = platform.architecture()[0] if theplatform == 'Linux' and architecture == '32bit': ok = tkMessageBox.askokcancel('Downloading Blast Manually', 'Easyfig suggests downloading\nand extracting\nncbi-blast-x.x.x+-ia32-linux.tar.gz\n\ clicking ok will bring up\nthe download location\nin your browser.') if ok: webbrowser.open_new('ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/') elif theplatform == 'Linux' and architecture == '64bit': ok = tkMessageBox.askokcancel('Downloading Blast Manually', 'Easyfig suggests downloading\nand extracting\nncbi-blast-x.x.x+-x64-linux.tar.gz\n\ clicking ok will bring up\nthe download location\nin your browser.') if ok: webbrowser.open_new('ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/') elif theplatform == 'Windows' and architecture == '32bit': ok = tkMessageBox.askokcancel('Downloading Blast Manually', 'Easyfig suggests downloading\nand running\nncbi-blast-x.x.x+-win32.exe\n\ clicking ok will bring up\nthe download location\nin your browser.') if ok: webbrowser.open_new('ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/') elif theplatform == 'Windows' and architecture == '64bit': ok = tkMessageBox.askokcancel('Downloading Blast Manually', 'Easyfig suggests downloading\nand running\nncbi-blast-x.x.x+-win64.exe\n\ clicking ok will bring up\nthe download location\nin your browser.') if ok: webbrowser.open_new('ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/') elif theplatform == 'Darwin': ok = tkMessageBox.askokcancel('Downloading Blast Manually', 'Easyfig suggests downloading\nand running\nncbi-blast-x.x.x+.dmg\n\ clicking ok will bring up\nthe download location\nin your browser.') if ok: webbrowser.open_new('ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/') else: ok = tkMessageBox.askokcancel('Downloading Blast Manually', 'Easyfig suggests downloading\nand compiling\nncbi-blast-x.x.x+.src.tar.gz\n\ clicking ok will bring up\nthe download location\nin your browser.') if ok: webbrowser.open_new('ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/') def chooseBlastDir(self): tempdir = tkFileDialog.askdirectory(title='Please select a directory with blastn and makeblastdb.') if tempdir == () or tempdir == '': return if os.path.exists(tempdir + '/blastn.exe') and os.path.exists(tempdir + '/makeblastdb.exe'): self.blastnDir = tempdir + '/blastn.exe' self.dbnDir = tempdir + '/makeblastdb.exe' elif os.path.exists(tempdir + '/blastn') and os.path.exists(tempdir + '/makeblastdb'): self.blastnDir = tempdir + '/blastn' self.dbnDir = tempdir + '/makeblastdb' else: tkMessageBox.showerror('Try again.', 'Blast not found in Directory.') self.blastnDir = None self.dbnDir = None def downloadBlast(self): theplatform = platform.system() architecture = platform.architecture()[0] self.processLab.config(text='Finding Blast...') try: ftp = FTP('ftp.ncbi.nlm.nih.gov') ftp.login() ftp.cwd('blast/executables/blast+/LATEST/') files = [] ftp.dir(files.append) except: self.processLab.config(text='Unable to Create FTP \nconnection.\nPlease dowload manually.') return filename = None try: true_platform = os.environ["PROCESSOR_ARCHITEW6432"] if true_platform == 'AMD64': architecture = '64bit' except KeyError: pass for line in files: if theplatform == 'Linux' and architecture == '32bit' and line.split()[8][-17:] == 'ia32-linux.tar.gz': filename = line.split()[8] self.totalBytes = int(line.split()[4]) elif theplatform == 'Linux' and architecture == '64bit' and line.split()[8][-16:] == 'x64-linux.tar.gz': filename = line.split()[8] self.totalBytes = int(line.split()[4]) elif theplatform == 'Windows' and architecture == '32bit' and line.split()[8][-17:] == 'ia32-win32.tar.gz': filename = line.split()[8] self.totalBytes = int(line.split()[4]) elif theplatform == 'Windows' and architecture == '64bit' and line.split()[8][-16:] == 'x64-win64.tar.gz': filename = line.split()[8] self.totalBytes = int(line.split()[4]) elif theplatform == 'Darwin' and line.split()[8][-23:] == 'universal-macosx.tar.gz': filename = line.split()[8] self.totalBytes = int(line.split()[4]) if filename == None: self.processLab.config(text='Unable to download blast.\nPlease dowload manually.') return self.thecount = 0 try: self.downloadFile = open(filename, 'wb') except: self.processLab.config(text='Unable to download blast.\nPlease dowload manually.') return ftp.retrbinary('RETR ' + filename, self.handleDownload) self.downloadFile.close() self.processLab.config(text='Downloading... Complete\nExtracting file...') try: tfile = tarfile.open(filename, 'r:gz') tfile.extractall() except: self.processLab.config(text='Unable to download blast.\nPlease dowload manually.') return filenamedir = filename.split('+')[0] + '+' if theplatform == 'Windows': try: shutil.move(filenamedir + '/bin/makeblastdb.exe', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/libgcc_s_seh-1.dll', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/libgmp-10.dll', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/libgnutls-30.dll', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/libhogweed-4-2.dll', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/libnettle-6-2.dll', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/libp11-kit-0.dll', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/msvcp120.dll', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/nghttp2.dll', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/msvcr120.dll', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/blastn.exe', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/tblastx.exe', self.pwd) except: pass else: try: shutil.move(filenamedir + '/bin/makeblastdb', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/blastn', self.pwd) except: pass try: shutil.move(filenamedir + '/bin/tblastx', self.pwd) except: pass tfile.close() shutil.rmtree(filenamedir) os.remove(filename) if os.path.exists(self.pwd + '/blastn') or os.path.exists(self.pwd + '/blastn.exe'): self.processLab.config(text='Extracting file... Done\nBLAST+ installed.') else: self.processLab.config(text='Unable to download blast.\nPlease dowload manually.') def gbk2fasta(genbank, out, mincut, maxcut): getseq = False getembl = False getmultifa = False seq = '' try: mincut = int(mincut) if mincut < 1: mincut = 1 if maxcut != 'Max': maxcut = int(maxcut) if maxcut < 1: maxcut = 1 except: sys.stderr.write('Annotation slice values not valid.\n') try: gen = open(genbank) outfile = open(out, 'w') for line in gen: if line.startswith('ORIGIN'): getseq = True elif line.startswith('SQ Sequence'): getembl = True elif line.startswith('>'): if getmultifa: seq += 'qqq' else: getmultifa = True elif line.startswith('//'): getseq = False getembl = False elif getseq: seq += ''.join(line.split()[1:]) elif getembl: seq += ''.join(line.split()[:-1]) elif getmultifa: seq += line.rstrip() if getmultifa: getset = set(seq) rightchars = set('atgcATGCqnNuUyYkKmMsSwWbBdDhHvVxXrR-') isitgood = True for i in getset: if not i in rightchars: isitgood = False if not isitgood: sys.stderr.write('Annotation file contains invalid characters. Check genbank/EMBL contains no lines starting with > or that fasta file contains only valid nucleotides\n') return 0 if '/' in out: outfile.write('>' + out.split('/')[1] + '\n') else: outfile.write('>' + out + '\n') if maxcut == 'Max': maxcut = len(seq) if mincut == 1 and maxcut == len(seq): if getmultifa: seq = seq.replace('qqq', 'n' * (len(seq) // 500)) outfile.write(seq) elif mincut < maxcut: seq = seq[mincut-1:maxcut] if getmultifa: seq = seq.replace('qqq', 'n' * (len(seq) // 500)) outfile.write(seq) else: seq = seq[mincut-1:] + seq[:maxcut] if getmultifa: seq = seq.replace('qqq', 'n' * (len(seq) // 500)) outfile.write(seq) if len(seq) == 0: sys.stderr.write('There is no sequence in ' + genbank + '.\n') return 0 else: return 1 except: sys.stderr.write(genbank + ' does not exist.\n') return 0 def getGCcontent(filename, windsize, step, mincut, maxcut): try: gen = open(filename) getseq = False getembl = False seq = '' for line in gen: if line.startswith('ORIGIN'): getseq = True elif line.startswith('SQ Sequence'): getembl = True elif line.startswith('//'): getseq = False getembl = False elif getseq: seq += ''.join(line.split()[1:]) elif getembl: seq += ''.join(line.split()[:-1]) gen.close() seq = seq.upper() except: sys.stderr.write('Annotation file ' + filename + ' not valid.\n') return None if len(seq) == 0: sys.stderr.write('Annotation file ' + filename + ' not valid.\n') return None if maxcut == 'Max': seq = seq[int(mincut)-1:] elif int(maxcut) <= int(mincut): seq = seq[int(mincut)-1:] + seq[:int(maxcut)+1] else: seq = seq[int(mincut)-1:int(maxcut)+1] window1 = int(windsize) // 2 window2 = int(windsize) - window1 thearray = [] for i in range(0, len(seq), int(step)): seqstring = seq[max([0, i-window1]):i+window2] thearray.append((seqstring.count('G') + seqstring.count('C')) * 1.0 / len(seqstring) - 0.5) return thearray def getGCskew(filename, windsize, step, mincut, maxcut): try: getseq = False getembl = False seq = '' gen = open(filename) for line in gen: if line.startswith('ORIGIN'): getseq = True elif line.startswith('SQ Sequence'): getembl = True elif line.startswith('//'): getseq = False getembl = False elif getseq: seq += ''.join(line.split()[1:]) elif getembl: seq += ''.join(line.split()[:-1]) gen.close() seq = seq.upper() except: sys.stderr.write('Annotation file ' + filename + ' not valid.\n') return None if len(seq) == 0: sys.stderr.write('Annotation file ' + filename + ' not valid.\n') return None if maxcut == 'Max': seq = seq[int(mincut)-1:] elif int(maxcut) <= int(mincut): seq = seq[int(mincut)-1:] + seq[:int(maxcut)+1] else: seq = seq[int(mincut)-1:int(maxcut)+1] window1 = int(windsize) // 2 window2 = int(windsize) - window1 thearray = [] for i in range(0, len(seq), int(step)): seqstring = seq[max([0, i-window1]):i+window2] gcount = seqstring.count('G') ccount = seqstring.count('C') try: thearray.append((gcount - ccount) * 1.0 // (gcount + ccount)) except: thearray.append(0) return thearray def getCoverage(filename, filename2, mincut, maxcut): # DEFNIITION: takes a file and reads in all contigs, their start positions and the reads located within the contig # REQUIRES: a valid ace file # RETURNS: A list of objects of class contig seq = '' getseq = False getembl = False try: gen = open(filename) for line in gen: if line.startswith('ORIGIN'): getseq = True elif line.startswith('SQ Sequence'): getembl = True elif line.startswith('//'): getseq = False getembl = False elif getseq: seq += ''.join(line.split()[1:]) elif getembl: seq += ''.join(line.split()[:-1]) gen.close() except: sys.stderr.write('Annotation file ' + filename + ' not valid.\n') return None if len(seq) == 0: sys.stderr.write('Annotation file ' + filename + ' not valid.\n') return None seq = seq.lower() if maxcut == 'Max': seq = seq[int(mincut)-1:] elif int(maxcut) <= int(mincut): seq = seq[int(mincut)-1:] + seq[:int(maxcut)+1] else: seq = seq[int(mincut)-1:int(maxcut)+1] outlist = [0 for i in range(len(seq))] readlist = [] # list of reads to be added to the contig class index = 0 # switches to 1 once program has dealt with the initial contig # iterates through the file determines what information is contained in each line then reads it to the # right locationregular expressions python transtab = string.maketrans('atgc', 'tacg') acefile = open(filename2) for line in acefile: # puts name in file and starts reading sequence below if line.startswith("CO "): if index != 0: freqDict = {} for j in readlist: for k in range(j.startpos, (j.startpos + j.readLength)): if k in freqDict: freqDict[k] += 1 else: freqDict[k] = 1 coverageList = [] for j in range(1, len(contigSeq) + 1): if contigSeq[j - 1] != '*': coverageList.append(freqDict[j]) contigSeq = contigSeq.lower() thepos = seq.find(contigSeq) if thepos != -1: outlist = outlist[:thepos] + coverageList + outlist[thepos + len(coverageList):] else: contigSeq = contigSeq[::-1] contigSeq = contigSeq.translate(transtab) thepos = seq.find(contigSeq) if thepos != -1: coverageList.reverse() outlist = outlist[:thepos] + coverageList + outlist[thepos + len(coverageList):] readlist = [] index = 1 contigSeq = '' contigName = line.split()[1] # splits the line into a list with elements seperated by whitespace characters # then returns the second element of that list (the name) readnumber = 0 # initiates the read number used to determine where the readsequence will be added # creates a object of class read with the name and location within the contig, leaves sequence as the # empty string to be read in later elif line.startswith('BQ'): index = 2 elif line.startswith("AF "): readIt = line.split() # splits the line into a list of strings seperated by whitespace characters readName = readIt[1] # the name of the read readPos = int(readIt[3]) # the position of the read within the contig readInstance = read(readName, readPos, None) # creates an instance of class read readlist.append(readInstance) # appends to list elif index == 1: contigSeq += line[:-1] elif line.startswith("QA "): readlist[readnumber].startpos = readlist[readnumber].startpos + int(line.split()[1]) - 1 readlist[readnumber].readLength = int(line.split()[2]) - int(line.split()[1]) + 1 readnumber += 1 freqDict = {} for j in readlist: for k in range(j.startpos, (j.startpos + j.readLength)): if k in freqDict: freqDict[k] += 1 else: freqDict[k] = 1 coverageList = [] for j in range(1, len(contigSeq) + 1): if contigSeq[j - 1] != '*': coverageList.append(freqDict[j]) contigSeq = contigSeq.lower() thepos = seq.find(contigSeq) if thepos != -1: outlist = outlist[:thepos] + coverageList + outlist[thepos + len(coverageList):] else: contigSeq = contigSeq[::-1] contigSeq = contigSeq.translate(transtab) thepos = seq.find(contigSeq) if thepos != -1: coverageList.reverse() outlist = outlist[:thepos] + coverageList + outlist[thepos + len(coverageList):] return outlist def getCustom(filename): try: thearray = [] gen = open(filename) templine = gen.readline().rstrip().split('\t') linelen = len(templine) for i in templine: thearray.append([float(i)]) for line in gen: templine = line.rstrip().split('\t') for i in range(len(templine)): if templine[i] != '': thearray[i].append(float(templine[i])) return thearray except: sys.stderr.write(filename + ' not valid graph file.\n') return None def genBlast(inlist, cutlist): try: os.mkdir('temp_easyfig') except: pass num = 1 outlist = [] for i in inlist: gbk2fasta(i, 'temp_easyfig/' + str(num) + '.easyfig.fa', cutlist[num-1][0], cutlist[num-1][1]) num += 1 for i in range(len(inlist) - 1): if isNewBlastDB(): subprocess.Popen('makeblastdb -dbtype nucl -out temp_easyfig/tempdb -in temp_easyfig/' + str(i + 2) + '.easyfig.fa', shell=True, env={"BLASTDB_LMDB_MAP_SIZE":"1000000"}).wait() elif isLegBlastDB(): subprocess.Popen('formatdb -p F -t tempdb -n temp_easyfig/tempdb -i temp_easyfig/' + str(i + 2) + '.easyfig.fa', shell=True).wait() else: sys.stderr.write( 'Could not find BLAST.\n') sys.exit() if isNewBlastn(): subprocess.Popen('blastn -task blastn -db temp_easyfig/tempdb -outfmt 6 -query temp_easyfig/' + str(i+1) + '.easyfig.fa -out temp_easyfig/' + str(i + 1) + str(i+2) + '.easyfig.out', shell=True).wait() elif isLegBlastall(): subprocess.Popen('blastall -p blastn -d temp_easyfig/tempdb -F F -m 8 -a 8 -i temp_easyfig/' + str(i + 1) + '.easyfig.fa -o temp_easyfig/' + str(i+1) + str(i+2) + '.easyfig.out', shell=True).wait() else: sys.stderr.write( 'Could not find BLAST.\n') sys.exit() outlist.append(inlist[i]) outlist.append('temp_easyfig/' + str(i+1) + str(i+2) + '.easyfig.out') outlist.append(inlist[-1]) return outlist def genTBlastX(inlist, cutlist): pwd = os.getcwd() if os.path.exists('temp_easyfig'): sys.stderr.write('please run from a directory without the folder temp_easyfig\n') sys.exit() os.mkdir('temp_easyfig') os.chdir('temp_easyfig') num = 1 outlist = [] for i in inlist: if i[0] in ['/', '\\', '~']: thepath = i else: thepath = '../' + i gbk2fasta(thepath, str(num) + '.easyfig.fa', cutlist[num-1][0], cutlist[num-1][1]) num += 1 for i in range(len(inlist) - 1): if isNewBlastDB(): subprocess.Popen('makeblastdb -dbtype nucl -out tempdb -in ' + str(i + 2) + '.easyfig.fa', shell=True).wait() elif isLegBlastDB(): subprocess.Popen('formatdb -p F -t tempdb -n tempdb -i ' + str(i + 2) + '.easyfig.fa', shell=True).wait() else: sys.stderr.write('Could not find BLAST.\n') sys.exit() if isNewTblastx(): subprocess.Popen('tblastx -db tempdb -outfmt 6 -query ' + str(i+1) + '.easyfig.fa -out ' + str(i + 1) + str(i+2) + '.easyfig.out', shell=True).wait() elif isLegBlastall(): subprocess.Popen('blastall -p tblastx -d tempdb -F F -m 8 -a 8 -i ' + str(i + 1) + '.easyfig.fa -o ' + str(i+1) + str(i+2) + '.easyfig.out', shell=True).wait() else: sys.stderr.write('Could not find BLAST.\n') sys.exit() outlist.append(inlist[i]) outlist.append(os.getcwd() + '/' + str(i+1) + str(i+2) + '.easyfig.out') os.chdir(pwd) outlist.append(inlist[-1]) return outlist global abortCaptain minlength = 0 mineval = 0.001 minIdent = 0 inputlist = [] width = 5000 height1 = 50 height2 = 100 minblastc = (200, 200, 200) maxblastc = (100, 100, 100) minblastci = (200, 200, 200) maxblastci = (100, 100, 100) drawfig1 = False drawfig2 = False drawfig3 = False reverseList = [] featDict = {} glt = 5 exont = 2 genet = 1 featlengths = [] aln = 'centre' graphit = None blastoutline = True minmaxlist = [] getgc = False getgcskew = False getcoverage = False getcustom = False windsize = 1000 step = 1000 graphit = None multigraph = True loggraph = False gtype = 'Histogram' axisthick = 1 pvc = (255, 0, 0) nvc = (0, 0, 255) ggap = 10 gheight = 50 blastit = True tblastit = False blastfiles = None lastflag = 1 filename = None svg = False filter = False keep_blast = False nofeat = False gmaxy = 'Auto' legend = 'None' legname = 'gene' abortCaptain = False if len(sys.argv) >= 2 and sys.argv[1] != '--help' and sys.argv[1] != '-h' and sys.argv[1] != '-help': for i in range(1,len(sys.argv)): if sys.argv[i][:1] == '-': lastflag = i + 2 if sys.argv[i] == '-o': filename = sys.argv[i+1] elif sys.argv[i] == '-e': mineval = float(sys.arg[i+1]) elif sys.argv[i] == '-min_length': minlength = int(sys.argv[i+1]) elif sys.argv[i] == '-i': minIdent = float(sys.argv[i+1]) elif sys.argv[i] == '-width': width = int(sys.argv[i+1]) elif sys.argv[i] == '-ann_height': height1 = int((sys.argv[i+1])) elif sys.argv[i] == '-blast_height': height2 = int((sys.argv[i+1])) elif sys.argv[i] == '-f1': if sys.argv[i+1] == 'T' or sys.argv[i+1] == 't' or sys.argv[i+1] == 'True' or sys.argv[i+1] == 'true': drawfig1 = True elif sys.argv[i+1] == 'F' or sys.argv[i+1] == 'f' or sys.argv[i+1] == 'False' or sys.argv[i+1] == 'false': drawfig1 = False elif sys.argv[i] == '-f2': drawfig2 = int(sys.argv[i+1]) elif sys.argv[i] == '-f3': drawfig3 = sys.argv[i+1] elif sys.argv[i] == '-blastn': blastit = True lastflag -= 1 elif sys.argv[i] == '-tblastx': tblastit = True blastit = False lastflag -= 1 elif sys.argv[i] == '-blast_files': blastit = False blastfiles = i elif sys.argv[i] == '-blast_col': if sys.argv[i+ 1].isdigit(): lastflag = i+7 t1 = int(sys.argv[i+1]) t2 = int(sys.argv[i+2]) t3 = int(sys.argv[i+3]) t4 = int(sys.argv[i+4]) t5 = int(sys.argv[i+5]) t6 = int(sys.argv[i+6]) else: if sys.argv[i+1] == 'blue': t1, t2, t3, t4, t5, t6 = 30, 144, 255, 25, 25, 112 elif sys.argv[i+1] == 'red': t1, t2, t3, t4, t5, t6 = 200, 100, 0, 255, 0, 0 minblastc = (t1, t2, t3) maxblastc = (t4, t5, t6) elif sys.argv[i] == '-blast_col_inv': if sys.argv[i+ 1].isdigit(): lastflag = i+7 t1 = int(sys.argv[i+1]) t2 = int(sys.argv[i+2]) t3 = int(sys.argv[i+3]) t4 = int(sys.argv[i+4]) t5 = int(sys.argv[i+5]) t6 = int(sys.argv[i+6]) else: if sys.argv[i+1] == 'blue': t1, t2, t3, t4, t5, t6 = 30, 144, 255, 25, 25, 112 elif sys.argv[i+1] == 'red': t1, t2, t3, t4, t5, t6 = 200, 100, 0, 255, 0, 0 minblastci = (t1, t2, t3) maxblastci = (t4, t5, t6) elif sys.argv[i] == '-f': r, g, b = 64, 224, 208 arrow = 'arrow' feat = sys.argv[i+1] if feat == 'F': nofeat = True if len(sys.argv) > i + 2 and sys.argv[i+2].isdigit(): r = int(sys.argv[i+2]) g = int(sys.argv[i+3]) b = int(sys.argv[i+4]) if len(sys.argv) > i + 5 and (sys.argv[i+5] == 'arrow' or sys.argv[i+5] == 'rect' \ or sys.argv[i+5] =='frame' or sys.argv[i+5] == 'pointer'): arrow = sys.argv[i+5] lastflag = i + 6 else: lastflag = i + 5 if len(sys.argv) > i + 2 and (sys.argv[i+2] == 'arrow' or sys.argv[i+2] == 'rect' \ or sys.argv[i+2] =='frame' or sys.argv[i+2] == 'pointer'): arrow = sys.argv[i+2] lastflag = i + 3 featDict[feat] = (arrow, (r, g, b)) elif sys.argv[i] == '-glt': glt = int(sys.argv[i+1]) elif sys.argv[i] == '-exont': exont = int(sys.argv[i+1]) elif sys.argv[i] == genet: genet = int(sys.argv[i+1]) elif sys.argv[i] == '-aln': aln = sys.argv[i+1] if aln == 'best': aln = 'best blast' elif sys.argv[i] == '-bo': if sys.argv[i+1] == 'T' or sys.argv[i+1] == 't' or sys.argv[i+1] == 'True' or sys.argv[i+1] == 'true': blastoutline = True else: blastoutline = False elif sys.argv[i] == '-G': if sys.argv[i+1] == 'GCContent': getgc = True elif sys.argv[i+1] == 'GCSkew': getgcskew = True elif sys.argv[i+1] == 'Coverage': getcoverage = True gfilename = sys.arv[i+2] lastflag += 1 elif sys.argv[i+1] == 'Custom': getcustom = True gfilename = sys.argv[i+2] lastflag += 1 else: sys.stderr.write(sys.argv[i+1] + ' not a valid graph type\n') elif sys.argv[i] == '-wind_size': windsize = int(sys.argv[i+1]) elif sys.argv[i] == '-step': step = int(sys.argv[i+1]) elif sys.argv[i] == '-line': if sys.argv[i+1] == 'T' or sys.argv[i+1] == 't' or sys.argv[i+1] == 'True' or sys.argv[i+1] == 'true': gtype = 'Line' elif sys.argv[i] == '-axis_t': axisthick = sys.argv[i+1] elif sys.argv[i] == '-pos_col': lastflag = i + 4 r = int(sys.argv[i+1]) g = int(sys.argv[i+2]) b = int(sys.argv[i+3]) pvc = (r, g, b) elif sys.argv[i] == '-neg_col': lastflag = i + 4 r = int(sys.argv[i+1]) g = int(sys.argv[i+2]) b = int(sys.argv[i+3]) nvc = (r, g, b) elif sys.argv[i] == '-g_height': gheight = int(sys.argv[i+1]) elif sys.argv[i] == '-gap': ggap = int(sys.argv[i+1]) elif sys.argv[i] == '-y_max': gmaxy = int(sys.argv[i+1]) elif sys.argv[i] == '-A': if sys.argv[i+1] == 'T' or sys.argv[i+1] == 't' or sys.argv[i+1] == 'True' or sys.argv[i+1] == 'true': auto = True else: auto = False elif sys.argv[i] == '-svg': svg = True lastflag -= 1 elif sys.argv[i] == '-keep': keep_blast = True lastflag -= 1 elif sys.argv[i] == '-filter': filter = True lastflag -= 1 elif sys.argv[i] == '-legend': if sys.argv[i+1] == 'single': legend = 'Single column' elif sys.argv[i+1] == 'double': legend = 'Two columns' elif sys.argv[i+1] == 'top': legend = 'Top' elif sys.argv[i+1] == 'bottom': legend = 'Bottom' elif sys.argv[i+1] == 'both': legend = 'Top & Bottom' else: sys.stderr.write('Legend options are (case sensitive), using None.\n') elif sys.argv[i] == '-leg_name': legname = sys.argv[i+1] inlist = sys.argv[lastflag+1:] if blastfiles != None and lastflag == blastfiles + 2: allthestuff = sys.argv[blastfiles+1:] allthestuff2 = [] for i in allthestuff: if i != 'R' and i != 'Max' and not i.isdigit(): allthestuff2.append(i) inlist = allthestuff[len(allthestuff2)/2:] last = inlist[0] inlist = inlist[1:] else: last = sys.argv[lastflag] templist = [] revlist = [] cutlist = [] rev = False cuts = [None, None] for i in inlist: if i == 'R' or i == 'Max' or i.isdigit(): if os.path.exists(i): sys.stderr.write('Cannot tell if "' + i + '" is an file or argument (the file exists and this is also the argument to trim or reverse genome).\ \nPlease rename file (if file) or remove file from directory (if argument).\n') sys.exit() if i == 'R': rev = True getit = True elif i.isdigit(): if cuts[0] == None: cuts[0] = int(i) else: cuts[1] = int(i) elif i == 'Max': cuts[1] = i else: revlist.append(rev) if cuts == [None, None]: cuts = [1, 'Max'] cutlist.append(tuple(cuts)) templist.append(last) rev = False cuts = [None, None] last = i revlist.append(rev) if cuts == [None, None]: cuts = [1, 'Max'] cutlist.append(tuple(cuts)) for i in cutlist: if None in i: sys.stderr.write('Please provide a start coordinate and end coordinate for genome cuts. (Only a single coordinate was provided)\n') sys.exit() templist.append(last) if getgc: thearray = [] for j in range(len(templist)): mincut, maxcut = cutlist[j] thearray.append(getGCcontent(templist[j], windsize, step, mincut, maxcut)) graphit = [thearray, pvc, nvc, gheight, axisthick, gtype, gmaxy, ggap] elif getgcskew: thearray = [] for j in range(len(templist)): mincut, maxcut = cutlist[j] thearray.append(getGCskew(templist[j], windsize, step, mincut, maxcut)) graphit = [thearray, pvc, nvc, gheight, axisthick, gtype, gmaxy, ggap] elif getcustom: thearray = getcustom(gfilename) graphit = [thearray, pvc, nvc, gheight, axisthick, gtype, gmaxy, ggap] elif getcoverage: thearray = [getCoverage(templist[0], gfilename, cutlist[0][0], cutlist[0][1])] graphit = [thearray, pvc, nvc, gheight, axisthick, gtype, gmaxy, ggap] if blastit: inlist = genBlast(templist, cutlist) elif tblastit: inlist = genTBlastX(templist, cutlist) elif blastfiles != None: inlist = [] tempfiles = sys.argv[blastfiles+1:] for i in templist[:-1]: inlist.append(i) inlist.append(tempfiles.pop(0)) inlist.append(templist[-1]) else: 'Please choolse -blastn or -tblastx flags to generate blast files, or use -blast_files to use previously generated files.' if filename == None: sys.stderr.write('Please choose a file to write to (-o tag) and try again.\n') sys.exit() if featDict == {} and not nofeat: featDict = {'CDS': ('arrow', (64, 224, 208))} if svg : x = drawsvg(filename, minlength, mineval, minIdent, inlist, width, height1, height2, minblastc, maxblastc, minblastci, maxblastci, drawfig1, drawfig2, drawfig3, revlist, featDict, glt, exont, genet, featlengths, aln, graphit, blastoutline, cutlist, filter, legend, legname) else: x = draw(filename, minlength, mineval, minIdent, inlist, width, height1, height2, minblastc, maxblastc, minblastci, maxblastci, drawfig1, drawfig2, drawfig3, revlist, featDict, glt, exont, genet, featlengths, aln, graphit, blastoutline, cutlist, filter, legend, legname) if (blastit or tblastit) and not keep_blast: shutil.rmtree('temp_easyfig') sys.stdout.write("Minimum blast hit reported: " + str(x) + '%\n') elif len(sys.argv) == 1: from tkinter import * from tkinter import filedialog as tkFileDialog from tkinter import messagebox as tkMessageBox from tkinter import simpledialog as tkSimpleDialog from tkinter import colorchooser as tkColorChooser class DDlistbox(Listbox): def __init__(self, master, **kw): kw['selectmode'] = SINGLE Listbox.__init__(self, master, kw) self.bind('', self.setCurrent) self.bind('', self.shiftSelection) self.curIndex = None def setCurrent(self, event): self.curIndex = self.nearest(event.y) def shiftSelection(self, event): i = self.nearest(event.y) if i < self.curIndex: x = self.get(i) self.delete(i) self.insert(i+1, x) self.curIndex = i elif i > self.curIndex: x = self.get(i) self.delete(i) self.insert(i-1, x) self.curIndex = i abortCaptain = False root = Tk() try: import sv_ttk sv_ttk.set_theme("light") except: pass root.title('Easyfig.py') root.option_add('*Font', 'Helvetica 12') app = App(root) root.mainloop() else: sys.stdout.write(''' Easyfig.py Written by: Mitchell Sullivan mjsull@gmail.com Supervisor: Dr. Scott Beatson University of Queensland 03.12.2010 License: GPLv3 Version 3.0.0 Usage: Easyfig.py [options] GenBank/EMBL/fasta GenBank/EMBL/fasta GenBank/EMBL/fasta ... This script should work on 1 to an infinite amount of GenBank/EMBL files (given enough memory) Adding 2 integers after the annotation file will crop the annotation file. Adding a R after the annotation file will reverse compliment it. WARNING: Will overwrite output file without warning. WARNING: Will delete temp_easyfig folder if -keep flag not given. *************************************************************** GenBank or EMBL file must have source line, or Sequence. ' source 1..' or 'FT source 1..' for GenBank / EMBL *************************************************************** The GenBank file preceding the blast file should always be the query the GenBank file after the blast file should always be the reference In it's present state only 'CDS' features will be recorded Options: -o Specify output file. -blastn Generate blastn files automatically. Requires blastall or blast+ in the path, Annotation file must have nucleotide sequence. [Default] -tblastx Generate tblastx files automatically. Requires blastall or blast+ in the path, Annotation file must have nucleotide sequence. -blast_files List of previously generated blast files, ordered. Query must be annotation file on top, reference annotation file on bottom. -svg Create Scalable Vector Graphics (svg) file instead of bmp. -filter Filter small blast hits or annotations (< 4 pixels wide). [F] GENERAL OPTIONS: -width width of figure in pixels. [5000] -ann_height height of annotations in figure (pixels). [50] -blast_height height of blast hits in figure (pixels). [100] -f1 draw colour gradient figure for blast hits. [F] -f2 draw scale figure base pairs long. [0] -f [r g b] [arrow/rect/pointer/frame] Draw features of type (case sensitive) in the color r g b with illustration type arrow, rectangle, pointer or frame. Default light blue arrows. EXAMPLE: -f CDS 255 0 0 rect will draw all CDS features as a red rectangle. if none specified easyFig automatically draws CDS features. If you want a figure with no features drawn use -f F -glt Genome line is pixels thick [5] -exont exon lines joining introns are pixels thick. [1] -genet outline of features is pixels thick. [1] -aln [centre] Alignment of genomes best aligns feature file perpendicular to best blast hit. -legend Single: Gene names in single column Double: Gene names in two columns Top: Top feature file genes labelled above figure Bottom: Bottom feature file genes labelled below figure Both: Top and bottom feature files genes labelled above and below genome. None: No legend or gene labelling -leg_name Where to get feature name from [gene] BLAST OPTIONS: -e maxmimum e value of blast hits to be drawn. [0.001] -i minimum identity value of blast hits to be drawn. [0] -min_length minimum length of blast hits to be drawn. [0] -blast_col changes blast hits to gradient of red or blue alternitively defines color gradient for blast hits worst blast hit reported will be color int1 int2 int3 where int 1 2 3 is the RGB of color range[0-255] 100% identity blast hits will be color int4 int5 int6 [default 20 20 20 175 175 175] -blast_col_inv Colour for inverted blast hits. -bo Black outline of blast hits. [T] -keep Don't delete blast output (temp_easyfig/) GRAPH OPTIONS: -G Plot GC Content, GC Skew, Coverage or Custom graph. if Coverage or Custom filename for ace or custom file needs to be provided. Details on how to make custom graph files in manual. -wind_size Window size for calculating GC content/GC skew. [1000] -step Step size for calculating GC content/GC skew. [1000] -line Draw graph as a line graph. [T] -axis_t Thickness of X axis. [1] -pos_col RGB colour of positive values in graph. [Red] -neg_col RGB colour of negative values in graph. [Blue] -g_height height of graph in pixels. [50] -gap gap between graph and annotations. [10] -y_max Maximum y value [Default: max Y calculated.] EXAMPLES: Easyfig.py -filter -o outfile.bmp genbank1.gbk genbank2.gbk genbank3.gbk Easiest way to generate a simple comparison file between three (or more) annotation files. Shows CDS features as red arrows. Easyfig.py -o outfile.bmp -e 0.00001 -f gene frame 0 0 255 -G GCContent ann1.embl ann2.gbk ann3.gbk ann4.embl Generate a blastn comparison between 4 annotation files, Display genes as blue arrows in frame. Only report blast hits under 0.00001 expect value. Display the GC content of each file as a graph. Easyfig.py -tblastx -o outfile.svg -svg ann1.embl 1 10000 ann2.embl 1 10000 R Show a tblastx comparison of the first 10000 base pairs of ann1.embl and ann2.embl Reverse compliment ann2.embl. Writes as a SVG file. this script uses a modified version of Paul McGuire's (http://www.geocities.com/ptmcg/ RIP (geocities, not paul)) bmp.py - module for constructing simple BMP graphics files ''')