//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(); } } }
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(); } } }