@LAZYGLOBAL OFF. run once "lib/node". run once "lib/target". run once "lib/vectors". run once "ascend". run once "dock". // Tabs bar & main frame local window is gui(350). local tabs_bar is window:addhlayout(). local tab_frame is window:addstack(). function add_tab { parameter name. local frame is tab_frame:addvbox(). local tab_button is tabs_bar:addbutton(name). set tab_button:exclusive to true. // TODO set tab_button:onclick to { tab_frame:showonly(frame). }. return frame. } function add_parameters_layout { parameter widget. local layout is widget:addvlayout(). local text_parameters is layout:addhlayout(). return LEXICON( "names", text_parameters:addvlayout(), "inputs", text_parameters:addvlayout(), "units", text_parameters:addvlayout(), "checkboxes", layout:addvlayout() ). } function add_parameter { parameter parameters_layout. parameter name. parameter default is "". parameter unit is "". if default:istype("Boolean") { // checkbox return parameters_layout["checkboxes"]:addcheckbox(name, default). } parameters_layout["names"]:addlabel(name). parameters_layout["units"]:addlabel(unit). return parameters_layout["inputs"]:addtextfield(default). } // ASCEND GUIDANCE { local tab is add_tab("Ascend"). local parameters is add_parameters_layout(tab). local target_orbit_altitude is add_parameter(parameters, "Target orbit altitude", "100", "km"). local target_orbit_inclination is add_parameter(parameters, "Target orbit inclination (0-180)", "0", "°"). local pitchover_tilt is add_parameter(parameters, "Pitchover tilt", "20", "°"). local pitchover_altitude is add_parameter(parameters, "Pitchover altitude", "1000", "m"). local pitchover_velocity is add_parameter(parameters, "Pitchover velocity", "100", "m/s"). local auto_stage is add_parameter(parameters, "Auto stage", true). local auto_deploy_solar_panels is add_parameter(parameters, "Auto deplay solar panels", true). local auto_deploy_fairings is add_parameter(parameters, "Auto deplay fairings", true). local auto_extend_antennas is add_parameter(parameters, "Auto extend antennas", true). set tab:addbutton("Launch"):onclick to { launch(target_orbit_altitude:text:tonumber*1000, target_orbit_inclination:text:tonumber, pitchover_tilt:text:tonumber, pitchover_altitude:text:tonumber, pitchover_velocity:text:tonumber, auto_stage:pressed, auto_deploy_solar_panels:pressed, auto_deploy_fairings:pressed, auto_extend_antennas:pressed). }. } // DOCKING { local tab is add_tab("Docking"). local local_vdraw is vdraw(V(0,0,0), V(0,0,0), CYAN). local target_vdraw is vdraw(V(0,0,0), V(0,0,0), CYAN). local function add_port_popup { parameter label. parameter draw. parameter options is LIST(). tab:addlabel(label). local popup is tab:addpopupmenu(). set popup:optionsuffix to "title". // make the popup display the port's :title instead of :tostring for port in options { popup:addoption(port). } set popup:onchange to { parameter value. set draw:show to true. set draw:startupdater to {return value:nodeposition.}. set draw:vecupdater to {return value:portfacing:vector.}. }. return popup. } local local_ports is add_port_popup("Local docking port", local_vdraw, SHIP:dockingports). local target_ports is add_port_popup("Target docking port", target_vdraw). set tab:addbutton("Refresh"):onclick to { target_ports:clear(). if not HASTARGET { print "No target". return. } for port in target_ship():dockingports { target_ports:addoption(port). } }. local parameters is add_parameters_layout(tab). local max_translation_speed is add_parameter(parameters, "Max translation speed", "1.0", "m/s"). local final_docking_speed is add_parameter(parameters, "Final docking speed", "0.1", "m/s"). set tab:addbutton("Dock"):onclick to { local_ports:value:CONTROLFROM(). set TARGET to target_ports:value. set local_vdraw:show to false. set target_vdraw:show to false. dock(max_translation_speed:text:tonumber, final_docking_speed:text:tonumber). }. } // MANEUVERS { local tab is add_tab("Maneuvers"). // TODO: Like MechJebs "circularize at apoapsis/periapsis, change inclination etc. // tab:addbutton("Add Maneuver Node") ... set tab:addbutton("Execute Next Maneuver Node"):onclick to { execute_burn(NEXTNODE). }. } // RENDEZVOUS { local tab is add_tab("Rendezvous"). // TODO: What about tolerance parameter? set tab:addbutton("Kill Relative Velocity"):onclick to { kill_relative_velocity(). }. } // Close button tabs_bar:addspacing(10). local close_button is tabs_bar:addbutton("X"). window:show(). wait until close_button:pressed. window:hide().