/// <summary> /// Index function differentiates between showing results for just on process |processids| == 1, /// and showing multiple processes at a time (always without regard to the actual occurrence time of the process) /// </summary> /// <param name="processids">list of processes to show</param> /// <param name="precision">level of precision (compared to normalized View - [0,1]!)</param> /// <param name="links">number of links('Glieder') we want our Envelope to have</param> /// <param name="options">view options (which graphs should we draw?)</param> /// <param name="par">dont know, never used this</param> /// <returns></returns> public ActionResult Index(int[] processids, decimal precision = 1m, int links = 5, string options = null, ChartParams par = null) { DataContainers.Clear(); DataContainers.EnvelopeLinks = links; DataContainers.EnvelopePrecision = precision; // Parameter if (par == null) { par = new ChartParams(new List <ChartBlockParams>() { }); } //view options var viewOptions = new List <SwhkViewOptions>(); if (options != null) { string[] zw = options.Split('@'); for (int i = 0; i < zw.Length; i++) { viewOptions.Add((SwhkViewOptions)Enum.Parse(typeof(SwhkViewOptions), zw[i])); } } if (viewOptions.Count == 0) { viewOptions.Add(SwhkViewOptions.Original); } if (processids == null && TempData["processids"] != null) { processids = (int[])TempData["processids"]; } #if DEBUG if (processids.Length > 5) { processids = processids.Take(5).ToArray(); } #endif //Chart-Config ChartConfig chartConfig = new ChartConfig() { Name = "Test" }; ChartArea area = new ChartArea() { Name = "Sollwerthüllkurve", ChartType = (int)ChartType.Polyline, Seq = 1 }; chartConfig.Areas.Add(area); ChartBlockParams cbpar = new ChartBlockParams(); cbpar.Start = DateTime.Now - new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second); TimeSpan maxTime = new TimeSpan(0L); Random rand = new Random(); foreach (int processid in processids) { PredictiveProcessData process = GetProcessData(processid); process.ViewOptions.AddRange(viewOptions); if (process == null) { throw new ArgumentException("process-id not found!"); } if ((viewOptions.Contains(SwhkViewOptions.Original))) { area.Functions.Add(new PredictiveChartFunction() { ChartFunctionId = processid, PrecictiveProcessData = process, Name = process.Name, Seq = 1, ChartDataSourceId = 1, FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") }); } //if just one process id -> show some specifig graphs if (processids.Length == 1) { //'Sollhüllwertkurve' if (viewOptions.Contains(SwhkViewOptions.Envelope)) { area.Functions.Add(new PredictiveChartFunction() { ChartFunctionId = processid, PrecictiveProcessData = process, Name = process.Name + "-envelope", Seq = 2, FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") }); } //nomalized graph if (viewOptions.Contains(SwhkViewOptions.Normalized)) { area.Functions.Add(new PredictiveChartFunction() { ChartFunctionId = processid, PrecictiveProcessData = process, Name = process.Name + "-normalized", Seq = 3, FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") }); } //lower bound if (viewOptions.Contains(SwhkViewOptions.LowerBound)) { area.Functions.Add(new PredictiveChartFunction() { ChartFunctionId = processid, PrecictiveProcessData = process, Name = process.Name + "-lower", Seq = 4, FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") }); } //upper bound if (viewOptions.Contains(SwhkViewOptions.UpperBound)) { area.Functions.Add(new PredictiveChartFunction() { ChartFunctionId = processid, PrecictiveProcessData = process, Name = process.Name + "-upper", Seq = 5, FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") }); } } if (maxTime < process.UtcTo - process.UtcFrom) { maxTime = (TimeSpan)(process.UtcTo - process.UtcFrom); } } //if mor than one id -> add avg graph and stuff if (processids.Length > 1) { if (viewOptions.Contains(SwhkViewOptions.AverageGraph)) { area.Functions.Add(new PredictiveChartFunction() { ChartFunctionId = -1, PrecictiveProcessData = DataContainers, Name = "Average Graph Normalized", Seq = 6, ChartDataSourceId = 1, FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") }); } //Sollhüllwert based on AVG Graph if (viewOptions.Contains(SwhkViewOptions.AvgEnvelope)) { area.Functions.Add(new PredictiveChartFunction() { ChartFunctionId = -2, PrecictiveProcessData = DataContainers, Name = "Average Swhk", Seq = 7, ChartDataSourceId = 1, FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") }); } //lower bound of avg if (viewOptions.Contains(SwhkViewOptions.LowerAverage)) { area.Functions.Add(new PredictiveChartFunction() { ChartFunctionId = -3, PrecictiveProcessData = DataContainers, Name = "Average Graph Lower", Seq = 8, ChartDataSourceId = 1, FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") }); } //upper bound of avg if (viewOptions.Contains(SwhkViewOptions.UpperAverage)) { area.Functions.Add(new PredictiveChartFunction() { ChartFunctionId = -4, PrecictiveProcessData = DataContainers, Name = "Average Graph Upper", Seq = 9, ChartDataSourceId = 1, FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") }); } } cbpar.Stop = cbpar.Start + maxTime; par.Blocks.Add(cbpar); //ViewModel var viewModel = new ChartViewModel(); viewModel.Load(chartConfig); viewModel.Timelines.AddRange(par.Blocks.Select(b => b.ToTimelineViewModel())); viewModel.PredictiveFunctions.AddRange(DataContainers); if (viewModel.Timelines.Count != 0) { SaveDisplayInterval(viewModel.Timelines[0].Start, viewModel.Timelines[0].Stop); } return(View(viewModel)); }