コード例 #1
0
        public MainWindow()
        {
            InitializeComponent();

            DrawParam.StartX = 50;
            DrawParam.StartY = 15;

            DrawParam.UnitX         = 10;
            DrawParam.UnitY         = 30;
            DrawParam.Margin        = 10;
            DrawParam.VerticalSpace = 12;
            DrawParam.MarkHeight    = 6;

            MarkerDrawer.Canvas          = myCanvas;
            TimingCharacterDrawer.Canvas = myCanvas;

            _markerDrawer = new MarkerDrawer();

            _timingDatas = null;

            Messenger.Default.Register <MessageToken>(this, (item) =>
            {
                switch (item.TokenType)
                {
                case MessageTokenType.UpdateTimingDiagram:
                    DrawTiming(myCanvas);
                    break;

                case MessageTokenType.CopyToClipboard:
                    GraphicHelper.CopyUiElementToClipboard(myCanvas);
                    break;

                case MessageTokenType.SaveBitmap:
                    var dlg = new SaveFileDialog()
                    {
                        Filter = "Png files (*.png)|*.png"
                    };

                    if (dlg.ShowDialog() == false)
                    {
                        return;
                    }

                    GraphicHelper.CreateSaveBitmap(myCanvas, dlg.FileName);
                    break;
                }
            });
        }
コード例 #2
0
        public void DrawMarker(int _lineIndex)
        {
            _labelIndex = new List <int>();

            for (var index = 0; index < _timingMap.Timing.Length; index++)
            {
                if (_timingMap.Timing[index] == '|')
                {
                    _labelIndex.Add(index);
                }
            }

            var xIndex         = 0;
            var labelIndexChar = 0;

            foreach (var i in _labelIndex)
            {
                var verticalLine = new Line();

                verticalLine.StrokeDashArray = new DoubleCollection(new double[] { 1, 2 });
                verticalLine.StrokeThickness = 2;
                verticalLine.Stroke          = Brushes.Green;

                verticalLine.X1 = DrawParam.StartX + i * DrawParam.UnitX;
                verticalLine.X2 = verticalLine.X1;

                verticalLine.Y1 = 10;
                verticalLine.Y2 = 10 + (_lineIndex * (DrawParam.UnitY + DrawParam.VerticalSpace));

                var c = Convert.ToChar(labelIndexChar++ + 97);

                GraphicHelper.DrawText(
                    Canvas,
                    c.ToString(),
                    new Point(verticalLine.X1 - 2, verticalLine.Y1 + 5),
                    12,
                    HorizontalAlignment.Left,
                    Brushes.Green);

                Canvas.Children.Add(verticalLine);
            }
        }
コード例 #3
0
        public void Draw()
        {
            // draw symbol
            GraphicHelper.DrawText(
                Canvas,
                _timingMap.Symbol,
                new Point(0, DrawParam.StartY + (_lineIndex * DrawParam.UnitY)),
                14,
                HorizontalAlignment.Left,
                Brushes.Green);

            // draw elements
            var xIndex = 0;

            foreach (var element in _timingMap.Elements)
            {
                if (element == null)
                {
                    continue;
                }

                // re calc reference point
                element.TopLeftPoint = new Point(
                    DrawParam.StartX + (xIndex * DrawParam.UnitX),
                    DrawParam.StartY + (_lineIndex * DrawParam.UnitY));

                // get line data and draw out
                foreach (var myLine in element.Lines)
                {
                    var line = new Line
                    {
                        Stroke          = Brushes.Black,
                        StrokeThickness = 2,

                        X1 = myLine.StartPoint.X,
                        Y1 = myLine.StartPoint.Y,

                        X2 = myLine.EndPoint.X,
                        Y2 = myLine.EndPoint.Y
                    };

                    if (element.Char != string.Empty)
                    {
                        GraphicHelper.DrawText(
                            Canvas,
                            element.Char,
                            new Point(element.TopLeftPoint.X,
                                      element.TopLeftPoint.Y),
                            14,
                            HorizontalAlignment.Center,
                            Brushes.Black);
                    }

                    Canvas.Children.Add(line);
                }
                xIndex++;
            }

            // 畫出連接線
            for (int i = 1; i < _timingMap.Timing.Length; i++)
            {
                var ch1 = _timingMap.Timing[i - 1];
                var ch2 = _timingMap.Timing[i];

                if (ch1 == ch2)
                {
                    continue;
                }

                if (ch1 == '*' || ch2 == '*')
                {
                    continue;
                }
                if (ch1 == ':' || ch2 == ':')
                {
                    continue;
                }
                if (ch1 == '<' || ch2 == '<')
                {
                    continue;
                }

                if (_timingMap.Elements[i - 1] == null ||
                    _timingMap.Elements[i] == null)
                {
                    continue;
                }

                if (_timingMap.Elements[i - 1].Lines == null)
                {
                    continue;
                }

                if (_timingMap.Elements[i - 1].Lines.Count < 1)
                {
                    continue;
                }

                if (_timingMap.Elements[i].Lines == null)
                {
                    continue;
                }

                if (_timingMap.Elements[i].Lines.Count < 1)
                {
                    continue;
                }

                var line = new Line
                {
                    Stroke          = Brushes.Black,
                    StrokeThickness = 2,

                    X1 = _timingMap.Elements[i - 1].Lines[0].EndPoint.X,
                    Y1 = _timingMap.Elements[i - 1].Lines[0].EndPoint.Y,

                    X2 = _timingMap.Elements[i].Lines[0].StartPoint.X,
                    Y2 = _timingMap.Elements[i].Lines[0].StartPoint.Y
                };

                Canvas.Children.Add(line);
            }
        }
コード例 #4
0
        private void DrawTiming(Canvas canvas)
        {
            canvas.Children.Clear();

            _timingDatas = TimingMapParser.Parse(txtData.Text);

            InitDrawParam();

            // determine the maximum width from all symbols
            var max = 0.0;

            foreach (var timingData in _timingDatas)
            {
                var x = GraphicHelper.MeasureTextWidth(timingData.Symbol, 14);
                if (max < x)
                {
                    max = x;
                }
            }

            // ensure we draw behind symbol
            DrawParam.StartX = (int)max;

            // determine the width of entire diagram
            max = 0;
            foreach (var timingData in _timingDatas)
            {
                if (max < (int)timingData.Timing.Length)
                {
                    max = (int)timingData.Timing.Length;
                }
            }

            // re-calculate the size of canvas
            canvas.Width  = DrawParam.StartX + (max * DrawParam.UnitX) + (DrawParam.Margin * 2);
            canvas.Height = _timingDatas.Count * (DrawParam.UnitY + DrawParam.VerticalSpace) + DrawParam.StartY;

            _markerDrawer.Draw((int)max);

            var lineIndex = 0;

            TimingCharacterDrawer marker = null;

            // draw content
            foreach (var timingMap in _timingDatas)
            {
                var drawer = new TimingCharacterDrawer(lineIndex, timingMap);

                if (drawer.IsMarker() == true)
                {
                    marker = drawer;

                    lineIndex++;
                    continue;
                }

                drawer.Draw();

                lineIndex++;
                DrawParam.StartY += DrawParam.VerticalSpace;
            }

            if (marker != null)
            {
                marker.DrawMarker(lineIndex);
            }
        }