route-manager vbox true var ft = getprop("/sim/startup/units") == "feet"; var dlg = props.globals.getNode("/sim/gui/dialogs/route-manager", 1); var selection = dlg.getNode("selection", 1); var input = dlg.getNode("input", 1); var routem = props.globals.getNode("/autopilot/route-manager", 1); selection.setIntValue(-1); input.setValue(""); var list = cmdarg().getNode("list"); var cmd = routem.getNode("input", 1); var route = routem.getNode("route", 1); var dep = routem.getNode("departure", 1); var dest = routem.getNode("destination", 1); var sel_index = func { return int(selection.getValue()); } var clear = func { # deactive first, see http://https://code.google.com/p/flightgear-bugs/issues/detail?id=885 fgcommand("activate-flightplan", props.Node.new({"activate": 0})); flightplan().cleanPlan(); selection.setIntValue(-1); } var insert = func { var insertIndex = sel_index(); if (insertIndex >= 0) { # when selection index is valid, insert *after* the waypoint insertIndex = insertIndex + 1; } cmd.setValue("@insert" ~ insertIndex ~ ":" ~ input.getValue()); input.setValue(""); if (insertIndex >= 0) { selection.setValue(insertIndex); gui.dialog_update("route-manager"); } } var remove = func { flightplan().deleteWP(sel_index()); } var route = func { var fp = flightplan(); var from = fp.getWP(sel_index() - 1); var to = fp.getWP(sel_index()); if ((from == nil ) or (to == nil)) { debug.dump('unable to route, invalid start ad end points'); return; } var route = airwaysRoute(from, to); fp.insertWaypoints(route, sel_index()); } var jump_to = func { flightplan().current = sel_index(); } var load_route = func(path) { routem.getNode("file-path", 1).setValue(path.getValue()); cmd.setValue("@load"); gui.dialog_update("route-manager"); } var save_route = func(path) { routem.getNode("file-path", 1).setValue(path.getValue()); cmd.setValue("@save"); gui.dialog_update("route-manager"); } var file_selector = gui.FileSelector.new(load_route, "Load flight-plan", "Load"); var save_selector = gui.FileSelector.new(save_route, "Save flight-plan", "Save"); var activate_fp = func { fgcommand("activate-flightplan", props.Node.new({"activate": 1})); } var departureRunways = dlg.getNode("departure-runways", 1); var destRunways = dlg.getNode("destination-runways", 1); var sids = dlg.getNode("sids", 1); var stars = dlg.getNode("stars", 1); var approaches = dlg.getNode("approaches", 1); var updateRunways = func { departureRunways.removeChildren("value"); destRunways.removeChildren("value"); var apt = flightplan().departure; if (apt != nil) { var i=0; foreach (var rwy; keys(apt.runways)) { departureRunways.getNode("value[" ~ i ~ "]", 1).setValue(rwy); i += 1; } } apt = flightplan().destination; if (apt != nil) { var i=0; foreach (var rwy; keys(apt.runways)) { destRunways.getNode("value[" ~ i ~ "]", 1).setValue(rwy); i += 1; } } gui.dialog_update("route-manager"); } var updateSIDs = func { sids.removeChildren("value"); var apt = flightplan().departure; var rwy = flightplan().departure_runway; if (apt == nil or apt.sids(rwy) == nil) { return; } sids.getNode("value[0]", 1).setValue("(none)"); var i=1; foreach (var s; apt.sids(rwy)) { var sid = apt.getSid(s); var transVec = sid.transitions; if (size(transVec) > 0) { # list each transition of the SID foreach (var trans; transVec) { sids.getNode("value[" ~ i ~ "]", 1).setValue(s ~ "-" ~ trans); i += 1; } } else { # no transitions defined, simple case sids.getNode("value[" ~ i ~ "]", 1).setValue(s); i += 1; } } gui.dialog_update("route-manager", "sid"); } var updateSTARs = func { stars.removeChildren("value"); var apt = flightplan().destination; var rwy = flightplan().destination_runway; if (apt == nil or apt.stars(rwy) == nil) { return; } var i=1; stars.getNode("value[0]", 1).setValue("(none)"); foreach (var s; apt.stars(rwy)) { var star = apt.getStar(s); var transVec = star.transitions; if (size(transVec) > 0) { # list each transition of the STAR foreach (var trans; transVec) { stars.getNode("value[" ~ i ~ "]", 1).setValue(s ~ "-" ~ trans); i += 1; } } else { # no transitions defined, simple case stars.getNode("value[" ~ i ~ "]", 1).setValue(s); i += 1; } } gui.dialog_update("route-manager", "star"); } var updateApproaches = func { approaches.removeChildren("value"); var apt = flightplan().destination; var rwy = flightplan().destination_runway; if (apt == nil or apt.getApproachList(rwy) == nil) { return; } var i=1; approaches.getNode("value[0]", 1).setValue("(none)"); foreach (var s; apt.getApproachList(rwy)) { approaches.getNode("value[" ~ i ~ "]", 1).setValue(s); i += 1; } gui.dialog_update("route-manager", "approach"); } # initialise departure values based on current position cmd.setValue("@posinit"); updateRunways(); updateSIDs(); updateSTARs(); updateApproaches(); file_selector.del(); save_selector.del(); hbox 1 1 table 0 0 right 0 1 left departure-airport 60 /autopilot/route-manager/departure/airport true dialog-apply departure-airport nasal 0 2 %s /autopilot/route-manager/departure/name true true fill 0 3 right 0 4 left departure-runway /autopilot/route-manager/departure/runway false /sim/gui/dialogs/route-manager/departure-runways dialog-apply departure-runway nasal 0 7 right 0 8 left sid /autopilot/route-manager/departure/sid false /sim/gui/dialogs/route-manager/sids dialog-apply sid 1 0 right 1 1 left 60 destination-airport /autopilot/route-manager/destination/airport true dialog-apply destination-airport nasal 1 2 true 200 %s /autopilot/route-manager/destination/name true fill 1 3 right 1 4 left destination-runway /autopilot/route-manager/destination/runway false /sim/gui/dialogs/route-manager/destination-runways dialog-apply destination-runway nasal 1 5 right 1 6 left approach /autopilot/route-manager/destination/approach false /sim/gui/dialogs/route-manager/approaches dialog-apply approach 1 7 right 1 8 left star /autopilot/route-manager/destination/star false /sim/gui/dialogs/route-manager/stars dialog-apply star hbox right cruise-speed true left true 100 /autopilot/route-manager/cruise/speed-kts dialog-apply cruise-speed right cruise-alt true left true 100 /autopilot/route-manager/cruise/altitude-ft dialog-apply cruise-alt hbox 2 Target: %s /autopilot/route-manager/wp[0]/id true Dist: %.2f nm /autopilot/route-manager/wp[0]/dist true ETA: %s /autopilot/route-manager/wp[0]/eta true list fill fill true 150 /sim/gui/dialogs/route-manager/selection dialog-apply list hbox 4 60 input fill true 220 /sim/gui/dialogs/route-manager/input 1 0.5 0.5 0.5 hbox fill 6 true