From 9fbad80862fd2e4b5a514c2878be2f5ef7d8073b Mon Sep 17 00:00:00 2001 From: "Michael D. M. Dryden" <mdryden@chem.utoronto.ca> Date: Thu, 31 Jul 2014 17:48:02 -0400 Subject: [PATCH] Autosave functionality implemented. Removed unused view options. --- dstatInterface/interface/dstatinterface.glade | 74 ++++++------ dstatInterface/interface/save.py | 109 +++++++++++------- dstatInterface/interface_test.py | 20 ++-- 3 files changed, 116 insertions(+), 87 deletions(-) diff --git a/dstatInterface/interface/dstatinterface.glade b/dstatInterface/interface/dstatinterface.glade index ba07430..b27fc3a 100644 --- a/dstatInterface/interface/dstatinterface.glade +++ b/dstatInterface/interface/dstatinterface.glade @@ -85,18 +85,17 @@ <property name="can_focus">False</property> <property name="stock">gtk-save-as</property> </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-save</property> + </object> <object class="GtkListStore" id="serial_liststore"> <columns> <!-- column-name serial --> <column type="gchararray"/> </columns> </object> - <object class="GtkAdjustment" id="updatesamples_adj"> - <property name="upper">100</property> - <property name="value">5</property> - <property name="step_increment">1</property> - <property name="page_increment">10</property> - </object> <object class="GtkWindow" id="window1"> <property name="can_focus">False</property> <property name="border_width">6</property> @@ -151,12 +150,12 @@ </object> </child> <child> - <object class="GtkImageMenuItem" id="gtk-save-as"> - <property name="label">gtk-save-as</property> + <object class="GtkImageMenuItem" id="file_save_plot"> + <property name="label">Save Plot…</property> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> + <property name="image">image3</property> + <property name="use_stock">False</property> </object> </child> <child> @@ -426,8 +425,8 @@ <property name="visible">True</property> <property name="can_focus">False</property> <child> - <object class="GtkCheckButton" id="plotinteractive_checkbutton"> - <property name="label" translatable="yes">Plot updates during measurement</property> + <object class="GtkCheckButton" id="autosave_checkbutton"> + <property name="label" translatable="yes">Autosave</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -440,51 +439,38 @@ </packing> </child> <child> - <object class="GtkSpinButton" id="samples_spinbutton"> + <object class="GtkFileChooserButton" id="autosavedir_button"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">â—</property> - <property name="truncate_multiline">True</property> - <property name="primary_icon_activatable">False</property> - <property name="secondary_icon_activatable">False</property> - <property name="primary_icon_sensitive">True</property> - <property name="secondary_icon_sensitive">True</property> - <property name="adjustment">updatesamples_adj</property> - <property name="snap_to_ticks">True</property> - <property name="numeric">True</property> - <property name="update_policy">if-valid</property> + <property name="can_focus">False</property> + <property name="action">select-folder</property> + <property name="preview_widget_active">False</property> + <property name="title" translatable="yes">Select a Save Folder</property> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> <property name="fill">True</property> - <property name="padding">5</property> <property name="position">1</property> </packing> </child> <child> - <object class="GtkLabel" id="label1"> + <object class="GtkEntry" id="autosavename"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">samples per update</property> + <property name="can_focus">True</property> + <property name="max_length">32</property> + <property name="invisible_char">â—</property> + <property name="text" translatable="yes">file</property> + <property name="overwrite_mode">True</property> + <property name="primary_icon_activatable">False</property> + <property name="secondary_icon_activatable">False</property> + <property name="primary_icon_sensitive">True</property> + <property name="secondary_icon_sensitive">True</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="padding">5</property> <property name="position">2</property> </packing> </child> - <child> - <object class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">3</property> - </packing> - </child> </object> <packing> <property name="expand">False</property> @@ -648,4 +634,10 @@ </object> </child> </object> + <object class="GtkAdjustment" id="updatesamples_adj"> + <property name="upper">100</property> + <property name="value">5</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> </interface> diff --git a/dstatInterface/interface/save.py b/dstatInterface/interface/save.py index 4789d40..2eaa6c1 100644 --- a/dstatInterface/interface/save.py +++ b/dstatInterface/interface/save.py @@ -1,49 +1,80 @@ #!/usr/bin/env python -import gtk, io +import gtk, io, os import numpy as np -class npSave: - def __init__(self, current_exp): - self.exp = current_exp - self.fcd = gtk.FileChooserDialog("Save...", None, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) - - self.filters = [gtk.FileFilter()] - self.filters[0].set_name("NumPy binary (.npy)") - self.filters[0].add_pattern("*.npy") - self.filters.append(gtk.FileFilter()) - self.filters[1].set_name("Space separated text (.txt)") - self.filters[1].add_pattern("*.txt") +def manSave(current_exp): + exp = current_exp + fcd = gtk.FileChooserDialog("Save...", None, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) + + filters = [gtk.FileFilter()] + filters[0].set_name("NumPy binary (.npy)") + filters[0].add_pattern("*.npy") + filters.append(gtk.FileFilter()) + filters[1].set_name("Space separated text (.txt)") + filters[1].add_pattern("*.txt") + + fcd.set_do_overwrite_confirmation(True) + for i in filters: + fcd.add_filter(i) + + response = fcd.run() + + if response == gtk.RESPONSE_OK: + path = fcd.get_filename() + print "Selected filepath: %s" % path + filter_selection = fcd.get_filter().get_name() - self.fcd.set_do_overwrite_confirmation(True) - for i in self.filters: - self.fcd.add_filter(i) - - self.response = self.fcd.run() + if filter_selection.endswith("(.npy)"): + npy(exp, path) + elif filter_selection.endswith("(.txt)"): + text(exp, path) + fcd.destroy() - if self.response == gtk.RESPONSE_OK: - self.path = self.fcd.get_filename() - print "Selected filepath: %s" % self.path - filter_selection = self.fcd.get_filter().get_name() - - if filter_selection.endswith("(.npy)"): - self.npy() - elif filter_selection.endswith("(.txt)"): - self.text() - self.fcd.destroy() + +def autoSave(current_exp, dir_button, name, expnumber): + if name == "": + name = "file" + path = dir_button.get_filename() + path += '/' + path += name + path += str(expnumber) + + text(current_exp, path) + + +def npy(exp, path): + if path.endswith(".npy"): + path = path.rstrip(".npy") + + data = np.array(exp.data) + j = 1 + while os.path.exists("".join([path, ".npy"])): + if j > 1: + path = path[:-len(str(j))] + path += str(j) + j += 1 + np.save(path, data) + +def text(exp, path): + if path.endswith(".txt"): + path = path.rstrip(".txt") + + j = 1 - def npy(self): - self.data = np.array(self.exp.data) - np.save(self.path, self.data()) + while os.path.exists("".join([path, ".txt"])): + if j > 1: + path = path[:-len(str(j))] + path += str(j) + j += 1 + + path += ".txt" + + data = np.array(exp.data) + header = "" + for i in exp.commands: + header += i - def text(self): - if not self.path.endswith(".txt"): - self.path += ".txt" - - self.data = np.array(self.exp.data) - header = "" - for i in self.exp.commands: - header += i - np.savetxt(self.path, self.data.transpose(), header=header, newline='\n') + np.savetxt(path, data.transpose(), header=header, newline='\n') diff --git a/dstatInterface/interface_test.py b/dstatInterface/interface_test.py index 4907636..e4b7b05 100644 --- a/dstatInterface/interface_test.py +++ b/dstatInterface/interface_test.py @@ -78,8 +78,12 @@ class main: self.error_context_id = self.statusbar.get_context_id("error") self.plotwindow = self.builder.get_object('plotbox') - self.plotint_checkbox = self.builder.get_object('plotinteractive_checkbutton') - self.updatelimit_adj = self.builder.get_object('updatesamples_adj') + + #setup autosave + self.autosave_checkbox = self.builder.get_object('autosave_checkbutton') + self.autosavedir_button = self.builder.get_object('autosavedir_button') + self.autosavename = self.builder.get_object('autosavename') + self.plot = mpltest.plotbox(self.plotwindow) #fill exp_section @@ -138,6 +142,8 @@ class main: self.acv_container.hide() self.pd_container.hide() + self.expnumber = 0 + def exp_param_show(self, selection): self.chronoamp_container.hide() self.lsv_container.hide() @@ -207,9 +213,6 @@ class main: parameters['adc_pga'] = pga_model.get_value(self.adc_pot.pga_combobox.get_active_iter(), 2) parameters['gain'] = gain_model.get_value(self.adc_pot.gain_combobox.get_active_iter(), 2) - view_parameters['update'] = self.plotint_checkbox.get_active() - view_parameters['updatelimit'] = int(self.updatelimit_adj.get_value()) - self.line = 0 self.lastline = 0 self.lastdataline = 0 @@ -537,7 +540,10 @@ class main: for row in col: self.databuffer.insert_at_cursor(str(row)+ "\t") self.databuffer.insert_at_cursor("\n") - + + if self.autosave_checkbox.get_active(): + save_inst = save.autoSave(self.current_exp, self.autosavedir_button, self.autosavename.get_text(), self.expnumber) + self.expnumber += 1 self.spinner.stop() self.startbutton.set_sensitive(True) @@ -550,7 +556,7 @@ class main: def on_file_save_exp_activate(self, menuitem, data=None): if self.current_exp: - self.save = save.npSave(self.current_exp) + save_inst = save.manSave(self.current_exp) if __name__ == "__main__": -- GitLab