diff --git a/VECTO/VECTO.vbproj b/VECTO/VECTO.vbproj index 68e1b733ebc54ddd7f9b349b7f68636296ea0150..e74ac08459d6ee19fb644b1fb510b99da33fcc4e 100644 --- a/VECTO/VECTO.vbproj +++ b/VECTO/VECTO.vbproj @@ -97,9 +97,8 @@ <Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms.DataVisualization" /> <Reference Include="System.Xml" /> - <Reference Include="vectolic, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>bin\Debug\vectolic.dll</HintPath> + <Reference Include="vectolic"> + <HintPath>.\vectolic.dll</HintPath> </Reference> </ItemGroup> <ItemGroup> @@ -432,6 +431,9 @@ <ItemGroup> <None Include="Resources\F_VECTO.png" /> </ItemGroup> + <ItemGroup> + <WCFMetadata Include="Service References\" /> + </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. diff --git a/VectoCoreTest/Integration/DriverStrategy/DriverStrategyTestCoach.cs b/VectoCoreTest/Integration/DriverStrategy/DriverStrategyTestCoach.cs index 5b36881d0687e30764fed1467e1f13a5a356d993..accc9d10f91885d66a8218d6f3a689c27393ba3c 100644 --- a/VectoCoreTest/Integration/DriverStrategy/DriverStrategyTestCoach.cs +++ b/VectoCoreTest/Integration/DriverStrategy/DriverStrategyTestCoach.cs @@ -24,6 +24,17 @@ namespace TUGraz.VectoCore.Tests.Integration.DriverStrategy GraphWriter.Write(imgV3, imgv22); } + + [TestMethod] + public void TestSingleGraph() + { + var imgV3 = @"..\..\..\VectoCoreTest\bin\Debug\Coach_DriverStrategy_Drive_50_slope_dec-inc.vmod"; + + GraphWriter.Write(imgV3); + } + + + #region Accelerate [TestMethod] diff --git a/VectoCoreTest/Utils/GraphWriter.cs b/VectoCoreTest/Utils/GraphWriter.cs index 807f8c47ac961c8a35bd425651a26f68bcfd9d83..4522ac47f39fdbeda5073b5ca75cb3d6b1ac79cb 100644 --- a/VectoCoreTest/Utils/GraphWriter.cs +++ b/VectoCoreTest/Utils/GraphWriter.cs @@ -22,9 +22,13 @@ namespace TUGraz.VectoCore.Tests.Utils { private static bool _enabled = true; - private static Size diagramSize = new Size(2000, 440); + private static Size _diagramSize = new Size(2000, 440); - public static void Enabled() + private static readonly Font AxisLabelFont = new Font("Consolas", 10); + private static readonly Font AxisTitleFont = new Font("Verdana", 12); + private static readonly Font LegendFont = new Font("Verdana", 14); + + public static void Enabled() { _enabled = true; } @@ -34,7 +38,7 @@ namespace TUGraz.VectoCore.Tests.Utils _enabled = false; } - public static void Write(string fileNameV3, string fileNameV22) + public static void Write(string fileNameV3, string fileNameV22 = null) { if (!_enabled) { return; @@ -44,26 +48,27 @@ namespace TUGraz.VectoCore.Tests.Utils if (!File.Exists(fileNameV22)) { LogManager.GetCurrentClassLogger().Error("Modfile V2.2 not found: " + fileNameV22); //Write(fileNameV3); - return; + //return; } - var modDataV22 = VectoCSVFile.Read(fileNameV22); + DataTable modDataV22 = null; + if (fileNameV22 != null) { + modDataV22 = VectoCSVFile.Read(fileNameV22); + } + var xfields = new[] { ModalResultField.time, ModalResultField.dist }; - var xfields = new[] { ModalResultField.time, ModalResultField.dist }; + var yfields = new[] { ModalResultField.v_act, ModalResultField.acc, ModalResultField.n, ModalResultField.Gear, ModalResultField.Pe_eng, ModalResultField.Tq_eng, ModalResultField.FCMap }; - var yfields = new[] { - ModalResultField.v_act, ModalResultField.acc, ModalResultField.n, ModalResultField.Gear, ModalResultField.Pe_eng, - ModalResultField.Tq_eng, ModalResultField.FCMap - }; - - var titleHeight = (50 * 100.0f) / (diagramSize.Height * yfields.Count()); + var titleHeight = (50 * 100.0f) / (_diagramSize.Height * yfields.Count()); foreach (var xfield in xfields) { var fileName = string.Format("{0}_{1}.png", Path.GetFileNameWithoutExtension(fileNameV3), xfield.GetName()); - var x = modDataV3.Rows.Cast<DataRow>().Select(v => v.Field<string>(xfield.GetName()).ToDouble()).ToArray(); - var x2 = modDataV22.Rows.Cast<DataRow>().Select(v => v.Field<string>(xfield.GetName()).ToDouble()).ToArray(); - - var plotSize = new Size(diagramSize.Width, diagramSize.Height * yfields.Count()); + var x = LoadData(modDataV3, xfield.GetName()); + var x2 = new double[]{ double.NegativeInfinity}; + if (fileNameV22 != null && modDataV22 != null) { + x2 = LoadData(modDataV22, xfield.GetName()); + } + var plotSize = new Size(_diagramSize.Width, _diagramSize.Height * yfields.Count()); var maxX = (int)(Math.Ceiling(Math.Max(x.Max(), x2.Max()) * 1.01 / 10.0) * 10.0); var minX = (int)(Math.Floor(Math.Max(x.Min(), x2.Min()) / 10.0) * 10.0); var chart = new Chart { Size = plotSize }; @@ -71,143 +76,141 @@ namespace TUGraz.VectoCore.Tests.Utils for (var i = 0; i < yfields.Length; i++) { var yfield = yfields[i]; - var y = - modDataV3.Rows.Cast<DataRow>() - .Select( - v => v.Field<string>(yfield.GetName()).Length == 0 ? Double.NaN : v.Field<string>(yfield.GetName()).ToDouble()) - .ToArray(); - var y2 = - modDataV22.Rows.Cast<DataRow>() - .Select( - v => - v.Field<string>(yfield.GetName()).Length == 0 ? Double.NaN : v.Field<string>(yfield.GetName()).ToDouble()) - .ToArray(); - - - var chartArea = new ChartArea { Name = yfield.ToString() }; - chartArea.AxisX.MajorGrid.LineColor = Color.DarkGray; - chartArea.AxisY.MajorGrid.LineColor = Color.DarkGray; - chartArea.AxisX.LabelStyle.Font = new Font("Consolas", 10); - chartArea.AxisY.LabelStyle.Font = new Font("Consolas", 10); - - chartArea.AxisX.Interval = maxX / 20.0; - chartArea.AxisX.Maximum = maxX; - chartArea.AxisX.Minimum = minX; - chartArea.AxisX.MinorGrid.Enabled = true; - chartArea.AxisX.MinorGrid.Interval = maxX / 100.0; - chartArea.AxisX.MinorGrid.LineColor = Color.LightGray; - chartArea.AxisX.Title = xfield.GetCaption(); - chartArea.AxisX.TitleFont = new Font("Verdana", 12); - chartArea.AxisX.RoundAxisValues(); - chartArea.AxisX.MajorTickMark.Size = 2 * 100.0f / diagramSize.Height; - - chartArea.AxisY.Title = yfield.GetCaption(); - chartArea.AxisY.TitleFont = new Font("Verdana", 12); - chartArea.AxisY.RoundAxisValues(); - if (yfield == ModalResultField.Gear) { - chartArea.AxisY.MajorGrid.Interval = 1; - chartArea.AxisY.MinorGrid.Enabled = false; - } else { - chartArea.AxisY.MinorGrid.Enabled = true; - } - chartArea.AxisY.MinorGrid.LineColor = Color.LightGray; - chartArea.AxisY.MajorTickMark.Size = 5 * 100.0f / diagramSize.Width; - - chart.ChartAreas.Add(chartArea); - - var legend = new Legend(yfield.ToString()) { - Docking = Docking.Right, - IsDockedInsideChartArea = false, - DockedToChartArea = yfield.ToString(), - Font = new Font("Verdana", 14), - }; - chart.Legends.Add(legend); - - if (yfield == ModalResultField.v_act) { - var y3 = modDataV3.Rows.Cast<DataRow>() - .Select( - v => - v.Field<string>(ModalResultField.v_targ.GetName()).Length == 0 - ? Double.NaN - : v.Field<string>(ModalResultField.v_targ.GetName()).ToDouble()) - .ToArray(); - - var series3 = new Series { - Name = "v_target", - ChartType = SeriesChartType.FastLine, - Color = Color.Green, - BorderWidth = 3, - Legend = legend.Name, - IsVisibleInLegend = true - }; - chart.Series.Add(series3); - chart.Series[series3.Name].Points.DataBindXY(x, y3); - series3.ChartArea = chartArea.Name; - } + var y = LoadData(modDataV3, yfield.GetName()); + - var series1 = new Series { - Name = String.Format("Vecto 3 - {0}", yfield), - ChartType = SeriesChartType.Line, - Color = Color.Blue, - BorderWidth = 2, - Legend = legend.Name, - IsVisibleInLegend = true, - //MarkerColor = Color.Blue, - //MarkerSize = 4, - //MarkerStyle = MarkerStyle.Circle, - //MarkerBorderColor = Color.White, - //MarkerBorderWidth = 1, - }; - series1.ChartArea = chartArea.Name; - - chart.Series.Add(series1); - chart.Series[series1.Name].Points.DataBindXY(x, y); - - var series2 = new Series { - Name = String.Format("Vecto 2.2 - {0}", yfield), - ChartType = SeriesChartType.Line, - Color = Color.Red, - BorderWidth = 2, - Legend = legend.Name, - IsVisibleInLegend = true, - //MarkerColor = Color.Red, - //MarkerSize = 4, - //MarkerStyle = MarkerStyle.Circle, - //MarkerBorderColor = Color.White, - //MarkerBorderWidth = 1, - }; - series2.ChartArea = chartArea.Name; - - chart.Series.Add(series2); - chart.Series[series2.Name].Points.DataBindXY(x2, y2); - - - chartArea.Position.Auto = false; - chartArea.Position.Width = 85; - chartArea.Position.Height = (100.0f - titleHeight) / yfields.Count(); - chartArea.Position.X = 0; - chartArea.Position.Y = (i * (100.0f - titleHeight)) / yfields.Count() + titleHeight; - - if (i > 0) { - chart.ChartAreas[yfield.ToString()].AlignWithChartArea = yfields[0].ToString(); - chart.ChartAreas[yfield.ToString()].AlignmentOrientation = AreaAlignmentOrientations.Vertical; - chart.ChartAreas[yfield.ToString()].AlignmentStyle = AreaAlignmentStyles.All; + var chartArea = AddChartArea(chart, yfield.ToString(), xfield.GetCaption(), maxX, minX, yfield.GetCaption(), yfield == ModalResultField.Gear); + + var legend = CreateLegend(chart, yfield.ToString()); + + if (yfield == ModalResultField.v_act) { + var y3 = LoadData(modDataV3, ModalResultField.v_targ.GetName()); + var series3 = CreateSeries("v_target", legend, chartArea, chart, Color.Green, x, y3); } + + var series1 = CreateSeries( string.Format("Vecto 3 - {0}", yfield), legend, chartArea, chart,Color.Blue, x, y); + + if (fileNameV22 != null) { + var y2 = LoadData(modDataV22, yfield.GetName()); + var series2 = CreateSeries(string.Format("Vecto 2.2 - {0}", yfield), legend, chartArea, chart, Color.Red, x2, + y2); + } + + PositionChartArea(chartArea, titleHeight, i, yfields.Count()); + + if (i > 0) { + AlignChart(chart, yfield.ToString(), yfields[0].ToString()); + } } - var title = new Title(); - title.Text = Path.GetFileNameWithoutExtension(fileName); - title.DockedToChartArea = yfields[0].ToString(); - title.IsDockedInsideChartArea = false; - title.Font = new Font("Verdana", 18, FontStyle.Bold); - chart.Titles.Add(title); + AddTitle(chart, Path.GetFileNameWithoutExtension(fileName), yfields[0].ToString()); - chart.Invalidate(); + chart.Invalidate(); chart.SaveImage(fileName, ChartImageFormat.Png); } } - //public static void Write(string fileName) + private static void AddTitle(Chart chart, string titleText, string dockToChartArea) + { + var title = new Title(); + title.Text = titleText; + title.DockedToChartArea = dockToChartArea; + title.IsDockedInsideChartArea = false; + title.Font = new Font("Verdana", 18, FontStyle.Bold); + chart.Titles.Add(title); + } + + private static double[] LoadData(DataTable modDataV3, string field) + { + return modDataV3.Rows.Cast<DataRow>() + .Select(v => v.Field<string>(field).Length == 0 + ? Double.NaN + : v.Field<string>(field).ToDouble()) + .ToArray(); + } + + private static void AlignChart(Chart chart, string chartToAlign, string chartToAlignWith) + { + chart.ChartAreas[chartToAlign].AlignWithChartArea = chartToAlignWith; + chart.ChartAreas[chartToAlign].AlignmentOrientation = AreaAlignmentOrientations.Vertical; + chart.ChartAreas[chartToAlign].AlignmentStyle = AreaAlignmentStyles.All; + } + + private static void PositionChartArea(ChartArea chartArea, float titleHeight, int i, int numCharts) + { + chartArea.Position.Auto = false; + chartArea.Position.Width = 85; + chartArea.Position.Height = (100.0f - titleHeight) / numCharts; + chartArea.Position.X = 0; + chartArea.Position.Y = (i * (100.0f - titleHeight)) / numCharts + titleHeight; + } + + private static ChartArea AddChartArea(Chart chart, string name, string axisXTitle, int xMax, int xMin, string axisYTitle, bool discreteValues) + { + var chartArea = new ChartArea { Name = name }; + chartArea.AxisX.MajorGrid.LineColor = Color.DarkGray; + chartArea.AxisY.MajorGrid.LineColor = Color.DarkGray; + chartArea.AxisX.LabelStyle.Font = AxisLabelFont; + chartArea.AxisY.LabelStyle.Font = AxisLabelFont; + + chartArea.AxisX.Interval = xMax / 20.0; + chartArea.AxisX.Maximum = xMax; + chartArea.AxisX.Minimum = xMin; + chartArea.AxisX.MinorGrid.Enabled = true; + chartArea.AxisX.MinorGrid.Interval = xMax / 100.0; + chartArea.AxisX.MinorGrid.LineColor = Color.LightGray; + chartArea.AxisX.Title = axisXTitle; + chartArea.AxisX.TitleFont = AxisTitleFont; + chartArea.AxisX.RoundAxisValues(); + chartArea.AxisX.MajorTickMark.Size = 2 * 100.0f / _diagramSize.Height; + + chartArea.AxisY.Title = axisYTitle; + chartArea.AxisY.TitleFont = AxisTitleFont; + chartArea.AxisY.RoundAxisValues(); + if (discreteValues) { + chartArea.AxisY.MajorGrid.Interval = 1; + chartArea.AxisY.MinorGrid.Enabled = false; + } else { + chartArea.AxisY.MinorGrid.Enabled = true; + } + chartArea.AxisY.MinorGrid.LineColor = Color.LightGray; + chartArea.AxisY.MajorTickMark.Size = 5 * 100.0f / _diagramSize.Width; + + chart.ChartAreas.Add(chartArea); + return chartArea; + } + + private static Legend CreateLegend(Chart chart, string dockToChartArea) + { + var legend = new Legend(dockToChartArea.ToString()) { + Docking = Docking.Right, + IsDockedInsideChartArea = false, + DockedToChartArea = dockToChartArea, + Font = LegendFont, + }; + chart.Legends.Add(legend); + return legend; + } + + private static Series CreateSeries(String name, Legend legend, ChartArea chartArea, Chart chart, Color color, double[] x, double[] y) + { + ModalResultField yfield; + var series1 = new Series { + Name = name, + ChartType = SeriesChartType.Line, + Color = color, + BorderWidth = 2, + Legend = legend.Name, + IsVisibleInLegend = true, + ChartArea = chartArea.Name, + }; + + chart.Series.Add(series1); + chart.Series[series1.Name].Points.DataBindXY(x, y); + return series1; + } + + //public static void Write(string fileName) //{ // if (!_enabled) { // return;