class AxisTab(BaseWidget): """ The Axis Tab in the main GUI """ _axis = [] _xaxis = None _yaxis = None _events = True _update_function = None def __init__(self, update_function=None): super().__init__("Axis Tab") self._update_function = update_function self._axis_list = ControlList(label='Axis List', default='', add_function=self._on_add_axis, remove_function=self._on_remove_axis) self._axis_list.item_selection_changed_event = self._on_selection_changed self._axis_list.data_changed_event = self._on_data_changed self._axis_list.select_entire_row = True self._axis_hw_type = ControlLabel() self._min = ControlNumber(label="Minimum", minimum=-float('inf'), maximum=float('inf'), decimals=5) self._min.changed_event = self._on_min_changed self._min.visible = False self._max = ControlNumber(label="Maximum", minimum=-float('inf'), maximum=float('inf'), decimals=5) self._max.changed_event = self._on_max_changed self._max.visible = False self._norm_min = ControlNumber(label=" 0%", minimum=-float('inf'), maximum=float('inf'), decimals=5) self._norm_min.changed_event = self._on_norm_min_changed self._norm_min.visible = False self._norm_max = ControlNumber(label="100%", minimum=-float('inf'), maximum=float('inf'), decimals=5) self._norm_max.changed_event = self._on_norm_max_changed self._norm_max.visible = False self._special_axis = ControlEmptyWidget() self._axis_custom = ControlEmptyWidget() self._load_button = ControlFile(label="Load Axis") self._load_button.changed_event = self._on_load_axis self._save_button = ControlButton(label="Save Axis") self._save_button.value = self._on_save_axis self._save_button.visible = False self.formset = [ '_axis_list', ('_axis_hw_type', '_special_axis'), ('_min', '_max'), ('_norm_min', '_norm_max'), '_axis_custom', ('_load_button', '_save_button') ] def _update_shown_axis(self): index = self._axis_list.selected_row_index if not index is None: axis = self._axis[index] if not axis is None: assert isinstance(axis, ControlAxis) # Get the hardware type from the name of the class self._axis_hw_type.value = type(axis).__name__ # Update the minimum box if not self._min.visible: self._min.visible = True self._min.label = "Minimum ({})".format(axis.get_units()) self._events = False self._min.value = axis.get_min() self._events = True # Update the maximum box if not self._max.visible: self._max.visible = True self._max.label = "Maximum ({})".format(axis.get_units()) self._events = False self._max.value = axis.get_max() self._events = True # Update the norm_minimum box if not self._norm_min.visible: self._norm_min.visible = True self._norm_min.label = " 0% ({})".format(axis.get_units()) self._events = False self._norm_min.value = axis.get_norm_min() self._events = True # Update the norm_maximum box if not self._norm_max.visible: self._norm_max.visible = True self._norm_max.label = "100% ({})".format(axis.get_units()) self._events = False self._norm_max.value = axis.get_norm_max() self._events = True # Populate the special axis combo special_axis = ControlCombo(label="Special Axis") special_axis.add_item('', '') special_axis.add_item("X Axis", 'xaxis') special_axis.add_item("Y Axis", 'yaxis') if axis == self._xaxis: special_axis.value = 'xaxis' elif axis == self._yaxis: special_axis.value = 'yaxis' def axis_changed(_): """ Called when axis changed """ if special_axis.value == 'xaxis': self._xaxis = axis if self._yaxis == axis: self._yaxis = None elif special_axis.value == 'yaxis': self._yaxis = axis if self._xaxis == axis: self._xaxis = None else: if self._xaxis == axis: self._xaxis = None if self._yaxis == axis: self._yaxis = None self._send_events() print("Making Special Combo") special_axis.current_index_changed_event = axis_changed self._events = False self._special_axis.value = None self._special_axis.value = special_axis self._events = True # Update the custom config GUI self._axis_custom.value = axis.get_custom_config() self._save_button.visible = True else: self._axis_hw_type.value = '' self._min.visible = False self._max.visible = False self._norm_min.visible = False self._norm_max.visible = False self._special_axis.value = None self._axis_custom.value = None self._save_button.visible = False else: self._axis_hw_type.value = '' self._min.visible = False self._max.visible = False self._norm_min.visible = False self._norm_max.visible = False self._special_axis.value = None self._axis_custom.value = None self._save_button.visible = False def _send_events(self): if self._events and self._update_function is not None: self._update_function({ 'axis': self._axis, 'xaxis': self._xaxis, 'yaxis': self._yaxis }) def update_events(self, events): #print("Axis Tab", events) for axis in self._axis: if isinstance(axis, ControlAxis): axis.update_events(events) def _on_add_axis(self): win = NewAxisWindow(self.add_axis) win.show() def _on_remove_axis(self): index = self._axis_list.selected_row_index if not index is None: axis = self._axis[index] assert isinstance(axis, ControlAxis) self._axis_list -= index self._axis.pop(index) if not axis is None: if axis == self._xaxis: self._xaxis = None if axis == self._yaxis: self._yaxis = None self._send_events() def add_axis(self, axis): """ Add an axis to the list """ if not axis is None: self._axis_list += [axis.get_name()] self._axis += [axis] self._axis_list.tableWidget.selectRow(self._axis_list.rows_count - 1) # self._update_shown_axis() self._send_events() def _on_selection_changed(self): self._update_shown_axis() def _on_data_changed(self, row, _, item): if row < len(self._axis): axis = self._axis[row] if not axis is None: axis.set_name(item) #self._update_shown_axis() self._send_events() def _on_min_changed(self): index = self._axis_list.selected_row_index if not index is None: axis = self._axis[index] assert isinstance(axis, ControlAxis) if axis is not None: if axis.get_min() != self._min.value: axis.set_min(self._min.value) self._send_events() def _on_max_changed(self): index = self._axis_list.selected_row_index if not index is None: axis = self._axis[index] assert isinstance(axis, ControlAxis) if axis is not None: if axis.get_max() != self._max.value: axis.set_max(self._max.value) self._send_events() def _on_norm_min_changed(self): index = self._axis_list.selected_row_index if not index is None: axis = self._axis[index] assert isinstance(axis, ControlAxis) if axis is not None: if axis.get_norm_min() != self._norm_min.value: axis.set_norm_min(self._norm_min.value) self._send_events() def _on_norm_max_changed(self): index = self._axis_list.selected_row_index if not index is None: axis = self._axis[index] assert isinstance(axis, ControlAxis) if axis is not None: if axis.get_norm_max() != self._norm_max.value: axis.set_norm_max(self._norm_max.value) self._send_events() def _on_load_axis(self): """ Load an axis from a saved axis file """ if self._load_button.value is not None and self._load_button.value != '': data = {} with open(self._load_button.value) as output_file: try: data = dict(json.load(output_file)) except: print("Could not read file") return print(data) if 'hw_type' in data: name = "" if 'name' in data: name = data['name'] axis = None for axis_type in ControlAxis.__subclasses__(): if axis_type.__name__ == data['hw_type']: axis = axis_type(name) if axis is None: print("No hardware type found!") return assert isinstance(axis, ControlAxis) self.add_axis(axis) #self._update_shown_axis() if 'min' in data: self._min.load_form(data['min']) if 'max' in data: self._max.load_form(data['max']) if 'norm_min' in data: self._norm_min.load_form(data['norm_min']) if 'norm_max' in data: self._norm_max.load_form(data['norm_max']) if 'special_axis' in data: self._special_axis.value.load_form(data['special_axis']) self._axis_custom.value = axis.get_custom_config() if 'axis-specific' in data and self._axis_custom.value is not None: self._axis_custom.value.load_form(data['axis-specific']) def _on_save_axis(self): """ Save an axis to a file """ data = {} data['name'] = self._axis_list.get_currentrow_value()[0] data['hw_type'] = self._axis_hw_type.value data['min'] = {} self._min.save_form(data['min']) data['max'] = {} self._max.save_form(data['max']) data['norm_min'] = {} self._norm_min.save_form(data['norm_min']) data['norm_max'] = {} self._norm_max.save_form(data['norm_max']) data['special_axis'] = {} self._special_axis.value.save_form(data['special_axis']) if self._axis_custom.value is not None: data['axis-specific'] = {} self._axis_custom.value.save_form(data['axis-specific']) print(data) filename = QFileDialog.getSaveFileName(self, 'Save Axis', filter='JSON Files (*.json)') if filename[0] is not None and filename[0] != '': with open(filename[0], 'w') as output_file: json.dump(data, output_file, indent=2)
class EditHarvest(BaseWidget): def __init__(self): super().__init__('Oogstlijst Manager') reference_list = Main.hl.reference_data self._list_left = ControlList('Stamlijst') self._list_left.readonly = True self._list_right = ControlList('Oogstlijst') self._list_right.select_entire_row = True self._list_right.horizontal_headers = [ 'Oogst', 'Hoeveelheid (kg)', ] self._save_button = ControlButton('Verder') self._save_button.value = self._continue self.formset = ['_list_left', '_list_right', '_save_button'] def onclick_left(row, column): r = self._list_left.get_currentrow_value() self._list_right.__add__(r + [0]) # cell = self._list_right.get_cell(0, self._list_right.rows_count - 1) # cell.setFlags(QtCore.Qt.ItemIsEditable) # cell = self._list_right.get_cell(1, self._list_right.rows_count - 1) # cell.setTextAlignment(QtCore.Qt.AlignCenter) def onclick_right(row, column): # # print(dir(self._list_right)) if column == 0: index = self._list_right.selected_row_index print(index) self._list_right.__sub__(index) # # r = self._list_right.get_currentrow_value() # self._list_right.__sub__(self._list_right.selected_row_index()) # #cell = self._list_right.get_cell(1, self._list_right.rows_count - 1) # #cell.setTextAlignment(QtCore.Qt.AlignCenter) self._list_left.cell_double_clicked_event = onclick_left self._list_right.cell_double_clicked_event = onclick_right for r in reference_list: self._list_left.__add__([' '.join(r[1:3])]) if Main.hl.harvest_list: for r in Main.hl.harvest_list: self._list_right.__add__([r[0], r[1]]) def _continue(self): user_input = self._list_right.value if not user_input: return harvest_list = [] # Combine user input with reference data for row in user_input: reference = [ ref for ref in Main.hl.reference_data if\ ref[1] and ref[1] in row[0] and ref[2] and ref[2] in row[0] ][0] if not reference: raise Exception('Reference data not found') row += [reference[0]] # add prod nr row += [reference[2]] # add part row += [reference[3]] # add date harvest_list.append(row) Main.hl.harvest_list = Main.hl_pickle.harvest_list = harvest_list window = Rapport() Main.root._panel.value = window