tbf/TBF/UI/Graphs/GraphsTabPageCtrl.cs

386 lines
14 KiB
C#
Raw Normal View History

///
/// Copyright (c) 2018-2021 Sensus Slovensko a.s.
///
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using GraphLib;
using log4net;
2021-10-26 09:23:57 +00:00
using TBF.Rig.Sequences;
using TBF.Resources;
namespace TBF.UI.Graphs
{
public partial class GraphsTabPageCtrl : UserControl
{
static readonly ILog log = LogManager.GetLogger(typeof(GraphsTabPageCtrl));
static readonly GraphInfo[] SupportedGraphs = new GraphInfo[] {
new GraphInfo { FileName = "Flow", Caption = string.Format("Q [m3/h]") },
new GraphInfo { FileName = "Pressure up", Caption = string.Format("Pr up [bar]") },
new GraphInfo { FileName = "Pressure down", Caption = string.Format("Pr dw [bar]") },
new GraphInfo { FileName = "Temperature up", Caption = string.Format("T up [°C]") },
new GraphInfo { FileName = "Temperature down", Caption = string.Format("T dw [°C]") },
new GraphInfo { FileName = "Temperature div", Caption = string.Format("T di [°C]") },
new GraphInfo { FileName = "Div start", Caption = string.Format("Div start") },
new GraphInfo { FileName = "Div end", Caption = string.Format("Div end") },
};
PlotterGraphPaneEx.LayoutMode layoutMode;
CheckBox[] checkBoxes;
string selectedGraphsPath;
int selectedBatchNr;
string selectedTestName;
public GraphsTabPageCtrl()
{
InitializeComponent();
/// checkBoxes array must be initialized before other actions
checkBoxes = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, checkBox7, checkBox8 };
Localize();
UpdateCheckBoxesVisibility();
layoutMode = GraphLib.PlotterGraphPaneEx.LayoutMode.NORMAL; /// Default value
if (Program.LocalSettings != null)
{
checkBox1.Checked = Program.LocalSettings.Graph1_On;
checkBox2.Checked = Program.LocalSettings.Graph2_On;
checkBox3.Checked = Program.LocalSettings.Graph3_On;
checkBox4.Checked = Program.LocalSettings.Graph4_On;
checkBox5.Checked = Program.LocalSettings.Graph5_On;
checkBox6.Checked = Program.LocalSettings.Graph6_On;
checkBox7.Checked = Program.LocalSettings.Graph7_On;
checkBox8.Checked = Program.LocalSettings.Graph8_On;
layoutMode = Program.LocalSettings.GraphsLayoutMode; /// Override the default value
}
layoutModeComboBox.Text = layoutMode.ToString();
for (PlotterGraphPaneEx.LayoutMode mode = 0; mode <= PlotterGraphPaneEx.LayoutMode.TILES_HOR; mode++)
{
layoutModeComboBox.Items.Add(mode.ToString());
}
UpdateTestsHistory(testsHistoryTreeView);
selectedGraphsPath = null;
2017-09-20 19:55:21 +00:00
//Bridge.ProcessDataHandler += delegate(object sender, ProcessDataEventArgs args)
2017-09-20 19:55:21 +00:00
//{
// if (InvokeRequired)
// {
// Invoke(new EventHandler<ProcessDataEventArgs>(OnProcessData), sender, args);
// }
// else OnProcessData(sender, args);
//};
}
//void OnProcessData(object sender, ProcessDataEventArgs args)
//{
// if (!paused && isRunning == true)
// {
// try
// {
2021-10-26 09:23:57 +00:00
// gPane.starting_idx += Math.Min(RichTextBoxFinds.Rig.StateMachine.;
// UpdateScrollBar();
// gPane.Invalidate();
// }
// catch { }
// }
//}
2017-09-20 19:55:21 +00:00
void Localize()
{
refreshButton.Text = Strings.Refresh;
for (int i = 0; i < checkBoxes.Length; i++)
2017-09-20 19:55:21 +00:00
{
if (i < SupportedGraphs.Length)
{
checkBoxes[i].Text = SupportedGraphs[i].Caption;
}
2017-09-20 19:55:21 +00:00
}
}
void UpdateCheckBoxesVisibility()
{
for (int i = 0; i < checkBoxes.Length; i++)
{
checkBoxes[i].Visible = (i < SupportedGraphs.Length);
}
}
private void refreshButton_Click(object sender, EventArgs e)
{
UpdateTestsHistory(testsHistoryTreeView);
}
void UpdateTestsHistory(TreeView treeView)
{
try
{
string[] batches = Directory.GetDirectories(Program.GraphsDir);
2018-09-06 14:15:14 +00:00
int[] batchNrs = new int[batches.Length];
int i = 0;
foreach (var b in batches)
{
int nr;
if (int.TryParse(Path.GetFileName(b), out nr))
{
batchNrs[i++] = nr;
}
}
Array.Sort(batchNrs);
Cursor.Current = Cursors.WaitCursor;
treeView.BeginUpdate();
treeView.Nodes.Clear();
for (int j = batchNrs.Length - 1; j >= 0; j--)
{
string batchNrStr = batchNrs[j].ToString();
string b = Path.Combine(Program.GraphsDir, batchNrStr);
TreeNode node = new TreeNode(batchNrStr);
node.Tag = null;
treeView.Nodes.Add(node);
if (j == batchNrs.Length - 1)
{
AddSubnodesToBatchNode(node);
node.Expand();
if (ProcessData.BatchRslts != null && batchNrStr == ProcessData.BatchRslts.Batch.BatchNr.ToString())
{
node.Text = string.Format("{0} ({1})", batchNrStr, Strings.current);
}
}
}
}
catch (Exception exc)
{
log.ErrorFormat("UpdateTestsHistory() failed: {0}", exc.Message);
}
treeView.EndUpdate();
Cursor.Current = Cursors.Default;
}
private void testsHistoryTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Node.Tag is string)
{
string[] fields = (e.Node.Tag as string).Split(new char[]{'~'});
selectedGraphsPath = fields[0];
selectedBatchNr = int.Parse(fields[1]);
selectedTestName = fields[2];
ShowGraphs(plotterDisplayEx, selectedGraphsPath, selectedBatchNr, selectedTestName);
}
else if (e.Node.Tag == null && e.Node.Nodes.Count == 0)
{
AddSubnodesToBatchNode(e.Node);
}
}
void AddSubnodesToBatchNode(TreeNode node)
{
string[] tests = Directory.GetDirectories(Path.Combine(Program.GraphsDir, node.Text));
foreach (var t in tests)
{
string testNameStr = Path.GetFileName(t);
TreeNode subnode = new TreeNode(testNameStr);
node.Nodes.Add(subnode);
string[] repetitions = Directory.GetDirectories(t);
if (repetitions.Length == 1)
{
subnode.Tag = string.Format("{0}~{1}~{2}", repetitions[0], node.Text, testNameStr);
}
else if (repetitions.Length > 1)
{
subnode.Tag = null;
foreach (var r in repetitions)
{
string repetStr = Path.GetFileName(r);
TreeNode subsubnode = new TreeNode(repetStr);
subsubnode.Tag = string.Format("{0}~{1}~{2}/{3}", r, node.Text, testNameStr, repetStr);
subnode.Nodes.Add(subsubnode);
}
}
else
{
subnode.Tag = null;
}
}
}
void ShowGraphs(PlotterDisplayEx display, string path, int batchNr, string testName)
{
if (path == null) return; /// No batch selected yet
Color[] colors = { Color.DarkRed,
Color.DarkSlateGray,
Color.DarkCyan,
Color.DarkGreen,
Color.DarkBlue ,
Color.DarkMagenta,
Color.DeepPink,
Color.DarkGreen };
float[] gridY = { 0.0002f, 0.0005f, 0.001f, 0.002f, 0.005f, 0.01f, 0.02f, 0.05f, 0.1f, 0.2f, 0.5f, 1, 2, 5, 10, 20, 50, 100, 200, 500 };
this.SuspendLayout();
display.Smoothing = System.Drawing.Drawing2D.SmoothingMode.None;
display.SetDisplayRangeX(0, 300);
display.PanelLayout = layoutMode;
display.BackgroundColorTop = Color.White;
display.BackgroundColorBot = Color.White;
display.SolidGridColor = Color.LightGray;
display.DashedGridColor = Color.LightGray;
display.DataSources.Clear();
bool first = true;
for (int i = 0; i < checkBoxes.Length; i++)
{
if (checkBoxes[i].Checked && SupportedGraphs.Length > i)
{
DataSource dataSrc = new DataSource();
float ymin;
float ymax;
int samplesCount = dataSrc.LoadSamples(Path.Combine(path, SupportedGraphs[i].FileName), out ymin, out ymax);
/// Following section of code makes sure graps 1, 2 and graphs 3, 4, 5 use the same scale (Y-axis)
DataSource dummyDS = new DataSource();
float y1, y2, y3, y4;
switch (i)
{
case 0:
default:
break;
case 1:
dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[2].FileName), out y1, out y2);
if (y1 < ymin) ymin = y1;
if (y2 > ymax) ymax = y2;
break;
case 2:
dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[1].FileName), out y1, out y2);
if (y1 < ymin) ymin = y1;
if (y2 > ymax) ymax = y2;
break;
case 3:
dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[4].FileName), out y1, out y2);
dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[5].FileName), out y3, out y4);
if (y1 < ymin) ymin = y1;
if (y2 > ymax) ymax = y2;
if (y3 < ymin) ymin = y3;
if (y4 > ymax) ymax = y4;
break;
case 4:
dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[3].FileName), out y1, out y2);
dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[5].FileName), out y3, out y4);
if (y1 < ymin) ymin = y1;
if (y2 > ymax) ymax = y2;
if (y3 < ymin) ymin = y3;
if (y4 > ymax) ymax = y4;
break;
case 5:
dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[3].FileName), out y1, out y2);
dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[4].FileName), out y3, out y4);
if (y1 < ymin) ymin = y1;
if (y2 > ymax) ymax = y2;
if (y3 < ymin) ymin = y3;
if (y4 > ymax) ymax = y4;
break;
}
if (first)
{
first = false;
dataSrc.Name = string.Format("{0} {1} {2}", batchNr, testName, SupportedGraphs[i].Caption);
}
else
{
dataSrc.Name = SupportedGraphs[i].Caption;
}
dataSrc.OnRenderXAxisLabel += RenderXLabel;
dataSrc.OnRenderYAxisLabel = RenderYLabel;
dataSrc.AutoScaleY = false;
dataSrc.SetDisplayRangeY(ymin * 0.9f, ymax * 1.1f);
float d = ymax * 1.1f - ymin * 0.9f;
int j = gridY.Length - 1;
while ((2 * gridY[j] > d) && (j > 0)) j--;
dataSrc.SetGridDistanceY(gridY[j]);
dataSrc.GraphColor = colors[i % colors.Length];
display.DataSources.Add(dataSrc);
}
}
this.ResumeLayout();
display.Refresh();
}
private string RenderXLabel(DataSource s, int idx)
{
if (s.AutoScaleX)
{
//if (idx % 2 == 0)
return ((int)(s.Samples[idx].X)).ToString();
//else
// return string.Empty;
}
else
{
return ((int)(s.Samples[idx].X)).ToString();
}
}
private string RenderYLabel(DataSource s, float value)
{
return value.ToString(Config.Utils.SignificantDigitsToFmt(value, 2));
}
private void checkBox1_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph1_On = checkBox1.Checked; AnyCBChanged(); }
private void checkBox2_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph2_On = checkBox2.Checked; AnyCBChanged(); }
private void checkBox3_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph3_On = checkBox3.Checked; AnyCBChanged(); }
private void checkBox4_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph4_On = checkBox4.Checked; AnyCBChanged(); }
private void checkBox5_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph5_On = checkBox5.Checked; AnyCBChanged(); }
private void checkBox6_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph6_On = checkBox6.Checked; AnyCBChanged(); }
private void checkBox7_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph7_On = checkBox7.Checked; AnyCBChanged(); }
private void checkBox8_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph8_On = checkBox8.Checked; AnyCBChanged(); }
void AnyCBChanged()
{
ShowGraphs(plotterDisplayEx, selectedGraphsPath, selectedBatchNr, selectedTestName);
}
private void layoutModeComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
for (PlotterGraphPaneEx.LayoutMode mode = 0; mode <= PlotterGraphPaneEx.LayoutMode.TILES_HOR; mode++)
{
if (layoutModeComboBox.Text.Equals(mode.ToString()) && (layoutMode != mode))
{
Program.LocalSettings.GraphsLayoutMode = layoutMode = mode;
ShowGraphs(plotterDisplayEx, selectedGraphsPath, selectedBatchNr, selectedTestName);
}
}
}
}
class GraphInfo
{
public string FileName; /// Name of a file written y the plotter
public string Caption; /// Displayed graph lable
}
}