def post_analysis_plot_actions(self): # reset the current figure to figure 1: lyse.figure_manager.figuremanager.set_first_figure_current() # Introspect the figures that were produced: for identifier, fig in lyse.figure_manager.figuremanager.figs.items(): window_state = None if not fig.axes: # Try and clear the figure if it is not in use try: plot = self.plots[fig] plot.set_window_title("Empty", self.filepath) plot.draw() plot.analysis_complete(figure_in_use=False) except KeyError: pass # Skip the rest of the loop regardless of whether we managed to clear # the unused figure or not! continue try: plot = self.plots[fig] # Get the Plot subclass registered for this plot identifier if it exists cls = lyse.get_plot_class(identifier) # If no plot was registered, use the base class if cls is None: cls = Plot # if plot instance does not match the expected identifier, # or the identifier in use with this plot has changes, # we need to close and reopen it! if type(plot) != cls or plot.identifier != identifier: window_state = plot.get_window_state() # Create a custom CloseEvent to force close the plot window event = PlotWindowCloseEvent(True) QtCore.QCoreApplication.instance().postEvent( plot.ui, event) # Delete the plot del self.plots[fig] # force raise the keyerror exception to recreate the window self.plots[fig] except KeyError: # If we don't already have this figure, make a window # to put it in: plot = self.new_figure(fig, identifier) # restore window state/geometry if it was saved if window_state is not None: plot.restore_window_state(window_state) else: if not plot.is_shown: plot.show() plot.update_window_size() plot.set_window_title(identifier, self.filepath) if plot.lock_axes: plot.restore_axis_limits() plot.draw() plot.analysis_complete(figure_in_use=True)
def new_figure(self, fig, identifier): try: # Get custom class for this plot if it is registered cls = lyse.get_plot_class(identifier) # If no plot was registered, use the base class if cls is None: cls = Plot # if cls is not a subclass of Plot, then raise an Exception if not issubclass(cls, Plot): raise RuntimeError( 'The specified class must be a subclass of lyse.Plot') # Instantiate the plot self.plots[fig] = cls(fig, identifier, self.filepath) except Exception: traceback_lines = traceback.format_exception(*sys.exc_info()) del traceback_lines[1] # Avoiding a list comprehension here so as to avoid this # python bug in earlier versions of 2.7 (fixed in 2.7.9): # https://bugs.python.org/issue21591 message = """Failed to instantiate custom class for plot "{identifier}". Perhaps lyse.register_plot_class() was called incorrectly from your script? The exception raised was: """.format(identifier=identifier) message = lyse.dedent(message) for line in traceback_lines: if PY2: # errors='replace' is for Windows filenames present in the # traceback that are not UTF8. They will not display # correctly, but that's the best we can do - the traceback # may contain code from the file in a different encoding, # so we could have a mixed encoding string. This is only # a problem for Python 2. line = line.decode('utf8', errors='replace') message += line message += '\n' message += 'Due to this error, we used the default lyse.Plot class instead.\n' sys.stderr.write(message) # instantiate plot using original Base class so that we always get a plot self.plots[fig] = Plot(fig, identifier, self.filepath) return self.plots[fig]