[chronojump] forceSensorAnalyze manual: CSV export done!
- From: Xavier de Blas <xaviblas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [chronojump] forceSensorAnalyze manual: CSV export done!
- Date: Thu, 10 May 2018 10:28:25 +0000 (UTC)
commit f0b846ef407bfeb387c499a4401880a92f548d47
Author: Xavier de Blas <xaviblas gmail com>
Date: Thu May 10 12:27:37 2018 +0200
forceSensorAnalyze manual: CSV export done!
glade/app1.glade | 78 +++++++++++++++++++++++++++++-----------
src/constants.cs | 3 +-
src/forceSensor.cs | 62 ++++++++++++++++++++++++++++++++
src/gui/encoder.cs | 21 ++++++++++-
src/gui/forceSensorAnalyze.cs | 59 +++++++++++++++++++++++++++++++
5 files changed, 199 insertions(+), 24 deletions(-)
---
diff --git a/glade/app1.glade b/glade/app1.glade
index 4e25380..6dbdb85 100644
--- a/glade/app1.glade
+++ b/glade/app1.glade
@@ -1721,6 +1721,9 @@
<placeholder/>
</child>
<child>
+ <placeholder/>
+ </child>
+ <child>
<widget class="GtkLabel"
id="label_start_selector_jumps">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -17929,6 +17932,9 @@ Concentric</property>
<placeholder/>
</child>
<child>
+ <placeholder/>
+ </child>
+ <child>
<widget class="GtkLabel"
id="label_force_sensor_ai_force_a">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -19253,27 +19259,6 @@ Concentric</property>
<placeholder/>
</child>
<child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
<widget class="GtkLabel"
id="label_force_sensor_ai_rfd_a">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -19483,6 +19468,52 @@ Concentric</property>
<widget class="GtkVBox" id="vbox124">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="spacing">8</property>
+ <child>
+ <widget class="GtkButton"
id="button_force_sensor_analyze_AB_save">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip"
translatable="yes">Export data from A to B</property>
+ <signal name="clicked"
handler="on_button_force_sensor_analyze_AB_save_clicked" swapped="no"/>
+ <child>
+ <widget class="GtkVBox" id="vbox131">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">4</property>
+ <child>
+ <widget class="GtkLabel" id="label366">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">AB</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkImage"
id="image_forcesensor_analyze_image_save7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-save</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
<child>
<widget class="GtkButton"
id="button_force_sensor_image_save_rfd_manual">
<property name="visible">True</property>
@@ -19527,7 +19558,7 @@ Concentric</property>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
- <property name="position">0</property>
+ <property name="position">1</property>
</packing>
</child>
</widget>
@@ -27601,6 +27632,9 @@ then click this button.</property>
<child>
<placeholder/>
</child>
+ <child>
+ <placeholder/>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
diff --git a/src/constants.cs b/src/constants.cs
index 4a20e45..0e383b2 100644
--- a/src/constants.cs
+++ b/src/constants.cs
@@ -807,7 +807,8 @@ public class Constants
JUMPS_PROFILE_SAVE_IMAGE,
ENCODER_CAPTURE_EXPORT_ALL, ENCODER_ANALYZE_SAVE_IMAGE,
ENCODER_ANALYZE_SAVE_AB, ENCODER_ANALYZE_SAVE_TABLE,
- FORCESENSOR_SAVE_IMAGE_SIGNAL, FORCESENSOR_SAVE_IMAGE_RFD_AUTO,
FORCESENSOR_SAVE_IMAGE_RFD_MANUAL
+ FORCESENSOR_SAVE_IMAGE_SIGNAL, FORCESENSOR_SAVE_IMAGE_RFD_AUTO,
+ FORCESENSOR_SAVE_IMAGE_RFD_MANUAL, FORCESENSOR_ANALYZE_SAVE_AB
}
public static double EncoderErrorCode = -1;
diff --git a/src/forceSensor.cs b/src/forceSensor.cs
index b34136c..2afd6d6 100644
--- a/src/forceSensor.cs
+++ b/src/forceSensor.cs
@@ -819,6 +819,68 @@ public class ForceSensorAnalyzeInstant
lineYEnd = 0;
}
+ public void ExportToCSV(int countA, int countB, string selectedFileName, string sepString,
+ double timeA, double timeB, double timeDiff,
+ double forceA, double forceB, double forceDiff, double forceAvg, double forceMax,
+ double rfdA, double rfdB, double rfdDiff, double rfdAvg, double rfdMax
+ )
+ {
+ //this overwrites if needed
+ TextWriter writer = File.CreateText(selectedFileName);
+
+ string sep = " ";
+ if (sepString == "COMMA")
+ sep = ";";
+ else
+ sep = ",";
+
+ string header =
+ "" + sep +
+ Catalog.GetString("Time") + sep +
+ Catalog.GetString("Force") + sep +
+ Catalog.GetString("RFD");
+
+ //write header
+ writer.WriteLine(header);
+
+ //write statistics
+ writer.WriteLine(
+ Catalog.GetString("Difference") + sep +
+ Util.DoubleToCSV(timeDiff, sepString) + sep +
+ Util.DoubleToCSV(forceDiff, sepString) + sep +
+ Util.DoubleToCSV(rfdDiff, sepString) );
+
+ writer.WriteLine(
+ Catalog.GetString("Average") + sep +
+ "" + sep +
+ Util.DoubleToCSV(forceAvg, sepString) + sep +
+ Util.DoubleToCSV(rfdAvg, sepString) );
+
+ writer.WriteLine(
+ Catalog.GetString("Maximum") + sep +
+ "" + sep +
+ Util.DoubleToCSV(forceMax, sepString) + sep +
+ Util.DoubleToCSV(rfdMax, sepString) );
+
+ //blank line
+ writer.WriteLine();
+
+ //write header
+ writer.WriteLine(header);
+
+ //write data
+ for(int i = countA; i <= countB; i ++)
+ writer.WriteLine(
+ (i+1).ToString() + sep +
+ Util.DoubleToCSV(fscAIPoints.GetTimeAtCount(i), sepString) + sep +
+ Util.DoubleToCSV(fscAIPoints.GetForceAtCount(i), sepString) + sep +
+ Util.DoubleToCSV(CalculateRFD(i-1, i+1), sepString) );
+
+ writer.Flush();
+ writer.Close();
+ ((IDisposable)writer).Dispose();
+ }
+
public ForceSensorCapturePoints FscAIPoints
{
get { return fscAIPoints; }
diff --git a/src/gui/encoder.cs b/src/gui/encoder.cs
index 37ecbe0..c45d197 100644
--- a/src/gui/encoder.cs
+++ b/src/gui/encoder.cs
@@ -1972,6 +1972,8 @@ public partial class ChronoJumpWindow
exportString = Catalog.GetString ("Save image");
else if(checkFileOp == Constants.CheckFileOp.ENCODER_ANALYZE_SAVE_AB)
exportString = Catalog.GetString ("Export repetition in CSV format");
+ else if(checkFileOp == Constants.CheckFileOp.FORCESENSOR_ANALYZE_SAVE_AB)
+ exportString = Catalog.GetString ("Export data in CSV format");
else if(checkFileOp == Constants.CheckFileOp.ENCODER_ANALYZE_SAVE_TABLE)
exportString = Catalog.GetString ("Save table");
@@ -2006,6 +2008,8 @@ public partial class ChronoJumpWindow
nameString += ".png";
else if(checkFileOp == Constants.CheckFileOp.ENCODER_ANALYZE_SAVE_AB)
nameString += "_encoder_repetition_export.csv";
+ else if(checkFileOp == Constants.CheckFileOp.FORCESENSOR_ANALYZE_SAVE_AB)
+ nameString += "_forcesensor_analyze_AB_export.csv";
else if(checkFileOp == Constants.CheckFileOp.ENCODER_ANALYZE_SAVE_TABLE)
nameString += "_encoder_curves_table.csv";
@@ -2024,6 +2028,7 @@ public partial class ChronoJumpWindow
//add ".csv" if needed
if(checkFileOp == Constants.CheckFileOp.ENCODER_CAPTURE_EXPORT_ALL ||
checkFileOp == Constants.CheckFileOp.ENCODER_ANALYZE_SAVE_AB ||
+ checkFileOp == Constants.CheckFileOp.FORCESENSOR_ANALYZE_SAVE_AB ||
checkFileOp == Constants.CheckFileOp.ENCODER_ANALYZE_SAVE_TABLE)
exportFileName = Util.AddCsvIfNeeded(exportFileName);
else //ENCODER_ANALYZE_SAVE_IMAGE, FORCESENSOR_SAVE_IMAGE_SIGNAL,
@@ -2065,6 +2070,9 @@ public partial class ChronoJumpWindow
else if(checkFileOp ==
Constants.CheckFileOp.FORCESENSOR_SAVE_IMAGE_RFD_MANUAL)
confirmWin.Button_accept.Clicked +=
new
EventHandler(on_overwrite_file_forcesensor_save_image_rfd_manual_accepted);
+ else if(checkFileOp ==
Constants.CheckFileOp.FORCESENSOR_ANALYZE_SAVE_AB)
+ confirmWin.Button_accept.Clicked +=
+ new
EventHandler(on_overwrite_file_forcesensor_save_AB_accepted);
} else {
if(checkFileOp == Constants.CheckFileOp.JUMPS_PROFILE_SAVE_IMAGE)
@@ -2083,11 +2091,14 @@ public partial class ChronoJumpWindow
on_button_forcesensor_save_image_rfd_auto_file_selected
(exportFileName);
else if(checkFileOp ==
Constants.CheckFileOp.FORCESENSOR_SAVE_IMAGE_RFD_MANUAL)
on_button_forcesensor_save_image_rfd_manual_file_selected
(exportFileName);
+ else if(checkFileOp ==
Constants.CheckFileOp.FORCESENSOR_ANALYZE_SAVE_AB)
+ on_button_force_sensor_save_AB_file_selected (exportFileName);
string myString = string.Format(Catalog.GetString("Saved to {0}"),
exportFileName);
if(checkFileOp == Constants.CheckFileOp.ENCODER_CAPTURE_EXPORT_ALL ||
- checkFileOp ==
Constants.CheckFileOp.ENCODER_ANALYZE_SAVE_AB)
+ checkFileOp ==
Constants.CheckFileOp.ENCODER_ANALYZE_SAVE_AB ||
+ checkFileOp ==
Constants.CheckFileOp.FORCESENSOR_ANALYZE_SAVE_AB)
myString +=
Constants.GetSpreadsheetString(preferences.CSVExportDecimalSeparator);
new DialogMessage(Constants.MessageTypes.INFO, myString);
}
@@ -2140,6 +2151,14 @@ public partial class ChronoJumpWindow
string myString = string.Format(Catalog.GetString("Saved to {0}"), exportFileName);
new DialogMessage(Constants.MessageTypes.INFO, myString);
}
+ private void on_overwrite_file_forcesensor_save_AB_accepted(object o, EventArgs args)
+ {
+ on_button_force_sensor_save_AB_file_selected (exportFileName);
+
+ string myString = string.Format(Catalog.GetString("Saved to {0}"),
+ exportFileName) +
Constants.GetSpreadsheetString(preferences.CSVExportDecimalSeparator);
+ new DialogMessage(Constants.MessageTypes.INFO, myString);
+ }
void on_button_encoder_delete_signal_clicked (object o, EventArgs args)
diff --git a/src/gui/forceSensorAnalyze.cs b/src/gui/forceSensorAnalyze.cs
index acf32f7..00ac453 100644
--- a/src/gui/forceSensorAnalyze.cs
+++ b/src/gui/forceSensorAnalyze.cs
@@ -38,6 +38,7 @@ public partial class ChronoJumpWindow
[Widget] Gtk.Viewport viewport_force_sensor_graph;
[Widget] Gtk.Button button_force_sensor_image_save_rfd_auto;
[Widget] Gtk.Button button_force_sensor_image_save_rfd_manual;
+ [Widget] Gtk.Button button_force_sensor_analyze_AB_save;
[Widget] Gtk.SpinButton spin_force_duration_seconds;
[Widget] Gtk.RadioButton radio_force_duration_seconds;
@@ -687,6 +688,8 @@ public partial class ChronoJumpWindow
bool debug = false;
button_force_sensor_image_save_rfd_manual.Sensitive = true;
+ if(checkbutton_force_sensor_ai_b.Active)
+ button_force_sensor_analyze_AB_save.Visible = true;
// 1) create paintPoints
Gdk.Point [] paintPoints = new Gdk.Point[fsAI.FscAIPoints.Points.Count];
@@ -947,6 +950,11 @@ public partial class ChronoJumpWindow
label_force_sensor_ai_rfd_average.Visible = visible;
label_force_sensor_ai_rfd_max.Visible = visible;
+ if(visible && canDoForceSensorAnalyzeAB())
+ button_force_sensor_analyze_AB_save.Visible = true;
+ else
+ button_force_sensor_analyze_AB_save.Visible = false;
+
forceSensorAIChanged = true; //to actually plot
force_sensor_ai_drawingarea.QueueDraw(); // -- refresh
}
@@ -1025,7 +1033,58 @@ public partial class ChronoJumpWindow
label_force_sensor_ai_rfd_average.Text = "";
label_force_sensor_ai_rfd_max.Text = "";
}
+ }
+ private bool canDoForceSensorAnalyzeAB()
+ {
+ return (Util.FileExists(lastForceSensorFullPath) &&
+ label_force_sensor_ai_time_diff.Visible &&
+ label_force_sensor_ai_time_diff.Text != null &&
+ Util.IsNumber(label_force_sensor_ai_time_diff.Text, true) );
+ }
+
+ private void on_button_force_sensor_analyze_AB_save_clicked (object o, EventArgs args)
+ {
+ if (canDoForceSensorAnalyzeAB())
+ checkFile(Constants.CheckFileOp.FORCESENSOR_ANALYZE_SAVE_AB);
+ else {
+ new DialogMessage(Constants.MessageTypes.WARNING, Constants.FileNotFound);
+ return;
+ }
+ }
+ void on_button_force_sensor_save_AB_file_selected (string selectedFileName)
+ {
+ fsAI.ExportToCSV(getLowestForceSensorABScale(), getHighestForceSensorABScale(),
+ selectedFileName, preferences.CSVExportDecimalSeparator,
+ Convert.ToDouble(label_force_sensor_ai_time_a.Text),
+ Convert.ToDouble(label_force_sensor_ai_time_b.Text),
+ Convert.ToDouble(label_force_sensor_ai_time_diff.Text),
+ Convert.ToDouble(label_force_sensor_ai_force_a.Text),
+ Convert.ToDouble(label_force_sensor_ai_force_b.Text),
+ Convert.ToDouble(label_force_sensor_ai_force_diff.Text),
+ Convert.ToDouble(label_force_sensor_ai_force_average.Text),
+ Convert.ToDouble(label_force_sensor_ai_force_max.Text),
+ Convert.ToDouble(label_force_sensor_ai_rfd_a.Text),
+ Convert.ToDouble(label_force_sensor_ai_rfd_b.Text),
+ Convert.ToDouble(label_force_sensor_ai_rfd_diff.Text),
+ Convert.ToDouble(label_force_sensor_ai_rfd_average.Text),
+ Convert.ToDouble(label_force_sensor_ai_rfd_max.Text)
+ );
+ }
+
+ private int getLowestForceSensorABScale()
+ {
+ if(Convert.ToInt32(hscale_force_sensor_ai_a.Value) <=
Convert.ToInt32(hscale_force_sensor_ai_b.Value))
+ return Convert.ToInt32(hscale_force_sensor_ai_a.Value);
+ else
+ return Convert.ToInt32(hscale_force_sensor_ai_b.Value);
+ }
+ private int getHighestForceSensorABScale()
+ {
+ if(Convert.ToInt32(hscale_force_sensor_ai_a.Value) <=
Convert.ToInt32(hscale_force_sensor_ai_b.Value))
+ return Convert.ToInt32(hscale_force_sensor_ai_b.Value);
+ else
+ return Convert.ToInt32(hscale_force_sensor_ai_a.Value);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]