annotate latlon_conv.py @ 0:ef146e4077e6 draft default tip

planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
author itaxotools
date Sun, 29 Jan 2023 16:44:56 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
1 #!/usr/bin/env python3
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
2 import re
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
3 import os
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
4 import math
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
5 import sys
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
6 from typing import List, Tuple, Union, Iterator, Optional
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
7 import tkinter as tk
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
8 from tkinter import ttk
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
9 import tkinter.filedialog as tkfiledialog
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
10 import tkinter.messagebox
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
11 import tkinter.font as tkfont
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
12 import warnings
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
13
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
14 # the parsers' input type
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
15 Tokens = List[Tuple[int, str]]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
16 # types of minutes: either a float or int with seconds
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
17 Minute = Union[float, Tuple[int, float]]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
18 # type of coordinates: either a float or sign, degree and minutes
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
19 Coordinate = Union[float, Tuple[bool, int, Minute]]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
20
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
21
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
22 def dec_minute(minute: Minute) -> float:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
23 if isinstance(minute, float):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
24 return minute
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
25 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
26 return minute[0] + minute[1] / 60
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
27
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
28
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
29 def dec_coord(coord: Coordinate) -> float:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
30 if isinstance(coord, float):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
31 return coord
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
32 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
33 return (1 if coord[0] else -1) * (coord[1] + dec_minute(coord[2]) / 60)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
34
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
35
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
36 def sx_coord(coord: Coordinate) -> Tuple[bool, int, Tuple[int, float]]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
37 if isinstance(coord, float):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
38 sign = coord >= 0
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
39 coord = abs(coord)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
40 deg = math.floor(coord)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
41 return sx_coord((sign, deg, (coord - deg) * 60))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
42 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
43 sign, deg, mm = coord
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
44 if isinstance(mm, float):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
45 mm_int = math.floor(mm)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
46 sec = (mm - mm_int) * 60
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
47 return (sign, deg, (mm_int, sec))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
48 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
49 return (sign, deg, mm)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
50
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
51
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
52 def str_coord(coord: Coordinate, lat: bool) -> str:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
53 if lat:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
54 hems = ['S', 'N']
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
55 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
56 hems = ['W', 'E']
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
57 if isinstance(coord, float):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
58 return f"{abs(coord):.5f}{hems[coord >= 0]}"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
59 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
60 sign,degrees, minutes = coord
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
61 if isinstance(minutes, float):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
62 return f"{degrees}°{minutes:.3f}'{hems[sign]}"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
63 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
64 return f"{degrees}°{minutes[0]}'{minutes[1]:.1f}''{hems[sign]}"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
65
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
66
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
67 def signed_coord(coord: str) -> str:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
68 hem = coord[-1]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
69 if hem in 'SW':
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
70 return '-' + coord[:-1]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
71 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
72 return coord[:-1]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
73
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
74
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
75 def prepare_string(string: str) -> str:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
76 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
77 standardizes the string
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
78
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
79 raises ValueError if both 'O' or 'o' and '°' are present in the string
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
80 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
81 if ('O' in string or 'o' in string) and '°' in string:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
82 raise ValueError("Encountered 'O' to indicate geographical direction which can mean either West (Spanish/French/Italian) or East (German); please change to E or W before conversion.")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
83 string = string.casefold()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
84 string = re.sub('north', 'n', string)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
85 string = re.sub('south', 's', string)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
86 string = re.sub('west', 'w', string)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
87 string = re.sub('east', 'e', string)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
88 string = re.sub(
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
89 'seconds|sec|["“”‟]|[´`‘’‛][´`‘’‛]|[´`‘’‛] [´`‘’‛]', "''", string)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
90 string = re.sub('minutes|min|[´`‘’‛]', "'", string)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
91 string = re.sub('degrees|deg|o', '°', string)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
92 return string
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
93
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
94
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
95 def parse_coord(tokens: Tokens) -> Tuple[Coordinate, Tokens]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
96 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
97 parse a single coordinate and return the rest of the string
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
98
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
99 raises a ValueError("parse error") if the beginning doesn't match a coordinate
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
100 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
101 # deal with the simple situations
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
102 if not tokens:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
103 raise ValueError("parse error")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
104 elif len(tokens) == 1:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
105 return float(tokens[0][0]), tokens[1:]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
106
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
107 first_sep = tokens[0][1]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
108 if first_sep[0] in '.,':
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
109 # parse floating point coordinate
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
110 return parse_float(tokens)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
111 elif first_sep[0] == '°':
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
112 # parse degree, minutes coordinate
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
113 degrees = tokens[0][0]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
114 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
115 minutes, tokens1 = parse_minutes(tokens[1:])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
116 return (degrees >= 0, abs(degrees), minutes), tokens1
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
117 except ValueError:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
118 # there is no minutes
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
119 return (float(degrees), tokens[1:])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
120 elif first_sep[0] == 'xB0':
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
121 # parse degree, minutes coordinate
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
122 degrees = tokens[0][0]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
123 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
124 minutes, tokens1 = parse_minutes(tokens[1:])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
125 return (degrees >= 0, abs(degrees), minutes), tokens1
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
126 except ValueError:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
127 # there is no minutes
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
128 return (float(degrees), tokens[1:])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
129
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
130 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
131 raise ValueError("parse error")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
132
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
133
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
134 def parse_float(tokens: Tokens) -> Tuple[float, Tokens]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
135 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
136 parse a float and return the rest of the string
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
137
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
138 raise a ValueError("parse error") if the length is less than two
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
139 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
140 if len(tokens) < 2:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
141 raise ValueError("parse error")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
142 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
143 int_part = tokens[0][0]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
144 dec_part = tokens[1][0]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
145 return (float(str(int_part) + '.' + str(dec_part)), tokens[2:])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
146
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
147
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
148 def parse_minutes(tokens: Tokens) -> Tuple[Minute, Tokens]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
149 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
150 parse a coordinate starting with minutes and return the rest of the string
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
151
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
152 raises a ValueError("parse error"), if the parsing fails
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
153 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
154 # deal with the simple situations
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
155 if not tokens:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
156 raise ValueError("parse error")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
157 elif len(tokens) == 1:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
158 return float(tokens[0][0]), tokens[1:]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
159
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
160 first_sep = tokens[0][1]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
161 if first_sep[0] in '.,':
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
162 # parse floating point minutes
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
163 return parse_float(tokens)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
164 elif first_sep[0] == "'":
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
165 # parse minutes, seconds
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
166 minutes = tokens[0][0]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
167 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
168 seconds, tokens1 = parse_seconds(tokens[1:])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
169 return ((minutes, seconds), tokens1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
170 except ValueError:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
171 # there is no seconds
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
172 return (float(minutes), tokens[1:])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
173 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
174 raise ValueError("parse error")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
175
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
176
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
177 def parse_seconds(tokens: Tokens) -> Tuple[float, Tokens]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
178 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
179 parse a coordinate starting with seconds and return the rest of the string
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
180
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
181 raises a ValueError("parse error"), if the parsing fails
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
182 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
183 # deal with the simple situations
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
184 if not tokens:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
185 raise ValueError("parse error")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
186 elif len(tokens) == 1:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
187 return float(tokens[0][0]), tokens[1:]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
188
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
189 first_sep = tokens[0][1]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
190 if first_sep[0] in '.,':
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
191 # parse floating point seconds
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
192 return parse_float(tokens)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
193 elif first_sep[0:2] == "''":
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
194 # parse seconds
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
195 return tokens[0][0], tokens[1:]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
196 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
197 raise ValueError("parse error")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
198
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
199
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
200 def hemisphere_sign(c: str, coord: Coordinate) -> Coordinate:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
201 if c in 'ne':
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
202 return coord
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
203 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
204 if isinstance(coord, float):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
205 return -coord
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
206 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
207 return (not coord[0], coord[1], coord[2])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
208
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
209 def cannot_parse_error(tokens: Tokens) -> ValueError:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
210 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
211 makes a ValueError
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
212 "Cannot parse: tokens as str"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
213 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
214 return ValueError("Cannot parse: " + ''.join(str(n)+sep for n, sep in tokens))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
215
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
216 def parse_coordinates(string: str, lat_first: bool) -> Tuple[Coordinate, Coordinate]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
217 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
218 parses a string into coordinates with latitude first
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
219
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
220 lat_first indicates whether latitude is first in unmarked strings
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
221
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
222 if the whole string is not consumed, raises a ValueError with the rest
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
223 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
224 # sanitize the string
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
225 string = prepare_string(string)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
226 # extract the quadrant information
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
227 letters = [c for c in string if c.isalpha()]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
228 quadrant = [c for c in letters if c in 'nsew']
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
229 if len(letters) > len(quadrant):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
230 # there are disallowed letters in coordinates
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
231 raise ValueError("Letters {set(letters) - set(quadrant)} cannot be regognized as hemispheres")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
232 # defines method orient that exchanges and negates the coordinates based on the quadrant
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
233 if not quadrant:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
234 if lat_first:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
235 def orient(p: Tuple[Coordinate, Coordinate]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
236 ) -> Tuple[Coordinate, Coordinate]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
237 return p
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
238 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
239 def orient(p: Tuple[Coordinate, Coordinate]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
240 ) -> Tuple[Coordinate, Coordinate]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
241 return (p[1], p[0])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
242 elif len(quadrant) == 2:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
243 if quadrant[0] in 'ns' and quadrant[1] in 'we':
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
244 def swap(p: Tuple[Coordinate, Coordinate]) -> Tuple[Coordinate, Coordinate]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
245 return p
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
246 elif quadrant[0] in 'we' and quadrant[1] in 'ns':
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
247 def swap(p: Tuple[Coordinate, Coordinate]) -> Tuple[Coordinate, Coordinate]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
248 return (p[1], p[0])
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
249
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
250 def orient(p: Tuple[Coordinate, Coordinate]) -> Tuple[Coordinate, Coordinate]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
251 return swap((hemisphere_sign(quadrant[0], p[0]), hemisphere_sign(quadrant[1], p[1])))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
252 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
253 raise ValueError(f"Cannot recognize the order of coordinates: {string}")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
254 # split the string into tokens
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
255 tokens = [(int(m.group(1)), m.group(2))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
256 for m in re.finditer(r'(-?\d+)([^\d-]*)', string)]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
257 # parse coordinates one after the other
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
258 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
259 coord0, tokens1 = parse_coord(tokens)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
260 except ValueError as ex:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
261 raise cannot_parse_error(tokens) from ex
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
262 if not tokens1 and len(tokens) == 2: # probably the degrees, degrees situation
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
263 return orient((float(tokens[0][0]), float(tokens[1][0])))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
264 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
265 coord1, rest = parse_coord(tokens1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
266 except ValueError as ex:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
267 raise cannot_parse_error(tokens1) from ex
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
268 if rest:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
269 # incomplete parse: error
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
270 raise cannot_parse_error(rest)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
271 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
272 return orient((coord0, coord1))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
273
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
274 def validate_coord(coord: Coordinate, direction: str) -> str:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
275 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
276 direction is "latitude" or "longitude"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
277
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
278 Returns a message if minutes or seconds are invalid (not in [0, 60))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
279 Otherwise returns an empty string
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
280 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
281 if isinstance(coord, float):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
282 if not 0 <= coord <= 180:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
283 return f"Invalid degrees in {direction}"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
284 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
285 return ""
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
286 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
287 _, degrees, minutes = coord
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
288 if not 0 <= degrees <= 180:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
289 return f"Invalid degrees in {direction}"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
290 if isinstance(minutes, float):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
291 if not 0 <= minutes < 60:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
292 return f"Invalid minutes in {direction}"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
293 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
294 return ""
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
295 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
296 whole_minutes, seconds = minutes
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
297 if not 0 <= whole_minutes < 60:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
298 return f"Invalid minutes in {direction}"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
299 elif not 0 <= seconds < 60:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
300 return f"Invalid seconds in {direction}"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
301 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
302 return ""
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
303
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
304
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
305 def process_simpl(input: Iterator[str]) -> Iterator[List[str]]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
306 # by default latitude comes first)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
307 lat_first = True
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
308 # read the first line
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
309 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
310 line = next(input)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
311 heading = line.casefold()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
312 except StopIteration:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
313 return
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
314 # try to find 'lat' and 'lon' in the first line
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
315 lat_ind = heading.find('lat')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
316 lon_ind = heading.find('lon')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
317 if lat_ind >= 0 and lon_ind >= 0:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
318 # first line in the heading
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
319 lat_first = lat_ind <= lon_ind
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
320 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
321 line = next(input)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
322 except StopIteration:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
323 return
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
324 # yield the output heading
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
325 both = "latlon" if lat_first else "lotlan"
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
326 yield ["original_lat", "original_lon", f"original_{both}", "lat_corr", "lon_corr", "lat_dec", "lon_dec", "latlon_dec", "lat_sx", "lon_sx", "latlon_sx", "Remark"]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
327 while True:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
328 # format the part of the output with the original information
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
329 line = line.strip()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
330 if not line:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
331 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
332 line = next(input)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
333 except StopIteration:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
334 break
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
335 continue
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
336 part1, _, part2 = line.partition('\t')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
337 if not part1 or not part2 or part1.isspace() or part2.isspace():
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
338 original = ["", "", line]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
339 elif lat_first:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
340 original = [part1, part2, ""]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
341 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
342 original = [part2, part1, ""]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
343 # try to parse the line, if it fails, output just the original
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
344 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
345 lat, lon = parse_coordinates(line, lat_first)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
346 except ValueError as ex:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
347 yield original + [""] * 8 + [str(ex)]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
348 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
349 line = next(input)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
350 except StopIteration:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
351 break
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
352 continue
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
353 # validate bounds on minutes and seconds
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
354 remark = validate_coord(lat, "latitude") + validate_coord(lon, "longitude")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
355 if remark:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
356 yield original + [""] * 8 + [remark]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
357 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
358 line = next(input)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
359 except StopIteration:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
360 break
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
361 continue
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
362 # compose the output
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
363 lat_corr = str_coord(lat, True)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
364 lon_corr = str_coord(lon, False)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
365 lat_dec = str_coord(dec_coord(lat), True)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
366 lon_dec = str_coord(dec_coord(lon), False)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
367 lat_sx = str_coord(sx_coord(lat), True)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
368 lon_sx = str_coord(sx_coord(lon), False)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
369 yield original + [lat_corr, lon_corr, signed_coord(lat_dec), signed_coord(lon_dec), f"{lat_dec} {lon_dec}", lat_sx, lon_sx, f"{lat_sx} {lon_sx}", ""]
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
370 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
371 line = next(input)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
372 except StopIteration:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
373 break
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
374
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
375
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
376 def launch_gui() -> None:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
377 # initialization
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
378 root = tk.Tk()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
379 root.title("LatLonConverter")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
380 if os.name == "nt":
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
381 root.wm_iconbitmap(os.path.join('data', 'LatLonIcon.ico'))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
382 mainframe = ttk.Frame(root, padding=5)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
383 root.rowconfigure(1, weight=1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
384 root.columnconfigure(0, weight=1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
385 mainframe.rowconfigure(4, weight=1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
386 mainframe.columnconfigure(2, weight=1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
387
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
388 style = ttk.Style()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
389 style.configure("ConvertButton.TButton", background="blue")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
390
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
391 # banner frame
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
392 banner_frame = ttk.Frame(root)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
393 banner_img = tk.PhotoImage(file=os.path.join(
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
394 "data", "iTaxoTools Digital linneaeus MICROLOGO.png"))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
395 banner_image = ttk.Label(banner_frame, image=banner_img)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
396 banner_image.grid(row=0, column=0, rowspan=2, sticky='nsw')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
397 program_name = ttk.Label(
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
398 banner_frame, text="LatLonConverter", font=tkfont.Font(size=20))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
399 program_name.grid(row=1, column=1, sticky='sw')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
400 program_description = ttk.Label(
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
401 banner_frame, text="A batch converter of geographical coordinates")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
402 program_description.grid(row=1, column=2, sticky='sw', ipady=4, ipadx=15)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
403 banner_frame.grid(column=0, row=0, sticky='nsw')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
404
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
405
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
406 # create labels
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
407 infile_lbl = ttk.Label(mainframe, text="Input file")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
408 outfile_lbl = ttk.Label(mainframe, text="Output file")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
409
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
410 # create entries
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
411 infile_var = tk.StringVar()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
412 infile_entr = ttk.Entry(mainframe, textvariable=infile_var)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
413 outfile_var = tk.StringVar()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
414 outfile_entr = ttk.Entry(mainframe, textvariable=outfile_var)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
415
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
416 # create texts
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
417 input_frame = ttk.Frame(mainframe)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
418 input_frame.rowconfigure(1, weight=1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
419 input_frame.columnconfigure(0, weight=1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
420 input_text = tk.Text(input_frame, width=50, height=15, undo=True)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
421 input_lbl = ttk.Label(input_frame, text="Paste coordinates here for fast conversion into decimal format\n(one pair of coordinates per line, in any format)")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
422 input_xscroll = ttk.Scrollbar(
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
423 input_frame, orient=tk.HORIZONTAL, command=input_text.xview)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
424 input_yscroll = ttk.Scrollbar(
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
425 input_frame, orient=tk.VERTICAL, command=input_text.yview)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
426 input_text.configure(xscrollcommand=input_xscroll.set,
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
427 yscrollcommand=input_yscroll.set)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
428 input_lbl.grid(row=0, column=0, sticky='w')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
429 input_text.grid(row=1, column=0, sticky='nsew')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
430 input_xscroll.grid(row=2, column=0, sticky='nsew')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
431 input_yscroll.grid(row=1, column=1, sticky='nsew')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
432
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
433 output_frame = ttk.Frame(mainframe)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
434 output_frame.rowconfigure(1, weight=1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
435 output_frame.columnconfigure(0, weight=1)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
436 output_text = tk.Text(output_frame, width=50, height=15, wrap='none')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
437 output_lbl = ttk.Label(output_frame, text="If the data have been pasted into the window on the left,\nthe converted output will be show here.")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
438 output_xscroll = ttk.Scrollbar(
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
439 output_frame, orient=tk.HORIZONTAL, command=output_text.xview)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
440 output_yscroll = ttk.Scrollbar(
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
441 output_frame, orient=tk.VERTICAL, command=output_text.yview)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
442 output_text.configure(xscrollcommand=output_xscroll.set,
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
443 yscrollcommand=output_yscroll.set)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
444 output_text.configure(state='disabled')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
445 # make sure the widget gets focus when clicked
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
446 # on, to enable highlighting and copying to the
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
447 # clipboard.
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
448 output_text.bind("<1>", lambda _: output_text.focus_set())
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
449 output_lbl.grid(row=0, column=0, sticky='w')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
450 output_text.grid(row=1, column=0, sticky='nsew')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
451 output_xscroll.grid(row=2, column=0, sticky='nsew')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
452 output_yscroll.grid(row=1, column=1, sticky='nsew')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
453
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
454 # internal functions
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
455 def input_lines() -> Iterator[str]:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
456 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
457 returns an iterator over the input lines
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
458
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
459 if the input file name is given, the line comes from it,
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
460 otherwise from the input text widget
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
461 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
462 filename = infile_var.get()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
463 if filename and not filename.isspace():
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
464 with open(filename, encoding="ansi", errors='replace') as file:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
465 for line in file:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
466 yield line
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
467 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
468 text = input_text.get('1.0', 'end')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
469 for line in text.splitlines():
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
470 yield line
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
471
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
472 def write_output(lines: Iterator[List[str]]) -> None:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
473 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
474 writes the output
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
475
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
476 if the output file name is given, the output is written to it,
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
477 otherwise to the output text widget
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
478 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
479 output_text.configure(state='normal')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
480 filename = outfile_var.get()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
481 output_text.delete('1.0', 'end')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
482 if filename and not filename.isspace():
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
483 with open(filename, encoding="ansi", mode='w') as file:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
484 for line in lines:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
485 print("\t".join(line), file=file)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
486 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
487 for line in lines:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
488 output_text.insert('end', f"{line[5]}\t{line[6]}\t{line[-1]}")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
489 output_text.insert('end', '\n')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
490 output_text.configure(state='disabled')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
491
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
492 def browse_infile() -> None:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
493 newpath: Optional[str] = tkfiledialog.askopenfilename()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
494 if (newpath):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
495 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
496 newpath = os.path.relpath(newpath)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
497 except:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
498 newpath = os.path.abspath(newpath)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
499 infile_var.set(newpath)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
500
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
501 def browse_outfile() -> None:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
502 newpath: Optional[str] = tkfiledialog.asksaveasfilename()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
503 if (newpath):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
504 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
505 newpath = os.path.relpath(newpath)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
506 except:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
507 newpath = os.path.abspath(newpath)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
508 outfile_var.set(newpath)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
509
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
510 def process() -> None:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
511 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
512 command for the Process button
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
513 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
514 try:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
515 # catch all warnings
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
516 with warnings.catch_warnings(record=True) as warns:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
517 write_output(process_simpl(input_lines()))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
518 # display the warnings generated during the conversion
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
519 for w in warns:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
520 tkinter.messagebox.showwarning("Warning", str(w.message))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
521 # notify the user that the converions is finished
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
522 tkinter.messagebox.showinfo(
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
523 "Done.", "The processing has been completed")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
524 # show the ValueErrors and FileNotFoundErrors
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
525 except ValueError as ex:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
526 tkinter.messagebox.showerror("Error", str(ex))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
527 except FileNotFoundError as ex:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
528 tkinter.messagebox.showerror("Error", str(ex))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
529
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
530 def load() -> None:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
531 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
532 loads the text from the input file into the input text widget
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
533 """
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
534 filename = infile_var.get()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
535 input_text.delete('1.0', 'end')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
536 if filename and not filename.isspace():
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
537 with open(filename, encoding="utf8", errors='replace') as file:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
538 for line in file:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
539 input_text.insert('end', line)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
540
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
541 # create buttons
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
542 infile_btn = ttk.Button(mainframe, text="Browse", command=browse_infile)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
543 outfile_btn = ttk.Button(mainframe, text="Browse", command=browse_outfile)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
544 load_btn = ttk.Button(mainframe, text="Load", command=load)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
545 process_btn = ttk.Button(mainframe, text="Convert", command=process, style="ConvertButton.TButton")
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
546
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
547 # display the widgets
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
548 infile_lbl.grid(row=0, column=0, sticky='w')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
549 infile_entr.grid(row=1, column=0, sticky='we')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
550 infile_btn.grid(row=1, column=1, sticky='w')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
551
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
552 outfile_lbl.grid(row=0, column=3, sticky='w')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
553 outfile_entr.grid(row=1, column=3, sticky='we')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
554 outfile_btn.grid(row=1, column=4, sticky='w')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
555
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
556 load_btn.grid(row=2, column=0)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
557 process_btn.grid(row=2, column=2)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
558
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
559 ttk.Separator(mainframe, orient='horizontal').grid(row=3, column=0, columnspan=5, sticky='nsew', pady=20)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
560
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
561 input_frame.grid(row=4, column=0, columnspan=2)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
562 output_frame.grid(row=4, column=3, columnspan=2)
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
563
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
564 ttk.Separator(root, orient='horizontal').grid(row=1, column=0, sticky='nsew')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
565
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
566 mainframe.grid(row=2, column=0, sticky='nsew')
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
567
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
568 root.mainloop()
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
569
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
570
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
571 if '--cmd' in sys.argv:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
572 for line in process_simpl(sys.stdin):
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
573 print('\t'.join(line))
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
574 else:
ef146e4077e6 planemo upload commit 232ce39054ce38be27c436a4cabec2800e14f988-dirty
itaxotools
parents:
diff changeset
575 launch_gui()