def __init__(self, parent = None, name = "task_toolbox"): QtGui.QWidget.__init__(self, parent) self.setObjectName = name # Hardware objects ---------------------------------------------------- self.graphics_manager_hwobj = None # Internal variables -------------------------------------------------- self.tree_brick = None self.previous_page_index = 0 self.is_running = None # Graphic elements ---------------------------------------------------- self.method_label = QtGui.QLabel("Collection method", self) self.method_label.setAlignment(QtCore.Qt.AlignCenter) #Qt4_widget_colors.set_widget_color(self.method_label, # Qt4_widget_colors.SKY_BLUE) #font = self.method_group_box.font() #font.setPointSize(10) #self.method_group_box.setFont(font) self.tool_box = QtGui.QToolBox(self) self.tool_box.setObjectName("tool_box") self.tool_box.setFixedWidth(475) #self.tool_box.setFont(font) self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete",) self.char_page = CreateCharWidget(self.tool_box, "Characterise") self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page") self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan") self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum") self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan") self.tool_box.addItem(self.discrete_page, "Standard Collection") self.tool_box.addItem(self.char_page, "Characterisation") self.tool_box.addItem(self.helical_page, "Helical Collection") self.tool_box.addItem(self.energy_scan_page, "Energy Scan") self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum") self.tool_box.addItem(self.advanced_page, "Advanced") self.button_box = QtGui.QWidget(self) self.create_task_button = QtGui.QPushButton(" Add to queue", self.button_box) self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png")) msg = "Add the collection method to the selected sample" self.create_task_button.setToolTip(msg) self.collect_now_button = QtGui.QPushButton("Collect Now", self.button_box) self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png")) self.collect_now_button.hide() # Layout -------------------------------------------------------------- #_method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box) #_method_group_box_vlayout.addWidget(self.tool_box) #_method_group_box_vlayout.setSpacing(2) #_method_group_box_vlayout.setContentsMargins(2, 2, 2, 2) _button_box_hlayout = QtGui.QHBoxLayout(self.button_box) _button_box_hlayout.addWidget(self.collect_now_button) _button_box_hlayout.addStretch(0) _button_box_hlayout.addWidget(self.create_task_button) _button_box_hlayout.setSpacing(0) _button_box_hlayout.setContentsMargins(0, 0, 0, 0) _main_vlayout = QtGui.QVBoxLayout(self) _main_vlayout.addWidget(self.method_label) _main_vlayout.addWidget(self.tool_box) #_main_vlayout.addStretch(0) _main_vlayout.addWidget(self.button_box) _main_vlayout.setSpacing(0) _main_vlayout.setContentsMargins(0, 0, 0, 0) # SizePolicies -------------------------------------------------------- self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) # Qt signal/slot connections ------------------------------------------ self.create_task_button.clicked.connect(self.create_task_button_click) self.collect_now_button.clicked.connect(self.collect_now_button_click) self.tool_box.currentChanged.connect(self.current_page_changed)
class TaskToolBoxWidget(QtGui.QWidget): def __init__(self, parent = None, name = "task_toolbox"): QtGui.QWidget.__init__(self, parent) self.setObjectName = name # Hardware objects ---------------------------------------------------- self.graphics_manager_hwobj = None # Internal variables -------------------------------------------------- self.tree_brick = None self.previous_page_index = 0 self.is_running = None # Graphic elements ---------------------------------------------------- self.method_label = QtGui.QLabel("Collection method", self) self.method_label.setAlignment(QtCore.Qt.AlignCenter) #Qt4_widget_colors.set_widget_color(self.method_label, # Qt4_widget_colors.SKY_BLUE) #font = self.method_group_box.font() #font.setPointSize(10) #self.method_group_box.setFont(font) self.tool_box = QtGui.QToolBox(self) self.tool_box.setObjectName("tool_box") self.tool_box.setFixedWidth(475) #self.tool_box.setFont(font) self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete",) self.char_page = CreateCharWidget(self.tool_box, "Characterise") self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page") self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan") self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum") self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan") self.tool_box.addItem(self.discrete_page, "Standard Collection") self.tool_box.addItem(self.char_page, "Characterisation") self.tool_box.addItem(self.helical_page, "Helical Collection") self.tool_box.addItem(self.energy_scan_page, "Energy Scan") self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum") self.tool_box.addItem(self.advanced_page, "Advanced") self.button_box = QtGui.QWidget(self) self.create_task_button = QtGui.QPushButton(" Add to queue", self.button_box) self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png")) msg = "Add the collection method to the selected sample" self.create_task_button.setToolTip(msg) self.collect_now_button = QtGui.QPushButton("Collect Now", self.button_box) self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png")) self.collect_now_button.hide() # Layout -------------------------------------------------------------- #_method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box) #_method_group_box_vlayout.addWidget(self.tool_box) #_method_group_box_vlayout.setSpacing(2) #_method_group_box_vlayout.setContentsMargins(2, 2, 2, 2) _button_box_hlayout = QtGui.QHBoxLayout(self.button_box) _button_box_hlayout.addWidget(self.collect_now_button) _button_box_hlayout.addStretch(0) _button_box_hlayout.addWidget(self.create_task_button) _button_box_hlayout.setSpacing(0) _button_box_hlayout.setContentsMargins(0, 0, 0, 0) _main_vlayout = QtGui.QVBoxLayout(self) _main_vlayout.addWidget(self.method_label) _main_vlayout.addWidget(self.tool_box) #_main_vlayout.addStretch(0) _main_vlayout.addWidget(self.button_box) _main_vlayout.setSpacing(0) _main_vlayout.setContentsMargins(0, 0, 0, 0) # SizePolicies -------------------------------------------------------- self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) # Qt signal/slot connections ------------------------------------------ self.create_task_button.clicked.connect(self.create_task_button_click) self.collect_now_button.clicked.connect(self.collect_now_button_click) self.tool_box.currentChanged.connect(self.current_page_changed) # Other --------------------------------------------------------------- def set_tree_brick(self, brick): """ Sets the tree brick of each page in the toolbox. """ self.tree_brick = brick for i in range(0, self.tool_box.count()): self.tool_box.widget(i).set_tree_brick(brick) def use_osc_start_cbox(self, status): for i in range(0, self.tool_box.count()): acq_widget = self.tool_box.widget(i).get_acquisition_widget() if acq_widget: acq_widget.use_osc_start(status) def set_beamline_setup(self, beamline_setup_hwobj): self._beamline_setup_hwobj = beamline_setup_hwobj for i in range(0, self.tool_box.count()): self.tool_box.widget(i).set_beamline_setup(beamline_setup_hwobj) self.graphics_manager_hwobj = beamline_setup_hwobj.shape_history_hwobj has_energy_scan = False has_xrf_spectrum = False if not beamline_setup_hwobj.diffractometer_hwobj.in_plate_mode(): if hasattr(beamline_setup_hwobj, 'energyscan_hwobj'): if beamline_setup_hwobj.energyscan_hwobj is not None and \ beamline_setup_hwobj.tunable_wavelength(): has_energy_scan = True self.energy_scan_page.set_energy_scan_hwobj(\ beamline_setup_hwobj.energyscan_hwobj) if hasattr(beamline_setup_hwobj, 'xrf_spectrum_hwobj'): if beamline_setup_hwobj.xrf_spectrum_hwobj is not None: has_xrf_spectrum = True if not has_energy_scan: self.tool_box.removeItem(self.tool_box.indexOf(self.energy_scan_page)) self.energy_scan_page.hide() logging.getLogger("GUI").warning("Energy scan task not available") if not has_xrf_spectrum: self.tool_box.removeItem(self.tool_box.indexOf(self.xrf_spectrum_page)) self.xrf_spectrum_page.hide() logging.getLogger("GUI").warning("XRF spectrum task not available") def update_data_path_model(self): for i in range(0, self.tool_box.count()): item = self.tool_box.widget(i) item.init_data_path_model() item.update_selection() def ispyb_logged_in(self, logged_in): """ Handels the signal logged_in from the brick the handles LIMS (ISPyB) login, ie ProposalBrick. The signal is emitted when a user was succesfully logged in. """ for i in range(0, self.tool_box.count()): self.tool_box.widget(i).ispyb_logged_in(logged_in) def current_page_changed(self, page_index): tree_items = self.tree_brick.get_selected_items() #self.collect_now_button.setHidden(page_index > 0) if len(tree_items) > 0: tree_item = tree_items[0] # Get the directory form the previous page and update # the new page with the directory and run_number from the old. # IF sample, basket group selected. if type(tree_item) in (Qt4_queue_item.DataCollectionGroupQueueItem, \ Qt4_queue_item.SampleQueueItem, \ Qt4_queue_item.BasketQueueItem): new_pt = self.tool_box.widget(page_index)._path_template previous_pt = self.tool_box.widget(self.previous_page_index)._path_template new_pt.directory = previous_pt.directory new_pt.base_prefix = previous_pt.base_prefix new_pt.run_number = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(new_pt) elif isinstance(tree_item, Qt4_queue_item.DataCollectionQueueItem): #self.collect_now_button.show() data_collection = tree_item.get_model() if data_collection.is_helical(): if self.tool_box.currentWidget() == self.helical_page: self.create_task_button.setEnabled(True) elif data_collection.is_mesh(): if self.tool_box.currentWidget() == self.advanced_page: self.create_task_button.setEnabled(True) elif self.tool_box.currentWidget() == self.discrete_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, Qt4_queue_item.CharacterisationQueueItem): if self.tool_box.currentWidget() == self.char_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, Qt4_queue_item.EnergyScanQueueItem): if self.tool_box.currentWidget() == self.energy_scan_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, Qt4_queue_item.XRFSpectrumQueueItem): if self.tool_box.currentWidget() == self.xrf_spectrum_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, Qt4_queue_item.GenericWorkflowQueueItem): if self.tool_box.currentWidget() == self.workflow_page: self.create_task_button.setEnabled(True) self.tool_box.widget(page_index).selection_changed(tree_items) self.previous_page_index = page_index def selection_changed(self, items): """ Called by the parent widget when selection in the tree changes. """ title = "<b>Collection method template</b>" if len(items) == 1: data_model = items[0].get_model() title = "<b>%s</b>" % data_model.get_display_name() if isinstance(items[0], Qt4_queue_item.DataCollectionGroupQueueItem): self.create_task_button.setEnabled(False) else: self.create_task_button.setEnabled(True) if isinstance(items[0], Qt4_queue_item.DataCollectionQueueItem): if data_model.is_helical(): self.tool_box.setCurrentWidget(self.helical_page) elif data_model.is_mesh(): self.tool_box.setCurrentWidget(self.advanced_page) else: self.tool_box.setCurrentWidget(self.discrete_page) elif isinstance(items[0], Qt4_queue_item.CharacterisationQueueItem): self.tool_box.setCurrentWidget(self.char_page) elif isinstance(items[0], Qt4_queue_item.EnergyScanQueueItem): self.tool_box.setCurrentWidget(self.energy_scan_page) elif isinstance(items[0], Qt4_queue_item.XRFSpectrumQueueItem): self.tool_box.setCurrentWidget(self.xrf_spectrum_page) elif isinstance(items[0], Qt4_queue_item.GenericWorkflowQueueItem): self.tool_box.setCurrentWidget(self.workflow_page) elif isinstance(items[0], Qt4_queue_item.SampleQueueItem): title = "<b>Sample: %s</b>" % data_model.get_display_name() self.method_label.setText(title) current_page = self.tool_box.currentWidget() current_page.selection_changed(items) def create_task_button_click(self): if self.tool_box.currentWidget().approve_creation(): items = self.tree_brick.get_selected_items() if not items: logging.getLogger("GUI").\ warning("Select the sample or group you "\ "would like to add to.") else: for item in items: shapes = self.graphics_manager_hwobj.get_selected_points() task_model = item.get_model() # Create a new group if sample is selected if isinstance(task_model, queue_model_objects.Sample): task_model = self.create_task_group(task_model) if self.tool_box.currentWidget() in (self.discrete_page, self.char_page, self.energy_scan_page, self.xrf_spectrum_page) and len(shapes): #This could be done in more nicer way... for shape in shapes: self.create_task(task_model, shape) else: self.create_task(task_model) elif isinstance(task_model, queue_model_objects.Basket): for sample_node in task_model.get_sample_list(): child_task_model = self.create_task_group(sample_node) if self.tool_box.currentWidget() in (self.discrete_page, self.char_page, self.energy_scan_page, self.xrf_spectrum_page) and len(shapes): for shape in shapes: self.create_task(child_task_model, shape) else: self.create_task(child_task_model) else: if self.tool_box.currentWidget() in (self.discrete_page, self.char_page, self.energy_scan_page, self.xrf_spectrum_page) and len(shapes): for shape in shapes: self.create_task(task_model, shape) else: self.create_task(task_model) self.tree_brick.select_last_added_item() self.tool_box.currentWidget().update_selection() def create_task_group(self, task_model): group_task_node = queue_model_objects.TaskGroup() current_item = self.tool_box.currentWidget() group_name = current_item._task_node_name group_task_node.set_name(group_name) num = task_model.get_next_number_for_name(group_name) group_task_node.set_number(num) self.tree_brick.queue_model_hwobj.\ add_child(task_model, group_task_node) return group_task_node def create_task(self, task_node, shape = None): # Selected item is a task group if isinstance(task_node, queue_model_objects.TaskGroup): sample = task_node.get_parent() task_list = self.tool_box.currentWidget().\ create_task(sample, shape) for child_task_node in task_list: self.tree_brick.queue_model_hwobj.\ add_child(task_node, child_task_node) # The selected item is a task, make a copy. else: new_node = self.tree_brick.queue_model_hwobj.copy_node(task_node) new_node.acquisitions[0].acquisition_parameters.\ centred_position.snapshot_image = self._beamline_setup_hwobj.\ shape_history_hwobj.get_scene_snapshot() self.tree_brick.queue_model_hwobj.add_child(task_node.get_parent(), new_node) def collect_now_button_click(self): if self.is_running: self._beamline_setup_hwobj.collect_hwobj.stop_collect() self.is_running = False self.collect_now_button.setText("Collect Now") self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png")) elif self.tool_box.currentWidget().approve_creation(): sample_item = self.tree_brick.dc_tree_widget.\ get_mounted_sample_item() self.collect_now_button.setText("Stop") self.collect_now_button.setIcon(Qt4_Icons.load_icon("Stop.png")) self.is_running = True self.tool_box.currentWidget().execute_task(\ sample_item.get_model()) self.is_running = False self.collect_now_button.setText("Collect Now") self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png"))
def __init__(self, parent=None, name="task_toolbox"): QtGui.QWidget.__init__(self, parent) self.setObjectName = name # Hardware objects ---------------------------------------------------- self.graphics_manager_hwobj = None # Internal variables -------------------------------------------------- self.tree_brick = None self.previous_page_index = 0 self.is_running = None # Graphic elements ---------------------------------------------------- self.method_label = QtGui.QLabel("Collection method", self) self.method_label.setAlignment(QtCore.Qt.AlignCenter) #Qt4_widget_colors.set_widget_color(self.method_label, # Qt4_widget_colors.SKY_BLUE) #font = self.method_group_box.font() #font.setPointSize(10) #self.method_group_box.setFont(font) self.tool_box = QtGui.QToolBox(self) self.tool_box.setObjectName("tool_box") self.tool_box.setFixedWidth(475) #self.tool_box.setFont(font) self.discrete_page = CreateDiscreteWidget( self.tool_box, "Discrete", ) self.char_page = CreateCharWidget(self.tool_box, "Characterise") self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page") self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan") self.xrf_spectrum_page = CreateXRFSpectrumWidget( self.tool_box, "xrf_spectrum") self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan") self.tool_box.addItem(self.discrete_page, "Standard Collection") self.tool_box.addItem(self.char_page, "Characterisation") self.tool_box.addItem(self.helical_page, "Helical Collection") self.tool_box.addItem(self.energy_scan_page, "Energy Scan") self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum") self.tool_box.addItem(self.advanced_page, "Advanced") self.button_box = QtGui.QWidget(self) self.create_task_button = QtGui.QPushButton(" Add to queue", self.button_box) self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png")) msg = "Add the collection method to the selected sample" self.create_task_button.setToolTip(msg) self.collect_now_button = QtGui.QPushButton("Collect Now", self.button_box) self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png")) self.collect_now_button.hide() # Layout -------------------------------------------------------------- #_method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box) #_method_group_box_vlayout.addWidget(self.tool_box) #_method_group_box_vlayout.setSpacing(2) #_method_group_box_vlayout.setContentsMargins(2, 2, 2, 2) _button_box_hlayout = QtGui.QHBoxLayout(self.button_box) _button_box_hlayout.addWidget(self.collect_now_button) _button_box_hlayout.addStretch(0) _button_box_hlayout.addWidget(self.create_task_button) _button_box_hlayout.setSpacing(0) _button_box_hlayout.setContentsMargins(0, 0, 0, 0) _main_vlayout = QtGui.QVBoxLayout(self) _main_vlayout.addWidget(self.method_label) _main_vlayout.addWidget(self.tool_box) #_main_vlayout.addStretch(0) _main_vlayout.addWidget(self.button_box) _main_vlayout.setSpacing(0) _main_vlayout.setContentsMargins(0, 0, 0, 0) # SizePolicies -------------------------------------------------------- self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) # Qt signal/slot connections ------------------------------------------ self.create_task_button.clicked.connect(self.create_task_button_click) self.collect_now_button.clicked.connect(self.collect_now_button_click) self.tool_box.currentChanged.connect(self.current_page_changed)
class TaskToolBoxWidget(QtGui.QWidget): def __init__(self, parent=None, name="task_toolbox"): QtGui.QWidget.__init__(self, parent) self.setObjectName = name # Hardware objects ---------------------------------------------------- self.graphics_manager_hwobj = None # Internal variables -------------------------------------------------- self.tree_brick = None self.previous_page_index = 0 self.is_running = None # Graphic elements ---------------------------------------------------- self.method_label = QtGui.QLabel("Collection method", self) self.method_label.setAlignment(QtCore.Qt.AlignCenter) #Qt4_widget_colors.set_widget_color(self.method_label, # Qt4_widget_colors.SKY_BLUE) #font = self.method_group_box.font() #font.setPointSize(10) #self.method_group_box.setFont(font) self.tool_box = QtGui.QToolBox(self) self.tool_box.setObjectName("tool_box") self.tool_box.setFixedWidth(475) #self.tool_box.setFont(font) self.discrete_page = CreateDiscreteWidget( self.tool_box, "Discrete", ) self.char_page = CreateCharWidget(self.tool_box, "Characterise") self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page") self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan") self.xrf_spectrum_page = CreateXRFSpectrumWidget( self.tool_box, "xrf_spectrum") self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan") self.tool_box.addItem(self.discrete_page, "Standard Collection") self.tool_box.addItem(self.char_page, "Characterisation") self.tool_box.addItem(self.helical_page, "Helical Collection") self.tool_box.addItem(self.energy_scan_page, "Energy Scan") self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum") self.tool_box.addItem(self.advanced_page, "Advanced") self.button_box = QtGui.QWidget(self) self.create_task_button = QtGui.QPushButton(" Add to queue", self.button_box) self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png")) msg = "Add the collection method to the selected sample" self.create_task_button.setToolTip(msg) self.collect_now_button = QtGui.QPushButton("Collect Now", self.button_box) self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png")) self.collect_now_button.hide() # Layout -------------------------------------------------------------- #_method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box) #_method_group_box_vlayout.addWidget(self.tool_box) #_method_group_box_vlayout.setSpacing(2) #_method_group_box_vlayout.setContentsMargins(2, 2, 2, 2) _button_box_hlayout = QtGui.QHBoxLayout(self.button_box) _button_box_hlayout.addWidget(self.collect_now_button) _button_box_hlayout.addStretch(0) _button_box_hlayout.addWidget(self.create_task_button) _button_box_hlayout.setSpacing(0) _button_box_hlayout.setContentsMargins(0, 0, 0, 0) _main_vlayout = QtGui.QVBoxLayout(self) _main_vlayout.addWidget(self.method_label) _main_vlayout.addWidget(self.tool_box) #_main_vlayout.addStretch(0) _main_vlayout.addWidget(self.button_box) _main_vlayout.setSpacing(0) _main_vlayout.setContentsMargins(0, 0, 0, 0) # SizePolicies -------------------------------------------------------- self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) # Qt signal/slot connections ------------------------------------------ self.create_task_button.clicked.connect(self.create_task_button_click) self.collect_now_button.clicked.connect(self.collect_now_button_click) self.tool_box.currentChanged.connect(self.current_page_changed) # Other --------------------------------------------------------------- def set_tree_brick(self, brick): """ Sets the tree brick of each page in the toolbox. """ self.tree_brick = brick for i in range(0, self.tool_box.count()): self.tool_box.widget(i).set_tree_brick(brick) def use_osc_start_cbox(self, status): for i in range(0, self.tool_box.count()): acq_widget = self.tool_box.widget(i).get_acquisition_widget() if acq_widget: acq_widget.use_osc_start(status) def set_beamline_setup(self, beamline_setup_hwobj): self._beamline_setup_hwobj = beamline_setup_hwobj for i in range(0, self.tool_box.count()): self.tool_box.widget(i).set_beamline_setup(beamline_setup_hwobj) self.graphics_manager_hwobj = beamline_setup_hwobj.shape_history_hwobj has_energy_scan = False has_xrf_spectrum = False if not beamline_setup_hwobj.diffractometer_hwobj.in_plate_mode(): if hasattr(beamline_setup_hwobj, 'energyscan_hwobj'): if beamline_setup_hwobj.energyscan_hwobj is not None and \ beamline_setup_hwobj.tunable_wavelength(): has_energy_scan = True self.energy_scan_page.set_energy_scan_hwobj(\ beamline_setup_hwobj.energyscan_hwobj) if hasattr(beamline_setup_hwobj, 'xrf_spectrum_hwobj'): if beamline_setup_hwobj.xrf_spectrum_hwobj is not None: has_xrf_spectrum = True if not has_energy_scan: self.tool_box.removeItem( self.tool_box.indexOf(self.energy_scan_page)) self.energy_scan_page.hide() logging.getLogger("GUI").warning("Energy scan task not available") if not has_xrf_spectrum: self.tool_box.removeItem( self.tool_box.indexOf(self.xrf_spectrum_page)) self.xrf_spectrum_page.hide() logging.getLogger("GUI").warning("XRF spectrum task not available") def update_data_path_model(self): for i in range(0, self.tool_box.count()): item = self.tool_box.widget(i) item.init_data_path_model() item.update_selection() def ispyb_logged_in(self, logged_in): """ Handels the signal logged_in from the brick the handles LIMS (ISPyB) login, ie ProposalBrick. The signal is emitted when a user was succesfully logged in. """ for i in range(0, self.tool_box.count()): self.tool_box.widget(i).ispyb_logged_in(logged_in) def current_page_changed(self, page_index): tree_items = self.tree_brick.get_selected_items() #self.collect_now_button.setHidden(page_index > 0) if len(tree_items) > 0: tree_item = tree_items[0] # Get the directory form the previous page and update # the new page with the directory and run_number from the old. # IF sample, basket group selected. if type(tree_item) in (Qt4_queue_item.DataCollectionGroupQueueItem, \ Qt4_queue_item.SampleQueueItem, \ Qt4_queue_item.BasketQueueItem): new_pt = self.tool_box.widget(page_index)._path_template previous_pt = self.tool_box.widget( self.previous_page_index)._path_template new_pt.directory = previous_pt.directory new_pt.base_prefix = previous_pt.base_prefix new_pt.run_number = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(new_pt) elif isinstance(tree_item, Qt4_queue_item.DataCollectionQueueItem): #self.collect_now_button.show() data_collection = tree_item.get_model() if data_collection.is_helical(): if self.tool_box.currentWidget() == self.helical_page: self.create_task_button.setEnabled(True) elif data_collection.is_mesh(): if self.tool_box.currentWidget() == self.advanced_page: self.create_task_button.setEnabled(True) elif self.tool_box.currentWidget() == self.discrete_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, Qt4_queue_item.CharacterisationQueueItem): if self.tool_box.currentWidget() == self.char_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, Qt4_queue_item.EnergyScanQueueItem): if self.tool_box.currentWidget() == self.energy_scan_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, Qt4_queue_item.XRFSpectrumQueueItem): if self.tool_box.currentWidget() == self.xrf_spectrum_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, Qt4_queue_item.GenericWorkflowQueueItem): if self.tool_box.currentWidget() == self.workflow_page: self.create_task_button.setEnabled(True) self.tool_box.widget(page_index).selection_changed(tree_items) self.previous_page_index = page_index def selection_changed(self, items): """ Called by the parent widget when selection in the tree changes. """ title = "<b>Collection method template</b>" if len(items) == 1: data_model = items[0].get_model() title = "<b>%s</b>" % data_model.get_display_name() if isinstance(items[0], Qt4_queue_item.DataCollectionGroupQueueItem): self.create_task_button.setEnabled(False) else: self.create_task_button.setEnabled(True) if isinstance(items[0], Qt4_queue_item.DataCollectionQueueItem): if data_model.is_helical(): self.tool_box.setCurrentWidget(self.helical_page) elif data_model.is_mesh(): self.tool_box.setCurrentWidget(self.advanced_page) else: self.tool_box.setCurrentWidget(self.discrete_page) elif isinstance(items[0], Qt4_queue_item.CharacterisationQueueItem): self.tool_box.setCurrentWidget(self.char_page) elif isinstance(items[0], Qt4_queue_item.EnergyScanQueueItem): self.tool_box.setCurrentWidget(self.energy_scan_page) elif isinstance(items[0], Qt4_queue_item.XRFSpectrumQueueItem): self.tool_box.setCurrentWidget(self.xrf_spectrum_page) elif isinstance(items[0], Qt4_queue_item.GenericWorkflowQueueItem): self.tool_box.setCurrentWidget(self.workflow_page) elif isinstance(items[0], Qt4_queue_item.SampleQueueItem): title = "<b>Sample: %s</b>" % data_model.get_display_name() self.method_label.setText(title) current_page = self.tool_box.currentWidget() current_page.selection_changed(items) def create_task_button_click(self): if self.tool_box.currentWidget().approve_creation(): items = self.tree_brick.get_selected_items() if not items: logging.getLogger("GUI").\ warning("Select the sample or group you "\ "would like to add to.") else: for item in items: shapes = self.graphics_manager_hwobj.get_selected_points() task_model = item.get_model() # Create a new group if sample is selected if isinstance(task_model, queue_model_objects.Sample): task_model = self.create_task_group(task_model) if self.tool_box.currentWidget() in ( self.discrete_page, self.char_page, self.energy_scan_page, self.xrf_spectrum_page) and len(shapes): #This could be done in more nicer way... for shape in shapes: self.create_task(task_model, shape) else: self.create_task(task_model) elif isinstance(task_model, queue_model_objects.Basket): for sample_node in task_model.get_sample_list(): child_task_model = self.create_task_group( sample_node) if self.tool_box.currentWidget() in ( self.discrete_page, self.char_page, self.energy_scan_page, self.xrf_spectrum_page) and len(shapes): for shape in shapes: self.create_task(child_task_model, shape) else: self.create_task(child_task_model) else: if self.tool_box.currentWidget() in ( self.discrete_page, self.char_page, self.energy_scan_page, self.xrf_spectrum_page) and len(shapes): for shape in shapes: self.create_task(task_model, shape) else: self.create_task(task_model) self.tree_brick.select_last_added_item() self.tool_box.currentWidget().update_selection() def create_task_group(self, task_model): group_task_node = queue_model_objects.TaskGroup() current_item = self.tool_box.currentWidget() group_name = current_item._task_node_name group_task_node.set_name(group_name) num = task_model.get_next_number_for_name(group_name) group_task_node.set_number(num) self.tree_brick.queue_model_hwobj.\ add_child(task_model, group_task_node) return group_task_node def create_task(self, task_node, shape=None): # Selected item is a task group if isinstance(task_node, queue_model_objects.TaskGroup): sample = task_node.get_parent() task_list = self.tool_box.currentWidget().\ create_task(sample, shape) for child_task_node in task_list: self.tree_brick.queue_model_hwobj.\ add_child(task_node, child_task_node) # The selected item is a task, make a copy. else: new_node = self.tree_brick.queue_model_hwobj.copy_node(task_node) new_node.acquisitions[0].acquisition_parameters.\ centred_position.snapshot_image = self._beamline_setup_hwobj.\ shape_history_hwobj.get_scene_snapshot() self.tree_brick.queue_model_hwobj.add_child( task_node.get_parent(), new_node) def collect_now_button_click(self): if self.is_running: self._beamline_setup_hwobj.collect_hwobj.stop_collect() self.is_running = False self.collect_now_button.setText("Collect Now") self.collect_now_button.setIcon( Qt4_Icons.load_icon("VCRPlay2.png")) elif self.tool_box.currentWidget().approve_creation(): sample_item = self.tree_brick.dc_tree_widget.\ get_mounted_sample_item() self.collect_now_button.setText("Stop") self.collect_now_button.setIcon(Qt4_Icons.load_icon("Stop.png")) self.is_running = True self.tool_box.currentWidget().execute_task(\ sample_item.get_model()) self.is_running = False self.collect_now_button.setText("Collect Now") self.collect_now_button.setIcon( Qt4_Icons.load_icon("VCRPlay2.png"))
def __init__(self, parent = None, name="task_toolbox"): QWidget.__init__(self, parent) self.setObjectName = name # Hardware objects ---------------------------------------------------- self.graphics_manager_hwobj = None # Internal variables -------------------------------------------------- self.tree_brick = None self.previous_page_index = 0 self.is_running = None self.path_conflict = False self.acq_conflict = False self.enable_collect = False # Graphic elements ---------------------------------------------------- self.method_label = QLabel("Collection method", self) self.method_label.setAlignment(Qt.AlignCenter) self.tool_box = QToolBox(self) self.tool_box.setObjectName("tool_box") #self.tool_box.setFixedWidth(600) self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete",) self.char_page = CreateCharWidget(self.tool_box, "Characterise") self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page") self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan") self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum") if hasattr(parent.getHardwareObject('beamline-setup'), 'gphl_workflow_hwobj'): self.gphl_workflow_page = CreateGphlWorkflowWidget(self.tool_box, "gphl_workflow") else: self.gphl_workflow_page = None self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan") self.xray_imaging_page = CreateXrayImagingWidget(self.tool_box, "xray_imaging") self.tool_box.addItem(self.discrete_page, "Standard Collection") self.tool_box.addItem(self.char_page, "Characterisation") self.tool_box.addItem(self.helical_page, "Helical Collection") self.tool_box.addItem(self.energy_scan_page, "Energy Scan") self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum") if self.gphl_workflow_page is not None: self.tool_box.addItem(self.gphl_workflow_page, "GPhL Workflows") self.tool_box.addItem(self.advanced_page, "Advanced") self.tool_box.addItem(self.xray_imaging_page, "Xray Imaging") self.button_box = QWidget(self) self.create_task_button = QPushButton(" Add to queue", self.button_box) self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png")) msg = "Add the collection method to the selected sample" self.create_task_button.setToolTip(msg) self.create_task_button.setEnabled(False) self.collect_now_button = QPushButton("Collect Now", self.button_box) self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png")) self.collect_now_button.setToolTip( "Add the collection method to the queue and execute it") # Layout -------------------------------------------------------------- _button_box_hlayout = QHBoxLayout(self.button_box) _button_box_hlayout.addWidget(self.collect_now_button) _button_box_hlayout.addStretch(0) _button_box_hlayout.addWidget(self.create_task_button) _button_box_hlayout.setSpacing(0) _button_box_hlayout.setContentsMargins(0, 0, 0, 0) _main_vlayout = QVBoxLayout(self) _main_vlayout.addWidget(self.method_label) _main_vlayout.addWidget(self.tool_box) _main_vlayout.addWidget(self.button_box) _main_vlayout.setSpacing(0) _main_vlayout.setContentsMargins(0, 0, 0, 0) # SizePolicies -------------------------------------------------------- #self.setSizePolicy(QSizePolicy.Expanding, # QSizePolicy.Expanding) # Qt signal/slot connections ------------------------------------------ self.create_task_button.clicked.connect(self.create_task_button_click) self.collect_now_button.clicked.connect(self.collect_now_button_click) self.tool_box.currentChanged.connect(self.current_page_changed) for i in range(0, self.tool_box.count()): self.tool_box.widget(i).acqParametersConflictSignal.connect(\ self.acq_parameters_conflict_changed) self.tool_box.widget(i).pathTempleConflictSignal.connect(\ self.path_template_conflict_changed)