class TrailingEdgeUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index, station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): # make the edit line page = QFrame() layout = QVBoxLayout() page.setLayout(layout) line1 = QFrame() layout1 = QHBoxLayout() line1.setLayout(layout1) layout.addWidget(line1) layout1.addWidget(QLabel("<b>W x H:</b> ")) self.edit_width = QLineEdit() self.edit_width.setFixedWidth(50) self.edit_width.textChanged.connect(self.onChange) layout1.addWidget(self.edit_width) self.edit_height = QLineEdit() self.edit_height.setFixedWidth(50) self.edit_height.textChanged.connect(self.onChange) layout1.addWidget(self.edit_height) self.edit_shape = QComboBoxNoWheel() self.edit_shape.addItem("Flat Triangle") self.edit_shape.addItem("Symmetrical") self.edit_shape.addItem("Bottom Sheet") self.edit_shape.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_shape) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QPushButton('Delete ') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) return page def get_widget(self): return self.container def load(self, node): self.edit_width.setText(node.getString('width')) self.edit_height.setText(node.getString('height')) index = self.edit_shape.findText(node.getString('shape')) if index == None: index = 1 self.edit_shape.setCurrentIndex(index) index = self.edit_start.findText(node.getString('start_station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(node.getString('end_station')) if index != None: self.edit_end.setCurrentIndex(index) def save(self, node): node.setString('width', self.edit_width.text()) node.setString('height', self.edit_height.text()) node.setString('shape', self.edit_shape.currentText()) node.setString('start_station', self.edit_start.currentText()) node.setString('end_station', self.edit_end.currentText())
class LeadingEdgeUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index,station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): # make the edit line page = QFrame() layout = QVBoxLayout() page.setLayout( layout ) line1 = QFrame() layout1 = QHBoxLayout() line1.setLayout( layout1 ) layout.addWidget( line1 ) layout1.addWidget( QLabel("<b>Size:</b> ") ) self.edit_size = QLineEdit() self.edit_size.setFixedWidth(50) self.edit_size.textChanged.connect(self.onChange) layout1.addWidget( self.edit_size ) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QPushButton('Delete ') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) return page def get_widget(self): return self.container def load(self, node): self.edit_size.setText(node.getString('size')) index = self.edit_start.findText(node.getString('start_station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(node.getString('end_station')) if index != None: self.edit_end.setCurrentIndex(index) def save(self, node): node.setString('size', self.edit_size.text()) node.setString('start_station', self.edit_start.currentText()) node.setString('end_station', self.edit_end.currentText())
class Circle(): def __init__(self, changefunc, host="localhost", port=6499): self.changefunc = changefunc self.host = host self.port = port self.original_values = ["", "", "left", "100"] self.container = self.make_page() def onChange(self): self.changefunc() def make_page(self): toppage = QFrame() toplayout = QVBoxLayout() toppage.setLayout(toplayout) page = QFrame() layout = QFormLayout() page.setLayout(layout) toplayout.addWidget(page) self.edit_alt = QLineEdit() self.edit_alt.setFixedWidth(350) self.edit_alt.textChanged.connect(self.onChange) self.edit_speed = QLineEdit() self.edit_speed.setFixedWidth(350) self.edit_speed.textChanged.connect(self.onChange) self.edit_direction = QComboBoxNoWheel() self.edit_direction.setFixedWidth(350) self.edit_direction.addItem('left') self.edit_direction.addItem('right') self.edit_direction.currentIndexChanged.connect(self.onChange) self.edit_radius = QLineEdit() self.edit_radius.setFixedWidth(350) self.edit_radius.textChanged.connect(self.onChange) layout.addRow("<b>Altitude AGL (ft):</b>", self.edit_alt) layout.addRow("<b>Speed (kt):</b>", self.edit_speed) layout.addRow("<b>Direction:</b>", self.edit_direction) layout.addRow("<b>Radius (m):</b>", self.edit_radius) # 'Parameter' button bar param_group = QFrame() toplayout.addWidget(param_group) param_layout = QHBoxLayout() param_group.setLayout(param_layout) param_layout.addWidget(QLabel("<b>Circling Parameters:</b> ")) update = QPushButton('Update') update.clicked.connect(self.update) param_layout.addWidget(update) revert = QPushButton('Revert') revert.clicked.connect(self.revert) param_layout.addWidget(revert) param_layout.addStretch(1) # 'Command' button bar cmd_group = QFrame() toplayout.addWidget(cmd_group) cmd_layout = QHBoxLayout() cmd_group.setLayout(cmd_layout) cmd_layout.addWidget(QLabel("<b>Task Commands:</b> ")) circle = QPushButton('Circle Here') circle.clicked.connect(self.task_circle) cmd_layout.addWidget(circle) home = QPushButton('Go Home (and Circle)') home.clicked.connect(self.task_home) cmd_layout.addWidget(home) cmd_layout.addStretch(1) toplayout.addStretch(1) # set initial values self.revert() return toppage def get_widget(self): return self.container def send_value(self, t, prop, val): if len(val): if self.port != 6499: command = "send set," + prop + "," + str(val) print(command) t.send(command) else: command = "set " + prop + " " + str(val) print(command) t.send(command) def update(self): print("update circle hold params") t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") self.send_value(t, "/autopilot/targets/altitude_agl_ft", self.edit_alt.text()) self.send_value(t, "/autopilot/targets/airspeed_kt", self.edit_speed.text()) self.send_value(t, "/task/circle/direction", self.edit_direction.currentText()) self.send_value(t, "/task/circle/radius_m", self.edit_radius.text()) t.quit() def revert(self): print(str(self.original_values)) # revert form self.edit_alt.setText(self.original_values[0]) self.edit_speed.setText(self.original_values[1]) index = self.edit_direction.findText(self.original_values[2]) if index == None: index = 1 self.edit_direction.setCurrentIndex(index) self.edit_radius.setText(self.original_values[3]) # send original values to remote self.update() def task_circle(self): print("request circle hold at current location") t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send("send task,circle") else: t.send("set /task/command circle") t.quit() def task_home(self): print("request circle hold at home") t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send("send task,home") else: t.send("set /task/command home") t.quit()
class SimpleHoleUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index,station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): page = QFrame() layout = QVBoxLayout() page.setLayout( layout ) line1 = QFrame() layout1 = QHBoxLayout() line1.setLayout( layout1 ) layout.addWidget( line1 ) line2 = QFrame() layout2 = QHBoxLayout() line2.setLayout( layout2 ) layout.addWidget( line2 ) self.edit_style = QComboBoxNoWheel() self.edit_style.addItem("Radius") self.edit_style.addItem("% Height") self.edit_style.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_style) layout1.addWidget( QLabel("<b>Radius:</b> ") ) self.edit_size = QLineEdit() self.edit_size.setFixedWidth(50) self.edit_size.textChanged.connect(self.onChange) layout1.addWidget( self.edit_size ) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QPushButton('Delete') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) layout2.addWidget( QLabel("<b>Pos:</b> ") ) self.edit_posref = QComboBoxNoWheel() self.edit_posref.addItem("Chord %") self.edit_posref.addItem("Rel Front") self.edit_posref.addItem("Rel Rear") self.edit_posref.addItem("Abs Pos") self.edit_posref.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_posref) self.edit_pos = QLineEdit() self.edit_pos.setFixedWidth(50) self.edit_pos.textChanged.connect(self.onChange) layout2.addWidget( self.edit_pos ) layout2.addStretch(1) return page def get_widget(self): return self.container def load(self, node): index = self.edit_style.findText(node.getString('style')) if index == None: index = 1 self.edit_style.setCurrentIndex(index) self.edit_size.setText(node.getString('size')) index = self.edit_posref.findText(node.getString('position_ref')) if index == None: index = 1 self.edit_posref.setCurrentIndex(index) self.edit_pos.setText(node.getString('position')) index = self.edit_start.findText(node.getString('start_station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(node.getString('end_station')) if index != None: self.edit_end.setCurrentIndex(index) def save(self, node): node.setString('style', self.edit_style.currentText()) node.setString('size', self.edit_size.text()) node.setString('position_ref', self.edit_posref.currentText()) node.setString('position', self.edit_pos.text()) node.setString('start_station', self.edit_start.currentText()) node.setString('end_station', self.edit_end.currentText())
class Overview(): def __init__(self, changefunc): self.changefunc = changefunc self.container = self.make_page() self.xml = None self.version = MADversion() def onChange(self): self.changefunc() def make_page(self): # make the full edit widget page = QtGui.QFrame() layout = QtGui.QFormLayout() page.setLayout( layout ) self.edit_name = QtGui.QLineEdit() self.edit_name.setFixedWidth(250) self.edit_name.textChanged.connect(self.onChange) self.edit_desc = QtGui.QTextEdit() self.edit_desc.setFixedWidth(250) self.edit_desc.textChanged.connect(self.onChange) self.edit_author = QtGui.QLineEdit() self.edit_author.setFixedWidth(250) self.edit_author.textChanged.connect(self.onChange) self.edit_email = QtGui.QLineEdit() self.edit_email.setFixedWidth(250) self.edit_email.textChanged.connect(self.onChange) self.edit_units = QComboBoxNoWheel() self.edit_units.setFixedWidth(250) self.edit_units.addItem("in") self.edit_units.addItem("cm") self.edit_units.addItem("mm") self.edit_units.currentIndexChanged.connect(self.onChange) self.edit_sheet_w = QtGui.QLineEdit() self.edit_sheet_w.setFixedWidth(250) self.edit_sheet_w.textChanged.connect(self.onChange) self.edit_sheet_h = QtGui.QLineEdit() self.edit_sheet_h.setFixedWidth(250) self.edit_sheet_h.textChanged.connect(self.onChange) self.edit_plans_w = QtGui.QLineEdit() self.edit_plans_w.setFixedWidth(250) self.edit_plans_w.textChanged.connect(self.onChange) self.edit_plans_h = QtGui.QLineEdit() self.edit_plans_h.setFixedWidth(250) self.edit_plans_h.textChanged.connect(self.onChange) layout.addRow( "<b>Design Name:</b>", self.edit_name ) layout.addRow( "<b>Description:</b>", self.edit_desc ) layout.addRow( "<b>Author:</b>", self.edit_author ) layout.addRow( "<b>Email:</b>", self.edit_email ) layout.addRow( "<b>Units:</b>", self.edit_units ) layout.addRow( "<b>Mat. Sheet Width:</b>", self.edit_sheet_w ) layout.addRow( "<b>Mat. Sheet Height:</b>", self.edit_sheet_h ) layout.addRow( "<b>Plans Width:</b>", self.edit_plans_w ) layout.addRow( "<b>Plans Height:</b>", self.edit_plans_h ) return page def get_widget(self): return self.container def get_value(self, node): e = self.xml.find(node) if e != None and e.text != None: return e.text else: return "" def parse_xml(self, node): self.xml = node self.edit_name.setText(self.get_value('name')) self.edit_desc.setText(self.get_value('description')) self.edit_author.setText(self.get_value('author')) self.edit_email.setText(self.get_value('email')) units = self.get_value('units') sheet_w = self.get_value('sheet-width') sheet_h = self.get_value('sheet-height') if units == "in": if sheet_w == "": sheet_w = "24" if sheet_h == "": sheet_h = "12" elif units == "mm": if sheet_w == "": sheet_w = "600" if sheet_h == "": sheet_h = "300" elif units == "cm": if sheet_w == "": sheet_w = "60" if sheet_h == "": sheet_h = "30" plans_w = self.get_value('plans-width') plans_h = self.get_value('plans-height') if units == "in": if plans_w == "": plans_w = "24" if plans_h == "": plans_h = "36" elif units == "mm": if plans_w == "": plans_w = "600" if plans_h == "": plans_h = "900" elif units == "cm": if plans_w == "": plans_w = "60" if plans_h == "": plans_h = "90" index = self.edit_units.findText(units) if index == None: index = 0 self.edit_units.setCurrentIndex(index) self.edit_sheet_w.setText(sheet_w) self.edit_sheet_h.setText(sheet_h) self.edit_plans_w.setText(plans_w) self.edit_plans_h.setText(plans_h) writer_version = self.get_value('MADversion') if writer_version == "" or float(writer_version) != self.version.get(): if writer_version == "": writer_version = "(unknown)" reply = QtGui.QMessageBox.question(None, 'Version Alert', 'The design you are loading was created with MAD v' + str(writer_version) + '. You are running v' + str(self.version.get()) + '. The file will be converted as best as possible, but please check your design carefully for any issues.', QtGui.QMessageBox.Ok) def wipe_clean(self): self.edit_name.setText('') self.edit_desc.setText('') self.edit_author.setText('') self.edit_email.setText('') self.edit_units.setCurrentIndex(0) self.edit_sheet_w.setText('24') self.edit_sheet_h.setText('12') self.edit_plans_w.setText('24') self.edit_plans_h.setText('36') def update_node(self, node, value): e = self.xml.find(node) if e == None: e = ET.SubElement(self.xml, node) e.text = str(value) def gen_xml(self, node): self.xml = node self.update_node('MADversion', str(self.version.get())) self.update_node('name', self.edit_name.text()) self.update_node('description', self.edit_desc.toPlainText()) self.update_node('author', self.edit_author.text()) self.update_node('email', self.edit_email.text()) self.update_node('units', self.edit_units.currentText()) self.update_node('sheet-width', self.edit_sheet_w.text()) self.update_node('sheet-height', self.edit_sheet_h.text()) self.update_node('plans-width', self.edit_plans_w.text()) self.update_node('plans-height', self.edit_plans_h.text())
class Land(): def __init__(self, changefunc, host="localhost", port=6499): self.changefunc = changefunc self.host = host self.port = port self.original_values = [ "0", "5", "75", "left", "50", "10", "25", "0", "5" ] self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def make_page(self): toppage = QtGui.QFrame() toplayout = QtGui.QVBoxLayout() toppage.setLayout(toplayout) page = QtGui.QFrame() layout = QtGui.QFormLayout() page.setLayout( layout ) toplayout.addWidget( page ) self.edit_lat_offset = QtGui.QLineEdit() self.edit_lat_offset.setFixedWidth(350) self.edit_lat_offset.textChanged.connect(self.onChange) self.edit_glideslope = QtGui.QLineEdit() self.edit_glideslope.setFixedWidth(350) self.edit_glideslope.textChanged.connect(self.onChange) self.edit_turn_radius = QtGui.QLineEdit() self.edit_turn_radius.setFixedWidth(350) self.edit_turn_radius.textChanged.connect(self.onChange) self.edit_direction = QComboBoxNoWheel() self.edit_direction.setFixedWidth(350) self.edit_direction.addItem('left') self.edit_direction.addItem('right') self.edit_direction.currentIndexChanged.connect(self.onChange) self.edit_final_leg = QtGui.QLineEdit() self.edit_final_leg.setFixedWidth(350) self.edit_final_leg.textChanged.connect(self.onChange) self.edit_alt_bias = QtGui.QLineEdit() self.edit_alt_bias.setFixedWidth(350) self.edit_alt_bias.textChanged.connect(self.onChange) self.edit_appr_speed = QtGui.QLineEdit() self.edit_appr_speed.setFixedWidth(350) self.edit_appr_speed.textChanged.connect(self.onChange) self.edit_flare_pitch = QtGui.QLineEdit() self.edit_flare_pitch.setFixedWidth(350) self.edit_flare_pitch.textChanged.connect(self.onChange) self.edit_flare_time = QtGui.QLineEdit() self.edit_flare_time.setFixedWidth(350) self.edit_flare_time.textChanged.connect(self.onChange) layout.addRow( "<b>TD Lateral Offset (m):</b>", self.edit_lat_offset ) layout.addRow( "<b>Approach Glideslope (deg):</b>", self.edit_glideslope ) layout.addRow( "<b>Final Turn Radius (m):</b>", self.edit_turn_radius ) layout.addRow( "<b>Turn Direction:</b>", self.edit_direction ) layout.addRow( "<b>Extend Final Leg Len (m):</b>", self.edit_final_leg ) layout.addRow( "<b>Altitude Bias (ft):</b>", self.edit_alt_bias ) layout.addRow( "<b>Approach Speed (kt):</b>", self.edit_appr_speed ) layout.addRow( "<b>Flare Pitch (deg):</b>", self.edit_flare_pitch ) layout.addRow( "<b>Flare Time (sec):</b>", self.edit_flare_time ) # 'Parameter' button bar param_group = QtGui.QFrame() toplayout.addWidget(param_group) param_layout = QtGui.QHBoxLayout() param_group.setLayout( param_layout ) param_layout.addWidget( QtGui.QLabel("<b>Commands:</b> ") ) update = QtGui.QPushButton('Update') update.clicked.connect(self.update) param_layout.addWidget(update) revert = QtGui.QPushButton('Revert') revert.clicked.connect(self.revert) param_layout.addWidget(revert) land = QtGui.QPushButton('Land Now!') land.clicked.connect(self.task_land) param_layout.addWidget(land) param_layout.addStretch(1) page1 = QtGui.QFrame() layout1 = QtGui.QFormLayout() page1.setLayout( layout1 ) toplayout.addWidget( page1 ) self.edit_rwy_lon = QtGui.QLineEdit() self.edit_rwy_lon.setFixedWidth(350) self.edit_rwy_lon.textChanged.connect(self.onChange) self.edit_rwy_lat = QtGui.QLineEdit() self.edit_rwy_lat.setFixedWidth(350) self.edit_rwy_lat.textChanged.connect(self.onChange) self.edit_rwy_hdg = QtGui.QLineEdit() self.edit_rwy_hdg.setFixedWidth(350) self.edit_rwy_hdg.textChanged.connect(self.onChange) layout1.addRow( "<b>Runway Longitude (deg):</b>", self.edit_rwy_lon ) layout1.addRow( "<b>Runway Latitude (deg):</b>", self.edit_rwy_lat ) layout1.addRow( "<b>Runway Heading (deg):</b>", self.edit_rwy_hdg ) # 'rwy' button bar rwy_group = QtGui.QFrame() toplayout.addWidget(rwy_group) rwy_layout = QtGui.QHBoxLayout() rwy_group.setLayout( rwy_layout ) rwy_layout.addWidget( QtGui.QLabel("<b>Runway Presets:</b> ") ) home = QtGui.QPushButton('Land "HOME"') home.clicked.connect(self.task_rwy_home) rwy_layout.addWidget(home) sprc36 = QtGui.QPushButton('SPRC 36 (to N)') sprc36.clicked.connect(self.task_rwy_sprc36) rwy_layout.addWidget(sprc36) sprc18 = QtGui.QPushButton('SPRC 18 (to S)') sprc18.clicked.connect(self.task_rwy_sprc18) rwy_layout.addWidget(sprc18) rwy_layout.addStretch(1) toplayout.addStretch(1) # set initial values self.revert() return toppage def get_widget(self): return self.container def send_value(self, t, prop, val): if len(val): if self.port != 6499: command = "send set," + prop + "," + str(val) print command t.send(command) else: command = "set " + prop + " " + str(val) print command t.send(command) def update(self): print "update land params" t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") self.send_value(t, "/task/land/lateral_offset_m", self.edit_lat_offset.text()) self.send_value(t, "/task/land/glideslope_deg", self.edit_glideslope.text()) self.send_value(t, "/task/land/turn_radius_m", self.edit_turn_radius.text()) self.send_value(t, "/task/land/direction", self.edit_direction.currentText()) self.send_value(t, "/task/land/extend_final_leg_m", self.edit_final_leg.text()) self.send_value(t, "/task/land/altitude_bias_ft", self.edit_alt_bias.text()) self.send_value(t, "/task/land/approach_speed_kt", self.edit_appr_speed.text()) self.send_value(t, "/task/land/flare_pitch_deg", self.edit_flare_pitch.text()) self.send_value(t, "/task/land/flare_seconds", self.edit_flare_time.text()) # send these last so our 'route' doesn't stay moved long # before we kick into land mode. if len(self.edit_rwy_lon.text()): self.send_value(t, "/task/home/longitude_deg", self.edit_rwy_lon.text()) if len(self.edit_rwy_lat.text()): self.send_value(t, "/task/home/latitude_deg", self.edit_rwy_lat.text()) if len(self.edit_rwy_hdg.text()): self.send_value(t, "/task/home/azimuth_deg", self.edit_rwy_hdg.text()) t.quit() def revert(self): print str(self.original_values) # revert form self.edit_rwy_lon.setText( "" ) self.edit_rwy_lat.setText( "" ) self.edit_rwy_hdg.setText( "" ) self.edit_lat_offset.setText( self.original_values[0] ) self.edit_glideslope.setText( self.original_values[1] ) self.edit_turn_radius.setText( self.original_values[2] ) index = self.edit_direction.findText(self.original_values[3]) if index == None: index = 1 self.edit_direction.setCurrentIndex(index) self.edit_final_leg.setText( self.original_values[4] ) self.edit_alt_bias.setText( self.original_values[5] ) self.edit_appr_speed.setText( self.original_values[6] ) self.edit_flare_pitch.setText( self.original_values[7] ) self.edit_flare_time.setText( self.original_values[8] ) def set_runway(self, lon, lat, az): self.edit_rwy_lon.setText( str(lon) ) self.edit_rwy_lat.setText( str(lat) ) self.edit_rwy_hdg.setText( str(az) ) def task_rwy_home(self): print "Set Runway to 'Home'" self.set_runway("", "", "") def task_rwy_sprc36(self): print "Set Runway to SPRC 36" self.set_runway( -93.1454915, 45.2202454, 5 ) def task_rwy_sprc18(self): print "Set Runway to SPRC 18" self.set_runway( -93.1453326, 45.2205971, 185 ) def task_land(self): print "Land!" # send over current landing configuration and touchdown point self.update() t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") cmd = "task,land" az = self.edit_rwy_hdg.text() if len(az): cmd += "," + az if self.port != 6499: t.send(str("send " + cmd)) else: t.send(str("set /task/command_request " + cmd)) t.quit() def task_resume(self): print "Resume route ..." t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send("send task,resume") else: t.send("set /task/command_request task,resume") t.quit()
class SheetUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index,station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): page = QtGui.QFrame() layout = QtGui.QVBoxLayout() page.setLayout( layout ) line1 = QtGui.QFrame() layout1 = QtGui.QHBoxLayout() line1.setLayout( layout1 ) layout.addWidget( line1 ) line2 = QtGui.QFrame() layout2 = QtGui.QHBoxLayout() line2.setLayout( layout2 ) layout.addWidget( line2 ) layout1.addWidget( QtGui.QLabel("<b>Depth:</b> ") ) self.edit_depth = QtGui.QLineEdit() self.edit_depth.setFixedWidth(70) self.edit_depth.textChanged.connect(self.onChange) layout1.addWidget( self.edit_depth ) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QtGui.QPushButton('Delete') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) layout2.addWidget( QtGui.QLabel("<b>Start Pos:</b> ") ) self.edit_xstart = QtGui.QLineEdit() self.edit_xstart.setFixedWidth(50) self.edit_xstart.textChanged.connect(self.onChange) layout2.addWidget( self.edit_xstart ) self.edit_xmode = QComboBoxNoWheel() self.edit_xmode.addItem("Sheet Width") self.edit_xmode.addItem("End Position") self.edit_xmode.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_xmode) self.edit_xend = QtGui.QLineEdit() self.edit_xend.setFixedWidth(50) self.edit_xend.textChanged.connect(self.onChange) layout2.addWidget( self.edit_xend ) self.edit_surface = QComboBoxNoWheel() self.edit_surface.addItem("Top") self.edit_surface.addItem("Bottom") self.edit_surface.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_surface) layout2.addStretch(1) return page def get_widget(self): return self.container def get_value(self, node): e = self.xml.find(node) if e != None and e.text != None: return e.text else: return "" def parse_xml(self, node): self.xml = node self.edit_depth.setText(self.get_value('depth')) self.edit_xstart.setText(self.get_value('xstart')) index = self.edit_xmode.findText(self.get_value('xmode')) if index == None: index = 1 self.edit_xmode.setCurrentIndex(index) self.edit_xend.setText(self.get_value('xend')) index = self.edit_surface.findText(self.get_value('surface')) if index == None: index = 1 self.edit_surface.setCurrentIndex(index) index = self.edit_start.findText(self.get_value('start-station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(self.get_value('end-station')) if index != None: self.edit_end.setCurrentIndex(index) def update_node(self, node, value): e = self.xml.find(node) if e == None: e = ET.SubElement(self.xml, node) e.text = str(value) def gen_xml(self, node): self.xml = node self.update_node('depth', self.edit_depth.text()) self.update_node('xstart', self.edit_xstart.text()) self.update_node('xmode', self.edit_xmode.currentText()) self.update_node('xend', self.edit_xend.text()) self.update_node('surface', self.edit_surface.currentText()) self.update_node('start-station', self.edit_start.currentText()) self.update_node('end-station', self.edit_end.currentText())
class Land(): def __init__(self, changefunc, host="localhost", port=6499): self.changefunc = changefunc self.host = host self.port = port self.original_values = [ "0", "5", "75", "left", "50", "10", "25", "0", "5" ] self.container = self.make_page() def onChange(self): self.changefunc() def make_page(self): toppage = QFrame() toplayout = QVBoxLayout() toppage.setLayout(toplayout) page = QFrame() layout = QFormLayout() page.setLayout( layout ) toplayout.addWidget( page ) self.edit_lat_offset = QLineEdit() self.edit_lat_offset.setFixedWidth(350) self.edit_lat_offset.textChanged.connect(self.onChange) self.edit_glideslope = QLineEdit() self.edit_glideslope.setFixedWidth(350) self.edit_glideslope.textChanged.connect(self.onChange) self.edit_turn_radius = QLineEdit() self.edit_turn_radius.setFixedWidth(350) self.edit_turn_radius.textChanged.connect(self.onChange) self.edit_direction = QComboBoxNoWheel() self.edit_direction.setFixedWidth(350) self.edit_direction.addItem('left') self.edit_direction.addItem('right') self.edit_direction.currentIndexChanged.connect(self.onChange) self.edit_final_leg = QLineEdit() self.edit_final_leg.setFixedWidth(350) self.edit_final_leg.textChanged.connect(self.onChange) self.edit_alt_bias = QLineEdit() self.edit_alt_bias.setFixedWidth(350) self.edit_alt_bias.textChanged.connect(self.onChange) self.edit_appr_speed = QLineEdit() self.edit_appr_speed.setFixedWidth(350) self.edit_appr_speed.textChanged.connect(self.onChange) self.edit_flare_pitch = QLineEdit() self.edit_flare_pitch.setFixedWidth(350) self.edit_flare_pitch.textChanged.connect(self.onChange) self.edit_flare_time = QLineEdit() self.edit_flare_time.setFixedWidth(350) self.edit_flare_time.textChanged.connect(self.onChange) layout.addRow( "<b>TD Lateral Offset (m):</b>", self.edit_lat_offset ) layout.addRow( "<b>Approach Glideslope (deg):</b>", self.edit_glideslope ) layout.addRow( "<b>Final Turn Radius (m):</b>", self.edit_turn_radius ) layout.addRow( "<b>Turn Direction:</b>", self.edit_direction ) layout.addRow( "<b>Extend Final Leg Len (m):</b>", self.edit_final_leg ) layout.addRow( "<b>Altitude Bias (ft):</b>", self.edit_alt_bias ) layout.addRow( "<b>Approach Speed (kt):</b>", self.edit_appr_speed ) layout.addRow( "<b>Flare Pitch (deg):</b>", self.edit_flare_pitch ) layout.addRow( "<b>Flare Time (sec):</b>", self.edit_flare_time ) # 'Parameter' button bar param_group = QFrame() toplayout.addWidget(param_group) param_layout = QHBoxLayout() param_group.setLayout( param_layout ) param_layout.addWidget( QLabel("<b>Commands:</b> ") ) update = QPushButton('Update') update.clicked.connect(self.update) param_layout.addWidget(update) revert = QPushButton('Revert') revert.clicked.connect(self.revert) param_layout.addWidget(revert) land = QPushButton('Land Now!') land.clicked.connect(self.task_land) param_layout.addWidget(land) param_layout.addStretch(1) page1 = QFrame() layout1 = QFormLayout() page1.setLayout( layout1 ) toplayout.addWidget( page1 ) self.edit_rwy_lon = QLineEdit() self.edit_rwy_lon.setFixedWidth(350) self.edit_rwy_lon.textChanged.connect(self.onChange) self.edit_rwy_lat = QLineEdit() self.edit_rwy_lat.setFixedWidth(350) self.edit_rwy_lat.textChanged.connect(self.onChange) self.edit_rwy_hdg = QLineEdit() self.edit_rwy_hdg.setFixedWidth(350) self.edit_rwy_hdg.textChanged.connect(self.onChange) layout1.addRow( "<b>Runway Longitude (deg):</b>", self.edit_rwy_lon ) layout1.addRow( "<b>Runway Latitude (deg):</b>", self.edit_rwy_lat ) layout1.addRow( "<b>Runway Heading (deg):</b>", self.edit_rwy_hdg ) # 'rwy' button bar rwy_group = QFrame() toplayout.addWidget(rwy_group) rwy_layout = QHBoxLayout() rwy_group.setLayout( rwy_layout ) rwy_layout.addWidget( QLabel("<b>Runway Presets:</b> ") ) home = QPushButton('Land "HOME"') home.clicked.connect(self.task_rwy_home) rwy_layout.addWidget(home) sprc36 = QPushButton('SPRC 36 (to N)') sprc36.clicked.connect(self.task_rwy_sprc36) rwy_layout.addWidget(sprc36) sprc18 = QPushButton('SPRC 18 (to S)') sprc18.clicked.connect(self.task_rwy_sprc18) rwy_layout.addWidget(sprc18) rwy_layout.addStretch(1) toplayout.addStretch(1) # set initial values self.revert() return toppage def get_widget(self): return self.container def send_value(self, t, prop, val): if len(val): if self.port != 6499: command = "send set," + prop + "," + str(val) print(command) t.send(command) else: command = "set " + prop + " " + str(val) print(command) t.send(command) def update(self): print("update land params") t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") self.send_value(t, "/task/land/lateral_offset_m", self.edit_lat_offset.text()) self.send_value(t, "/task/land/glideslope_deg", self.edit_glideslope.text()) self.send_value(t, "/task/land/turn_radius_m", self.edit_turn_radius.text()) self.send_value(t, "/task/land/direction", self.edit_direction.currentText()) self.send_value(t, "/task/land/extend_final_leg_m", self.edit_final_leg.text()) self.send_value(t, "/task/land/altitude_bias_ft", self.edit_alt_bias.text()) self.send_value(t, "/task/land/approach_speed_kt", self.edit_appr_speed.text()) self.send_value(t, "/task/land/flare_pitch_deg", self.edit_flare_pitch.text()) self.send_value(t, "/task/land/flare_seconds", self.edit_flare_time.text()) # send these last so our 'route' doesn't stay moved long # before we kick into land mode. if len(self.edit_rwy_lon.text()): self.send_value(t, "/task/home/longitude_deg", self.edit_rwy_lon.text()) if len(self.edit_rwy_lat.text()): self.send_value(t, "/task/home/latitude_deg", self.edit_rwy_lat.text()) if len(self.edit_rwy_hdg.text()): self.send_value(t, "/task/home/azimuth_deg", self.edit_rwy_hdg.text()) t.quit() def revert(self): print(str(self.original_values)) # revert form self.edit_rwy_lon.setText( "" ) self.edit_rwy_lat.setText( "" ) self.edit_rwy_hdg.setText( "" ) self.edit_lat_offset.setText( self.original_values[0] ) self.edit_glideslope.setText( self.original_values[1] ) self.edit_turn_radius.setText( self.original_values[2] ) index = self.edit_direction.findText(self.original_values[3]) if index == None: index = 1 self.edit_direction.setCurrentIndex(index) self.edit_final_leg.setText( self.original_values[4] ) self.edit_alt_bias.setText( self.original_values[5] ) self.edit_appr_speed.setText( self.original_values[6] ) self.edit_flare_pitch.setText( self.original_values[7] ) self.edit_flare_time.setText( self.original_values[8] ) def set_runway(self, lon, lat, az): self.edit_rwy_lon.setText( str(lon) ) self.edit_rwy_lat.setText( str(lat) ) self.edit_rwy_hdg.setText( str(az) ) def task_rwy_home(self): print("Set Runway to 'Home'") self.set_runway("", "", "") def task_rwy_sprc36(self): print("Set Runway to SPRC 36") self.set_runway( -93.1454915, 45.2202454, 5 ) def task_rwy_sprc18(self): print("Set Runway to SPRC 18") self.set_runway( -93.1453326, 45.2205971, 185 ) def task_land(self): print("Land!") # send over current landing configuration and touchdown point self.update() t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") cmd = "task,land" az = self.edit_rwy_hdg.text() if len(az): cmd += "," + az if self.port != 6499: cmd = 'send ' + cmd else: cmd = 'set /task/command ' + cmd print('sending:', cmd) t.send(str(cmd)) t.quit() def task_resume(self): print("Resume route ...") t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send("send task,resume") else: t.send("set /task/command task,resume") t.quit()
class ShapedHoleUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index,station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): page = QtGui.QFrame() layout = QtGui.QVBoxLayout() page.setLayout( layout ) line1 = QtGui.QFrame() layout1 = QtGui.QHBoxLayout() line1.setLayout( layout1 ) layout.addWidget( line1 ) line2 = QtGui.QFrame() layout2 = QtGui.QHBoxLayout() line2.setLayout( layout2 ) layout.addWidget( line2 ) layout1.addWidget( QtGui.QLabel("<b>Mat. W:</b> ") ) self.edit_width = QtGui.QLineEdit() self.edit_width.setFixedWidth(50) self.edit_width.textChanged.connect(self.onChange) layout1.addWidget( self.edit_width ) layout1.addWidget( QtGui.QLabel("<b>Corner Rad:</b> ") ) self.edit_radius = QtGui.QLineEdit() self.edit_radius.setFixedWidth(50) self.edit_radius.textChanged.connect(self.onChange) layout1.addWidget( self.edit_radius ) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QtGui.QPushButton('Delete') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) layout2.addWidget( QtGui.QLabel("<b>Start Pos:</b> ") ) self.edit_pos1ref = QComboBoxNoWheel() self.edit_pos1ref.addItem("Chord %") self.edit_pos1ref.addItem("Rel Front") self.edit_pos1ref.addItem("Rel Rear") self.edit_pos1ref.addItem("Abs Pos") self.edit_pos1ref.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_pos1ref) self.edit_pos1 = QtGui.QLineEdit() self.edit_pos1.setFixedWidth(50) self.edit_pos1.textChanged.connect(self.onChange) layout2.addWidget( self.edit_pos1 ) layout2.addWidget( QtGui.QLabel("<b>End Pos:</b> ") ) self.edit_pos2ref = QComboBoxNoWheel() self.edit_pos2ref.addItem("Chord %") self.edit_pos2ref.addItem("Rel Front") self.edit_pos2ref.addItem("Rel Rear") self.edit_pos2ref.addItem("Abs Pos") self.edit_pos2ref.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_pos2ref) self.edit_pos2 = QtGui.QLineEdit() self.edit_pos2.setFixedWidth(50) self.edit_pos2.textChanged.connect(self.onChange) layout2.addWidget( self.edit_pos2 ) layout2.addStretch(1) return page def get_widget(self): return self.container def get_value(self, node): e = self.xml.find(node) if e != None and e.text != None: return e.text else: return "" def parse_xml(self, node): self.xml = node self.edit_width.setText(self.get_value('material-width')) self.edit_radius.setText(self.get_value('corner-radius')) index = self.edit_pos1ref.findText(self.get_value('position1-ref')) if index == None: index = 1 self.edit_pos1ref.setCurrentIndex(index) self.edit_pos1.setText(self.get_value('position1')) index = self.edit_pos2ref.findText(self.get_value('position2-ref')) if index == None: index = 1 self.edit_pos2ref.setCurrentIndex(index) self.edit_pos2.setText(self.get_value('position2')) index = self.edit_start.findText(self.get_value('start-station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(self.get_value('end-station')) if index != None: self.edit_end.setCurrentIndex(index) def update_node(self, node, value): e = self.xml.find(node) if e == None: e = ET.SubElement(self.xml, node) e.text = str(value) def gen_xml(self, node): self.xml = node self.update_node('material-width', self.edit_width.text()) self.update_node('corner-radius', self.edit_radius.text()) self.update_node('position1-ref', self.edit_pos1ref.currentText()) self.update_node('position1', self.edit_pos1.text()) self.update_node('position2-ref', self.edit_pos2ref.currentText()) self.update_node('position2', self.edit_pos2.text()) self.update_node('start-station', self.edit_start.currentText()) self.update_node('end-station', self.edit_end.currentText())
class Launch(): def __init__(self, changefunc, host="localhost", port=6499): self.changefunc = changefunc self.host = host self.port = port self.original_values = [ "20", "150", "300", "0.5", "10.0", "True", "-0.03", "0.5" ] self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def make_page(self): toppage = QtGui.QFrame() toplayout = QtGui.QVBoxLayout() toppage.setLayout(toplayout) page = QtGui.QFrame() layout = QtGui.QFormLayout() page.setLayout( layout ) toplayout.addWidget( page ) self.edit_speed = QtGui.QLineEdit() self.edit_speed.setFixedWidth(350) self.edit_speed.textChanged.connect(self.onChange) self.edit_completion_agl = QtGui.QLineEdit() self.edit_completion_agl.setFixedWidth(350) self.edit_completion_agl.textChanged.connect(self.onChange) self.edit_mission_agl = QtGui.QLineEdit() self.edit_mission_agl.setFixedWidth(350) self.edit_mission_agl.textChanged.connect(self.onChange) self.edit_roll_gain = QtGui.QLineEdit() self.edit_roll_gain.setFixedWidth(350) self.edit_roll_gain.textChanged.connect(self.onChange) self.edit_roll_limit = QtGui.QLineEdit() self.edit_roll_limit.setFixedWidth(350) self.edit_roll_limit.textChanged.connect(self.onChange) self.edit_rudder_enable = QComboBoxNoWheel() self.edit_rudder_enable.setFixedWidth(350) self.edit_rudder_enable.addItem('False') self.edit_rudder_enable.addItem('True') self.edit_rudder_enable.currentIndexChanged.connect(self.onChange) self.edit_rudder_gain = QtGui.QLineEdit() self.edit_rudder_gain.setFixedWidth(350) self.edit_rudder_gain.textChanged.connect(self.onChange) self.rudder_max = QtGui.QLineEdit() self.rudder_max.setFixedWidth(350) self.rudder_max.textChanged.connect(self.onChange) layout.addRow( "<b>Climbout Speed (kts):</b>", self.edit_speed ) layout.addRow( "<b>Completion AGL (ft):</b>", self.edit_completion_agl ) layout.addRow( "<b>Mission AGL (ft):</b>", self.edit_mission_agl ) layout.addRow( "<b>Roll Gain:</b>", self.edit_roll_gain ) layout.addRow( "<b>Roll Limit (deg):</b>", self.edit_roll_limit ) layout.addRow( "<b>Rudder Enable:</b>", self.edit_rudder_enable ) layout.addRow( "<b>Rudder Gain:</b>", self.edit_rudder_gain ) layout.addRow( "<b>Rudder Max (norm):</b>", self.rudder_max ) # 'Command' button bar cmd_group = QtGui.QFrame() toplayout.addWidget(cmd_group) cmd_layout = QtGui.QHBoxLayout() cmd_group.setLayout( cmd_layout ) cmd_layout.addWidget( QtGui.QLabel("<b>Commands:</b> ") ) update = QtGui.QPushButton('Update') update.clicked.connect(self.update) cmd_layout.addWidget(update) revert = QtGui.QPushButton('Revert') revert.clicked.connect(self.revert) cmd_layout.addWidget(revert) launch = QtGui.QPushButton('Launch Now!') launch.clicked.connect(self.task_launch) cmd_layout.addWidget(launch) cmd_layout.addStretch(1) toplayout.addStretch(1) # set initial values self.revert() return toppage def get_widget(self): return self.container def send_value(self, t, prop, val): if len(val): if self.port != 6499: command = "send set," + prop + "," + str(val) print command t.send(command) else: command = "set " + prop + " " + str(val) print command t.send(command) def update(self): print "update launch params" t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") self.send_value(t, "/task/launch/speed_kt", self.edit_speed.text()) self.send_value(t, "/task/launch/completion_agl_ft", self.edit_completion_agl.text()) self.send_value(t, "/task/launch/mission_agl_ft", self.edit_mission_agl.text()) self.send_value(t, "/task/launch/roll_gain", self.edit_roll_gain.text()) self.send_value(t, "/task/launch/roll_limit", self.edit_roll_limit.text()) self.send_value(t, "/task/launch/rudder_enable", self.edit_rudder_enable.currentText()) self.send_value(t, "/task/launch/rudder_gain", self.edit_rudder_gain.text()) self.send_value(t, "/task/launch/rudder_max", self.rudder_max.text()) t.quit() def revert(self): print str(self.original_values) # revert form self.edit_speed.setText( self.original_values[0] ) self.edit_completion_agl.setText( self.original_values[1] ) self.edit_mission_agl.setText( self.original_values[2] ) self.edit_roll_gain.setText( self.original_values[3] ) self.edit_roll_limit.setText( self.original_values[4] ) index = self.edit_rudder_enable.findText(self.original_values[5]) if index == None: index = 1 self.edit_rudder_enable.setCurrentIndex(index) self.edit_rudder_gain.setText( self.original_values[6] ) self.rudder_max.setText( str(self.original_values[7]) ) # send original values to remote self.update() def task_launch(self): print "Launch!" # send over current launching configuration self.update() t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send(str("send task,launch")) else: t.send("set /task/command_request task,launch") t.quit() def task_resume(self): print "Resume route ..." t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send("send task,resume") else: t.send("set /task/command_request task,resume") t.quit()
class SheetUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index,station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): page = QFrame() layout = QVBoxLayout() page.setLayout( layout ) line1 = QFrame() layout1 = QHBoxLayout() line1.setLayout( layout1 ) layout.addWidget( line1 ) line2 = QFrame() layout2 = QHBoxLayout() line2.setLayout( layout2 ) layout.addWidget( line2 ) layout1.addWidget( QLabel("<b>Depth:</b> ") ) self.edit_depth = QLineEdit() self.edit_depth.setFixedWidth(70) self.edit_depth.textChanged.connect(self.onChange) layout1.addWidget( self.edit_depth ) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QPushButton('Delete') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) layout2.addWidget( QLabel("<b>Start Pos:</b> ") ) self.edit_xstart = QLineEdit() self.edit_xstart.setFixedWidth(50) self.edit_xstart.textChanged.connect(self.onChange) layout2.addWidget( self.edit_xstart ) self.edit_xmode = QComboBoxNoWheel() self.edit_xmode.addItem("Sheet Width") self.edit_xmode.addItem("End Position") self.edit_xmode.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_xmode) self.edit_xend = QLineEdit() self.edit_xend.setFixedWidth(50) self.edit_xend.textChanged.connect(self.onChange) layout2.addWidget( self.edit_xend ) self.edit_surface = QComboBoxNoWheel() self.edit_surface.addItem("Top") self.edit_surface.addItem("Bottom") self.edit_surface.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_surface) layout2.addStretch(1) return page def get_widget(self): return self.container def load(self, node): self.edit_depth.setText(node.getString('depth')) self.edit_xstart.setText(node.getString('xstart')) index = self.edit_xmode.findText(node.getString('xmode')) if index == None: index = 1 self.edit_xmode.setCurrentIndex(index) self.edit_xend.setText(node.getString('xend')) index = self.edit_surface.findText(node.getString('surface')) if index == None: index = 1 self.edit_surface.setCurrentIndex(index) index = self.edit_start.findText(node.getString('start_station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(node.getString('end_station')) if index != None: self.edit_end.setCurrentIndex(index) def save(self, node): node.setString('depth', self.edit_depth.text()) node.setString('xstart', self.edit_xstart.text()) node.setString('xmode', self.edit_xmode.currentText()) node.setString('xend', self.edit_xend.text()) node.setString('surface', self.edit_surface.currentText()) node.setString('start_station', self.edit_start.currentText()) node.setString('end_station', self.edit_end.currentText())
class Chirp(): def __init__(self, changefunc, host="localhost", port=6499): self.changefunc = changefunc self.host = host self.port = port self.original_values = ["0.5", "7", "20", "5", "aileron"] self.container = self.make_page() def onChange(self): self.changefunc() def make_page(self): toppage = QtGui.QFrame() toplayout = QtGui.QVBoxLayout() toppage.setLayout(toplayout) page = QtGui.QFrame() layout = QtGui.QFormLayout() page.setLayout(layout) toplayout.addWidget(page) self.edit_start_freq = QtGui.QLineEdit() self.edit_start_freq.setFixedWidth(350) self.edit_start_freq.textChanged.connect(self.onChange) self.edit_end_freq = QtGui.QLineEdit() self.edit_end_freq.setFixedWidth(350) self.edit_end_freq.textChanged.connect(self.onChange) self.edit_duration = QtGui.QLineEdit() self.edit_duration.setFixedWidth(350) self.edit_duration.textChanged.connect(self.onChange) self.edit_ampl = QtGui.QLineEdit() self.edit_ampl.setFixedWidth(350) self.edit_ampl.textChanged.connect(self.onChange) self.edit_inject = QComboBoxNoWheel() self.edit_inject.setFixedWidth(350) self.edit_inject.addItem('aileron') self.edit_inject.addItem('elevator') self.edit_inject.addItem('rudder') self.edit_inject.addItem('flaps') self.edit_inject.addItem('throttle') self.edit_inject.currentIndexChanged.connect(self.onChange) layout.addRow("<b>Start Freqency (hz):</b>", self.edit_start_freq) layout.addRow("<b>End Freqency (hz):</b>", self.edit_end_freq) layout.addRow("<b>Duration (sec):</b>", self.edit_duration) layout.addRow("<b>Amplitude (deg):</b>", self.edit_ampl) layout.addRow("<b>Injection Point:</b>", self.edit_inject) # 'Parameter' button bar param_group = QtGui.QFrame() toplayout.addWidget(param_group) param_layout = QtGui.QHBoxLayout() param_group.setLayout(param_layout) param_layout.addWidget(QtGui.QLabel("<b>Chirp Parameters:</b> ")) update = QtGui.QPushButton('Update') update.clicked.connect(self.update) param_layout.addWidget(update) revert = QtGui.QPushButton('Revert') revert.clicked.connect(self.revert) param_layout.addWidget(revert) param_layout.addStretch(1) # 'Command' button bar cmd_group = QtGui.QFrame() toplayout.addWidget(cmd_group) cmd_layout = QtGui.QHBoxLayout() cmd_group.setLayout(cmd_layout) cmd_layout.addWidget( QtGui.QLabel( "<b>Task Commands: (set params, then engage with physical switch)</b> " )) # circle = QtGui.QPushButton('Circle Here') # circle.clicked.connect(self.task_circle) # cmd_layout.addWidget(circle) # home = QtGui.QPushButton('Go Home (and Circle)') # home.clicked.connect(self.task_home) # cmd_layout.addWidget(home) # resume = QtGui.QPushButton('Resume Route') # resume.clicked.connect(self.task_resume) # cmd_layout.addWidget(resume) cmd_layout.addStretch(1) toplayout.addStretch(1) # set initial values self.revert() return toppage def get_widget(self): return self.container def send_value(self, t, prop, val): if len(val): if self.port != 6499: command = "send set," + prop + "," + str(val) print command t.send(command) else: command = "set " + prop + " " + str(val) print command t.send(command) def update(self): print "update circle hold params" t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") start_str = self.edit_start_freq.text() if start_str == "": start_str = "0.0" freq_start = "%.2f" % (float(start_str) * 2.0 * math.pi) self.send_value(t, "/task/chirp/freq_start_rad_sec", freq_start) end_str = self.edit_end_freq.text() if end_str == "": end_str = "0.0" freq_end = "%.2f" % (float(end_str) * 2.0 * math.pi) self.send_value(t, "/task/chirp/freq_end_rad_sec", freq_end) self.send_value(t, "/task/chirp/duration_sec", self.edit_duration.text()) ampl_str = self.edit_ampl.text() if ampl_str == "": ampl_str = "0.0" ampl = "%.3f" % (float(ampl_str) * math.pi / 180.0) self.send_value(t, "/task/chirp/amplitude", ampl) self.send_value(t, "/controls/signal/inject", self.edit_inject.currentText()) t.quit() def revert(self): print str(self.original_values) # revert form self.edit_start_freq.setText(self.original_values[0]) self.edit_end_freq.setText(self.original_values[1]) self.edit_duration.setText(self.original_values[2]) self.edit_ampl.setText(self.original_values[3]) index = self.edit_inject.findText(self.original_values[4]) if index == None: index = 1 self.edit_inject.setCurrentIndex(index) # send original values to remote self.update()
class Circle(): def __init__(self, changefunc, host="localhost", port=6499): self.changefunc = changefunc self.host = host self.port = port self.original_values = [ "", "", "left", "100" ] self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def make_page(self): toppage = QtGui.QFrame() toplayout = QtGui.QVBoxLayout() toppage.setLayout(toplayout) page = QtGui.QFrame() layout = QtGui.QFormLayout() page.setLayout( layout ) toplayout.addWidget( page ) self.edit_alt = QtGui.QLineEdit() self.edit_alt.setFixedWidth(350) self.edit_alt.textChanged.connect(self.onChange) self.edit_speed = QtGui.QLineEdit() self.edit_speed.setFixedWidth(350) self.edit_speed.textChanged.connect(self.onChange) self.edit_direction = QComboBoxNoWheel() self.edit_direction.setFixedWidth(350) self.edit_direction.addItem('left') self.edit_direction.addItem('right') self.edit_direction.currentIndexChanged.connect(self.onChange) self.edit_radius = QtGui.QLineEdit() self.edit_radius.setFixedWidth(350) self.edit_radius.textChanged.connect(self.onChange) layout.addRow( "<b>Altitude AGL (ft):</b>", self.edit_alt ) layout.addRow( "<b>Speed (kt):</b>", self.edit_speed ) layout.addRow( "<b>Direction:</b>", self.edit_direction ) layout.addRow( "<b>Radius (m):</b>", self.edit_radius ) # 'Parameter' button bar param_group = QtGui.QFrame() toplayout.addWidget(param_group) param_layout = QtGui.QHBoxLayout() param_group.setLayout( param_layout ) param_layout.addWidget( QtGui.QLabel("<b>Circling Parameters:</b> ") ) update = QtGui.QPushButton('Update') update.clicked.connect(self.update) param_layout.addWidget(update) revert = QtGui.QPushButton('Revert') revert.clicked.connect(self.revert) param_layout.addWidget(revert) param_layout.addStretch(1) # 'Command' button bar cmd_group = QtGui.QFrame() toplayout.addWidget(cmd_group) cmd_layout = QtGui.QHBoxLayout() cmd_group.setLayout( cmd_layout ) cmd_layout.addWidget( QtGui.QLabel("<b>Task Commands:</b> ") ) circle = QtGui.QPushButton('Circle Here') circle.clicked.connect(self.task_circle) cmd_layout.addWidget(circle) home = QtGui.QPushButton('Go Home (and Circle)') home.clicked.connect(self.task_home) cmd_layout.addWidget(home) cmd_layout.addStretch(1) toplayout.addStretch(1) # set initial values self.revert() return toppage def get_widget(self): return self.container def send_value(self, t, prop, val): if len(val): if self.port != 6499: command = "send set," + prop + "," + str(val) print command t.send(command) else: command = "set " + prop + " " + str(val) print command t.send(command) def update(self): print "update circle hold params" t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") self.send_value(t, "/autopilot/targets/altitude_agl_ft", self.edit_alt.text()) self.send_value(t, "/autopilot/targets/airspeed_kt", self.edit_speed.text()) self.send_value(t, "/task/circle/direction", self.edit_direction.currentText()) self.send_value(t, "/task/circle/radius_m", self.edit_radius.text()) t.quit() def revert(self): print str(self.original_values) # revert form self.edit_alt.setText( self.original_values[0] ) self.edit_speed.setText( self.original_values[1] ) index = self.edit_direction.findText(self.original_values[2]) if index == None: index = 1 self.edit_direction.setCurrentIndex(index) self.edit_radius.setText( self.original_values[3] ) # send original values to remote self.update() def task_circle(self): print "request circle hold at current location" t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send("send task,circle") else: t.send("set /task/command_request task,circle") t.quit() def task_home(self): print "request circle hold at home" t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send("send task,home") else: t.send("set /task/command_request task,home") t.quit()
class Overview(): def __init__(self, changefunc): self.changefunc = changefunc self.container = self.make_page() self.version = MADversion() def onChange(self): self.changefunc() def make_page(self): # make the full edit widget page = QFrame() layout = QFormLayout() page.setLayout(layout) self.edit_name = QLineEdit() self.edit_name.setFixedWidth(250) self.edit_name.textChanged.connect(self.onChange) self.edit_desc = QTextEdit() self.edit_desc.setFixedWidth(250) self.edit_desc.textChanged.connect(self.onChange) self.edit_author = QLineEdit() self.edit_author.setFixedWidth(250) self.edit_author.textChanged.connect(self.onChange) self.edit_email = QLineEdit() self.edit_email.setFixedWidth(250) self.edit_email.textChanged.connect(self.onChange) self.edit_units = QComboBoxNoWheel() self.edit_units.setFixedWidth(250) self.edit_units.addItem("in") self.edit_units.addItem("cm") self.edit_units.addItem("mm") self.edit_units.currentIndexChanged.connect(self.onChange) self.edit_sheet_w = QLineEdit() self.edit_sheet_w.setFixedWidth(250) self.edit_sheet_w.textChanged.connect(self.onChange) self.edit_sheet_h = QLineEdit() self.edit_sheet_h.setFixedWidth(250) self.edit_sheet_h.textChanged.connect(self.onChange) self.edit_plans_w = QLineEdit() self.edit_plans_w.setFixedWidth(250) self.edit_plans_w.textChanged.connect(self.onChange) self.edit_plans_h = QLineEdit() self.edit_plans_h.setFixedWidth(250) self.edit_plans_h.textChanged.connect(self.onChange) layout.addRow("<b>Design Name:</b>", self.edit_name) layout.addRow("<b>Description:</b>", self.edit_desc) layout.addRow("<b>Author:</b>", self.edit_author) layout.addRow("<b>Email:</b>", self.edit_email) layout.addRow("<b>Units:</b>", self.edit_units) layout.addRow("<b>Mat. Sheet Width:</b>", self.edit_sheet_w) layout.addRow("<b>Mat. Sheet Height:</b>", self.edit_sheet_h) layout.addRow("<b>Plans Width:</b>", self.edit_plans_w) layout.addRow("<b>Plans Height:</b>", self.edit_plans_h) return page def get_widget(self): return self.container def load(self, node): self.edit_name.setText(node.getString('name')) self.edit_desc.setText(node.getString('description')) self.edit_author.setText(node.getString('author')) self.edit_email.setText(node.getString('email')) units = node.getString('units') sheet_w = node.getString('sheet_width') sheet_h = node.getString('sheet_height') if units == "in": if sheet_w == "": sheet_w = "24" if sheet_h == "": sheet_h = "12" elif units == "mm": if sheet_w == "": sheet_w = "600" if sheet_h == "": sheet_h = "300" elif units == "cm": if sheet_w == "": sheet_w = "60" if sheet_h == "": sheet_h = "30" plans_w = node.getString('plans_width') plans_h = node.getString('plans_height') if units == "in": if plans_w == "": plans_w = "24" if plans_h == "": plans_h = "36" elif units == "mm": if plans_w == "": plans_w = "600" if plans_h == "": plans_h = "900" elif units == "cm": if plans_w == "": plans_w = "60" if plans_h == "": plans_h = "90" index = self.edit_units.findText(units) if index == None: index = 0 self.edit_units.setCurrentIndex(index) self.edit_sheet_w.setText(sheet_w) self.edit_sheet_h.setText(sheet_h) self.edit_plans_w.setText(plans_w) self.edit_plans_h.setText(plans_h) writer_version = node.getString('MADversion') if writer_version == "" or float(writer_version) != self.version.get(): if writer_version == "": writer_version = "(unknown)" reply = QMessageBox.question( None, 'Version Alert', 'The design you are loading was created with MAD v' + str(writer_version) + '. You are running v' + str(self.version.get()) + '. The file will be converted as best as possible, but please check your design carefully for any issues.', QMessageBox.Ok) def wipe_clean(self): self.edit_name.setText('') self.edit_desc.setText('') self.edit_author.setText('') self.edit_email.setText('') self.edit_units.setCurrentIndex(0) self.edit_sheet_w.setText('24') self.edit_sheet_h.setText('12') self.edit_plans_w.setText('24') self.edit_plans_h.setText('36') def save(self, node): node.setString('MADversion', str(self.version.get())) node.setString('name', self.edit_name.text()) node.setString('description', self.edit_desc.toPlainText()) node.setString('author', self.edit_author.text()) node.setString('email', self.edit_email.text()) node.setString('units', self.edit_units.currentText()) node.setString('sheet_width', self.edit_sheet_w.text()) node.setString('sheet_height', self.edit_sheet_h.text()) node.setString('plans_width', self.edit_plans_w.text()) node.setString('plans_height', self.edit_plans_h.text())
class SimpleHoleUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index, station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): page = QFrame() layout = QVBoxLayout() page.setLayout(layout) line1 = QFrame() layout1 = QHBoxLayout() line1.setLayout(layout1) layout.addWidget(line1) line2 = QFrame() layout2 = QHBoxLayout() line2.setLayout(layout2) layout.addWidget(line2) self.edit_style = QComboBoxNoWheel() self.edit_style.addItem("Radius") self.edit_style.addItem("% Height") self.edit_style.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_style) layout1.addWidget(QLabel("<b>Radius:</b> ")) self.edit_size = QLineEdit() self.edit_size.setFixedWidth(50) self.edit_size.textChanged.connect(self.onChange) layout1.addWidget(self.edit_size) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QPushButton('Delete') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) layout2.addWidget(QLabel("<b>Pos:</b> ")) self.edit_posref = QComboBoxNoWheel() self.edit_posref.addItem("Chord %") self.edit_posref.addItem("Rel Front") self.edit_posref.addItem("Rel Rear") self.edit_posref.addItem("Abs Pos") self.edit_posref.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_posref) self.edit_pos = QLineEdit() self.edit_pos.setFixedWidth(50) self.edit_pos.textChanged.connect(self.onChange) layout2.addWidget(self.edit_pos) layout2.addStretch(1) return page def get_widget(self): return self.container def load(self, node): index = self.edit_style.findText(node.getString('style')) if index == None: index = 1 self.edit_style.setCurrentIndex(index) self.edit_size.setText(node.getString('size')) index = self.edit_posref.findText(node.getString('position_ref')) if index == None: index = 1 self.edit_posref.setCurrentIndex(index) self.edit_pos.setText(node.getString('position')) index = self.edit_start.findText(node.getString('start_station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(node.getString('end_station')) if index != None: self.edit_end.setCurrentIndex(index) def save(self, node): node.setString('style', self.edit_style.currentText()) node.setString('size', self.edit_size.text()) node.setString('position_ref', self.edit_posref.currentText()) node.setString('position', self.edit_pos.text()) node.setString('start_station', self.edit_start.currentText()) node.setString('end_station', self.edit_end.currentText())
class FlapUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index, station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): page = QtGui.QFrame() layout = QtGui.QVBoxLayout() page.setLayout(layout) line1 = QtGui.QFrame() layout1 = QtGui.QHBoxLayout() line1.setLayout(layout1) layout.addWidget(line1) line2 = QtGui.QFrame() layout2 = QtGui.QHBoxLayout() line2.setLayout(layout2) layout.addWidget(line2) line3 = QtGui.QFrame() layout3 = QtGui.QHBoxLayout() line3.setLayout(layout3) layout.addWidget(line3) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QtGui.QPushButton('Delete') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) layout2.addWidget(QtGui.QLabel("<b>Pos:</b> ")) self.edit_posref = QComboBoxNoWheel() self.edit_posref.addItem("Chord %") self.edit_posref.addItem("Rel Front") self.edit_posref.addItem("Rel Rear") self.edit_posref.addItem("Abs Pos") self.edit_posref.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_posref) self.edit_pos = QtGui.QLineEdit() self.edit_pos.setFixedWidth(50) self.edit_pos.textChanged.connect(self.onChange) layout2.addWidget(self.edit_pos) layout2.addWidget(QtGui.QLabel("<b>At Station:</b> ")) self.edit_atstation = QtGui.QLineEdit() self.edit_atstation.setFixedWidth(50) self.edit_atstation.textChanged.connect(self.onChange) layout2.addWidget(self.edit_atstation) layout2.addWidget(QtGui.QLabel("<b>Slope:</b> ")) self.edit_slope = QtGui.QLineEdit() self.edit_slope.setFixedWidth(50) self.edit_slope.textChanged.connect(self.onChange) layout2.addWidget(self.edit_slope) layout2.addStretch(1) layout3.addWidget(QtGui.QLabel("<b>Edge Stringer W x H:</b> ")) self.edit_width = QtGui.QLineEdit() self.edit_width.setFixedWidth(50) self.edit_width.textChanged.connect(self.onChange) layout3.addWidget(self.edit_width) self.edit_height = QtGui.QLineEdit() self.edit_height.setFixedWidth(50) self.edit_height.textChanged.connect(self.onChange) layout3.addWidget(self.edit_height) layout3.addWidget(QtGui.QLabel("<b>Hinge Cutout Angle:</b> ")) self.edit_angle = QtGui.QLineEdit() self.edit_angle.setFixedWidth(50) self.edit_angle.textChanged.connect(self.onChange) layout3.addWidget(self.edit_angle) layout3.addStretch(1) return page def get_widget(self): return self.container def get_value(self, node): e = self.xml.find(node) if e != None and e.text != None: return e.text else: return "" def parse_xml(self, node): self.xml = node self.edit_width.setText(self.get_value('width')) self.edit_height.setText(self.get_value('height')) index = self.edit_posref.findText(self.get_value('position-ref')) if index == None: index = 1 self.edit_posref.setCurrentIndex(index) self.edit_pos.setText(self.get_value('position')) self.edit_atstation.setText(self.get_value('at-station')) self.edit_slope.setText(self.get_value('slope')) self.edit_angle.setText(self.get_value('angle')) index = self.edit_start.findText(self.get_value('start-station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(self.get_value('end-station')) if index != None: self.edit_end.setCurrentIndex(index) def update_node(self, node, value): e = self.xml.find(node) if e == None: e = ET.SubElement(self.xml, node) e.text = str(value) def gen_xml(self, node): self.xml = node self.update_node('width', self.edit_width.text()) self.update_node('height', self.edit_height.text()) self.update_node('position-ref', self.edit_posref.currentText()) self.update_node('position', self.edit_pos.text()) self.update_node('at-station', self.edit_atstation.text()) self.update_node('slope', self.edit_slope.text()) self.update_node('angle', self.edit_angle.text()) self.update_node('start-station', self.edit_start.currentText()) self.update_node('end-station', self.edit_end.currentText())
class FlapUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index,station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): page = QtGui.QFrame() layout = QtGui.QVBoxLayout() page.setLayout( layout ) line1 = QtGui.QFrame() layout1 = QtGui.QHBoxLayout() line1.setLayout( layout1 ) layout.addWidget( line1 ) line2 = QtGui.QFrame() layout2 = QtGui.QHBoxLayout() line2.setLayout( layout2 ) layout.addWidget( line2 ) line3 = QtGui.QFrame() layout3 = QtGui.QHBoxLayout() line3.setLayout( layout3 ) layout.addWidget( line3 ) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QtGui.QPushButton('Delete') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) layout2.addWidget( QtGui.QLabel("<b>Pos:</b> ") ) self.edit_posref = QComboBoxNoWheel() self.edit_posref.addItem("Chord %") self.edit_posref.addItem("Rel Front") self.edit_posref.addItem("Rel Rear") self.edit_posref.addItem("Abs Pos") self.edit_posref.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_posref) self.edit_pos = QtGui.QLineEdit() self.edit_pos.setFixedWidth(50) self.edit_pos.textChanged.connect(self.onChange) layout2.addWidget( self.edit_pos ) layout2.addWidget( QtGui.QLabel("<b>At Station:</b> ") ) self.edit_atstation = QtGui.QLineEdit() self.edit_atstation.setFixedWidth(50) self.edit_atstation.textChanged.connect(self.onChange) layout2.addWidget( self.edit_atstation ) layout2.addWidget( QtGui.QLabel("<b>Slope:</b> ") ) self.edit_slope = QtGui.QLineEdit() self.edit_slope.setFixedWidth(50) self.edit_slope.textChanged.connect(self.onChange) layout2.addWidget( self.edit_slope ) layout2.addStretch(1) layout3.addWidget( QtGui.QLabel("<b>Edge Stringer W x H:</b> ") ) self.edit_width = QtGui.QLineEdit() self.edit_width.setFixedWidth(50) self.edit_width.textChanged.connect(self.onChange) layout3.addWidget( self.edit_width ) self.edit_height = QtGui.QLineEdit() self.edit_height.setFixedWidth(50) self.edit_height.textChanged.connect(self.onChange) layout3.addWidget( self.edit_height ) layout3.addWidget( QtGui.QLabel("<b>Hinge Cutout Angle:</b> ") ) self.edit_angle = QtGui.QLineEdit() self.edit_angle.setFixedWidth(50) self.edit_angle.textChanged.connect(self.onChange) layout3.addWidget( self.edit_angle ) layout3.addStretch(1) return page def get_widget(self): return self.container def get_value(self, node): e = self.xml.find(node) if e != None and e.text != None: return e.text else: return "" def parse_xml(self, node): self.xml = node self.edit_width.setText(self.get_value('width')) self.edit_height.setText(self.get_value('height')) index = self.edit_posref.findText(self.get_value('position-ref')) if index == None: index = 1 self.edit_posref.setCurrentIndex(index) self.edit_pos.setText(self.get_value('position')) self.edit_atstation.setText(self.get_value('at-station')) self.edit_slope.setText(self.get_value('slope')) self.edit_angle.setText(self.get_value('angle')) index = self.edit_start.findText(self.get_value('start-station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(self.get_value('end-station')) if index != None: self.edit_end.setCurrentIndex(index) def update_node(self, node, value): e = self.xml.find(node) if e == None: e = ET.SubElement(self.xml, node) e.text = str(value) def gen_xml(self, node): self.xml = node self.update_node('width', self.edit_width.text()) self.update_node('height', self.edit_height.text()) self.update_node('position-ref', self.edit_posref.currentText()) self.update_node('position', self.edit_pos.text()) self.update_node('at-station', self.edit_atstation.text()) self.update_node('slope', self.edit_slope.text()) self.update_node('angle', self.edit_angle.text()) self.update_node('start-station', self.edit_start.currentText()) self.update_node('end-station', self.edit_end.currentText())
class TrailingEdgeUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index,station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): # make the edit line page = QtGui.QFrame() layout = QtGui.QVBoxLayout() page.setLayout( layout ) line1 = QtGui.QFrame() layout1 = QtGui.QHBoxLayout() line1.setLayout( layout1 ) layout.addWidget( line1 ) layout1.addWidget( QtGui.QLabel("<b>W x H:</b> ") ) self.edit_width = QtGui.QLineEdit() self.edit_width.setFixedWidth(50) self.edit_width.textChanged.connect(self.onChange) layout1.addWidget( self.edit_width ) self.edit_height = QtGui.QLineEdit() self.edit_height.setFixedWidth(50) self.edit_height.textChanged.connect(self.onChange) layout1.addWidget( self.edit_height ) self.edit_shape = QComboBoxNoWheel() self.edit_shape.addItem("Flat") self.edit_shape.addItem("Symmetrical") self.edit_shape.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_shape) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QtGui.QPushButton('Delete ') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) return page def get_widget(self): return self.container def get_value(self, node): e = self.xml.find(node) if e != None and e.text != None: return e.text else: return "" def parse_xml(self, node): self.xml = node self.edit_width.setText(self.get_value('width')) self.edit_height.setText(self.get_value('height')) index = self.edit_shape.findText(self.get_value('shape')) if index == None: index = 1 self.edit_shape.setCurrentIndex(index) index = self.edit_start.findText(self.get_value('start-station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(self.get_value('end-station')) if index != None: self.edit_end.setCurrentIndex(index) def update_node(self, node, value): e = self.xml.find(node) if e == None: e = ET.SubElement(self.xml, node) e.text = str(value) def gen_xml(self, node): self.xml = node self.update_node('width', self.edit_width.text()) self.update_node('height', self.edit_height.text()) self.update_node('shape', self.edit_shape.currentText()) self.update_node('start-station', self.edit_start.currentText()) self.update_node('end-station', self.edit_end.currentText())
class Chirp(): def __init__(self, changefunc, host="localhost", port=6499): self.changefunc = changefunc self.host = host self.port = port self.original_values = [ "0.5", "7", "20", "5", "aileron" ] self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def make_page(self): toppage = QtGui.QFrame() toplayout = QtGui.QVBoxLayout() toppage.setLayout(toplayout) page = QtGui.QFrame() layout = QtGui.QFormLayout() page.setLayout( layout ) toplayout.addWidget( page ) self.edit_start_freq = QtGui.QLineEdit() self.edit_start_freq.setFixedWidth(350) self.edit_start_freq.textChanged.connect(self.onChange) self.edit_end_freq = QtGui.QLineEdit() self.edit_end_freq.setFixedWidth(350) self.edit_end_freq.textChanged.connect(self.onChange) self.edit_duration = QtGui.QLineEdit() self.edit_duration.setFixedWidth(350) self.edit_duration.textChanged.connect(self.onChange) self.edit_ampl = QtGui.QLineEdit() self.edit_ampl.setFixedWidth(350) self.edit_ampl.textChanged.connect(self.onChange) self.edit_inject = QComboBoxNoWheel() self.edit_inject.setFixedWidth(350) self.edit_inject.addItem('aileron') self.edit_inject.addItem('elevator') self.edit_inject.addItem('rudder') self.edit_inject.addItem('flaps') self.edit_inject.addItem('throttle') self.edit_inject.currentIndexChanged.connect(self.onChange) layout.addRow( "<b>Start Freqency (hz):</b>", self.edit_start_freq ) layout.addRow( "<b>End Freqency (hz):</b>", self.edit_end_freq ) layout.addRow( "<b>Duration (sec):</b>", self.edit_duration ) layout.addRow( "<b>Amplitude (deg):</b>", self.edit_ampl ) layout.addRow( "<b>Injection Point:</b>", self.edit_inject ) # 'Parameter' button bar param_group = QtGui.QFrame() toplayout.addWidget(param_group) param_layout = QtGui.QHBoxLayout() param_group.setLayout( param_layout ) param_layout.addWidget( QtGui.QLabel("<b>Chirp Parameters:</b> ") ) update = QtGui.QPushButton('Update') update.clicked.connect(self.update) param_layout.addWidget(update) revert = QtGui.QPushButton('Revert') revert.clicked.connect(self.revert) param_layout.addWidget(revert) param_layout.addStretch(1) # 'Command' button bar cmd_group = QtGui.QFrame() toplayout.addWidget(cmd_group) cmd_layout = QtGui.QHBoxLayout() cmd_group.setLayout( cmd_layout ) cmd_layout.addWidget( QtGui.QLabel("<b>Task Commands: (set params, then engage with physical switch)</b> ") ) # circle = QtGui.QPushButton('Circle Here') # circle.clicked.connect(self.task_circle) # cmd_layout.addWidget(circle) # home = QtGui.QPushButton('Go Home (and Circle)') # home.clicked.connect(self.task_home) # cmd_layout.addWidget(home) # resume = QtGui.QPushButton('Resume Route') # resume.clicked.connect(self.task_resume) # cmd_layout.addWidget(resume) cmd_layout.addStretch(1) toplayout.addStretch(1) # set initial values self.revert() return toppage def get_widget(self): return self.container def send_value(self, t, prop, val): if len(val): if self.port != 6499: command = "send set," + prop + "," + str(val) print command t.send(command) else: command = "set " + prop + " " + str(val) print command t.send(command) def update(self): print "update circle hold params" t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") start_str = self.edit_start_freq.text() if start_str == "": start_str = "0.0" freq_start = "%.2f" % (float(start_str) * 2.0 * math.pi) self.send_value(t, "/task/chirp/freq_start_rad_sec", freq_start) end_str = self.edit_end_freq.text() if end_str == "": end_str = "0.0" freq_end = "%.2f" % (float(end_str) * 2.0 * math.pi) self.send_value(t, "/task/chirp/freq_end_rad_sec", freq_end) self.send_value(t, "/task/chirp/duration_sec", self.edit_duration.text()) ampl_str = self.edit_ampl.text() if ampl_str == "": ampl_str = "0.0" ampl = "%.3f" % (float(ampl_str) * math.pi / 180.0) self.send_value(t, "/task/chirp/amplitude", ampl) self.send_value(t, "/task/chirp/inject", self.edit_inject.currentText()) t.quit() def revert(self): print str(self.original_values) # revert form self.edit_start_freq.setText( self.original_values[0] ) self.edit_end_freq.setText( self.original_values[1] ) self.edit_duration.setText( self.original_values[2] ) self.edit_ampl.setText( self.original_values[3] ) index = self.edit_inject.findText(self.original_values[4]) if index == None: index = 1 self.edit_inject.setCurrentIndex(index) # send original values to remote self.update()
class Launch(): def __init__(self, changefunc, host="localhost", port=6499): self.changefunc = changefunc self.host = host self.port = port self.original_values = [ "20", "150", "300", "0.5", "10.0", "True", "-0.03", "0.5" ] self.container = self.make_page() def onChange(self): self.changefunc() def make_page(self): toppage = QFrame() toplayout = QVBoxLayout() toppage.setLayout(toplayout) page = QFrame() layout = QFormLayout() page.setLayout(layout) toplayout.addWidget(page) self.edit_speed = QLineEdit() self.edit_speed.setFixedWidth(350) self.edit_speed.textChanged.connect(self.onChange) self.edit_completion_agl = QLineEdit() self.edit_completion_agl.setFixedWidth(350) self.edit_completion_agl.textChanged.connect(self.onChange) self.edit_mission_agl = QLineEdit() self.edit_mission_agl.setFixedWidth(350) self.edit_mission_agl.textChanged.connect(self.onChange) self.edit_roll_gain = QLineEdit() self.edit_roll_gain.setFixedWidth(350) self.edit_roll_gain.textChanged.connect(self.onChange) self.edit_roll_limit = QLineEdit() self.edit_roll_limit.setFixedWidth(350) self.edit_roll_limit.textChanged.connect(self.onChange) self.edit_rudder_enable = QComboBoxNoWheel() self.edit_rudder_enable.setFixedWidth(350) self.edit_rudder_enable.addItem('False') self.edit_rudder_enable.addItem('True') self.edit_rudder_enable.currentIndexChanged.connect(self.onChange) self.edit_rudder_gain = QLineEdit() self.edit_rudder_gain.setFixedWidth(350) self.edit_rudder_gain.textChanged.connect(self.onChange) self.rudder_max = QLineEdit() self.rudder_max.setFixedWidth(350) self.rudder_max.textChanged.connect(self.onChange) layout.addRow("<b>Climbout Speed (kts):</b>", self.edit_speed) layout.addRow("<b>Completion AGL (ft):</b>", self.edit_completion_agl) layout.addRow("<b>Mission AGL (ft):</b>", self.edit_mission_agl) layout.addRow("<b>Roll Gain:</b>", self.edit_roll_gain) layout.addRow("<b>Roll Limit (deg):</b>", self.edit_roll_limit) layout.addRow("<b>Rudder Enable:</b>", self.edit_rudder_enable) layout.addRow("<b>Rudder Gain:</b>", self.edit_rudder_gain) layout.addRow("<b>Rudder Max (norm):</b>", self.rudder_max) # 'Command' button bar cmd_group = QFrame() toplayout.addWidget(cmd_group) cmd_layout = QHBoxLayout() cmd_group.setLayout(cmd_layout) cmd_layout.addWidget(QLabel("<b>Commands:</b> ")) update = QPushButton('Update') update.clicked.connect(self.update) cmd_layout.addWidget(update) revert = QPushButton('Revert') revert.clicked.connect(self.revert) cmd_layout.addWidget(revert) launch = QPushButton('Launch Now!') launch.clicked.connect(self.task_launch) cmd_layout.addWidget(launch) cmd_layout.addStretch(1) toplayout.addStretch(1) # set initial values self.revert() return toppage def get_widget(self): return self.container def send_value(self, t, prop, val): if len(val): if self.port != 6499: command = "send set," + prop + "," + str(val) print(command) t.send(command) else: command = "set " + prop + " " + str(val) print(command) t.send(command) def update(self): print("update launch params") t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") self.send_value(t, "/task/launch/speed_kt", self.edit_speed.text()) self.send_value(t, "/task/launch/completion_agl_ft", self.edit_completion_agl.text()) self.send_value(t, "/task/launch/mission_agl_ft", self.edit_mission_agl.text()) self.send_value(t, "/task/launch/roll_gain", self.edit_roll_gain.text()) self.send_value(t, "/task/launch/roll_limit", self.edit_roll_limit.text()) self.send_value(t, "/task/launch/rudder_enable", self.edit_rudder_enable.currentText()) self.send_value(t, "/task/launch/rudder_gain", self.edit_rudder_gain.text()) self.send_value(t, "/task/launch/rudder_max", self.rudder_max.text()) t.quit() def revert(self): print(str(self.original_values)) # revert form self.edit_speed.setText(self.original_values[0]) self.edit_completion_agl.setText(self.original_values[1]) self.edit_mission_agl.setText(self.original_values[2]) self.edit_roll_gain.setText(self.original_values[3]) self.edit_roll_limit.setText(self.original_values[4]) index = self.edit_rudder_enable.findText(self.original_values[5]) if index == None: index = 1 self.edit_rudder_enable.setCurrentIndex(index) self.edit_rudder_gain.setText(self.original_values[6]) self.rudder_max.setText(str(self.original_values[7])) # send original values to remote # no # self.update() def task_launch(self): print("Launch!") # send over current launching configuration self.update() t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send("send task,launch") else: t.send("set /task/command launch") t.quit() def task_resume(self): print("Resume route ...") t = fgtelnet.FGTelnet(self.host, self.port) t.send("data") if self.port != 6499: t.send("send task,resume") else: t.send("set /task/command resume") t.quit()
class ShapedHoleUI(): def __init__(self, changefunc): self.valid = True self.changefunc = changefunc self.container = self.make_page() self.xml = None def onChange(self): self.changefunc() def rebuild_stations(self, stations): station_list = str(stations).split() start_text = self.edit_start.currentText() end_text = self.edit_end.currentText() self.edit_start.clear() self.edit_start.addItem("Start: Inner") self.edit_end.clear() self.edit_end.addItem("End: Outer") for index, station in enumerate(station_list): text = "Start: " + str(station) self.edit_start.addItem(text) text = "End: " + str(station) self.edit_end.addItem(text) index = self.edit_start.findText(start_text) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(end_text) if index != None: self.edit_end.setCurrentIndex(index) def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self): page = QtGui.QFrame() layout = QtGui.QVBoxLayout() page.setLayout(layout) line1 = QtGui.QFrame() layout1 = QtGui.QHBoxLayout() line1.setLayout(layout1) layout.addWidget(line1) line2 = QtGui.QFrame() layout2 = QtGui.QHBoxLayout() line2.setLayout(layout2) layout.addWidget(line2) layout1.addWidget(QtGui.QLabel("<b>Mat. W:</b> ")) self.edit_width = QtGui.QLineEdit() self.edit_width.setFixedWidth(50) self.edit_width.textChanged.connect(self.onChange) layout1.addWidget(self.edit_width) layout1.addWidget(QtGui.QLabel("<b>Corner Rad:</b> ")) self.edit_radius = QtGui.QLineEdit() self.edit_radius.setFixedWidth(50) self.edit_radius.textChanged.connect(self.onChange) layout1.addWidget(self.edit_radius) self.edit_start = QComboBoxNoWheel() self.edit_start.addItem("-") self.edit_start.addItem("1") self.edit_start.addItem("2") self.edit_start.addItem("3") self.edit_start.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_start) self.edit_end = QComboBoxNoWheel() self.edit_end.addItem("-") self.edit_end.addItem("1") self.edit_end.addItem("2") self.edit_end.addItem("3") self.edit_end.currentIndexChanged.connect(self.onChange) layout1.addWidget(self.edit_end) layout1.addStretch(1) delete = QtGui.QPushButton('Delete') delete.clicked.connect(self.delete_self) layout1.addWidget(delete) layout2.addWidget(QtGui.QLabel("<b>Start Pos:</b> ")) self.edit_pos1ref = QComboBoxNoWheel() self.edit_pos1ref.addItem("Chord %") self.edit_pos1ref.addItem("Rel Front") self.edit_pos1ref.addItem("Rel Rear") self.edit_pos1ref.addItem("Abs Pos") self.edit_pos1ref.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_pos1ref) self.edit_pos1 = QtGui.QLineEdit() self.edit_pos1.setFixedWidth(50) self.edit_pos1.textChanged.connect(self.onChange) layout2.addWidget(self.edit_pos1) layout2.addWidget(QtGui.QLabel("<b>End Pos:</b> ")) self.edit_pos2ref = QComboBoxNoWheel() self.edit_pos2ref.addItem("Chord %") self.edit_pos2ref.addItem("Rel Front") self.edit_pos2ref.addItem("Rel Rear") self.edit_pos2ref.addItem("Abs Pos") self.edit_pos2ref.currentIndexChanged.connect(self.onChange) layout2.addWidget(self.edit_pos2ref) self.edit_pos2 = QtGui.QLineEdit() self.edit_pos2.setFixedWidth(50) self.edit_pos2.textChanged.connect(self.onChange) layout2.addWidget(self.edit_pos2) layout2.addStretch(1) return page def get_widget(self): return self.container def get_value(self, node): e = self.xml.find(node) if e != None and e.text != None: return e.text else: return "" def parse_xml(self, node): self.xml = node self.edit_width.setText(self.get_value('material-width')) self.edit_radius.setText(self.get_value('corner-radius')) index = self.edit_pos1ref.findText(self.get_value('position1-ref')) if index == None: index = 1 self.edit_pos1ref.setCurrentIndex(index) self.edit_pos1.setText(self.get_value('position1')) index = self.edit_pos2ref.findText(self.get_value('position2-ref')) if index == None: index = 1 self.edit_pos2ref.setCurrentIndex(index) self.edit_pos2.setText(self.get_value('position2')) index = self.edit_start.findText(self.get_value('start-station')) if index != None: self.edit_start.setCurrentIndex(index) index = self.edit_end.findText(self.get_value('end-station')) if index != None: self.edit_end.setCurrentIndex(index) def update_node(self, node, value): e = self.xml.find(node) if e == None: e = ET.SubElement(self.xml, node) e.text = str(value) def gen_xml(self, node): self.xml = node self.update_node('material-width', self.edit_width.text()) self.update_node('corner-radius', self.edit_radius.text()) self.update_node('position1-ref', self.edit_pos1ref.currentText()) self.update_node('position1', self.edit_pos1.text()) self.update_node('position2-ref', self.edit_pos2ref.currentText()) self.update_node('position2', self.edit_pos2.text()) self.update_node('start-station', self.edit_start.currentText()) self.update_node('end-station', self.edit_end.currentText())