def test_route_optimize(): from fplan.config.environment import load_environment from fplan.model import meta from fplan.model import Waypoint,Route,Trip,User,Aircraft import sqlalchemy as sa from pylons import config # meta.Session.query(User).filter(User.user==u'testuser') u=User(u'testuser',u'password') meta.Session.add(u) meta.Session.flush(); ac=Aircraft(u'testuser',u'eurocub') ac.adv_cruise_speed= (75,75,75,76,76, 75,74,73,72,71) ac.adv_climb_speed= (60,60,60,60,61, 61,61,62,63,64) ac.adv_descent_speed= (80,80,81,81,82, 82,83,84,85,86) ac.adv_climb_rate= (750,700,650,600,550, 500,450,300,200,000) ac.adv_descent_rate= (500,500,500,500,525, 525,550,550,575,600) ac.adv_cruise_burn= (16,16,16,16,15.5, 15.25,15.0,14.75,14.5,14.0) ac.adv_climb_burn= (20,20,20,20,19, 19,18,17,15,14.0) ac.adv_descent_burn= (14,14,14,14,14, 14,14,14,14,13.5) ac.advanced_model=True meta.Session.add(ac) meta.Session.flush(); trip=Trip(u"testuser",u"mytrip",u'eurocub') meta.Session.add(trip) meta.Session.flush(); wp1=Waypoint(u'testuser',u'mytrip','56,14',0,100,u'bromma') wp2=Waypoint(u'testuser',u'mytrip','58,14',1,101,u'arlanda') wp3=Waypoint(u'testuser',u'mytrip','59,14',2,102,u'gävle') wp4=Waypoint(u'testuser',u'mytrip','60,14',3,103,u'norr') wp5=Waypoint(u'testuser',u'mytrip','60.01,14',4,104,u'norr2') meta.Session.add(wp1) meta.Session.add(wp2) meta.Session.add(wp3) meta.Session.add(wp4) meta.Session.add(wp5) meta.Session.flush(); rt1=Route(u'testuser',u'mytrip',0,1) rt1.altitude="0" rt2=Route(u'testuser',u'mytrip',1,2) rt2.altitude="0" rt3=Route(u'testuser',u'mytrip',2,3) rt3.altitude="0" rt4=Route(u'testuser',u'mytrip',3,4) rt4.altitude="0" for s in [wp1,wp2,wp3,wp4,rt1,rt2,rt3,rt4]: meta.Session.add(s) meta.Session.flush() tripobj=meta.Session.query(Trip).filter(sa.and_( Trip.user==u'testuser',Trip.trip==u'mytrip')).one() print "Got tripobj",tripobj class Temp(object): pass res,routes=calc.get_optimized(u'testuser',u'mytrip','fuel') print [r.altitude for r in routes]
def upload_track(self): print "In upload", request.params.get("gpstrack", None) if 'asplan' in request.params: t = request.params.get("gpstrack", None) orderint = 0 curid = 100 tripsharing.cancel() tripname, waypoints = parse_gpx_fplan(t.value) tripname = self.get_free_tripname(tripname) trip = Trip(tripuser(), tripname) meta.Session.add(trip) meta.Session.flush() out = [] for waypoint in waypoints: name = waypoint['name'] pos = waypoint['pos'] alt = waypoint['alt'] waypoint = Waypoint(tripuser(), trip.trip, pos, curid, orderint, name, alt) meta.Session.add(waypoint) out.append(waypoint) orderint += 1 curid += 1 for w1, w2 in zip(out, out[1:]): r = Route(tripuser(), trip.trip, w1.id, w2.id, altitude=str(w2.altitude)) meta.Session.add(r) acs = meta.Session.query(Aircraft).filter( sa.and_(Aircraft.user == tripuser())).all() if len(acs): trip.aircraft = acs[0].aircraft session['current_trip'] = tripname session.save() meta.Session.commit() redirect( h.url_for(controller='mapview', action="zoom", zoom='auto')) return t = request.params.get("gpstrack", None) if t != None: if len(t.value) > 30000000: redirect( h.url_for(controller='error', action="document", message="GPX file is too large.")) session['showtrack'] = parse_gpx(t.value, request.params.get('start'), request.params.get('end')) session['showarea'] = '' session['showarea_id'] = '' session.save() redirect(h.url_for(controller='mapview', action="zoom", zoom='auto'))
def get_user_trips(user): users = meta.Session.query(User).filter(User.user == user).all() if len(users) == 0: return [] user, = users trips = meta.Session.query(Trip).filter( sa.and_(Trip.user == user.user)).order_by(Trip.trip).all() out = [] for trip in trips: meta.Session.flush() try: #print "Processing trip",trip.trip tripobj = dict() tripobj['name'] = trip.trip tripobj['aircraft'] = trip.aircraft actypes = list( meta.Session.query(Aircraft).filter( Aircraft.aircraft == trip.aircraft).all()) if len(actypes) == 0: tripobj['atsradiotype'] = '?' else: tripobj['atsradiotype'] = actypes[0].atsradiotype waypoints = [] def eitherf(x, fallback): try: if x == None: return fallback return float(x) except Exception: return 0.0 def da(x): try: if x == None: return datetime(1970, 1, 1) if type(x) == datetime: return x return datetime(1970, 1, 1) except Exception: return datetime(1970, 1, 1) def f(x): try: if x == None: return 0.0 return float(x) except Exception: return 0.0 def i(x): try: if x == None: return 0 return int(x) except Exception: return 0 def s(x): try: if x == None: return "" if type(x) == unicode: return x return unicode(x, 'utf8') except Exception: return "" def add_wp(name, pos, startalt, endalt, winddir, windvel, gs, what, legpart, lastsub, d, tas, land_at_end, endfuel, fuelburn, depart_dt, arrive_dt, altitude): assert depart_dt == None or type(depart_dt) == datetime assert type(pos[0]) in [float, int] assert type(pos[1]) in [float, int] d = dict(lat=pos[0], lon=pos[1], name=name, startalt=f(startalt), endalt=f(endalt), winddir=f(winddir), windvel=f(windvel), gs=eitherf(gs, 75), what=s(what), legpart=s(legpart), lastsub=i(lastsub), d=f(d), tas=eitherf(tas, 75), land_at_end=i(land_at_end), endfuel=f(endfuel), fuelburn=f(fuelburn), depart_dt=da(depart_dt), arrive_dt=da(arrive_dt), altitude=s(altitude)) waypoints.append(d) try: rts, dummy = calc_route_info.get_route(user.user, trip.trip) except Exception: print traceback.format_exc() wpy = list( meta.Session.query(Waypoint).filter( sa.and_(Waypoint.user == user.user, Waypoint.trip == trip.trip)).order_by( Waypoint.ordering).all()) rts = [] for wp1, wp2 in zip(wpy, wpy[1:]): trts = meta.Session.query(Route).filter( sa.and_(Route.user == user.user, Route.trip == trip.trip, Route.waypoint1 == wp1.id, Route.waypoint2 == wp2.id)).all() dummy, d = mapper.bearing_and_distance(wp1.pos, wp2.pos) if len(trts) == 0: rts.append( Route(user=user.user, trip=trip.trip, waypoint1=wp1.id, waypoint2=wp2.id, winddir=None, windvel=None, tas=None, variation=None, altitude="1500")) else: rts.append(trts[0]) if len(rts): rt0 = rts[0] add_wp(rt0.a.waypoint, mapper.from_str(rt0.a.pos), 1500, 1500, rt0.winddir, rt0.windvel, 0, "start", "start", 1, 0, rt0.tas, False, 0, 0, None, None, rt0.altitude) del rt0 for rt in rts: land_at_end = not not (rt.b.stay) #print "Land at end of leg:",rt.b.waypoint,":",land_at_end dummy, d = mapper.bearing_and_distance( rt.a.pos, rt.b.pos) add_wp(rt.a.waypoint, mapper.from_str(rt.a.pos), 1500, 1500, rt.winddir, rt.windvel, 0, "cruise", "mid", 1, d, rt.tas, land_at_end, 0, 0, None, None, rt.altitude) else: if len(rts): rt0 = rts[0] try: startfuel = rt0.accum_fuel_left + rt0.fuel_burn except Exception: startfuel = None print "Startfuel:", startfuel add_wp(rt0.a.waypoint, rt0.startpos, rt0.startalt, rt0.endalt, rt0.winddir, rt0.windvel, rt0.gs, "start", "start", 1, 0, rt0.tas, False, startfuel, 0, rt0.depart_dt, rt0.depart_dt, rt0.altitude) del rt0 for rt in rts: land_at_end = not not (rt.b.stay and rt.lastsub) #print "Land at end of leg:",rt.b.waypoint,":",land_at_end add_wp(rt.b.waypoint, rt.endpos, rt.startalt, rt.endalt, rt.winddir, rt.windvel, rt.gs, rt.what, rt.legpart, rt.lastsub, rt.d, rt.tas, land_at_end, rt.accum_fuel_left, rt.fuel_burn, rt.depart_dt, rt.arrive_dt, rt.altitude) tripobj['waypoints'] = waypoints except Exception: print "While processing trip", trip.trip, ":", traceback.format_exc( ) continue out.append(tripobj) return out
def trip_actions(self): #print "trip actions:",request.params if request.params.get('addtripname', None): tripsharing.cancel() tripname = self.get_free_tripname(request.params['addtripname']) trip = Trip(tripuser(), tripname) acs = meta.Session.query(Aircraft).filter( sa.and_(Aircraft.user == tripuser())).all() if len(acs): trip.aircraft = acs[0].aircraft print "Adding trip:", trip meta.Session.add(trip) session['current_trip'] = tripname session.save() if request.params.get('opentripname', None): tripsharing.cancel() tripname = request.params['opentripname'] if meta.Session.query(Trip).filter( sa.and_(Trip.user == tripuser(), Trip.trip == tripname)).count(): session['current_trip'] = tripname session.save() if request.params.get('reversetripname', None): tripsharing.cancel() username = tripuser() print "Reversing" tripname = request.params['reversetripname'] wps = list( meta.Session.query(Waypoint).filter( sa.and_(Waypoint.user == username, Waypoint.trip == tripname)).order_by( Waypoint.ordering).all()) if len(wps): maxord = max([wp.ordering for wp in wps]) for wp in wps: wp.ordering = maxord + 1 - wp.ordering print "Reversed order of", wp.waypoint, " = ", wp.ordering meta.Session.add(wp) firststays = meta.Session.query(Stay).filter( sa.and_(Stay.user == username, Stay.trip == tripname, Stay.waypoint_id == wps[0].id)).all() if len(firststays) == 1: stay, = firststays stay.waypoint_id = wps[-1].id if request.params.get('copytripname', None): tripsharing.cancel() tripobj = meta.Session.query(Trip).filter( sa.and_(Trip.user == tripuser(), Trip.trip == request.params['copytripname'])).first() newtripname = self.get_free_tripname(tripobj.trip + "(copy)") trip = Trip(tripuser(), newtripname) meta.Session.add(trip) acs = meta.Session.query(Aircraft).filter( sa.and_(Aircraft.user == tripuser(), Aircraft.aircraft == tripobj.aircraft)).all() if len(acs): trip.aircraft = acs[0].aircraft for origwp in meta.Session.query(Waypoint).filter( sa.and_(Waypoint.user == tripuser(), Waypoint.trip == tripobj.trip)).all(): wp = Waypoint(user=origwp.user, trip=newtripname, pos=origwp.pos, id_=origwp.id, ordering=origwp.ordering, waypoint=origwp.waypoint, altitude=origwp.altitude) meta.Session.add(wp) for origrt in meta.Session.query(Route).filter( sa.and_(Route.user == tripuser(), Route.trip == tripobj.trip)).all(): rt = Route(user=origrt.user, trip=newtripname, waypoint1=origrt.waypoint1, waypoint2=origrt.waypoint2, tas=origrt.tas, winddir=origrt.winddir, windvel=origrt.windvel, variation=origrt.variation) meta.Session.add(rt) for origstay in meta.Session.query(Stay).filter( sa.and_(Stay.user == tripuser(), Stay.trip == tripobj.trip)).all(): stay = Stay(user=origstay.user, trip=newtripname, waypoint_id=origstay.waypoint_id, fuel=origstay.fuel, date_of_flight=origstay.date_of_flight, departure_time=origstay.departure_time, nr_persons=origstay.nr_persons, fueladjust=origstay.fueladjust) meta.Session.add(stay) print "Adding trip:", trip session['current_trip'] = newtripname session.save() if request.params.get('deletetripname', None) and not tripsharing.sharing_active(): meta.Session.query(Trip).filter( sa.and_( Trip.user == tripuser(), Trip.trip == request.params['deletetripname'])).delete() del session['current_trip'] session.save() meta.Session.flush() meta.Session.commit() redirect(h.url_for(controller='mapview', action="index"))
def save(self): try: if 'pos' in request.params and 'zoomlevel' in request.params: save_merc_x, save_merc_y = [ int(x) for x in request.params['pos'].split(",") ] save_zoom = int(request.params['zoomlevel']) pos = mapper.merc2latlon((save_merc_x, save_merc_y), save_zoom) self.set_pos_zoom(pos, save_zoom) wps = self.get_waypoints(request.params) oldname = request.params.get('oldtripname', '') tripname = request.params.get('tripname', '') if tripsharing.sharing_active(): #Can't rename trips while tripsharing is active! tripname = session['current_trip'] if oldname != session['current_trip']: #In some strange way a non-tripsharing oldname appeared in the post. This #means that something has gone awry. Don't save! print "Bad trip oldname while tripsharing active!" return "notok" if 'showarea' in request.params and request.params['showarea']: sha = request.params['showarea'] if (sha == '.'): session['showarea'] = '' session['showarea_id'] = '' session['showtrack'] = None else: session['showarea'] = sha session['showarea_id'] = md5( sha.encode('utf8')).hexdigest() session['showtrack'] = None session['mapvariant'] = request.params.get('mapvariant', 'airspace') #print "Req:",request.params oldtrip = None if not oldname.strip(): oldname = tripname oldtrips = meta.Session.query(Trip).filter( sa.and_(Trip.user == tripuser(), Trip.trip == oldname)).all() if len(oldtrips) == 1: oldtrip = oldtrips[0] if oldtrip: trip = oldtrip if trip.trip != tripname: if tripsharing.sharing_active(): #attempt to rename someone elses trip! Can't be allowed! set tripname to old name print "Attempt to rename trip while viewing shared trip (tripsharing)" return "notok" else: trip.trip = self.get_free_tripname(tripname) if session[ 'current_trip'] != trip.trip and tripsharing.sharing_active( ): #internal error if we get here - the earlier test for current_trip not changing failed. print "Unexpected tripsharing error #2" return "notok" session['current_trip'] = trip.trip else: if tripsharing.sharing_active(): #we use sharing, but the shared trip can't be found! print "Tripsharing active, but named trip didn't exist (deleted, probably)" return "notok" tripname = self.get_free_tripname(tripname) trip = Trip(tripuser(), tripname) acs = meta.Session.query(Aircraft).filter( sa.and_(Aircraft.user == tripuser())).all() if len(acs): trip.aircraft = acs[0].aircraft meta.Session.add(trip) session['current_trip'] = tripname oldwps = set([(wp.id) for wp in meta.Session.query(Waypoint).filter( sa.and_(Waypoint.user == tripuser(), Waypoint.trip == trip.trip)).all()]) newwps = set(wps.keys()) #print "NEW WPS",wps removed = oldwps.difference(newwps) added = newwps.difference(oldwps) updated = newwps.intersection(oldwps) print "Removed: ", removed addedwps = added removedwps = removed updatedwps = updated ordering2wpid = dict() for remord in removed: meta.Session.query(Waypoint).filter( sa.and_(Waypoint.user == tripuser(), Waypoint.trip == trip.trip, Waypoint.id == remord)).delete() #print "\n\n====DELETING!=====\n%s\n\n"%(rem,) resultant_by_order = dict() resultant_id2order = dict() waypointlink = dict() for add in added: wp = wps[add] waypoint = Waypoint(tripuser(), trip.trip, wp['pos'], int(wp['id']), int(wp['ordering']), wp['name'], wp['altitude']) resultant_by_order[int(wp['ordering'])] = waypoint resultant_id2order[int(wp['id'])] = wp['ordering'] #print "\n\n====ADDING!=====\n%s %s %s\n\n"%(waypoint.id,waypoint.pos,waypoint.waypoint) meta.Session.add(waypoint) for upd in updated: wp = wps[upd] us = meta.Session.query(Waypoint).filter( sa.and_(Waypoint.user == tripuser(), Waypoint.trip == trip.trip, Waypoint.id == upd)).all() if len(us) > 0: u = us[0] prevpos = mapper.from_str(u.pos) newpos = mapper.from_str(wp['pos']) approxdist = (prevpos[0] - newpos[0])**2 + (prevpos[1] - newpos[1])**2 if approxdist > ( 1.0 / 36000.0 )**2: #if moved more than 0.1 arc-second, otherwise leave be. u.pos = wp['pos'] print "Waypoint %d moved! (%f deg)" % ( u.id, math.sqrt(approxdist)) else: print "Waypoint %d has only moved a little (%f deg)" % ( u.id, math.sqrt(approxdist)) u.waypoint = wp['name'] assert u.id == int(wp['id']) u.ordering = wp['ordering'] u.altitude = wp['altitude'] resultant_by_order[int(wp['ordering'])] = u resultant_id2order[int(wp['id'])] = wp['ordering'] #print "\n\n====UPDATING!=====\n%s %s %s\n\n"%(u.id,u.pos,u.waypoint) #print "Resultant by ordering: %s"%(resultant_by_order,) seq = list(sorted(resultant_by_order.items())) newroutes = set() for (ord1, waypoint1), (ord2, waypoint2) in zip(seq[:-1], seq[1:]): if not int(ord1) + 1 == int(ord2): print "Waypoints %s and %s not consecutive (#%d, #%d)" % ( waypoint1, waypoint2, int(ord1), int(ord2)) assert int(ord1) + 1 == int(ord2) newroutes.add((waypoint1.id, waypoint2.id)) oldrouteobjs = list( meta.Session.query(Route).filter( sa.and_(Route.user == tripuser(), Route.trip == trip.trip)).all()) oldroutes = set([(route.waypoint1, route.waypoint2) for route in oldrouteobjs]) prevalts = dict() for rt in oldrouteobjs: prevalts[(rt.a.id, +1)] = rt.altitude prevalts[(rt.b.id, -1)] = rt.altitude #Routes: removed = oldroutes.difference(newroutes) added = newroutes.difference(oldroutes) updated = newroutes.intersection(oldroutes) print "Removed routes:", removed print "Added routes:", added print "Kept routes: ", updated for rem1, rem2 in removed: meta.Session.query(Route).filter( sa.and_(Route.user == tripuser(), Route.trip == trip.trip, Route.waypoint1 == rem1, Route.waypoint2 == rem2)).delete() sel_acs = meta.Session.query(Aircraft).filter( sa.and_(Aircraft.aircraft == trip.aircraft, Aircraft.user == tripuser())).all() if len(sel_acs): tas = sel_acs[0].cruise_speed else: tas = 75 for a1, a2 in added: cruisealt = "" a = None if a1 in addedwps: startord = resultant_id2order.get(int(a1), 0) elif a2 in addedwps: startord = resultant_id2order.get(int(a2), 0) else: startord = resultant_id2order.get(int(a1), 0) print "Ordering of new wp: %d is %d" % (a1, startord) num_waypoints = len(resultant_by_order) def searchpattern(begin, num): assert begin >= 0 and begin < num down = begin - 1 up = begin + 1 while True: work = False if down >= 0: yield down down -= 1 work = True if up < num: yield up up += 1 work = True if not work: break for wpord in searchpattern(startord, num_waypoints): wp = resultant_by_order.get(wpord, None) print "Searchpattern visiting order: %d" % (wpord, ) if wp: if wpord < startord: cruisealt = prevalts.get((wp.id, +1), '') print "Looking for alt previously after wp %d, got: %s" % ( wp.id, cruisealt) else: cruisealt = prevalts.get((wp.id, -1), '') print "Looking for alt previously before wp %d, got: %s" % ( wp.id, cruisealt) if cruisealt != "": break if cruisealt == "": cruisealt = "1500" r = Route(tripuser(), trip.trip, a1, a2, 0, 0, tas, None, cruisealt) meta.Session.add(r) session.save() meta.Session.flush() meta.Session.commit() ret = json.dumps([tripname]) print "mapview returning json:", ret return ret except Exception, cause: #print line number and stuff as well print cause #TODO: ONLY FOR TESTING!!!! raise return "notok"
def test_adv_route_info(): from fplan.config.environment import load_environment from fplan.model import meta from fplan.model import Waypoint, Route, Trip, User, Aircraft import sqlalchemy as sa from pylons import config # meta.Session.query(User).filter(User.user==u'testuser') u = User(u'testuser', u'password') meta.Session.add(u) meta.Session.flush() ac = Aircraft(u'testuser', u'eurocub') ac.adv_cruise_speed = (75, 75, 75, 76, 76, 75, 74, 73, 72, 71) ac.adv_climb_speed = (60, 60, 60, 60, 61, 61, 61, 62, 63, 64) ac.adv_descent_speed = (80, 80, 81, 81, 82, 82, 83, 84, 85, 86) ac.adv_climb_rate = (750, 700, 650, 600, 550, 500, 450, 300, 200, 000) ac.adv_descent_rate = (500, 500, 500, 500, 525, 525, 550, 550, 575, 600) ac.adv_cruise_burn = (16, 16, 16, 16, 15.5, 15.25, 15.0, 14.75, 14.5, 14.0) ac.adv_climb_burn = (20, 20, 20, 20, 19, 19, 18, 17, 15, 14.0) ac.adv_descent_burn = (14, 14, 14, 14, 14, 14, 14, 14, 14, 13.5) ac.advanced_model = True meta.Session.add(ac) meta.Session.flush() trip = Trip(u"testuser", u"mytrip", u'eurocub') meta.Session.add(trip) meta.Session.flush() wp1 = Waypoint(u'testuser', u'mytrip', '59,18', 0, 100, u'bromma') wp2 = Waypoint(u'testuser', u'mytrip', '60,18', 1, 101, u'arlanda') wp3 = Waypoint(u'testuser', u'mytrip', '61,18', 2, 102, u'gävle') wp4 = Waypoint(u'testuser', u'mytrip', '61.01,18', 3, 103, u'gävleclose') meta.Session.add(wp1) meta.Session.add(wp2) meta.Session.add(wp3) meta.Session.add(wp4) meta.Session.flush() rt1 = Route(u'testuser', u'mytrip', 0, 1) rt1.altitude = "1000" rt2 = Route(u'testuser', u'mytrip', 1, 2) rt2.altitude = "10000" rt2.windvel = 25 rt2.winddir = 0 rt3 = Route(u'testuser', u'mytrip', 2, 3) rt3.altitude = "0" for s in [wp1, wp2, wp3, rt1, rt2, rt3]: meta.Session.add(s) meta.Session.flush() tripobj = meta.Session.query(Trip).filter( sa.and_(Trip.user == u'testuser', Trip.trip == u'mytrip')).one() print "Got tripobj", tripobj class Temp(object): pass dummy, route = calc.get_route(u'testuser', u'mytrip') D = 60.153204103671705 assert abs(route[0].d - D) < 1e-5 #print route[0].__dict__ ch = route[0].ch assert abs(ch - 355) < 2 #This changes as earths magnetic field does #print "Climbtime: %f, Cruisetime: %f, expected tot: %f, calculated tot time: %f"%(climbtime,cruisetime,climbtime+cruisetime,route[0].time_hours) t = route[0].time_hours assert abs(t - 0.806) < 0.1 m = route[0].mid_alt print "m:", m assert m == 1000 m = route[1].mid_alt print "m:", m assert m == 9000 #print route[1].wca m = route[2].subs[0].startalt print "last startalt", m #assert m==9000 print "Last time", route[2].accum_time_hours assert abs(route[2].accum_time_hours - 2.1281958051) < 1e-9
def test_route_optimize(): from fplan.config.environment import load_environment from fplan.model import meta from fplan.model import Waypoint, Route, Trip, User, Aircraft import sqlalchemy as sa from pylons import config # meta.Session.query(User).filter(User.user==u'testuser') u = User(u'testuser', u'password') meta.Session.add(u) meta.Session.flush() ac = Aircraft(u'testuser', u'eurocub') ac.adv_cruise_speed = (75, 75, 75, 76, 76, 75, 74, 73, 72, 71) ac.adv_climb_speed = (60, 60, 60, 60, 61, 61, 61, 62, 63, 64) ac.adv_descent_speed = (80, 80, 81, 81, 82, 82, 83, 84, 85, 86) ac.adv_climb_rate = (750, 700, 650, 600, 550, 500, 450, 300, 200, 000) ac.adv_descent_rate = (500, 500, 500, 500, 525, 525, 550, 550, 575, 600) ac.adv_cruise_burn = (16, 16, 16, 16, 15.5, 15.25, 15.0, 14.75, 14.5, 14.0) ac.adv_climb_burn = (20, 20, 20, 20, 19, 19, 18, 17, 15, 14.0) ac.adv_descent_burn = (14, 14, 14, 14, 14, 14, 14, 14, 14, 13.5) ac.advanced_model = True meta.Session.add(ac) meta.Session.flush() trip = Trip(u"testuser", u"mytrip", u'eurocub') meta.Session.add(trip) meta.Session.flush() wp1 = Waypoint(u'testuser', u'mytrip', '56,14', 0, 100, u'bromma') wp2 = Waypoint(u'testuser', u'mytrip', '58,14', 1, 101, u'arlanda') wp3 = Waypoint(u'testuser', u'mytrip', '59,14', 2, 102, u'gävle') wp4 = Waypoint(u'testuser', u'mytrip', '60,14', 3, 103, u'norr') wp5 = Waypoint(u'testuser', u'mytrip', '60.01,14', 4, 104, u'norr2') meta.Session.add(wp1) meta.Session.add(wp2) meta.Session.add(wp3) meta.Session.add(wp4) meta.Session.add(wp5) meta.Session.flush() rt1 = Route(u'testuser', u'mytrip', 0, 1) rt1.altitude = "0" rt2 = Route(u'testuser', u'mytrip', 1, 2) rt2.altitude = "0" rt3 = Route(u'testuser', u'mytrip', 2, 3) rt3.altitude = "0" rt4 = Route(u'testuser', u'mytrip', 3, 4) rt4.altitude = "0" for s in [wp1, wp2, wp3, wp4, rt1, rt2, rt3, rt4]: meta.Session.add(s) meta.Session.flush() tripobj = meta.Session.query(Trip).filter( sa.and_(Trip.user == u'testuser', Trip.trip == u'mytrip')).one() print "Got tripobj", tripobj class Temp(object): pass res, routes = calc.get_optimized(u'testuser', u'mytrip', 'fuel') print[r.altitude for r in routes]
def test_adv_route_info(): from fplan.config.environment import load_environment from fplan.model import meta from fplan.model import Waypoint,Route,Trip,User,Aircraft import sqlalchemy as sa from pylons import config # meta.Session.query(User).filter(User.user==u'testuser') u=User(u'testuser',u'password') meta.Session.add(u) meta.Session.flush(); ac=Aircraft(u'testuser',u'eurocub') ac.adv_cruise_speed= (75,75,75,76,76, 75,74,73,72,71) ac.adv_climb_speed= (60,60,60,60,61, 61,61,62,63,64) ac.adv_descent_speed= (80,80,81,81,82, 82,83,84,85,86) ac.adv_climb_rate= (750,700,650,600,550, 500,450,300,200,000) ac.adv_descent_rate= (500,500,500,500,525, 525,550,550,575,600) ac.adv_cruise_burn= (16,16,16,16,15.5, 15.25,15.0,14.75,14.5,14.0) ac.adv_climb_burn= (20,20,20,20,19, 19,18,17,15,14.0) ac.adv_descent_burn= (14,14,14,14,14, 14,14,14,14,13.5) ac.advanced_model=True meta.Session.add(ac) meta.Session.flush(); trip=Trip(u"testuser",u"mytrip",u'eurocub') meta.Session.add(trip) meta.Session.flush(); wp1=Waypoint(u'testuser',u'mytrip','59,18',0,100,u'bromma') wp2=Waypoint(u'testuser',u'mytrip','60,18',1,101,u'arlanda') wp3=Waypoint(u'testuser',u'mytrip','61,18',2,102,u'gävle') wp4=Waypoint(u'testuser',u'mytrip','61.01,18',3,103,u'gävleclose') meta.Session.add(wp1) meta.Session.add(wp2) meta.Session.add(wp3) meta.Session.add(wp4) meta.Session.flush(); rt1=Route(u'testuser',u'mytrip',0,1) rt1.altitude="1000" rt2=Route(u'testuser',u'mytrip',1,2) rt2.altitude="10000" rt2.windvel=25 rt2.winddir=0 rt3=Route(u'testuser',u'mytrip',2,3) rt3.altitude="0" for s in [wp1,wp2,wp3,rt1,rt2,rt3]: meta.Session.add(s) meta.Session.flush() tripobj=meta.Session.query(Trip).filter(sa.and_( Trip.user==u'testuser',Trip.trip==u'mytrip')).one() print "Got tripobj",tripobj class Temp(object): pass dummy,route=calc.get_route(u'testuser',u'mytrip') D=60.153204103671705 assert abs(route[0].d-D)<1e-5 #print route[0].__dict__ ch=route[0].ch assert abs(ch-355)<2 #This changes as earths magnetic field does #print "Climbtime: %f, Cruisetime: %f, expected tot: %f, calculated tot time: %f"%(climbtime,cruisetime,climbtime+cruisetime,route[0].time_hours) t=route[0].time_hours assert abs(t-0.806)<0.1 m=route[0].mid_alt print "m:",m assert m==1000 m=route[1].mid_alt print "m:",m assert m==9000 #print route[1].wca m=route[2].subs[0].startalt print "last startalt",m #assert m==9000 print "Last time",route[2].accum_time_hours assert abs(route[2].accum_time_hours-2.1281958051)<1e-9