# See: http://wiki.flightgear.org/MapStructure # Class things: var name = 'WPT-airbus'; var parents = [canvas.SymbolLayer.Controller]; var __self__ = caller(0)[0]; canvas.SymbolLayer.Controller.add(name, __self__); canvas.SymbolLayer.add(name, { parents: [canvas.MultiSymbolLayer], type: name, # Symbol type df_controller: __self__, # controller to use by default -- this one df_options: { # default configuration options fix_symbol: func(group){ group.createChild('path') .moveTo(-10,0) .lineTo(0,-17) .lineTo(10,0) .lineTo(0,17) .close() .setStrokeLineWidth(3) .setColor(1,1,1) .setScale(1); }, vor_symbol: 'Nasal/canvas/map/Airbus/Images/airbus_vor.svg', airport_symbol: 'Nasal/canvas/map/Airbus/Images/airbus_airport.svg', ndb_symbol: func(group){ group.createChild('path') .moveTo(-15,15) .lineTo(0,-15) .lineTo(15,15) .close() .setStrokeLineWidth(3) #.setColor(0.69,0,0.39) #.setTranslation(-24, -24), .setScale(1,1); } }, df_style: { active_wp_color: [0.4,0.7,0.4], current_wp_color: [1,1,1], translation: { 'airport': [-24,-24], 'vor': [-24,-24] } }, toggle_cstr: 0 }); var new = func(layer) { var m = { parents: [__self__], layer: layer, map: layer.map, listeners: [], }; layer.searcher._equals = func(a,b) a.equals(b); var driver = opt_member(m.layer.options, 'route_driver'); if(driver == nil){ driver = RouteDriver.new(); } var driver_listeners = driver.getListeners(); foreach(var listener; driver_listeners){ append(m.listeners, setlistener(listener, func m.layer.update())); } m.route_driver = driver; return m; }; var del = func() { foreach (var l; me.listeners) removelistener(l); }; var WPTModel = { new: func(fp, idx) { var m = { parents:[WPTModel] }; var wp = fp.getWP(idx); m.id = wp.id; m.name = wp.wp_name; m.alt = wp.alt_cstr; m.spd = wp.speed_cstr; m.type = wp.wp_type; (m.lat,m.lon) = (wp.wp_lat,wp.wp_lon); var is_rwy = (m.type == 'runway'); var id_len = size(m.id); if(!is_rwy and id_len < 5){ if(id_len == 4 and airportinfo(m.id) != nil) m.navtype = 'airport'; else { var navaid = nil; foreach(var t; ['vor', 'ndb']){ navaid = navinfo(m.lat, m.lon, t, m.id); if(navaid != nil and size(navaid)){ m.navtype = t; break; } } if(navaid == nil or !size(navaid)) m.navtype = 'fix'; } } else { m.navtype = (is_rwy ? 'rwy' : 'fix'); } m.wp = wp; idx = wp.index; m.idx = idx; m.is_departure = (idx == 0 and is_rwy); m.is_destination = (idx > 0 and is_rwy); return m; }, equals: func(other) { # this is set on symbol init, so use this for equality... me.name == other.name and me.alt == other.alt and me.type == other.type and me.idx == other.idx and me.navtype == other.navtype }, }; var searchCmd = func { var driver = me.route_driver; if(!driver.shouldUpdate()) return []; driver.update(); var result = []; var planCount = driver.getNumberOfFlightPlans(); for(var idx = 0; idx < planCount; idx += 1){ var fp = driver.getFlightPlan(idx); if(fp == nil) continue; var fpSize = fp.getPlanSize(idx); for (var i = 0; i < fpSize; i+=1){ if(!driver.shouldUpdate()) return[]; append(result, WPTModel.new(fp, i)); } } return result; }