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; }; }
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; }