Files
DynamicDataDisplay/Backup/Charts/Isolines/AdditionalLinesRenderer.cs
2024-02-23 09:29:44 -05:00

88 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media;
using System.Windows;
using System.Windows.Data;
using System.Diagnostics;
namespace Microsoft.Research.DynamicDataDisplay.Charts.Isolines
{
public class AdditionalLinesRenderer : IsolineRenderer
{
protected override void CreateUIRepresentation()
{
InvalidateVisual();
}
protected override void OnPlotterAttached()
{
base.OnPlotterAttached();
FrameworkElement parent = (FrameworkElement)Parent;
var renderer = (FrameworkElement)parent.FindName("PART_IsolineRenderer");
Binding contentBoundsBinding = new Binding { Path = new PropertyPath("(0)", Viewport2D.ContentBoundsProperty), Source = renderer };
SetBinding(Viewport2D.ContentBoundsProperty, contentBoundsBinding);
SetBinding(ViewportPanel.ViewportBoundsProperty, contentBoundsBinding);
Plotter2D.Viewport.EndPanning += Viewport_EndPanning;
Plotter2D.Viewport.PropertyChanged += Viewport_PropertyChanged;
}
void Viewport_PropertyChanged(object sender, ExtendedPropertyChangedEventArgs e)
{
if (e.PropertyName == "Visible")
{
if (Plotter2D.Viewport.PanningState == Viewport2DPanningState.NotPanning)
InvalidateVisual();
}
}
protected override void OnPlotterDetaching()
{
Plotter2D.Viewport.EndPanning -= Viewport_EndPanning;
Plotter2D.Viewport.PropertyChanged -= Viewport_PropertyChanged;
base.OnPlotterDetaching();
}
private void Viewport_EndPanning(object sender, EventArgs e)
{
InvalidateVisual();
}
protected override void OnRender(DrawingContext drawingContext)
{
if (Plotter2D == null) return;
if (DataSource == null) return;
var collection = (IsolineCollection)Parent.GetValue(IsolineCollectionProperty);
if (collection == null) return;
var bounds = ViewportPanel.GetViewportBounds(this);
if (bounds.IsEmpty) return;
var dc = drawingContext;
var strokeThickness = StrokeThickness;
var transform = Plotter2D.Transform.WithRects(bounds, new Rect(RenderSize));
//dc.DrawRectangle(null, new Pen(Brushes.Green, 2), new Rect(RenderSize));
var additionalLevels = GetAdditionalLevels(collection);
IsolineBuilder.DataSource = DataSource;
var additionalIsolineCollections = additionalLevels.Select(level =>
{
return IsolineBuilder.BuildIsoline(level);
});
foreach (var additionalCollection in additionalIsolineCollections)
{
RenderIsolineCollection(dc, strokeThickness, additionalCollection, transform);
}
}
}
}