From 0ac37f538b4b6416ed77df3bae8e5eaa662434b2 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Thu, 12 Mar 2026 11:18:33 +0100 Subject: [PATCH] fix(gui_tools): flomni gui tools timeout optimization --- .../plugins/flomni/gui_tools.py | 75 ++++++++++++------- 1 file changed, 50 insertions(+), 25 deletions(-) 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 ba93df9..653883f 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py @@ -18,10 +18,17 @@ class flomniGuiToolsError(Exception): class flomniGuiTools: + GUI_RPC_TIMEOUT = 20 def __init__(self): self.text_box = None self.progressbar = None + self.flomni_window = None + self.xeyegui = None + self.pdf_viewer = None + self.idle_text_box = None + self.camera_gripper_image = None + self.camera_overview_image = None def set_client(self, client): self.client = client @@ -29,9 +36,10 @@ class flomniGuiTools: def flomnigui_show_gui(self): if "flomni" in self.gui.windows: + self.flomni_window = self.gui.windows["flomni"] self.gui.flomni.raise_window() else: - self.gui.new("flomni") + self.flomni_window = self.gui.new("flomni", timeout=self.GUI_RPC_TIMEOUT) time.sleep(1) def flomnigui_stop_gui(self): @@ -42,9 +50,11 @@ class flomniGuiTools: def flomnigui_show_xeyealign(self): self.flomnigui_show_gui() - if self._flomnigui_check_attribute_not_exists("xeyegui"): + if self._flomnigui_is_missing("xeyegui"): self.flomnigui_remove_all_docks() - self.xeyegui = self.gui.flomni.new("XRayEye", object_name="xrayeye") + self.xeyegui = self.gui.flomni.new( + "XRayEye", object_name="xrayeye", timeout=self.GUI_RPC_TIMEOUT + ) # start live if not dev.cam_xeye.live_mode_enabled.get(): dev.cam_xeye.live_mode_enabled.put(True) @@ -52,9 +62,11 @@ class flomniGuiTools: def flomnigui_show_xeyealign_fittab(self): self.flomnigui_show_gui() - if self._flomnigui_check_attribute_not_exists("xeyegui"): + if self._flomnigui_is_missing("xeyegui"): self.flomnigui_remove_all_docks() - self.xeyegui = self.gui.flomni.new("XRayEye") + self.xeyegui = self.gui.flomni.new( + "XRayEye", object_name="xrayeye", timeout=self.GUI_RPC_TIMEOUT + ) self.xeyegui.switch_tab("fit") def _flomnigui_check_attribute_not_exists(self, attribute_name): @@ -70,31 +82,39 @@ class flomniGuiTools: return False return True + def _flomnigui_is_missing(self, attribute_name): + widget = getattr(self, attribute_name, None) + if widget is None: + return True + if hasattr(widget, "_is_deleted") and widget._is_deleted(): + return True + return False + def flomnigui_show_cameras(self): self.flomnigui_show_gui() if self._flomnigui_check_attribute_not_exists( "cam_flomni_gripper" ) or self._flomnigui_check_attribute_not_exists("cam_flomni_overview"): self.flomnigui_remove_all_docks() - camera_gripper_image = self.gui.flomni.new("Image") + self.camera_gripper_image = self.gui.flomni.new("Image") if self._flomnicam_check_device_exists(dev.cam_flomni_gripper): - camera_gripper_image.image(device="cam_flomni_gripper", signal="preview") - camera_gripper_image.lock_aspect_ratio = True - camera_gripper_image.enable_fps_monitor = True - camera_gripper_image.enable_toolbar = False - camera_gripper_image.outer_axes = False - camera_gripper_image.inner_axes = False + self.camera_gripper_image.image(device="cam_flomni_gripper", signal="preview") + self.camera_gripper_image.lock_aspect_ratio = True + self.camera_gripper_image.enable_fps_monitor = True + 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_live_mode() else: print("Cannot open camera_gripper. Device does not exist.") - camera_overview_image = self.gui.flomni.new("Image") + self.camera_overview_image = self.gui.flomni.new("Image") if self._flomnicam_check_device_exists(dev.cam_flomni_overview): - camera_overview_image.image(device="cam_flomni_overview", signal="preview") - camera_overview_image.lock_aspect_ratio = True - camera_overview_image.enable_fps_monitor = True - camera_overview_image.enable_toolbar = False - camera_overview_image.outer_axes = False - camera_overview_image.inner_axes = False + self.camera_overview_image.image(device="cam_flomni_overview", signal="preview") + self.camera_overview_image.lock_aspect_ratio = True + self.camera_overview_image.enable_fps_monitor = True + 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_live_mode() else: print("Cannot open camera_overview. Device does not exist.") @@ -104,15 +124,20 @@ class flomniGuiTools: # dev.cam_flomni_gripper.stop_live_mode() # dev.cam_xeye.live_mode = False if hasattr(self.gui, "flomni"): - self.gui.flomni.delete_all() + self.gui.flomni.delete_all(timeout=self.GUI_RPC_TIMEOUT) self.progressbar = None self.text_box = None + self.xeyegui = None + self.pdf_viewer = None + self.idle_text_box = None + self.camera_gripper_image = None + self.camera_overview_image = None def flomnigui_idle(self): self.flomnigui_show_gui() - if self._flomnigui_check_attribute_not_exists("idle_text_box"): + if self._flomnigui_is_missing("idle_text_box"): self.flomnigui_remove_all_docks() - idle_text_box = self.gui.flomni.new("TextBox") + self.idle_text_box = self.gui.flomni.new("TextBox") text = ( "
"
             + "██████╗ ███████╗ ██████╗     ███████╗██╗      ██████╗ ███╗   ███╗███╗   ██╗██╗\n"
@@ -123,7 +148,7 @@ class flomniGuiTools:
             + "╚═════╝ ╚══════╝ ╚═════╝     ╚═╝     ╚══════╝ ╚═════╝ ╚═╝     ╚═╝╚═╝  ╚═══╝╚═╝\n"
             + "
" ) - idle_text_box.set_html_text(text) + self.idle_text_box.set_html_text(text) def flomnigui_docs(self, filename: str | None = None): import csaxs_bec @@ -167,7 +192,7 @@ class flomniGuiTools: # --- GUI handling (active existence check) ---------------------------- self.flomnigui_show_gui() - if self._flomnigui_check_attribute_not_exists("PdfViewerWidget"): + if self._flomnigui_is_missing("pdf_viewer"): self.flomnigui_remove_all_docks() self.pdf_viewer = self.gui.flomni.new(widget="PdfViewerWidget") @@ -185,7 +210,7 @@ class flomniGuiTools: def flomnigui_show_progress(self): self.flomnigui_show_gui() - if self._flomnigui_check_attribute_not_exists("progressbar"): + if self._flomnigui_is_missing("progressbar"): self.flomnigui_remove_all_docks() # Add a new dock with a RingProgressBar widget self.progressbar = self.gui.flomni.new("RingProgressBar")