public SchematicEditor(Circuit.Schematic Schematic) : base(Schematic) { InitializeComponent(); CommandBindings.Add(new CommandBinding(ApplicationCommands.Save, Save_Executed)); CommandBindings.Add(new CommandBinding(ApplicationCommands.SaveAs, SaveAs_Executed)); CommandBindings.Add(new CommandBinding(ApplicationCommands.Delete, Delete_Executed, Delete_CanExecute)); CommandBindings.Add(new CommandBinding(ApplicationCommands.Cut, Cut_Executed, Cut_CanExecute)); CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy, Copy_Executed, Copy_CanExecute)); CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, Paste_Executed, Paste_CanExecute)); CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, SelectAll_Executed, SelectAll_CanExecute)); CommandBindings.Add(new CommandBinding(ApplicationCommands.Undo, Undo_Executed, Undo_CanExecute)); CommandBindings.Add(new CommandBinding(ApplicationCommands.Redo, Redo_Executed, Redo_CanExecute)); Focusable = true; Cursor = Cursors.Cross; edits = new EditStack(); Tool = new SelectionTool(this); Width = 1600; Height = 1600; Origin = SnapToGrid(new Circuit.Coord((int)Width / 2, (int)Height / 2)); }
private void LoadLibrary(XDocument Doc, string Name) { XElement library = Doc.Element("Library"); if (library != null) { XAttribute category = library.Attribute("Category"); Category child = FindChild(category != null ? category.Value : Name); foreach (XElement i in library.Elements("Component")) { try { Circuit.Component C = Circuit.Component.Deserialize(i); child.AddComponent(C); } catch (Exception E) { Util.Log.Global.WriteLine(Util.MessageType.Warning, "Failed to load component: {0}", E.Message); } } } else if (Doc.Element("Schematic") != null) { Circuit.Schematic S = Circuit.Schematic.Deserialize(Doc.Element("Schematic")); Circuit.Circuit C = S.Build(); AddComponent(C, Name, C.Description); } }
/// <summary> /// Add the categories and components of the specified library to this Category. /// </summary> /// <param name="Library"></param> public void LoadLibrary(string Library) { string name = System.IO.Path.GetFileNameWithoutExtension(Library); try { // Try to load the library as a LiveSPICE XML document. XDocument doc = XDocument.Load(Library); XElement library = doc.Element("Library"); if (library != null) { XAttribute category = library.Attribute("Category"); Category child = FindChild(category != null ? category.Value : name); foreach (XElement i in library.Elements("Component")) { Circuit.Component C = Circuit.Component.Deserialize(i); child.AddComponent(C); } } else if (doc.Element("Schematic") != null) { Circuit.Schematic S = Circuit.Schematic.Deserialize(doc.Element("Schematic")); Circuit.Circuit C = S.Build(); AddComponent(C, name, C.Description); } } catch (System.Xml.XmlException) { // Try to load the library as a SPICE model library. try { Circuit.Spice.Statements statements = new Circuit.Spice.Statements() { Log = Util.Log.Global }; statements.Parse(Library); IEnumerable <Circuit.Spice.Model> models = statements.OfType <Circuit.Spice.Model>().Where(i => i.Component != null); if (models.Any()) { Category child = FindChild(name); foreach (Circuit.Spice.Model i in models) { child.AddComponent(i.Component, i.Component.PartNumber, i.Description); } } } catch (Exception Ex) { Util.Log.Global.WriteLine(Util.MessageType.Warning, "Failed to load component libary '{0}': {1}", Library, Ex.Message); } } catch (Exception Ex) { Util.Log.Global.WriteLine(Util.MessageType.Warning, "Failed to load component libary '{0}': {1}", Library, Ex.Message); } }
public SchematicControl(Circuit.Schematic Schematic) { InitializeComponent(); schematic = Schematic; schematic.Elements.ItemAdded += ElementAdded; schematic.Elements.ItemRemoved += ElementRemoved; // Create controls for all the elements already in the schematic. foreach (Circuit.Element i in schematic.Elements) ElementAdded(null, new Circuit.ElementEventArgs(i)); }
public SchematicControl(Circuit.Schematic Schematic) { InitializeComponent(); schematic = Schematic; schematic.Elements.ItemAdded += ElementAdded; schematic.Elements.ItemRemoved += ElementRemoved; // Create controls for all the elements already in the schematic. foreach (Circuit.Element i in schematic.Elements) { ElementAdded(null, new Circuit.ElementEventArgs(i)); } }
public SimulationSchematic(Circuit.Schematic Schematic) : base(Schematic) { InitializeComponent(); CommandBindings.Add(new CommandBinding(ApplicationCommands.Delete, Delete_Executed, Delete_CanExecute)); CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, SelectAll_Executed, SelectAll_CanExecute)); Focusable = true; Cursor = Cursors.Cross; Tool = new ProbeTool(this); int pad = Grid * 2; int align = Grid * 10; Circuit.Coord lb = Schematic.LowerBound; Circuit.Coord ub = Schematic.UpperBound; lb = Floor(lb - pad, align); ub = Ceiling(ub + pad, align); Width = ub.x - lb.x; Height = ub.y - lb.y; Origin = -lb; }
public LiveSimulation(Circuit.Schematic Simulate, Audio.Device Device, Audio.Channel[] Inputs, Audio.Channel[] Outputs) { try { InitializeComponent(); // Make a clone of the schematic so we can mess with it. Circuit.Schematic clone = Circuit.Schematic.Deserialize(Simulate.Serialize(), Log); clone.Elements.ItemAdded += OnElementAdded; clone.Elements.ItemRemoved += OnElementRemoved; Schematic = new SimulationSchematic(clone); Schematic.SelectionChanged += OnProbeSelected; // Build the circuit from the schematic. circuit = Schematic.Schematic.Build(Log); // Create the input and output controls. IEnumerable <Circuit.Component> components = circuit.Components; // Create audio input channels. for (int i = 0; i < Inputs.Length; ++i) { InputChannels.Add(new InputChannel(i) { Name = Inputs[i].Name }); } ComputerAlgebra.Expression speakers = 0; foreach (Circuit.Component i in components) { Circuit.Symbol S = i.Tag as Circuit.Symbol; if (S == null) { continue; } SymbolControl tag = (SymbolControl)S.Tag; if (tag == null) { continue; } // Create potentiometers. Circuit.IPotControl c = i as Circuit.IPotControl; if (c != null) { PotControl pot = new PotControl() { Width = 80, Height = 80, Opacity = 0.5, FontSize = 15, FontWeight = FontWeights.Bold, }; Schematic.overlays.Children.Add(pot); Canvas.SetLeft(pot, Canvas.GetLeft(tag) - pot.Width / 2 + tag.Width / 2); Canvas.SetTop(pot, Canvas.GetTop(tag) - pot.Height / 2 + tag.Height / 2); pot.Value = c.PotValue; pot.ValueChanged += x => { c.PotValue = x; UpdateSimulation(false); }; pot.MouseEnter += (o, e) => pot.Opacity = 0.95; pot.MouseLeave += (o, e) => pot.Opacity = 0.5; } // Create Buttons. Circuit.IButtonControl b = i as Circuit.IButtonControl; if (b != null) { Button button = new Button() { Width = tag.Width, Height = tag.Height, Opacity = 0.5, Background = Brushes.White, }; Schematic.overlays.Children.Add(button); Canvas.SetLeft(button, Canvas.GetLeft(tag)); Canvas.SetTop(button, Canvas.GetTop(tag)); button.Click += (o, e) => { // Click all the buttons in the group. foreach (Circuit.IButtonControl j in components.OfType <Circuit.IButtonControl>().Where(x => x.Group == b.Group)) { j.Click(); } UpdateSimulation(true); }; button.MouseEnter += (o, e) => button.Opacity = 0.95; button.MouseLeave += (o, e) => button.Opacity = 0.5; } Circuit.Speaker output = i as Circuit.Speaker; if (output != null) { speakers += output.V; } // Create input controls. Circuit.Input input = i as Circuit.Input; if (input != null) { tag.ShowText = false; ComboBox combo = new ComboBox() { Width = 80, Height = 24, Opacity = 0.5, IsEditable = true, SelectedValuePath = "Tag", }; foreach (InputChannel j in InputChannels) { combo.Items.Add(new ComboBoxItem() { Tag = j, Content = j.Name }); } Schematic.overlays.Children.Add(combo); Canvas.SetLeft(combo, Canvas.GetLeft(tag) - combo.Width / 2 + tag.Width / 2); Canvas.SetTop(combo, Canvas.GetTop(tag) - combo.Height / 2 + tag.Height / 2); ComputerAlgebra.Expression V = Circuit.Component.DependentVariable(input.Name, Circuit.Component.t); inputs[V] = new SignalChannel(0); combo.SelectionChanged += (o, e) => { if (combo.SelectedItem != null) { ComboBoxItem it = (ComboBoxItem)combo.SelectedItem; inputs[V] = new InputChannel(((InputChannel)it.Tag).Index); } }; combo.AddHandler(TextBox.KeyDownEvent, new KeyEventHandler((o, e) => { try { inputs[V] = new SignalChannel(Circuit.Quantity.Parse(combo.Text, Circuit.Units.V)); } catch (Exception) { // If there is an error in the expression, zero out the signal. inputs[V] = new SignalChannel(0); } })); if (combo.Items.Count > 0) { combo.SelectedItem = combo.Items[0]; } else { combo.Text = "0 V"; } combo.MouseEnter += (o, e) => combo.Opacity = 0.95; combo.MouseLeave += (o, e) => combo.Opacity = 0.5; } } // Create audio output channels. for (int i = 0; i < Outputs.Length; ++i) { OutputChannel c = new OutputChannel(i) { Name = Outputs[i].Name, Signal = speakers }; c.PropertyChanged += (o, e) => { if (e.PropertyName == "Signal") { RebuildSolution(); } }; OutputChannels.Add(c); } // Begin audio processing. if (Inputs.Any() || Outputs.Any()) { stream = Device.Open(ProcessSamples, Inputs, Outputs); } else { stream = new NullStream(ProcessSamples); } ContentRendered += (o, e) => RebuildSolution(); Closed += (s, e) => stream.Stop(); } catch (Exception Ex) { MessageBox.Show(Ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } }
public RemoveElements(Circuit.Schematic Target, IEnumerable <Circuit.Element> Elements) { Debug.Assert(Elements.Any()); target = Target; elements = Elements.ToList(); }
public AddElements(Circuit.Schematic Target, params Circuit.Element[] Elements) : this(Target, Elements.AsEnumerable()) { }