Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 19d0f8f5 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

new features for plotting graphs

parents b59dca9b 76595d9b
Branches
Tags
No related merge requests found
......@@ -11,9 +11,34 @@ namespace GraphDrawer
{
internal class Program
{
private const string HELP = @"
Tool for plotting graphs comparing Vecto 2.2 and Vecto 3
--split <leng> ... split input into parts of length <len> (in m), only distance output
";
private static void Main(string[] args)
{
if (args.Contains("--split")) {
Console.WriteLine("plotting graphs splitted by distance");
var idx = Array.FindIndex(args, x => x == "--split");
var lenght = int.Parse(args[idx + 1]);
var success = true;
var start = 0;
do {
Console.WriteLine("plotting {0} - {1}", start / 1000, (start + lenght) / 1000);
success = GraphWriter.WriteDistanceSlice(args[0], args[1], start, start + lenght);
start += lenght;
} while (success);
Console.WriteLine("plotting full cycle");
GraphWriter.Write(args[0], args[1]);
Console.WriteLine("done");
return;
}
Console.WriteLine("plotting graphs...");
GraphWriter.Write(args[0], args[1]);
Console.WriteLine("done");
}
}
}
\ No newline at end of file
......@@ -50,6 +50,8 @@ Examples:
vecto.exe -h
";
private static JobContainer jobContainer;
private static int Main(string[] args)
{
try {
......@@ -111,13 +113,14 @@ Examples:
var sumFileName = Path.Combine(Path.GetDirectoryName(fileList.First()) ?? "",
Path.GetFileNameWithoutExtension(fileList.First()) + Constants.FileExtensions.SumFile);
var sumWriter = new SummaryFileWriter(sumFileName);
var jobContainer = new JobContainer(sumWriter);
jobContainer = new JobContainer(sumWriter);
var mode = SimulatorFactory.FactoryMode.DeclarationMode;
if (args.Contains("-eng")) {
mode = SimulatorFactory.FactoryMode.EngineeringMode;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Switching to Engineering Mode. Make sure the job-file is saved in engineering mode!");
Console.WriteLine(
"Switching to Engineering Mode. Make sure the job-file is saved in engineering mode!");
Console.ResetColor();
}
......@@ -148,9 +151,12 @@ Examples:
var isCtrlC = e.SpecialKey == ConsoleSpecialKey.ControlC;
var isCtrlBreak = e.SpecialKey == ConsoleSpecialKey.ControlBreak;
if (isCtrlC) {
Console.WriteLine("Canceling simulation!");
if (!isCtrlC) {
return;
}
//Console.WriteLine("Canceling simulation!");
e.Cancel = true;
Program.jobContainer.CancelCurrent();
};
//var x = Console.CursorLeft;
......@@ -183,7 +189,8 @@ Examples:
Console.WriteLine("VectoCore: {0}", vectodll.Version);
}
private static void PrintProgress(Dictionary<string, JobContainer.ProgressEntry> progessData, bool showTiming = true)
private static void PrintProgress(Dictionary<string, JobContainer.ProgressEntry> progessData,
bool showTiming = true)
{
Console.SetCursorPosition(0, Console.CursorTop - NumLines);
NumLines = 0;
......
......@@ -94,6 +94,15 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
}
}
public void CancelCurrent()
{
foreach (var job in Runs) {
if (job.Worker != null && job.Worker.IsBusy && job.Worker.WorkerSupportsCancellation) {
job.Worker.CancelAsync();
}
}
}
private static AutoResetEvent resetEvent = new AutoResetEvent(false);
public void WaitFinished()
......
......@@ -56,12 +56,16 @@ namespace TUGraz.VectoCore.Tests.Utils
}
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());
foreach (var xfield in xfields) {
var fileName = string.Format("{0}_{1}.png", Path.GetFileNameWithoutExtension(fileNameV3), xfield.GetName());
var fileName = string.Format("{0}_{1}.png", Path.GetFileNameWithoutExtension(fileNameV3),
xfield.GetName());
var x = LoadData(modDataV3, xfield.GetName());
var x2 = new double[] { double.NegativeInfinity };
......@@ -79,20 +83,42 @@ namespace TUGraz.VectoCore.Tests.Utils
var y = LoadData(modDataV3, yfield.GetName());
var chartArea = AddChartArea(chart, yfield.ToString(), xfield.GetCaption(), maxX, minX, yfield.GetCaption(), yfield == ModalResultField.Gear);
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 grad = LoadData(modDataV3, ModalResultField.grad.GetName());
chartArea.AxisY2.Enabled = AxisEnabled.True;
chartArea.AxisY2.Title = "gradient [%]";
chartArea.AxisY2.TitleFont = AxisTitleFont;
chartArea.AxisY2.LabelStyle.Font = AxisLabelFont;
chartArea.AxisY2.LabelAutoFitStyle = LabelAutoFitStyles.None;
chartArea.AxisY2.MinorGrid.Enabled = false;
chartArea.AxisY2.MajorGrid.Enabled = false;
var max = Math.Max(-Math.Round(grad.Min() * 2), Math.Round(grad.Max() * 2));
//chartArea.AxisY2.si
//chartArea.AxisY2.Minimum = -max;
//chartArea.AxisY2.Maximum = max;
chartArea.AxisY2.RoundAxisValues();
chartArea.AxisY2.Interval = Math.Round(max / 5);
var seriesGrad = CreateSeries("Gradient", legend, chartArea, chart, Color.Coral, x, grad);
seriesGrad.YAxisType = AxisType.Secondary;
}
var series1 = CreateSeries( string.Format("Vecto 3 - {0}", yfield), legend, chartArea, chart,Color.Blue, x, y);
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,
var series2 = CreateSeries(string.Format("Vecto 2.2 - {0}", yfield), legend, chartArea, chart,
Color.Red, x2,
y2);
}
......@@ -110,6 +136,132 @@ namespace TUGraz.VectoCore.Tests.Utils
}
}
public static bool WriteDistanceSlice(string fileNameV3, string fileNameV22, double start, double end)
{
if (!_enabled) {
return true;
}
var modDataV3Iput = VectoCSVFile.Read(fileNameV3);
//var modDataV3View = new DataView(modDataV3Iput) {
// RowFilter = string.Format(@"dist > {0} AND dist < {1}", start, end)
//};
//var modDataV3 = modDataV3View.ToTable();
var modDataV3tmp = modDataV3Iput.AsEnumerable().Where(row => {
var s = row.ParseDouble("dist");
return s >= start && s <= end;
});
if (!File.Exists(fileNameV22)) {
//LogManager.GetCurrentClassLogger().Error("Modfile V2.2 not found: " + fileNameV22);
//Write(fileNameV3);
//return;
}
DataTable modDataV22 = null;
if (fileNameV22 != null) {
var modDataV22Input = VectoCSVFile.Read(fileNameV22);
//var modDataV22View = new DataView(modDataV22Input) {
// RowFilter = string.Format(@"dist > {0} AND dist < {1}", start, end)
//};
var modDataV22tmp = modDataV22Input.AsEnumerable().Where(row => {
var s = row.ParseDouble("dist");
return s >= start && s <= end;
});
if (!(modDataV3tmp.Any() || modDataV22tmp.Any())) {
return false;
}
modDataV22 = modDataV22tmp.CopyToDataTable();
} else {
if (!modDataV3tmp.Any()) {
return false;
}
}
var modDataV3 = modDataV3tmp.CopyToDataTable();
//var xfields = new[] { ModalResultField.dist };
var xfield = ModalResultField.dist;
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());
//foreach (var xfield in xfields) {
var fileName = string.Format("{0}_{1}-{2:D3}_{3:D3}.png", Path.GetFileNameWithoutExtension(fileNameV3),
xfield.GetName(), (int)(start / 1000), (int)(end / 1000));
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 };
for (var i = 0; i < yfields.Length; i++) {
var yfield = yfields[i];
var y = LoadData(modDataV3, yfield.GetName());
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 grad = LoadData(modDataV3, ModalResultField.grad.GetName());
chartArea.AxisY2.Enabled = AxisEnabled.True;
chartArea.AxisY2.Title = "gradient [%]";
chartArea.AxisY2.TitleFont = AxisTitleFont;
chartArea.AxisY2.LabelStyle.Font = AxisLabelFont;
chartArea.AxisY2.LabelAutoFitStyle = LabelAutoFitStyles.None;
chartArea.AxisY2.MinorGrid.Enabled = false;
chartArea.AxisY2.MajorGrid.Enabled = false;
var max = Math.Max(-Math.Round(grad.Min() * 2), Math.Round(grad.Max() * 2));
//chartArea.AxisY2.si
chartArea.AxisY2.Minimum = -max;
chartArea.AxisY2.Maximum = max;
chartArea.AxisY2.RoundAxisValues();
var seriesGrad = CreateSeries("Gradient", legend, chartArea, chart, Color.Coral, x, grad);
seriesGrad.YAxisType = AxisType.Secondary;
}
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());
}
//}
AddTitle(chart, Path.GetFileNameWithoutExtension(fileName), yfields[0].ToString());
chart.Invalidate();
chart.SaveImage(fileName, ChartImageFormat.Png);
}
return true;
}
private static void AddTitle(Chart chart, string titleText, string dockToChartArea)
{
var title = new Title();
......@@ -129,6 +281,7 @@ namespace TUGraz.VectoCore.Tests.Utils
.ToArray();
}
private static void AlignChart(Chart chart, string chartToAlign, string chartToAlignWith)
{
chart.ChartAreas[chartToAlign].AlignWithChartArea = chartToAlignWith;
......@@ -145,7 +298,8 @@ namespace TUGraz.VectoCore.Tests.Utils
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)
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;
......@@ -157,7 +311,7 @@ namespace TUGraz.VectoCore.Tests.Utils
chartArea.AxisX.Maximum = xMax;
chartArea.AxisX.Minimum = xMin;
chartArea.AxisX.MinorGrid.Enabled = true;
chartArea.AxisX.MinorGrid.Interval = xMax / 100.0;
chartArea.AxisX.MinorGrid.Interval = (xMax - xMin) / 100.0;
chartArea.AxisX.MinorGrid.LineColor = Color.LightGray;
chartArea.AxisX.Title = axisXTitle;
chartArea.AxisX.TitleFont = AxisTitleFont;
......@@ -192,7 +346,8 @@ namespace TUGraz.VectoCore.Tests.Utils
return legend;
}
private static Series CreateSeries(String name, Legend legend, ChartArea chartArea, Chart chart, Color color, double[] x, double[] y)
private static Series CreateSeries(String name, Legend legend, ChartArea chartArea, Chart chart, Color color,
double[] x, double[] y)
{
ModalResultField yfield;
var series1 = new Series {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment