Exemple #1
0
        public TimeDiagram CreateDiagram <T>(IGraphicsFactory <T, IGraph> factory, out InteractiveDiagram interactiveDiagram) where T : InteractiveDiagram
        {
            List <string> labels = new List <string>(Parameters.ChannelCount + Parameters.QueueCapacity + 3);

            labels.Add("Заявки");

            for (int i = 0; i < Parameters.ChannelCount; i++)
            {
                labels.Add($"Канал { Parameters.ChannelCount - i }");
            }

            for (int i = 0; i < Parameters.QueueCapacity; i++)
            {
                labels.Add($"Место { Parameters.QueueCapacity - i }");
            }

            labels.Add("Обслужено");
            labels.Add("Отказ");

            T idg = factory.CreateEmptyDiagram(labels);

            TimeDiagram diagram = new TimeDiagram(Parameters.ChannelCount, Parameters.QueueCapacity, idg);

            FillDiagram(diagram);

            interactiveDiagram = idg;

            return(diagram);
        }
Exemple #2
0
        /// <summary>
        /// Создает новый экземпляр временной диаграммы с графическими данными.
        /// </summary>
        /// <param name="channelCount">Количество каналов обслуживания.</param>
        /// <param name="queueCapacity">Количество мест в очереди.</param>
        /// <param name="interactiveDiagram">Экземпляр <see cref="InteractiveDiagram"/> для создания графических данных.</param>
        public TimeDiagram(int channelCount, int queueCapacity, InteractiveDiagram interactiveDiagram) : this(channelCount, queueCapacity)
        {
            if (interactiveDiagram == null)
            {
                throw new NullReferenceException("InteractiveDiagram is null");
            }

            this.interactiveDiagram = interactiveDiagram;
        }
Exemple #3
0
        public void MakeGraphImprovement()
        {
            ParametersContainer    parameters;
            QueuePlaceGradientData gradient;

            if (!CheckParametersValid(parameters = CallbackUi.GetDiagramParameters()) ||
                !CheckParametersValid(gradient = CallbackUi.GetQueuePlaceGradientData()))
            {
                return;
            }

            var metrics = GetMetrics(parameters.ChannelCount, gradient.MaxQueueCapacity).ToArray();

            GraphImprovementParamsData improvementData = CallbackUi.GetGraphImprovementParams(metrics.Select(metric => metric.Name).ToArray());

            if (!CheckParametersValid(improvementData, metrics.Length))
            {
                return;
            }

            Metric usedMetric = metrics[improvementData.MetricIndex];

            InteractiveDiagram intDiag = GraphicsFactory.CreateInteractiveGraph(usedMetric.Name);

            double[] heightsSum = null;

            CallbackUi.LockInterface();

            for (int i = 0; i < improvementData.ExperimentCount; i++)
            {
                List <TimeDiagram> diagrams = new List <TimeDiagram>(gradient.MaxQueueCapacity - gradient.MinQueueCapacity + 1);

                for (parameters.QueueCapacity = gradient.MinQueueCapacity; parameters.QueueCapacity <= gradient.MaxQueueCapacity; parameters.QueueCapacity++)
                {
                    CallbackUi.ShowText($"Эксперимент { i + 1} из {improvementData.ExperimentCount}.\nМоделирование процесса: {parameters.QueueCapacity - gradient.MinQueueCapacity + 1} из {gradient.MaxQueueCapacity - gradient.MinQueueCapacity + 1}...");

                    ProcessModeller modeller = new ProcessModeller(parameters);
                    try
                    {
                        diagrams.Add(modeller.CreateDiagram());
                    }
                    catch
                    {
                        CallbackUi.HideText();
                        CallbackUi.UnlockInterface();
                        CallbackUi.ShowError("Улучшение графика", "При моделировании процесса возникло исключение." /* + ex.Message*/);
                    }
                }

                var heights = ReportTool.GetHeights(diagrams, usedMetric);

                if (heightsSum == null)
                {
                    heightsSum = heights.ToArray();
                }
                else
                {
                    heightsSum = heightsSum.Zip(heights, (a, b) => a + b).ToArray();
                }

                intDiag.BeginInteractiveLine(i);
                intDiag.AddPoints(heights, gradient.MinQueueCapacity);
                intDiag.AddLineMetadata($"Эксперимент { i + 1 }");
                intDiag.CompleteLine();
            }

            CallbackUi.HideText();
            CallbackUi.UnlockInterface();

            intDiag.BeginLine(1);
            intDiag.AddPoints(heightsSum.Select(height => height / improvementData.ExperimentCount), gradient.MinQueueCapacity);
            intDiag.AddLineMetadata($"Сумма { improvementData.ExperimentCount } графиков");
            intDiag.CompleteLine();

            intDiag.SetLayer(0);
            CallbackUi.InteractiveDiagram = intDiag;
            intDiag.ViewUpdated          += CallbackUi.InvalidateDiagramView;
            intDiag.GoToEnd();
        }
Exemple #4
0
        /// <summary>
        /// Вызывает создание диаграммы по заданным значениям. Результатом является отображение диграммы на главной панели.
        /// </summary>
        /// <param name="parameters">Параметры диграммы, заданные пользователем</param>
        public void MakeDiagram()
        {
            ParametersContainer parameters = CallbackUi.GetDiagramParameters();

            if (!CheckParametersValid(parameters))
            {
                return;
            }

            TimeDiagram timeDiagram;

            bool useGraphics = true;

            var timeToCl = (int)parameters.TimeLimit * parameters.ThreadIntencity;

            int min;

            if (!parameters.HasTimeLimit)
            {
                min = parameters.ClientLimit;
            }
            else if (!parameters.HasClientLimit)
            {
                min = timeToCl;
            }
            else
            {
                min = Math.Min(timeToCl, parameters.ClientLimit);
            }

            if (min > 200)
            {
                useGraphics = CallbackUi.YesNoDialog("Предупреждение", string.Format(@"Временная диаграмма будет содержать около {0} линий.
Ее отрисовка может вызвать замедление работы компьютера.
Отрисовать диаграмму?
(анализ диаграммы возможен при любом выборе)", min));
            }

            ProcessModeller modeller = new ProcessModeller(parameters);

            InteractiveDiagram intDiag = null;

            try
            {
                timeDiagram = useGraphics ? modeller.CreateDiagram(GraphicsFactory, out intDiag) : modeller.CreateDiagram();
            }
            catch
            {
                CallbackUi.ShowError("Создать диаграмму", "При моделировании процесса возникло исключение." /* + ex.StackTrace*/);
                return;
            }

            CallbackUi.InteractiveDiagram = intDiag;

            analyzeText = MakeReport(parameters, timeDiagram);

            if (intDiag != null)
            {
                CallbackUi.HideText();
                intDiag.ViewUpdated += CallbackUi.InvalidateDiagramView;
                intDiag.GoToEnd();
            }
            else
            {
                CallbackUi.ShowText("Отображение диграммы отключено.\nДля ее анализа, используйте Действия - Анализ диаграммы.");
            }
        }
Exemple #5
0
 private void ShowGraphs_ComboBox_SelectedIndexChanged(object sender, EventArgs e) => InteractiveDiagram?.SetLayer(ShowGraphs_ComboBox.SelectedIndex);
Exemple #6
0
 private void toEnd_Button_Click(object sender, EventArgs e) => InteractiveDiagram?.GoToEnd();
Exemple #7
0
 private void stepForward_Button_Click(object sender, EventArgs e) => InteractiveDiagram?.StepForward();