/// <summary> /// Вызывает синтез СМО. Результатом является набор графиков и отчетов, сохраненные в указанные папки. /// </summary> /// <param name="parameters">Параметры, задаваемые пользователем.</param> /// <param name="minQueuePlaceCount">Минимальное количество мест в очереди</param> /// <param name="maxQueuePlaceCount">Максимальное количество мест в очереди</param> public void MakeSynthesis() { ParametersContainer parameters; QueuePlaceGradientData gradient; string graphsFolder; string reportsFolder; if (!CheckParametersValid(parameters = CallbackUi.GetDiagramParameters()) || !CheckParametersValid(gradient = CallbackUi.GetQueuePlaceGradientData())) { return; } graphsFolder = CallbackUi.GetFolderPath("Выберите папку для сохранения графиков"); if (graphsFolder == "") { CallbackUi.ShowWarning("Синтез СМО", "Графики не будут сохранены"); } reportsFolder = CallbackUi.GetFolderPath("Выберите папку для сохранения отчетов", graphsFolder); if (graphsFolder == "" && reportsFolder == "") { CallbackUi.ShowWarning("Синтез СМО", "Отмена синтеза СМО"); return; } List <TimeDiagram> diagrams = new List <TimeDiagram>(gradient.MaxQueueCapacity - gradient.MinQueueCapacity + 1); CallbackUi.LockInterface(); //Меняем параметр "КМО". for (parameters.QueueCapacity = gradient.MinQueueCapacity; parameters.QueueCapacity <= gradient.MaxQueueCapacity; parameters.QueueCapacity++) { CallbackUi.ShowText($"Моделирование процесса: {parameters.QueueCapacity - gradient.MinQueueCapacity + 1} из {gradient.MaxQueueCapacity - gradient.MinQueueCapacity + 1}..."); ProcessModeller modeller = new ProcessModeller(parameters); try { diagrams.Add(modeller.CreateDiagram()); } catch/* (Exception ex)*/ { CallbackUi.HideText(); CallbackUi.UnlockInterface(); CallbackUi.ShowError("Синтез СМО", "При моделировании процесса возникло исключение." /* + ex.Message*/); return; } } CallbackUi.HideText(); CallbackUi.UnlockInterface(); try { if (graphsFolder != "") { foreach (var metric in GetMetrics(parameters.ChannelCount, gradient.MaxQueueCapacity)) { var graph = GraphicsFactory.CreateGraphByPoints(gradient.MinQueueCapacity, ReportTool.GetHeights(diagrams, metric), "Кол-во мест в очереди", metric.Name); graph.ExportToBitmap(true, graphsFolder + "/" + graph.Title + ".png"); } CallbackUi.StartExplorer(graphsFolder); } } catch { CallbackUi.ShowError("Синтез СМО", "Недостаточно прав для записи в " + graphsFolder); } try { if (reportsFolder != "") { foreach (var diagram in diagrams) { CallbackUi.CreateTextFile(reportsFolder + "/Отчет для кол-ва мест " + diagram.QueueCapacity + ".txt", MakeReport(parameters, diagram)); } if (reportsFolder != graphsFolder) { CallbackUi.StartExplorer(reportsFolder); } } } catch { CallbackUi.ShowError("Синтез СМО", "Недостаточно прав для записи в " + reportsFolder); } }
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Для ее анализа, используйте Действия - Анализ диаграммы."); } }