99 lines
1.9 KiB
Python
99 lines
1.9 KiB
Python
import re
|
||
import math
|
||
|
||
#将弧度转换为度分秒
|
||
def rad2dms(r):
|
||
d = r * 180 / math.pi
|
||
m = (d - int(d)) * 60
|
||
d = int(d)
|
||
s = (m - int(m)) * 60
|
||
m = int(m)
|
||
return d, m, s
|
||
|
||
#将度分秒转换为弧度
|
||
def dms2rad(d, m, s):
|
||
return (d + m / 60 + s / 360) / 180 * math.pi
|
||
|
||
class string:
|
||
dtype = str
|
||
def __init__(self):
|
||
pass
|
||
def str2val(self, s):
|
||
return s
|
||
def val2str(self, v):
|
||
return v
|
||
|
||
class integer:
|
||
dtype = int
|
||
def __init__(self, fmt = "%d"):
|
||
self.fmt = fmt
|
||
def str2val(self, s):
|
||
s = s.strip()
|
||
if not s:
|
||
return None
|
||
try:
|
||
v = int(s)
|
||
except:
|
||
v = int(float(s))
|
||
return v
|
||
def val2str(self, v):
|
||
return self.fmt % v
|
||
|
||
class decimal:
|
||
dtype = float
|
||
def __init__(self, fmt = "%.3f", epsilon = 1e-4):
|
||
self.fmt = fmt
|
||
self.epsilon = epsilon
|
||
def str2val(self, s):
|
||
s = s.strip()
|
||
if not s:
|
||
return None
|
||
return float(s)
|
||
def val2str(self, v):
|
||
if abs(v) < self.epsilon:
|
||
v = 0.0
|
||
return self.fmt % v
|
||
|
||
class kdecimal:
|
||
dtype = float
|
||
def __init__(self, fmt = "%07.3f", epsilon = 1e-4):
|
||
self.fmt = fmt
|
||
self.epsilon = epsilon
|
||
def str2val(self, s):
|
||
s = s.strip()
|
||
if not s:
|
||
return None
|
||
match = re.match(r"[kK](\d+)\+(\d+(?:\.\d+)?)", s)
|
||
if match is None:
|
||
raise RuntimeError(f"pattern not matched: {s}")
|
||
a = match.group(1)
|
||
b = match.group(2)
|
||
return float(a + b)
|
||
def val2str(self, v):
|
||
a = v // 1000
|
||
b = v % 1000
|
||
if abs(b - 1000) < self.epsilon:
|
||
a += 1
|
||
b = 0.0
|
||
elif abs(b) < self.epsilon:
|
||
b = 0.0
|
||
return f"K%d+{self.fmt}" % (a, b)
|
||
|
||
class angle:
|
||
dtype = float
|
||
def __init__(self):
|
||
pass
|
||
def str2val(self, s):
|
||
s = s.strip()
|
||
if not s:
|
||
return None
|
||
match = re.match(r"(\d+)°(\d+)′(\d+(?:\.\d+)?)″", s)
|
||
if match is None:
|
||
raise RuntimeError(f"pattern not matched: {s}")
|
||
d = int(match.group(1))
|
||
m = int(match.group(2))
|
||
s = float(match.group(3))
|
||
return dms2rad(d, m, s)
|
||
def val2str(self, v):
|
||
return "%2d°%02d′%05.2f″" % rad2dms(v)
|