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));
     }
 }
Example #2
0
        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);
        }