Skip to content

Commit

Permalink
Both .CUP and .DAT files work now
Browse files Browse the repository at this point in the history
  • Loading branch information
Frank Paynter authored and Frank Paynter committed Dec 21, 2024
1 parent 85ef006 commit 4679ad9
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 26 deletions.
10 changes: 5 additions & 5 deletions lib/xcsoar/mapgen/server/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,12 @@ def too_many_requests(self):
@cherrypy.expose
@view.output("index.html")
def index(self, **params):
cherrypy.log('At the top of the index.html function, with params = %s' % params)
# cherrypy.log('At the top of the index.html function, with params = %s' % params)
if cherrypy.request.method != "POST":
return view.render()

name = params["name"].strip()
cherrypy.log('params: name = %s, mail = %s, detail = %s' % (name, params["mail"], params["level_of_detail"]))
# cherrypy.log('params: name = %s, mail = %s, detail = %s' % (name, params["mail"], params["level_of_detail"]))

if name == "":
return view.render(error="No map name given!") | HTMLFormFiller(data=params)
Expand All @@ -86,8 +86,8 @@ def index(self, **params):

selection = params["selection"]
waypoint_file = params["waypoint_file"]
cherrypy.log('waypoint_file = %s, waypoint_filename = %s, selection = %s' % (waypoint_file.file, waypoint_file.filename, selection))
cherrypy.log('waypoint_file = %s' % waypoint_file.file)
# cherrypy.log('waypoint_file = %s, waypoint_filename = %s, selection = %s' % (waypoint_file.file, waypoint_file.filename, selection))
# cherrypy.log('waypoint_file = %s' % waypoint_file.file)

#gfp added to determine 'waypoint_file' type
# cherrypy.log('displaying lines from waypoint_file.file')
Expand All @@ -104,7 +104,7 @@ def index(self, **params):

try:
filename = waypoint_file.filename.lower()
cherrypy.log('in TRY block filename = %s' % filename)
# cherrypy.log('in TRY block filename = %s' % filename)

if not filename.endswith(".dat") and (
filename.endswith(".dat") or not filename.endswith(".cup")
Expand Down
2 changes: 2 additions & 0 deletions lib/xcsoar/mapgen/server/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def wrapper(*args, **kwargs):


def render(*args, **kwargs):
cherrypy.log(f'In render(): args = {args}, kwargs = {kwargs}')
"""Function to render the given data to the template specified via the
``@output`` decorator.
"""
Expand All @@ -41,6 +42,7 @@ def render(*args, **kwargs):
template = loader.load(args[0])
else:
template = cherrypy.thread_data.template

ctxt = Context(url=cherrypy.url)
ctxt.push(kwargs)
return template.generate(ctxt)
2 changes: 1 addition & 1 deletion lib/xcsoar/mapgen/server/views/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
<div id="map"/>
<em class="note">Draw the map bounds rectangle by clicking in the map.</em>
<hr/>
<label class="left" for="left">Minimum Longitude:</label><input id="left" type="text" name="left"/><br/>
<label class="left" for="left">Minimum Longitude:</label><input id="left" type="text" name="left" value="43"/><br/>
<label class="left" for="right">Maximum Longitude:</label><input id="right" type="text" name="right"/><br/>
<label class="left" for="bottom">Minimum Latitude:</label><input id="bottom" type="text" name="bottom"/><br/>
<label class="left" for="top">Maximum Latitude:</label><input id="top" type="text" name="top"/><br/>
Expand Down
4 changes: 2 additions & 2 deletions lib/xcsoar/mapgen/waypoints/list.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,13 @@ def extend(self, wp_list):
def get_bounds(self, offset_distance=15.0):
rc = GeoRect(180, -180, -90, 90)
for wp in self.__list:
cherrypy.log(f'In list.py: {wp.name}, lat: {wp.lat:.3f}, lon: {wp.lon:.3f}')
# cherrypy.log(f'In list.py: {wp.name}, lat: {wp.lat:.3f}, lon: {wp.lon:.3f}')
rc.left = min(rc.left, wp.lon)
rc.right = max(rc.right, wp.lon)
rc.top = max(rc.top, wp.lat)
rc.bottom = min(rc.bottom, wp.lat)

rc.expand(offset_distance)
cherrypy.log(f'In list.py - final rc: left {rc.left:.3f}, right: {rc.right:.3f}, top: {rc.top:.3f}, bot {rc.bottom:.3f}')
# cherrypy.log(f'In list.py - final rc: left {rc.left:.3f}, right: {rc.right:.3f}, top: {rc.top:.3f}, bot {rc.bottom:.3f}')

return rc
9 changes: 4 additions & 5 deletions lib/xcsoar/mapgen/waypoints/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#cherrypy.log(data.decode('utf-8'))

def parse_waypoint_file(filename, file=None):
cherrypy.log('in parse_waypoint_file: filename = %s' % filename)
# cherrypy.log('in parse_waypoint_file: filename = %s' % filename)
lines = 0 #gfp added so 'lines' object stays in scope
if not file:
cherrypy.log('in parse_waypoint_file: if not file block with filename = %s' % filename)
Expand All @@ -24,13 +24,12 @@ def parse_waypoint_file(filename, file=None):
# cherrypy.log('line%s: %s' % (wpnum, decoded_line))

if filename.lower().endswith(".xcw") or filename.lower().endswith(".dat"):
return parse_winpilot_waypoints(file)
return parse_winpilot_waypoints(lines)
elif filename.lower().endswith(".cup"):
cherrypy.log('in parse_waypoint_file filename.lower().endswith(".cup"): filename = %s' % filename)
#return parse_seeyou_waypoints(file)
# cherrypy.log('in parse_waypoint_file filename.lower().endswith(".cup"): filename = %s' % filename)
return parse_seeyou_waypoints(lines)#241207 gfp bugfix:
else:
cherrypy.log('in parse_waypoint_file ELSE block: filename = %s' % filename)
# cherrypy.log('in parse_waypoint_file ELSE block: filename = %s' % filename)

raise RuntimeError(
"Waypoint file {} has an unsupported format.".format(filename)
Expand Down
11 changes: 6 additions & 5 deletions lib/xcsoar/mapgen/waypoints/seeyou_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ def __next__(self):


def __parse_altitude(str):
# cherrypy.log(f'in parse_altitude({str})')
str = str.lower()
if str.endswith("ft") or str.endswith("f"):
str = str.rstrip("ft")
Expand Down Expand Up @@ -77,7 +78,7 @@ def __parse_length(str):

def parse_seeyou_waypoints(lines, bounds=None):
waypoint_list = WaypointList()
cherrypy.log('in parse_seeyou_waypoints function:')
# cherrypy.log('in parse_seeyou_waypoints function:')

#gfp 241210: modified to wait for header line before processing
#gfp 241210: added 'ISO-8859-2' decoding for correct cherrypy logging display
Expand All @@ -95,8 +96,6 @@ def parse_seeyou_waypoints(lines, bounds=None):
wpnum = wpnum + 1
line = byteline.decode('ISO-8859-2') #gfp 241210: added 'ISO-8859-2' decoding for correct cherrypy logging display
line = line.strip()
if line == "name,code,country,lat,lon,elev,style,rwdir,rwlen,freq,desc":
continue

# cherrypy.log('in for loop: wpnum = %s line = %s' %(wpnum, line))
# cherrypy.log(f'for loop row {wpnum}: {line}')
Expand All @@ -106,11 +105,10 @@ def parse_seeyou_waypoints(lines, bounds=None):
continue

if header in line:
cherrypy.log(f'header line found at row {wpnum}: {line}')
# cherrypy.log(f'header line found at row {wpnum}: {line}')
continue #skip to next line (first waypoint line)

if line == "-----Related Tasks-----":
cherrypy.log('In -----Related Tasks----: line = %s' % line)
break

# cherrypy.log('in for loop before line = __CSVLine(line): wpnum = %s' %wpnum)
Expand Down Expand Up @@ -182,3 +180,6 @@ def parse_seeyou_waypoints(lines, bounds=None):


return waypoint_list


return waypoint_list
77 changes: 69 additions & 8 deletions lib/xcsoar/mapgen/waypoints/winpilot_reader.py
Original file line number Diff line number Diff line change
@@ -1,58 +1,119 @@
# -*- coding: utf-8 -*-
from xcsoar.mapgen.waypoints.waypoint import Waypoint
from xcsoar.mapgen.waypoints.list import WaypointList

import cherrypy

def __parse_altitude(str):
cherrypy.log(f'parse_altitude({str})')
str = str.lower()
if str.endswith("ft") or str.endswith("f"):
str = str.rstrip("ft")
return int(str) * 0.3048
else:
str = str.rstrip("m")
return int(str)
cherrypy.log(f'parse_altitude:str = {str})')
float_alt = float(str)
cherrypy.log(f'parse_altitude:float_alt = {float_alt})')
int_alt = int(float_alt)
cherrypy.log(f'parse_altitude:int_alt = {int_alt})')

return int(int_alt)


#Winpilot .DAT file lat/lon formats
# Latitude, Longitude: in one of the following formats (ss=seconds, dd = decimals):
# dd:mm:ss (for example: 36:15:20N)
# dd:mm.d (for example: 36:15.3N)
# dd:mm.dd (for example: 36:15.33N)
# dd:mm.ddd (for example: 36:15.333N)
def __parse_coordinate(str):
cherrypy.log(f'winpilot parse_coordinate({str})')

str = str.lower()
negative = str.endswith("s") or str.endswith("w")
str = str.rstrip("sw") if negative else str.rstrip("ne")

str = str.split(":")
if len(str) < 2:
cherrypy.log(f'parse_coordinate before str.split: str = {str}')

# str = str.split(":")
# if len(str) < 2:
# return None

# if len(str) == 2:
# # degrees + minutes / 60
# a = int(str[0]) + float(str[1]) / 60

# if len(str) == 3:
# # degrees + minutes / 60 + seconds / 3600
# a = int(str[0]) + float(str[1]) / 60 + float(str[2]) / 3600
strsplit = str.split(":")
cherrypy.log(f'parse_coordinate after str.split into {len(strsplit)} elements')
if len(strsplit) < 2:
return None

if len(str) == 2:
if len(strsplit) == 2:
cherrypy.log(f'parse_coordinate in 2 element block')
# degrees + minutes / 60
a = int(str[0]) + float(str[1]) / 60
a = int(strsplit[0]) + float(strsplit[1]) / 60
cherrypy.log(f'parse_coordinate in 2 element block: a = {a}')

if len(str) == 3:
if len(strsplit) == 3:
cherrypy.log(f'parse_coordinate in 3 element block')
# degrees + minutes / 60 + seconds / 3600
a = int(str[0]) + float(str[1]) / 60 + float(str[2]) / 3600
cherrypy.log(f'parse_coordinate in 3 element block: a = {a}')

if negative:
a *= -1

cherrypy.log(f'parse_coordinate just before return with a = {a}')

return a


def parse_winpilot_waypoints(lines):
cherrypy.log('in parse_winpilot_waypoints function:')

waypoint_list = WaypointList()
wpnum = 0
for byteline in lines:
wpnum += 1
# cherrypy.log(f'winpilot line {wpnum}: {byteline}')

for line in lines:
line = byteline.decode('ISO-8859-2') #gfp 241210: added 'ISO-8859-2' decoding for correct cherrypy logging display
line = line.strip()
if line == "" or line.startswith("*"):
continue
cherrypy.log(f'winpilot line {wpnum}: {line}')

fields = line.split(",")
cherrypy.log(f'winpilot line {wpnum}: fields = {fields}')
cherrypy.log(f'winpilot line {wpnum}: line splits into {len(fields)} fields')
if len(fields) < 6:
continue



fieldnum = 0
for field in fields:
cherrypy.log(f'field {fieldnum} = {field}')
fieldnum += 1

wp = Waypoint()
wp.lat = __parse_coordinate(fields[1])
cherrypy.log(f'waypoint {wpnum}: wp.lat = {wp.lat:.3f}')
wp.lon = __parse_coordinate(fields[2])
cherrypy.log(f'waypoint {wpnum}: wp.lon = {wp.lon:.3f}')
wp.altitude = __parse_altitude(fields[3])
cherrypy.log(f'waypoint {wpnum}: wp.alt = {wp.altitude}')
wp.name = fields[5].strip()
cherrypy.log(f'waypoint {wpnum}: wp.name = {wp.name}')

# cherrypy.log(f'waypoint {wpnum}: {wp.name}, {wp.lat:.3f}, {wp.lon:.3f}')
cherrypy.log(f'waypoint {wpnum}: wp.name = {wp.name}')

waypoint_list.append(wp)



return waypoint_list

0 comments on commit 4679ad9

Please sign in to comment.