예제 #1
0
        //public void Map(UIElementCollection uIElementCollection, SimulationOptions simOptions)
        //{
        //    Dictionary<ProcedureWPF, Procedure> procedures = new Dictionary<ProcedureWPF, Procedure>();
        //    Dictionary<ResourceWPF, Resource> resources = new Dictionary<ResourceWPF, Resource>();

        //    var resultProcedures = new List<Procedure>();

        //    foreach (var element in uIElementCollection)
        //    {
        //        //смотрим все соединения процедур
        //        if (element is ProcConnectionWPF)
        //        {
        //            var connection = (element as ProcConnectionWPF);

        //            //TODO типа можно здесь всё обработать
        //            // Комментарий от 28.05.19: facepalm
        //            if (connection.StartBlock is StartBlockWPF && connection.EndBlock is EndBlockWPF)
        //            {
        //                throw new Exception("Нельзя просто соединить начало с концом!");
        //            }

        //            //обработка стартового блока
        //            if (connection.StartBlock is StartBlockWPF)
        //            {
        //                Procedure block;

        //                //если в первый раз встерчаем блок
        //                if (!(procedures.ContainsKey(connection.EndBlock as ProcedureWPF)))
        //                {
        //                    //первого нет, второй значимый
        //                    block = (connection.EndBlock as ProcedureWPF).BlockModel;

        //                    //добавляем его в список
        //                    procedures.Add(connection.EndBlock as ProcedureWPF, block);

        //                    //добавляем его в список всех блоков процесса
        //                    resultProcedures.Add(block);
        //                }
        //                //иначе просто берём из базы
        //                else
        //                    block = procedures[connection.EndBlock as ProcedureWPF];

        //                //process.StartBlock = block;
        //                //соединение будет когда-то потом
        //            }
        //            //обработка конечного блока
        //            else if (connection.EndBlock is EndBlockWPF)
        //            {
        //                Procedure block = null;

        //                //если в первый раз такое встречаем
        //                if (!(procedures.ContainsKey(connection.StartBlock as ProcedureWPF)))
        //                {
        //                    block = (connection.StartBlock as ProcedureWPF).BlockModel;
        //                    procedures.Add(connection.StartBlock as ProcedureWPF, block);
        //                    resultProcedures.Add(block);
        //                }
        //                else
        //                {
        //                    block = procedures[connection.StartBlock as ProcedureWPF];
        //                }
        //                //process.EndBlock = block;
        //                //соединение будет когда-то потом
        //            }
        //            //обработка всех остальных блоков
        //            else
        //            {
        //                Procedure block = null;

        //                //если в первый раз такое встречаем
        //                if (!(procedures.ContainsKey(connection.StartBlock as ProcedureWPF)))
        //                {
        //                    block = (connection.StartBlock as ProcedureWPF).BlockModel;
        //                    procedures.Add(connection.StartBlock as ProcedureWPF, block);
        //                    resultProcedures.Add(block);
        //                }
        //                //если в первый раз такое встречаем
        //                if (!(procedures.ContainsKey(connection.EndBlock as ProcedureWPF)))
        //                {
        //                    block = (connection.EndBlock as ProcedureWPF).BlockModel;
        //                    procedures.Add(connection.EndBlock as ProcedureWPF, block);
        //                    resultProcedures.Add(block);
        //                }


        //                //к счастью там только один вход и выход
        //                //process.Connections.Connect(procedures[connection.StartBlock as ProcedureWPF], connection.StartPort,
        //                //    procedures[connection.EndBlock as ProcedureWPF], connection.EndPort);

        //            }
        //        }
        //        //сотрим соединения ресурсов
        //        else if (element is ResConnectionWPF)
        //        {

        //            var connection = (element as ResConnectionWPF);
        //            ProcedureWPF procedure;
        //            ResourceWPF resourceWPF;
        //            if (connection.StartBlock is ProcedureWPF)
        //            {
        //                procedure = connection.StartBlock as ProcedureWPF;
        //                resourceWPF = connection.EndBlock as ResourceWPF;
        //            }
        //            else
        //            {
        //                procedure = connection.EndBlock as ProcedureWPF;
        //                resourceWPF = connection.StartBlock as ResourceWPF;
        //            }
        //            Procedure block = null;

        //            //если в первый раз такое встречаем
        //            if (!(procedures.ContainsKey(procedure)))
        //            {
        //                block = procedure.BlockModel;
        //                procedures.Add(procedure, block);
        //                resultProcedures.Add(block);
        //            }
        //            else
        //                block = procedures[procedure];

        //            Resource resource = null; ;
        //            //если в первый раз такое встречаем
        //            if (!(resources.ContainsKey(resourceWPF)))
        //            {
        //                resource = this.ConvertWpfResourceToModel(resourceWPF);
        //                resources.Add(resourceWPF, resource);
        //                //process.Resources.Add(resource); // WTF???
        //            }
        //            else
        //                resource = resources[resourceWPF];

        //            if (block is Procedure)
        //                (block as Procedure).Resources.Add(resource);
        //            else
        //                throw new ArgumentException("Ресурсы поддерживает только блоки типа Procedure");
        //        }
        //    }

        //    simOptions.Procedures = resultProcedures;
        //}

        private void StartModeling_Executed(object sender, RoutedEventArgs e)
        {
            try
            {
                var tabs     = testTabControl.Items.OfType <TabItem>().ToList();
                var drawArea = tabs[0].Content as DrawArea;

                var proceduresConnections = drawArea.Children.OfType <ProcConnectionWPF>()
                                            .Where(x => x.startPoint == null || x.startPoint.ConnectType == ConnectPointWPF_Type.outPut)
                                            .ToList();
                var backLinksConnections = drawArea.Children.OfType <ProcConnectionWPF>()
                                           .Where(x => x.startPoint != null && x.startPoint.ConnectType == ConnectPointWPF_Type.backOutput)
                                           .ToList();
                var resourcesConnections = drawArea.Children.OfType <ResConnectionWPF>().ToList();
                var procedures           = drawArea.Children.OfType <ProcedureWPF>().ToList();
                var resources            = drawArea.Children.OfType <ResourceWPF>().ToList();

                var resourcesDictionary = resourcesConnections
                                          .Select(x => new
                {
                    Connection = x,
                    Resource   = x.StartBlock is ResourceWPF ? x.StartBlock as ResourceWPF : x.EndBlock as ResourceWPF,
                    Procedure  = x.StartBlock is ProcedureWPF ? x.StartBlock as ProcedureWPF : x.EndBlock as ProcedureWPF
                })
                                          .GroupBy(x => x.Procedure)
                                          .ToDictionary(x => x.Key.BlockModel, x => x.Select(y => y.Resource).ToList());

                var proceduresDictionary = proceduresConnections
                                           .Where(x => x.StartBlock as ProcedureWPF != null && x.EndBlock as ProcedureWPF != null)
                                           .Select(x => new
                {
                    StartProcedure = x.StartBlock as ProcedureWPF,
                    EndProcedure   = x.EndBlock as ProcedureWPF
                })
                                           .Select(x => new
                {
                    Connection = new Connection()
                    {
                        Begin = x.StartProcedure.BlockModel,
                        End   = x.EndProcedure.BlockModel
                    },
                    x.StartProcedure,
                    x.EndProcedure
                })
                                           .ToList();

                var proceduresBackLinkDictionary = backLinksConnections
                                                   .Select(x => new
                {
                    StartProcedure = x.StartBlock as ProcedureWPF,
                    EndProcedure   = x.EndBlock as ProcedureWPF
                })
                                                   .Select(x => new
                {
                    Connection = new Connection()
                    {
                        Begin = x.StartProcedure.BlockModel,
                        End   = x.EndProcedure.BlockModel
                    },
                    x.StartProcedure,
                    x.EndProcedure
                })
                                                   .ToList();

                var allProcedures = new List <Procedure>();
                allProcedures.AddRange(proceduresDictionary.SelectMany(x => new[] { x.Connection.Begin, x.Connection.End }).Cast <Procedure>());
                allProcedures.AddRange(proceduresBackLinkDictionary.SelectMany(x => new[] { x.Connection.Begin, x.Connection.End }).Cast <Procedure>());
                allProcedures.AddRange(resourcesDictionary.Keys.Select(x => x));

                var totalProcedures = allProcedures.Distinct();
                foreach (var procedure in totalProcedures)
                {
                    procedure.Resources = resourcesDictionary.ContainsKey(procedure) ? resourcesDictionary[procedure].Select(res => res.ResourceModel).ToList() : new List <Resource>();
                    procedure.Inputs    = proceduresDictionary.Where(x => x.EndProcedure.BlockModel == procedure).Select(x => x.Connection).ToList();
                    procedure.Outputs   = proceduresDictionary.Where(x => x.StartProcedure.BlockModel == procedure).Select(x => x.Connection).ToList();
                    procedure.BackLinks = proceduresBackLinkDictionary.Where(x => x.StartProcedure.BlockModel == procedure).Select(x => x.Connection).ToList();
                }

                var options = new SimulationOptions()
                {
                    Procedures = totalProcedures
                                 .Cast <BaseProcedure>()
                                 .ToList()
                };

                var simulator = new Simulator();

                try
                {
                    var results = simulator.Simulate(options);

                    var    successString = results.IsSuccess ? "успешно" : "неудачно";
                    string resultMsg     = $"Моделирование завершено {successString}";

                    if (results.IsSuccess)
                    {
                        resultMsg += $"{Environment.NewLine}Время моделирования: {results.ModelingTime}";

                        foreach (var log in results.Logs.Where(log => !string.IsNullOrEmpty(log.Procedure.Name)))
                        {
                            resultMsg += $"{Environment.NewLine}===" +
                                         $"{Environment.NewLine}Процедура: {log.Procedure?.Name}" +
                                         $"{Environment.NewLine}Начало: {log.SimulationResult.StartTime}" +
                                         $"{Environment.NewLine}Продолжительность: {log.SimulationResult.Duration}" +
                                         $"{Environment.NewLine}Конец: {log.SimulationResult.EndTime}" +
                                         $"{Environment.NewLine}Входное качество: {(int)(log.SimulationResult.StartQuality * 100.0)}" +
                                         $"{Environment.NewLine}Выходное качество: {(int)(log.SimulationResult.ResultQuality * 100.0)}";
                        }

                        var resultsWindow = new ResultWindow(
                            results.ModelingTime.Value,
                            resources.Select(x => x.ResourceModel.Cost).Sum(),
                            results.Logs.Where(log => !string.IsNullOrEmpty(log.Procedure.Name)).ToArray()
                            );
                        resultsWindow.Show();
                    }
                    else
                    {
                        throw new Exception("Моделирование завершено неудачно");
                    }

                    listBox1.Items.Clear();
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                foreach (var process in processes)
                {
                    //process = new SimulationOptions();
                }
            }
        }
예제 #2
0
        private void StartModeling_Executed(object sender, RoutedEventArgs e)
        {
            try
            {
                ViewModelConverter converter = new ViewModelConverter();

                //запихиваем содержимое области рисования в процесс
                foreach (var item in testTabControl.Items)
                {
                    var tab      = item as TabItem;
                    var drawArea = tab.Content as DrawArea;
                    converter.Map(drawArea.Children, tab.Header as Process);
                }

                ////запихиваем содержимое главной области рисования в процесс
                //converter.Map(drawAreas[0].Children, mainProcess);

                //добавляем на стартовый блок токен
                mainProcess.AddToken(new Token(0, complexity), 0);
                //double i = 0;
                ModelingTime modelingTime = new ModelingTime()
                {
                    Delta = this.dt, Now = 0
                };
                for (modelingTime.Now = 0; modelingTime.Now < maxTime; modelingTime.Now += modelingTime.Delta)
                {
                    mainProcess.Update(modelingTime);
                    //на конечном блоке на выходе появился токен
                    if (mainProcess.EndBlockHasOutputToken)
                    {
                        break;
                    }
                }

                //TokenViewer show = new TokenViewer(mainProcess.TokenCollector as TokensCollector);
                //show.Show();

                //Statictics();

                //TODO сделать DataBinding
                listBox1.Items.Clear();

                //добавляем ещё инцидентры в историю
                AccidentsCollector collector = AccidentsCollector.GetInstance();
                collector.GetHistory().ForEach(item => listBox1.Items.Add(item));

                ResultWindow resultWindow = new ResultWindow(mainProcess.Collector.GetHistory(), collector.GetHistory(), this.complexity);
                resultWindow.ShowDialog();
                mainProcess.Collector.GetHistory().ForEach(item => listBox1.Items.Add(item));



                mainProcess.Collector.GetHistory().Clear();
                collector.GetHistory().Clear();

                //выводим число токенов и время затраченное(в заголовке)
                //MessageBox.Show("Время, затраченное на имитацию " + modelingTime.Now.ToString(), "Имитация закончена");
            }
            catch (NotImplementedException ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                foreach (var process in processes)
                {
                    process.ClearProcess();
                }
            }
        }