public IList <VisualisedConnection> PositionConnections(CircuitDocument document, LayoutOptions layoutOptions) { foreach (var wire in document.Wires().ToList()) { document.Elements.Remove(wire); document.Elements.Add(WireToComponent(wire)); } // Compute connections var connectionPoints = document.PositionalComponents().SelectMany(x => GetConnectionPoints(x, layoutOptions).Select(c => Tuple.Create(x, c))); var connectionsByLocation = connectionPoints.GroupBy(x => x.Item2.Location).Where(x => x.Any(c => c.Item2.IsEdge) && x.Count() > 1).ToList(); // Connect components foreach (var c in connectionsByLocation) { foreach (var c1 in c) { foreach (var c2 in c) { var connection1 = c1.Item1.Connections.GetConnection(c1.Item2.Connection, c1.Item1); var connection2 = c2.Item1.Connections.GetConnection(c2.Item2.Connection, c2.Item1); connection1.ConnectTo(connection2); } } } // Return the connections that the connectionVisualiser indicates should be rendered var points = connectionsByLocation .Select(x => new VisualisedConnection { Connection = x.Select(c => c.Item1.Connections[c.Item2.Connection].Connection).First(), Location = x.Key, Render = VisualiseConnection(x.Select(y => y.Item2).ToList()) }).ToList(); foreach (var wire in document.PositionalComponents().Where(x => x.Type == WireType).ToList()) { document.Elements.Remove(wire); document.Elements.Add(ComponentToWire(wire)); } return(points); }
public void RenderCircuit(CircuitDocument circuit, IDrawingContext drawingContext) { foreach (var component in circuit.PositionalComponents()) { RenderComponent(component, drawingContext, ignoreOffset: false); } foreach (var wire in circuit.Wires()) { RenderWire(wire, drawingContext); } var connections = connectionVisualiser.PositionConnections(circuit, new LayoutOptions() { GridSize = 10.0 }); foreach (var connection in connections.Where(x => x.Render).Select(x => x.Location)) { RenderConnection(connection, drawingContext); } }