[chronojump] forceSensorAnalyze manual: CSV export done!



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]