diff --git a/core/utils.py b/core/utils.py
index 12f7615..daf48b3 100644
--- a/core/utils.py
+++ b/core/utils.py
@@ -363,7 +363,7 @@ def find_nearest_point(points, target_point):
#let raw = [[406264.72, 5278037.57, 873.53],
#first version:
#rawheights = [[406264.72, 5278037.57, 873.53],
-
+# [[406264.72, 5278037.57, 826.64], from constants.js 14 Nov 2023, i.e. 46.89m lower
rawheights = [[406264.72, 5278037.57, 873.53],
[406314.69, 5278036.50, 861.60],
[406364.66, 5278035.43, 852.51],
diff --git a/parsers/survex.py b/parsers/survex.py
index 260cc9b..070e413 100644
--- a/parsers/survex.py
+++ b/parsers/survex.py
@@ -50,8 +50,8 @@ METRESINFEET = 3.28084
UNSEENS = "_unseens.svx"
IGNOREFILES = ["dummy_file"]
-IGNOREPREFIX = ["surface", "kataster", "fixedpts", "gpx", "deprecated"]
-EXCEPTPREFIX = ["surface/terrain", "kataster/kataster-boundaries", "gpx/gpx_publish/essentials", "template", "docs", "deprecated", "subsections", "1623-and-1626-no-schoenberg-hs", "1623-and-1624-and-1626-and-1627", "1623-and-1626", "1623.svx", "1626.svx", "smk-system.svx"]
+IGNOREPREFIX = ["surface", "kataster", "gpx", "deprecated"] #"fixedpts",
+EXCEPTPREFIX = ["surface/terrain", "kataster/kataster-boundaries", "gpx/gpx_publish", "template", "docs", "deprecated", "subsections", "1623-and-1626-no-schoenberg-hs", "1623-and-1624-and-1626-and-1627", "1623-and-1626", "1623.svx", "1626.svx", "smk-system.svx"]
# ignorenoncave = [
# "caves-1623",
# "caves-1623/2007-NEU",
@@ -255,6 +255,7 @@ class LoadingSurvex:
rx_end2 = re.compile("(?i)end$")
rx_title = re.compile(r"(?i)title$")
rx_title2 = re.compile("(?i)title$")
+ rx_fix = re.compile(r"(?i)fix$")
rx_ref = re.compile(r"(?i)ref$")
rx_data = re.compile(r"(?i)data$")
rx_flags = re.compile(r"(?i)flags$")
@@ -307,6 +308,7 @@ class LoadingSurvex:
datastar = {}
flagsstar = {}
+ fixes = {}
units = "metres"
unitsfactor = None
slength = 0.0
@@ -356,7 +358,7 @@ class LoadingSurvex:
def LoadSurvexFallThrough(self, survexblock, line, cmd):
if cmd == "require":
pass # should we check survex version available for processing?
- elif cmd in ["equate", "fix", "calibrate", "cs", "export", "case", "declination", "infer", "instrument", "sd"]:
+ elif cmd in ["equate", "calibrate", "cs", "export", "case", "declination", "infer", "instrument", "sd"]:
pass # we ignore all these, which is fine.
else:
if cmd in ["include", "data", "flags", "title", "entrance", "set", "units", "alias", "ref"]:
@@ -607,6 +609,34 @@ class LoadingSurvex:
parser="survex", message=message, url=None, sb=(survexblock.survexfile.path)
)
+ def LoadSurvexFix(self, survexblock, line):
+ """*fix is a station geolocation, units depend on a previous *cs setting
+ """
+ #fixline = line.strip().replace("\t"," ").split(" ") # unpack tuples idiom in python 3
+ fixline = re.match("(?i)\s*([\w\d_\.\-]+)\s+(?:reference)?\s*([\d\.]*)\s+([\d\.]*)\s+([\d\.]*)\s*(;.*)?$", line)
+ if not fixline:
+ message = f'BAD fix regex {line.replace(" ","|")} {survexblock.survexfile.path}:{survexblock}'
+ print(self.insp + message)
+ stash_data_issue(parser="survex", message=message)
+ else:
+ name, *fixdata = fixline.groups()
+ if name in self.fixes:
+ message = f"! Duplicate *FIX: id '{line}' ({survexblock}) {survexblock.survexfile.path}"
+ print(self.insp + message)
+ stash_data_issue(parser="survex", message=message)
+
+ # do not store duplicates, they will be gpx/publish stuff
+ return
+
+ try:
+ #_, _, alt, *rest = (fixdata + [None]*4)[:4]
+ _, _, alt, comment = fixdata
+ fixid = str(survexblock)+name
+ self.fixes[fixid] = (survexblock, alt, comment)
+ except:
+ print(f'BAD fix {name}, {fixdata=}\n{line.replace(" ","|")}\n{survexblock.survexfile.path}:{survexblock}', file=sys.stderr)
+
+
def LoadSurvexEntrance(self, survexblock, line):
# Not using this
pass
@@ -1796,6 +1826,8 @@ class LoadingSurvex:
self.LoadSurvexEntrance(survexblock, args)
elif self.rx_date.match(cmd):
self.LoadSurvexDate(survexblock, args)
+ elif self.rx_fix.match(cmd):
+ self.LoadSurvexFix(survexblock, args)
elif self.rx_units.match(cmd):
self.LoadSurvexUnits(survexblock, args)
elif self.rx_team.match(cmd):
@@ -2277,8 +2309,9 @@ def FindAndLoadSurvex():
omit_scan.depthinclude = 0
fullpathtotop = str(Path(settings.SURVEX_DATA, UNSEENS))
- # copy the list to prime the next pass through the files
+ # copy the lists to prime the next pass through the files
omit_scan.svxfileslist = svx_scan.svxfileslist[:]
+
svx_scan.svxfileslist = [] # free memory
svx_scan = None # Hmm. Does this actually delete all the instance variables if they are lists, dicts etc.?
@@ -2357,13 +2390,29 @@ def FindAndLoadSurvex():
sys.stdout = stdout_orig
legsnumber = svx_load.legsnumber
+ fixnumber = len(svx_load.fixes)
mem1 = get_process_memory()
print(f" - Number of SurvexDirectories: {len(svx_load.svxprim):,}")
tf = SurvexFile.objects.all().count() - len(removals)
print(f" - Number of SurvexFiles: {tf:,}")
+ print(f" - Number of Survex *fix: {fixnumber:,}")
print(f" - Number of Survex legs: {legsnumber:,}")
+
+ for f in svx_load.fixes:
+ # why are we seeing no *fixes from fixedpts/gps18.svx etc. ? They are parsed !
+ survexblock, altitude, comment = svx_load.fixes[f]
+ if comment:
+ print(f"{a} {b} {comment}")
+ if re.match("(?i)[^s]*srtm[\s\S]*", comment.lower()):
+ print(f"{f} - {comment}")
+ else:
+ if str(f).startswith("162"):
+ print(f"{f} - {survexblock.survexfile}:{survexblock} - {altitude=}")
+
svx_load = None
+
+
return legsnumber
diff --git a/templates/stations.html b/templates/stations.html
index 36b9b98..9fa6d58 100644
--- a/templates/stations.html
+++ b/templates/stations.html
@@ -112,6 +112,13 @@ Coordinate systems in Austria are explained in:
Troggle UTM and lat./lomg. and altitude report
Troggle entrances
+