airports vbox true hbox 1 1 var airport_id = getprop("/sim/presets/airport-id"); setprop("/sim/gui/dialogs/airports/selected-airport/rwy", ""); setprop("/sim/gui/dialogs/airports/selected-airport/parkpos", ""); if (airport_id == nil) { airport_id = "KSFO"; } var dlg = props.globals.getNode("/sim/gui/dialogs/airports", 1); var avail_runways = dlg.getNode("available-runways", 1); var avail_parking = dlg.getNode("available-parking", 1); if (dlg.getNode("list") == nil) dlg.getNode("list", 1).setValue(""); var airportlist = dlg.getNode("list"); var mode = { runway: dlg.getNode("use_runway", 1), bestrunway: dlg.getNode("use_best_runway", 1), parkpos: dlg.getNode("use_parkpos", 1) }; var set_radio = func(m) { foreach (k; keys(mode)) { mode[k].setBoolValue(m == k); } } var initialized = 0; foreach (k; keys(mode)) { if (mode[k].getType() == "NONE" or initialized) { mode[k].setBoolValue(0); } else { initialized += mode[k].getBoolValue(); } } if (!initialized) { set_radio("bestrunway"); } var update_info = func { var info = airportinfo(airport_id); setprop("/sim/gui/dialogs/airports/selected-airport/id", airport_id); setprop("/sim/gui/dialogs/airports/selected-airport/name", info.name ~ " (" ~ airport_id ~ ")"); setprop("/sim/gui/dialogs/airports/selected-airport/location", sprintf("%.3f / %.3f", info.lon, info.lat)); setprop("/sim/gui/dialogs/airports/selected-airport/lon", info.lon); setprop("/sim/gui/dialogs/airports/selected-airport/elevation-ft", 3.28 * info.elevation); var longest_runway = 0; var runway_string = ""; var runways = info.runways; avail_runways.removeChildren("value"); avail_parking.removeChildren("value"); var runway_keys = sort(keys(runways), string.icmp); var i = 0; foreach(var rwy; runway_keys) { runway_string = runway_string ~ rwy ~ " "; longest_runway = math.max(longest_runway, runways[rwy].length * 3.28); avail_runways.getNode("value[" ~ i ~ "]", 1).setValue(rwy); i += 1; } i = 0; foreach (var park; info.parking()) { avail_parking.getNode("value[" ~ i ~ "]", 1).setValue(park.name); i += 1; } setprop("/sim/gui/dialogs/airports/selected-airport/longest-runway", longest_runway); gui.dialog_update("airports", "runway-list"); gui.dialog_update("airports", "parking-list"); } var listbox = func { airport_id = pop(split(" ", airportlist.getValue())); airport_id = substr(airport_id, 1, size(airport_id) - 2); # strip parentheses update_info(); } var apply = func { setprop("/sim/presets/airport-id", airport_id); setprop("/sim/presets/longitude-deg", -9999); setprop("/sim/presets/latitude-deg", -9999); setprop("/sim/presets/altitude-ft", -9999); setprop("/sim/presets/airspeed-kt", 0); setprop("/sim/presets/offset-distance-nm", 0); setprop("/sim/presets/offset-azimuth-deg", 0); setprop("/sim/presets/glideslope-deg", 0); setprop("/sim/presets/heading-deg", 0); if (mode["bestrunway"].getBoolValue()) { setprop("/sim/presets/runway", ""); setprop("/sim/presets/parkpos", ""); } else if (mode["runway"].getBoolValue()) { setprop("/sim/presets/runway", getprop("/sim/gui/dialogs/airports/selected-airport/rwy")); setprop("/sim/presets/parkpos", ""); } else { setprop("/sim/presets/runway", ""); setprop("/sim/presets/parkpos", getprop("/sim/gui/dialogs/airports/selected-airport/parkpos")); } } hbox 4 vbox hbox 4 input 200 fill true /sim/gui/dialogs/airports/list dialog-apply input dialog-update airport-list airport-list 300 260 fill fill true /sim/gui/dialogs/airports/list dialog-apply airport-list nasal table 0 0 200 right 0 1 3 left true /sim/gui/dialogs/airports/selected-airport/name 1 0 right 1 1 left true /sim/gui/dialogs/airports/selected-airport/location 1 3 right 1 4 left true %.0f /sim/gui/dialogs/airports/selected-airport/elevation-ft 2 0 right 2 1 left true %.0f /sim/gui/dialogs/airports/selected-airport/longest-runway table center 20 /sim/gui/dialogs/airports/use_best_runway true nasal 21 right /sim/gui/dialogs/airports/use_best_runway 22 right /sim/gui/dialogs/airports/use_best_runway 30 /sim/gui/dialogs/airports/use_runway true nasal 31 right /sim/gui/dialogs/airports/use_runway runway-list 32 85 /sim/gui/dialogs/airports/use_runway /sim/gui/dialogs/airports/selected-airport/rwy false sim/gui/dialogs/airports/available-runways dialog-apply runway-list 40 /sim/gui/dialogs/airports/use_parkpos true nasal 41 right /sim/gui/dialogs/airports/use_parkpos parking-list 42 85 /sim/gui/dialogs/airports/use_parkpos /sim/gui/dialogs/airports/selected-airport/parkpos false sim/gui/dialogs/airports/available-parking dialog-apply parking-list vbox map-dialog fill fill true 600 400 600 400 3 and !is_heli ) { # only runways which are much longer than wide are # real runways, otherwise it's probably a heliport. var icon_cl = me.grp_apt.createChild("path", "centerline") .setStrokeLineWidth(0.5) .setColor(1,1,1) .setStrokeDashArray([15, 10]); icon_cl.setDataGeo ( [ canvas.Path.VG_MOVE_TO, canvas.Path.VG_LINE_TO ], [ beg_thr[0], beg_thr[1], end_thr[0], end_thr[1] ] ); var icon_thr = me.grp_apt.createChild("path", "threshold") .setStrokeLineWidth(1.5) .setColor(1,1,1); icon_thr.setDataGeo ( [ canvas.Path.VG_MOVE_TO, canvas.Path.VG_LINE_TO, canvas.Path.VG_MOVE_TO, canvas.Path.VG_LINE_TO ], [ beg_thr1[0], beg_thr1[1], beg_thr2[0], beg_thr2[1], end_thr1[0], end_thr1[1], end_thr2[0], end_thr2[1] ] ); } } foreach(var park; me._apt.parking()) { var icon_park = me.grp_apt.createChild("text") .setDrawMode( canvas.Text.ALIGNMENT + canvas.Text.TEXT ) .setText(park.name) .setFont("LiberationFonts/LiberationMono-Bold.ttf") .setGeoPosition(park.lat, park.lon) .setFontSize(15, 1.3); } } }; var my_canvas = canvas.get(cmdarg()); my_canvas.setColorBackground(0.2, 0.5, 0.2, 0.5); var root = my_canvas.createGroup(); var map = root.createChild("map", "map-test") .setTranslation(300, 200); var layer_runways = map.createChild("group", "runways"); var icon_tower = map.createChild("path", "tower") .setStrokeLineWidth(1) .setScale(1.5) .setColor(0.2,0.2,1.0) .moveTo(-3, 0) .vert(-10) .line(-3, -10) .horiz(12) .line(-3, 10) .vert(10); var updateMap = func() { var id = getprop("/sim/gui/dialogs/airports/selected-airport/id"); if (id != "") { var apt = airportinfo(id); var airport = AirportMap.new(apt); airport.build(layer_runways); var pos = apt.tower(); icon_tower.setGeoPosition(pos.lat, pos.lon); map._node.getNode("ref-lat", 1).setDoubleValue(apt.lat); map._node.getNode("ref-lon", 1).setDoubleValue(apt.lon); map._node.getNode("hdg", 1).setDoubleValue(0.0); } } var ranges = [0.1, 0.25, 0.5, 1, 2.5, 5]; var updateZoom = func() { var z = getprop("/sim/gui/dialogs/airports/zoom"); if( z == nil ) z = 0; var zoom = ranges[4 - z]; map._node.getNode("range", 1).setDoubleValue(zoom); settimer(updateZoom, 0.5, 1); }; var aptlistener = setlistener("/sim/gui/dialogs/airports/selected-airport/id", updateMap); update_info(); updateZoom(); ]]> removelistener(aptlistener); hbox Zoom %d /sim/gui/dialogs/airports/zoom true hbox 10 true true true