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)
|