Пример #1
0
        /// <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));
        }