|
@@ -34,6 +34,7 @@ using System.Windows.Controls;
|
|
|
using SciChart.Charting.Model.ChartData;
|
|
|
using MECF.Framework.UI.Client.Converter;
|
|
|
using MECF.Framework.UI.Client.CenterViews.Operations.RealTime;
|
|
|
+using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing;
|
|
|
|
|
|
namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
{
|
|
@@ -109,6 +110,7 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
|
|
|
public ObservableCollection<IRenderableSeries> SelectedData { get; set; }
|
|
|
public ObservableCollection<IRenderableSeries> SynSelectedData { get; set; }
|
|
|
+ public List<ParameterNode> DoubleParameterNodes { get; set; } = new List<ParameterNode>();
|
|
|
|
|
|
public List<ProcessHistoryLot> RecipeDatas { get; set; }
|
|
|
|
|
@@ -300,7 +302,12 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
SelectedData = new ObservableCollection<IRenderableSeries>();
|
|
|
SynSelectedData = new ObservableCollection<IRenderableSeries>();
|
|
|
VisibleRangeValue = new DoubleRange(0, 10);
|
|
|
-
|
|
|
+ DoubleParameterNodes = _realtimeProvider.GetParameters(out dict).ToList();
|
|
|
+ for (int j = 0; j < ParameterNodes.Count; j++)
|
|
|
+ {
|
|
|
+ ParameterNodes[j].IsVisibilityParentNode = Visibility.Hidden;
|
|
|
+ DoubleParameterNodes[j].IsVisibilityParentNode = Visibility.Hidden;
|
|
|
+ }
|
|
|
// Annotations = new AnnotationCollection();
|
|
|
_thread = new PeriodicJob(200, MonitorData, "ProcessDetail", true);
|
|
|
try
|
|
@@ -452,11 +459,7 @@ 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)
|
|
@@ -505,14 +508,13 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
maxValue = pointValueList[i];
|
|
|
}
|
|
|
|
|
|
- averageValue = sumValue / pointValueList.Count;
|
|
|
-
|
|
|
+ averageValue = pointValueList.Count == 0 ? 0 : sumValue / pointValueList.Count;
|
|
|
for (int i = 0; i < pointValueList.Count; i++)
|
|
|
{
|
|
|
stdevValue += Math.Pow(pointValueList[i] - averageValue, 2);
|
|
|
}
|
|
|
|
|
|
- stdevValue = stdevValue / pointValueList.Count;
|
|
|
+ stdevValue = pointValueList.Count == 0 ? 0 : stdevValue / pointValueList.Count;
|
|
|
|
|
|
sigma3Value = Math.Sqrt(stdevValue) * 3;
|
|
|
|
|
@@ -621,34 +623,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)
|
|
@@ -656,6 +632,39 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
LOG.Write(ex);
|
|
|
}
|
|
|
}));
|
|
|
+
|
|
|
+ }
|
|
|
+ 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>
|
|
|
/// 获取时间列表
|
|
@@ -699,14 +708,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 +728,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 +737,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 +750,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 +860,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)
|
|
@@ -1237,6 +1233,36 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
{
|
|
|
this.view.sciChart.ZoomExtents();
|
|
|
}
|
|
|
+ public void ArrowClick(string direction)
|
|
|
+ {
|
|
|
+ switch (direction)
|
|
|
+ {
|
|
|
+ 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 BackPan()//前移
|
|
|
{
|
|
|
if ((_directionByte & 0x01) == 1)//x
|
|
@@ -1374,7 +1400,8 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
|
|
|
allCheckNode.AddRange(GetAllCheckedLeafNode(x));
|
|
|
});
|
|
|
|
|
|
- allCheckNode.ForEach(x => { ParameterCheck(x); });
|
|
|
+ allCheckNode.ForEach(x => { ParameterCheck(x, SelectedData); });
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|