class Meta(AbstractPhase.Meta): store_id = "RawPatternPhase" file_filters = [ ("Phase file", get_case_insensitive_glob("*.PHS")), ] rp_filters = xrd_parsers.get_import_file_filters() rp_export_filters = xrd_parsers.get_export_file_filters()
def register_view(self, view): super(BackgroundController, self).register_view(view) view.set_file_dialog( DialogFactory.get_load_dialog( title="Open XRD file for import", filters=xrd_parsers.get_import_file_filters(), parent=view.get_top_widget()), self.on_pattern_file_set) view.select_bg_view(self.model.get_bg_type_lbl().lower())
class Meta(AbstractPhase.Meta): properties = [ PropIntel(name="display_color", data_type=str, label="Display color", is_column=True, has_widget=True, widget_type='color', storable=True), PropIntel(name="raw_pattern", label="Raw pattern", data_type=object, is_column=True, storable=True, has_widget=True, widget_type="xy_list_view"), ] store_id = "RawPatternPhase" file_filters = [ ("Phase file", get_case_insensitive_glob("*.PHS")), ] rp_filters = xrd_parsers.get_import_file_filters() rp_export_filters = xrd_parsers.get_export_file_filters()
def on_replace_experimental_data(self, *args, **kwargs): def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to parse '%s'.\n" % os.path.basename(filename) message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False): self.model.experimental_pattern.load_data(parser, filename, clear=True) DialogFactory.get_load_dialog( "Open XRD file for import", parent=self.view.get_top_widget(), filters=xrd_parsers.get_import_file_filters() ).run(on_accept) return True
def on_replace_experimental_data(self, *args, **kwargs): def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to parse '%s'.\n" % os.path.basename( filename) message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler( message, parent=self.view.get_toplevel(), reraise=False): self.model.experimental_pattern.load_data(parser, filename, clear=True) DialogFactory.get_load_dialog( "Open XRD file for import", parent=self.view.get_top_widget(), filters=xrd_parsers.get_import_file_filters()).run(on_accept) return True
def import_multiple_specimen(self): def on_accept(dialog): ## TODO MOVE THIS (PARTIALLY?) TO THE MODEL LEVEL ## filenames = dialog.get_filenames() parser = dialog.get_filter().get_data("parser") task = ThreadedTaskBox() window = DialogFactory.get_custom_dialog( task, parent=self.view.get_top_widget()) # Status: status_dict = dict(total_files=len(filenames), current_file=0, specimens=[]) # Task: def load_specimens(stop=None): for filename in filenames: if stop is not None and stop.is_set(): return try: specimens = Specimen.from_experimental_data( filename=filename, parent=self.model, parser=parser) except Exception as msg: message = "An unexpected error has occurred when trying to parse %s:\n\n<i>" % os.path.basename( filename) message += str(msg) + "</i>\n\n" message += "This is most likely caused by an invalid or unsupported file format." logger.exception(message) @run_when_idle def run_dialog(): DialogFactory.get_information_dialog( message=message, parent=self.view.get_top_widget()).run() return False run_dialog() else: status_dict["specimens"] += specimens status_dict["current_file"] += 1 # Cancel & stop events: def on_interrupted(*args, **kwargs): window.hide() # Status label update: def gui_callback(): task.set_status( "Loading file %d/%d ..." % (status_dict["current_file"], status_dict["total_files"])) return True gui_timeout_id = gobject.timeout_add(250, gui_callback) # Complete event: @run_when_idle def on_complete(*args, **kwargs): last_iter = None for specimen in status_dict["specimens"]: last_iter = self.model.specimens.append(specimen) if last_iter is not None: self.view["project_specimens"].set_cursor(last_iter) gobject.source_remove(gui_timeout_id) window.hide() window.destroy() # Run task box: task.connect("cancelrequested", on_interrupted) task.connect("stoprequested", on_interrupted) task.set_status("Loading ...") task.start() window.show_all() # Run thread: self.thread = CancellableThread(load_specimens, on_complete) self.thread.start() DialogFactory.get_load_dialog( title="Select XRD files for import", filters=xrd_parsers.get_import_file_filters(), parent=self.view.get_top_widget(), multiple=True).run(on_accept)
def import_multiple_specimen(self): def on_accept(dialog): ## TODO MOVE THIS (PARTIALLY?) TO THE MODEL LEVEL ## filenames = dialog.get_filenames() parser = getattr(dialog.get_filter(), "parser") task = ThreadedTaskBox() window = DialogFactory.get_custom_dialog( task, parent=self.view.get_top_widget()) # Status: status_dict = dict( total_files=len(filenames), current_file=0, specimens=[] ) # Task: def load_specimens(stop=None): for filename in filenames: if stop is not None and stop.is_set(): return # Error message is case parsing fails: message = "An unexpected error has occurred when trying to parse %s:\n\n<i>" % os.path.basename(filename) message += "%s</i>\n\n" message += "This is most likely caused by an invalid or unsupported file format." # Run & report any errors: with DialogFactory.error_dialog_handler( message, self.view.get_top_widget(), title="Failed to load file", reraise=False): specimens = Specimen.from_experimental_data(filename=filename, parent=self.model, parser=parser) status_dict["specimens"] += specimens status_dict["current_file"] += 1 # Cancel & stop events: def on_interrupted(*args, **kwargs): window.hide() # Status label update: def gui_callback(): task.set_status("Loading file %d/%d ..." % ( status_dict["current_file"], status_dict["total_files"] )) return True gui_timeout_id = GObject.timeout_add(250, gui_callback) # Complete event: @run_when_idle def on_complete(*args, **kwargs): last_iter = None for specimen in status_dict["specimens"]: last_iter = self.model.specimens.append(specimen) if last_iter is not None: self.view["project_specimens"].set_cursor(last_iter) GObject.source_remove(gui_timeout_id) window.hide() window.destroy() # Run task box: task.connect("cancelrequested", on_interrupted) task.connect("stoprequested", on_interrupted) task.set_status("Loading ...") task.start() window.show_all() # Run thread: self.thread = CancellableThread(load_specimens, on_complete) self.thread.start() DialogFactory.get_load_dialog(title="Select XRD files for import", filters=xrd_parsers.get_import_file_filters(), parent=self.view.get_top_widget(), multiple=True).run(on_accept)
class BackgroundController(PatternActionController): """ Controller for the experimental pattern 'remove background' action view. """ file_filters = xrd_parsers.get_import_file_filters() auto_adapt_included = [ "bg_type", "bg_position", "bg_scale", ] model_setup_method = "find_bg_position" model_action_method = "remove_background" model_cancel_method = "clear_bg_variables" def register_view(self, view): super(BackgroundController, self).register_view(view) view.set_file_dialog( DialogFactory.get_load_dialog(title="Open XRD file for import", parent=view.get_top_widget(), filters=self.file_filters), self.on_pattern_file_set) view.select_bg_view(self.model.get_bg_type_lbl().lower()) # ------------------------------------------------------------ # Notifications of observable properties # ------------------------------------------------------------ @PatternActionController.observe("bg_type", assign=True) def notif_bg_type_changed(self, model, prop_name, info): self.view.select_bg_view(self.model.get_bg_type_lbl().lower()) return # ------------------------------------------------------------ # GTK Signal handlers # ------------------------------------------------------------ def on_pattern_file_set(self, button, dialog): # TODO # This should allow more flexibility: # Patterns should be allowed to not have the exact same shape, # add an x-shift variable to align them filename = dialog.filename parser = dialog.parser data_objects = None message = "An unexpected error has occurred when trying to parse %s:\n\n<i>" % os.path.basename( filename) message += "{}</i>\n\n" message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler( message, parent=self.view.get_toplevel(), reraise=settings.DEBUG): # Parse the pattern file data_objects = parser.parse(filename) pattern = data_objects[0].data bg_pattern_x = pattern[:, 0].copy() bg_pattern_y = pattern[:, 1].copy() del pattern # Interpolate/Extrapolate where needed to match data shape and range from scipy.interpolate import interp1d f = interp1d(bg_pattern_x, bg_pattern_y, bounds_error=False, fill_value=0) bg_xnew = self.model.data_x bg_ynew = f(bg_xnew) self.model.bg_pattern = bg_ynew pass # end of class