diff options
| author | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2019-12-18 13:23:37 +0200 |
|---|---|---|
| committer | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2019-12-18 13:23:37 +0200 |
| commit | 70e3f2699a500666d1ca4e4d5db2dbaafb339e80 (patch) | |
| tree | dbf37c58cdc4586f5e3462fb6d9e0d7efde26171 /Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI | |
| parent | f8fc1e8e52e9758c23607b5e9e2dd1c379a37117 (diff) | |
| download | Tango-70e3f2699a500666d1ca4e4d5db2dbaafb339e80.tar.gz Tango-70e3f2699a500666d1ca4e4d5db2dbaafb339e80.zip | |
DispenserAnalyser. Added dynamic and flow test.
Diffstat (limited to 'Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI')
14 files changed, 600 insertions, 108 deletions
diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs index 5aecc4e99..d929c5825 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs @@ -12,7 +12,8 @@ namespace Tango.DispenserAnalyzer.UI.Analysis public static IAnalyzer GetAnalyzer(String fileName) { var analyzerTypes = typeof(AnalysisService).Assembly.GetTypes().Where(x => typeof(IAnalyzer).IsAssignableFrom(x)).ToList(); - var analyzerType = analyzerTypes.SingleOrDefault(x => fileName.ToLower().Contains(x.GetCustomAttribute<AnalyzerAttribute>().Name)); + var words = fileName.Split().Select(x => x.Trim(' ')); + var analyzerType = analyzerTypes.FirstOrDefault(x => words.Contains(x.GetCustomAttribute<AnalyzerAttribute>().Name, StringComparer.OrdinalIgnoreCase)); return (analyzerType != null) ? Activator.CreateInstance(analyzerType) as IAnalyzer : null; } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs index 0abf97117..0ff67c748 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Globalization; using System.Linq; using System.Reflection; using System.Text; @@ -33,8 +34,8 @@ namespace Tango.DispenserAnalyzer.UI.Analysis { aProp.Name = prop.Name; } - - aProp.Value = prop.GetValue(this).ToString(); + object val = prop.GetValue(this); + aProp.Value = (val is double) ? ((double)val).ToString("F") : val.ToString(); props.Add(aProp); } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultValue.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultValue.cs index ee0e5673d..a0cc2c2c7 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultValue.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultValue.cs @@ -10,7 +10,7 @@ namespace Tango.DispenserAnalyzer.UI.Analysis public enum AnalyzerResultValue { //Undetermined - [Description("test-tube-empty")] + [Description("Information")] Undetermined, [Description("Check")] Passed, diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs index 9ca05ec1e..6a07e3a42 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs @@ -10,6 +10,6 @@ namespace Tango.DispenserAnalyzer.UI.Analysis [Analyzer("INTERFACE")] public interface IAnalyzer { - Task<IAnalyzerResult> Process(List<DispenserSample> csvRows); + Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows); } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs new file mode 100644 index 000000000..2cf38fdd6 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DispenserAnalyzer.UI.Analysis; +using Tango.DispenserAnalyzer.UI.Models; + +namespace Tango.DispenserAnalyzer.UI.Analyzers +{ + [Analyzer("dynamic")] + public class DynamicSealingAnalzyer : IAnalyzer + { + public Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows) + { + return Task.Factory.StartNew<List<IAnalyzerResult>>(() => + { + List<IAnalyzerResult> results = new List<IAnalyzerResult>(); + List<DispenserSample> commands = csvRows.Where(x => x.Command != null && x.Command.ToLower().Contains("label")).ToList<DispenserSample>(); + + var pairs = commands.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index / 2).Select(x => x.Select(v => v.Value).ToList()).ToList(); + + //dynamic test + if (pairs.Count > 0 && pairs[0].Count > 1) + { + DynamicSealingAnalyzerResult result = new DynamicSealingAnalyzerResult(); + List<DispenserSample> rangeTestValues = csvRows.Where(x => x.Index > pairs[0][0].Index && x.Index < pairs[0][1].Index).ToList(); + int period = 10; + result.Result = AnalyzerResultValue.Passed; + //var sum_average = Enumerable.Range(0, rangeTestValues.Count - period).Select(n => rangeTestValues.Select(x=>x.Pressure).Skip(n).Take(periodLength).Average()).ToList(); + for (int counter = 0; counter <= rangeTestValues.Count - period; ) + { + var sum1 = rangeTestValues.Skip(counter++).Take(period).Average(t => t.Pressure); + var sum2 = rangeTestValues.Skip(counter++).Take(period).Average(t => t.Pressure); + if(sum1 > sum2 && sum1 - sum2 > 8) + { + result.DynamicSealingResult = "test failed"; + result.Result = AnalyzerResultValue.Failed; + break; + } + } + results.Add(result); + } + SealingAnalyzerResult sealingAnalyzerResult = new SealingAnalyzerResult(); + //start sealing test + if (pairs.Count > 1 && pairs[1].Count > 1) + { + List<DispenserSample> rangeStartTestValues = csvRows.Where(x => x.Index > pairs[1][0].Index && x.Index < pairs[1][1].Index).ToList(); + sealingAnalyzerResult.AverageStartTestValue = rangeStartTestValues.Average(t => t.Pressure); + } + //end sealing of test + if (pairs.Count > 2 && pairs[2].Count > 1) + { + List<DispenserSample> rangeEndTestValues = csvRows.Where(x => x.Index > pairs[2][0].Index && x.Index < pairs[2][1].Index).ToList(); + sealingAnalyzerResult.AverageEndTestValue = rangeEndTestValues.Average(t => t.Pressure); + } + sealingAnalyzerResult.AbsoluteTestValue = Math.Abs(sealingAnalyzerResult.AverageEndTestValue - sealingAnalyzerResult.AverageStartTestValue); + sealingAnalyzerResult.Result = sealingAnalyzerResult.AbsoluteTestValue < 8 ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; + results.Add(sealingAnalyzerResult); + return results; + }); + } + public class DynamicSealingAnalyzerResult : AnalyzerResultBase + { + [Description("Dynamic sealing result")] + public string DynamicSealingResult { get; set; } + + public DynamicSealingAnalyzerResult() + { + DynamicSealingResult = "test succeed"; + Result = AnalyzerResultValue.Undetermined; + } + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs new file mode 100644 index 000000000..15ab21575 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DispenserAnalyzer.UI.Analysis; +using Tango.DispenserAnalyzer.UI.Models; +using MathNet.Numerics.LinearAlgebra; + +namespace Tango.DispenserAnalyzer.UI.Analyzers +{ + [Analyzer("flow")] + public class FlowAnalyser : IAnalyzer + { + public Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows) + { + return Task.Factory.StartNew<List<IAnalyzerResult>>(() => + { + List <IAnalyzerResult> results = new List<IAnalyzerResult>(); + List<DispenserSample> commands = csvRows.Where(x => x.Command != null && x.Command.ToLower().Contains("label")).ToList<DispenserSample>(); + var pairs = commands.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index / 2).Select(x => x.Select(v => v.Value).ToList()).ToList(); + + for ( int index = 0; index < pairs.Count(); index++) + { + var pair = pairs[index]; + if (pair.Count != 2) + continue; + //testing PBU + List<DispenserSample> rangeTestValues = csvRows.Where(x => x.Index > pair[0].Index && x.Index < pair[1].Index).ToList(); + if (index%2 == 1)//testing Flow-error + { + int count_before = rangeTestValues.Count; + ProcessOutliers processOutliers = new ProcessOutliers(); + List<DispenserSample> peaks = new List<DispenserSample>(); + // processOutliers.RemoveOutliers(rangeTestValues, peaks); + int count_after = rangeTestValues.Count; + + FlowAnalyzerResult result = new FlowAnalyzerResult(); + result.AverageValue = rangeTestValues.Average(t => t.Pressure); + result.MinValue = rangeTestValues.Min(t => t.Pressure); + result.MaxValue = rangeTestValues.Max(t => t.Pressure); + result.TotalValue = result.AverageValue == 0 ? 0 : (result.MaxValue - result.MinValue) * 100 / result.AverageValue; + int startIndex = rangeTestValues.Count > 0 ? rangeTestValues[0].Index :0; + int lastIndex = rangeTestValues.Count > 0 ? rangeTestValues[rangeTestValues.Count-1].Index : 0; + int delayIndex = (startIndex + 10000) < lastIndex ? startIndex + 10000 : lastIndex; + int deltaIndex = (delayIndex + 1000) < lastIndex ? delayIndex + 1000 : lastIndex; + List<DispenserSample> filterTestValues = rangeTestValues.Where(x => x.Index >= delayIndex && x.Index < deltaIndex).ToList(); + result.FilterAverageValue = filterTestValues.Average(t => t.Pressure); + result.FilterMinValue = filterTestValues.Min(t => t.Pressure); + result.FilterMaxValue = filterTestValues.Max(t => t.Pressure); + result.FilterTotalValue = result.FilterAverageValue == 0 ? 0 : (result.FilterMaxValue - result.FilterMinValue) * 100 / result.FilterAverageValue; + result.Result = (result.FilterTotalValue <= 1.5 && result.TotalValue <= 3) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; + results.Add(result); + } + else//testing PBU + { + PrimingAnalyzerResult result = new PrimingAnalyzerResult(); + int avgMinIndex = rangeTestValues.Select(x => x.Index).Min(); + int avgMaxIndex = rangeTestValues.Select(x => x.Index).Max(); + double totalsec = TimeSpan.FromMilliseconds((avgMaxIndex - avgMinIndex) * 100).TotalSeconds; + result.Time = totalsec.ToString() + " sec"; + result.Result = (totalsec <= 11 && totalsec >= 8) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; + results.Add(result); + } + } + return results; + }); + } + + public class FlowAnalyzerResult : AnalyzerResultBase + { + [Description("Average Value")] + public double AverageValue { get; set; } + + [Description("Max Value")] + public double MaxValue { get; set; } + + [Description("Min Value")] + public double MinValue { get; set; } + + [Description("Total Value Peak to peak")] + public double TotalValue { get; set; } + + [Description("Local Average Value")] + public double FilterAverageValue { get; set; } + + [Description("Local Max Value")] + public double FilterMaxValue { get; set; } + + [Description("Local Min Value")] + public double FilterMinValue { get; set; } + + [Description("Local Total Value Peak to peak")] + public double FilterTotalValue { get; set; } + + public FlowAnalyzerResult() + { + AverageValue = MaxValue = MinValue = TotalValue = FilterAverageValue = FilterMaxValue = FilterMinValue = FilterTotalValue = 0.0; + Result = AnalyzerResultValue.Undetermined; + } + } + + + public class ProcessOutliers + { + private decimal _IQR; + + public decimal IQR + { + get { return _IQR; } + set { _IQR = value; } + } + + public ProcessOutliers() + { + IQR = 0.0m; + } + + /// <summary> + /// Creates the iqr - The interquartile range is defined as the difference between the upper quartile (the highest 25%) and the lower quartile (the lowest 25%) of a data set.. + /// </summary> + public void CreateIQR(List<DispenserSample> source) + { + int count = source.Count(); + if (count < 4) + return; + List<DispenserSample> data = source.OrderBy(t => t.Pressure).ToList(); + var LeftList = data.Take(count / 2).ToList(); + var RightList = data.Skip(LeftList.Count).ToList(); + + decimal Q1 = (decimal)LeftList[LeftList.Count/2 + LeftList.Count % 2].Pressure; + decimal Q3 = (decimal)RightList[RightList.Count / 2 + RightList.Count % 2].Pressure; + IQR = Q3 - Q1; + } + public void RemoveOutliers(List<DispenserSample> source, List<DispenserSample> peaks) + { + if (source.Count == 0){ + return; + } + // Calculate Mean value of the set. + double meanValue = source.Average(t => t.Pressure); + + // Find a value is farthest from the Mean. + DispenserSample farthestFromMean = source.OrderByDescending(x => Math.Abs(x.Pressure - meanValue)).First(); + CreateIQR(source); + + // Remove Object if its value is more than 1.5*IQR from the Mean. + decimal maxRange = (1.1m * IQR); + + //if ((farthestFromMean < minValue) || (farthestFromMean > maxValue)) + if ((decimal)Math.Abs(farthestFromMean.Pressure - meanValue) > maxRange) + { + peaks.Add(farthestFromMean); + source.Remove(farthestFromMean); + RemoveOutliers(source, peaks); + return; + } + // No outlier found, we're finished. + return; + } + } + + + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs new file mode 100644 index 000000000..0756d8ccf --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DispenserAnalyzer.UI.Analysis; +using Tango.DispenserAnalyzer.UI.Models; + + +namespace Tango.DispenserAnalyzer.UI.Analyzers +{ + [Analyzer("priming")] + public class PrimingAnalyzer : IAnalyzer + { + public Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows) + { + return Task.Factory.StartNew<List<IAnalyzerResult>>(() => + { + List<IAnalyzerResult> results = new List<IAnalyzerResult>(); + List<DispenserSample> commands = csvRows.Where(x => x.Command == "Label").ToList<DispenserSample>(); + PrimingAnalyzerResult result = new PrimingAnalyzerResult(); + var pairs = commands.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index / 2).Select(x => x.Select(v => v.Value).ToList()).ToList(); + //start range of test + if (pairs.Count > 0 && pairs[0].Count > 1) + { + List<DispenserSample> rangeTestValues = csvRows.Where(x => x.Index > pairs[0][0].Index && x.Index < pairs[0][1].Index).ToList(); + int avgMinIndex = rangeTestValues.Select(x => x.Index).Min(); + int avgMaxIndex = rangeTestValues.Select(x => x.Index).Max(); + double totalsec = TimeSpan.FromMilliseconds((avgMaxIndex - avgMinIndex) * 100).TotalSeconds; + result.Time = totalsec.ToString() + " sec"; + result.Result = (totalsec <= 11 && totalsec >= 8) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; + } + results.Add(result); + return results; + }); + } + } + public class PrimingAnalyzerResult : AnalyzerResultBase + { + [Description("PBU Time")] + public String Time { get; set; } + + + public PrimingAnalyzerResult() + { + Time = ""; + Result = AnalyzerResultValue.Undetermined; + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyzer.cs index 911976821..144e4a4c8 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyer.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyzer.cs @@ -10,13 +10,14 @@ using Tango.DispenserAnalyzer.UI.Models; namespace Tango.DispenserAnalyzer.UI.Analyzers { [Analyzer("seal")] - public class SealingAnalyer : IAnalyzer + public class SealingAnalyzer : IAnalyzer { - public Task<IAnalyzerResult> Process(List<DispenserSample> csvRows) + public Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows) { - return Task.Factory.StartNew<IAnalyzerResult>(() => + return Task.Factory.StartNew<List<IAnalyzerResult>>(() => { - List<DispenserSample> commands = csvRows.Where(x => x.Command != null).ToList< DispenserSample>(); + List<IAnalyzerResult> results = new List<IAnalyzerResult>(); + List<DispenserSample> commands = csvRows.Where(x => x.Command!= null && x.Command.ToLower().Contains("label")).ToList< DispenserSample>(); SealingAnalyzerResult result = new SealingAnalyzerResult(); var pairs = commands.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index /2).Select(x => x.Select(v => v.Value).ToList()).ToList(); //start range of test @@ -24,9 +25,6 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers { List<DispenserSample> rangeTestValues = csvRows.Where(x => x.Index > pairs[0][0].Index && x.Index < pairs[0][1].Index).ToList(); result.AverageStartTestValue = rangeTestValues.Average(t => t.Pressure); - //int avgMinIndex = rangeTestValues.Select(x => x.Index).Min(); - //int avgMaxIndex = rangeTestValues.Select(x => x.Index).Max(); - //result.Time = TimeSpan.FromMilliseconds((avgMaxIndex - avgMinIndex) * 10).TotalSeconds.ToString() + " sec"; } //end range of test if (pairs.Count > 1 && pairs[1].Count > 1) @@ -36,7 +34,8 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers } result.AbsoluteTestValue = Math.Abs(result.AverageEndTestValue - result.AverageStartTestValue); result.Result = result.AbsoluteTestValue < 8 ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; - return result; + results.Add(result); + return results; }); } } @@ -47,8 +46,6 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers public double AverageStartTestValue { get; set; } [Description("Average End Test Value")] public double AverageEndTestValue { get; set; } - //[Description("Average Duration Time")] - //public String Time { get; set; } [Description("Absolute Value")] public double AbsoluteTestValue { get; set; } public SealingAnalyzerResult() diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.config b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.config index 731f6de6c..f9370449f 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.config +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.config @@ -1,6 +1,54 @@ -<?xml version="1.0" encoding="utf-8" ?> +<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> + <runtime> + <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> + <dependentAssembly> + <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.0.5.0" newVersion="5.0.5.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-1.2.2.0" newVersion="1.2.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Reflection.Metadata" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-1.4.2.0" newVersion="1.4.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" /> + </dependentAssembly> + </assemblyBinding> + </runtime> </configuration>
\ No newline at end of file diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml index 1d4b2e431..5d6f3ad92 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml @@ -3,42 +3,51 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" + xmlns:oxy="http://oxyplot.org/wpf" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI" + xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls" xmlns:local="clr-namespace:Tango.DispenserAnalyzer.UI" xmlns:vm ="clr-namespace:Tango.DispenserAnalyzer.UI.ViewModels" mc:Ignorable="d" - Title="Dispenser Analyser" Height="1000" Width="800" WindowStartupLocation="CenterScreen" WindowStyle="SingleBorderWindow" ResizeMode="NoResize" Foreground="#202020" + Title="Dispenser Analyser" Height="1000" Width="800" WindowStartupLocation="CenterScreen" WindowStyle="SingleBorderWindow" ResizeMode="CanResize" Foreground="#202020" d:DataContext="{d:DesignInstance Type=vm:MainWindowVM, IsDesignTimeCreatable=False}"> <Window.Resources> <converters:EnumToDescriptionConverter x:Key="EnumToDescriptionConverter" /> <converters:IsNullToVisibilityConverter x:Key="IsNullToVisibilityConverter"/> + <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> + <converters:BooleanToVisibilityInverseConverter x:Key="BooleanToVisibilityInverseConverter" /> + <Style TargetType="ScrollBar"> + <Setter Property="Background" Value="#B9E7E9E9"/> + </Style> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="80"/> <RowDefinition Height="60"/> - <RowDefinition Height="2*"/> <RowDefinition Height="1*"/> + <RowDefinition Height="400"/> </Grid.RowDefinitions> - <Grid Grid.Row="0" Margin="20 20 20 20"> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="*" /> + </Grid.ColumnDefinitions> + <Grid Grid.Row="0" Margin="10 20 10 20"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"></ColumnDefinition> <ColumnDefinition Width="100"></ColumnDefinition> </Grid.ColumnDefinitions> - <TextBox x:Name="tbPath" BorderThickness="1" FontSize="16" VerticalContentAlignment="Center" IsReadOnly="False" Grid.Column="0" Margin="0 0 20 0" Text="{Binding OpenFilePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AllowDrop="True" PreviewDrop="TextBlock_PreviewDrop" PreviewDragOver="TextBox_PreviewDragOver" BorderBrush="Silver"></TextBox> + <TextBox x:Name="tbPath" BorderThickness="1" FontSize="16" VerticalContentAlignment="Center" IsReadOnly="False" Grid.Column="0" Margin="0 0 20 0" Text="{Binding OpenFilePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AllowDrop="True" PreviewDrop="TextBlock_PreviewDrop" PreviewDragOver="TextBox_PreviewDragOver" BorderBrush="Silver" Padding="5 0 0 0 "></TextBox> <Button Grid.Column="1" Command="{Binding OpenCSVFileCommand}">Browse</Button> </Grid> - <Button Grid.Row="1" Margin="20 0 20 20" Command="{Binding GenerateCommand}">GENERATE</Button> + <Button Grid.Row="1" Margin="10 0 10 20" Command="{Binding GenerateCommand}">GENERATE</Button> <Grid Grid.Row="2"> - <Border BorderBrush="Silver" Padding="5" BorderThickness="1" CornerRadius="5" Margin="10" Background="#202020"> - <DockPanel> - <TextBlock DockPanel.Dock="Top" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" Padding="10" Foreground="Silver" Text="{Binding TestName}"></TextBlock> - <lvc:CartesianChart Series="{Binding PressedValuesCollection}" LegendLocation="Bottom" DisableAnimations="True" DataTooltip="{x:Null}" Hoverable="False" > - <!--<lvc:CartesianChart.DataTooltip> - <lvc:DefaultTooltip BulletSize="20" Background="#7EFFFFFF" Foreground="green"/> - </lvc:CartesianChart.DataTooltip>--> + <Border BorderBrush="Silver" Padding="5" BorderThickness="1" CornerRadius="5" Margin="10"> + <!--<lvc:CartesianChart LegendLocation="Bottom" DisableAnimations="True" DataTooltip="{x:Null}" Hoverable="False" > + <lvc:CartesianChart.Series> + <lvc:LineSeries Values="{Binding Values}" PointGeometry="{x:Null}" Title="{Binding TestName}"/> + </lvc:CartesianChart.Series> <lvc:CartesianChart.AxisX> <lvc:Axis Title="TIME" Foreground="Silver" Labels="{Binding Labels}"> <lvc:Axis.Separator> @@ -53,38 +62,89 @@ </lvc:Axis.Separator> </lvc:Axis> </lvc:CartesianChart.AxisY> - </lvc:CartesianChart> - </DockPanel> + </lvc:CartesianChart>--> + <oxy:Plot + Title="{Binding TestName}" x:Name="PressurePlot" > + <oxy:Plot.Series > + <oxy:LineSeries ItemsSource="{Binding Points}" Color="#73B6EC"/> + </oxy:Plot.Series> + <oxy:Plot.Axes> + <oxy:LinearAxis Position="Bottom" Title = "Time" MajorGridlineStyle="Solid" MinorGridlineStyle="Dot" IsZoomEnabled="True"/> + <oxy:LinearAxis Position="Left" Title = "Pressure" MajorGridlineStyle="Solid" MinorGridlineStyle="Dot" IsZoomEnabled="True" Minimum="{Binding From}" Maximum="{Binding To}"/> + </oxy:Plot.Axes> + </oxy:Plot> </Border> </Grid> - <Grid Grid.Row="3"> - <Border Visibility="Visible" BorderThickness="1" BorderBrush="Silver" CornerRadius="5" Margin="10"> - <StackPanel Margin="3"> - <Label Height="30" Content="RESULT" Background="LightSkyBlue" /> - <Separator Height="5"/> - <!--<Border BorderThickness="1" BorderBrush="Silver" VerticalAlignment="Stretch">--> - <Grid Margin="10 0 20 0"> - <Grid.ColumnDefinitions> - <ColumnDefinition Width="1*"></ColumnDefinition> - <ColumnDefinition Width="200"></ColumnDefinition> - </Grid.ColumnDefinitions> - <ItemsControl Grid.Column="0" ItemsSource="{Binding AnalyzerResult.Properties}"> + + <Border Visibility="Visible" BorderThickness="1" BorderBrush="Silver" CornerRadius="5" Margin="10" Grid.Row="3"> + <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> + <Label Height="30" Content="RESULT" Background="LightSkyBlue" Grid.Row="0" DockPanel.Dock="Top" /> + + <ScrollViewer VerticalScrollBarVisibility="Auto" Visibility="Visible" Focusable="True" Foreground="Black" Margin="5" + Style="{StaticResource {x:Type ScrollViewer}}"> + <ScrollViewer.Resources> + <sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">15</sys:Double> + </ScrollViewer.Resources> + <ItemsControl ItemsSource="{Binding AnalyzerResults}" Margin="0 0 10 10 "> + <!--<ItemsControl.ItemsPanel> + <ItemsPanelTemplate> + <StackPanel Orientation="Vertical"/> + </ItemsPanelTemplate> + </ItemsControl.ItemsPanel>--> <ItemsControl.ItemTemplate> <DataTemplate> - <StackPanel Orientation="Horizontal" Margin="5"> - <TextBlock Margin="5 0 0 0" FontSize="16"><Run Text="{Binding Name}"></Run> <Run Text=" : "></Run><Run Text="{Binding Value,StringFormat=0}"></Run></TextBlock> - </StackPanel> + <Border HorizontalAlignment="Stretch" Margin="10 10 0 0" VerticalAlignment="Stretch" BorderThickness="1" BorderBrush="Silver"> + <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="1*"/> + <ColumnDefinition Width="300"/> + </Grid.ColumnDefinitions> + <ItemsControl ItemsSource="{Binding Properties}" Grid.Column="0" > + <ItemsControl.ItemTemplate> + <DataTemplate> + <StackPanel Orientation="Horizontal" Margin="5"> + <TextBlock Margin="5 0 0 0" FontSize="12"><Run Text="{Binding Name}"></Run> <Run Text=" : "></Run><Run Text="{Binding Value,StringFormat=0}"></Run></TextBlock> + </StackPanel> + </DataTemplate> + </ItemsControl.ItemTemplate> + </ItemsControl> + <Border Grid.Column="1" HorizontalAlignment="Center" Margin="10 0 0 0" VerticalAlignment="Center"> + <materialDesign:PackIcon Kind="{Binding Result, Converter= {StaticResource EnumToDescriptionConverter}}" Width="60" Height="60" HorizontalContentAlignment="Center" VerticalAlignment="Center" > + <materialDesign:PackIcon.Style> + <Style TargetType="materialDesign:PackIcon"> + <Setter Property="Foreground" Value="Orange"></Setter> + <Style.Triggers> + <Trigger Property="Kind" Value="Check"> + <Setter Property="Foreground" Value="green"></Setter> + </Trigger> + <Trigger Property="Kind" Value="CloseCircle"> + <Setter Property="Foreground" Value="Red"></Setter> + </Trigger> + </Style.Triggers> + </Style> + </materialDesign:PackIcon.Style> + </materialDesign:PackIcon> + </Border> + </Grid> + </Border> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> - <Border Grid.Column="1" HorizontalAlignment="Stretch" Margin="10 0 0 0" VerticalAlignment="Stretch" Visibility="{Binding AnalyzerResult, Converter={StaticResource IsNullToVisibilityConverter}}"> - <materialDesign:PackIcon Kind="{Binding AnalyzerResult.Result, Converter= {StaticResource EnumToDescriptionConverter}}" Width="Auto" Height="Auto" Foreground="Green" HorizontalContentAlignment="Center" /> - </Border> - </Grid> - <!--</Border>--> - </StackPanel> + </ScrollViewer> + + </DockPanel> </Border> - </Grid> + + <Grid Grid.Row="1" Grid.RowSpan="3" + HorizontalAlignment="Stretch" + VerticalAlignment="Stretch" + Visibility="{Binding IsRunning,Converter={StaticResource BooleanToVisibilityConverter}}" + Background="#8BFFFFFF"> + <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center"> + <!--<mahapps:ProgressRing Foreground="#007ACC" Width="80" Height="80"></mahapps:ProgressRing>--> + <TextBlock Text="Loading..." FontStyle="Italic" FontSize="30" VerticalAlignment="Center"></TextBlock> + </StackPanel> + </Grid> </Grid> </Window> diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs index c343e9919..18551cbb3 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs @@ -1,4 +1,6 @@ -using System; +using OxyPlot; +using OxyPlot.Axes; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -22,10 +24,20 @@ namespace Tango.DispenserAnalyzer.UI /// </summary> public partial class MainWindow : Window { + MainWindowVM _vm; + OxyPlot.Wpf.Axis xAxisValues; + OxyPlot.Wpf.Axis yAxisValues; public MainWindow() { InitializeComponent(); - DataContext = new MainWindowVM(); + _vm = new MainWindowVM(); + DataContext = _vm; + CompositionTarget.Rendering += CompositionTargetRendering; + + foreach (var ax in PressurePlot.Axes) + ax.Maximum = ax.Minimum = Double.NaN; + + } private void TextBlock_PreviewDrop(object sender, DragEventArgs e) @@ -52,5 +64,18 @@ namespace Tango.DispenserAnalyzer.UI e.Handled = true; } } + + private void CompositionTargetRendering(object sender, EventArgs e) + { + //_vm.UpdateModel(); + if(_vm.ResetAllAxes) + { + _vm.ResetAllAxes = false; + foreach (var ax in PressurePlot.Axes) + ax.Maximum = ax.Minimum = Double.NaN; + PressurePlot.ResetAllAxes(); + } + PressurePlot.InvalidatePlot(true); + } } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj index 75fcf9956..a5654125d 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj @@ -50,8 +50,21 @@ <Reference Include="MaterialDesignThemes.Wpf"> <HintPath>..\..\packages\MaterialDesignThemes.2.3.1.953\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath> </Reference> + <Reference Include="MathNet.Numerics, Version=4.9.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\..\packages\MathNet.Numerics.4.9.0\lib\net461\MathNet.Numerics.dll</HintPath> + </Reference> + <Reference Include="OxyPlot, Version=2.0.0.0, Culture=neutral, PublicKeyToken=638079a8f0bd61e9, processorArchitecture=MSIL"> + <HintPath>..\..\packages\OxyPlot.Core.2.0.0\lib\net45\OxyPlot.dll</HintPath> + </Reference> + <Reference Include="OxyPlot.Wpf, Version=2.0.0.0, Culture=neutral, PublicKeyToken=75e952ba404cdbb0, processorArchitecture=MSIL"> + <HintPath>..\..\packages\OxyPlot.Wpf.2.0.0\lib\net45\OxyPlot.Wpf.dll</HintPath> + </Reference> + <Reference Include="ReachFramework" /> <Reference Include="System" /> <Reference Include="System.Data" /> + <Reference Include="System.Numerics" /> + <Reference Include="System.Printing" /> + <Reference Include="System.Runtime.Serialization" /> <Reference Include="System.Xml" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Core" /> @@ -77,7 +90,10 @@ <Compile Include="Analysis\AnalysisService.cs" /> <Compile Include="Analysis\IAnalyzerResult.cs" /> <Compile Include="Analysis\IAnalyzer.cs" /> - <Compile Include="Analyzers\SealingAnalyer.cs" /> + <Compile Include="Analyzers\DynamicSealingAnalyzer.cs" /> + <Compile Include="Analyzers\FlowAnalyser.cs" /> + <Compile Include="Analyzers\PrimingAnalyzer.cs" /> + <Compile Include="Analyzers\SealingAnalyzer.cs" /> <Compile Include="Analysis\AnalyzerAttribute.cs" /> <Compile Include="Models\DispenserCsvRow.cs" /> <Compile Include="Models\DispenserSample.cs" /> @@ -114,6 +130,7 @@ <Generator>ResXFileCodeGenerator</Generator> <LastGenOutput>Resources.Designer.cs</LastGenOutput> </EmbeddedResource> + <None Include="packages.config" /> <None Include="Properties\Settings.settings"> <Generator>SettingsSingleFileGenerator</Generator> <LastGenOutput>Settings.Designer.cs</LastGenOutput> diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs index d14587fd8..25e1bfbd0 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs @@ -16,6 +16,9 @@ using System.Windows.Input; using Tango.DispenserAnalyzer.UI.Analysis; using System.Reflection; using Tango.DispenserAnalyzer.UI.Analyzers; +using System.Windows; +using System.Windows.Threading; +using OxyPlot; namespace Tango.DispenserAnalyzer.UI.ViewModels { @@ -29,29 +32,31 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels { if(value != null && _openFilePath != value) { - PressedValuesCollection.Clear(); - AnalyzerResult = null; _openFilePath = value; + ResetSettings(); RaisePropertyChangedAuto(); GenerateCommand.RaiseCanExecuteChanged(); } } } - private string _testName; + private string _testName = ""; public string TestName { - get { return _testName; } + get { return _testName.ToUpper() + " TEST"; } set { _testName = value; RaisePropertyChangedAuto(); } } - - private ObservableCollection<String> _labels; - public ObservableCollection<String> Labels + + private IList<DataPoint> _points; + public IList<DataPoint> Points { - get { return _labels; } - set { _labels = value; RaisePropertyChangedAuto(); } + get { return _points; } + set + { + _points = value; + RaisePropertyChangedAuto(); + } } - private int _step; public int XStep { @@ -59,17 +64,6 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels set { _step = value; RaisePropertyChangedAuto(); } } - private SeriesCollection _pressedValuesCollection; - public SeriesCollection PressedValuesCollection - { - get { return _pressedValuesCollection; } - set - { - _pressedValuesCollection = value; - RaisePropertyChangedAuto(); - } - } - private double _from; public double From { @@ -89,12 +83,22 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels _to = value; RaisePropertyChangedAuto(); } } + public bool ResetAllAxes { get; set; } - private IAnalyzerResult analyzerResult; - public IAnalyzerResult AnalyzerResult + private bool _isRunning; + /// <summary> + /// Gets or sets a value indicating whether this instance is running. + /// </summary> + public bool IsRunning + { + get { return _isRunning; } + set { _isRunning = value; RaisePropertyChangedAuto(); } + } + private ObservableCollection<IAnalyzerResult> _analyzerResults; + public ObservableCollection<IAnalyzerResult> AnalyzerResults { - get { return analyzerResult; } - set { analyzerResult = value; RaisePropertyChangedAuto(); } + get { return _analyzerResults; } + set { _analyzerResults = value; RaisePropertyChangedAuto(); } } public Func<double, string> YFormatter { get; set; } @@ -106,16 +110,19 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels { OpenCSVFileCommand = new RelayCommand(OpenCSVFile); GenerateCommand = new RelayCommand(Generate, CanGenerate); - PressedValuesCollection = new SeriesCollection(); - Labels = new ObservableCollection<string>() {}; YFormatter = value => value.ToString(); _from = 0; _to = 1; XStep = 1; - AnalyzerResult = null; - } + AnalyzerResults = new ObservableCollection<IAnalyzerResult>(); + _isRunning = false; + ResetAllAxes = false; + + this.Points = new List<DataPoint>(); + } + #region Read File private void OpenCSVFile() { OpenFileDialog dlg = new OpenFileDialog(); @@ -128,42 +135,68 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels } catch (Exception ex) { - //_notification.ShowError($"An error occurred while trying to import the benchmark file.\n{ex.FlattenMessage()}"); + MessageBox.Show("An error occurred while trying to import the CSV file. " + ex.Message, + "Warning", + MessageBoxButton.OK, + MessageBoxImage.Warning); } } } + protected virtual bool IsFileLocked(string filePath) + { + FileStream stream = null; + try + { + stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None); + } + catch (IOException ex) + { + MessageBox.Show("Warning: " + ex.Message, "Warning", MessageBoxButton.OK, MessageBoxImage.Warning); + return true; + } + finally + { + if (stream != null) + stream.Close(); + } + return false; + } + #endregion + #region Generate public bool CanGenerate() { return (OpenFilePath!= null && OpenFilePath.Length != 0 && File.Exists(OpenFilePath)); } private async void Generate() { + if (IsFileLocked(OpenFilePath)) + return; + ResetSettings(); + IAnalyzer analyzer = AnalysisService.GetAnalyzer(OpenFilePath); if (analyzer == null) return; + IsRunning = true; AnalyzerAttribute attribute = (AnalyzerAttribute)analyzer.GetType().GetCustomAttributes(typeof(AnalyzerAttribute),true).FirstOrDefault(); - Series pressed_values = new LineSeries() - { - Title = attribute.Name, - Values = new ChartValues<double>(), - PointGeometry = null, - }; + TestName = attribute.Name; - Labels = new ObservableCollection<string>(); List<DispenserCsvRow> data = CsvFile.Read<DispenserCsvRow>(new CsvSource(OpenFilePath)).ToList(); List<DispenserSample> samples = new List<DispenserSample>(); To = 0; From = 0; int index = 0; - List<object> listValues = new List<object>(); - List<string> listLabel = new List<string>(); bool in_test_range = false; foreach (var item in data) { double pressure = 0; + if(item.Label == "Label") + { + item.Pressure = "0"; + item.Command = "Label"; + } if (double.TryParse(item.Pressure, out pressure) || !String.IsNullOrWhiteSpace(item.Command)) { samples.Add(new DispenserSample(){ @@ -176,31 +209,42 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels { in_test_range = !in_test_range; } - if( pressure != 0 )//&& listValues.Count< 10000) + if( pressure != 0 ) { - if (listValues.Count == 0) + if (TestName.Contains( "SEAL") && Points.Count ==0) { - From = pressure - 100;//???? + _from = pressure; } - listLabel.Add(index.ToString()); - listValues.Add(pressure); + else + _from = Math.Min(pressure, _from); _to = Math.Max(pressure, _to); + Points.Add(new DataPoint(index, pressure)); } index++; } } - + data.Clear(); _to += 100; RaisePropertyChanged("To"); + if(_from != 0) + _from -= 100; + RaisePropertyChanged("From"); + XStep = (int)(Points.Count / 5); + + List<IAnalyzerResult> res = await analyzer.Process(samples); + AnalyzerResults = new ObservableCollection<IAnalyzerResult>(res); + + IsRunning = false; + } + #endregion - Labels = listLabel.ToObservableCollection<string>(); - XStep = (int)(Labels.Count / 5); - - pressed_values.Values.AddRange(listValues.AsEnumerable()); - PressedValuesCollection.Clear(); - PressedValuesCollection.Add(pressed_values); - - AnalyzerResult = await analyzer.Process(samples); + private void ResetSettings() + { + Points.Clear(); + ResetAllAxes = true; + AnalyzerResults.Clear(); + TestName = ""; } + } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/packages.config b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/packages.config new file mode 100644 index 000000000..910d0953f --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/packages.config @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="MathNet.Numerics" version="4.9.0" targetFramework="net461" /> + <package id="OxyPlot.Core" version="2.0.0" targetFramework="net461" /> + <package id="OxyPlot.Wpf" version="2.0.0" targetFramework="net461" /> +</packages>
\ No newline at end of file |
