def update_setting_display(self): if not self: return # if gauge was left over from an error => now hide it if self.acquiring: self.gauge_acq.Show() return elif self.gauge_acq.IsShown(): self.gauge_acq.Hide() self.Layout() # Some settings can affect the FoV. Also, adding/removing the stream with # the smallest FoV would also affect the area. self.update_area_size() # Disable acquisition button if no area self.btn_secom_acquire.Enable(self.area is not None) if self.area is None: self.area_size_txt.SetLabel("Invalid stage position") return area_size = self.area[2] - self.area[0], self.area[3] - self.area[1] area_size_str = util.readable_str(area_size, unit="m", sig=3) self.area_size_txt.SetLabel(area_size_str) self.update_acquisition_time()
def update_area_size(self, w, h): """ Calculates the requested tiling area size, and updates it on the GUI. w (float): width of the tiling area h (float): height of the tiling area """ pos = self._tab_data_model.main.stage.position.value rect_pts = self.get_ROA_rect(w, h, pos, self._tiling_rng) if rect_pts: # Note the area can accept LTRB or LBRT. self.area = rect_pts area_size = util.readable_str(value=(w, h), unit="m", sig=3) self.area_size_txt.SetLabel(area_size) self.update_acquisition_time() else: # there is no intersection self.area_size_txt.SetLabel("Invalid stage position") logging.warning( "Couldn't find intersection between stage pos %s and tiling range %s" % (pos, self._tiling_rng))
def update_setting_display(self): if not self: return # if gauge was left over from an error => now hide it if self.acquiring: self.gauge_acq.Show() return elif self.gauge_acq.IsShown(): self.gauge_acq.Hide() self.Layout() if self.area is None: self.area_size_txt.SetLabel("Invalid stage position") return area_size = self.area[2] - self.area[0], self.area[3] - self.area[1] area_size_str = util.readable_str(area_size, unit="m", sig=3) self.area_size_txt.SetLabel(area_size_str) self.update_acquisition_time()
def __init__(self, parent, orig_tab_data): xrcfr_overview_acq.__init__(self, parent) self.conf = get_acqui_conf() # True when acquisition occurs self.acquiring = False self.data = None # a ProgressiveFuture if the acquisition is going on self.acq_future = None self._acq_future_connector = None self._main_data_model = orig_tab_data.main # duplicate the interface, but with only one view self._tab_data_model = self.duplicate_tab_data_model(orig_tab_data) # The pattern to use for storing each tile file individually # None disables storing them self.filename_tiles = create_filename(self.conf.pj_last_path, "{datelng}-{timelng}-overview", ".ome.tiff") # Create a new settings controller for the acquisition dialog self._settings_controller = LocalizationSettingsController( self, self._tab_data_model, highlight_change=True # also adds a "Reset" context menu ) self.zsteps = model.IntContinuous(1, range=(1, 51)) self.tiles_nx = model.IntContinuous(5, range=(1, 1000)) self.tiles_ny = model.IntContinuous(5, range=(1, 1000)) self._zsteps_vac = VigilantAttributeConnector(self.zsteps, self.zstack_steps, events=wx.EVT_SLIDER) self._tiles_n_vacx = VigilantAttributeConnector( self.tiles_nx, self.tiles_number_x, events=wx.EVT_COMMAND_ENTER) self._tiles_n_vacy = VigilantAttributeConnector( self.tiles_ny, self.tiles_number_y, events=wx.EVT_COMMAND_ENTER) orig_view = orig_tab_data.focussedView.value self._view = self._tab_data_model.focussedView.value self.streambar_controller = StreamBarController(self._tab_data_model, self.pnl_secom_streams, static=True, ignore_view=True) # The streams currently displayed are the one visible self.add_streams() # The list of streams ready for acquisition (just used as a cache) self._acq_streams = {} # Compute the preset values for each preset self._orig_entries = get_global_settings_entries( self._settings_controller) self._orig_settings = preset_as_is(self._orig_entries) for sc in self.streambar_controller.stream_controllers: self._orig_entries += get_local_settings_entries(sc) self.start_listening_to_va() # make sure the view displays the same thing as the one we are # duplicating self._view.view_pos.value = orig_view.view_pos.value self._view.mpp.value = orig_view.mpp.value self._view.merge_ratio.value = orig_view.merge_ratio.value # attach the view to the viewport self.pnl_view_acq.canvas.fit_view_to_next_image = False self.pnl_view_acq.setView(self._view, self._tab_data_model) self.Bind(wx.EVT_CHAR_HOOK, self.on_key) self.btn_cancel.Bind(wx.EVT_BUTTON, self.on_close) self.btn_secom_acquire.Bind(wx.EVT_BUTTON, self.on_acquire) self.Bind(wx.EVT_CLOSE, self.on_close) # on_streams_changed is compatible because it doesn't use the args # Set parameters for tiled acq self.overlap = 0.2 try: # Use the stage range, which can be overridden by the MD_POS_ACTIVE_RANGE. # Note: this last one might be temporary, until we have a RoA tool provided in the GUI. self._tiling_rng = { "x": self._main_data_model.stage.axes["x"].range, "y": self._main_data_model.stage.axes["y"].range } stage_md = self._main_data_model.stage.getMetadata() if model.MD_POS_ACTIVE_RANGE in stage_md: self._tiling_rng.update(stage_md[model.MD_POS_ACTIVE_RANGE]) except (KeyError, IndexError): raise ValueError( "Failed to find stage.MD_POS_ACTIVE_RANGE with x and y range") # Note: It should never be possible to reach here with no streams streams = self.get_acq_streams() for s in streams: self._view.addStream(s) # To update the estimated time when streams are removed/added self._view.stream_tree.flat.subscribe(self.on_streams_changed, init=True) zstep = util.readable_str(ZSTEP, unit="m", sig=3) self.zstack_slider_step.SetLabel(zstep)