/// <summary> /// Проверяет корректность введенных параметров. /// </summary> /// <param name="parameters">Параметры для построения диаграммы, которые нужно проверить на правильность.</param> /// <returns></returns> bool CheckParametersValid(ParametersContainer parameters) { if (parameters == null) { return(false); } if (!parameters.HasTimeLimit && !parameters.HasClientLimit) { CallbackUi.ShowError("Моделирование процесса СМО", "Система не имеет ограничений ни по времени, ни по заявкам."); return(false); } if (parameters.ChannelCount == 0) { CallbackUi.ShowWarning("Моделирование процесса СМО", "Система не имеет мест обслуживания.\nСледовательно, все заявки будут отклонены."); } if (parameters.ChannelCount < 0 || parameters.QueueCapacity < 0) { CallbackUi.ShowError("Эта ошибка никогда не вылезет", "Надо было юзать uint"); return(false); } return(true); }
/// <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); } }