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
Exemple #2
0
    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 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>Size:</b> "))

        self.edit_size = QtGui.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 = QtGui.QPushButton('Delete ')
        delete.clicked.connect(self.delete_self)
        layout1.addWidget(delete)

        return page
    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>Size:</b> ") )

        self.edit_size = QtGui.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 = QtGui.QPushButton('Delete ')
        delete.clicked.connect(self.delete_self)
        layout1.addWidget(delete)

        return page
Exemple #5
0
    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
Exemple #6
0
    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
Exemple #7
0
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()
Exemple #8
0
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()
    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
Exemple #10
0
    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
Exemple #11
0
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 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())
Exemple #13
0
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())
Exemple #14
0
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()
Exemple #15
0
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())
Exemple #16
0
    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
Exemple #17
0
    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>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_orientation = QComboBoxNoWheel()
        #self.edit_orientation.addItem("Vertical")
        #self.edit_orientation.addItem("Tangent")
        #self.edit_orientation.currentIndexChanged.connect(self.onChange)
        #layout1.addWidget(self.edit_orientation)

        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 )

        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
Exemple #18
0
    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>Mat. W:</b> "))

        self.edit_width = QLineEdit()
        self.edit_width.setFixedWidth(50)
        self.edit_width.textChanged.connect(self.onChange)
        layout1.addWidget(self.edit_width)

        layout1.addWidget(QLabel("<b>Corner Rad:</b> "))

        self.edit_radius = 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 = QPushButton('Delete')
        delete.clicked.connect(self.delete_self)
        layout1.addWidget(delete)

        layout2.addWidget(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 = QLineEdit()
        self.edit_pos1.setFixedWidth(50)
        self.edit_pos1.textChanged.connect(self.onChange)
        layout2.addWidget(self.edit_pos1)

        layout2.addWidget(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 = QLineEdit()
        self.edit_pos2.setFixedWidth(50)
        self.edit_pos2.textChanged.connect(self.onChange)
        layout2.addWidget(self.edit_pos2)

        layout2.addStretch(1)

        return page
Exemple #19
0
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
    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
Exemple #21
0
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()
Exemple #22
0
    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>Width:</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>Y Pad:</b> "))

        self.edit_ypad = QtGui.QLineEdit()
        self.edit_ypad.setFixedWidth(50)
        self.edit_ypad.textChanged.connect(self.onChange)
        layout1.addWidget(self.edit_ypad)

        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)

        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
Exemple #23
0
    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
Exemple #24
0
    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
Exemple #25
0
    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
Exemple #26
0
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()
Exemple #27
0
    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
Exemple #28
0
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 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())
Exemple #30
0
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())
Exemple #31
0
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())
Exemple #32
0
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())
Exemple #34
0
    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
Exemple #35
0
    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
Exemple #36
0
    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
Exemple #37
0
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())
Exemple #38
0
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())
Exemple #39
0
    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
Exemple #40
0
    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
Exemple #41
0
    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
Exemple #42
0
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()
        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())
Exemple #44
0
    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
Exemple #45
0
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())
Exemple #46
0
    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
Exemple #47
0
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())