Esempio n. 1
0
class ND_Controller(QWidget):
    defineSelectedAxes = pyqtSignal(int, int, int)
    sliderValueChanged = pyqtSignal(int, int, str)

    def __init__(self,
                 array_shape=None,
                 axis_label=None,
                 axis_parms=None,
                 num_axes=2,
                 parent=None,
                 name=""):
        QWidget.__init__(self, parent)
        # set default number of selectable axes to use 2-D QWT-based display
        self.selectable_axes = num_axes
        # create grid layout
        self.layout = QGridLayout(self)
        self.setWhatsThis(controller_instructions)
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.construct_selectors(array_shape, axis_label, axis_parms)

    # __init__()

    def construct_selectors(self,
                            array_shape=None,
                            axis_label=None,
                            axis_parms=None):
        """ construct a group of AxisRange objects. These objects allow
          the user to specify which dimensions of an N-dimensional
          array are viewable in a 2 or 3-D display
      """
        self.green = QColor(0, 0, 0)
        self.green.setGreen(255)
        self.red = QColor(0, 0, 0)
        self.red.setRed(255)

        self.axis_parms = axis_parms

        # add control buttons and AxisRange selectors
        self.buttons = []
        self.button_number = []
        self.axis_controllers = []

        if array_shape is None:
            array_shape = []
            for i in range(len(axis_label)):
                array_shape.append(axis_parms[axis_label[i]][3])
        self.rank = 0
        for i in range(len(array_shape)):
            if array_shape[i] > 1:
                self.rank = self.rank + 1
        self.active_axes = {}
        self.num_selectors = -1
        row = 0
        col = 0
        for i in range(len(array_shape)):
            if array_shape[i] > 1:
                self.num_selectors = self.num_selectors + 1
                # add buttons
                button_label = None
                if not axis_label == None:
                    button_label = axis_label[i]
                else:
                    button_label = 'axis ' + str(i)
                if self.axis_parms is None:
                    parms = None
                else:
                    if axis_label[i] in self.axis_parms:
                        parms = self.axis_parms[axis_label[i]]
                    else:
                        parms = None
                self.axis_controllers.append(
                    AxisRange(ax_number=self.num_selectors,
                              axis_parms=parms,
                              parent=self))
                self.axis_controllers[self.num_selectors].setLabel(
                    button_label)
                self.axis_controllers[self.num_selectors].setRange(
                    array_shape[i])
                if self.num_selectors <= self.rank - (self.selectable_axes +
                                                      1):
                    self.axis_controllers[self.num_selectors].setSliderColor(
                        self.green)
                    self.axis_controllers[self.num_selectors].setActive(True)
                    self.axis_controllers[self.num_selectors].resetValue()
                    self.axis_controllers[self.num_selectors].show_display()
                else:
                    self.axis_controllers[self.num_selectors].setSliderColor(
                        self.red)
                    self.axis_controllers[self.num_selectors].hide_display()

                self.axis_controllers[self.num_selectors].axis_number.connect(
                    self.defineAxes)
                self.axis_controllers[
                    self.num_selectors].Value_Changed.connect(self.update)
                if col == 0:
                    spacer = QSpacerItem(22, 9, QSizePolicy.Expanding,
                                         QSizePolicy.Minimum)
                    self.layout.addItem(spacer, row, col)
                    col = col + 1
                self.layout.addWidget(
                    self.axis_controllers[self.num_selectors], row, col)
                self.buttons.append(
                    self.axis_controllers[self.num_selectors].getButton())
                self.button_number.append(i)
                #         self.buttons[self.num_selectors].setToggleButton(True)
                if self.num_selectors <= self.rank - (self.selectable_axes +
                                                      1):
                    self.axis_controllers[self.num_selectors].setOn(False)
                else:
                    self.axis_controllers[self.num_selectors].setOn(True)
                    self.active_axes[self.num_selectors] = True
                if col >= 4:
                    col = 0
                    row = row + 1
                else:
                    col = col + 1

# add one to get number of active selector buttons
        self.num_selectors = self.num_selectors + 1

    def showDisplay(self, show_self):
        if show_self > 0:
            self.show()
        else:
            self.hide()

    # showDisplay

    def set_num_selectable_axes(self, num_axes=2):
        self.selectable_axes = num_axes
        self.redefineAxes()

    def get_num_selectors(self):
        """ gets number of AxisRange objects in the Controller """
        return self.num_selectors

    def defineAxes(self, button_id, do_on=False):
        """ When a button is pressed, this function figures out if
            the user has selected the required number of dimensions
            for extraction. The AxisRange objects for those
            dimensions are colored red.  All data for the selected
            dimensions will be displayed. The remaining AxisRange
            objects are colored green - they enable the user to
            select a single value from their associated dimension.
        """
        #       print 'defineAxes button id = ', button_id
        if not self.active_axes is None and len(
                self.active_axes) == self.selectable_axes:
            self.resetAxes()
        self.axis_controllers[button_id].setOn(True)
        #       if do_on:
        #         self.axis_controllers[button_id].setOn(True)
        if self.axis_controllers[button_id].isOn():
            self.axis_controllers[button_id].setSliderColor(self.red)
            #         self.axis_controllers[button_id].hide_display()
            self.active_axes[button_id] = True
            if len(self.active_axes) == self.selectable_axes:
                first_axis = None
                second_axis = None
                third_axis = None
                for i in range(self.num_selectors):
                    if i in self.active_axes:
                        if first_axis is None:
                            first_axis = self.button_number[i]
                        elif second_axis is None:
                            second_axis = self.button_number[i]
                        else:
                            if self.selectable_axes == 3:
                                if third_axis is None:
                                    third_axis = self.button_number[i]
                        self.axis_controllers[i].setSliderColor(self.red)
                        self.axis_controllers[i].setActive(False)
                        self.axis_controllers[i].hide_display()
                    else:
                        self.axis_controllers[i].setSliderColor(self.green)
                        self.axis_controllers[i].setActive(True)
                        self.axis_controllers[i].show_display()
                    self.axis_controllers[i].resetValue()
                self.defineSelectedAxes.emit(first_axis, second_axis,
                                             third_axis)
        else:
            if button_id in self.active_axes:
                del self.active_axes[button_id]
            self.axis_controllers[button_id].setSliderColor(self.red)
#         self.axis_controllers[button_id].hide_display()
# defineAxes

    def redefineAxes(self):
        self.defineAxes(self.num_selectors - 1, True)
        self.defineAxes(self.num_selectors - 2, True)

    # redefineAxes

    def resetAxes(self):
        """ resets all AxisRange objects to be inactive """
        for i in range(self.num_selectors):
            self.axis_controllers[i].setOn(False)
            self.axis_controllers[i].setSliderColor(self.red)
            self.axis_controllers[i].setActive(False)
            #         self.axis_controllers[i].hide_display()
            self.axis_controllers[i].resetValue()
        self.active_axes = {}

    # resetAxes

    def update(self, axis_number, slider_value, display_string):
        """ emits a signal to the data selection program giving
          the new value of an active dimension index 
      """
        print('Caught ', axis_number, slider_value, display_string)
        if not axis_number in self.active_axes:
            if not self.axis_controllers[axis_number].isOn():
                self.sliderValueChanged.emit(self.button_number[axis_number],
                                             slider_value, display_string)
            else:
                self.axis_controllers[axis_number].resetValue()
        else:
            self.axis_controllers[axis_number].resetValue()