Ejemplo n.º 1
0
        /// <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);
            }
        }