Example #1
0
        private void SubscribeEventsToLineSerie(LineSeries seria)
        {
            int indexOfPointToMove = -1;

            seria.MouseDown += (s, e) =>
            {
                if (e.ChangedButton == OxyMouseButton.Right)
                {
                    if (e.IsControlDown)
                    {
                        int indexOfNearestPoint = (int)Math.Round(e.HitTestResult.Index);

                        if (indexOfNearestPoint == seria.Points.IndexOf(staticPoint))
                        {
                            e.Handled = true;
                            return;
                        }

                        var nearestPoint = seria.Transform(seria.Points[indexOfNearestPoint]);

                        if ((nearestPoint - e.Position).Length < 10)
                        {
                            seria.Points.RemoveAt(indexOfNearestPoint);
                            model.InvalidatePlot(false);
                        }
                    }
                }

                if (e.ChangedButton == OxyMouseButton.Left)
                {
                    int indexOfNearestPoint = (int)Math.Round(e.HitTestResult.Index);
                    var nearestPoint        = seria.Transform(seria.Points[indexOfNearestPoint]);

                    if (e.IsControlDown)
                    {
                        if ((nearestPoint - e.Position).Length < 10)
                        {
                            indexOfPointToMove = indexOfNearestPoint;
                        }
                        else
                        {
                            int i = (int)e.HitTestResult.Index + 1;
                            seria.Points.Insert(i, seria.InverseTransform(e.Position));
                            indexOfPointToMove = i;
                        }
                    }

                    seria.LineStyle = LineStyle.DashDot;

                    model.InvalidatePlot(false);

                    e.Handled = true;
                }
            };

            seria.MouseMove += (s, e) =>
            {
                if (indexOfPointToMove == seria.Points.IndexOf(staticPoint))
                {
                    e.Handled = true;
                    return;
                }

                if (indexOfPointToMove >= 0)
                {
                    //seria.Points[indexOfPointToMove] = new DataPoint(seria.InverseTransform(e.Position).X, seria.InverseTransform(e.Position).Y);
                    seria.Points[indexOfPointToMove] = new DataPoint(oceanicFunc(seria.InverseTransform(e.Position).Y), seria.InverseTransform(e.Position).Y);
                    model.InvalidatePlot(false);
                    e.Handled = true;
                }
            };

            seria.MouseUp += (s, e) =>
            {
                indexOfPointToMove = -1;
                seria.LineStyle    = LineStyle.Solid;
                model.InvalidatePlot(false);
                e.Handled = true;
            };
        }
Example #2
0
        public GeothermWindow()
        {
            InitializeComponent();

            model = new PlotModel();

            axeH = new LinearAxis
            {
                Title    = "Температура (°C)",
                Position = AxisPosition.Top,
                //StartPosition = 1,
                //EndPosition = 0,
                Key                = "xAxis",
                Maximum            = 1500,
                AbsoluteMaximum    = 2200,
                AbsoluteMinimum    = -5,
                MajorGridlineStyle = LineStyle.Solid
                                     // MinorGridlineStyle = LineStyle.Dash
            };

            axeT = new LinearAxis
            {
                Title              = "Глубина (м)",
                Position           = AxisPosition.Left,
                Key                = "yAxis",
                StartPosition      = 1,
                EndPosition        = 0,
                Maximum            = MAX_DEPTH,
                AbsoluteMaximum    = MAX_DEPTH,
                AbsoluteMinimum    = -10000,
                MajorGridlineStyle = LineStyle.Solid
                                     //MinorGridlineStyle = LineStyle.Dash
            };

            model.LegendPosition = LegendPosition.BottomLeft;

            model.Axes.Add(axeT);
            model.Axes.Add(axeH);

            mantleSeries = new LineSeries();
            mantleSeries.Points.Add(new DataPoint(1320, 0));
            mantleSeries.Points.Add(new DataPoint(1493, MAX_DEPTH));
            mantleSeries.Title           = "Мантийная адиабата";
            mantleSeries.Color           = OxyColors.Purple;
            mantleSeries.StrokeThickness = 3;


            _continentalCrustSeries = new LineSeries();
            _continentalCrustSeries.Points.Add(new DataPoint(0, 0));
            _continentalCrustSeries.Points.Add(new DataPoint(Tc, Hc));
            _continentalCrustSeries.Color           = OxyColors.Gray;
            _continentalCrustSeries.StrokeThickness = 3;

            _continentalSeries = new LineSeries();
            _continentalSeries.Points.Add(new DataPoint(Tc, Hc));
            _continentalSeries.Points.Add(new DataPoint(1300, 160000));
            _continentalSeries.Title           = "Континентальная геотерма";
            _continentalSeries.Color           = _continentalCrustSeries.Color;
            _continentalSeries.StrokeThickness = 3;

            #region события перетаскивания мантийной адиабаты

            mantleSeries.MouseDown += (sender, args) =>
            {
                if (args.ChangedButton == OxyMouseButton.Left && args.IsControlDown)
                {
                    _dragPoint = mantleSeries.InverseTransform(args.Position);
                    _startPt1  = mantleSeries.Points[0];
                    _startPt2  = mantleSeries.Points[1];
                    GeothermsPlotView.Cursor = Cursors.Hand;
                    args.Handled             = true;
                }
            };

            mantleSeries.MouseMove += (sender, args) =>
            {
                if (_dragPoint.IsDefined() && args.IsControlDown)
                {
                    var curPos = mantleSeries.InverseTransform(args.Position);

                    var m0 = _startPt1.X + (curPos.X - _dragPoint.X);

                    if (m0 >= MIN_MANTLE_T && m0 <= MAX_MANTLE_T)
                    {
                        mantleSeries.Points[0] = new DataPoint(m0, mantleSeries.Points[0].Y);
                        mantleSeries.Points[1] = new DataPoint(_startPt2.X + (curPos.X - _dragPoint.X), mantleSeries.Points[1].Y);

                        model.InvalidatePlot(false);
                    }

                    args.Handled = true;
                    return;
                }
                GeothermsPlotView.Cursor = Cursors.Arrow;
                args.Handled             = true;
            };

            mantleSeries.MouseUp += (sender, args) =>
            {
                _dragPoint               = DataPoint.Undefined;
                args.Handled             = true;
                GeothermsPlotView.Cursor = Cursors.Arrow;

                //var tm = mantleSeries.Points[1].X - 105;
                //oceanicFunc = y => MathNet.Numerics.SpecialFunctions.Erf((y / (2 * Math.Sqrt(1e-6 * 4e7 * 365 * 24 * 60 * 60)))) * tm;
                //Func<double, double> yFunc = d => d;

                //model.Series.Remove(oceanicSerie);
                //oceanicSerie = new FunctionSeries(oceanicFunc, yFunc, 0, 400000, 1000, "Океаническая кривая");
                //model.Series.Insert(0, oceanicSerie);
                //model.InvalidatePlot(false);

                AdjustGeothermToMantle();
                ContinueContinentToAdiabate();
            };

            #endregion

            #region События перетаскивания континентальной геотермы

            _continentalSeries.MouseDown += (sender, args) =>
            {
                if (args.IsControlDown)
                {
                    _dragPoint   = _continentalSeries.InverseTransform(args.Position);
                    _startPt2    = _continentalSeries.Points[1];
                    args.Handled = true;
                }
            };

            _continentalSeries.MouseMove += (sender, args) =>
            {
                if (_dragPoint.IsDefined() && args.IsControlDown)
                {
                    if (_continentalSeries.Points.Count > 2)
                    {
                        _continentalSeries.Points.RemoveAt(2);
                    }

                    var curPos = mantleSeries.InverseTransform(args.Position);

                    _continentalSeries.Points[1] = new DataPoint(_continentalSeries.Points[1].X, _startPt2.Y + (curPos.Y - _dragPoint.Y));

                    model.InvalidatePlot(false);

                    args.Handled = true;
                    return;
                }
                GeothermsPlotView.Cursor = Cursors.Arrow;
                args.Handled             = true;
            };

            _continentalSeries.MouseUp += (sender, args) =>
            {
                _dragPoint = DataPoint.Undefined;
                ContinueContinentToAdiabate();
                GeothermsPlotView.Cursor = Cursors.Arrow;
                args.Handled             = true;
            };

            #endregion

            GeothermsPlotView.Model = model;
        }