summaryrefslogtreecommitdiffstats
path: root/parsers/survex.py
diff options
context:
space:
mode:
authorSam Wenham <sam@wenhams.co.uk>2019-07-19 01:04:18 +0100
committerSam Wenham <sam@wenhams.co.uk>2019-07-19 01:04:18 +0100
commitde22b071b0749fef13ea3c53faaed1adb3191356 (patch)
treefc66284dca70014ee395f6a14f4972ef8addc3e3 /parsers/survex.py
parent08a41941f9e2b35b16548624d5070216dd933f79 (diff)
downloadtroggle-de22b071b0749fef13ea3c53faaed1adb3191356.tar.gz
troggle-de22b071b0749fef13ea3c53faaed1adb3191356.tar.bz2
troggle-de22b071b0749fef13ea3c53faaed1adb3191356.zip
Improve README
Make new style QMs from survexfiles work
Diffstat (limited to 'parsers/survex.py')
-rw-r--r--parsers/survex.py182
1 files changed, 110 insertions, 72 deletions
diff --git a/parsers/survex.py b/parsers/survex.py
index f80f9f2..d542c09 100644
--- a/parsers/survex.py
+++ b/parsers/survex.py
@@ -14,7 +14,8 @@ from datetime import datetime
line_leg_regex = re.compile(r"[\d\-+.]+$")
-def LoadSurvexLineLeg(survexblock, stardata, sline, comment):
+def LoadSurvexLineLeg(survexblock, stardata, sline, comment, cave):
+ # The try catches here need replacing as they are relativly expensive
ls = sline.lower().split()
ssfrom = survexblock.MakeSurvexStation(ls[stardata["from"]])
ssto = survexblock.MakeSurvexStation(ls[stardata["to"]])
@@ -62,7 +63,10 @@ def LoadSurvexLineLeg(survexblock, stardata, sline, comment):
assert line_leg_regex.match(lclino) and lclino != "-", ls
survexleg.compass = float(lcompass)
survexleg.clino = float(lclino)
-
+
+ if cave:
+ survexleg.cave = cave
+
# only save proper legs
survexleg.save()
@@ -94,23 +98,41 @@ regex_ref = re.compile(r'.*?ref.*?(\d+)\s*#\s*(\d+)')
regex_star = re.compile(r'\s*\*[\s,]*(\w+)\s*(.*?)\s*(?:;.*)?$')
regex_team = re.compile(r"(Insts|Notes|Tape|Dog|Useless|Pics|Helper|Disto|Consultant)\s+(.*)$(?i)")
regex_team_member = re.compile(r" and | / |, | & | \+ |^both$|^none$(?i)")
+regex_qm = re.compile(r'^\s*QM(\d)\s+?([a-dA-DxX])\s+([\w\-]+)\.(\d+)\s+(([\w\-]+)\.(\d+)|\-)\s+(.+)$')
def RecursiveLoad(survexblock, survexfile, fin, textlines):
iblankbegins = 0
text = [ ]
stardata = stardatadefault
teammembers = [ ]
-
-# uncomment to print out all files during parsing
+
+ # uncomment to print out all files during parsing
print(" - Reading file: " + survexblock.survexfile.path)
stamp = datetime.now()
lineno = 0
- while True:
- svxline = fin.readline().decode("latin1")
- if not svxline:
- print(' - Not survex')
- return
- textlines.append(svxline)
+
+ # Try to find the cave in the DB if not use the string as before
+ path_match = re.search(r"caves-(\d\d\d\d)/(\d+|\d\d\d\d-?\w+-\d+)/", survexblock.survexfile.path)
+ if path_match:
+ pos_cave = '%s-%s' % (path_match.group(1), path_match.group(2))
+ # print('Match')
+ # print(pos_cave)
+ cave = models.getCaveByReference(pos_cave)
+ if cave:
+ survexfile.cave = cave
+ svxlines = ''
+ svxlines = fin.read().splitlines()
+ # print('Cave - preloop ' + str(survexfile.cave))
+ # print(survexblock)
+ for svxline in svxlines:
+
+ # print(survexblock)
+
+ # print(svxline)
+ # if not svxline:
+ # print(' - Not survex')
+ # return
+ # textlines.append(svxline)
lineno += 1
@@ -118,7 +140,6 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
# break the line at the comment
sline, comment = regex_comment.match(svxline.strip()).groups()
-
# detect ref line pointing to the scans directory
mref = comment and regex_ref.match(comment)
if mref:
@@ -129,7 +150,52 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
#survexblock.refscandir = "%s/%s%%23%s" % (mref.group(1), mref.group(1), mref.group(2))
survexblock.save()
continue
-
+
+ # This whole section should be moved if we can have *QM become a proper survex command
+ # Spec of QM in SVX files, currently commented out need to add to survex
+ # needs to match regex_qm
+ # ;Serial number grade(A/B/C/D/X) nearest-station resolution-station description
+ # ;QM1 a hobnob_hallway_2.42 hobnob-hallway_3.42 junction of keyhole passage
+ # ;QM1 a hobnob_hallway_2.42 - junction of keyhole passage
+ qmline = comment and regex_qm.match(comment)
+ if qmline:
+ print(qmline.groups())
+ #(u'1', u'B', u'miraclemaze', u'1.17', u'-', None, u'\tcontinuation of rift')
+ qm_no = qmline.group(1)
+ qm_grade = qmline.group(2)
+ qm_from_section = qmline.group(3)
+ qm_from_station = qmline.group(4)
+ qm_resolve_section = qmline.group(6)
+ qm_resolve_station = qmline.group(7)
+ qm_notes = qmline.group(8)
+
+ print('Cave - %s' % survexfile.cave)
+ print('QM no %d' % int(qm_no))
+ print('QM grade %s' % qm_grade)
+ print('QM section %s' % qm_from_section)
+ print('QM station %s' % qm_from_station)
+ print('QM res section %s' % qm_resolve_section)
+ print('QM res station %s' % qm_resolve_station)
+ print('QM notes %s' % qm_notes)
+
+ # If the QM isn't resolved (has a resolving station) thn load it
+ if not qm_resolve_section or qm_resolve_section is not '-' or qm_resolve_section is not 'None':
+ from_section = models.SurvexBlock.objects.filter(name=qm_from_section)
+ # If we can find a section (survex note chunck, named)
+ if len(from_section) > 0:
+ print(from_section[0])
+ from_station = models.SurvexStation.objects.filter(block=from_section[0], name=qm_from_station)
+ # If we can find a from station then we have the nearest station and can import it
+ if len(from_station) > 0:
+ print(from_station[0])
+ qm = models.QM.objects.create(number=qm_no,
+ nearest_station=from_station[0],
+ grade=qm_grade.upper(),
+ location_description=qm_notes)
+ else:
+ print('QM found but resolved')
+
+ #print('Cave -sline ' + str(cave))
if not sline:
continue
@@ -137,9 +203,12 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
mstar = regex_star.match(sline)
if not mstar:
if "from" in stardata:
- LoadSurvexLineLeg(survexblock, stardata, sline, comment)
+ # print('Cave ' + str(survexfile.cave))
+ # print(survexblock)
+ LoadSurvexLineLeg(survexblock, stardata, sline, comment, survexfile.cave)
# print(' - From: ')
#print(stardata)
+ pass
elif stardata["type"] == "passage":
LoadSurvexLinePassage(survexblock, stardata, sline, comment)
# print(' - Passage: ')
@@ -156,26 +225,42 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
path_match = re.search(r"caves-(\d\d\d\d)/(\d+|\d\d\d\d-?\w+-\d+)/", includepath)
if path_match:
pos_cave = '%s-%s' % (path_match.group(1), path_match.group(2))
- print(pos_cave)
+ # print(pos_cave)
cave = models.getCaveByReference(pos_cave)
- if not cave:
- cave = survexfile.cave
+ if cave:
+ survexfile.cave = cave
else:
print('No match for %s' % includepath)
- cave = survexfile.cave
- includesurvexfile = models.SurvexFile(path=includepath, cave=cave)
+ includesurvexfile = models.SurvexFile(path=includepath)
includesurvexfile.save()
includesurvexfile.SetDirectory()
if includesurvexfile.exists():
+ survexblock.save()
fininclude = includesurvexfile.OpenFile()
RecursiveLoad(survexblock, includesurvexfile, fininclude, textlines)
elif re.match("begin$(?i)", cmd):
- if line:
+ if line:
+ newsvxpath = os.path.join(os.path.split(survexfile.path)[0], re.sub(r"\.svx$", "", line))
+ # Try to find the cave in the DB if not use the string as before
+ path_match = re.search(r"caves-(\d\d\d\d)/(\d+|\d\d\d\d-?\w+-\d+)/", newsvxpath)
+ if path_match:
+ pos_cave = '%s-%s' % (path_match.group(1), path_match.group(2))
+ print(pos_cave)
+ cave = models.getCaveByReference(pos_cave)
+ if cave:
+ survexfile.cave = cave
+ else:
+ print('No match for %s' % newsvxpath)
+
name = line.lower()
- #print(' - Begin found for: ' + name)
- survexblockdown = models.SurvexBlock(name=name, begin_char=fin.tell(), parent=survexblock, survexpath=survexblock.survexpath+"."+name, cave=survexblock.cave, survexfile=survexfile, totalleglength=0.0)
+ print(' - Begin found for: ' + name)
+ # print('Block cave: ' + str(survexfile.cave))
+ survexblockdown = models.SurvexBlock(name=name, begin_char=fin.tell(), parent=survexblock, survexpath=survexblock.survexpath+"."+name, cave=survexfile.cave, survexfile=survexfile, totalleglength=0.0)
survexblockdown.save()
+ survexblock.save()
+ survexblock = survexblockdown
+ # print(survexblockdown)
textlinesdown = [ ]
RecursiveLoad(survexblockdown, survexfile, fin, textlinesdown)
else:
@@ -222,8 +307,9 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
elif cmd == "title":
#print(' - Title found: ')
- survextitle = models.SurvexTitle(survexblock=survexblock, title=line.strip('"'), cave=survexblock.cave)
+ survextitle = models.SurvexTitle(survexblock=survexblock, title=line.strip('"'), cave=survexfile.cave)
survextitle.save()
+ pass
elif cmd == "require":
# should we check survex version available for processing?
@@ -261,37 +347,6 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
timetaken = endstamp - stamp
# print(' - Time to process: ' + str(timetaken))
-
-def ReloadSurvexCave(survex_cave, area):
- print(' - Area: ' + str(area) + ' Cave: ' + str(survex_cave))
- filt_cave = models.Cave.objects.filter(kataster_number=survex_cave, area__short_name=area)[:1]
-
- if len(filt_cave) < 1:
- filt_cave = models.Cave.objects.filter(unofficial_number=survex_cave, area__short_name=area)[:1]
-
- cave = filt_cave[0]
- print(' - ' + str(cave))
- cave.survexblock_set.all().delete()
- cave.survexfile_set.all().delete()
- cave.survexdirectory_set.all().delete()
-
- file_stamp_start = datetime.now()
- survexfile = models.SurvexFile(path="caves-" + cave.kat_area() + "/" + survex_cave + "/" + survex_cave, cave=cave)
- survexfile.save()
- survexfile.SetDirectory()
-
- survexblockroot = models.SurvexBlock(name="root", survexpath="caves-" + cave.kat_area(), begin_char=0, cave=cave, survexfile=survexfile, totalleglength=0.0)
- survexblockroot.save()
- fin = survexfile.OpenFile()
- file_stamp_end = datetime.now()
- file_time = file_stamp_end - file_stamp_start
- print(' - Files time to process: ' + str(file_time))
- textlines = [ ]
- RecursiveLoad(survexblockroot, survexfile, fin, textlines)
- survexblockroot.text = "".join(textlines)
- survexblockroot.save()
-
-
def LoadAllSurvexBlocks():
print('Loading All Survex Blocks...')
@@ -316,30 +371,13 @@ def LoadAllSurvexBlocks():
survexblockroot.save()
fin = survexfile.OpenFile()
textlines = [ ]
+ # The real work starts here
RecursiveLoad(survexblockroot, survexfile, fin, textlines)
+ fin.close()
survexblockroot.text = "".join(textlines)
survexblockroot.save()
- #Load each cave,
- #FIXME this should be dealt with load all above
- print(" - Reloading all caves")
- caves = models.Cave.objects.all()
- for cave in caves:
- rec_stamp_start = datetime.now()
- if cave.kataster_number and os.path.isdir(os.path.join(settings.SURVEX_DATA, "caves-" + cave.kat_area(), cave.kataster_number)):
- if cave.kataster_number not in ['40']:
- print(" - Loading " + str(cave) + " " + cave.kat_area())
- #ReloadSurvexCave(cave.kataster_number, cave.kat_area())
- rec_stamp_end = datetime.now()
- if cave.unofficial_number and os.path.isdir(os.path.join(settings.SURVEX_DATA, "caves-" + cave.kat_area(), cave.unofficial_number)):
- print(" - Loading " + str(cave) + " " + cave.kat_area())
- #ReloadSurvexCave(cave.unofficial_number, cave.kat_area())
- timetaken = rec_stamp_end - rec_stamp_start
- # print(' - Time to process: ' + str(timetaken))
- # print('--------')
-
-
poslineregex = re.compile(r"^\(\s*([+-]?\d*\.\d*),\s*([+-]?\d*\.\d*),\s*([+-]?\d*\.\d*)\s*\)\s*([^\s]+)$")