private XElement CreateElements(CircuitDocument document, WriterContext context) { var documentXml = new XElement(Ns.Document + "elements"); foreach (var component in document.Components()) { var componentXml = new XElement(Ns.Document + "c"); componentXml.SetAttributeValue("id", context.GetOrAssignId(component)); var typeId = context.GetId(component.Type); componentXml.SetAttributeValue("tp", "{" + typeId + "}"); // Layout var positionalComponent = component as PositionalComponent; if (positionalComponent != null) { WriteLayout(positionalComponent.Layout, componentXml); } // Properties var properties = new XElement(Ns.Document + "prs"); foreach (var property in component.Properties) { properties.Add(new XElement(Ns.Document + "p", new XAttribute("k", property.Key), new XAttribute("v", property.Value))); } componentXml.Add(properties); // Connections var connections = new XElement(Ns.Document + "cns"); foreach (var connection in component.Connections) { connections.Add(new XElement(Ns.Document + "cn", new XAttribute("id", context.GetOrAssignId(connection.Value.Connection)), new XAttribute("pt", connection.Key))); } componentXml.Add(connections); documentXml.Add(componentXml); } foreach (var wire in document.Wires()) { var wireXml = new XElement(Ns.Document + "w"); WriteLayout(wire.Layout, wireXml); documentXml.Add(wireXml); } return(documentXml); }
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); } }