示例#1
0
 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()
示例#2
0
 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())
示例#3
0
 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
示例#5
0
    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
示例#6
0
    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)
示例#7
0
    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)
示例#8
0
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