private static void DetectMultipleEdges(ModuleGraph graph, ModuleEdgeViewModel edge) { var multiEdges = from e in graph.Edges where e.Source == edge.Source && e.Target == edge.Target select e; int numEdges = multiEdges.Count(); if (numEdges > 1) { int edgeIndex = 0; foreach (var multiEdge in multiEdges) { if (multiEdge.EdgeMargin.Top.Equals(0)) { multiEdge.EdgeMargin = new Thickness( 0, (EdgeDistance * edgeIndex++) - ((EdgeDistance * numEdges) / 2) + 1, 0, 0); } } } }
public static ModuleGraph BuildGraph(ILogger logger, ModuleGraphDTO moduleGraphDto, IList <ModuleVertexViewModelBase> positions, bool smallFallbackIcons = false) { var graph = new ModuleGraph(); try { foreach (var platformModuleDto in moduleGraphDto.Vertices) { var res = (from p in positions where p.ID == platformModuleDto.Name select p).FirstOrDefault(); Point pos = res == null ? new Point(50, 50) : res.Position; var imagepath = @"Images\" + platformModuleDto.Type + ".png"; graph.AddVertex(new ModuleVertexViewModel(platformModuleDto.Name, imagepath, pos) { Capacity = platformModuleDto.MaxCapacity, Counter = platformModuleDto.PlatformItems.Count, Position = pos, DefaultVertexHeight = smallFallbackIcons ? 100 : 700 }); } foreach (var edgeDto in moduleGraphDto.Edges) { var edge = new ModuleEdgeViewModel( edgeDto.Id, FindModuleVertex(graph, edgeDto.Source), FindModuleVertex(graph, edgeDto.Target)) { OriginPortIndex = edgeDto.OriginPort, IsForcingEnabled = edgeDto.IsForcingEnabled }; DetectCyclicEdge(graph, edge); graph.AddEdge(edge); } foreach (var edge in graph.Edges) { DetectMultipleEdges(graph, edge); } } catch (Exception e) { logger.Error("Could not load and create Module PaperStreamGraph for Overview.", e); throw; } return(graph); }
private static void DetectCyclicEdge(ModuleGraph graph, ModuleEdgeViewModel edge) { var cyclicEdge = (from e in graph.Edges where e.Source == edge.Target && e.Target == edge.Source select e).FirstOrDefault(); if (cyclicEdge != null) { cyclicEdge.FirstEdge = true; edge.SecondEdge = true; } }
private bool IsCyclicEdge(ModuleGraph graph, ModuleGraphEdge edge) { var cyclicEdge = (from e in graph.Edges where e.Source == edge.Target && e.Target == edge.Source select e).FirstOrDefault(); if (cyclicEdge != null) { return(true); } return(false); }
// // ModuleA (source) --> ModuleB ------> ModuleC (sink) // / // ModuleD -/ private ModuleGraph CreateSampleModuleGraph() { var graph = new ModuleGraph(); graph.AddVertex(_moduleA.Object); graph.AddVertex(_moduleB.Object); graph.AddVertex(_moduleC.Object); graph.AddVertex(_moduleD.Object); graph.AddEdge(new ModuleGraphEdge("A->B", _moduleA.Object, _moduleB.Object, 0, 0)); graph.AddEdge(new ModuleGraphEdge("B->C", _moduleB.Object, _moduleC.Object, 0, 0)); graph.AddEdge(new ModuleGraphEdge("D->C", _moduleD.Object, _moduleC.Object, 0, 1)); return(graph); }
public ModuleGraphView(ModuleGraph window) { this.window = window; gridStyle = Resources.Load <StyleSheet>("GraphStyle"); SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale); this.AddManipulator(new ContentDragger()); this.AddManipulator(new SelectionDragger()); this.AddManipulator(new RectangleSelector()); grid = new GridBackground(); grid.AddToClassList("grid"); styleSheets.Add(gridStyle); Insert(0, grid); grid.StretchToParentSize(); CreateEmptyNewGraph(); AddSearchWindow(); LiveChangeActionModule(); }
private static ModuleVertexViewModelBase FindModuleVertex(ModuleGraph graph, string moduleName) { return(graph.Vertices.FirstOrDefault(moduleVertex => moduleVertex.ID == moduleName)); }
private ModuleGraph CreateGraph(ModuleWiringConfigSection.ModuleWiringConfigSection configSection) { var graph = new ModuleGraph(); // create graph vertices foreach (ModuleConfig moduleConfig in configSection.Modules) { var module = GetModuleByName(moduleConfig.Name); if (module == null) { continue; } // create QuickGraph datastructure graph.AddVertex(module); } // create graph edges foreach (ModuleConfig moduleConfig in configSection.Modules) { var module = GetModuleByName(moduleConfig.Name); if (module == null) { continue; } foreach (ModuleReferenceConfig targetModuleConfig in moduleConfig.NextModules) { var targetModule = GetModuleByName(targetModuleConfig.Name); if (targetModule == null) { continue; } var edge = new ModuleGraphEdge( module.Name + "->" + targetModule.Name + ":" + targetModuleConfig.Port + targetModuleConfig.TargetPort, module, targetModule, targetModuleConfig.Port, targetModuleConfig.TargetPort); graph.AddEdge(edge); } } // enable forcing for one-way edges by default var modulesWithSingleEdge = from e in graph.Edges group e by e.Source into g where g.Count() == 1 select g.Key; foreach (var module in modulesWithSingleEdge) { var oneWayEdge = (from e in graph.Edges where e.Source == module select e).Single(); if (!IsCyclicEdge(graph, oneWayEdge)) { oneWayEdge.IsForcingEnabled = true; } } return(graph); }