diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py index 6c16e31..e2a0f33 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py @@ -425,6 +425,8 @@ class FlomniSampleTransferMixin: umv(dev.fsamx, fsamx_in) dev.fsamx.limits = [fsamx_in - 0.4, fsamx_in + 0.4] + self.flomnigui_idle() + def laser_tracker_show_all(self): dev.rtx.controller.laser_tracker_show_all() @@ -464,6 +466,10 @@ class FlomniSampleTransferMixin: self.device_manager.devices.fsamx.controller.lights_on() def ftransfer_flomni_stage_out(self): + + self.flomnigui_show_cameras() + + target_pos = -162 if np.isclose(dev.fsamx.readback.get(), target_pos, 0.01): return @@ -521,6 +527,9 @@ class FlomniSampleTransferMixin: if not sample_in_position: raise FlomniError(f"The planned pick position [{position}] does not have a sample.") + self.flomnigui_show_cameras() + + if self.OMNYTools.yesno("Please confirm that there is currently no sample in the gripper. It would be dropped!", "y"): print("good then") else: @@ -603,8 +612,9 @@ class FlomniSampleTransferMixin: self.flomni_modify_storage_non_interactive(100, 0, "-") self.flomni_modify_storage_non_interactive(position, 1, sample_name) - # TODO: flomni_stage_in if position == 0 - # bec.queue.next_dataset_number += 1 + if position == 0: + self.ftransfer_flomni_stage_in() + bec.queue.next_dataset_number += 1 def sample_get_name(self, position: int = 0) -> str: """ @@ -653,7 +663,13 @@ class FlomniSampleTransferMixin: print(f"The following slots are empty: {empty_slots}.") while True: - user_input = input(f"Where shall I put the sample? Default: [{empty_slots[0]}]") + user_input = input(f"Where shall I put the sample? Default: [{empty_slots[0]}] ") + + if user_input.strip() == "": + # No entry: use default + user_input = empty_slots[0] + break + try: user_input = int(user_input) if user_input not in empty_slots: @@ -724,7 +740,7 @@ class FlomniSampleTransferMixin: dev.ftransy.controller.socket_put_confirmed("confirm=1") else: print("Stopping.") - return + exit def ftransfer_gripper_is_open(self) -> bool: status = bool(float(dev.ftransy.controller.socket_put_and_receive("MG @OUT[9]").strip())) @@ -1594,6 +1610,9 @@ class Flomni( def tomo_scan(self, subtomo_start=1, start_angle=None, projection_number=None): """start a tomo scan""" + + self.flomnigui_show_progress() + bec = builtins.__dict__.get("bec") scans = builtins.__dict__.get("scans") self._current_special_angles = self.special_angles.copy() @@ -1730,6 +1749,7 @@ class Flomni( print(f"Angle: ........................... {self.progress['angle']}") print(f"Current subtomo: ................. {self.progress['subtomo']}") print(f"Current projection within subtomo: {self.progress['subtomo_projection']}\x1b[0m") + self._flomnigui_update_progress() def add_sample_database( self, samplename, date, eaccount, scan_number, setup, sample_additional_info, user @@ -1819,7 +1839,7 @@ class Flomni( def _write_tomo_scan_number(self, scan_number: int, angle: float, subtomo_number: int) -> None: tomo_scan_numbers_file = os.path.expanduser( - "~/Data10/specES1/dat-files/tomography_scannumbers.txt" + "~/tomography_scannumbers.txt" ) with open(tomo_scan_numbers_file, "a+") as out_file: # pylint: disable=undefined-variable diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py b/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py index 1089b19..aef6ca3 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py @@ -50,7 +50,7 @@ class flomniGuiTools: self.camera_gripper_image.enable_toolbar = False self.camera_gripper_image.outer_axes = False self.camera_gripper_image.inner_axes = False - dev.cam_flomni_gripper.start() + dev.cam_flomni_gripper.start_live_mode() else: print("Cannot open camera_gripper. Device does not exist.") self.camera_overview_image = self.gui.flomni.new("camera_overview").new("Image") @@ -61,13 +61,13 @@ class flomniGuiTools: self.camera_overview_image.enable_toolbar = False self.camera_overview_image.outer_axes = False self.camera_overview_image.inner_axes = False - dev.cam_flomni_overview.start() + dev.cam_flomni_overview.start_live_mode() else: print("Cannot open camera_overview. Device does not exist.") def flomnigui_remove_all_docks(self): - dev.cam_flomni_overview.stop() - dev.cam_flomni_gripper.stop() + dev.cam_flomni_overview.stop_live_mode() + dev.cam_flomni_gripper.stop_live_mode() self.gui.flomni.delete_all() self.camera_gripper_image = None self.camera_overview_image = None @@ -113,6 +113,8 @@ class flomniGuiTools: self.progressbar.set_precision(1) # Display self.progressbar with one decimal places # Setting multiple rigns with different values self.progressbar.set_number_of_bars(3) + self.progressbar.rings[0].set_update("manual") + self.progressbar.rings[1].set_update("manual") self.progressbar.rings[2].set_update("scan") # Set the values of the rings to 50, 75, and 25 from outer to inner ring # self.progressbar.set_value([50, 75]) @@ -124,12 +126,12 @@ class flomniGuiTools: def _flomnigui_update_progress(self): if self.progressbar is not None: progress = self.progress["projection"] / self.progress["total_projections"] * 100 - subotmo_progress = ( + subtomo_progress = ( self.progress["subtomo_projection"] / self.progress["subtomo_total_projections"] * 100 ) - self.progressbar.set_value([progress, subotmo_progress]) + self.progressbar.set_value([progress, subtomo_progress, 0]) text = f"Progress report:\n Tomo type: ....................... {self.progress['tomo_type']}\n Projection: ...................... {self.progress['projection']:.0f}\n Total projections expected ....... {self.progress['total_projections']}\n Angle: ........................... {self.progress['angle']}\n Current subtomo: ................. {self.progress['subtomo']}\n Current projection within subtomo: {self.progress['subtomo_projection']}\n Total projections per subtomo: ... {self.progress['subtomo_total_projections']}" self.text_box.set_plain_text(text) diff --git a/csaxs_bec/devices/omny/webcam_viewer.py b/csaxs_bec/devices/omny/webcam_viewer.py index 3bfecb2..a15b1fd 100644 --- a/csaxs_bec/devices/omny/webcam_viewer.py +++ b/csaxs_bec/devices/omny/webcam_viewer.py @@ -11,7 +11,7 @@ from bec_lib.logger import bec_logger logger = bec_logger.logger class WebcamViewer(Device): - USER_ACCESS = ["start", "stop"] + USER_ACCESS = ["start_live_mode", "stop_live_mode"] preview = Cpt(PreviewSignal, ndim=2, num_rotation_90=0, transpose=False) def __init__(self, url:str, name:str, num_rotation_90=0, transpose=False, **kwargs) -> None: @@ -24,7 +24,7 @@ class WebcamViewer(Device): self.preview.num_rotation_90 = num_rotation_90 self.preview.transpose = transpose - def start(self) -> None: + def start_live_mode(self) -> None: if self._connection is not None: return self._update_thread = threading.Thread(target=self._update_loop, daemon=True) @@ -51,7 +51,7 @@ class WebcamViewer(Device): content = traceback.format_exc() logger.error(f"Image update loop failed: {content}") - def stop(self) -> None: + def stop_live_mode(self) -> None: if self._connection is None: return self._shutdown_event.set()