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 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 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 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 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 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 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 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 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 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 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 WingUI(): def __init__(self, changefunc, name="New"): self.valid = True self.changefunc = changefunc self.container = self.make_page(name=name) self.wing_link = "none" self.leading_edges = [] self.trailing_edges = [] self.spars = [] self.stringers = [] self.sheeting = [] self.simple_holes = [] self.shaped_holes = [] self.build_tabs = [] self.flaps = [] def onChange(self): self.changefunc() def rebuildStations(self): self.changefunc() # rebuild stations when station list has changed for le in self.leading_edges: if le.valid: le.rebuild_stations(self.edit_stations.text()) for te in self.trailing_edges: if te.valid: te.rebuild_stations(self.edit_stations.text()) for spar in self.spars: if spar.valid: spar.rebuild_stations(self.edit_stations.text()) for stringer in self.stringers: if stringer.valid: stringer.rebuild_stations(self.edit_stations.text()) for sheet in self.sheeting: if sheet.valid: sheet.rebuild_stations(self.edit_stations.text()) for hole in self.simple_holes: if hole.valid: hole.rebuild_stations(self.edit_stations.text()) for hole in self.shaped_holes: if hole.valid: hole.rebuild_stations(self.edit_stations.text()) for tab in self.build_tabs: if tab.valid: tab.rebuild_stations(self.edit_stations.text()) for flap in self.flaps: if flap.valid: flap.rebuild_stations(self.edit_stations.text()) def rebuild_wing_list(self, wing_list=[]): myname = self.get_name() wing_link_text = self.edit_wing_link.currentText() print "wing_link_text = " + str(wing_link_text) if wing_link_text == None or wing_link_text == "none": if self.wing_link != "": print "Connecting up with saved name: " + self.wing_link wing_link_text = self.wing_link self.edit_wing_link.clear() self.edit_wing_link.addItem("none") for index,wing in enumerate(wing_list): if ( wing != myname ): self.edit_wing_link.addItem(wing) index = self.edit_wing_link.findText(wing_link_text) if index != None: self.edit_wing_link.setCurrentIndex(index) else: self.edit_wing_link.setCurrentIndex(0) def select_airfoil_root(self): basepath = os.path.split(os.path.realpath(__file__))[0] airfoil_path = os.path.join(basepath, "../airfoils/") (filename, mask) = QFileDialog.getOpenFileName(None, "Open File", airfoil_path, "Airfoil (*.dat)") if ( filename == "" ): return basename = os.path.basename(str(filename)) fileroot, ext = os.path.splitext(basename) self.edit_airfoil_root.setText(fileroot) def select_airfoil_tip(self): basepath = os.path.split(os.path.realpath(__file__))[0] airfoil_path = os.path.join(basepath, "../airfoils/") (filename, mask) = QFileDialog.getOpenFileName(None, "Open File", airfoil_path, "Airfoil (*.dat)") if ( filename == "" ): return basename = os.path.basename(str(filename)) fileroot, ext = os.path.splitext(basename) self.edit_airfoil_tip.setText(fileroot) def generate_stations(self): text, ok = QInputDialog.getText(None, 'Input Dialog', 'Enter number of stations (ribs):') if ok: span = float(self.edit_span.text()) num = int(text) spacing = span / float(num) stations = "" pos = 0.0 for i in range(num): #print str(i) + " " + str(pos) stations += ("%.2f" % pos).rstrip('0').rstrip('.') + " " pos += spacing stations += ("%.2f" % span).rstrip('0').rstrip('.') self.edit_stations.setText(stations) def add_leading_edge(self, xml_node=None): leading_edge = LeadingEdgeUI(self.changefunc) leading_edge.rebuild_stations(self.edit_stations.text()) if xml_node != None: leading_edge.load(xml_node) self.leading_edges.append(leading_edge) self.layout_le.addWidget( leading_edge.get_widget() ) self.changefunc() def add_trailing_edge(self, xml_node=None): trailing_edge = TrailingEdgeUI(self.changefunc) trailing_edge.rebuild_stations(self.edit_stations.text()) if xml_node != None: trailing_edge.load(xml_node) self.trailing_edges.append(trailing_edge) self.layout_te.addWidget( trailing_edge.get_widget() ) self.changefunc() def add_spar(self, xml_node=None): spar = SparUI(self.changefunc) spar.rebuild_stations(self.edit_stations.text()) if xml_node != None: spar.load(xml_node) self.spars.append(spar) self.layout_spars.addWidget( spar.get_widget() ) self.changefunc() def add_stringer(self, xml_node=None): stringer = SparUI(self.changefunc) stringer.rebuild_stations(self.edit_stations.text()) if xml_node != None: stringer.load(xml_node) self.stringers.append(stringer) self.layout_stringers.addWidget( stringer.get_widget() ) self.changefunc() def add_sheet(self, xml_node=None): sheet = SheetUI(self.changefunc) sheet.rebuild_stations(self.edit_stations.text()) if xml_node != None: sheet.load(xml_node) self.sheeting.append(sheet) self.layout_sheeting.addWidget( sheet.get_widget() ) self.changefunc() def add_simple_hole(self, xml_node=None): hole = SimpleHoleUI(self.changefunc) hole.rebuild_stations(self.edit_stations.text()) if xml_node != None: hole.load(xml_node) self.simple_holes.append(hole) self.layout_simple_holes.addWidget( hole.get_widget() ) self.changefunc() def add_shaped_hole(self, xml_node=None): hole = ShapedHoleUI(self.changefunc) hole.rebuild_stations(self.edit_stations.text()) if xml_node != None: hole.load(xml_node) self.shaped_holes.append(hole) self.layout_shaped_holes.addWidget( hole.get_widget() ) self.changefunc() def add_build_tab(self, xml_node=None): tab = BuildTabUI(self.changefunc) tab.rebuild_stations(self.edit_stations.text()) if xml_node != None: tab.load(xml_node) self.build_tabs.append(tab) self.layout_build_tabs.addWidget( tab.get_widget() ) self.changefunc() def add_flap(self, xml_node=None): flap = FlapUI(self.changefunc) flap.rebuild_stations(self.edit_stations.text()) if xml_node != None: flap.load(xml_node) self.flaps.append(flap) self.layout_flaps.addWidget( flap.get_widget() ) self.changefunc() def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self, name): # make the full edit widget toppage = QFrame() toplayout = QVBoxLayout() toppage.setLayout(toplayout) page = QFrame() layout = QVBoxLayout() page.setLayout(layout) maincontents = QFrame() formlayout = QFormLayout() maincontents.setLayout( formlayout ) layout.addWidget(maincontents) scroll = QScrollArea() scroll.setWidget(page) scroll.setWidgetResizable(True) #layout.addWidget(scroll) toplayout.addWidget(scroll) frame = QGroupBox("Leading Edges") self.layout_le = QVBoxLayout() frame.setLayout(self.layout_le) layout.addWidget(frame) frame = QGroupBox("Trailing Edges") self.layout_te = QVBoxLayout() frame.setLayout(self.layout_te) layout.addWidget(frame) frame = QGroupBox("Spars") self.layout_spars = QVBoxLayout() frame.setLayout(self.layout_spars) layout.addWidget(frame) frame = QGroupBox("Stringers") self.layout_stringers = QVBoxLayout() frame.setLayout(self.layout_stringers) layout.addWidget(frame) frame = QGroupBox("Sheeting") self.layout_sheeting = QVBoxLayout() frame.setLayout(self.layout_sheeting) layout.addWidget(frame) frame = QGroupBox("Simple Holes") self.layout_simple_holes = QVBoxLayout() frame.setLayout(self.layout_simple_holes) layout.addWidget(frame) frame = QGroupBox("Shaped Holes") self.layout_shaped_holes = QVBoxLayout() frame.setLayout(self.layout_shaped_holes) layout.addWidget(frame) frame = QGroupBox("Build Tabs") self.layout_build_tabs = QVBoxLayout() frame.setLayout(self.layout_build_tabs) layout.addWidget(frame) frame = QGroupBox("Control Surfaces") self.layout_flaps = QVBoxLayout() frame.setLayout(self.layout_flaps) layout.addWidget(frame) # 'Command' button bar cmd_group = QFrame() toplayout.addWidget(cmd_group) cmd_layout = QHBoxLayout() cmd_group.setLayout( cmd_layout ) cmd_layout.addWidget( QLabel("<b>Wing Tools:</b> ") ) select_airfoil = QPushButton("Assist Me ...") menu = QMenu() menu.addAction("Select Root Airfoil", self.select_airfoil_root) menu.addAction("Select Tip Airfoil", self.select_airfoil_tip) menu.addAction("Generate Stations", self.generate_stations) select_airfoil.setMenu(menu) cmd_layout.addWidget(select_airfoil) add_feature = QPushButton("Add Feature ...") menu = QMenu() menu.addAction("Leading Edge", self.add_leading_edge) menu.addAction("Trailing Edge", self.add_trailing_edge) menu.addAction("Spar", self.add_spar) menu.addAction("Stringer", self.add_stringer) menu.addAction("Sheeting", self.add_sheet) menu.addAction("Lighting/Spar Hole", self.add_simple_hole) menu.addAction("Shaped Hole", self.add_shaped_hole) menu.addAction("Build Tab", self.add_build_tab) menu.addAction("Add Control Surface", self.add_flap) add_feature.setMenu(menu) cmd_layout.addWidget(add_feature) cmd_layout.addStretch(1) delete = QPushButton('Delete Wing') delete.clicked.connect(self.delete_self) cmd_layout.addWidget(delete) # form content self.edit_name = QLineEdit() self.edit_name.setFixedWidth(250) self.edit_name.textChanged.connect(self.onChange) self.edit_name.setText(name) self.edit_airfoil_root = QLineEdit() self.edit_airfoil_root.setFixedWidth(250) self.edit_airfoil_root.textChanged.connect(self.onChange) self.edit_airfoil_tip = QLineEdit() self.edit_airfoil_tip.setFixedWidth(250) self.edit_airfoil_tip.textChanged.connect(self.onChange) self.edit_span = QLineEdit() self.edit_span.setFixedWidth(250) self.edit_span.textChanged.connect(self.onChange) self.edit_chord_root = QLineEdit() self.edit_chord_root.setFixedWidth(250) self.edit_chord_root.textChanged.connect(self.onChange) self.edit_chord_tip = QLineEdit() self.edit_chord_tip.setFixedWidth(250) self.edit_chord_tip.textChanged.connect(self.onChange) self.edit_chord_curve = QLineEdit() self.edit_chord_curve.setFixedWidth(250) self.edit_chord_curve.textChanged.connect(self.onChange) self.edit_twist = QLineEdit() self.edit_twist.setFixedWidth(250) self.edit_twist.textChanged.connect(self.onChange) self.edit_sweep = QLineEdit() self.edit_sweep.setFixedWidth(250) self.edit_sweep.textChanged.connect(self.onChange) self.edit_sweep_curve = QLineEdit() self.edit_sweep_curve.setFixedWidth(250) self.edit_sweep_curve.textChanged.connect(self.onChange) self.edit_dihedral = QLineEdit() self.edit_dihedral.setFixedWidth(250) self.edit_dihedral.textChanged.connect(self.onChange) self.edit_stations = QLineEdit() self.edit_stations.setFixedWidth(250) self.edit_stations.textChanged.connect(self.rebuildStations) self.edit_wing_link = QComboBoxNoWheel() self.edit_wing_link.setFixedWidth(250) self.edit_wing_link.currentIndexChanged.connect(self.onChange) self.edit_wing_link.addItem("none") formlayout.addRow( "<b>Wing Name:</b>", self.edit_name ) formlayout.addRow( "<b>Root Airfoil:</b>", self.edit_airfoil_root ) formlayout.addRow( "<b>Tip Airfoil (if different):</b>", self.edit_airfoil_tip ) formlayout.addRow( "<b>Span:</b>", self.edit_span ) formlayout.addRow( "<b>Root Chord:</b>", self.edit_chord_root ) formlayout.addRow( "<b>Tip Chord (if different):</b>", self.edit_chord_tip ) formlayout.addRow( "<b>Chord Curve (see docs):</b>", self.edit_chord_curve ) formlayout.addRow( "<b>Twist/Washout (deg):</b>", self.edit_twist ) formlayout.addRow( "<b>Sweep Angle (deg):</b>", self.edit_sweep ) formlayout.addRow( "<b>Sweep Curve (see docs):</b>", self.edit_sweep_curve ) formlayout.addRow( "<b>Dihedral (deg):</b>", self.edit_dihedral ) formlayout.addRow( "<b>Stations:</b>", self.edit_stations ) formlayout.addRow( "<b>Link to Wing:</b>", self.edit_wing_link ) return toppage def get_widget(self): return self.container def get_name(self): return self.edit_name.text() def load(self, node): self.edit_name.setText(node.getString('name')) self.edit_airfoil_root.setText(node.getString('airfoil_root')) self.edit_airfoil_tip.setText(node.getString('airfoil_tip')) self.edit_span.setText(node.getString('span')) chord_root = node.getString('chord_root') chord_tip = node.getString('chord_tip') self.edit_chord_root.setText(chord_root) if ( chord_tip != chord_root ): self.edit_chord_tip.setText(chord_tip) self.edit_chord_curve.setText(node.getString('chord_curve')) self.edit_twist.setText(node.getString('twist')) self.edit_sweep.setText(node.getString('sweep')) self.edit_sweep_curve.setText(node.getString('sweep_curve')) self.edit_dihedral.setText(node.getString('dihedral')) self.edit_stations.setText(node.getString('stations')) self.wing_link = node.getString('wing_link') # upgrade old data files if node.hasChild('leading_edge'): node.setLen('leading_edge', 1) if node.hasChild('trailing_edge'): node.setLen('trailing_edge', 1) if node.hasChild('spar'): node.setLen('spar', 1) if node.hasChild('stringer'): node.setLen('stringer', 1) if node.hasChild('sheet'): node.setLen('sheet', 1) if node.hasChild('simple_hole'): node.setLen('simple_hole', 1) if node.hasChild('shaped_hole'): node.setLen('shaped_hole', 1) if node.hasChild('build_tab'): node.setLen('build_tab', 1) if node.hasChild('flap'): node.setLen('flap', 1) for i in range(node.getLen('leading_edge')): self.add_leading_edge(node.getChild('leading_edge[%d]' % i)) for i in range(node.getLen('trailing_edge')): self.add_trailing_edge(node.getChild('trailing_edge[%d]' % i)) for i in range(node.getLen('spar')): self.add_spar(node.getChild('spar[%d]' % i)) for i in range(node.getLen('stringer')): self.add_stringer(node.getChild('stringer[%d]' % i)) for i in range(node.getLen('sheet')): self.add_sheet(node.getChild('sheet[%d]' % i)) for i in range(node.getLen('simple_hole')): self.add_simple_hole(node.getChild('simple_hole[%d]' % i)) for i in range(node.getLen('shaped_hole')): self.add_shaped_hole(node.getChild('shaped_hole[%d]' % i)) for i in range(node.getLen('build_tab')): self.add_build_tab(node.getChild('build_tab[%d]' % i)) for i in range(node.getLen('flap')): self.add_flap(node.getChild('flap[%d]' % i)) def save(self, node): node.setString('name', self.edit_name.text()) node.setString('airfoil_root', self.edit_airfoil_root.text()) node.setString('airfoil_tip', self.edit_airfoil_tip.text()) node.setString('span', self.edit_span.text()) node.setString('chord_root', self.edit_chord_root.text()) node.setString('chord_tip', self.edit_chord_tip.text()) node.setString('chord_curve', self.edit_chord_curve.text()) node.setString('twist', self.edit_twist.text()) node.setString('sweep', self.edit_sweep.text()) node.setString('sweep_curve', self.edit_sweep_curve.text()) node.setString('dihedral', self.edit_dihedral.text()) node.setString('stations', self.edit_stations.text()) node.setString('wing_link', self.edit_wing_link.currentText()) i = 0 for le in self.leading_edges: if le.valid: subnode = node.getChild('leading_edge[%d]' % i, True) le.save(subnode) i += 1 i = 0 for te in self.trailing_edges: if te.valid: subnode = node.getChild('trailing_edge[%d]' % i, True) te.save(subnode) i += 1 i = 0 for spar in self.spars: if spar.valid: subnode = node.getChild('spar[%d]' % i, True) spar.save(subnode) i += 1 i = 0 for stringer in self.stringers: if stringer.valid: subnode = node.getChild('stringer[%d]' % i, True) stringer.save(subnode) i += 1 i = 0 for sheet in self.sheeting: if sheet.valid: subnode = node.getChild('sheet[%d]' % i, True) sheet.save(subnode) i += 1 i = 0 for hole in self.simple_holes: if hole.valid: subnode = node.getChild('simple_hole[%d]' % i, True) hole.save(subnode) i += 1 i = 0 for hole in self.shaped_holes: if hole.valid: subnode = node.getChild('shaped_hole[%d]' % i, True) hole.save(subnode) i += 1 i = 0 for tab in self.build_tabs: if tab.valid: subnode = node.getChild('build_tab[%d]' % i, True) tab.save(subnode) i += 1 i = 0 for flap in self.flaps: if flap.valid: subnode = node.getChild('flap[%d]' % i, True) flap.save(subnode) i += 1
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 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 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 WingUI(): def __init__(self, changefunc, name="New"): self.valid = True self.changefunc = changefunc self.container = self.make_page(name=name) self.wing_link = "none" self.leading_edges = [] self.trailing_edges = [] self.spars = [] self.stringers = [] self.sheeting = [] self.simple_holes = [] self.shaped_holes = [] self.build_tabs = [] self.flaps = [] def onChange(self): self.changefunc() def rebuildStations(self): self.changefunc() # rebuild stations when station list has changed for le in self.leading_edges: if le.valid: le.rebuild_stations(self.edit_stations.text()) for te in self.trailing_edges: if te.valid: te.rebuild_stations(self.edit_stations.text()) for spar in self.spars: if spar.valid: spar.rebuild_stations(self.edit_stations.text()) for stringer in self.stringers: if stringer.valid: stringer.rebuild_stations(self.edit_stations.text()) for sheet in self.sheeting: if sheet.valid: sheet.rebuild_stations(self.edit_stations.text()) for hole in self.simple_holes: if hole.valid: hole.rebuild_stations(self.edit_stations.text()) for hole in self.shaped_holes: if hole.valid: hole.rebuild_stations(self.edit_stations.text()) for tab in self.build_tabs: if tab.valid: tab.rebuild_stations(self.edit_stations.text()) for flap in self.flaps: if flap.valid: flap.rebuild_stations(self.edit_stations.text()) def rebuild_wing_list(self, wing_list=[]): myname = self.get_name() wing_link_text = self.edit_wing_link.currentText() print "wing_link_text = " + str(wing_link_text) if wing_link_text == None or wing_link_text == "none": if self.wing_link != "": print "Connecting up with saved name: " + self.wing_link wing_link_text = self.wing_link self.edit_wing_link.clear() self.edit_wing_link.addItem("none") for index, wing in enumerate(wing_list): if (wing != myname): self.edit_wing_link.addItem(wing) index = self.edit_wing_link.findText(wing_link_text) if index != None: self.edit_wing_link.setCurrentIndex(index) else: self.edit_wing_link.setCurrentIndex(0) def select_airfoil_root(self): basepath = os.path.split(os.path.realpath(__file__))[0] airfoil_path = os.path.join(basepath, "../airfoils/") (filename, mask) = QFileDialog.getOpenFileName(None, "Open File", airfoil_path, "Airfoil (*.dat)") if (filename == ""): return basename = os.path.basename(str(filename)) fileroot, ext = os.path.splitext(basename) self.edit_airfoil_root.setText(fileroot) def select_airfoil_tip(self): basepath = os.path.split(os.path.realpath(__file__))[0] airfoil_path = os.path.join(basepath, "../airfoils/") (filename, mask) = QFileDialog.getOpenFileName(None, "Open File", airfoil_path, "Airfoil (*.dat)") if (filename == ""): return basename = os.path.basename(str(filename)) fileroot, ext = os.path.splitext(basename) self.edit_airfoil_tip.setText(fileroot) def generate_stations(self): text, ok = QInputDialog.getText(None, 'Input Dialog', 'Enter number of stations (ribs):') if ok: span = float(self.edit_span.text()) num = int(text) spacing = span / float(num) stations = "" pos = 0.0 for i in range(num): #print str(i) + " " + str(pos) stations += ("%.2f" % pos).rstrip('0').rstrip('.') + " " pos += spacing stations += ("%.2f" % span).rstrip('0').rstrip('.') self.edit_stations.setText(stations) def add_leading_edge(self, xml_node=None): leading_edge = LeadingEdgeUI(self.changefunc) leading_edge.rebuild_stations(self.edit_stations.text()) if xml_node != None: leading_edge.load(xml_node) self.leading_edges.append(leading_edge) self.layout_le.addWidget(leading_edge.get_widget()) self.changefunc() def add_trailing_edge(self, xml_node=None): trailing_edge = TrailingEdgeUI(self.changefunc) trailing_edge.rebuild_stations(self.edit_stations.text()) if xml_node != None: trailing_edge.load(xml_node) self.trailing_edges.append(trailing_edge) self.layout_te.addWidget(trailing_edge.get_widget()) self.changefunc() def add_spar(self, xml_node=None): spar = SparUI(self.changefunc) spar.rebuild_stations(self.edit_stations.text()) if xml_node != None: spar.load(xml_node) self.spars.append(spar) self.layout_spars.addWidget(spar.get_widget()) self.changefunc() def add_stringer(self, xml_node=None): stringer = SparUI(self.changefunc) stringer.rebuild_stations(self.edit_stations.text()) if xml_node != None: stringer.load(xml_node) self.stringers.append(stringer) self.layout_stringers.addWidget(stringer.get_widget()) self.changefunc() def add_sheet(self, xml_node=None): sheet = SheetUI(self.changefunc) sheet.rebuild_stations(self.edit_stations.text()) if xml_node != None: sheet.load(xml_node) self.sheeting.append(sheet) self.layout_sheeting.addWidget(sheet.get_widget()) self.changefunc() def add_simple_hole(self, xml_node=None): hole = SimpleHoleUI(self.changefunc) hole.rebuild_stations(self.edit_stations.text()) if xml_node != None: hole.load(xml_node) self.simple_holes.append(hole) self.layout_simple_holes.addWidget(hole.get_widget()) self.changefunc() def add_shaped_hole(self, xml_node=None): hole = ShapedHoleUI(self.changefunc) hole.rebuild_stations(self.edit_stations.text()) if xml_node != None: hole.load(xml_node) self.shaped_holes.append(hole) self.layout_shaped_holes.addWidget(hole.get_widget()) self.changefunc() def add_build_tab(self, xml_node=None): tab = BuildTabUI(self.changefunc) tab.rebuild_stations(self.edit_stations.text()) if xml_node != None: tab.load(xml_node) self.build_tabs.append(tab) self.layout_build_tabs.addWidget(tab.get_widget()) self.changefunc() def add_flap(self, xml_node=None): flap = FlapUI(self.changefunc) flap.rebuild_stations(self.edit_stations.text()) if xml_node != None: flap.load(xml_node) self.flaps.append(flap) self.layout_flaps.addWidget(flap.get_widget()) self.changefunc() def delete_self(self): if self.valid: self.changefunc() self.container.deleteLater() self.valid = False def make_page(self, name): # make the full edit widget toppage = QFrame() toplayout = QVBoxLayout() toppage.setLayout(toplayout) page = QFrame() layout = QVBoxLayout() page.setLayout(layout) maincontents = QFrame() formlayout = QFormLayout() maincontents.setLayout(formlayout) layout.addWidget(maincontents) scroll = QScrollArea() scroll.setWidget(page) scroll.setWidgetResizable(True) #layout.addWidget(scroll) toplayout.addWidget(scroll) frame = QGroupBox("Leading Edges") self.layout_le = QVBoxLayout() frame.setLayout(self.layout_le) layout.addWidget(frame) frame = QGroupBox("Trailing Edges") self.layout_te = QVBoxLayout() frame.setLayout(self.layout_te) layout.addWidget(frame) frame = QGroupBox("Spars") self.layout_spars = QVBoxLayout() frame.setLayout(self.layout_spars) layout.addWidget(frame) frame = QGroupBox("Stringers") self.layout_stringers = QVBoxLayout() frame.setLayout(self.layout_stringers) layout.addWidget(frame) frame = QGroupBox("Sheeting") self.layout_sheeting = QVBoxLayout() frame.setLayout(self.layout_sheeting) layout.addWidget(frame) frame = QGroupBox("Simple Holes") self.layout_simple_holes = QVBoxLayout() frame.setLayout(self.layout_simple_holes) layout.addWidget(frame) frame = QGroupBox("Shaped Holes") self.layout_shaped_holes = QVBoxLayout() frame.setLayout(self.layout_shaped_holes) layout.addWidget(frame) frame = QGroupBox("Build Tabs") self.layout_build_tabs = QVBoxLayout() frame.setLayout(self.layout_build_tabs) layout.addWidget(frame) frame = QGroupBox("Control Surfaces") self.layout_flaps = QVBoxLayout() frame.setLayout(self.layout_flaps) layout.addWidget(frame) # 'Command' button bar cmd_group = QFrame() toplayout.addWidget(cmd_group) cmd_layout = QHBoxLayout() cmd_group.setLayout(cmd_layout) cmd_layout.addWidget(QLabel("<b>Wing Tools:</b> ")) select_airfoil = QPushButton("Assist Me ...") menu = QMenu() menu.addAction("Select Root Airfoil", self.select_airfoil_root) menu.addAction("Select Tip Airfoil", self.select_airfoil_tip) menu.addAction("Generate Stations", self.generate_stations) select_airfoil.setMenu(menu) cmd_layout.addWidget(select_airfoil) add_feature = QPushButton("Add Feature ...") menu = QMenu() menu.addAction("Leading Edge", self.add_leading_edge) menu.addAction("Trailing Edge", self.add_trailing_edge) menu.addAction("Spar", self.add_spar) menu.addAction("Stringer", self.add_stringer) menu.addAction("Sheeting", self.add_sheet) menu.addAction("Lighting/Spar Hole", self.add_simple_hole) menu.addAction("Shaped Hole", self.add_shaped_hole) menu.addAction("Build Tab", self.add_build_tab) menu.addAction("Add Control Surface", self.add_flap) add_feature.setMenu(menu) cmd_layout.addWidget(add_feature) cmd_layout.addStretch(1) delete = QPushButton('Delete Wing') delete.clicked.connect(self.delete_self) cmd_layout.addWidget(delete) # form content self.edit_name = QLineEdit() self.edit_name.setFixedWidth(250) self.edit_name.textChanged.connect(self.onChange) self.edit_name.setText(name) self.edit_airfoil_root = QLineEdit() self.edit_airfoil_root.setFixedWidth(250) self.edit_airfoil_root.textChanged.connect(self.onChange) self.edit_airfoil_tip = QLineEdit() self.edit_airfoil_tip.setFixedWidth(250) self.edit_airfoil_tip.textChanged.connect(self.onChange) self.edit_span = QLineEdit() self.edit_span.setFixedWidth(250) self.edit_span.textChanged.connect(self.onChange) self.edit_chord_root = QLineEdit() self.edit_chord_root.setFixedWidth(250) self.edit_chord_root.textChanged.connect(self.onChange) self.edit_chord_tip = QLineEdit() self.edit_chord_tip.setFixedWidth(250) self.edit_chord_tip.textChanged.connect(self.onChange) self.edit_chord_curve = QLineEdit() self.edit_chord_curve.setFixedWidth(250) self.edit_chord_curve.textChanged.connect(self.onChange) self.edit_twist = QLineEdit() self.edit_twist.setFixedWidth(250) self.edit_twist.textChanged.connect(self.onChange) self.edit_sweep = QLineEdit() self.edit_sweep.setFixedWidth(250) self.edit_sweep.textChanged.connect(self.onChange) self.edit_sweep_curve = QLineEdit() self.edit_sweep_curve.setFixedWidth(250) self.edit_sweep_curve.textChanged.connect(self.onChange) self.edit_dihedral = QLineEdit() self.edit_dihedral.setFixedWidth(250) self.edit_dihedral.textChanged.connect(self.onChange) self.edit_stations = QLineEdit() self.edit_stations.setFixedWidth(250) self.edit_stations.textChanged.connect(self.rebuildStations) self.edit_wing_link = QComboBoxNoWheel() self.edit_wing_link.setFixedWidth(250) self.edit_wing_link.currentIndexChanged.connect(self.onChange) self.edit_wing_link.addItem("none") formlayout.addRow("<b>Wing Name:</b>", self.edit_name) formlayout.addRow("<b>Root Airfoil:</b>", self.edit_airfoil_root) formlayout.addRow("<b>Tip Airfoil (if different):</b>", self.edit_airfoil_tip) formlayout.addRow("<b>Span:</b>", self.edit_span) formlayout.addRow("<b>Root Chord:</b>", self.edit_chord_root) formlayout.addRow("<b>Tip Chord (if different):</b>", self.edit_chord_tip) formlayout.addRow("<b>Chord Curve (see docs):</b>", self.edit_chord_curve) formlayout.addRow("<b>Twist/Washout (deg):</b>", self.edit_twist) formlayout.addRow("<b>Sweep Angle (deg):</b>", self.edit_sweep) formlayout.addRow("<b>Sweep Curve (see docs):</b>", self.edit_sweep_curve) formlayout.addRow("<b>Dihedral (deg):</b>", self.edit_dihedral) formlayout.addRow("<b>Stations:</b>", self.edit_stations) formlayout.addRow("<b>Link to Wing:</b>", self.edit_wing_link) return toppage def get_widget(self): return self.container def get_name(self): return self.edit_name.text() def load(self, node): self.edit_name.setText(node.getString('name')) self.edit_airfoil_root.setText(node.getString('airfoil_root')) self.edit_airfoil_tip.setText(node.getString('airfoil_tip')) self.edit_span.setText(node.getString('span')) chord_root = node.getString('chord_root') chord_tip = node.getString('chord_tip') self.edit_chord_root.setText(chord_root) if (chord_tip != chord_root): self.edit_chord_tip.setText(chord_tip) self.edit_chord_curve.setText(node.getString('chord_curve')) self.edit_twist.setText(node.getString('twist')) self.edit_sweep.setText(node.getString('sweep')) self.edit_sweep_curve.setText(node.getString('sweep_curve')) self.edit_dihedral.setText(node.getString('dihedral')) self.edit_stations.setText(node.getString('stations')) self.wing_link = node.getString('wing_link') # upgrade old data files if node.hasChild('leading_edge'): node.setLen('leading_edge', 1) if node.hasChild('trailing_edge'): node.setLen('trailing_edge', 1) if node.hasChild('spar'): node.setLen('spar', 1) if node.hasChild('stringer'): node.setLen('stringer', 1) if node.hasChild('sheet'): node.setLen('sheet', 1) if node.hasChild('simple_hole'): node.setLen('simple_hole', 1) if node.hasChild('shaped_hole'): node.setLen('shaped_hole', 1) if node.hasChild('build_tab'): node.setLen('build_tab', 1) if node.hasChild('flap'): node.setLen('flap', 1) for i in range(node.getLen('leading_edge')): self.add_leading_edge(node.getChild('leading_edge[%d]' % i)) for i in range(node.getLen('trailing_edge')): self.add_trailing_edge(node.getChild('trailing_edge[%d]' % i)) for i in range(node.getLen('spar')): self.add_spar(node.getChild('spar[%d]' % i)) for i in range(node.getLen('stringer')): self.add_stringer(node.getChild('stringer[%d]' % i)) for i in range(node.getLen('sheet')): self.add_sheet(node.getChild('sheet[%d]' % i)) for i in range(node.getLen('simple_hole')): self.add_simple_hole(node.getChild('simple_hole[%d]' % i)) for i in range(node.getLen('shaped_hole')): self.add_shaped_hole(node.getChild('shaped_hole[%d]' % i)) for i in range(node.getLen('build_tab')): self.add_build_tab(node.getChild('build_tab[%d]' % i)) for i in range(node.getLen('flap')): self.add_flap(node.getChild('flap[%d]' % i)) def save(self, node): node.setString('name', self.edit_name.text()) node.setString('airfoil_root', self.edit_airfoil_root.text()) node.setString('airfoil_tip', self.edit_airfoil_tip.text()) node.setString('span', self.edit_span.text()) node.setString('chord_root', self.edit_chord_root.text()) node.setString('chord_tip', self.edit_chord_tip.text()) node.setString('chord_curve', self.edit_chord_curve.text()) node.setString('twist', self.edit_twist.text()) node.setString('sweep', self.edit_sweep.text()) node.setString('sweep_curve', self.edit_sweep_curve.text()) node.setString('dihedral', self.edit_dihedral.text()) node.setString('stations', self.edit_stations.text()) node.setString('wing_link', self.edit_wing_link.currentText()) i = 0 for le in self.leading_edges: if le.valid: subnode = node.getChild('leading_edge[%d]' % i, True) le.save(subnode) i += 1 i = 0 for te in self.trailing_edges: if te.valid: subnode = node.getChild('trailing_edge[%d]' % i, True) te.save(subnode) i += 1 i = 0 for spar in self.spars: if spar.valid: subnode = node.getChild('spar[%d]' % i, True) spar.save(subnode) i += 1 i = 0 for stringer in self.stringers: if stringer.valid: subnode = node.getChild('stringer[%d]' % i, True) stringer.save(subnode) i += 1 i = 0 for sheet in self.sheeting: if sheet.valid: subnode = node.getChild('sheet[%d]' % i, True) sheet.save(subnode) i += 1 i = 0 for hole in self.simple_holes: if hole.valid: subnode = node.getChild('simple_hole[%d]' % i, True) hole.save(subnode) i += 1 i = 0 for hole in self.shaped_holes: if hole.valid: subnode = node.getChild('shaped_hole[%d]' % i, True) hole.save(subnode) i += 1 i = 0 for tab in self.build_tabs: if tab.valid: subnode = node.getChild('build_tab[%d]' % i, True) tab.save(subnode) i += 1 i = 0 for flap in self.flaps: if flap.valid: subnode = node.getChild('flap[%d]' % i, True) flap.save(subnode) i += 1
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())