def on_find_peaks_clicked(self, widget):
        def after_cb(threshold):
            self.model.auto_add_peaks(threshold)

        sel_model = ThresholdSelector(parent=self.model)
        sel_view = DetectPeaksView(parent=self.view)
        sel_ctrl = ThresholdController(model=sel_model, view=sel_view, parent=self, callback=after_cb) #@UnusedVariable
        
        show_threshold_plot = DialogFactory.get_progress_dialog(
            action=sel_model.update_threshold_plot_data,
            complete_callback=lambda *a, **k: sel_view.present(),
            gui_message="Finding peaks {progress:.0f}%...",
            toplevel=self.view.get_top_widget()
        )

        if len(self.model.markers) > 0:
            def on_accept(dialog):
                self.model.clear_markers()
                show_threshold_plot()
            def on_reject(dialog):
                show_threshold_plot()
            DialogFactory.get_confirmation_dialog(
                "Do you want to clear the current markers for this pattern?",
                parent=self.view.get_top_widget()
            ).run(on_accept, on_reject)
        else:
            show_threshold_plot()          
 def load_components(self, filename):
     old_comps = self.get_selected_objects()
     if old_comps:
         num_oc = len(old_comps)
         new_comps = list()
         for comp in Component.load_components(filename, parent=self.model):
             comp.resolve_json_references()
             new_comps.append(comp)
         num_nc = len(new_comps)
         if num_oc != num_nc:
             DialogFactory.get_information_dialog(
                 "The number of components to import must equal the number of selected components!"
             ).run()
             return
         else:
             self.select_object(None)
             logger.info("Importing components...")
             # replace component(s):
             for old_comp, new_comp in zip(old_comps, new_comps):
                 i = self.model.components.index(old_comp)
                 self.model.components[i] = new_comp
     else:
         DialogFactory.get_information_dialog(
             "No components selected to replace!"
         ).run()
Exemple #3
0
    def remove_backgrounds(self, specimens):
        """
            Opens the 'remove background' dialog for the given specimens,
            raises a ValueError error if (one of) the specimens is not part of
            this project.
        """

        def on_automated(dialog):
            for specimen in specimens:
                if not specimen in self.model.specimens:
                    raise ValueError("Specimen `%s` is not part of this Project!" % specimen)
                else:
                    specimen.experimental_pattern.bg_type = 0 # Linear see settings
                    specimen.experimental_pattern.find_bg_position()
                    specimen.experimental_pattern.remove_background()
                    specimen.experimental_pattern.clear_bg_variables()

        def on_not_automated(dialog):
            for specimen in specimens:
                if not specimen in self.model.specimens:
                    raise ValueError("Specimen `%s` is not part of this Project!" % specimen)
                else:
                    bg_view = BackgroundView(parent=self.parent.view)
                    BackgroundController(model=specimen.experimental_pattern, view=bg_view, parent=self)
                    bg_view.present()

        # Ask user if he/she wants automation:
        DialogFactory.get_confirmation_dialog(
            "Do you want to perform an automated linear background subtraction?",
            parent=self.parent.view.get_top_widget()
        ).run(on_automated, on_not_automated)
    def on_find_peaks_clicked(self, widget):
        def after_cb(threshold):
            self.model.auto_add_peaks(threshold)

        sel_model = ThresholdSelector(parent=self.model)
        sel_view = DetectPeaksView(parent=self.view)
        sel_ctrl = ThresholdController(model=sel_model,
                                       view=sel_view,
                                       parent=self,
                                       callback=after_cb)  #@UnusedVariable
        sel_model.update_threshold_plot_data()

        if len(self.model.markers) > 0:

            def on_accept(dialog):
                self.model.clear_markers()
                sel_view.present()

            def on_reject(dialog):
                sel_view.present()

            DialogFactory.get_confirmation_dialog(
                "Do you want to clear the current markers for this pattern?",
                parent=self.view.get_top_widget()).run(on_accept, on_reject)
        else:
            sel_view.present()
Exemple #5
0
    def on_import_exclusion_ranges_clicked(self, widget, data=None):
        def on_confirm(dialog):
            def on_accept(dialog):
                filename = dialog.filename
                parser = dialog.parser
                message = "An unexpected error has occured 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=False):
                    self.model.exclusion_ranges.load_data(parser,
                                                          filename,
                                                          clear=True)

            DialogFactory.get_load_dialog(
                title="Import exclusion ranges",
                parent=self.view.get_top_widget(),
                filters=exc_parsers.get_import_file_filters()).run(on_accept)

        DialogFactory.get_confirmation_dialog(
            "Importing exclusion ranges will erase all current data.\nAre you sure you want to continue?",
            parent=self.view.get_top_widget()).run(on_confirm)
Exemple #6
0
    def remove_backgrounds(self, specimens):
        """
            Opens the 'remove background' dialog for the given specimens,
            raises a ValueError error if (one of) the specimens is not part of
            this project.
        """
        def on_automated(dialog):
            for specimen in specimens:
                if not specimen in self.model.specimens:
                    raise ValueError, "Specimen `%s` is not part of this Project!" % specimen
                else:
                    specimen.experimental_pattern.bg_type = 0  # Linear see settings
                    specimen.experimental_pattern.find_bg_position()
                    specimen.experimental_pattern.remove_background()
                    specimen.experimental_pattern.clear_bg_variables()

        def on_not_automated(dialog):
            for specimen in specimens:
                if not specimen in self.model.specimens:
                    raise ValueError, "Specimen `%s` is not part of this Project!" % specimen
                else:
                    bg_view = BackgroundView(parent=self.parent.view)
                    BackgroundController(model=specimen.experimental_pattern,
                                         view=bg_view,
                                         parent=self)
                    bg_view.present()

        # Ask user if he/she wants automation:
        DialogFactory.get_confirmation_dialog(
            "Do you want to perform an automated linear background subtraction?",
            parent=self.parent.view.get_top_widget()).run(
                on_automated, on_not_automated)
 def on_save_object_clicked(self, event):
     def on_accept(dialog):
         Marker.save_as_csv(dialog.filename, self.get_selected_objects())
     DialogFactory.get_save_dialog(
         "Export markers", parent=self.view.get_top_widget(),
         filters=self.file_filters
     ).run(on_accept)
Exemple #8
0
    def on_save_object_clicked(self, event):
        def on_accept(dialog):
            Marker.save_as_csv(dialog.filename, self.get_selected_objects())

        DialogFactory.get_save_dialog("Export markers",
                                      parent=self.view.get_top_widget(),
                                      filters=self.file_filters).run(on_accept)
 def load_components(self, filename):
     old_comps = self.get_selected_objects()
     if old_comps:
         num_oc = len(old_comps)
         new_comps = list()
         for comp in Component.load_components(filename, parent=self.model):
             comp.resolve_json_references()
             new_comps.append(comp)
         num_nc = len(new_comps)
         if num_oc != num_nc:
             DialogFactory.get_information_dialog(
                 "The number of components to import must equal the number of selected components!"
             ).run()
             return
         else:
             self.select_object(None)
             logger.info("Importing components...")
             # replace component(s):
             for old_comp, new_comp in zip(old_comps, new_comps):
                 i = self.model.components.index(old_comp)
                 self.model.components[i] = new_comp
     else:
         DialogFactory.get_information_dialog(
             "No components selected to replace!"
         ).run()
Exemple #10
0
    def on_import_wavelength_distribution_clicked(self, widget, data=None):
        def on_confirm(dialog):
            def on_accept(dialog):
                filename = dialog.filename
                parser = dialog.parser
                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=False):
                    self.model.wavelength_distribution.load_data(parser,
                                                                 filename,
                                                                 clear=True)

            DialogFactory.get_load_dialog(
                title="Import wavelength distribution",
                parent=self.view.get_top_widget(),
                filters=wld_parsers.get_import_file_filters(),
                current_folder=settings.DATA_REG.get_directory_path(
                    "DEFAULT_WL_DISTR")).run(on_accept)

        DialogFactory.get_confirmation_dialog(
            "Importing a wavelength distribution will erase all current data.\nAre you sure you want to continue?",
            parent=self.view.get_top_widget()).run(on_confirm)
Exemple #11
0
    def on_find_peaks_clicked(self, widget):
        def after_cb(threshold):
            self.model.auto_add_peaks(threshold)

        sel_model = ThresholdSelector(parent=self.model)
        sel_view = DetectPeaksView(parent=self.view)
        sel_ctrl = ThresholdController(model=sel_model,
                                       view=sel_view,
                                       parent=self,
                                       callback=after_cb)  #@UnusedVariable

        show_threshold_plot = DialogFactory.get_progress_dialog(
            action=sel_model.update_threshold_plot_data,
            complete_callback=lambda *a, **k: sel_view.present(),
            gui_message="Finding peaks {progress:.0f}%...",
            toplevel=self.view.get_top_widget())

        if len(self.model.markers) > 0:

            def on_accept(dialog):
                self.model.clear_markers()
                show_threshold_plot()

            def on_reject(dialog):
                show_threshold_plot()

            DialogFactory.get_confirmation_dialog(
                "Do you want to clear the current markers for this pattern?",
                parent=self.view.get_top_widget()).run(on_accept, on_reject)
        else:
            show_threshold_plot()
 def on_load_object_clicked(self, event):
     def on_accept(dialog):
         self.load_components(dialog.filename)
     DialogFactory.get_load_dialog(
         "Import components", parent=self.view.get_toplevel(),
         filters=self.file_filters
     ).run(on_accept)
     return True
Exemple #13
0
 def import_layer(dialog):
     def on_accept(dialog):
         del self.treemodel_data[:] # clears the list
         Atom.get_from_csv(dialog.filename, self.treemodel_data.append, self.model)
     DialogFactory.get_load_dialog(
         "Import atoms", parent=self.view.get_toplevel(),
         filters=self.file_filters
     ).run(on_accept)
 def on_load_object_clicked(self, event):
     def on_accept(dialog):
         self.load_components(dialog.filename)
     DialogFactory.get_load_dialog(
         "Import components", parent=self.view.get_toplevel(),
         filters=self.file_filters
     ).run(on_accept)
     return True
 def on_btn_import_experimental_data_clicked(self, widget, data=None):
     def on_confirm(dialog):
         self.on_replace_experimental_data()
     DialogFactory.get_confirmation_dialog(
         "Importing a new experimental file will erase all current data.\nAre you sure you want to continue?",
         parent=self.view.get_top_widget()
     ).run(on_confirm)
     return True
    def on_btn_import_raw_pattern_clicked(self, widget, data=None):
        def on_confirm(dialog):
            self.on_replace_raw_pattern()

        DialogFactory.get_confirmation_dialog(
            "Importing a new experimental file will erase all current data.\nAre you sure you want to continue?",
            parent=self.view.get_toplevel()).run(on_confirm)
        return True
Exemple #17
0
    def save(self, parent=None, current_name="graph", size="auto", num_specimens=1, offset=0.75):
        """
            Displays a save dialog to export an image from the current plot.
        """
        # Parse arguments:
        width, height = 0, 0
        if size == "auto":
            descr, width, height, dpi = settings.OUTPUT_PRESETS[0]
        else:
            width, height, dpi = list(map(float, size.replace("@", "x").split("x")))

        # Load gui:
        builder = Gtk.Builder()
        builder.add_from_file(resource_filename("pyxrd.specimen", "glade/save_graph_size.glade")) # FIXME move this to this namespace!!
        size_expander = builder.get_object("size_expander")
        cmb_presets = builder.get_object("cmb_presets")

        # Setup combo with presets:
        cmb_store = Gtk.ListStore(str, int, int, float)
        for row in settings.OUTPUT_PRESETS:
            cmb_store.append(row)
        cmb_presets.clear()
        cmb_presets.set_model(cmb_store)
        cell = Gtk.CellRendererText()
        cmb_presets.pack_start(cell, True)
        cmb_presets.add_attribute(cell, 'text', 0)
        def on_cmb_changed(cmb, *args):
            itr = cmb.get_active_iter()
            w, h, d = cmb_store.get(itr, 1, 2, 3)
            entry_w.set_text(str(w))
            entry_h.set_text(str(h))
            entry_dpi.set_text(str(d))
        cmb_presets.connect('changed', on_cmb_changed)

        # Setup input boxes:
        entry_w = builder.get_object("entry_width")
        entry_h = builder.get_object("entry_height")
        entry_dpi = builder.get_object("entry_dpi")
        entry_w.set_text(str(width))
        entry_h.set_text(str(height))
        entry_dpi.set_text(str(dpi))

        # What to do when the user wants to save this:
        def on_accept(dialog):
            # Get the width, height & dpi
            width = float(entry_w.get_text())
            height = float(entry_h.get_text())
            dpi = float(entry_dpi.get_text())
            i_width, i_height = width / dpi, height / dpi
            # Save it all right!
            self.save_figure(dialog.filename, dpi, i_width, i_height)

        # Ask the user where, how and if he wants to save:
        DialogFactory.get_save_dialog(
            "Save Graph", parent=parent,
            filters=self.file_filters, current_name=current_name,
            extra_widget=size_expander
        ).run(on_accept)
 def on_save_object_clicked(self, event):
     def on_accept(dialog):
         logger.info("Exporting components...")
         Component.save_components(self.get_selected_objects(), filename=dialog.filename)
     DialogFactory.get_save_dialog(
         "Export components", parent=self.view.get_toplevel(),
         filters=self.file_filters
      ).run(on_accept)
     return True
 def on_load_object_clicked(self, event):
     def on_accept(dialog):
         logger.info("Importing phases...")
         self.load_phases(dialog.filename, parser=dialog.parser)
     DialogFactory.get_load_dialog(
         "Import phase", parent=self.view.get_top_widget(),
         filters=phase_parsers.get_import_file_filters()
     ).run(on_accept)
     return True
 def on_save_object_clicked(self, event):
     def on_accept(dialog):
         logger.info("Exporting phases...")
         Phase.save_phases(self.get_selected_objects(), filename=dialog.filename)
     DialogFactory.get_save_dialog(
         "Export phase", parent=self.view.get_top_widget(),
         filters=phase_parsers.get_export_file_filters()
     ).run(on_accept)
     return True
 def on_load_object_clicked(self, event):
     def on_accept(dialog):
         with self._multi_operation_context():
             for marker in Marker.get_from_csv(dialog.filename, self.model):
                 self.model.markers.append(marker)
     DialogFactory.get_load_dialog(
         "Import markers", parent=self.view.get_top_widget(),
         filters=self.file_filters
     ).run(on_accept)
Exemple #22
0
    def on_load_object_clicked(self, event):
        def on_accept(dialog):
            with self._multi_operation_context():
                for marker in Marker.get_from_csv(dialog.filename, self.model):
                    self.model.markers.append(marker)

        DialogFactory.get_load_dialog("Import markers",
                                      parent=self.view.get_top_widget(),
                                      filters=self.file_filters).run(on_accept)
 def on_save_object_clicked(self, event):
     def on_accept(dialog):
         logger.info("Exporting components...")
         Component.save_components(self.get_selected_objects(), filename=dialog.filename)
     DialogFactory.get_save_dialog(
         "Export components", parent=self.view.get_toplevel(),
         filters=self.file_filters
      ).run(on_accept)
     return True
Exemple #24
0
    def on_load_object_clicked(self, event):
        def on_accept(dialog):
            logger.info("Importing phases...")
            self.load_phases(dialog.filename, parser=dialog.parser)

        DialogFactory.get_load_dialog(
            "Import phase",
            parent=self.view.get_top_widget(),
            filters=phase_parsers.get_import_file_filters()).run(on_accept)
        return True
Exemple #25
0
    def on_btn_export_gonio_clicked(self, widget, *args):
        def on_accept(dialog):
            dialog.parser.write(self.model, dialog.filename)
            self.generate_import_combo()

        DialogFactory.get_save_dialog(
            title="Select the goniometer setup file to save to",
            filters=goniometer_parsers.get_export_file_filters(),
            current_folder=settings.DATA_REG.get_directory_path(
                "DEFAULT_GONIOS"),
            parent=self.view.parent.get_top_widget()).run(on_accept)
Exemple #26
0
 def on_save_object_clicked(self, widget, user_data=None):
     def on_accept(save_dialog):
         Atom.save_as_csv(save_dialog.filename, self.get_all_objects())
     current_name = "%s%s" % (
         self.model.name.lower(),
         self.treemodel_property_name.replace("data", "").lower()
     )
     DialogFactory.get_save_dialog(
         "Export atoms", parent=self.view.get_toplevel(),
         current_name=current_name, filters=self.file_filters,
     ).run(on_accept)
 def on_composition_clicked(self, widget, *args):
     comp = "The composition of the specimens in this mixture:\n\n\n"
     comp += "<span font-family=\"monospace\">"
     # get the composition matrix (first columns contains strings with elements, others are specimen compositions)
     import re
     for row in self.model.get_composition_matrix():
         comp += "%s %s\n" % (re.sub(r'(\d+)', r'<sub>\1</sub>', row[0]), " ".join(row[1:]))
     comp += "</span>"
     DialogFactory.get_information_dialog(
         comp, parent=self.view.get_toplevel()
     ).run()
 def on_composition_clicked(self, widget, *args):
     comp = "The composition of the specimens in this mixture:\n\n\n"
     comp += "<span font-family=\"monospace\">"
     # get the composition matrix (first columns contains strings with elements, others are specimen compositions)
     import re
     for row in self.model.get_composition_matrix():
         comp += "%s %s\n" % (re.sub(r'(\d+)', r'<sub>\1</sub>',
                                     row[0]), " ".join(row[1:]))
     comp += "</span>"
     DialogFactory.get_information_dialog(
         comp, parent=self.view.get_toplevel()).run()
Exemple #29
0
    def on_save_object_clicked(self, event):
        def on_accept(dialog):
            logger.info("Exporting phases...")
            Phase.save_phases(self.get_selected_objects(),
                              filename=dialog.filename)

        DialogFactory.get_save_dialog(
            "Export phase",
            parent=self.view.get_top_widget(),
            filters=phase_parsers.get_export_file_filters()).run(on_accept)
        return True
 def _export_data(self, line):
     def on_accept(dialog):
         filename = dialog.filename
         parser = dialog.parser
         message = "An unexpected error has occurred when trying to save to '%s'." % os.path.basename(filename)
         with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False):
             line.save_data(parser, filename, **self.model.get_export_meta_data())
     ext_less_fname = os.path.splitext(self.model.name)[0]
     DialogFactory.get_save_dialog(
         "Select file for export", parent=self.view.get_top_widget(),
         filters=xrd_parsers.get_export_file_filters(), current_name=ext_less_fname
     ).run(on_accept)
 def on_accept(dialog):
     filename = dialog.filename
     parser = dialog.parser
     try:
         line.save_data(parser, filename,
                        **self.model.get_export_meta_data())
     except Exception:
         message = "An unexpected error has occured when trying to save to '%s'." % os.path.basename(
             filename)
         DialogFactory.get_information_dialog(
             message=message, parent=self.view.get_toplevel()).run()
         raise
 def on_accept(dialog):
     filename = dialog.filename
     parser = dialog.parser
     try:
         self.model.raw_pattern.load_data(parser, filename, clear=True)
     except Exception:
         message = "An unexpected error has occured when trying to parse '%s'.\n" % os.path.basename(
             filename)
         message += "This is most likely caused by an invalid or unsupported file format."
         DialogFactory.get_information_dialog(
             message=message, parent=self.view.get_toplevel()).run()
         raise
 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_export_exclusion_ranges_clicked(self, widget, data=None):
     def on_accept(dialog):
         filename = dialog.filename
         parser = dialog.parser
         message = "An unexpected error has occurred when trying to save '%s'.\n" % os.path.basename(filename)
         message += "Contact the developer about this!"
         with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False):
             header = "%s %s" % (self.model.name, self.model.sample_name)
             self.model.exclusion_ranges.save_data(parser, filename, header=header)
     DialogFactory.get_save_dialog(
         "Select file for exclusion ranges export",
         parent=self.view.get_top_widget(), filters=exc_parsers.get_export_file_filters()
     ).run(on_accept)
Exemple #35
0
 def on_load_object_clicked(self, widget, user_data=None):
     def import_layer(dialog):
         def on_accept(dialog):
             del self.treemodel_data[:] # clears the list
             Atom.get_from_csv(dialog.filename, self.treemodel_data.append, self.model)
         DialogFactory.get_load_dialog(
             "Import atoms", parent=self.view.get_toplevel(),
             filters=self.file_filters
         ).run(on_accept)
     DialogFactory.get_confirmation_dialog(
         message="Are you sure?\nImporting a layer file will clear the current list of atoms!",
         parent=self.view.get_toplevel()
     ).run(import_layer)
        def on_confirm(dialog):
            def on_accept(dialog):
                filename = dialog.filename
                parser = dialog.parser
                message = "An unexpected error has occured 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=False):
                    self.model.exclusion_ranges.load_data(parser, filename, clear=True)
            DialogFactory.get_load_dialog(
                title="Import exclusion ranges", parent=self.view.get_top_widget(),
                filters=exc_parsers.get_import_file_filters()
            ).run(on_accept)
Exemple #37
0
 def delete_selected_specimens(self):
     """
         Asks the user for confirmation and if positive deletes all the 
         selected specimens. Does nothing when no specimens are selected.
     """
     selection = self.get_selected_objects()
     if selection is not None and len(selection) >= 1:
         def delete_objects(dialog):
             for obj in selection:
                 if obj is not None:
                     self.model.specimens.remove(obj)
         DialogFactory.get_confirmation_dialog(
             message='Deleting a specimen is irreversible!\nAre You sure you want to continue?',
             parent=self.view.get_top_widget()
         ).run(delete_objects)
Exemple #38
0
    def on_pattern_file_set(self, 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=False):
            # 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
Exemple #39
0
 def accept_wrapper(self, *args, **kwargs):
     if self.model.check_for_changes():
         return DialogFactory.get_confirmation_dialog(
             confirm_msg, parent=self.view.get_top_widget()
         ).run(lambda d: on_accept(self, *args, **kwargs), on_reject)
     else:
         return on_accept(self, *args, **kwargs)
Exemple #40
0
    def on_cmb_import_gonio_changed(self, combobox, *args):
        model = combobox.get_model()
        itr = combobox.get_active_iter()
        if itr:
            # first column is the name, second column the path and third column
            # a flag indicating if this can be selected
            path = model.get_value(itr, 1)
            if path:

                def on_accept(dialog):
                    self.model.reset_from_file(path)

                DialogFactory.get_confirmation_dialog(
                    "Are you sure?\nYou will loose the current settings!",
                    parent=self.view.get_toplevel()).run(on_accept)
        combobox.set_active(-1)  # deselect
 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)
Exemple #42
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",
                                       parent=view.get_top_widget()),
         self.on_pattern_file_set)
     view.select_bg_view(self.model.get_bg_type_lbl().lower())
Exemple #43
0
 def accept_wrapper(self, *args, **kwargs):
     if self.model.current_project and self.model.current_project.needs_saving:
         return DialogFactory.get_confirmation_dialog(
             confirm_msg, parent=self.view.get_top_widget()
         ).run(lambda d: on_accept(self, *args, **kwargs), on_reject)
     else:
         return on_accept(self, *args, **kwargs)
    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
 def on_accept(dialog):
     filename = dialog.filename
     parser = dialog.parser
     message = "An unexpected error has occurred when trying to save '%s'.\n" % os.path.basename(filename)
     message += "Contact the developer about this!"
     with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False):
         header = "%s %s" % (self.model.name, self.model.sample_name)
         self.model.exclusion_ranges.save_data(parser, filename, header=header)
Exemple #46
0
    def _export_data(self, line):
        def on_accept(dialog):
            filename = dialog.filename
            parser = dialog.parser
            message = "An unexpected error has occurred when trying to save to '%s'." % os.path.basename(
                filename)
            with DialogFactory.error_dialog_handler(
                    message, parent=self.view.get_toplevel(), reraise=False):
                line.save_data(parser, filename,
                               **self.model.get_export_meta_data())

        ext_less_fname = os.path.splitext(self.model.name)[0]
        DialogFactory.get_save_dialog(
            "Select file for export",
            parent=self.view.get_top_widget(),
            filters=xrd_parsers.get_export_file_filters(),
            current_name=ext_less_fname).run(on_accept)
Exemple #47
0
 def parse_x_pos(x_pos, event):
     # Clear the eye dropper controller
     self.edc.enabled = False
     self.edc.disconnect()
     del self.edc
     # Get experimental data at the sampled point
     exp_y = self.model.current_specimen.experimental_pattern.get_y_at_x(x_pos)
     message = "Sampled point:\n"
     message += "\tExperimental data:\t( %.4f , %.4f )\n" % (x_pos, exp_y)
     # Get calculated data if applicable
     if self.model.current_project.layout_mode == "FULL":
         calc_y = self.model.current_specimen.calculated_pattern.get_y_at_x(x_pos)
         message += "\tCalculated data:\t\t( %.4f , %.4f )" % (x_pos, calc_y)
     # Display message dialog
     DialogFactory.get_information_dialog(
         message, parent=self.view.get_toplevel()
     ).run()
Exemple #48
0
 def on_accept(dialog):
     # Try to load the project:
     with DialogFactory.error_dialog_handler(
             "An error has occurred:\n<i>{0}</i>\n Your project was not loaded!",
             parent=self.view.get_toplevel(), reraise=False):
         self.model.current_project = dialog.parser.parse(dialog.filename)
         self.model.current_project.parent = self.model
         # Update the title
         self.update_title()
Exemple #49
0
 def on_accept(dialog):
     filename = dialog.filename
     parser = dialog.parser
     message = "An unexpected error has occurred when trying to save to '%s'." % os.path.basename(
         filename)
     with DialogFactory.error_dialog_handler(
             message, parent=self.view.get_toplevel(), reraise=False):
         line.save_data(parser, filename,
                        **self.model.get_export_meta_data())
 def on_del_object_clicked(self, event, del_callback=None, callback=None):
     tv = self.view.treeview
     selection = tv.get_selection()
     if selection.count_selected_rows() >= 1:
         def delete_objects(dialog):
             with self._multi_operation_context():
                 for obj in self.get_selected_objects():
                     if callable(del_callback):
                         del_callback(obj)
                     else:
                         self.treemodel_data.remove(obj)
                     if callable(callback): callback(obj)
                 self.edit_object(None)
         parent = self.view.get_top_widget()
         if not isinstance(parent, Gtk.Window): # @UndefinedVariable
             parent = None
         DialogFactory.get_confirmation_dialog(
             message=self.delete_msg, parent=parent
         ).run(delete_objects)
Exemple #51
0
 def on_accept(dialog):
     # Try to load the project:
     with DialogFactory.error_dialog_handler(
             "An error has occurred:\n<i>{0}</i>\n Your project was not loaded!",
             parent=self.view.get_toplevel(), title="Parsing error", reraise=False):
         self.model.current_project = dialog.parser.parse(dialog.filename)
         self.model.current_project.parent = self.model
         self.model.update_project_last_save_hash()
         # Update the title
         self.update_title()
 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())
Exemple #53
0
    def test_get_file_dialog(self):
        kwargs = get_file_chooser_kwags()
        dialog = DialogFactory.get_file_dialog(**kwargs)

        self.assertEqual(dialog.get_action(), kwargs["action"], "Action attribute is not set correctly")
        self.assertEqual(dialog.get_title(), kwargs["title"], "Title attribute is not set correctly")
        self.assertEqual(dialog.get_parent(), kwargs["parent"], "Parent window is not set correctly")
        self.assertEqual(dialog.get_current_name(), kwargs["current_name"], "Current name attribute is not set correctly")
        self.assertEqual(dialog.get_current_folder(), kwargs["current_folder"], "Current folder attribute is not set correctly")
        self.assertEqual(dialog.get_extra_widget(), kwargs["extra_widget"], "Extra widget attribute is not set correctly")
        self.assertEqual(dialog.filters, kwargs["filters"], "Filters attribute is not set correctly")
        self.assertEqual(dialog.get_select_multiple(), kwargs["multiple"], "Multiple attribute is not set correctly")
        self.assertEqual(dialog.get_do_overwrite_confirmation(), kwargs["confirm_overwrite"], "Confirm overwrite attribute is not set correctly")
Exemple #54
0
 def import_atomtypes_dialog(self):
     """ Creates & returns the 'import atom types' dialog """
     if self._import_atomtypes_dialog is None:
         # Default location of the database:
         current_folder = dirname(settings.DATA_REG.get_file_path("ATOM_SCAT_FACTORS"))
         # Create the dialog once, and re-use
         self._import_atomtypes_dialog = DialogFactory.get_load_dialog(
             title="Import atom types",
             current_folder=current_folder,
             persist=True, multiple=False,
             filters=self.file_filters,
             parent=self.view.get_top_widget()
         )
     return self._import_atomtypes_dialog