def main(argv): parser = OptionParser(description='olc2002 to GPX converter') parser.add_option('-l', '--league', metavar='STRING') parser.add_option('-o', '--output', metavar='FILENAME') parser.add_option('--debug', action='store_true') parser.set_defaults(debug=False) parser.set_defaults(league='OLC') options, args = parser.parse_args(argv) # routes = [] date = None for line in fileinput.input(args[1:]): line = line.rstrip() m = DEBUG_DATE_RE.match(line) if m: day, mon, year = map(int, m.groups()) date = datetime.date(year + 2000, mon, day) continue m = OUT_TYPE_RE.match(line) if m: name = PRETTY_NAME[m.group(1)] circuit = m.group(1) in CIRCUITS route = Route(name, options.league, None, None, None, circuit, []) routes.append(route) last_time = None continue m = OUT_FLIGHT_KM_RE.match(line) if m: route.distance = float(m.group(1)) continue m = OUT_FLIGHT_POINTS_RE.match(line) if m: route.score = float(m.group(1)) route.multiplier = route.score / route.distance continue m = OUT_P_RE.match(line) if m: name = 'TP%d' % len(route.tps) if route.tps else 'Start' lat = int(m.group(5)) + float(m.group(6)) / 60.0 if m.group(4) == 'S': lat = -lat lon = int(m.group(8)) + float(m.group(9)) / 60.0 if m.group(7) == 'W': lon = -lon time = datetime.time(*map(int, m.group(1, 2, 3))) if not last_time is None and time < last_time: date += datetime.timedelta(1) dt = datetime.datetime.combine(date, time) coord = Coord(lat, lon, 0, dt) tp = Turnpoint(name, coord) route.tps.append(tp) last_time = time continue if options.debug: logging.warning(line) for route in routes: route.tps[-1].name = 'Finish' xc = XC(routes) with gpx_tag(TreeBuilder()) as tb: element = xc.build_tree(tb).close() output = open(options.output, 'w') if options.output else sys.stdout output.write('<?xml version="1.0" encoding="UTF-8"?>') ElementTree(element).write(output)
def main(argv): parser = OptionParser(description='olc2002 to GPX converter') parser.add_option('-l', '--league', metavar='STRING') parser.add_option('-o', '--output', metavar='FILENAME') parser.add_option('--debug', action='store_true') parser.set_defaults(debug=False) parser.set_defaults(league='OLC') options, args = parser.parse_args(argv) # routes = [] date = None for line in fileinput.input(args[1:]): line = line.rstrip() m = DEBUG_DATE_RE.match(line) if m: day, mon, year = map(int, m.groups()) date = datetime.date(year + 2000, mon,day) continue m = OUT_TYPE_RE.match(line) if m: name = PRETTY_NAME[m.group(1)] circuit = m.group(1) in CIRCUITS route = Route(name, options.league, None, None, None, circuit, []) routes.append(route) last_time = None continue m = OUT_FLIGHT_KM_RE.match(line) if m: route.distance = float(m.group(1)) continue m = OUT_FLIGHT_POINTS_RE.match(line) if m: route.score = float(m.group(1)) route.multiplier = route.score / route.distance continue m = OUT_P_RE.match(line) if m: name = 'TP%d' % len(route.tps) if route.tps else 'Start' lat = int(m.group(5)) + float(m.group(6)) / 60.0 if m.group(4) == 'S': lat = -lat lon = int(m.group(8)) + float(m.group(9)) / 60.0 if m.group(7) == 'W': lon = -lon time = datetime.time(*map(int, m.group(1, 2, 3))) if not last_time is None and time < last_time: date += datetime.timedelta(1) dt = datetime.datetime.combine(date, time) coord = Coord(lat, lon, 0, dt) tp = Turnpoint(name, coord) route.tps.append(tp) last_time = time continue if options.debug: logging.warning(line) for route in routes: route.tps[-1].name = 'Finish' xc = XC(routes) with gpx_tag(TreeBuilder()) as tb: element = xc.build_tree(tb).close() output = open(options.output, 'w') if options.output else sys.stdout output.write('<?xml version="1.0" encoding="UTF-8"?>') ElementTree(element).write(output)
def main(argv): parser = OptionParser(usage='Usage: %prog [options] filename.igc', description='IGC to task converter') parser.add_option('-o', '--output', metavar='FILENAME', help='set output filename') parser.add_option('-n', '--name', metavar='NAME', help='set task name') parser.add_option('-z', '--tz-offset', metavar='HOURS', type='int', help='set timezone offset') parser.add_option('--start', metavar='NAME', help='set start turnpoint') parser.add_option('--start-count', metavar='NUMBER', type='int', help='set start count') parser.add_option('--start-radius', metavar='RADIUS', type='int', help='set start radius in meters') parser.add_option('--start-time', metavar='TIME', help='set start time') parser.add_option('--ess', metavar='NAME', help='set end of speed section turnpoint') parser.add_option('--ess-count', metavar='NUMBER', type='int', help='set end of speed section count') parser.add_option('--ess-radius', metavar='RADIUS', type='int', help='set end of speed section radius in meters') parser.add_option('--goal', metavar='NAME', help='set goal turnpoint') parser.add_option('--goal-count', metavar='NUMBER', type='int', help='set goal count') parser.add_option('--goal-radius', metavar='RADIUS', type='int', help='set start radius in meters') parser.set_defaults(tz_offset=0) parser.set_defaults(start_count=0) parser.set_defaults(ess_count=0) parser.set_defaults(goal_count=0) # options, args = parser.parse_args(argv) if len(args) < 2: parser.error('no IGC file specified') if len(args) > 2: parser.error('excess arguments on command line: %s' % repr(args[2:])) # igc = IGC(open(args[1])) if not igc.c: parser.error('%s does not contain a task' % repr(argv[1])) tps = [] for c in igc.c: if c.name == 'TAKEOFF' or c.name == 'LANDING': continue m = re.match(r'([A-Z][0-9]{2})([0-9]{3})', c.name) if m: name = m.group(1) ele = 10 * int(m.group(2)) else: name = c.name ele = 0 coord = Coord(c.lat, c.lon, ele) tp = Turnpoint(name, coord) tps.append(tp) task = Task(options.name, tps) # if options.start: start = find_nth(lambda tp: tp.name == options.start, task.tps, options.start_count) if not start: parser.error('start turnpoint %s not found' % repr(options.start)) else: start = task.tps[1] if options.start_radius: start.radius = int(options.start_radius) if options.start_time: m = re.match(r'(\d+):(\d\d)\Z', options.start_time) if not m: parser.error('invalid start time %s' % repr(options.start_time)) hour, minute = map(int, m.group(1, 2)) start.coord.dt = igc.b[0].dt.replace(hour=hour, minute=minute, second=0) \ - timedelta(seconds=3600 * options.tz_offset) # if options.ess: ess = find_nth(lambda tp: tp.name == options.ess, task.tps, options.ess_count) if not ess: parser.error('end of speed section turnpoint %s not found' % repr(options.ess)) else: ess = task.tps[-2] if options.ess_radius: ess.radius = int(options.ess_radius) # if options.goal: goal = find_nth(lambda tp: tp.name == options.goal, task.tps, options.goal_count) if not goal: parser.error('goal turnpoint %s not found' % repr(options.goal)) else: goal = task.tps[-1] if options.goal_radius: goal.radius = int(options.goal_radius) # with gpx_tag(TreeBuilder()) as tb: element = task.build_tree(tb).close() output = open(options.output, 'w') if options.output else sys.stdout output.write('<?xml version="1.0" encoding="utf-8"?>\n') pretty_write(output, element)
def main(argv): parser = OptionParser( usage='Usage: %prog [options] filename.igc', description='IGC to task converter') parser.add_option('-o', '--output', metavar='FILENAME', help='set output filename') parser.add_option('-n', '--name', metavar='NAME', help='set task name') parser.add_option('-z', '--tz-offset', metavar='HOURS', type='int', help='set timezone offset') parser.add_option('--start', metavar='NAME', help='set start turnpoint') parser.add_option('--start-count', metavar='NUMBER', type='int', help='set start count') parser.add_option('--start-radius', metavar='RADIUS', type='int', help='set start radius in meters') parser.add_option('--start-time', metavar='TIME', help='set start time') parser.add_option('--ess', metavar='NAME', help='set end of speed section turnpoint') parser.add_option('--ess-count', metavar='NUMBER', type='int', help='set end of speed section count') parser.add_option('--ess-radius', metavar='RADIUS', type='int', help='set end of speed section radius in meters') parser.add_option('--goal', metavar='NAME', help='set goal turnpoint') parser.add_option('--goal-count', metavar='NUMBER', type='int', help='set goal count') parser.add_option('--goal-radius', metavar='RADIUS', type='int', help='set start radius in meters') parser.set_defaults(tz_offset=0) parser.set_defaults(start_count=0) parser.set_defaults(ess_count=0) parser.set_defaults(goal_count=0) # options, args = parser.parse_args(argv) if len(args) < 2: parser.error('no IGC file specified') if len(args) > 2: parser.error('excess arguments on command line: %s' % repr(args[2:])) # igc = IGC(open(args[1])) if not igc.c: parser.error('%s does not contain a task' % repr(argv[1])) tps = [] for c in igc.c: if c.name == 'TAKEOFF' or c.name == 'LANDING': continue m = re.match(r'([A-Z][0-9]{2})([0-9]{3})', c.name) if m: name = m.group(1) ele = 10 * int(m.group(2)) else: name = c.name ele = 0 coord = Coord(c.lat, c.lon, ele) tp = Turnpoint(name, coord) tps.append(tp) task = Task(options.name, tps) # if options.start: start = find_nth(lambda tp: tp.name == options.start, task.tps, options.start_count) if not start: parser.error('start turnpoint %s not found' % repr(options.start)) else: start = task.tps[1] if options.start_radius: start.radius = int(options.start_radius) if options.start_time: m = re.match(r'(\d+):(\d\d)\Z', options.start_time) if not m: parser.error('invalid start time %s' % repr(options.start_time)) hour, minute = map(int, m.group(1, 2)) start.coord.dt = igc.b[0].dt.replace(hour=hour, minute=minute, second=0) \ - timedelta(seconds=3600 * options.tz_offset) # if options.ess: ess = find_nth(lambda tp: tp.name == options.ess, task.tps, options.ess_count) if not ess: parser.error('end of speed section turnpoint %s not found' % repr(options.ess)) else: ess = task.tps[-2] if options.ess_radius: ess.radius = int(options.ess_radius) # if options.goal: goal = find_nth(lambda tp: tp.name == options.goal, task.tps, options.goal_count) if not goal: parser.error('goal turnpoint %s not found' % repr(options.goal)) else: goal = task.tps[-1] if options.goal_radius: goal.radius = int(options.goal_radius) # with gpx_tag(TreeBuilder()) as tb: element = task.build_tree(tb).close() output = open(options.output, 'w') if options.output else sys.stdout output.write('<?xml version="1.0" encoding="utf-8"?>\n') pretty_write(output, element)