|
@@ -34,6 +34,9 @@ using System.Windows.Controls;
|
|
|
using SciChart.Charting.Model.ChartData;
|
|
|
using MECF.Framework.UI.Client.Converter;
|
|
|
using MECF.Framework.UI.Client.CenterViews.Operations.RealTime;
|
|
|
+using SciChart.Core.Extensions;
|
|
|
+using System.Linq.Expressions;
|
|
|
+using System.Reflection;
|
|
|
|
|
|
namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
{
|
|
@@ -106,6 +109,8 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
get { return _ParameterNodes; }
|
|
|
set { _ParameterNodes = value; NotifyOfPropertyChange("ParameterNodes"); }
|
|
|
}
|
|
|
+ public List<ParameterNode> DoubleParameterNodes { get; set; }=new List<ParameterNode>();
|
|
|
+
|
|
|
|
|
|
public ObservableCollection<IRenderableSeries> SelectedData { get; set; }
|
|
|
public ObservableCollection<IRenderableSeries> SynSelectedData { get; set; }
|
|
@@ -292,6 +297,12 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
DisplayName = "Process Detail";
|
|
|
RecipeDatas = recipes;
|
|
|
ParameterNodes = _realtimeProvider.GetParameters(out var dict);
|
|
|
+ DoubleParameterNodes = _realtimeProvider.GetParameters(out dict).ToList();
|
|
|
+ for (int j = 0; j < ParameterNodes.Count; j++)
|
|
|
+ {
|
|
|
+ ParameterNodes[j].IsVisibilityParentNode = Visibility.Hidden;
|
|
|
+ DoubleParameterNodes[j].IsVisibilityParentNode = Visibility.Hidden;
|
|
|
+ }
|
|
|
_processDetailDisplayDic = dict;
|
|
|
if (recipes == null || recipes.Count == 0)
|
|
|
{
|
|
@@ -452,11 +463,6 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
if (_isAdding)
|
|
|
return true;
|
|
|
bool allUpdated = true;
|
|
|
- for (int j = 0; j < ParameterNodes.Count; j++)
|
|
|
- {
|
|
|
- ParameterNode par = ParameterNodes[j];
|
|
|
- par.IsVisibilityParentNode = Visibility.Hidden;
|
|
|
- }
|
|
|
lock (_lockSelection)
|
|
|
{
|
|
|
foreach (var item in _lstTokenTimeData)
|
|
@@ -621,34 +627,8 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- var items = SelectedData.Where(x => (x as ChartDataLine<T>).DataSource == dataSource);
|
|
|
- foreach (var item in items)
|
|
|
- {
|
|
|
- var seriesItem = item as ChartDataLine<T>;
|
|
|
- if (seriesItem == null)
|
|
|
- continue;
|
|
|
-
|
|
|
- foreach (var data in historyData)
|
|
|
- {
|
|
|
- var dataKey = _processDetailDisplayDic.ContainsKey(seriesItem.DataName) ? _processDetailDisplayDic[seriesItem.DataName] : seriesItem.DataName;
|
|
|
- if (data.Key != dataKey)
|
|
|
- continue;
|
|
|
-
|
|
|
- seriesItem.Capacity += data.Value.Count;
|
|
|
- //DateTime beginTime = StepStartTime;
|
|
|
- for (int i = 0; i < data.Value.Count; i++)
|
|
|
- {
|
|
|
- var historyDataItem = data.Value[i];
|
|
|
- if (typeof(T) == typeof(double))
|
|
|
- {
|
|
|
- //xData = Math.Round((historyDataItem.dateTime - beginTime).TotalMilliseconds / 1000, 0, MidpointRounding.AwayFromZero);
|
|
|
- seriesItem.Append((T)Convert.ChangeType((historyDataItem.dateTime- StepStartTime).TotalMilliseconds/1000d, typeof(T)), historyDataItem.value);
|
|
|
- }
|
|
|
- else
|
|
|
- seriesItem.Append((T)Convert.ChangeType(historyDataItem.dateTime, typeof(T)), historyDataItem.value);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ FillDataToChart(SelectedData,dataSource, historyData);
|
|
|
+ FillDataToChart(SynSelectedData, dataSource, historyData);
|
|
|
RefresCharView();
|
|
|
}
|
|
|
catch (Exception ex)
|
|
@@ -657,6 +637,39 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
}
|
|
|
}));
|
|
|
}
|
|
|
+
|
|
|
+ void FillDataToChart(ObservableCollection<IRenderableSeries> series,string dataSource, Dictionary<string, List<HistoryDataItem>> historyData)
|
|
|
+ {
|
|
|
+ var items = series.Where(x => (x as ChartDataLine<T>).DataSource == dataSource);
|
|
|
+ if (items == null) return;
|
|
|
+ foreach (var item in items)
|
|
|
+ {
|
|
|
+ var seriesItem = item as ChartDataLine<T>;
|
|
|
+ if (seriesItem == null)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ foreach (var data in historyData)
|
|
|
+ {
|
|
|
+ var dataKey = _processDetailDisplayDic.ContainsKey(seriesItem.DataName) ? _processDetailDisplayDic[seriesItem.DataName] : seriesItem.DataName;
|
|
|
+ if (data.Key != dataKey)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ seriesItem.Capacity += data.Value.Count;
|
|
|
+ //DateTime beginTime = StepStartTime;
|
|
|
+ for (int i = 0; i < data.Value.Count; i++)
|
|
|
+ {
|
|
|
+ var historyDataItem = data.Value[i];
|
|
|
+ if (typeof(T) == typeof(double))
|
|
|
+ {
|
|
|
+ //xData = Math.Round((historyDataItem.dateTime - beginTime).TotalMilliseconds / 1000, 0, MidpointRounding.AwayFromZero);
|
|
|
+ seriesItem.Append((T)Convert.ChangeType((historyDataItem.dateTime - StepStartTime).TotalMilliseconds / 1000d, typeof(T)), historyDataItem.value);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ seriesItem.Append((T)Convert.ChangeType(historyDataItem.dateTime, typeof(T)), historyDataItem.value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 获取时间列表
|
|
|
/// </summary>
|
|
@@ -699,14 +712,14 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- public void TxtMouseLeftButtonDown(ParameterNode node)
|
|
|
+ public void TxtMouseLeftButtonDown(ParameterNode node,ObservableCollection<IRenderableSeries> series)
|
|
|
{
|
|
|
node.Selected = !node.Selected;
|
|
|
- ParameterCheck(node);
|
|
|
+ ParameterCheck(node,series);
|
|
|
}
|
|
|
- public void ParameterCheck(ParameterNode node)
|
|
|
+ public void ParameterCheck(ParameterNode node, ObservableCollection<IRenderableSeries> series)
|
|
|
{
|
|
|
- bool result = RefreshTreeStatusToChild(node);
|
|
|
+ bool result = RefreshTreeStatusToChild(node,series);
|
|
|
if (!result)
|
|
|
{
|
|
|
node.Selected=!node.Selected;
|
|
@@ -719,7 +732,7 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
/// <summary>
|
|
|
/// Refresh tree node status from current to children, and add data to SelectedData
|
|
|
/// </summary>
|
|
|
- private bool RefreshTreeStatusToChild(ParameterNode node)
|
|
|
+ private bool RefreshTreeStatusToChild(ParameterNode node, ObservableCollection<IRenderableSeries> SelectedData)
|
|
|
{
|
|
|
if (node?.ChildNodes.Count > 0)
|
|
|
{
|
|
@@ -728,7 +741,7 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
ParameterNode n = node.ChildNodes[i];
|
|
|
n.Selected = node.Selected;
|
|
|
|
|
|
- if (!RefreshTreeStatusToChild(n))
|
|
|
+ if (!RefreshTreeStatusToChild(n, SelectedData))
|
|
|
{
|
|
|
n.Selected = !n.Selected;
|
|
|
return false;
|
|
@@ -741,17 +754,10 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
try
|
|
|
{
|
|
|
var item = SelectedData?.FirstOrDefault(x => (x as ChartDataLine<T>).DataName == node.Name);
|
|
|
- if (item == null) item = SynSelectedData.FirstOrDefault(x => (x as ChartDataLine<T>).DataName == node.Name);
|
|
|
bool isExist = item != null;
|
|
|
if (isExist && !node.Selected)//删除
|
|
|
{
|
|
|
SelectedData.Remove(item);
|
|
|
- SynSelectedData.Remove(item);
|
|
|
- if (SynSelectedData.Count == 0 && this.view.syncChart.Visibility == Visibility.Visible)
|
|
|
- {
|
|
|
- this.view.syncChart.Visibility = Visibility.Hidden;
|
|
|
- Grid.SetRowSpan(this.view.sciChart, 2);
|
|
|
- }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -858,12 +864,6 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
RefreshTreeStatusToParent(cp.Tag as ParameterNode);
|
|
|
}
|
|
|
SelectedData.Clear();
|
|
|
- SynSelectedData.Clear();
|
|
|
- if (this.view.syncChart.Visibility == Visibility.Visible)
|
|
|
- {
|
|
|
- this.view.syncChart.Visibility = Visibility.Hidden;
|
|
|
- Grid.SetRowSpan(this.view.sciChart, 2);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
private void SetParameterNode(ObservableCollection<ParameterNode> nodes, bool isChecked)
|
|
@@ -884,10 +884,8 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
//uncheck tree node
|
|
|
(cp.Tag as ParameterNode).Selected = false;
|
|
|
RefreshTreeStatusToParent(cp.Tag as ParameterNode);
|
|
|
-
|
|
|
SelectedData.Remove(cp);
|
|
|
}
|
|
|
- if (SynSelectedData.Contains(cp)) { SynSelectedData.Remove(cp); }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1236,51 +1234,37 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
public void RefresCharView()
|
|
|
{
|
|
|
this.view.sciChart.ZoomExtents();
|
|
|
- }
|
|
|
- public void BackPan()//前移
|
|
|
- {
|
|
|
- if ((_directionByte & 0x01) == 1)//x
|
|
|
- {
|
|
|
- // LOG.Info($"A BackPan.X:scale{XScale},{VisibleRangeTime.Min}:{VisibleRangeTime.Max}");
|
|
|
- if (VisibleRangeTime is DoubleRange range)
|
|
|
- {
|
|
|
- VisibleRangeTime = new DoubleRange(range.Min - XScale, range.Max - XScale);
|
|
|
- // LOG.Info($"BackPan.X:scale{XScale},{VisibleRangeTime.Min}:{VisibleRangeTime.Max}");
|
|
|
- }
|
|
|
- }
|
|
|
- if ((_directionByte & 0x02) == 2)
|
|
|
- {
|
|
|
- // LOG.Info($"A BackPan.Y:scale{YScale},{VisibleRangeValue.Min}:{VisibleRangeValue.Max}");
|
|
|
- if (VisibleRangeValue is DoubleRange range)
|
|
|
- {
|
|
|
- VisibleRangeValue = new DoubleRange(range.Min - YScale, range.Max - YScale);
|
|
|
- //LOG.Info($"BackPan.Y:scale{YScale},{VisibleRangeValue.Min}:{VisibleRangeValue.Max}");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void ForwardPan()//后移
|
|
|
+ }
|
|
|
+ public void ArrowClick(string direction)
|
|
|
{
|
|
|
- if ((_directionByte & 0x01) == 1)//x
|
|
|
+ switch (direction)
|
|
|
{
|
|
|
- // LOG.Info($"A ForwardPan.X:scale{XScale},{VisibleRangeTime.Min}:{VisibleRangeTime.Max}");
|
|
|
- if (VisibleRangeTime is DoubleRange range)
|
|
|
- {
|
|
|
- VisibleRangeTime = new DoubleRange(range.Min + XScale, range.Max + XScale);
|
|
|
- // LOG.Info($"ForwardPan.X:scale{XScale},{VisibleRangeTime.Min}:{VisibleRangeTime.Max}");
|
|
|
- }
|
|
|
- }
|
|
|
- if ((_directionByte & 0x02) == 2)
|
|
|
- {
|
|
|
- //LOG.Info($"A ForwardPan.Y:scale{YScale},{VisibleRangeValue.Min}:{VisibleRangeValue.Max}");
|
|
|
- if (VisibleRangeValue is DoubleRange range)
|
|
|
- {
|
|
|
- VisibleRangeValue = new DoubleRange(range.Min + YScale, range.Max + YScale);
|
|
|
- //LOG.Info($"ForwardPan.Y:scale{YScale},{VisibleRangeValue.Min}:{VisibleRangeValue.Max}");
|
|
|
- }
|
|
|
+ case "Up":
|
|
|
+ if (VisibleRangeValue is DoubleRange uprange)
|
|
|
+ {
|
|
|
+ VisibleRangeValue = new DoubleRange(uprange.Min + YScale, uprange.Max + YScale);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "Down":
|
|
|
+ if (VisibleRangeValue is DoubleRange downrange)
|
|
|
+ {
|
|
|
+ VisibleRangeValue = new DoubleRange(downrange.Min - YScale, downrange.Max - YScale);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "Left":
|
|
|
+ if (VisibleRangeTime is DoubleRange leftrange)
|
|
|
+ {
|
|
|
+ VisibleRangeTime = new DoubleRange(leftrange.Min - XScale, leftrange.Max - XScale);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "Right":
|
|
|
+ if (VisibleRangeTime is DoubleRange range)
|
|
|
+ {
|
|
|
+ VisibleRangeTime = new DoubleRange(range.Min + XScale, range.Max + XScale);
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
public void ZoomInClick()//放大
|
|
|
{
|
|
|
double scale = 0;
|
|
@@ -1374,7 +1358,7 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
allCheckNode.AddRange(GetAllCheckedLeafNode(x));
|
|
|
});
|
|
|
|
|
|
- allCheckNode.ForEach(x => { ParameterCheck(x); });
|
|
|
+ allCheckNode.ForEach(x => { ParameterCheck(x,SelectedData); });
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1445,7 +1429,6 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
public class ProcessDataLot : NotifiableItem
|
|
|
{
|
|
|
private string _guid;
|