C# SCADA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 lines
8.6 KiB

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using DataService;
using Microsoft.Research.DynamicDataDisplay;
using Microsoft.Research.DynamicDataDisplay.Charts;
using Microsoft.Research.DynamicDataDisplay.DataSources;
namespace CoreTest
{
/// <summary>
/// Interaction logic for DynamicChart.xaml
/// </summary>
public partial class Trend : Window
{
int SMALLTICK = 10;
int LARGETICK = 60;
SortedList<short, ObservableDataSource<HistoryData>> sortlist = new SortedList<short, ObservableDataSource<HistoryData>>();
SortedList<short, IPlotterElement> plotterlist = new SortedList<short, IPlotterElement>();
public Trend()
{
InitializeComponent();
this.SetWindowState();
LARGETICK = ConfigCache.HdaLargeTick;
SMALLTICK = ConfigCache.HdaSmallTick;
this.CommandBindings.Add(new CommandBinding(MyCommands.First, (sender, e) =>
{
dtstart.Value -= TimeSpan.FromMinutes(LARGETICK);
dtend.Value -= TimeSpan.FromMinutes(LARGETICK);
BindingData();
}, CmdCanExecute));
this.CommandBindings.Add(new CommandBinding(MyCommands.Previous, (sender, e) =>
{
dtstart.Value -= TimeSpan.FromMinutes(SMALLTICK);
dtend.Value -= TimeSpan.FromMinutes(SMALLTICK);
BindingData();
}, CmdCanExecute));
this.CommandBindings.Add(new CommandBinding(MyCommands.Next, (sender, e) =>
{
dtstart.Value += TimeSpan.FromMinutes(SMALLTICK);
dtend.Value += TimeSpan.FromMinutes(SMALLTICK);
BindingData();
}, CmdCanExecute));
this.CommandBindings.Add(new CommandBinding(MyCommands.Last, (sender, e) =>
{
dtstart.Value += TimeSpan.FromMinutes(LARGETICK);
dtend.Value += TimeSpan.FromMinutes(LARGETICK);
BindingData();
}, CmdCanExecute));
this.CommandBindings.Add(new CommandBinding(MyCommands.Query, (sender, e) =>
{
BindingData();
}, CmdCanExecute));
dtstart.Value = DateTime.Now.AddMinutes(-LARGETICK);
dtend.Value = DateTime.Now;
chklist.ItemsSource = App.Server.ArchiveList;
var brush = chartPlotter1.Background as SolidColorBrush;
if (brush != null)
colorpicker.SelectedColor = brush.Color;
cursor.XTextMapping = x => hTimeSpanAxis.ConvertFromDouble(x).ToString();
}
void BindingData()
{
if (!dtstart.Value.HasValue || !dtend.Value.HasValue) return;
DateTime start = dtstart.Value.Value;
DateTime end = dtend.Value.Value;
if ((end - start).Days > 7)
{
end = start.AddDays(7);
dtend.Value = end;
}
else if (start >= end)
{
end = start.AddDays(1);
dtend.Value = end;
}
HashSet<short> hash = new HashSet<short>();
foreach (var item in sortlist)
{
item.Value.Collection.Clear();
hash.Add(item.Key);
}
foreach (KeyValuePair<short, string> item in chklist.SelectedItems)
{
ObservableDataSource<HistoryData> source;
if (!sortlist.TryGetValue(item.Key, out source))
{
source = new ObservableDataSource<HistoryData>();
source.SetXMapping(X => hTimeSpanAxis.ConvertToDouble(X.TimeStamp));
source.SetSourceMapping(App.Server[item.Key]);
if (comodel.SelectedIndex == 0
|| (comodel.SelectedIndex == 1 && sortlist.Count == 0))
//|| (comodel.SelectedIndex == 2 && (sortlist.Count == 0 || chklist.SelectedItems.Count == 1)))
{
plotterlist[item.Key] = chartPlotter1.AddLineGraph(source, 2, item.Value);
}
else
{
var innerPlotter = new InjectedPlotter() { SetViewportBinding = false };
var axis = new HorizontalDateTimeAxis();
innerPlotter.Children.Add(axis);
innerPlotter.MainHorizontalAxis = axis;
innerPlotter.Children.Add(new VerticalAxis() { Placement = AxisPlacement.Right });
innerPlotter.Children.Add(new VerticalAxisTitle() { Content = item.Value, Placement = AxisPlacement.Right });
chartPlotter1.Children.Add(innerPlotter);
innerPlotter.AddLineGraph(source, 2, item.Value);
plotterlist.Add(item.Key, innerPlotter);
}
sortlist.Add(item.Key, source);
}
hash.Remove(item.Key);
var data = App.Server.ReadRaw(start, end, item.Key);
if (data != null)
{
bool first = true;
var temp = new HistoryData(item.Key, QUALITIES.QUALITY_GOOD, Storage.Empty, start);
source.SuspendUpdate();
foreach (var p in data)
{
if (first)
{
temp.Value = p.Value;
source.Collection.Add(temp);
first = false;
}
source.Collection.Add(p);
}
if (source.Collection.Count == 0)
source.Collection.Add(temp);
temp = source.Collection[source.Collection.Count - 1];
temp.TimeStamp = end;
source.Collection.Add(temp);
source.ResumeUpdate();
}
chartPlotter1.FitToView();
}
foreach (short id in hash)
{
sortlist.Remove(id);
IPlotterElement plotter;
if (plotterlist.TryGetValue(id, out plotter))
{
var chart = plotter as Plotter;
if (chart != null)
{
for (int i = chart.Children.Count - 1; i >= 0; i--)
{
chart.Children[i].RemoveFromPlotter();
}
}
plotter.RemoveFromPlotter();
plotterlist.Remove(id);
}
}
}
void CmdCanExecute(object target, CanExecuteRoutedEventArgs e)
{
e.CanExecute = dtstart.Value.HasValue && dtend.Value.HasValue;
//e.CanExecute = App.Principal.IsInRole("中控员");
}
private void Window_Closed(object sender, EventArgs e)
{
this.SaveWindowState();
}
private void ColorPicker_SelectedColorChanged(object sender, RoutedPropertyChangedEventArgs<Color> e)
{
chartPlotter1.Background = new SolidColorBrush(e.NewValue);
}
private void comodel_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
foreach (var source in sortlist.Values)
{
source.Collection.Clear();
}
foreach (var plotter in plotterlist.Values)
{
var chart = plotter as Plotter;
if (chart != null)
{
for (int i = chart.Children.Count - 1; i >= 0; i--)
{
chart.Children[i].RemoveFromPlotter();
}
}
plotter.RemoveFromPlotter();
}
sortlist.Clear();
plotterlist.Clear();
BindingData();
}
private void chkshow_Click(object sender, RoutedEventArgs e)
{
if (chkshow.IsChecked == true)
{
cursor.Visibility = Visibility.Visible;
axiscuror.ShowHorizontalLine = true; axiscuror.ShowVerticalLine = true;
}
else
{
cursor.Visibility = Visibility.Collapsed;
axiscuror.ShowHorizontalLine = false; axiscuror.ShowVerticalLine = false;
}
}
}
}