private Canvas ProbeView(CircuitSymbol symbol) { if (symbol == this.circuitSymbol[0]) { return((Canvas)this.circuitSymbol[0].ProbeView); } else { DisplayCanvas canvas = (DisplayCanvas)symbol.Glyph; return((Canvas)canvas.DisplayOf(this.circuitSymbol)); } }
public FrameworkElement DisplayOf(IList <CircuitSymbol> symbol) { FrameworkElement glyph = null; int index = symbol.Count - 1; while (0 <= index && !this.symbolMap.TryGetValue(symbol[index], out glyph)) { index--; } Tracer.Assert(0 <= index && glyph != null); DisplayCanvas canvas = this; while (0 < index) { canvas = (DisplayCanvas)canvas.symbolMap[symbol[index]]; index--; } return(canvas.symbolMap[symbol[0]]); }
public FrameworkElement CreateDisplayGlyph(CircuitGlyph mainSymbol) { Tracer.Assert(mainSymbol != null); List <CircuitSymbol> list = ((LogicalCircuit)this.Circuit).CircuitSymbols().Where(s => s.Circuit.IsValidDisplay()).ToList(); GridPoint offset = Symbol.GridPoint(list.Select(s => s.Bounds()).Aggregate((r1, r2) => Rect.Union(r1, r2)).TopLeft); DisplayCanvas canvas = this.CreateDisplayCanvas(mainSymbol); if (this == mainSymbol) { Border border = Symbol.Skin <Border>(SymbolShape.DisplayBackground); border.Width = canvas.Width; border.Height = canvas.Height; canvas.Children.Add(border); CircuitGlyph.AddJam(canvas, this.Left, (j, t) => { Canvas.SetLeft(t, Symbol.PinRadius); Canvas.SetTop(t, Symbol.ScreenPoint(j.Y) - 2 * Symbol.PinRadius); }); CircuitGlyph.AddJam(canvas, this.Top, (j, t) => { Canvas.SetLeft(t, Symbol.ScreenPoint(j.X) - Symbol.PinRadius); Canvas.SetTop(t, Symbol.PinRadius); }); CircuitGlyph.AddJam(canvas, this.Right, (j, t) => { Canvas.SetRight(t, Symbol.PinRadius); Canvas.SetTop(t, Symbol.ScreenPoint(j.Y) - 2 * Symbol.PinRadius); }); CircuitGlyph.AddJam(canvas, this.Bottom, (j, t) => { Canvas.SetLeft(t, Symbol.ScreenPoint(j.X) - Symbol.PinRadius); Canvas.SetBottom(t, Symbol.PinRadius); }); border = Symbol.Skin <Border>(SymbolShape.DisplayBorder); border.Width = canvas.Width; border.Height = canvas.Height; Panel.SetZIndex(border, int.MaxValue - 1); canvas.Children.Add(border); } foreach (CircuitSymbol symbol in list) { FrameworkElement display = symbol.Circuit.CreateDisplay(symbol, mainSymbol); Canvas.SetLeft(display, Symbol.ScreenPoint(symbol.X - offset.X)); Canvas.SetTop(display, Symbol.ScreenPoint(symbol.Y - offset.Y)); display.RenderTransformOrigin = Symbol.RotationCenter(symbol.Circuit.SymbolWidth, symbol.Circuit.SymbolHeight); RotateTransform rotation = (RotateTransform)display.RenderTransform; rotation.Angle = Symbol.Angle(symbol.Rotation); canvas.AddDisplay(symbol, display); } return(canvas); }