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); }
/// <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; }
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(); }
/// <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Для ее анализа, используйте Действия - Анализ диаграммы."); } }
private void ShowGraphs_ComboBox_SelectedIndexChanged(object sender, EventArgs e) => InteractiveDiagram?.SetLayer(ShowGraphs_ComboBox.SelectedIndex);
private void toEnd_Button_Click(object sender, EventArgs e) => InteractiveDiagram?.GoToEnd();
private void stepForward_Button_Click(object sender, EventArgs e) => InteractiveDiagram?.StepForward();