Пример #1
0
        private static void OxyPlotViewAxesChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
        {
            ViewOxyPlotChart control = null;

            try
            {
                if (e.NewValue != null && e.NewValue != e.OldValue)
                {
                    control = source as ViewOxyPlotChart;
                    control.OxyPlotView.Axes.Clear();
                    control.ConstructPlot();
                }
            }
            catch (Exception ex)
            {
                DllEntryPoint.LogMessage(Xvue.MSOT.Services.Log.EnumLogType.Warning, "Exception", $"{control.Name}: Exception updating axes: '{ex.Message}'.");
            }
        }
Пример #2
0
        private static void PlotViewStyleChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
        {
            ViewOxyPlotChart control = null;

            try
            {
                if (e.NewValue != e.OldValue)
                {
                    control = source as ViewOxyPlotChart;
                    control.OxyPlotView.Style = e.NewValue as Style;
                    //System.Diagnostics.Debug.WriteLine($"{control.Name}: PlotView Style updated.");
                }
            }
            catch (Exception ex)
            {
                DllEntryPoint.LogMessage(Xvue.MSOT.Services.Log.EnumLogType.Warning, "Exception", $"{control.Name}: Exception PlotView style: '{ex.Message}'.");
            }
        }
Пример #3
0
        private void constructMultiSetAxes()
        {
            for (int k = 0; k < OxyPlotView.Axes.Count; k++)
            {
                Axis _axisModel = (Axis)Activator.CreateInstance((OxyPlotView.Axes[k].CreateModel()).GetType());
                System.Reflection.MethodInfo mi = _axisModel.GetType().GetMethod("ToDouble");
                switch (MultifunctionalChartData.AxesPositions[k])
                {
                case AxisPosition.Left:
                    if (ChartData.MaximumY != null)
                    {
                        AbsoluteMaximumY = Convert.ToDouble(mi == null ? ChartData.MaximumY : mi.Invoke(_axisModel, new object[] { ChartData.MaximumY }));
                    }
                    if (ChartData.MinimumY != null)
                    {
                        AbsoluteMinimumY = Convert.ToDouble(mi == null ? ChartData.MinimumY : mi.Invoke(_axisModel, new object[] { ChartData.MinimumY }));
                    }
                    break;

                case AxisPosition.Bottom:
                    if (ChartData.MaximumX != null)
                    {
                        AbsoluteMaximumX = Convert.ToDouble(mi == null ? ChartData.MaximumX : mi.Invoke(_axisModel, new object[] { ChartData.MaximumX }));
                    }
                    if (ChartData.MinimumX != null)
                    {
                        AbsoluteMinimumX = Convert.ToDouble(mi == null ? ChartData.MinimumX : mi.Invoke(_axisModel, new object[] { ChartData.MinimumX }));
                    }
                    break;

                default:
                    DllEntryPoint.LogMessage(Xvue.MSOT.Services.Log.EnumLogType.Info, "Warning", $"{Name}.contructMultipleLineSeries: Axis # {(k + 1)}: Unhandled AxisPosition: {Convert.ToString(MultifunctionalChartData.AxesPositions[k])}");
                    break;
                }
            }
        }
        void updatePosition()
        {
            try
            {
                prepareMinMax();
                updateTopLine();

                if (!double.IsNaN(_h1) && !double.IsNaN(_h2))
                {
                    double diff = prepareScalingLines();

                    double horizontalBorderWidth = 1;

                    if (viewbox.ActualHeight == 0)
                    {
                        viewbox.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                        viewbox.Arrange(new Rect(0, 0, this.ActualWidth, this.ActualHeight / 2));
                    }

                    //calculate gauge zoom by viewbox control, so as to set border top/bottom width
                    if (viewbox.ActualHeight > 0)
                    {
                        horizontalBorderWidth = double.IsNaN(PART_gauge.Height / viewbox.ActualHeight) ? 1 : (PART_gauge.Height / viewbox.ActualHeight);
                    }

                    updateTrianglesPosition(horizontalBorderWidth, diff);
                    //border0Rect.StrokeDashArray = new DoubleCollection() { 1, 1 };
                    //border0Rect.StrokeThickness =  10;
                    //PART_image_values.BorderThickness = new Thickness(1, h1/100.0, 1, h1/100.0);

                    PART_scaling_values.Height = _h2;

                    if (UseLogarithmic)
                    {
                        _markers = LogarithmicMarkers;
                    }
                    else
                    {
                        _markers = NonLogarithmicMarkers;
                    }

                    updateScalingLines(horizontalBorderWidth);
                }
                //Scaling Range
                //this.tooltipInfo.Content
                //if (IsEnabled)
                //    this.viewbox.ToolTip = "Image Data: [" + minimumData.ToString("E3") + "]/[" + layerMax.ToString("E3") + "]" +
                //                           "\nScaling : [" + scaleMin.ToString("E3") + "]/[" + scaleMax.ToString("E3") + "]";
                //else
                //    this.viewbox.ToolTip = "Image Data: [" + minimumData.ToString("E3") + "]/[" + layerMax.ToString("E3") + "]";

                refreshViewBoxToolTip();

                //Xvue.MSOT.ViewModels.Log.ViewModelLog.MsotTrace(
                //    "ImageMax: " + ImageMax +
                //    ", ImageMin: "+ ImageMin +
                //    ", ScaleMax: " + ScaleMax +
                //    ", ScaleMin: "+ ScaleMin +
                //    ", Viewbox : "+ viewbox.ActualHeight +
                //    ", Gauge: " + PART_gauge.ActualHeight
                //, this.GetType().ToString());
            }
            catch (Exception ex)
            {
                DllEntryPoint.LogMessage(Xvue.MSOT.Services.Log.EnumLogType.Warning, "ViewScalingGaugeSimple:updatePosition", ex.Message);
            }
        }
Пример #5
0
        private void setAxesLimits()
        {
            // Set Axes limits if not defined via styling
            for (int i = 0; i < OxyPlotView.Axes.Count; i++)
            {
                bool   isMajorStepStyled = false, isAbsoluteMinimumStyled = false, isAbsoluteMaximumStyled = false;
                double currentAbsoluteMaximum = 0, currentAbsoluteMinimum = 0, extremumOffset = 0;
                IEnumerable <Setter> axisStyleSetters = null;

                if (ShowGridLines)
                {
                    OxyPlotView.Axes[i].SetCurrentValue(OxyPlot.Wpf.Axis.MajorGridlineStyleProperty, LineStyle.Solid);
                    OxyPlotView.Axes[i].SetCurrentValue(OxyPlot.Wpf.Axis.MinorGridlineStyleProperty, LineStyle.Dot);
                }

                if (OxyPlotView.Axes[i].Style != null)
                {
                    axisStyleSetters = OxyPlotView.Axes[i].Style.Setters.OfType <Setter>();
                }

                if (axisStyleSetters != null)
                {
                    isMajorStepStyled       = axisStyleSetters.Where(X => X.Property.Name == "MajorStep").Any();
                    isAbsoluteMinimumStyled = axisStyleSetters.Where(X => X.Property.Name == "AbsoluteMinimum").Any();
                    isAbsoluteMaximumStyled = axisStyleSetters.Where(X => X.Property.Name == "AbsoluteMaximum").Any();
                }

                switch (OxyPlotView.Axes[i].Position)
                {
                case AxisPosition.Bottom:
                    currentAbsoluteMaximum = AbsoluteMaximumX;
                    currentAbsoluteMinimum = AbsoluteMinimumX;

                    if (currentAbsoluteMaximum == currentAbsoluteMinimum)
                    {
                        extremumOffset = 1;
                    }
                    else
                    {
                        extremumOffset = (currentAbsoluteMaximum - currentAbsoluteMinimum) * 0.05;
                    }
                    break;

                case AxisPosition.Left:
                    currentAbsoluteMaximum = AbsoluteMaximumY;
                    currentAbsoluteMinimum = AbsoluteMinimumY;

                    if (currentAbsoluteMaximum == currentAbsoluteMinimum)
                    {
                        extremumOffset = (currentAbsoluteMaximum == 0 ? 1 : currentAbsoluteMaximum * 0.05);
                        break;
                    }

                    if (!isMajorStepStyled)     // Y-Axis major step calculation based on the number of steps (nSteps defined below)
                    {
                        int    nSteps    = 10;
                        double step      = (currentAbsoluteMaximum - currentAbsoluteMinimum) / nSteps;
                        double logStep   = Math.Log10(step);
                        int    precision = (int)(logStep < 0 ? -logStep + 1 : 0);  // For rounding to first non-zero decimal ...
                        OxyPlotView.Axes[i].SetCurrentValue(OxyPlot.Wpf.Axis.MajorStepProperty, Math.Round(step, precision));
                    }

                    extremumOffset = OxyPlotView.Axes[i].MajorStep / 5;
                    break;

                default:
                    DllEntryPoint.LogMessage(Xvue.MSOT.Services.Log.EnumLogType.Info, "Warning", $"{Name}.setAxesLimits: Axis # {(i + 1)}: Unhandled AxisPosition: {Convert.ToString(MultifunctionalChartData.AxesPositions[i])}");
                    return;
                }

                if (!isAbsoluteMinimumStyled)
                {
                    OxyPlotView.Axes[i].SetCurrentValue(OxyPlot.Wpf.Axis.AbsoluteMinimumProperty, currentAbsoluteMinimum - extremumOffset);
                }

                OxyPlotView.Axes[i].SetCurrentValue(OxyPlot.Wpf.Axis.MinimumProperty, OxyPlotView.Axes[i].AbsoluteMinimum);

                if (!isAbsoluteMaximumStyled)
                {
                    OxyPlotView.Axes[i].SetCurrentValue(OxyPlot.Wpf.Axis.AbsoluteMaximumProperty, currentAbsoluteMaximum + extremumOffset);
                }

                OxyPlotView.Axes[i].SetCurrentValue(OxyPlot.Wpf.Axis.MaximumProperty, OxyPlotView.Axes[i].AbsoluteMaximum);
            }
        }
Пример #6
0
        private void contructMultipleLineSeries(Style _series_style)
        {
            constructMultiSetAxes();

            bool initExtremes = true;

            // For each line series in the ViewModel
            foreach (MultifunctionalChartLineData line in ChartData.LinesData)
            {
                OxyPlot.Wpf.LineSeries _wpf_series = new OxyPlot.Wpf.LineSeries();
                LineSeries             _series     = (LineSeries)_wpf_series.CreateModel();

                foreach (ChartPoint cp in line.LinePoints)
                {
                    if (cp.X == null || cp.Y == null)
                    {
                        _series.Points.Add(DataPoint.Undefined);
                    }
                    else
                    {
                        DataPoint dp = new DataPoint();
                        for (int k = 0; k < OxyPlotView.Axes.Count; k++)
                        {
                            Axis _axisModel = (Axis)Activator.CreateInstance((OxyPlotView.Axes[k].CreateModel()).GetType());
                            System.Reflection.MethodInfo mi = _axisModel.GetType().GetMethod("ToDouble");
                            switch (MultifunctionalChartData.AxesPositions[k])
                            {
                            case AxisPosition.Left:
                                dp.Y = Convert.ToDouble(mi == null ? cp.Y : mi.Invoke(_axisModel, new object[] { cp.Y }));
                                break;

                            case AxisPosition.Bottom:
                                dp.X = Convert.ToDouble(mi == null ? cp.X : mi.Invoke(_axisModel, new object[] { cp.X }));
                                break;

                            default:
                                DllEntryPoint.LogMessage(Xvue.MSOT.Services.Log.EnumLogType.Info, "Warning", $"{Name}.contructMultipleLineSeries: Axis # {(k + 1)}: Unhandled AxisPosition: {Convert.ToString(MultifunctionalChartData.AxesPositions[k])}");
                                break;
                            }
                        }
                        _series.Points.Add(dp);
                        if (initExtremes)
                        {
                            if (ChartData.MinimumX == null)
                            {
                                AbsoluteMinimumX = dp.X;
                            }
                            if (ChartData.MaximumX == null)
                            {
                                AbsoluteMaximumX = dp.X;
                            }
                            if (ChartData.MinimumY == null)
                            {
                                AbsoluteMinimumY = dp.Y;
                            }
                            if (ChartData.MaximumY == null)
                            {
                                AbsoluteMaximumY = dp.Y;
                            }

                            /* Currently not implemented
                             * AbsoluteMinimumZ = dp.Z;
                             * AbsoluteMaximumZ = dp.Z;
                             */
                            initExtremes = false;
                        }
                        else
                        {
                            if (dp.X < AbsoluteMinimumX)
                            {
                                AbsoluteMinimumX = dp.X;
                            }
                            if (dp.X > AbsoluteMaximumX)
                            {
                                AbsoluteMaximumX = dp.X;
                            }
                            if (dp.Y < AbsoluteMinimumY)
                            {
                                AbsoluteMinimumY = dp.Y;
                            }
                            if (dp.Y > AbsoluteMaximumY)
                            {
                                AbsoluteMaximumY = dp.Y;
                            }

                            /* Currently not implemented
                             * if (_Z < AbsoluteMinimumZ) { AbsoluteMinimumY = _Z; }
                             * if (_Z > AbsoluteMaximumZ) { AbsoluteMaximumY = _Z; }
                             */
                        }
                    }
                }
                OxyPlotView.Series.Add(_wpf_series);
                // Style DependencyProperty has to be defined always after adding the series to the view
                if (_series_style != null)
                {
                    _wpf_series.SetCurrentValue(StyleProperty, _series_style);
                }
                _wpf_series.SetCurrentValue(OxyPlot.Wpf.LineSeries.MarkerStrokeProperty, line.Color);
                _wpf_series.SetCurrentValue(OxyPlot.Wpf.Series.ColorProperty, line.Color);
                _wpf_series.SetCurrentValue(OxyPlot.Wpf.LineSeries.MarkerFillProperty, line.Color);
                _wpf_series.SetCurrentValue(OxyPlot.Wpf.Series.TitleProperty, line.Name);
            }
        }