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()