Statistics, ProcesData, Plotter, IPlotter, GraphsTabPageCtrl, FlyingStartMassCollection changes

This commit is contained in:
Milan Hanajik 2018-02-12 22:26:18 +01:00
parent 5f17dabb0b
commit b844aafcf3
24 changed files with 951 additions and 313 deletions

View File

@ -30,7 +30,7 @@ namespace Config
[Description("hr")] hour, /// 1 hour = 60 min = 3600 s [Description("hr")] hour, /// 1 hour = 60 min = 3600 s
[Description("ms")] ms, /// 1 ms = 0.001 s [Description("ms")] ms, /// 1 ms = 0.001 s
[Description("°C")] C, /// * degree Celsius [Description("°C")] C, /// * degree Celsius (°C)
[Description("°F")] F, /// degree Fahrenheit [Description("°F")] F, /// degree Fahrenheit
[Description("K")] K, /// degree Kelvin [Description("K")] K, /// degree Kelvin
@ -293,8 +293,8 @@ namespace Config
case Unit.hour: return v / 3600; case Unit.hour: return v / 3600;
case Unit.ms: return 1000 * v; case Unit.ms: return 1000 * v;
/// Temperature: internal representation in degree C /// Temperature: internal representation in °C
case Unit.C: return v; /// degree Celsius case Unit.C: return v; /// degree Celsius (°C)
case Unit.F: return 1.8 * v + 32; /// degree Fahrenheit case Unit.F: return 1.8 * v + 32; /// degree Fahrenheit
case Unit.K: return v + 273.15; /// degree Kelvin case Unit.K: return v + 273.15; /// degree Kelvin
@ -360,8 +360,8 @@ namespace Config
case Unit.hour: return 3600 * v; case Unit.hour: return 3600 * v;
case Unit.ms: return v / 1000; case Unit.ms: return v / 1000;
/// Temperature: internal representation in degree C /// Temperature: internal representation in °C
case Unit.C: return v; /// degree Celsius case Unit.C: return v; /// degree Celsius (°C)
case Unit.F: return 5 * (v-32) / 9; /// degree Fahrenheit case Unit.F: return 5 * (v-32) / 9; /// degree Fahrenheit
case Unit.K: return v - 273.15; /// degree Kelvin case Unit.K: return v - 273.15; /// degree Kelvin

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Text; using System.Text;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Binary;
@ -159,7 +160,46 @@ namespace GraphLib
{ {
grid_off_y = off_y; grid_off_y = off_y;
} }
/// <summary>
/// Load Samples from a file. Returns loaded points count.
/// </summary>
/// <param name="pathName">File pathname</param>
/// <returns>Loaded points count</returns>
public int LoadSamples(string pathName, out float yMin, out float yMax)
{
yMin = float.MaxValue;
yMax = float.MinValue;
try
{
Int64 size = new FileInfo(pathName).Length;
if ((size % 8) != 0) return 0;
int samplesCount = (int)(size / 8L) - 1;
if (samplesCount <= 0) return 0;
PointF[] newSamples = new PointF[samplesCount];
using (BinaryReader reader = new BinaryReader(File.Open(pathName, FileMode.Open)))
{
for (int i = 0; i < samplesCount; i++)
{
newSamples[i].X = reader.ReadSingle();
newSamples[i].Y = reader.ReadSingle();
}
yMin = reader.ReadSingle();
yMax = reader.ReadSingle();
}
Samples = newSamples;
return samplesCount;
}
catch (Exception exc)
{
return 0;
}
}
[Category("Properties")] // Take this out, and you will soon have problems with serialization; [Category("Properties")] // Take this out, and you will soon have problems with serialization;
[DefaultValue(typeof(string), "")] [DefaultValue(typeof(string), "")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]

View File

@ -374,7 +374,14 @@ namespace GraphLib
if (gPane.Sources.Count > 0) if (gPane.Sources.Count > 0)
{ {
int val = hScrollBar1.Value; int val = hScrollBar1.Value;
gPane.starting_idx = (int)(gPane.Sources[0].Length * (float)val / 10000.0f);
int maxLen = 0;
foreach (var s in DataSources)
{
if (s.Length > maxLen) maxLen = s.Length;
}
gPane.starting_idx = (int)(maxLen * (float)val / 10000.0f);
gPane.Invalidate(); gPane.Invalidate();
} }
} }

View File

@ -56,6 +56,7 @@ namespace GraphLib
this.tb1.ShowToolTips = true; this.tb1.ShowToolTips = true;
this.tb1.Size = new System.Drawing.Size(80, 26); this.tb1.Size = new System.Drawing.Size(80, 26);
this.tb1.TabIndex = 1; this.tb1.TabIndex = 1;
this.tb1.Visible = false;
this.tb1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.tb1_ButtonClick); this.tb1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.tb1_ButtonClick);
// //
// tbbSave // tbbSave

View File

@ -125,64 +125,64 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACI ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACI
DgAAAk1TRnQBSQFMAgEBBAEAAQwBAAEMAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA DgAAAk1TRnQBSQFMAgEBBAEAARQBAAEUAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AKgADAQECwAABtwGV AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AKgADAQECwAABtgGV
AVAB/QHKAZgBWgH/AcoBlwFaAf8BygGXAVoB/wHKAZcBWgH/AcoBlwFZAf8ByQGXAVkB/wHJAZcBWQH/ AU8B/QHKAZgBWQH/AcoBlwFZAf8BygGXAVkB/wHKAZcBWQH/AcoBlwFYAf8ByQGXAVgB/wHJAZcBWAH/
AcoBmAFaAf8BtwGUAVAB/RQAAxQBHAMRARcDAgEDrAADTgGZA10B0gNNAf8BxwGVAVYB/wH5AfcB9gH/ AcoBmAFZAf8BtgGUAU8B/RQAAxQBHAMRARcDAgEDrAADTgGZA10B0gNMAf8BxwGVAVUB/wH5AfcB9gH/
AfkB8QHsAf8B+QHxAesB/wH4AfAB6QH/AfcB7QHmAf8B9AHqAeEB/wHyAegB3gH/AfoB+AH2Af8BxwGU AfkB8QHsAf8B+QHxAesB/wH4AfAB6QH/AfcB7QHmAf8B9AHqAeEB/wHyAegB3gH/AfoB+AH2Af8BxwGU
AVYB/wMZAf8DWAHRA0QBeggAAxUBHQFiAlgB6QM6AWEDDQESAwABASwAAxsBJgMbASYDGwEmAxsBJgMb AVUB/wMYAf8DWAHRA0QBeggAAxUBHQFiAlgB6QM6AWEDDQESAwABASwAAxsBJgMbASYDGwEmAxsBJgMb
ASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmEAADGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEm ASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmEAADGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEm
AxsBJgMbASYDGwEmAxsBJgMbASYIAANVAf0DpwH/A7UB/wOBAf8BrwGsAaoB/wHFAcABvQH/AcUBwAG9 AxsBJgMbASYDGwEmAxsBJgMbASYIAANUAf0DpwH/A7UB/wOBAf8BrwGsAaoB/wHFAcABvQH/AcUBwAG9
Af8BxQHAAb0B/wHFAcABvQH/AcUBwAG9Af8BxQHAAb0B/wGtAaoBqAH/AyEB/wO1Af8DmwH/AxgB/wgA Af8BxQHAAb0B/wHFAcABvQH/AcUBwAG9Af8BxQHAAb0B/wGtAaoBqAH/AyAB/wO1Af8DmwH/AxcB/wgA
AxUBHQNNAfoBOwIrAfwDXwHgAysBQgMNARIoAAMbASYDKwH8AYACgQH/AYACgQH/AYACgQH/AYACgQH/ AxUBHQNNAfoBOgIrAfwDXwHgAysBQgMNARIoAAMbASYDKwH8AYACgQH/AYACgQH/AYACgQH/AYACgQH/
AYACgQH/AYACgQH/AYACgQH/AYACgQH/AYACgQH/AxsBJhAAAxsBJgMrAfwBgAKBAf8BgAKBAf8BgAKB AYACgQH/AYACgQH/AYACgQH/AYACgQH/AYACgQH/AxsBJhAAAxsBJgMrAfwBgAKBAf8BgAKBAf8BgAKB
Af8DIwE0AxsBJgMrAfwBgAKBAf8BgAKBAf8BgAKBAf8DIwE0CAADZQH/A7UB/wO1Af8DlQH/A4EB/wOB Af8DIwE0AxsBJgMrAfwBgAKBAf8BgAKBAf8BgAKBAf8DIwE0CAADZAH/A7UB/wO1Af8DlQH/A4EB/wOB
Af8DbgH/A2MB/wNWAf8DRwH/AzgB/wM3Af8DYwH/A7UB/wO1Af8DGgH/CAADFQEdAV8CSgH7AfkB+gH5 Af8DbQH/A2IB/wNVAf8DRgH/AzcB/wM2Af8DYgH/A7UB/wO1Af8DGQH/CAADFQEdAV8CSgH7AfkB+gH5
Af8DfwH+AV8BUwFSAfsDVQGyAx0BKgMIAQsgAAMbASYDQAH9IP8DQAH9AxsBJgMAAQEMAAMbASYDQAH9 Af8DfwH+AV8BUwFSAfsDVQGyAx0BKgMIAQsgAAMbASYDQAH9IP8DQAH9AxsBJgMAAQEMAAMbASYDQAH9
AfwB/QH8Bf8DQAH9AxsBJgMbASYDQAH9AfwB/QH8Bf8DQAH9AxsBJgMAAQEEAANqAf8DuwH/A7sB/wON AfwB/QH8Bf8DQAH9AxsBJgMbASYDQAH9AfwB/QH8Bf8DQAH9AxsBJgMAAQEEAANpAf8DuwH/A7sB/wON
Af8D1AH/A7kB/wO5Af8DuQH/A7kB/wO5Af8DuQH/A9MB/wODAf8DuwH/A7sB/wMfAf8IAAMVAR0DKwH8 Af8D1AH/A7kB/wO5Af8DuQH/A7kB/wO5Af8DuQH/A9MB/wODAf8DuwH/A7sB/wMeAf8IAAMVAR0DKwH8
AfoC+wH/AfUC9gH/AfkC+gH/ATwBLwEuAfwBbQJRAfcDQgF2AxYBHgMFAQcYAAMbASYDQAH9BP8B1QHb AfoC+wH/AfUC9gH/AfkC+gH/ATsBLgEtAfwBbQJRAfcDQgF2AxYBHgMFAQcYAAMbASYDQAH9BP8B1QHb
AdgB/wHUAdsB1wH/AdQB2wHYAf8B0wHbAdcB/wHRAdkB1QH/Ac8B1wHTBf8DQAH9AxsBJgMBAQIMAAMb AdgB/wHUAdsB1wH/AdQB2wHYAf8B0wHbAdcB/wHRAdkB1QH/Ac8B1wHTBf8DQAH9AxsBJgMBAQIMAAMb
ASYDQAH9AeIB5QHkAf8B2AHfAdwB/wNAAf0DGwEmAxsBJgNAAf0D8wH/AfcB+AH3Af8DQAH9AxsBJgMB ASYDQAH9AeIB5QHkAf8B2AHfAdwB/wNAAf0DGwEmAxsBJgNAAf0D8wH/AfcB+AH3Af8DQAH9AxsBJgMB
AQIEAANvAf8D1wH/A9cB/wOXAf8D2AH/A78B/wO/Af8DvwH/A78B/wO/Af8DvwH/A9cB/wOOAf8D1wH/ AQIEAANuAf8D1wH/A9cB/wOXAf8D2AH/A78B/wO/Af8DvwH/A78B/wO/Af8DvwH/A9cB/wOOAf8D1wH/
A9cB/wM0Af8IAAMWAR4DKwH8A/sB/wHTAdoB1wH/AdoB3wHcAf8B9gH3AfYB/wHyAvMB/wE7AisB/AFg A9cB/wMzAf8IAAMWAR4DKwH8A/sB/wHTAdoB1wH/AdoB3wHcAf8B9gH3AfYB/wHyAvMB/wE6AisB/AFg
AlkB6wMzAVMDEgEZAwQBBRAAAxsBJgNAAf0E/wHaAeAB3QH/AdsB4QHeAf8B3QHiAeAB/wHdAeIB4AH/ AlkB6wMzAVMDEgEZAwQBBRAAAxsBJgNAAf0E/wHaAeAB3QH/AdsB4QHeAf8B3QHiAeAB/wHdAeIB4AH/
AdsB4QHeAf8B2AHeAdsF/wNAAf0DGwEmAwEBAgwAAxsBJgNAAf0B4gHmAeQB/wHcAeIB3wH/A0AB/QMb AdsB4QHeAf8B2AHeAdsF/wNAAf0DGwEmAwEBAgwAAxsBJgNAAf0B4gHmAeQB/wHcAeIB3wH/A0AB/QMb
ASYDGwEmA0AB/QHvAfEB8AH/AfAB8wHxAf8DQAH9AxsBJgMBAQIEAANzAf8D+QH/A/kB/wOrAf8D3wH/ ASYDGwEmA0AB/QHvAfEB8AH/AfAB8wHxAf8DQAH9AxsBJgMBAQIEAANyAf8D+QH/A/kB/wOrAf8D3wH/
A8sB/wPLAf8DywH/A8sB/wPLAf8DywH/A98B/wOjAf8D+QH/A/kB/wNWAf8IAAMWAR4DKwH8A/sB/wHf A8sB/wPLAf8DywH/A8sB/wPLAf8DywH/A98B/wOjAf8D+QH/A/kB/wNVAf8IAAMWAR4DKwH8A/sB/wHf
AeQB4QH/Ad4B4wHhAf8B3gHjAeAB/wHjAecB5QH/AfQC9QH/A38B/gGRAkAB/QNWAbYDJgE5AxABFQwA AeQB4QH/Ad4B4wHhAf8B3gHjAeAB/wHjAecB5QH/AfQC9QH/A38B/gGRAkAB/QNWAbYDJgE5AxABFQwA
AxsBJgNAAf0E/wHdAeMB4AH/AeEB5gHjAf8B5AHpAecB/wHmAeoB6AH/AeUB6QHnAf8B4gHnAeQF/wNA AxsBJgNAAf0E/wHdAeMB4AH/AeEB5gHjAf8B5AHpAecB/wHmAeoB6AH/AeUB6QHnAf8B4gHnAeQF/wNA
Af0DGwEmAwEBAgwAAxsBJgNAAf0B5AHoAeUB/wHeAeMB4QH/A0AB/QMbASYDGwEmA0AB/QHsAe8B7gH/ Af0DGwEmAwEBAgwAAxsBJgNAAf0B5AHoAeUB/wHeAeMB4QH/A0AB/QMbASYDGwEmA0AB/QHsAe8B7gH/
AecB6wHpAf8DQAH9AxsBJgMBAQIEAANqAfkD/AH/A/wB/wPLAf8D8gH/A/IB/wPyAf8D8gH/A/IB/wPy AecB6wHpAf8DQAH9AxsBJgMBAQIEAANqAfkD/AH/A/wB/wPLAf8D8gH/A/IB/wPyAf8D8gH/A/IB/wPy
Af8D8gH/A/IB/wPGAf8D/AH/A/wB/wNwAf4IAAMWAR4DKwH8A/sB/wHqAe4B7AH/AewB7wHuAf8B7AHv Af8D8gH/A/IB/wPGAf8D/AH/A/wB/wNwAf4IAAMWAR4DKwH8A/sB/wHqAe4B7AH/AewB7wHuAf8B7AHv
Ae4B/wHrAe4B7QH/AekB7AHrAf8DfwH+ATsCKwH8AVgCVgG7Ax0BKgMGAQgMAAMbASYDQAH9BP8B3wHk Ae4B/wHrAe4B7QH/AekB7AHrAf8DfwH+AToCKwH8AVgCVgG7Ax0BKgMGAQgMAAMbASYDQAH9BP8B3wHk
AeEB/wHkAekB5gH/AeoB7QHrAf8B7gHxAe8B/wHvAfEB8AH/AewB7wHuBf8DQAH9AxsBJgMBAQIMAAMb AeEB/wHkAekB5gH/AeoB7QHrAf8B7gHxAe8B/wHvAfEB8AH/AewB7wHuBf8DQAH9AxsBJgMBAQIMAAMb
ASYDQAH9AesB7QHsAf8B3QHjAeAB/wNAAf0DGwEmAxsBJgNAAf0B7QHwAe8B/wHfAeQB4QH/A0AB/QMb ASYDQAH9AesB7QHsAf8B3QHjAeAB/wNAAf0DGwEmAxsBJgNAAf0B7QHwAe8B/wHfAeQB4QH/A0AB/QMb
ASYDAQECBAADXQTSAf8D6AH/A3IB/wNyAf8DcgH/A3IB/wNyAf8DcgH/A3IB/wNyAf8DcgH/A3IB/wPo ASYDAQECBAADXQTSAf8D6AH/A3EB/wNxAf8DcQH/A3EB/wNxAf8DcQH/A3EB/wNxAf8DcQH/A3EB/wPo
Af8DxAH/A1wB3AgAAxYBHgMrAfwD+wH/AfUC9gH/AfoB+wH6Af8D+QH/Ad0C3gH/AWoCRwH5A10B7QE6 Af8DxAH/A1wB3AgAAxYBHgMrAfwD+wH/AfUC9gH/AfoB+wH6Af8D+QH/Ad0C3gH/AWoCRwH5A10B7QE6
AjkBYAMNAREUAAMbASYDQAH9BP8B3AHiAd8B/wHkAegB5gH/AesB7gHtAf8B8gH0AfMB/wH3AvgB/wH2 AjkBYAMNAREUAAMbASYDQAH9BP8B3AHiAd8B/wHkAegB5gH/AesB7gHtAf8B8gH0AfMB/wH3AvgB/wH2
AfgB9wX/A0AB/QMbASYDAQECDAADGwEmA0AB/QHyAfQB8wH/AdoB3wHdAf8DQAH9AxsBJgMcASgDQAH9 AfgB9wX/A0AB/QMbASYDAQECDAADGwEmA0AB/QHyAfQB8wH/AdoB3wHdAf8DQAH9AxsBJgMcASgDQAH9
AfMB9QH0Af8B1gHdAdkB/wNAAf0DGwEmAwEBAgQAAy0BRQOaAf8DzAH/AccBiwFDAf8B+QH0Ae0B/wH+ AfMB9QH0Af8B1gHdAdkB/wNAAf0DGwEmAwEBAgQAAy0BRQOaAf8DzAH/AccBiwFCAf8B+QH0Ae0B/wH+
AegB2AH/Af4B6AHXAf8B/QHlAdMB/wH8AeQB0QH/AfoB4AHHAf8B+QHdAcMB/wH6AfQB7QH/AccBhQE/ AegB2AH/Af4B6AHXAf8B/QHlAdMB/wH8AeQB0QH/AfoB4AHHAf8B+QHdAcMB/wH6AfQB7QH/AccBhQE+
Af8DwwH/A2kB/wMtAUUIAAMWAR4DKwH8A/sB/wHwAfMB8gH/AeYC6AH/A00B+gFiAlIB9AFRAk8BpQMU Af8DwwH/A2gB/wMtAUUIAAMWAR4DKwH8A/sB/wHwAfMB8gH/AeYC6AH/A00B+gFiAlIB9AFRAk8BpQMU
ARwDAAEBGAADGwEmA0AB/QT/AdgB3wHcAf8B4AHlAeMB/wHoAesB6gH/Ae8B8gHwAf8B9wH4AfcB/wP9 ARwDAAEBGAADGwEmA0AB/QT/AdgB3wHcAf8B4AHlAeMB/wHoAesB6gH/Ae8B8gHwAf8B9wH4AfcB/wP9
Bf8DQAH9AxsBJgMBAQIMAAMbASYDQAH9A/wB/wHVAdsB2AH/A0AB/QMbASYDHAEoA0AB/QP8Af8B0gHa Bf8DQAH9AxsBJgMBAQIMAAMbASYDQAH9A/wB/wHVAdsB2AH/A0AB/QMbASYDHAEoA0AB/QP8Af8B0gHa
AdYB/wNAAf0DGwEmAwEBAggAAzsBYwNrAfMBxQGJAUEB/wH5AfQB7wH/Af4B5wHXAf8B/QHnAdUB/wH8 AdYB/wNAAf0DGwEmAwEBAggAAzsBYwNqAfMBxQGJAUAB/wH5AfQB7wH/Af4B5wHXAf8B/QHnAdUB/wH8
AeYB0gH/AfsB4QHMAf8B+AHcAcIB/wH2AdoBvQH/AfoB9AHvAf8BxAGDAT0B/wNdAfMDOwFjDAADFgEe AeYB0gH/AfsB4QHMAf8B+AHcAcIB/wH2AdoBvQH/AfoB9AHvAf8BxAGDATwB/wNdAfMDOwFjDAADFgEe
AysB/AP7Af8BPwIzAfwDTQH6AVoCVwG9AxgBIgMCAQMgAAMbASYDQAH9IP8DQAH9AxsBJgMBAQIMAAMb AysB/AP7Af8BPgIyAfwDTQH6AVoCVwG9AxgBIgMCAQMgAAMbASYDQAH9IP8DQAH9AxsBJgMBAQIMAAMb
ASYDQAH9CP8DQAH9AxsBJgMcASgDQAH9CP8DQAH9AxsBJgMBAQIMAAMHAQkBmgF9AUcC+QH0AfAB/wH8 ASYDQAH9CP8DQAH9AxsBJgMcASgDQAH9CP8DQAH9AxsBJgMBAQIMAAMHAQkBlgF6AUcC+QH0AfAB/wH8
AeYB0wH/Af0B5wHTAf8B+wHjAc0B/wH6AeAByAH/AfUB1gG7Af8B8wHUAbUB/wH4AfQB8AH/AZkBagFH AeYB0wH/Af0B5wHTAf8B+wHjAc0B/wH6AeAByAH/AfUB1gG7Af8B8wHUAbUB/wH4AfQB8AH/AZUBagFH
AfkDBwEJEAADFgEeA0AB/QFbAjIB+wFgAlwB1AMjATMDBwEKKAADGwEmAysB/AEqAS4BLAH/ASoBLgEs AfkDBwEJEAADFgEeA0AB/QFbAjIB+wFgAlwB1AMjATMDBwEKKAADGwEmAysB/AEpAS0BKwH/ASkBLQEr
Af8BKgEuASwB/wEqAS4BLAH/ASoBLgEsAf8BKgEuASwB/wEqAS4BLAH/ASoBLgEsAf8BKgEuASwB/wMb Af8BKQEtASsB/wEpAS0BKwH/ASkBLQErAf8BKQEtASsB/wEpAS0BKwH/ASkBLQErAf8BKQEtASsB/wMb
ASYDAQECDAADGwEmAWMBVwFVAf4BKgEuASwB/wEqAS4BLAH/ASoBLgEsAf8DGwEmAxwBKAFjAVcBVQH+ ASYDAQECDAADGwEmAWMBVwFVAf4BKQEtASsB/wEpAS0BKwH/ASkBLQErAf8DGwEmAxwBKAFjAVcBVQH+
ASoBLgEsAf8BKgEuASwB/wEqAS4BLAH/AxsBJgMBAQIQAAGWAX0BUQH3AfkB9QHxAf8B/AHjAc8B/wH8 ASkBLQErAf8BKQEtASsB/wEpAS0BKwH/AxsBJgMBAQIQAAGSAXoBUQH3AfkB9QHxAf8B/AHjAc8B/wH8
AeQBzwH/AfoB4QHKAf8B+QHdAcQB/wH0AekB3wH/AfcB8gHsAf8B9QHvAekB/wGbAWABRQH7FAADFgEf AeQBzwH/AfoB4QHKAf8B+QHdAcQB/wH0AekB3wH/AfcB8gHsAf8B9QHvAekB/wGZAV8BRQH7FAADFgEf
AV4CWgHYAygBPQMNAREwAAMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEm AV4CWgHYAygBPQMNAREwAAMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEm
AxsBJgMAAQEMAAMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMA AxsBJgMAAQEMAAMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMA
AQEQAAGNAW0BSQH2AfkB9QHxAf8B/AHjAc0B/wH7AeMBzQH/AfkB4AHIAf8B+AHcAcIB/wH9AfsB+AH/ AQEQAAGJAWoBSQH2AfkB9QHxAf8B/AHjAc0B/wH7AeMBzQH/AfkB4AHIAf8B+AHcAcIB/wH9AfsB+AH/
AfwB5gHNAf8B4gG2AYQB/wJUAVIBphQAAxYBHwMRARcDAgEDuAABoAF2AU0B+gH3AfIB7AH/AfgB9AHu AfwB5gHNAf8B4gG2AYQB/wJUAVIBphQAAxYBHwMRARcDAgEDuAABngF1AU0B+gH3AfIB7AH/AfgB9AHu
Af8B+AHzAe0B/wH4AfMB7QH/AfgB8gHsAf8B8gHmAdcB/wHiAbIBcgH/AZMBcwFiAfYDBQEHFAADAwEE Af8B+AHzAe0B/wH4AfMB7QH/AfgB8gHsAf8B8gHmAdcB/wHiAbIBcQH/AZABcQFiAfYDBQEHFAADAwEE
wAADOgFgAlgBVgG7AbMBfwFPAf4ByAGMAUQB/wGWAYABUQH3AZYBgAFRAfcBsAF/AUwB/gNOAZQUAAFC wAADOgFgAlgBVgG7AbEBfwFPAf4ByAGMAUMB/wGSAX8BUQH3AZIBfwFRAfcBrgF/AUwB/gNOAZQUAAFC
AU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/gQAB3wX/AeABBwHHBf8CAAHBAf8BwAED AU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/gQAB3wX/AeABBwHHBf8CAAHBAf8BwAED
AcABAwIAAcAB/wHAAQMBwAEDAgABwAE/AcABAQHAAQECAAHAAQ8BwAEBAcABAQIAAcABAwHAAQEBwAEB AcABAwIAAcAB/wHAAQMBwAEDAgABwAE/AcABAQHAAQECAAHAAQ8BwAEBAcABAQIAAcABAwHAAQEBwAEB
AgABwAEBAcABAQHAAQECAAHAAQEBwAEBAcABAQIAAcABBwHAAQEBwAEBAgABwAEPAcABAQHAAQEBgAEB AgABwAEBAcABAQHAAQECAAHAAQEBwAEBAcABAQIAAcABBwHAAQEBwAEBAgABwAEPAcABAQHAAQEBgAEB

View File

@ -84,7 +84,7 @@ namespace GraphLib
public float CurXD1 = 0; public float CurXD1 = 0;
public float grid_distance_x = 200; // grid distance in samples ( draw a vertical line every 200 samples ) public float grid_distance_x = 60; // grid distance in samples ( draw a vertical line every 60 samples )
public float grid_off_x = 0; public float grid_off_x = 0;
public float GraphCaptionLineHeight = 28; public float GraphCaptionLineHeight = 28;
@ -452,7 +452,7 @@ namespace GraphLib
if (layout == LayoutMode.NORMAL) if (layout == LayoutMode.NORMAL)
{ {
DrawGraphCaption(CurGraphics, source, marker_pos, CurOffX + CurGraphIdx * (10 + yLabelAreaWidth), curOffY); DrawGraphCaption(CurGraphics, source, marker_pos, CurOffX + CurGraphIdx * (50 + yLabelAreaWidth) + (CurGraphIdx==0 ? 0 : 50), curOffY);
if (CurGraphIdx == 0) if (CurGraphIdx == 0)
{ {
@ -600,7 +600,7 @@ namespace GraphLib
List<int> marker_pos = DrawGraphCurve(CurGraphics, source, CurOffX, curOffY + GraphCaptionLineHeight / 2); List<int> marker_pos = DrawGraphCurve(CurGraphics, source, CurOffX, curOffY + GraphCaptionLineHeight / 2);
DrawGraphCaption(CurGraphics, source, marker_pos, CurOffX + CurGraphIdx * (10 + yLabelAreaWidth), pad_top); DrawGraphCaption(CurGraphics, source, marker_pos, CurOffX + CurGraphIdx * (50 + yLabelAreaWidth) + (CurGraphIdx == 0 ? 0 : 50), pad_top);
DrawYLabels(CurGraphics, source, marker_pos, CurOffX, curOffY); DrawYLabels(CurGraphics, source, marker_pos, CurOffX, curOffY);
@ -776,12 +776,15 @@ namespace GraphLib
float y0 = (float)(source.grid_off_y * source.CurGraphHeight / source.DY + source.off_Y); float y0 = (float)(source.grid_off_y * source.CurGraphHeight / source.DY + source.off_Y);
// draw horizontal zero grid lines // draw horizontal zero grid lines
g.DrawLine(p2, new Point((int)CurrOffX, (int)(CurOffY + y0 + 0.5f)), new Point((int)(CurrOffX + source.CurGraphWidth + 0.5f), (int)(CurOffY + y0 + 0.5f))); if (0 >= source.YD0 && 0 <= source.YD1)
{
g.DrawLine(p2, new Point((int)CurrOffX, (int)(CurOffY + y0 + 0.5f)), new Point((int)(CurrOffX + source.CurGraphWidth + 0.5f), (int)(CurOffY + y0 + 0.5f)));
}
// draw horizontal grid lines // draw horizontal grid lines
for (Idx = (int)(source.grid_off_y);Idx > (int)(source.YD0 ); Idx -= (int)source.grid_distance_y) for (float idy = source.grid_off_y; idy > source.YD0; idy -= source.grid_distance_y)
{ {
float y = (float)(Idx * source.CurGraphHeight) / source.DY + source.off_Y; float y = (idy * source.CurGraphHeight) / source.DY + source.off_Y;
if (y >= 0 && y < source.CurGraphHeight) if (y >= 0 && y < source.CurGraphHeight)
{ {
@ -792,9 +795,9 @@ namespace GraphLib
} }
// draw horizontal grid lines // draw horizontal grid lines
for (Idx = (int)(source.grid_off_y); Idx < (int)(source.YD1 ); Idx += (int)source.grid_distance_y) for (float idy = source.grid_off_y; idy < source.YD1; idy += source.grid_distance_y)
{ {
float y = (float)Idx * source.CurGraphHeight / source.DY + source.off_Y; float y = (idy * source.CurGraphHeight) / source.DY + source.off_Y;
if (y >= 0 && y < source.CurGraphHeight) if (y >= 0 && y < source.CurGraphHeight)
{ {
@ -968,71 +971,58 @@ namespace GraphLib
using (Pen pen = new Pen(b)) using (Pen pen = new Pen(b))
{ {
pen.DashPattern = new float[] { 2, 2 }; pen.DashPattern = new float[] { 2, 2 };
float GridDistY = source.grid_distance_y;
///
if (source.AutoScaleY)
{
// calculate a matching grid distance
GridDistY = -Utilities.MostSignificantDigit(source.DY);
if (GridDistY == 0)
{
GridDistY = source.grid_distance_y;
}
}
// draw labels for horizontal lines // draw labels for horizontal lines
if (source.DY != 0) if (source.DY != 0)
{ {
float Idx = 0; float y0 = (float)(source.grid_off_y * source.CurGraphHeight / source.DY + source.off_Y);
if (y0 >= 0 && y0 < source.CurGraphHeight)
{
String value = (source.OnRenderYAxisLabel == null) ? "0" : source.OnRenderYAxisLabel(source, 0);
SizeF dim = g.MeasureString(value, legendFont);
g.DrawString(value, legendFont, b, new PointF((int)offset_x - dim.Width, (int)(offset_y + y0 + 0.5f + dim.Height / 2)));
}
float y0 = (float)(source.grid_off_y * source.CurGraphHeight / source.DY + source.off_Y); for (float Idx = source.grid_off_y; Idx > source.YD0; Idx -= GridDistY)
String value = "" + Idx;
if (source.OnRenderYAxisLabel != null)
{
value = source.OnRenderYAxisLabel(source, Idx);
}
SizeF dim = g.MeasureString(value, legendFont);
g.DrawString(value, legendFont, b, new PointF((int)offset_x - dim.Width, (int)(offset_y + y0 + 0.5f + dim.Height / 2)));
float GridDistY = source.grid_distance_y;
if (source.AutoScaleY)
{
// calculate a matching grid distance
GridDistY = - Utilities.MostSignificantDigit(source.DY );
if (GridDistY == 0)
{
GridDistY = source.grid_distance_y;
}
}
for (Idx = (source.grid_off_y); Idx > (source.Cur_YD0); Idx -= GridDistY)
{ {
if (Idx != 0) if (Idx != 0)
{ {
float y1 = (float)((Idx) * source.CurGraphHeight) / source.DY + source.off_Y; float y1 = (float)(Idx * source.CurGraphHeight) / source.DY + source.off_Y;
value = "" + (Idx); if (y1 >= 0 && y1 < source.CurGraphHeight)
{
if (source.OnRenderYAxisLabel != null) string value = (source.OnRenderYAxisLabel == null) ? Idx.ToString() : source.OnRenderYAxisLabel(source, Idx);
{ SizeF dim = g.MeasureString(value, legendFont);
value = source.OnRenderYAxisLabel(source, Idx); g.DrawString(value, legendFont, b, new PointF((int)offset_x - dim.Width, (int)(offset_y + y1 + 0.5f + dim.Height / 2)));
} }
dim = g.MeasureString(value, legendFont);
g.DrawString(value, legendFont, b, new PointF((int)offset_x - dim.Width, (int)(offset_y + y1 + 0.5f + dim.Height / 2)));
} }
} }
for (Idx = (source.grid_off_y); Idx < (source.Cur_YD1); Idx += GridDistY) for (float Idx = source.grid_off_y; Idx < source.YD1; Idx += GridDistY)
{ {
if (Idx != 0) if (Idx != 0)
{ {
float y2 = (float)((Idx) * source.CurGraphHeight) / source.DY + source.off_Y; float y2 = (float)(Idx * source.CurGraphHeight) / source.DY + source.off_Y;
value = "" + (Idx); if (y2 >= 0 && y2 < source.CurGraphHeight)
{
if (source.OnRenderYAxisLabel != null) string value = (source.OnRenderYAxisLabel == null) ? Idx.ToString() : source.OnRenderYAxisLabel(source, Idx);
{ SizeF dim = g.MeasureString(value, legendFont);
value = source.OnRenderYAxisLabel(source, Idx); g.DrawString(value, legendFont, b, new PointF((int)offset_x - dim.Width, (int)(offset_y + y2 + 0.5f + dim.Height / 2)));
} }
dim = g.MeasureString(value, legendFont);
g.DrawString(value, legendFont, b, new PointF((int)offset_x - dim.Width, (int)(offset_y + y2 + 0.5f + dim.Height / 2)));
} }
} }
} }

View File

@ -11,6 +11,6 @@ namespace TBF.BenchControl.GenericDevices
void UpdateGraph(int graphId, float x, float y); void UpdateGraph(int graphId, float x, float y);
void StopGraph(int graphId); void StopGraph(int graphId, float ymin, float ymax);
} }
} }

View File

@ -33,7 +33,8 @@ namespace TBF.BenchControl.Sequences
int graphId = nextGraphId++; int graphId = nextGraphId++;
string directory = Path.Combine(TBF.Program.GraphsDir, batchNr.ToString(), testName, repetition.ToString()); string directory = Path.Combine(TBF.Program.GraphsDir, batchNr.ToString(), testName, repetition.ToString());
Directory.CreateDirectory(directory); Directory.CreateDirectory(directory);
writers.Add(graphId, new BinaryWriter(File.Open(Path.Combine(directory, caption), FileMode.Create))); BinaryWriter writer = new BinaryWriter(File.Open(Path.Combine(directory, caption), FileMode.Create));
writers.Add(graphId, writer);
log.InfoFormat("Graph file #{0} successfully created (batch={1} test={2} repet={3} caption={4})", log.InfoFormat("Graph file #{0} successfully created (batch={1} test={2} repet={3} caption={4})",
graphId, batchNr, testName, repetition, caption); graphId, batchNr, testName, repetition, caption);
return graphId; return graphId;
@ -60,12 +61,14 @@ namespace TBF.BenchControl.Sequences
} }
} }
public void StopGraph(int graphId) public void StopGraph(int graphId, float ymin, float ymax)
{ {
try try
{ {
BinaryWriter writer = writers[graphId]; BinaryWriter writer = writers[graphId];
writer.Close(); writer.Write(ymin);
writer.Write(ymax);
writer.Close();
writers.Remove(graphId); writers.Remove(graphId);
} }
catch (Exception exc) catch (Exception exc)

View File

@ -81,14 +81,14 @@ namespace TBF.BenchControl.Sequences
public static Statistics AmbPressStat = new Statistics(new Plotter("Ambient pressure")); public static Statistics AmbPressStat = new Statistics(new Plotter("Ambient pressure"));
public static Statistics AmbHumiStat = new Statistics(new Plotter("Ambient humidity")); public static Statistics AmbHumiStat = new Statistics(new Plotter("Ambient humidity"));
public static Statistics TempUpStat = new Statistics(0, 5, true, new Plotter("Temperature up")); public static Statistics TempUpStat = new Statistics(0, 7, true, new Plotter("Temperature up"));
public static Statistics TempDownStat = new Statistics(0, 5, true, new Plotter("Temperature down")); public static Statistics TempDownStat = new Statistics(0, 7, true, new Plotter("Temperature down"));
public static Statistics TempDiffStat = new Statistics(0, 5, true); public static Statistics TempDiffStat = new Statistics(0, 7, true);
public static Statistics TempDivStat = new Statistics(0, 5, true, new Plotter("Temperature div")); public static Statistics TempDivStat = new Statistics(0, 7, true, new Plotter("Temperature div"));
public static Statistics PressUpStat = new Statistics(5, 5, true, new Plotter("Pressure up")); public static Statistics PressUpStat = new Statistics(5, 7, true, new Plotter("Pressure up"));
public static Statistics PressDownStat = new Statistics(5, 5, true, new Plotter("Pressure down")); public static Statistics PressDownStat = new Statistics(5, 7, true, new Plotter("Pressure down"));
public static Statistics PressDeltaStat = new Statistics(5, 5, true); public static Statistics PressDeltaStat = new Statistics(5, 7, true);
public static Statistics RefFlowStat = new Statistics(5, 5, true, new Plotter("Flow")); public static Statistics RefFlowStat = new Statistics(5, 7, true, new Plotter("Flow"));
public static Statistics TempRefHiStat = new Statistics(); public static Statistics TempRefHiStat = new Statistics();
public static Statistics TempRefLoStat = new Statistics(); public static Statistics TempRefLoStat = new Statistics();

View File

@ -93,7 +93,7 @@ namespace TBF.BenchControl.Sequences
if (recordingInProgress) if (recordingInProgress)
{ {
recordingInProgress = false; recordingInProgress = false;
plotter.StopGraph(graphId); plotter.StopGraph(graphId, (float)min, (float)max);
} }
} }
@ -190,7 +190,13 @@ namespace TBF.BenchControl.Sequences
if (MedianFilter) if (MedianFilter)
{ {
Array.Sort(sorted); Array.Sort(sorted);
#if false
filteredValue = sorted[FilterSize / 2]; filteredValue = sorted[FilterSize / 2];
#else
double sum2 = 0;
for (int j = 1; j < FilterSize - 1; j++) sum2 += sorted[j];
filteredValue = sum2 / (FilterSize - 2);
#endif
} }
else else
{ {
@ -208,6 +214,6 @@ namespace TBF.BenchControl.Sequences
public int StartGraph(int batchNr, string testName, int repetition) { return 1; } public int StartGraph(int batchNr, string testName, int repetition) { return 1; }
public void UpdateGraph(int graphId, float x, float y) { } public void UpdateGraph(int graphId, float x, float y) { }
public void StopGraph(int graphId) { } public void StopGraph(int graphId, float ymin, float ymax) { }
} }
} }

View File

@ -346,7 +346,11 @@ namespace TBF.BenchControl
/// </summary> /// </summary>
public static void StopDevices() public static void StopDevices()
{ {
foreach (var dev in devices) dev.StopDevice(); foreach (var dev in devices)
{
UiBridge.Bridge.OnActivity(null, string.Format("1. {0}", dev.Name)); /// Info
dev.StopDevice();
}
} }
/// <summary> /// <summary>
@ -356,7 +360,11 @@ namespace TBF.BenchControl
/// </summary> /// </summary>
public static void StopDevices2() public static void StopDevices2()
{ {
foreach (var dev in devices) dev.StopDevice2(); foreach (var dev in devices)
{
UiBridge.Bridge.OnActivity(null, string.Format("2. {0}", dev.Name)); /// Info
dev.StopDevice2();
}
} }

View File

@ -135,6 +135,8 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection
//------------------------------------------------ //------------------------------------------------
RefFlow.Val = (1.0 + 0.2 * Math.Sin(2 * Math.PI * (float)remainingTime.Val / test.TstTime)) * (test.Qfrom + test.Qto) / 2.0; RefFlow.Val = (1.0 + 0.2 * Math.Sin(2 * Math.PI * (float)remainingTime.Val / test.TstTime)) * (test.Qfrom + test.Qto) / 2.0;
PressUp.Val = 2.7f;
PressDown.Val = 2.2f;
UpdateAllStatistics(StateMachine.Time); UpdateAllStatistics(StateMachine.Time);
} }

View File

@ -218,6 +218,15 @@ namespace TBF
public string[] RsltItems_Printer_CombinedWM; /// obsolete public string[] RsltItems_Printer_CombinedWM; /// obsolete
public string[] RsltItems_Printer_HeatM; /// obsolete public string[] RsltItems_Printer_HeatM; /// obsolete
/// Configuration of graphs
public bool Graph1_On;
public bool Graph2_On;
public bool Graph3_On;
public bool Graph4_On;
public bool Graph5_On;
public bool Graph6_On;
public GraphLib.PlotterGraphPaneEx.LayoutMode GraphsLayoutMode;
[XmlArrayAttribute("RsltsClmnWidths")] [XmlArrayAttribute("RsltsClmnWidths")]
public int[] RsltsClmnWidths; public int[] RsltsClmnWidths;
[XmlIgnore] [XmlIgnore]

View File

@ -114,7 +114,7 @@ namespace TBF
iPerlHeadsToolStripMenuItem.Visible = false; iPerlHeadsToolStripMenuItem.Visible = false;
#endif #endif
CycleRunning = false; CycleRunning = true;
benchInitializationFailed = false; benchInitializationFailed = false;
/// ///
@ -547,8 +547,11 @@ namespace TBF
if (BenchControl.StateMachine.Running && CycleRunning) if (BenchControl.StateMachine.Running && CycleRunning)
{ {
MessageBox.Show(Strings.Finish_the_session_please, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show(Strings.Finish_the_session_please, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
if (e is FormClosingEventArgs) (e as FormClosingEventArgs).Cancel = true; if (e is FormClosingEventArgs)
{
(e as FormClosingEventArgs).Cancel = true;
}
return; return;
} }
@ -559,6 +562,13 @@ namespace TBF
{ {
if (BenchControl.StateMachine.Running) if (BenchControl.StateMachine.Running)
{ {
Bridge.Ui2Bench(UI2BenchCmd.Shutdown); /// Drain tanks and quit the main sequence
do
{
Thread.Sleep(100);
}
while (BenchControl.StateMachine.Running); /// Wait until StateMachine.Worker() completes
/// Show 'Closing_Test_Bench_Framework' modeless window in separate thread /// Show 'Closing_Test_Bench_Framework' modeless window in separate thread
var form = new TBF.Forms.ModelessActivityForm() var form = new TBF.Forms.ModelessActivityForm()
{ {
@ -567,14 +577,11 @@ namespace TBF
FontSize = 24, FontSize = 24,
FontStyle = FontStyle.Regular, FontStyle = FontStyle.Regular,
BackgroundColor = Color.PeachPuff, BackgroundColor = Color.PeachPuff,
StartActivityHandler = false, StartActivityHandler = true,
}; };
Thread formThread = new Thread(() => form.ShowDialog()); Thread formThread = new Thread(() => form.ShowDialog());
formThread.Start(); formThread.Start();
Bridge.Ui2Bench(UI2BenchCmd.Shutdown); /// Drain tanks and quit the main sequence
while (BenchControl.StateMachine.Running) { } /// Wait until StateMachine.Worker() completes
BenchControl.StateMachine.StopDevices(); BenchControl.StateMachine.StopDevices();
BenchControl.StateMachine.StopDevices2(); BenchControl.StateMachine.StopDevices2();

View File

@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number // Build Number
// Revision // Revision
// //
[assembly: AssemblyVersion("2.18.803.0")] [assembly: AssemblyVersion("2.18.810.0")]
[assembly: AssemblyFileVersion("2.18.803.0")] [assembly: AssemblyFileVersion("2.18.810.0")]

View File

@ -996,6 +996,15 @@ namespace TBF.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to current.
/// </summary>
internal static string current {
get {
return ResourceManager.GetString("current", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Data. /// Looks up a localized string similar to Data.
/// </summary> /// </summary>
@ -1680,6 +1689,15 @@ namespace TBF.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Flow.
/// </summary>
internal static string Flow {
get {
return ResourceManager.GetString("Flow", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Flow [m3/h]. /// Looks up a localized string similar to Flow [m3/h].
/// </summary> /// </summary>
@ -2868,6 +2886,15 @@ namespace TBF.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Pressure.
/// </summary>
internal static string Pressure {
get {
return ResourceManager.GetString("Pressure", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Pressure [bar]. /// Looks up a localized string similar to Pressure [bar].
/// </summary> /// </summary>
@ -3462,6 +3489,15 @@ namespace TBF.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Refresh.
/// </summary>
internal static string Refresh {
get {
return ResourceManager.GetString("Refresh", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Reg. valve. /// Looks up a localized string similar to Reg. valve.
/// </summary> /// </summary>

View File

@ -1320,4 +1320,16 @@
<data name="Finish_the_session_please" xml:space="preserve"> <data name="Finish_the_session_please" xml:space="preserve">
<value>Ukončete měření prosím</value> <value>Ukončete měření prosím</value>
</data> </data>
<data name="Refresh" xml:space="preserve">
<value>Obnovit</value>
</data>
<data name="current" xml:space="preserve">
<value>současný</value>
</data>
<data name="Flow" xml:space="preserve">
<value>Průtok</value>
</data>
<data name="Pressure" xml:space="preserve">
<value>Tlak</value>
</data>
</root> </root>

View File

@ -1461,4 +1461,16 @@
<data name="Finish_the_session_please" xml:space="preserve"> <data name="Finish_the_session_please" xml:space="preserve">
<value>Beenden Sie die Messungen bitte</value> <value>Beenden Sie die Messungen bitte</value>
</data> </data>
<data name="Refresh" xml:space="preserve">
<value>Aktualisierung</value>
</data>
<data name="current" xml:space="preserve">
<value>aktuell</value>
</data>
<data name="Flow" xml:space="preserve">
<value>Durchfluss</value>
</data>
<data name="Pressure" xml:space="preserve">
<value>Druck</value>
</data>
</root> </root>

View File

@ -1852,4 +1852,16 @@
<data name="Finish_the_session_please" xml:space="preserve"> <data name="Finish_the_session_please" xml:space="preserve">
<value>Finish measurements please</value> <value>Finish measurements please</value>
</data> </data>
<data name="Refresh" xml:space="preserve">
<value>Refresh</value>
</data>
<data name="current" xml:space="preserve">
<value>current</value>
</data>
<data name="Flow" xml:space="preserve">
<value>Flow</value>
</data>
<data name="Pressure" xml:space="preserve">
<value>Pressure</value>
</data>
</root> </root>

View File

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TBF.Screens
{
public class Graph
{
public Graph(string fileName)
{
}
}
}

View File

@ -1,101 +1,291 @@
/// ///
/// Copyright (c) 2017 Sensus Metering Systems /// Copyright (c) 2018 Sensus Slovensko a.s.
/// ///
using System; using System;
using System.Drawing; using System.Drawing;
using System.IO;
using System.Windows.Forms; using System.Windows.Forms;
using TBF.Resources; using TBF.Resources;
using TBF.UiBridge; using TBF.UiBridge;
using GraphLib; using GraphLib;
using log4net;
namespace TBF.Screens namespace TBF.Screens
{ {
public partial class GraphsTabPageCtrl : UserControl public partial class GraphsTabPageCtrl : UserControl
{ {
readonly int numGraphs; static readonly ILog log = LogManager.GetLogger(typeof(GraphsTabPageCtrl));
DataSource[] dataSources;
static readonly GraphInfo[] SupportedGraphs = new GraphInfo[] {
new GraphInfo { FileName = "Flow", Caption = string.Format("Q [m3/h]", Strings.Flow) },
new GraphInfo { FileName = "Pressure up", Caption = string.Format("Pr up [bar]", Strings.Pressure) },
new GraphInfo { FileName = "Pressure down", Caption = string.Format("Pr dw [bar]", Strings.Pressure) },
new GraphInfo { FileName = "Temperature up", Caption = string.Format("T up [°C]", Strings.Temperature) },
new GraphInfo { FileName = "Temperature down", Caption = string.Format("T dw [°C]", Strings.Temperature) },
new GraphInfo { FileName = "Temperature div", Caption = string.Format("T di [°C]", Strings.Temperature) },
};
PlotterGraphPaneEx.LayoutMode layoutMode;
CheckBox[] checkBoxes;
string selectedGraphsPath;
int selectedBatchNr;
string selectedTestName;
public GraphsTabPageCtrl() public GraphsTabPageCtrl()
{ {
InitializeComponent(); InitializeComponent();
button1.Text = Strings.ClearBtnText;
plotterDisplayEx.Smoothing = System.Drawing.Drawing2D.SmoothingMode.None; /// checkBoxes array must be initialized before other actions
checkBoxes = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6 };
dataSources = CreateDataSources(new string[] { "Flow", "Temperature", "Pressure", "Reg. valve position" }); Localize();
numGraphs = dataSources.Length;
CalcDataGraphs(plotterDisplayEx, dataSources);
plotterDisplayEx.Refresh(); UpdateCheckBoxesVisibility();
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;
Bridge.ProcessDataHandler += delegate(object sender, ProcessDataEventArgs args) layoutMode = Program.LocalSettings.GraphsLayoutMode;
layoutModeComboBox.Text = layoutMode.ToString();
for (PlotterGraphPaneEx.LayoutMode mode = 0; mode <= PlotterGraphPaneEx.LayoutMode.TILES_HOR; mode++)
{ {
if (InvokeRequired) layoutModeComboBox.Items.Add(mode.ToString());
{ }
Invoke(new EventHandler<ProcessDataEventArgs>(OnProcessData), sender, args);
}
else OnProcessData(sender, args);
};
}
private void button1_Click(object sender, EventArgs e) UpdateTestsHistory(testsHistoryTreeView);
{
/// TODO: implement selectedGraphsPath = null;
}
void OnProcessData(object sender, ProcessDataEventArgs args) //Bridge.ProcessDataHandler += delegate(object sender, ProcessDataEventArgs args)
{
//if (!paused && isRunning == true)
//{ //{
//try // if (InvokeRequired)
//{ // {
// gPane.starting_idx += Math.Min(RichTextBoxFinds.BenchControl.StateMachine.; // Invoke(new EventHandler<ProcessDataEventArgs>(OnProcessData), sender, args);
// UpdateScrollBar(); // }
// gPane.Invalidate(); // else OnProcessData(sender, args);
//} //};
//catch { }
//}
} }
DataSource[] CreateDataSources(string[] names) //void OnProcessData(object sender, ProcessDataEventArgs args)
//{
// if (!paused && isRunning == true)
// {
// try
// {
// gPane.starting_idx += Math.Min(RichTextBoxFinds.BenchControl.StateMachine.;
// UpdateScrollBar();
// gPane.Invalidate();
// }
// catch { }
// }
//}
void Localize()
{ {
DataSource[] ds = new DataSource[names.Length]; refreshButton.Text = Strings.Refresh;
for (int i = 0; i < checkBoxes.Length; i++)
for (int i = 0; i < names.Length; i++)
{ {
ds[i] = new DataSource(); if (i < SupportedGraphs.Length)
ds[i].Name = names[i]; {
ds[i].OnRenderXAxisLabel += RenderXLabel; checkBoxes[i].Text = SupportedGraphs[i].Caption;
ds[i].OnRenderYAxisLabel = RenderYLabel; }
ds[i].Length = 5800;
ds[i].AutoScaleY = false;
ds[i].SetDisplayRangeY(-250, 250);
ds[i].SetGridDistanceY(100);
} }
return ds;
} }
protected void CalcDataGraphs(PlotterDisplayEx display, DataSource[] dataSources) void UpdateCheckBoxesVisibility()
{ {
this.SuspendLayout(); for (int i = 0; i < checkBoxes.Length; i++)
{
display.SetDisplayRangeX(0, 400); checkBoxes[i].Visible = (i < SupportedGraphs.Length);
display.PanelLayout = PlotterGraphPaneEx.LayoutMode.STACKED;
display.DataSources.Clear();
for (int j = 0; j < dataSources.Length; j++)
{
display.DataSources.Add(dataSources[j]);
} }
}
ApplyColorSchema(display); private void refreshButton_Click(object sender, EventArgs e)
{
UpdateTestsHistory(testsHistoryTreeView);
}
void UpdateTestsHistory(TreeView treeView)
{
try
{
string[] batches = Directory.GetDirectories(Program.GraphsDir);
treeView.Nodes.Clear();
for (int i = batches.Length - 1; i >= Math.Max(0, batches.Length - 20); i--)
{
string b = batches[i];
string bstr = Path.GetFileName(b);
if ((TBF.BenchControl.Sequences.ProcessData.BatchRslts != null) && bstr.Equals(TBF.BenchControl.Sequences.ProcessData.BatchRslts.Batch.BatchNr.ToString()))
{
bstr = Strings.current;
}
TreeNode node = new TreeNode(bstr);
node.Tag = null;
treeView.Nodes.Add(node);
string[] tests = Directory.GetDirectories(b);
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], bstr, 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, bstr, testNameStr, repetStr);
subnode.Nodes.Add(subsubnode);
}
}
else
{
subnode.Tag = null;
}
}
}
}
catch (Exception exc)
{
log.ErrorFormat("UpdateTestsHistory() failed: {0}", exc.Message);
}
}
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);
}
}
void ShowGraphs(PlotterDisplayEx display, string path, int batchNr, string testName)
{
Color[] colors = { Color.DarkRed,
Color.DarkSlateGray,
Color.DarkCyan,
Color.DarkGreen,
Color.DarkBlue ,
Color.DarkMagenta,
Color.DeepPink };
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(); this.ResumeLayout();
display.Refresh(); display.Refresh();
} }
private string RenderXLabel(DataSource s, int idx) private string RenderXLabel(DataSource s, int idx)
{ {
if (s.AutoScaleX) if (s.AutoScaleX)
@ -107,7 +297,7 @@ namespace TBF.Screens
} }
else else
{ {
return string.Format("{0}\"", (int)(s.Samples[idx].X / 200)); return ((int)(s.Samples[idx].X)).ToString();
} }
} }
@ -116,76 +306,37 @@ namespace TBF.Screens
return string.Format("{0:0.0}", value); return string.Format("{0:0.0}", value);
} }
void ApplyColorSchema(PlotterDisplayEx display) 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(); }
void AnyCBChanged()
{ {
Color[] colors = { Color.DarkRed, if (selectedGraphsPath != null)
Color.DarkSlateGray,
Color.DarkCyan,
Color.DarkGreen,
Color.DarkBlue ,
Color.DarkMagenta,
Color.DeepPink };
for (int i = 0; i < numGraphs; i++)
{ {
display.DataSources[i].GraphColor = colors[i % 7]; ShowGraphs(plotterDisplayEx, selectedGraphsPath, selectedBatchNr, selectedTestName);
}
display.BackgroundColorTop = Color.White;
display.BackgroundColorBot = Color.White;
display.SolidGridColor = Color.LightGray;
display.DashedGridColor = Color.LightGray;
}
protected void CalcSinusFunction_0(DataSource dataSrc, int idx)
{
for (int i = 0; i < dataSrc.Length; i++)
{
dataSrc.Samples[i].X = i;
dataSrc.Samples[i].Y = (float)(((float)200 * Math.Sin((idx + 1) * (i + 1.0) * 48 / dataSrc.Length)));
} }
} }
protected void CalcSinusFunction_1(DataSource dataSrc, int idx) private void layoutModeComboBox_SelectedIndexChanged(object sender, EventArgs e)
{ {
for (int i = 0; i < dataSrc.Length; i++) for (PlotterGraphPaneEx.LayoutMode mode = 0; mode <= PlotterGraphPaneEx.LayoutMode.TILES_HOR; mode++)
{ {
dataSrc.Samples[i].X = i; if (layoutModeComboBox.Text.Equals(mode.ToString()) && layoutMode != mode)
{
dataSrc.Samples[i].Y = (float)(((float)20 * Program.LocalSettings.GraphsLayoutMode = layoutMode = mode;
Math.Sin(20 * (idx + 1) * (i + 1) * Math.PI / dataSrc.Length)) * ShowGraphs(plotterDisplayEx, selectedGraphsPath, selectedBatchNr, selectedTestName);
Math.Sin(40 * (idx + 1) * (i + 1) * Math.PI / dataSrc.Length)) + }
(float)(((float)200 *
Math.Sin(200 * (idx + 1) * (i + 1) * Math.PI / dataSrc.Length)));
}
}
protected void CalcSinusFunction_2(DataSource dataSrc, int idx)
{
for (int i = 0; i < dataSrc.Length; i++)
{
dataSrc.Samples[i].X = i;
dataSrc.Samples[i].Y = (float)(((float)20 *
Math.Sin(40 * (idx + 1) * i * Math.PI / dataSrc.Length)) *
Math.Sin(160 * (idx + 1) * i * Math.PI / dataSrc.Length)) +
(float)(((float)200 *
Math.Sin(4 * (idx + 1) * i * Math.PI / dataSrc.Length)));
}
}
protected void CalcSinusFunction_3(DataSource dataSrc, int idx, float time)
{
PointF[] samps = dataSrc.Samples;
for (int i = 0; i < samps.Length; i++)
{
samps[i].X = i;
samps[i].Y = 200 + (float)((200 * Math.Sin((idx + 1) * (time + i * 100) / 8000.0))) +
+(float)((40 * Math.Sin((idx + 1) * (time + i * 200) / 2000.0)));
/**
(float)( 4* Math.Sin( ((time + (i+8) * 100) / 900.0)))+
(float)(28 * Math.Sin(((time + (i + 8) * 100) / 290.0))); */
} }
} }
} }
class GraphInfo
{
public string FileName; /// Name of a file written y the plotter
public string Caption; /// Displayed graph lable
}
} }

View File

@ -33,22 +33,28 @@ namespace TBF.Screens
{ {
this.components = new System.ComponentModel.Container(); this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GraphsTabPageCtrl)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GraphsTabPageCtrl));
this.button1 = new System.Windows.Forms.Button();
this.splitContainer = new System.Windows.Forms.SplitContainer(); this.splitContainer = new System.Windows.Forms.SplitContainer();
this.testsHistoryTreeView = new System.Windows.Forms.TreeView();
this.plotterDisplayEx = new GraphLib.PlotterDisplayEx(); this.plotterDisplayEx = new GraphLib.PlotterDisplayEx();
this.refreshButton = new System.Windows.Forms.Button();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.checkBox6 = new System.Windows.Forms.CheckBox();
this.checkBox5 = new System.Windows.Forms.CheckBox();
this.checkBox4 = new System.Windows.Forms.CheckBox();
this.checkBox3 = new System.Windows.Forms.CheckBox();
this.checkBox2 = new System.Windows.Forms.CheckBox();
this.checkBox1 = new System.Windows.Forms.CheckBox();
this.layoutModeComboBox = new System.Windows.Forms.ComboBox();
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel1.SuspendLayout();
this.splitContainer.Panel2.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout();
this.splitContainer.SuspendLayout(); this.splitContainer.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// button1
//
resources.ApplyResources(this.button1, "button1");
this.button1.Name = "button1";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// splitContainer // splitContainer
// //
resources.ApplyResources(this.splitContainer, "splitContainer"); resources.ApplyResources(this.splitContainer, "splitContainer");
@ -58,12 +64,18 @@ namespace TBF.Screens
// splitContainer.Panel1 // splitContainer.Panel1
// //
this.splitContainer.Panel1.BackColor = System.Drawing.SystemColors.Control; this.splitContainer.Panel1.BackColor = System.Drawing.SystemColors.Control;
this.splitContainer.Panel1.Controls.Add(this.button1); this.splitContainer.Panel1.Controls.Add(this.testsHistoryTreeView);
// //
// splitContainer.Panel2 // splitContainer.Panel2
// //
this.splitContainer.Panel2.Controls.Add(this.plotterDisplayEx); this.splitContainer.Panel2.Controls.Add(this.plotterDisplayEx);
// //
// testsHistoryTreeView
//
resources.ApplyResources(this.testsHistoryTreeView, "testsHistoryTreeView");
this.testsHistoryTreeView.Name = "testsHistoryTreeView";
this.testsHistoryTreeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.testsHistoryTreeView_NodeMouseClick);
//
// plotterDisplayEx // plotterDisplayEx
// //
this.plotterDisplayEx.BackColor = System.Drawing.Color.Transparent; this.plotterDisplayEx.BackColor = System.Drawing.Color.Transparent;
@ -75,25 +87,116 @@ namespace TBF.Screens
this.plotterDisplayEx.Name = "plotterDisplayEx"; this.plotterDisplayEx.Name = "plotterDisplayEx";
this.plotterDisplayEx.SolidGridColor = System.Drawing.Color.DarkGray; this.plotterDisplayEx.SolidGridColor = System.Drawing.Color.DarkGray;
// //
// refreshButton
//
resources.ApplyResources(this.refreshButton, "refreshButton");
this.refreshButton.Name = "refreshButton";
this.refreshButton.UseVisualStyleBackColor = true;
this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
//
// splitContainer1
//
resources.ApplyResources(this.splitContainer1, "splitContainer1");
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.layoutModeComboBox);
this.splitContainer1.Panel1.Controls.Add(this.checkBox6);
this.splitContainer1.Panel1.Controls.Add(this.checkBox5);
this.splitContainer1.Panel1.Controls.Add(this.checkBox4);
this.splitContainer1.Panel1.Controls.Add(this.checkBox3);
this.splitContainer1.Panel1.Controls.Add(this.checkBox2);
this.splitContainer1.Panel1.Controls.Add(this.checkBox1);
this.splitContainer1.Panel1.Controls.Add(this.refreshButton);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.splitContainer);
//
// checkBox6
//
resources.ApplyResources(this.checkBox6, "checkBox6");
this.checkBox6.Name = "checkBox6";
this.checkBox6.UseVisualStyleBackColor = true;
this.checkBox6.CheckedChanged += new System.EventHandler(this.checkBox6_CheckedChanged);
//
// checkBox5
//
resources.ApplyResources(this.checkBox5, "checkBox5");
this.checkBox5.Name = "checkBox5";
this.checkBox5.UseVisualStyleBackColor = true;
this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged);
//
// checkBox4
//
resources.ApplyResources(this.checkBox4, "checkBox4");
this.checkBox4.Name = "checkBox4";
this.checkBox4.UseVisualStyleBackColor = true;
this.checkBox4.CheckedChanged += new System.EventHandler(this.checkBox4_CheckedChanged);
//
// checkBox3
//
resources.ApplyResources(this.checkBox3, "checkBox3");
this.checkBox3.Name = "checkBox3";
this.checkBox3.UseVisualStyleBackColor = true;
this.checkBox3.CheckedChanged += new System.EventHandler(this.checkBox3_CheckedChanged);
//
// checkBox2
//
resources.ApplyResources(this.checkBox2, "checkBox2");
this.checkBox2.Name = "checkBox2";
this.checkBox2.UseVisualStyleBackColor = true;
this.checkBox2.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged);
//
// checkBox1
//
resources.ApplyResources(this.checkBox1, "checkBox1");
this.checkBox1.Name = "checkBox1";
this.checkBox1.UseVisualStyleBackColor = true;
this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
//
// layoutModeComboBox
//
this.layoutModeComboBox.FormattingEnabled = true;
resources.ApplyResources(this.layoutModeComboBox, "layoutModeComboBox");
this.layoutModeComboBox.Name = "layoutModeComboBox";
this.layoutModeComboBox.SelectedIndexChanged += new System.EventHandler(this.layoutModeComboBox_SelectedIndexChanged);
//
// GraphsTabPageCtrl // GraphsTabPageCtrl
// //
resources.ApplyResources(this, "$this"); resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Silver; this.BackColor = System.Drawing.Color.Silver;
this.Controls.Add(this.splitContainer); this.Controls.Add(this.splitContainer1);
this.Name = "GraphsTabPageCtrl"; this.Name = "GraphsTabPageCtrl";
this.splitContainer.Panel1.ResumeLayout(false); this.splitContainer.Panel1.ResumeLayout(false);
this.splitContainer.Panel2.ResumeLayout(false); this.splitContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
this.splitContainer.ResumeLayout(false); this.splitContainer.ResumeLayout(false);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
} }
#endregion #endregion
private System.Windows.Forms.Button button1;
private System.Windows.Forms.SplitContainer splitContainer; private System.Windows.Forms.SplitContainer splitContainer;
private GraphLib.PlotterDisplayEx plotterDisplayEx; private GraphLib.PlotterDisplayEx plotterDisplayEx;
private System.Windows.Forms.TreeView testsHistoryTreeView;
private System.Windows.Forms.Button refreshButton;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.CheckBox checkBox6;
private System.Windows.Forms.CheckBox checkBox5;
private System.Windows.Forms.CheckBox checkBox4;
private System.Windows.Forms.CheckBox checkBox3;
private System.Windows.Forms.CheckBox checkBox2;
private System.Windows.Forms.CheckBox checkBox1;
private System.Windows.Forms.ComboBox layoutModeComboBox;
} }
} }

View File

@ -117,51 +117,42 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="button1.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 8.25pt</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="button1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="button1.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 34</value>
</data>
<data name="button1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>2, 2, 2, 2</value>
</data>
<data name="button1.Size" type="System.Drawing.Size, System.Drawing">
<value>42, 30</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="button1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="button1.Text" xml:space="preserve">
<value>&amp;Btn1</value>
</data>
<data name="&gt;&gt;button1.Name" xml:space="preserve">
<value>button1</value>
</data>
<data name="&gt;&gt;button1.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button1.Parent" xml:space="preserve">
<value>splitContainer.Panel1</value>
</data>
<data name="&gt;&gt;button1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="splitContainer.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="splitContainer.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
</data> </data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="splitContainer.IsSplitterFixed" type="System.Boolean, mscorlib"> <data name="splitContainer.IsSplitterFixed" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
</data> </data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="splitContainer.Location" type="System.Drawing.Point, System.Drawing"> <data name="splitContainer.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value> <value>0, 0</value>
</data> </data>
<data name="testsHistoryTreeView.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="testsHistoryTreeView.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="testsHistoryTreeView.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 655</value>
</data>
<data name="testsHistoryTreeView.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;testsHistoryTreeView.Name" xml:space="preserve">
<value>testsHistoryTreeView</value>
</data>
<data name="&gt;&gt;testsHistoryTreeView.Type" xml:space="preserve">
<value>System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;testsHistoryTreeView.Parent" xml:space="preserve">
<value>splitContainer.Panel1</value>
</data>
<data name="&gt;&gt;testsHistoryTreeView.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;splitContainer.Panel1.Name" xml:space="preserve"> <data name="&gt;&gt;splitContainer.Panel1.Name" xml:space="preserve">
<value>splitContainer.Panel1</value> <value>splitContainer.Panel1</value>
</data> </data>
@ -181,7 +172,7 @@
<value>0, 0</value> <value>0, 0</value>
</data> </data>
<data name="plotterDisplayEx.Size" type="System.Drawing.Size, System.Drawing"> <data name="plotterDisplayEx.Size" type="System.Drawing.Size, System.Drawing">
<value>896, 689</value> <value>836, 655</value>
</data> </data>
<data name="plotterDisplayEx.TabIndex" type="System.Int32, mscorlib"> <data name="plotterDisplayEx.TabIndex" type="System.Int32, mscorlib">
<value>0</value> <value>0</value>
@ -211,10 +202,10 @@
<value>1</value> <value>1</value>
</data> </data>
<data name="splitContainer.Size" type="System.Drawing.Size, System.Drawing"> <data name="splitContainer.Size" type="System.Drawing.Size, System.Drawing">
<value>965, 689</value> <value>965, 655</value>
</data> </data>
<data name="splitContainer.SplitterDistance" type="System.Int32, mscorlib"> <data name="splitContainer.SplitterDistance" type="System.Int32, mscorlib">
<value>65</value> <value>125</value>
</data> </data>
<data name="splitContainer.TabIndex" type="System.Int32, mscorlib"> <data name="splitContainer.TabIndex" type="System.Int32, mscorlib">
<value>2</value> <value>2</value>
@ -226,11 +217,275 @@
<value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="&gt;&gt;splitContainer.Parent" xml:space="preserve"> <data name="&gt;&gt;splitContainer.Parent" xml:space="preserve">
<value>$this</value> <value>splitContainer1.Panel2</value>
</data> </data>
<data name="&gt;&gt;splitContainer.ZOrder" xml:space="preserve"> <data name="&gt;&gt;splitContainer.ZOrder" xml:space="preserve">
<value>0</value> <value>0</value>
</data> </data>
<data name="refreshButton.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 2</value>
</data>
<data name="refreshButton.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 28</value>
</data>
<data name="refreshButton.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="refreshButton.Text" xml:space="preserve">
<value>Refresh</value>
</data>
<data name="&gt;&gt;refreshButton.Name" xml:space="preserve">
<value>refreshButton</value>
</data>
<data name="&gt;&gt;refreshButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;refreshButton.Parent" xml:space="preserve">
<value>splitContainer1.Panel1</value>
</data>
<data name="&gt;&gt;refreshButton.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="splitContainer1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="splitContainer1.IsSplitterFixed" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="splitContainer1.Orientation" type="System.Windows.Forms.Orientation, System.Windows.Forms">
<value>Horizontal</value>
</data>
<data name="layoutModeComboBox.Location" type="System.Drawing.Point, System.Drawing">
<value>129, 6</value>
</data>
<data name="layoutModeComboBox.Size" type="System.Drawing.Size, System.Drawing">
<value>137, 21</value>
</data>
<data name="layoutModeComboBox.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="&gt;&gt;layoutModeComboBox.Name" xml:space="preserve">
<value>layoutModeComboBox</value>
</data>
<data name="&gt;&gt;layoutModeComboBox.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;layoutModeComboBox.Parent" xml:space="preserve">
<value>splitContainer1.Panel1</value>
</data>
<data name="&gt;&gt;layoutModeComboBox.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="checkBox6.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="checkBox6.Location" type="System.Drawing.Point, System.Drawing">
<value>880, 10</value>
</data>
<data name="checkBox6.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 17</value>
</data>
<data name="checkBox6.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="checkBox6.Text" xml:space="preserve">
<value>checkBox6</value>
</data>
<data name="&gt;&gt;checkBox6.Name" xml:space="preserve">
<value>checkBox6</value>
</data>
<data name="&gt;&gt;checkBox6.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;checkBox6.Parent" xml:space="preserve">
<value>splitContainer1.Panel1</value>
</data>
<data name="&gt;&gt;checkBox6.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="checkBox5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="checkBox5.Location" type="System.Drawing.Point, System.Drawing">
<value>760, 10</value>
</data>
<data name="checkBox5.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 17</value>
</data>
<data name="checkBox5.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="checkBox5.Text" xml:space="preserve">
<value>checkBox5</value>
</data>
<data name="&gt;&gt;checkBox5.Name" xml:space="preserve">
<value>checkBox5</value>
</data>
<data name="&gt;&gt;checkBox5.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;checkBox5.Parent" xml:space="preserve">
<value>splitContainer1.Panel1</value>
</data>
<data name="&gt;&gt;checkBox5.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="checkBox4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="checkBox4.Location" type="System.Drawing.Point, System.Drawing">
<value>640, 10</value>
</data>
<data name="checkBox4.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 17</value>
</data>
<data name="checkBox4.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="checkBox4.Text" xml:space="preserve">
<value>checkBox4</value>
</data>
<data name="&gt;&gt;checkBox4.Name" xml:space="preserve">
<value>checkBox4</value>
</data>
<data name="&gt;&gt;checkBox4.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;checkBox4.Parent" xml:space="preserve">
<value>splitContainer1.Panel1</value>
</data>
<data name="&gt;&gt;checkBox4.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="checkBox3.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="checkBox3.Location" type="System.Drawing.Point, System.Drawing">
<value>520, 10</value>
</data>
<data name="checkBox3.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 17</value>
</data>
<data name="checkBox3.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="checkBox3.Text" xml:space="preserve">
<value>checkBox3</value>
</data>
<data name="&gt;&gt;checkBox3.Name" xml:space="preserve">
<value>checkBox3</value>
</data>
<data name="&gt;&gt;checkBox3.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;checkBox3.Parent" xml:space="preserve">
<value>splitContainer1.Panel1</value>
</data>
<data name="&gt;&gt;checkBox3.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="checkBox2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="checkBox2.Location" type="System.Drawing.Point, System.Drawing">
<value>400, 10</value>
</data>
<data name="checkBox2.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 17</value>
</data>
<data name="checkBox2.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="checkBox2.Text" xml:space="preserve">
<value>checkBox2</value>
</data>
<data name="&gt;&gt;checkBox2.Name" xml:space="preserve">
<value>checkBox2</value>
</data>
<data name="&gt;&gt;checkBox2.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;checkBox2.Parent" xml:space="preserve">
<value>splitContainer1.Panel1</value>
</data>
<data name="&gt;&gt;checkBox2.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="checkBox1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="checkBox1.Location" type="System.Drawing.Point, System.Drawing">
<value>280, 10</value>
</data>
<data name="checkBox1.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 17</value>
</data>
<data name="checkBox1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="checkBox1.Text" xml:space="preserve">
<value>checkBox1</value>
</data>
<data name="&gt;&gt;checkBox1.Name" xml:space="preserve">
<value>checkBox1</value>
</data>
<data name="&gt;&gt;checkBox1.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;checkBox1.Parent" xml:space="preserve">
<value>splitContainer1.Panel1</value>
</data>
<data name="&gt;&gt;checkBox1.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;splitContainer1.Panel1.Name" xml:space="preserve">
<value>splitContainer1.Panel1</value>
</data>
<data name="&gt;&gt;splitContainer1.Panel1.Type" xml:space="preserve">
<value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;splitContainer1.Panel1.Parent" xml:space="preserve">
<value>splitContainer1</value>
</data>
<data name="&gt;&gt;splitContainer1.Panel1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;splitContainer1.Panel2.Name" xml:space="preserve">
<value>splitContainer1.Panel2</value>
</data>
<data name="&gt;&gt;splitContainer1.Panel2.Type" xml:space="preserve">
<value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;splitContainer1.Panel2.Parent" xml:space="preserve">
<value>splitContainer1</value>
</data>
<data name="&gt;&gt;splitContainer1.Panel2.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="splitContainer1.Size" type="System.Drawing.Size, System.Drawing">
<value>965, 689</value>
</data>
<data name="splitContainer1.SplitterDistance" type="System.Int32, mscorlib">
<value>30</value>
</data>
<data name="splitContainer1.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;splitContainer1.Name" xml:space="preserve">
<value>splitContainer1</value>
</data>
<data name="&gt;&gt;splitContainer1.Type" xml:space="preserve">
<value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;splitContainer1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;splitContainer1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value> <value>True</value>
</metadata> </metadata>

View File

@ -1575,7 +1575,6 @@
<DesignTime>True</DesignTime> <DesignTime>True</DesignTime>
<DependentUpon>Strings.zh-CN.resx</DependentUpon> <DependentUpon>Strings.zh-CN.resx</DependentUpon>
</Compile> </Compile>
<Compile Include="Screens\Graph.cs" />
<Compile Include="Screens\GraphsTabPageCtrl.cs"> <Compile Include="Screens\GraphsTabPageCtrl.cs">
<SubType>UserControl</SubType> <SubType>UserControl</SubType>
</Compile> </Compile>