Mercurial > repos > itaxotools > latlon_converter
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 |
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() |