/// <summary> /// Производит сохранение информации о блоке процедуры /// </summary> /// <param name="Block"></param> /// <param name="processes"></param> /// <param name="saveProcess"></param> /// <returns></returns> private SaveProcedure SaveBlockProcedure(BlockWPF Block, Dictionary <ProcedureWPF, Guid> procedures, SaveProcess saveProcess) { SaveProcedure temp = null; // Если обрабатываемый блок - начальный или конечный элемент if (Block is StartBlockWPF || Block is EndBlockWPF) { temp = new SaveProcedure() { Id = new Guid(), Model = null, Position = Block.Position }; } else { if (!procedures.ContainsKey(Block as ProcedureWPF)) { var info = (Block as ProcedureWPF).BlockModel; bool IsProcess = info is Process; Guid childId = new Guid(); // Проверяем, не является ли содержимое подпроцессом if (IsProcess) { // Если является // Проверяем, сохранен ли он if (!processSaved.ContainsKey(info as Process)) { // Если не сохранён, быстро сохраняем, передавая родительский блок SaveProcess childProc = ExtrSaveProcess((info as Process).Description); childId = childProc.ProcessId; processSaved.Add(info as Process, childId); project.ProcessList.Add(childProc); //processSaved.Add(info as Process, childId); } else // Сохранён { // Находим процесс childId = processSaved[info as Process]; // Достаём его ID } } temp = SaveProcedure.ToSave(Block as ProcedureWPF, IsProcess, childId); procedures.Add(Block as ProcedureWPF, temp.Id); saveProcess.ProcedureList.Add(temp); } else { temp = saveProcess.ProcedureList.Where(x => x.Id.CompareTo(procedures[Block as ProcedureWPF]) == 0).First(); } } return(temp); }
// <!--------------------------------- Сохранение - Конец -----------------------------> // <!--------------------------------- Загрузка - Начало -----------------------------> public void LoadProcess(SaveProcess process, DrawArea area) { // Создаём начальный и конечный блоки StartBlockWPF startBlock = new StartBlockWPF(process.StartElement); EndBlockWPF endBlock = new EndBlockWPF(process.EndElement); // Кидаем их на поле area.Children.Add(startBlock); area.Children.Add(endBlock); // Помечаем, что они уже есть area.IsHaveStartEnd = true; // Тут лежат уже обработанные блоки Dictionary <Guid, ProcedureWPF> worksavelistproc = new Dictionary <Guid, ProcedureWPF>(); Dictionary <Guid, ResourceWPF> worksavelistres = new Dictionary <Guid, ResourceWPF>(); // Проходим по сохранённым процедурам foreach (var proc in process.ProcedureList) { area.Children.Add(LoadProcedureBlock(proc, worksavelistproc)); } // Проходим по всем ресурсам foreach (var res in process.ResourceList) { area.Children.Add(LoadResourceBlock(res, worksavelistres)); } // Проходим по всем связям с процедурами foreach (SaveProcedureConnection connectproc in process.ProcedureConnectonList) { area.Children.Add(LoadProcConnection(connectproc, worksavelistproc, startBlock, endBlock)); } // Проходим по всем связям с ресурсами foreach (SaveResourceConnection connectres in process.ResourceConnectionList) { area.Children.Add(LoadResConnection(connectres, worksavelistproc, worksavelistres)); } }
/// <summary> /// Производит сохранение о блоке ресурса /// </summary> /// <param name="Block"></param> /// <param name="resources"></param> /// <param name="saveProcess"></param> /// <returns></returns> private SaveResource SaveBlockResourse(BlockWPF Block, Dictionary <ResourceWPF, Guid> resources, SaveProcess saveProcess) { SaveResource temp = null; // Если обрабатываемый блок - начальный или конечный элемент if (Block is StartBlockWPF || Block is EndBlockWPF) { temp = new SaveResource() { Id = new Guid(), Model = null, Position = Block.Position }; } else { // Проверяем видели ли элемент текущий if (!resources.ContainsKey(Block as ResourceWPF)) { temp = SaveResource.ToSave(Block as ResourceWPF); resources.Add(Block as ResourceWPF, temp.Id); // Добавляем в обработанные блоки saveProcess.ResourceList.Add(temp); // Добавляем в сохранённые } else { temp = saveProcess.ResourceList.Where(x => x.Id.CompareTo(resources[Block as ResourceWPF]) == 0).First(); // Возвращаем блок из списка } } return(temp); }
/// <summary> /// Производит сохранение информации о связи с ресурсами /// </summary> /// <param name="element"></param> /// <param name="processes"></param> /// <param name="resources"></param> /// <param name="saveProcess"></param> private void SaveResourceConnection(UIElement element, Dictionary <ProcedureWPF, Guid> procedures, Dictionary <ResourceWPF, Guid> resources, SaveProcess saveProcess) { var connection = element as ResConnectionWPF; // Достаём информацию о связи // Информация о начальных и конечных блоках BlockWPF Start = connection.StartBlock; BlockWPF End = connection.EndBlock; SaveProcedure procedure = null; SaveResource resource = null; // Если начальный элемент - процедура if (Start is ProcedureWPF) { procedure = SaveBlockProcedure(Start, procedures, saveProcess); resource = SaveBlockResourse(End, resources, saveProcess); } else { procedure = SaveBlockProcedure(End, procedures, saveProcess); resource = SaveBlockResourse(Start, resources, saveProcess); } // Формируем информацию SaveResourceConnection resConnection = new Utility.SaveResourceConnection() { StartID = procedure.Id, EndID = resource.Id }; // Сохраняем saveProcess.ResourceConnectionList.Add(resConnection); }
/// <summary> /// Производит сохранение информации о связи с процедурами /// </summary> /// <param name="element"></param> /// <param name="processes"></param> /// <param name="saveProcess"></param> private void SaveProcConnection(UIElement element, Dictionary <ProcedureWPF, Guid> procedures, SaveProcess saveProcess) { var connection = element as ProcConnectionWPF; // Достаём информацию о связи BlockWPF Start = connection.StartBlock; // Информация о начальном блоке в связи BlockWPF End = connection.EndBlock; // Информация о конечном блоке в связи var StartProcedure = SaveBlockProcedure(Start, procedures, saveProcess); // Сохраняем информацию о начальной процедуре var EndProcedure = SaveBlockProcedure(End, procedures, saveProcess); // Сохраняем информацию о конецной процедуре // Формируем информацию о связи SaveProcedureConnection connect = new SaveProcedureConnection() { StartID = StartProcedure.Id, EndID = EndProcedure.Id, StartPort = connection.StartPort, EndPort = connection.EndPort, RelativeStartPosition = connection.RelateStart, RelativeEndPosition = connection.RelateEnd }; // Сохраняем информацию saveProcess.ProcedureConnectonList.Add(connect); }
// <!--------------------------------- Сохранение - Начало -----------------------------> private SaveProcess SaveProcessExecute(UIElementCollection collection, String name) { SaveProcess temp = new SaveProcess { ProcessName = name }; Dictionary <ProcedureWPF, Guid> ProcedureList = new Dictionary <ProcedureWPF, Guid>(); // Тут лежит список обработанных процедур Dictionary <ResourceWPF, Guid> ResourceList = new Dictionary <ResourceWPF, Guid>(); // Тут лежит список обработанных ресурсов // Сохраняем информацию о начальном и конечном элементе temp.StartElement = (collection[0] as StartBlockWPF).Position; temp.EndElement = (collection[1] as EndBlockWPF).Position; temp.ProcessName = name; temp.ProcessId = Guid.NewGuid(); List <UIElement> procedureConnections = new List <UIElement>(); // Список с соединениями процедур List <UIElement> resourceConnections = new List <UIElement>(); // Блок с соединениями ресурсов List <UIElement> procedures = new List <UIElement>(); // Список с процедурами List <UIElement> resourses = new List <UIElement>(); // Список с ресурсами // Проходим по всем элементам foreach (UIElement element in collection) { // Если элемент - связь процедур if (element is ProcConnectionWPF) { procedureConnections.Add(element); } // Если элемент - связь ресурсов if (element is ResConnectionWPF) { resourceConnections.Add(element); } // Если элемент - процедура if (element is ProcedureWPF) { procedures.Add(element); } // Если элемент - рксурс if (element is ResourceWPF) { resourses.Add(element); } } // Проходим по всем связям с процедурами foreach (var element in procedureConnections) { SaveProcConnection(element, ProcedureList, temp); } // Проходим по всем связям с ресурсами foreach (var element in resourceConnections) { SaveResourceConnection(element, ProcedureList, ResourceList, temp); } // Проходим по необработанным процедурам foreach (var element in procedures) { SaveBlockProcedure(element as ProcedureWPF, ProcedureList, temp); } // Проходимся по необработанным ресурсам foreach (var element in resourses) { SaveBlockResourse(element as ResourceWPF, ResourceList, temp); } return(temp); // Возвращаем всю информацию о процессе }