Пример #1
0
        private void OnTimeDataSourceChanged()
        {
            var source = TimeDataSource as NotifingCollection <DateTime>;

            TimeLineSource.Clear();

            if (source != null)
            {
                source.CollectionChangedObservable.
                Where(eve => eve.EventArgs.Action == NotifyCollectionChangedAction.Add)
                .Select(eve => eve.EventArgs.NewItems.Cast <DateTime>())
                .Subscribe(dateTimeCollection =>
                {
                    dateTimeCollection.ToObservable()
                    .Select(date => date.Subtract(TimeSpan.FromSeconds(date.Second)))
                    .Where(date => !TimeLineSource.Any() || TimeLineSource.LastOrDefault().Date.Equals(date) == false)
                    .Subscribe(date =>
                    {
                        TimeLineSource.Add(new ChartTimeBlock()
                        {
                            Date = date
                        });
                    });
                });

                if (source.Any())
                {
                    var startingTime  = source.Min();
                    var endTime       = source.Max();
                    int timeDiffernce = (int)endTime.Subtract(startingTime).TotalMinutes + 1;

                    // Set the timeline
                    TimeLineSource = new TimeAxisSource(
                        Enumerable.Range(0, timeDiffernce)
                        .Select(index => new ChartTimeBlock()
                    {
                        Date = new DateTime(startingTime.Year,
                                            startingTime.Month,
                                            startingTime.Day,
                                            startingTime.Hour,
                                            startingTime.Minute, 0)
                               .AddMinutes(index),
                        CanShowDate = index == 0
                    }));
                }
            }
        }
Пример #2
0
        private void OnSourceChanged(IEnumerable newSource)
        {
            var source = newSource as ChartLineCollection;

            if (source == null)
            {
                return;
            }
            HorizontalAxisSource.Clear();

            source.CollectionChangedObservable
            .Where(eve => eve.EventArgs.Action == NotifyCollectionChangedAction.Add)
            .SelectMany(eve => eve.EventArgs.NewItems.Cast <IChartLine>())
            .Where(line => line != null && line.Any() && TimeLineSource.Any())
            .Subscribe(line =>
            {
                HorizontalAxisSource.Add(new ChartLine(
                                             line.PinName,
                                             line.Select(point => new ChartPoint(
                                                             point.Value,
                                                             point.TimeStamp,
                                                             GetDisplayPoint(point))
                {
                    PinName = point.PinName, PinType = point.PinType
                }),
                                             line.LineColor));
            });

            source.CollectionChangedObservable
            .Where(eve => eve.EventArgs.Action == NotifyCollectionChangedAction.Remove &&
                   HorizontalAxisSource.Any())
            .Select(eve => eve.EventArgs.OldStartingIndex)
            .Subscribe(index =>
            {
                var element = HorizontalAxisSource.ElementAt(index);
                if (element != null)
                {
                    HorizontalAxisSource.Remove(element);
                }
            });
        }
Пример #3
0
        private Point GetDisplayPoint(IChartPoint chartPoint)
        {
            if (VerticalAxis == null || TimeLineSource == null)
            {
                return(new Point());
            }

            var ration = (Math.Abs(chartPoint.Value) * VerticalAxis.PointToPixelRatio) / VerticalAxis.MiniTick;
            var pointY = chartPoint.Value < 0 ?
                         VerticalAxis.ZeroPosition + ration :
                         VerticalAxis.ZeroPosition - ration;
            var pointX = TimeLineSource.GetPositionOfMinute(chartPoint.TimeStamp);

            // if the point is out of tollerance give it a new Y coordinate
            if (Math.Abs(chartPoint.Value) > VerticalAxis.ErrorTolerance)
            {
                pointY = chartPoint.Value > 0 ?
                         VerticalAxis.LinesSource.FirstOrDefault().Top - 30 : // bellow the button red line
                         VerticalAxis.LinesSource.FirstOrDefault().Top + 30;  // above the top red line
            }
            return(new Point(pointX, pointY));
        }