private void CloseEditingContext(CircuitEditingContext editingContext) { m_contextRegistry.RemoveContext(editingContext); if (editingContext.Is<ViewingContext>()) { var viewingContext = editingContext.Cast<ViewingContext>(); if (viewingContext.Control != null) { UnregisterControl(viewingContext.DomNode, viewingContext.Control); viewingContext.Control = null; } } }
private object[] ExpandMaster(CircuitEditingContext context, SubCircuitInstance subCircuitInstance) { // remove the sub-circuit instance var circuit = context.CircuitContainer; circuit.Elements.Remove(subCircuitInstance); SubCircuit subCircuit = subCircuitInstance.SubCircuit as SubCircuit; // clone sub-circuit contents List<object> subCircuitContents = new List<object>(); subCircuitContents.AddRange(Adapters.AsIEnumerable<object>(subCircuit.Elements)); subCircuitContents.AddRange(Adapters.AsIEnumerable<object>(subCircuit.Wires)); DomNode[] clones = DomNode.Copy(Adapters.AsIEnumerable<DomNode>(subCircuitContents)); object[] data = new object[clones.Length]; clones.CopyTo(data, 0); return data; }
private static void UngroupGroups(CircuitEditingContext circuitEditingContext, ISelectionContext selectionContext) { var graphContainer = circuitEditingContext.CircuitContainer; var newSelection = new List<object>(); foreach (var group in selectionContext.Selection.AsIEnumerable<Group>()) { newSelection.AddRange(group.Elements); UngroupGroup(group, graphContainer); } selectionContext.SetRange(newSelection); }
private SubCircuitInstance CreateMaster(CircuitEditingContext context) { var circuit = context.CircuitContainer; // get the selected modules and the connections between them HashSet<Element> modules = new HashSet<Element>(); List<Wire> internalConnections = new List<Wire>(); List<Wire> externalConnections = new List<Wire>(); GetSubCircuit(context.Selection, circuit, modules, internalConnections, externalConnections, externalConnections); // clone modules and connections, as the originals could be restored in a future undo operation List<DomNode> originals = new List<DomNode>(); originals.AddRange(Adapters.AsIEnumerable<DomNode>(modules)); originals.AddRange(Adapters.AsIEnumerable<DomNode>(internalConnections)); IEnumerable<DomNode> clones = DomNode.Copy(originals); // translate cloned modules so the top-left most one is at 16, 16 int left = int.MaxValue, top = int.MaxValue; foreach (Element module in modules) { Point p = module.Position; left = Math.Min(left, p.X); top = Math.Min(top, p.Y); } // remove modules from circuit (connections will be removed by reference validator) foreach (Element module in modules) circuit.Elements.Remove(module); // build the sub-circuit type SubCircuit subCircuit = new DomNode(SubCircuitType).As<SubCircuit>(); subCircuit.Name = "MasterInstance"; // add modules to sub-circuit, and create pins for "connector" modules IList<ICircuitPin> inputPins = subCircuit.Inputs; IList<ICircuitPin> outputPins = subCircuit.Outputs; foreach (Element module in Adapters.AsIEnumerable<Element>(clones)) { Point p = module.Position; module.Position = new Point(p.X - left + 16, p.Y - top + 16); subCircuit.Elements.Add(module); } // Add connections to sub circuit, keeping track of which pins have a connection. var connectedInputPins = new HashSet<Pair<Element, ICircuitPin>>(); var connectedOutputPins = new HashSet<Pair<Element, ICircuitPin>>(); foreach (Wire connection in Adapters.AsIEnumerable<Wire>(clones)) { subCircuit.Wires.Add(connection); connectedInputPins.Add(new Pair<Element, ICircuitPin>(connection.InputElement, connection.InputPin)); connectedOutputPins.Add(new Pair<Element, ICircuitPin>(connection.OutputElement, connection.OutputPin)); } // Add in the input and output pins to the sub-circuit. Add in only the pins that have // no connections. Only check the types that are connectors. foreach (Element module in subCircuit.Elements) { ElementType elementType = module.Type as ElementType; if (elementType != null && elementType.IsConnector) { foreach (ICircuitPin outputPin in elementType.Outputs) { if (!connectedOutputPins.Contains(new Pair<Element, ICircuitPin>(module, outputPin))) { Pin pin = new DomNode(CircuitPinType).As<Pin>(); pin.Name = module.Name; pin.TypeName = outputPin.TypeName; pin.Index = outputPins.Count; outputPins.Add(pin); } } foreach (ICircuitPin inputPin in elementType.Inputs) { if (!connectedInputPins.Contains(new Pair<Element, ICircuitPin>(module, inputPin))) { Pin pin = new DomNode(CircuitPinType).As<Pin>(); pin.Name = module.Name; pin.TypeName = inputPin.TypeName; pin.Index = inputPins.Count; inputPins.Add(pin); } } } } // create sub circuit instance to replace selection SubCircuitInstance subCircuitInstance = new DomNode(SubCircuitInstanceType).As<SubCircuitInstance>(); subCircuitInstance.Id = "MasterInstance"; subCircuitInstance.SubCircuit = subCircuit; return subCircuitInstance; }
public void SetDocument(CircuitEditingContext editingContext, ViewingContext viewingContext) { m_editingContext = editingContext; m_viewingContext = viewingContext; SetDefaultPrinterSettings(); }