# HG changeset patch # User cpt # Date 1655469315 0 # Node ID 2139c39b727e6e879e881a9a5d3bb43939276a92 Uploaded diff -r 000000000000 -r 2139c39b727e cpt_easyfig/Easyfig.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_easyfig/Easyfig.py Fri Jun 17 12:35:15 2022 +0000 @@ -0,0 +1,20334 @@ +#!/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 2.2.3 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 "#%x%x%x" % (int(rgb[0] / 16), int(rgb[1] / 16), int(rgb[2] / 16)) + + +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 += ' \n' + % ( + x, + y + ht / 4, + x2, + y + ht / 4, + x2, + y, + x1, + y1, + x2, + y + ht, + x2, + y + 3 * ht / 4, + x, + y + 3 * ht / 4, + ) + ) + else: + 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 += ' \n' + % ( + x1, + y + ht / 4, + x2, + y + ht / 4, + x2, + y, + x, + y1, + x2, + y + ht, + x2, + y + 3 * ht / 4, + x1, + y + 3 * ht / 4, + ) + ) + else: + 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 = (int(i) & 0x7FFF0000) >> 16 + lo = int(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("Color is immutable") + 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 (int(self.blu)) + (int(self.grn) << 8) + (int(self.red) << 16) + + def __eq__(self, other): + return (self is other) or (self.toLong == other.toLong) + + 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 + f = file(filename, "wb") + + # write bitmap header + f.write("BM") + f.write( + longToString(54 + 256 * 4 + self.ht * self.wd) + ) # DWORD size in bytes of the file + f.write(longToString(0)) # DWORD 0 + f.write(longToString(54 + 256 * 4)) # DWORD offset to the data + f.write(longToString(40)) # DWORD header size = 40 + f.write(longToString(self.wd)) # DWORD image width + f.write(longToString(self.ht)) # DWORD image height + f.write(shortToString(1)) # WORD planes = 1 + f.write(shortToString(8)) # WORD bits per pixel = 8 + f.write(longToString(0)) # DWORD compression = 0 + f.write( + longToString(self.wd * self.ht) + ) # DWORD sizeimage = size in bytes of the bitmap = width * height + f.write(longToString(0)) # DWORD horiz pixels per meter (?) + f.write(longToString(0)) # DWORD ver pixels per meter (?) + f.write(longToString(256)) # DWORD number of s used = 256 + f.write( + longToString(len(self.palette)) + ) # DWORD number of "import s = len( self.palette ) + + # write bitmap palette + for clr in self.palette: + f.write(longToString(clr)) + for i in range(len(self.palette), 256): + f.write(longToString(0)) + + # write pixels + for row in self.bitarray: + for pixel in row: + f.write(chr(pixel)) + padding = (4 - len(row) % 4) % 4 + for i in range(padding): + f.write(chr(0)) + + # close file + f.close() + + def _saveBitMapWithCompression(self, filename): + """ + """ + # open file + f = file(filename, "wb") + + # write bitmap header + f.write("BM") + f.write( + longToString(54 + 256 * 4 + self.ht * self.wd) + ) # DWORD size in bytes of the file + f.write(longToString(0)) # DWORD 0 + f.write(longToString(54 + 256 * 4)) # DWORD offset to the data + f.write(longToString(40)) # DWORD header size = 40 + f.write(longToString(self.wd)) # DWORD image width + f.write(longToString(self.ht)) # DWORD image height + f.write(shortToString(1)) # WORD planes = 1 + f.write(shortToString(8)) # WORD bits per pixel = 8 + f.write(longToString(1)) # DWORD compression = 1=RLE8 + f.write( + longToString(self.wd * self.ht) + ) # DWORD sizeimage = size in bytes of the bitmap = width * height + f.write(longToString(0)) # DWORD horiz pixels per meter (?) + f.write(longToString(0)) # DWORD ver pixels per meter (?) + f.write(longToString(256)) # DWORD number of s used = 256 + f.write( + longToString(len(self.palette)) + ) # DWORD number of "import s = len( self.palette ) + + # write bitmap palette + for clr in self.palette: + f.write(longToString(clr)) + for i in range(len(self.palette), 256): + f.write(longToString(0)) + + # write pixels + pixelBytes = 0 + for row in self.bitarray: + rleStart = 0 + curPixel = rleStart + 1 + while curPixel < len(row): + if row[curPixel] != row[rleStart] or curPixel - rleStart == 255: + # write out from rleStart thru curPixel-1 + f.write(chr(curPixel - rleStart)) + f.write(chr(row[rleStart])) + pixelBytes += 2 + rleStart = curPixel + else: + pass + curPixel += 1 + + # write out last run of s + f.write(chr(curPixel - rleStart)) + f.write(chr(row[rleStart])) + pixelBytes += 2 + + # end of line code + f.write(chr(0)) + f.write(chr(0)) + pixelBytes += 2 + + # end of bitmap code + f.write(chr(0)) + f.write(chr(1)) + pixelBytes += 2 + + # now fix sizes in header + f.seek(2) + f.write( + longToString(54 + 256 * 4 + pixelBytes) + ) # DWORD size in bytes of the file + f.seek(34) + f.write(longToString(pixelBytes)) # DWORD size in bytes of the file + + # close file + f.close() + + def saveFile(self, filename, compress=True): + if compress: + self._saveBitMapWithCompression(filename) + else: + 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: + print ("feature could not be processed:\n" + 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: + print ("feature could not be processed:\n" + 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: + print ("Colour could not be processed:\n" + 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: + print ("Colour could not be processed:\n" + 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: + print ("Colour could not be processed:\n" + 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: + print ("Colour could not be processed:\n" + 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" * int(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, + compress, + 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[int(i / 2)][1] == "Max": + if temp[0] == None: + maxcut = featlengths[int(i / 2)] + else: + maxcut = temp[0] + if minmaxlist[int(i / 2)][0] == 1: + minmaxopt = 0 + else: + minmaxopt = 1 + mincut = minmaxlist[int(i / 2)][0] + else: + mincut = minmaxlist[int(i / 2)][0] + maxcut = minmaxlist[int(i / 2)][1] + if minmaxlist[int(i / 2)][0] < minmaxlist[int(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[int(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[int(i / 2)], thirdlist)) + if featlengths[int(i / 2)] > maxlength: + maxlength = featlengths[int(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[int(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[int(i / 2)]: + theQstart = secondlist[i - 1][0] - qend + else: + theQstart = qstart + if reverseList[int((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[int(i / 2)] > maxlength: + maxlength = secondlist[i][0] + blastmatch[int(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[int(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): + # print len(legendArrows), legendArrows[index][2] + 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) + else: + print ("wang") + 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[int(i / 2)] + genrev1 = reverseList[int(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[int((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[int(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[int((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, compress) + 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, + compress, + 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[int(i / 2)][1] == "Max": + if temp[0] == None: + maxcut = featlengths[int(i / 2)] + else: + maxcut = temp[0] + if minmaxlist[int(i / 2)][0] == 1: + minmaxopt = 0 + else: + minmaxopt = 1 + mincut = minmaxlist[int(i / 2)][0] + else: + mincut = minmaxlist[int(i / 2)][0] + maxcut = minmaxlist[int(i / 2)][1] + if minmaxlist[int(i / 2)][0] < minmaxlist[int(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[int(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[int(i / 2)], thirdlist)) + if featlengths[int(i / 2)] > maxlength: + maxlength = featlengths[int(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[int(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[int(i / 2)]: + theQstart = secondlist[i - 1][0] - qend + else: + theQstart = qstart + if reverseList[int((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[int(i / 2)] > maxlength: + maxlength = secondlist[i][0] + blastmatch[int(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[int(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[int(i / 2)] + genrev1 = reverseList[int(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[int((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[int(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[int((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 2.2.3", font="TkDefaultFont 24 bold" + ) + self.theTitle.grid(row=0, column=1, columnspan=3, padx=10, sticky="W") + self.annLab = Label( + frame1, text="Annotation Files", font="TkDefaultFont 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="TkDefaultFont 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="TkDefaultFont 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): + apply(self.genlist.yview, args) + apply(self.blastlist.yview, args) + + 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 == "": + 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="TkDefaultFont 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 2.2.3\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="TkDefaultFont 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="TkDefaultFont 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="TkDefaultFont 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="TkDefaultFont 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="TkDefaultFont 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="TkDefaultFont 13 bold" + ) + self.featlabel.grid(row=5, column=0) + self.featcolour = Label( + self.frame4, text="Colour", font="TkDefaultFont 13 bold" + ) + self.featcolour.grid(row=5, column=1, columnspan=2) + self.featshape = Label(self.frame4, text="type", font="TkDefaultFont 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="TkDefaultFont 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.isAlive(): + 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 + self.compress = False + 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.isAlive(): + 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.compress, + 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.compress, + 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.compress, + 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.compress, + 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" * int(len(seq) / 500)) + outfile.write(seq) + elif mincut < maxcut: + seq = seq[mincut - 1 : maxcut] + if getmultifa: + seq = seq.replace("qqq", "n" * int(len(seq) / 500)) + outfile.write(seq) + else: + seq = seq[mincut - 1 :] + seq[:maxcut] + if getmultifa: + seq = seq.replace("qqq", "n" * int(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.isAlive(): + tkMessageBox.showerror("Please wait", "BLAST already running.") + return None + except: + pass + try: + if self.thethread.isAlive(): + tkMessageBox.showerror("Please wait", "easyfig creating figure.") + return None + except: + pass + try: + if self.thedlblast.isAlive(): + 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.isAlive(): + 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, + ).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.isAlive(): + tkMessageBox.showerror("Please wait", "BLAST already running.") + return None + except: + pass + try: + if self.thethread.isAlive(): + tkMessageBox.showerror("Please wait", "easyfig creating figure.") + return None + except: + pass + try: + if self.thedlblast.isAlive(): + 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.isAlive(): + 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="TkDefaultFont 13 bold") + self.frangelab.grid(row=0, column=2, columnspan=3) + self.ffilelab = Label( + self.frame6, text="Ann. file", font="TkDefaultFont 13 bold" + ) + self.ffilelab.grid(row=1, column=1, pady=10) + self.fminlab = Label(self.frame6, text="Min", font="TkDefaultFont 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="TkDefaultFont 13 bold") + self.fmaxlab.grid(row=1, column=4, pady=10) + self.frevlab = Label(self.frame6, text="Reverse", font="TkDefaultFont 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="TkDefaultFont 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/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: + print ("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: + print ("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" * int(len(seq) / 500)) + outfile.write(seq) + elif mincut < maxcut: + seq = seq[mincut - 1 : maxcut] + if getmultifa: + seq = seq.replace("qqq", "n" * int(len(seq) / 500)) + outfile.write(seq) + else: + seq = seq[mincut - 1 :] + seq[:maxcut] + if getmultifa: + seq = seq.replace("qqq", "n" * int(len(seq) / 500)) + outfile.write(seq) + if len(seq) == 0: + print ("There is no sequence in " + genbank + ".") + return 0 + else: + return 1 + except: + print (genbank + " does not exist.") + 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: + print ("Annotation file " + filename + " not valid.") + return None + if len(seq) == 0: + print ("Annotation file " + filename + " not valid.") + 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: + print ("Annotation file " + filename + " not valid.") + return None + if len(seq) == 0: + print ("Annotation file " + filename + " not valid.") + 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: + print ("Annotation file " + filename + " not valid.") + return None + if len(seq) == 0: + print ("Annotation file " + filename + " not valid.") + 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: + print (filename + " not valid graph file.") + 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, + ).wait() + print ("makeblastdb -dbtype nucl -out temp_easyfig/tempdb -in temp_easyfig/" + str( + i + 2 + ) + ".easyfig.fa") + 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: + print ("Could not find BLAST.") + 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: + print ("Could not find BLAST.") + 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"): + print ("please run from a directory without the folder temp_easyfig") + 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: + print ("Could not find BLAST.") + 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: + print ("Could not find BLAST.") + 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 +compress = True +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.argv[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] == "-uncomp": + if ( + sys.argv[i + 1] == "T" + or sys.argv[i + 1] == "t" + or sys.argv[i + 1] == "True" + or sys.argv[i + 1] == "true" + ): + compress = False + 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 + elif sys.argv[i + 1] == "gray": + t1, t2, t3, t4, t5, t6 = 20, 20, 20, 175, 175, 175 + 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: + print (sys.argv[i + 1] + " not a valid graph type") + 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: + print ("Legend options are (case sensitive), using None.") + 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: + print ("Please choose a file to write to (-o tag) and try agian.") + 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, + compress, + 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, + compress, + 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") + print ("Minimum blast hit reported: " + str(x) + "%") + +elif len(sys.argv) == 1: + from Tkinter import * + import tkFileDialog + import tkMessageBox + import tkSimpleDialog + import 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() + root.title("Easyfig.py") + root.option_add("*Font", "TkDefaultFont 12") + app = App(root) + root.mainloop() +else: + print ( + """ +Easyfig.py Written by: Mitchell Sullivan mjsull@gmail.com +Supervisor: Dr. Scott Beatson University of Queensland 03.12.2010 + +License: GPLv3 + +Version 2.2.3 + +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] +-uncomp Do not compress figure. [F] +-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 +""" + ) diff -r 000000000000 -r 2139c39b727e cpt_easyfig/cpt-macros.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_easyfig/cpt-macros.xml Fri Jun 17 12:35:15 2022 +0000 @@ -0,0 +1,115 @@ + + + + + python + biopython + requests + + + + + + + + 10.1371/journal.pcbi.1008214 + @unpublished{galaxyTools, + author = {E. Mijalis, H. Rasche}, + title = {CPT Galaxy Tools}, + year = {2013-2017}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + + + + + 10.1371/journal.pcbi.1008214 + + @unpublished{galaxyTools, + author = {E. Mijalis, H. Rasche}, + title = {CPT Galaxy Tools}, + year = {2013-2017}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + + + + + + + 10.1371/journal.pcbi.1008214 + + @unpublished{galaxyTools, + author = {C. Ross}, + title = {CPT Galaxy Tools}, + year = {2020-}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + + + + + + + 10.1371/journal.pcbi.1008214 + + @unpublished{galaxyTools, + author = {E. Mijalis, H. Rasche}, + title = {CPT Galaxy Tools}, + year = {2013-2017}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + + + @unpublished{galaxyTools, + author = {A. Criscione}, + title = {CPT Galaxy Tools}, + year = {2019-2021}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + + + + + + + 10.1371/journal.pcbi.1008214 + + @unpublished{galaxyTools, + author = {A. Criscione}, + title = {CPT Galaxy Tools}, + year = {2019-2021}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + + + + + + + 10.1371/journal.pcbi.1008214 + + @unpublished{galaxyTools, + author = {C. Maughmer}, + title = {CPT Galaxy Tools}, + year = {2017-2020}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + + + + + + + @unpublished{galaxyTools, + author = {C. Maughmer}, + title = {CPT Galaxy Tools}, + year = {2017-2020}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + + + + diff -r 000000000000 -r 2139c39b727e cpt_easyfig/easyfig_cpt.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_easyfig/easyfig_cpt.xml Fri Jun 17 12:35:15 2022 +0000 @@ -0,0 +1,183 @@ + + + Galaxy wrapper for genbank visualization + + macros.xml + cpt-macros.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + blast['input_type'] != 'files' + blast['keepBlast'] + + + ' or 'FT source 1..' +Only 'CDS' features will be recorded. + + +**Reverse Option** +Easyfig can plot a genbank file in reverse, effectively inverting the sequence and its annotations. Specify which genbanks to reverse +by providing their list index position in the Reverse Items field. The list is in order from the bottom-up, so if three genbanks are selected, +the bottom-most one is 1, the middle is 2, and the top-most 3. +The numbers must be separated by a space. Entering "2 3" will reverse the middle and top items, and the bottom "1" will be read in the forward orientation. + + +**Nucleotide BLAST** + - run BLASTn, run tBLASTx, or provide 12-column BLAST results for each input. + + +**General options** +- E-value: Select the minimum e-value of blast hits to be drawn. Default is 0.001 + +- Percent identity: Enter the minimum hit percent identity to be drawn. Default is 0. + +- Hit length: Enter the minimum length of similarity (in nucleotides) for the output to be included on the drawing. + +- BLAST scale: Toggle the BLAST similarity scale key for display. + +- Genome scale bar: Enter a value in base pairs for the length of scale bar. Default is zero, which does not draw a scale bar. + +- Position for feature labels : single (single column), double (two columns), top (feature labels of top genome drawn above figure), bottom (feature labels from bottom genome drawn below figure), both (top and bottom genome features drawn above and below figure), none (no legend or gene labelling, default) + +- Source of feature label: default is gene. Other options include the product tag. + +- Alignment: align the graphic according to best/left/right/center. Alignment of genomes best aligns feature file perpendicular to best blast hit. Default is center. + +- BLAST similarity gradient color: options are gray, red, and blue. + +- GCContent plot: select to display GC content or GCSkew graphs with the output. + + +**Output** +A Scalable Vector Graphics (svg) file or static html display are returned. + + +Blast Wrapper written by Criscione, Anthony, Center for Phage Technology, Texas A&M University, 2020 + ]]> + + 10.1093/bioinformatics/btr039 + + diff -r 000000000000 -r 2139c39b727e cpt_easyfig/macros.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_easyfig/macros.xml Fri Jun 17 12:35:15 2022 +0000 @@ -0,0 +1,105 @@ + + + + + python + biopython + cpt_gffparser + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +