iPerlST configuration changes, etc., version 1.5.76

This commit is contained in:
Milan Hanajik 2015-08-14 12:00:18 +02:00
parent 7e28381df5
commit bf376b4ff0
17 changed files with 4341 additions and 3 deletions

View File

@ -16,7 +16,7 @@ namespace TBF.BenchControl.Elde
ResetShapesOfPulses = 8,
}
#if FUZHOU300 || PT200IL || TORINO50 || BADGER_MALA_TRAT
#if FUZHOU300 || PT200IL || TORINO50 || BADGER_MALA_TRAT || IPERLST
public enum StatusP : ulong
{
RefFlowMeterMask = 0x7,
@ -41,7 +41,7 @@ namespace TBF.BenchControl.Elde
ErrorPressMeter3 = 0x4000000000000,
ErrorPressMeter4 = 0x8000000000000,
}
#else // DN100 || MUNICH || FUZHOU150 || TORUN_PT50_2015 || CEVAK_PT40_272 || IPERLST
#else // DN100 || MUNICH || FUZHOU150 || TORUN_PT50_2015 || CEVAK_PT40_272
public enum StatusP : ulong
{
RefFlowMeterMask = 0x7,

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;
using System.Collections.Generic;

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;
using System.Collections.Generic;

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;
using System.IO;

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;
using System.Collections.Generic;

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;
using System.Collections.Generic;

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;
using System.Windows.Forms;

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
namespace TBF.BenchControl.WaterMeters.iPerl
{

View File

@ -1,5 +1,6 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using TBF.BenchControl.Generic;

View File

@ -594,9 +594,12 @@ namespace TBF
#elif BADGER_MALA_TRAT
private ControlComponent_Torino2015.UserControl1 ctrlBrdComponent;
private TBF.Screens.ProcessTabPageCtrl6 processTabPageCtrl;
#elif TORUN_PT50_2015 || CEVAK_PT40_272 || IPERLST
#elif TORUN_PT50_2015 || CEVAK_PT40_272
private ControlComponent_Torino2015.UserControl1 ctrlBrdComponent;
private TBF.Screens.ProcessTabPageCtrl24 processTabPageCtrl;
#elif IPERLST
private ControlComponent_Torino2015.UserControl1 ctrlBrdComponent;
private TBF.Screens.ProcessTabPageCtrl48 processTabPageCtrl;
#endif
private System.Windows.Forms.ToolStripMenuItem benchTSMenuItem;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,577 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
/// Author: Milan Hanajík
///
using System;
using System.Drawing;
using System.Windows.Forms;
using log4net;
using TBF.UiBridge;
using TBF.Resources;
#pragma warning disable 162 /// Disables 'Unreachable code detected' warning
namespace TBF.Screens
{
public partial class ProcessTabPageCtrl48 : UserControl
{
static readonly ILog log = LogManager.GetLogger(typeof(ProcessTabPageCtrl48));
Entities.MetersKind currentMetersKind;
int textBoxesCount;
Label[] meter;
Label[] sensor;
Label[] pulses;
Label[] refPulses;
Label[] volume;
Label[] error;
Label[] passed;
bool pumpOn = true;
bool diverterToTank = true;
/// <summary>
/// Constructor, initializes anonymous event handlers
/// </summary>
public ProcessTabPageCtrl48()
{
currentMetersKind = Entities.MetersKind.Single;
InitializeComponent();
textBoxesCount = 24;
meter = new Label[] {
meter1Label, meter2Label, meter3Label, meter4Label, meter5Label, meter6Label,
meter7Label, meter8Label, meter9Label, meter10Label, meter11Label, meter12Label,
meter13Label, meter14Label, meter15Label, meter16Label, meter17Label, meter18Label,
meter19Label, meter20Label, meter21Label, meter22Label, meter23Label, meter24Label,
};
sensor = new Label[] {
sensor1Label, sensor2Label, sensor3Label, sensor4Label, sensor5Label, sensor6Label,
sensor7Label, sensor8Label, sensor9Label, sensor10Label, sensor11Label, sensor12Label,
sensor13Label, sensor14Label, sensor15Label, sensor16Label, sensor17Label, sensor18Label,
sensor19Label, sensor20Label, sensor21Label, sensor22Label, sensor23Label, sensor24Label,
};
pulses = new Label[] {
pulses1Label, pulses2Label, pulses3Label, pulses4Label, pulses5Label, pulses6Label,
pulses7Label, pulses8Label, pulses9Label, pulses10Label, pulses11Label, pulses12Label,
pulses13Label, pulses14Label, pulses15Label, pulses16Label, pulses17Label, pulses18Label,
pulses19Label, pulses20Label, pulses21Label, pulses22Label, pulses23Label, pulses24Label,
};
refPulses = new Label[] {
refPulses1Label, refPulses2Label, refPulses3Label, refPulses4Label, refPulses5Label, refPulses6Label,
refPulses7Label, refPulses8Label, refPulses9Label, refPulses10Label, refPulses11Label, refPulses12Label,
refPulses13Label, refPulses14Label, refPulses15Label, refPulses16Label, refPulses17Label, refPulses18Label,
refPulses19Label, refPulses20Label, refPulses21Label, refPulses22Label, refPulses23Label, refPulses24Label,
};
volume = new Label[] {
volume1Label, volume2Label, volume3Label, volume4Label, volume5Label, volume6Label,
volume7Label, volume8Label, volume9Label, volume10Label, volume11Label, volume12Label,
volume13Label, volume14Label, volume15Label, volume16Label, volume17Label, volume18Label,
volume19Label, volume20Label, volume21Label, volume22Label, volume23Label, volume24Label,
};
error = new Label[] {
error1Label, error2Label, error3Label, error4Label, error5Label, error6Label,
error7Label, error8Label, error9Label, error10Label, error11Label, error12Label,
error13Label, error14Label, error15Label, error16Label, error17Label, error18Label,
error19Label, error20Label, error21Label, error22Label, error23Label, error24Label,
};
passed = new Label[] {
passed1Label, passed2Label, passed3Label, passed4Label, passed5Label, passed6Label,
passed7Label, passed8Label, passed9Label, passed10Label, passed11Label, passed12Label,
passed13Label, passed14Label, passed15Label, passed16Label, passed17Label, passed18Label,
passed19Label, passed20Label, passed21Label, passed22Label, passed23Label, passed24Label,
};
ShuffleLabels(Program.WMsCount, Program.LineSize);
Bridge.ProcedureSelectedHandler += delegate(object sndr, ProcedureSelectedEventArgs args)
{
if (InvokeRequired)
Invoke(new EventHandler<ProcedureSelectedEventArgs>(OnProcedureSelected), sndr, args);
else
OnProcedureSelected(sndr, args);
};
Bridge.TestSelectedHandler += delegate(object sender, TestSelectedEventArgs args)
{
if (InvokeRequired)
Invoke(new EventHandler<TestSelectedEventArgs>(OnTestSelected), sender, args);
else
OnTestSelected(sender, args);
};
Bridge.TestProgressHandler += delegate(object sender, TestProgressEventArgs args)
{
if (InvokeRequired)
Invoke(new EventHandler<TestProgressEventArgs>(OnTestProgress), sender, args);
else
OnTestProgress(sender, args);
};
Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args)
{
if (InvokeRequired)
Invoke(new EventHandler<TestCompletedEventArgs>(OnTestCompleted), sender, args);
else
OnTestCompleted(sender, args);
};
Bridge.ProcedureCompletedHandler += delegate(object sender, ProcedureCompletedEventArgs args)
{
if (InvokeRequired)
Invoke(new EventHandler<ProcedureCompletedEventArgs>(OnProcedureCompleted), sender, args);
else
OnProcedureCompleted(sender, args);
};
}
/// <summary>
/// Make sure the layout of labels/text boxes on the screen
/// corresponds to the layout of watermeters of the test bench.
/// Enable only used labels.
/// </summary>
/// <param name="wmsCount">Number of watermeters</param>
/// <param name="lineSize">Number of watermeters in one line</param>
void ShuffleLabels(int wmsCount, int lineSize)
{
if (wmsCount < textBoxesCount && lineSize > 0)
{
int nrLines = (wmsCount + lineSize - 1) / lineSize;
int gap = (textBoxesCount - wmsCount) / nrLines;
int dest = 0;
for (int l = 0; l < nrLines; l++)
{
for (int i = 0; i < lineSize; i++)
{
meter[dest] = meter[l * lineSize + l * gap + i];
meter[dest].Visible = true;
meter[dest].Text = string.Format("Meter {0}", dest + 1);
sensor[dest] = sensor[l * lineSize + l * gap + i];
sensor[dest].Visible = true;
pulses[dest] = pulses[l * lineSize + l * gap + i];
pulses[dest].Visible = true;
refPulses[dest] = refPulses[l * lineSize + l * gap + i];
refPulses[dest].Visible = true;
volume[dest] = volume[l * lineSize + l * gap + i];
volume[dest].Visible = true;
error[dest] = error[l * lineSize + l * gap + i];
error[dest].Visible = true;
passed[dest] = passed[l * lineSize + l * gap + i];
passed[dest].Visible = true;
dest++;
}
}
textBoxesCount = wmsCount;
}
}
private void ProcessTabPageCtrl_Load(object sender, EventArgs e)
{
Once();
ResetLabelsAndTargetVals();
ResetReadings();
}
void Once()
{
}
void UpdateVisibility(Entities.MetersKind metersKind)
{
bool visible = (metersKind == Entities.MetersKind.Single);
for (int i = 2 * Program.CompoundWMsCount; i < textBoxesCount; i++)
{
meter[i].Visible = visible;
sensor[i].Visible = visible;
pulses[i].Visible = visible;
refPulses[i].Visible = visible;
volume[i].Visible = visible;
error[i].Visible = visible;
passed[i].Visible = visible;
}
groupBox1z.Visible = (metersKind == Entities.MetersKind.Combined) && (Program.CompoundWMsCount >= 1);
groupBox2z.Visible = (metersKind == Entities.MetersKind.Combined) && (Program.CompoundWMsCount >= 2);
groupBox3z.Visible = (metersKind == Entities.MetersKind.Combined) && (Program.CompoundWMsCount >= 3);
}
/// <summary>
/// Called when a new procedure is selected
/// </summary>
void ResetLabelsAndTargetVals()
{
/// Target values
targetFlowLowLabel.Text = "---";
targetFlowHighLabel.Text = "---";
targetVolumeLabel.Text = "---";
targetRefCountLabel.Text = "---";
estmtdTimeLabel.Text = "---";
//
refFlowCmpntLabel.Text = "---";
regValveCmpntLabel.Text = "---";
/// Water pressure
prInCmpntLabel.Text = "---";
prOutCmpntLabel.Text = "---";
/// Water temperature
tInCmpntLabel.Text = "---";
tOutCmpntLabel.Text = "---";
tDivCmpntLabel.Text = "---";
scaleCmpntLabel.Text = "---";
if (currentMetersKind == Entities.MetersKind.Single)
{
watermeterPictureBox1.Visible = true;
watermeterPictureBox2.Visible = true;
watermeterPictureBox3.Visible = true;
watermeterPictureBox4.Visible = true;
watermeterPictureBox5.Visible = true;
watermeterPictureBox6.Visible = true;
watermeterPictureBox1z.Visible = false;
watermeterPictureBox2z.Visible = false;
watermeterPictureBox3z.Visible = false;
groupBox1z.Visible = false;
groupBox2z.Visible = false;
groupBox3z.Visible = false;
sensor1Label.Text = "---";
for (int i = 0; i < textBoxesCount; i++)
{
sensor[i].Text = "---";
}
}
else if (currentMetersKind == Entities.MetersKind.Combined)
{
watermeterPictureBox1.Visible = false;
watermeterPictureBox2.Visible = true;
watermeterPictureBox3.Visible = false;
watermeterPictureBox4.Visible = false;
watermeterPictureBox5.Visible = false;
watermeterPictureBox6.Visible = false;
watermeterPictureBox1z.Visible = true;
watermeterPictureBox2z.Visible = false;
watermeterPictureBox3z.Visible = false;
groupBox1z.Visible = true;
groupBox2z.Visible = false;
groupBox3z.Visible = false;
sensor1Label.Visible = true;
sensor1Label.Text = "---";
sensor2Label.Visible = true;
sensor2Label.Text = "---";
}
}
/// <summary>
/// Called when a new procedure or a new test procedure is selected
/// </summary>
void ResetReadings()
{
/// Top part
airTempLabel.Text = "---";
airPressLabel.Text = "---";
airHumiLabel.Text = "---";
refPulsesLabel.Text = "---";
refFreqLabel.Text = "---";
refFlowLabel.Text = "---";
refVolumeLabel.Text = "---";
regValvePosLabel.Text = "---";
tDivLabel.Text = "---";
tInLabel.Text = "---";
tOutLabel.Text = "---";
prInLabel.Text = "---";
prOutLabel.Text = "---";
massLabel.Text = "---";
massDiffLabel.Text = "---";
volumeCtvLabel.Text = "---";
refErrorLabel.Text = "---";
/// Meters
pulses1Label.Text = "---";
refPulses1Label.Text = "---";
volume1Label.Text = "---";
error1Label.Text = "---";
passed1Label.Text = "---";
if (currentMetersKind == Entities.MetersKind.Single)
{
for (int i = 0; i < textBoxesCount; i++)
{
pulses[i].Text = "---";
refPulses[i].Text = "---";
volume[i].Text = "---";
error[i].Text = "---";
passed[i].Text = "---";
}
}
else if (currentMetersKind == Entities.MetersKind.Combined)
{
for (int i = 0; i < 2; i++)
{
pulses[i].Text = "---";
refPulses[i].Text = "---";
volume[i].Text = "---";
error[i].Text = "---";
passed[i].Text = "---";
}
volume1zLabel.Text = "---";
error1zLabel.Text = "---";
passed1zLabel.Text = "---";
}
}
void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args)
{
currentMetersKind = args.Procedure.MetersKind;
UpdateVisibility(currentMetersKind);
ResetLabelsAndTargetVals();
ResetReadings();
Invalidate();
}
void OnTestSelected(object sender, TestSelectedEventArgs args)
{
/// Readings and target values
ResetReadings();
/// Target values
targetFlowLowLabel.Text = args.Test.Qfrom.ToString("F3");
targetFlowHighLabel.Text = args.Test.Qto.ToString("F3");
targetVolumeLabel.Text = args.Test.Volume.ToString("F1");
targetRefCountLabel.Text = args.TotalPulses.ToString();
estmtdTimeLabel.Text = args.Test.TstTime.ToString("F1");
/// Names of virtual bench components
if (args.BenchPath.PressIn != null) prInCmpntLabel.Text = args.BenchPath.PressIn.Name;
if (args.BenchPath.PressOut != null) prOutCmpntLabel.Text = args.BenchPath.PressOut.Name;
if (args.BenchPath.TempIn != null) tInCmpntLabel.Text = args.BenchPath.TempIn.Name;
if (args.BenchPath.TempOut != null) tOutCmpntLabel.Text = args.BenchPath.TempOut.Name;
if (args.OutputPath.TempDiv != null) tDivCmpntLabel.Text = args.OutputPath.TempDiv.Name;
if (args.OutputPath.FlowMeter != null) refFlowCmpntLabel.Text = args.OutputPath.FlowMeter.Name;
if (args.OutputPath.RegulValve != null) regValveCmpntLabel.Text = args.OutputPath.RegulValve.Name;
if (args.OutputPath.Balance != null) scaleCmpntLabel.Text = args.OutputPath.Balance.Name;
for (int i = 0; i < textBoxesCount; i++)
{
sensor[i].Text = (args.MetersPath.RegisterReaders[i] == null) ? "" : args.MetersPath.RegisterReaders[i].Cfg.Name;
}
if (args.FeedingPath != null && (args.FeedingPath.Pump is BenchControl.GenericDevices.IPumpFM))
{
pumpPctTextBox.Visible = true;
pumpPctTextBox.Text = (args.FeedingPath.Pump as BenchControl.GenericDevices.IPumpFM).Power.ToString("F0") + " %";
}
else
{
pumpPctTextBox.Visible = false;
}
}
void OnTestProgress(object sender, TestProgressEventArgs args)
{
/// Top part
airTempLabel.Text = args.AmbientTemp.ToString();
airPressLabel.Text = args.AmbientPressure.ToString();
airHumiLabel.Text = args.AmbientHumidity.ToString();
refPulsesLabel.Text = args.RefPulses.ToString();
refFreqLabel.Text = args.FlowMtrFreq.ToString();
refFlowLabel.Text = Utils.FloatToStr(args.Flow.Val, 4);
refVolumeLabel.Text = args.Volume.ToString();
//regValvePosLabel.Text = args.RegValvePos.ToString();
tDivLabel.Text = args.Tdiv.ToString();
/// Bottom part
if (currentMetersKind == Entities.MetersKind.Single)
{
for (int i = 0; i < textBoxesCount; i++)
{
pulses[i].Text = args.TestResult.Meters[i].PulsesMeter.ToString();
refPulses[i].Text = args.TestResult.Meters[i].PulsesMaster.ToString();
volume[i].Text = args.TestResult.Meters[i].VolumeMeter.ToString();
error[i].Text = args.TestResult.Meters[i].VolumeErrorPct.ToString();
}
}
else if (currentMetersKind == Entities.MetersKind.Combined)
{
for (int i = 0; i < 2; i++)
{
pulses[i].Text = args.TestResult.Meters[i].PulsesMeter.ToString();
refPulses[i].Text = args.TestResult.Meters[i].PulsesMaster.ToString();
volume[i].Text = args.TestResult.Meters[i].VolumeMeter.ToString();
error[i].Text = args.TestResult.Meters[i].VolumeErrorPct.ToString();
}
volume1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeMeter.ToString();
error1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeErrorPct.ToString();
}
tInLabel.Text = args.Tin.ToString();
tOutLabel.Text = args.Tout.ToString();
prInLabel.Text = args.Pin.ToString();
prOutLabel.Text = args.Pout.ToString();
massLabel.Text = args.Mass.ToString();
if (args.Mass.Valid && args.StartMass.Valid)
{
massDiffLabel.Text = (args.Mass.Val - args.StartMass.Val).ToString(args.Mass.Format);
}
if (pumpOn != args.PumpOn || diverterToTank != args.DivToTank)
{
//if (pumpOn != args.PumpOn)
//{
// if (pumpOn) pumpPictureBox.Image = System.Resources.
// else pumpPictureBox.Image = System.Resources.
//}
pumpOn = args.PumpOn;
diverterToTank = args.DivToTank;
Invalidate();
}
}
void OnTestCompleted(object sender, TestCompletedEventArgs args)
{
Entities.TestResult tRes = args.TestResult;
tInLabel.Text = tRes.TempInAvrg.ToString("F2");
tOutLabel.Text = tRes.TempOutAvrg.ToString("F2");
tDivLabel.Text = tRes.TempDivAvrg.ToString("F2");
prInLabel.Text = tRes.PressInAvrg.ToString("F1");
prOutLabel.Text = tRes.PressOutAvrg.ToString("F1");
airTempLabel.Text = tRes.AmbientTempAve.ToString("F1");
airPressLabel.Text = tRes.AmbientPressAve.ToString("F1");
airHumiLabel.Text = tRes.AmbientHumiAve.ToString("F1");
refPulsesLabel.Text = tRes.PulsesMaster.ToString("F0");
//refFreqLabel.Text = tstRslt.
refFlowLabel.Text = Utils.FloatToStr(tRes.FlowMass / 1000.0f, 4);
refVolumeLabel.Text = tRes.VolumeCTV.ToString("F2");
//regValvePosLabel.Text = tstRslt.
//massLabel.Text = tstRslt.
volumeCtvLabel.Text = args.TestResult.VolumeCTV.ToString("F1");
refErrorLabel.Text = (tRes.ErrorMaster == 0) ? "---" : tRes.ErrorMaster.ToString("F2");
if (tRes.MetersKind == Entities.MetersKind.Single)
{
for (int i = 0; i < textBoxesCount; i++)
{
pulses[i].Text = tRes.Meters[i].PulsesMeter.ToString("F0");
refPulses[i].Text = tRes.Meters[i].PulsesMaster.ToString("F0");
volume[i].Text = tRes.Meters[i].VolumeMeter.ToString("F2");
error[i].Text = tRes.Meters[i].VolumeErrorPct.ToString("F2");
passed[i].Text = tRes.Meters[i].Passed ? Strings.Passed : Strings.Failed;
}
}
else if (tRes.MetersKind == Entities.MetersKind.Combined)
{
pulses1Label.Text = tRes.Meters[0].PulsesMeter.ToString("F0");
pulses2Label.Text = tRes.Meters[1].PulsesMeter.ToString("F0");
//pulses1zLabel.Text = tRes.CombinedMeters[0].PulsesMeter.ToString("F0");
refPulses1Label.Text = tRes.Meters[0].PulsesMaster.ToString("F0");
refPulses2Label.Text = tRes.Meters[1].PulsesMaster.ToString("F0");
//refPulses1zLabel.Text = tRes.CombinedMeters[0].PulsesMaster.ToString("F0");
volume1Label.Text = tRes.Meters[0].VolumeMeter.ToString("F2");
volume2Label.Text = tRes.Meters[1].VolumeMeter.ToString("F2");
volume1zLabel.Text = tRes.CombinedMeters[0].VolumeMeter.ToString("F2");
error1Label.Text = tRes.Meters[0].VolumeErrorPct.ToString("F2");
error2Label.Text = tRes.Meters[1].VolumeErrorPct.ToString("F2");
error1zLabel.Text = tRes.CombinedMeters[0].VolumeErrorPct.ToString("F2");
passed1Label.Text = tRes.Meters[0].Passed ? Strings.Passed : Strings.Failed;
passed2Label.Text = tRes.Meters[1].Passed ? Strings.Passed : Strings.Failed;
passed1zLabel.Text = tRes.CombinedMeters[0].Passed ? Strings.Passed : Strings.Failed;
}
}
void OnProcedureCompleted(object sender, ProcedureCompletedEventArgs args)
{
}
private void ProcessTabPageCtrl_Paint(object sender, PaintEventArgs e)
{
System.Drawing.Graphics formGraphics = this.CreateGraphics();
System.Drawing.SolidBrush filledBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Blue);
System.Drawing.SolidBrush emptyBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Gray);
System.Drawing.SolidBrush benchBrush = (pumpOn ? filledBrush : emptyBrush);
int diam = 14; // pipe diameter (pixels)
int left = 20; // left-most pipe x-coordinate
int top = 14; // top-most pipe y-coordinate
int topLeft = 876;
int topRight = 966;
int divTop = 40;
int bottom = 504; // bottom-most pipe y-coordinate
int benchTop = 378; // bench-pipe top y-coordinate
int pumpLeft = 779;
int pumpWdth = 38;
/// Pipes
formGraphics.FillRectangle(filledBrush,new Rectangle(pumpLeft+pumpWdth, bottom-diam, 65, diam)); // tank -> pump
formGraphics.FillRectangle(benchBrush, new Rectangle(left, bottom-diam, pumpLeft-left, diam)); // pump ->bench horizontal
formGraphics.FillRectangle(benchBrush, new Rectangle(left, benchTop, diam, bottom-benchTop)); // ->bench vertical
formGraphics.FillRectangle(benchBrush, new Rectangle(left + diam, benchTop, topLeft-left, diam)); // bench horizontal
formGraphics.FillRectangle(benchBrush, new Rectangle(topLeft, top + diam, diam, benchTop-top-diam)); // bench -> top vertical
formGraphics.FillRectangle(benchBrush, new Rectangle(topLeft, top, topRight-topLeft, diam)); // top horizontal
formGraphics.FillRectangle(benchBrush, new Rectangle(topRight-diam, top+diam, diam, divTop-top-diam)); // top -> diverter vertical
/// Combined meters bypasses
if (watermeterPictureBox1z.Visible) PaintBypass(formGraphics, benchBrush, 186, benchTop + diam);
if (watermeterPictureBox2z.Visible) PaintBypass(formGraphics, benchBrush, 470, benchTop + diam);
if (watermeterPictureBox3z.Visible) PaintBypass(formGraphics, benchBrush, 754, benchTop + diam);
/// Diverter
int displacement = diverterToTank ? 25 : -25;
Point[] points = new Point[4];
points[0].X = topRight - diam;
points[0].Y = divTop;
points[1].X = topRight;
points[1].Y = divTop;
points[2].X = topRight + displacement;
points[2].Y = divTop + 50;
points[3].X = topRight - diam + displacement;
points[3].Y = divTop + 50;
formGraphics.FillPolygon(benchBrush, points);
/// Sink
formGraphics.FillEllipse(emptyBrush, topRight - diam / 2 - 45, divTop + 50, 40, 30);
formGraphics.DrawEllipse(Pens.Black, topRight - diam / 2 - 45, divTop + 50, 40, 30);
/// Tank
formGraphics.DrawRectangle(Pens.Black, topRight - diam / 2, divTop + 51, 60, 80);
emptyBrush.Dispose();
filledBrush.Dispose();
formGraphics.Dispose();
}
private void PaintBypass(System.Drawing.Graphics formGraphics, System.Drawing.SolidBrush brush, int startX, int startY)
{
int w = 80;
int h = 43;
int diam = 10; // pipe diameter (pixels)
formGraphics.FillRectangle(brush, new Rectangle(startX, startY, diam, h - diam));
formGraphics.FillRectangle(brush, new Rectangle(startX, startY + h - diam, w, diam));
formGraphics.FillRectangle(brush, new Rectangle(startX + w - diam, startY, diam, h));
}
}
}

View File

@ -0,0 +1,333 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="reservoirPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAI4AAABtCAYAAAB3LVkkAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIxSURBVHhe7dqxbgJBEETB+/+fxgJLDkjwbYCeWhVcBMHM
Xnctkn1d1/XwOIODDDwP7eFxBjcy8Cqa4CjOXTgE50bL7h7u8vcFR3COrmjBERzBWb4aarsRhzjEqbVy
eR7iEIc4yw2v7UYc4hCn1srleYhDHOIsN7y2G3GIQ5xaK5fnIQ5xiLPc8NpuxCEOcWqtXJ6HOMQhznLD
a7sRhzjEqbVyeR7iEIc4yw2v7UYc4hCn1srleYhDHOIsN7y2G3GIQ5xaK5fnIQ5xiLPc8NpuxCEOcWqt
XJ6HOMQhznLDa7sRhzjEqbVyeR7iEIc4yw2v7UYc4hCn1srleYhDHOIsN7y2G3GIQ5xaK5fnIQ5xiLPc
8NpuxCEOcWqtXJ6HOMQhznLDa7sRhzjEqbVyeR7iEIc4yw2v7UYc4hCn1srleYhDHOIsN7y2G3GIQ5xa
K5fnIQ5xiLPc8NpuxCEOcWqtXJ6HOMQhznLDa7sRhzjEqbVyeR7iEIc4yw2v7UYc4hCn1srleYhDHOIs
N7y2G3GIQ5xaK5fnIQ5xzsVZbobdrqNgfDq3lzifvuRzZ/SeAcFxVR3BITiCIziu1O9dqcQhDnGIQ5yj
FgiO4AhO/Ar1Gyf+gqqKCo7gHOkuOIIjOFXWF+ciDnGIs9js6k7+H4c45+I801NNtrma74Y4SnOEhuAI
juC41r53rRGHOMQhDnGOWiA4giM48SvUb5z4C6oqKjiCc6T7X3B+/9rpcQb/zcAPdaeY4roQUU4AAAAA
SUVORK5CYII=
</value>
</data>
<data name="pumpPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADr0AAA69AUf7kK0AAALVSURBVFhH7Zi9TgJBEMeXr8RCTUz4SEyo6bEACuIDkBBK
MOSiUFDwBj4AJQkdsbGgsqQ02oMmNEpoLH0BYmU3+gf3du5uOQ44PgqLDeGOnf0xM7s7/xHT6ZQ2GYFA
gIQQjrGJTcwVqxpIJBKEwWFyuRxVq1Vz8HfhcHj2+16vt5IDPIENBgOqVCoWmFarRV5GsVg058ViMWo2
m54Al4Jls1ltqLxA4TccjHtyMpm4ArqCpVIpLRQW2BQMIXZLIy1Yt9ulfD5vQp2did8QCLq9VUm+Dtjj
o6CrK2UjFApRoVDQAmrBONT5uSCi+dgUTNq5vBR0fKwAR6ORA84BxsN3f6+g/ASDrc9Pq+fsYbWA8UTn
nvLbY9Le66uCQ86Nx2PTcyYYjgS5a5BTcjL/9CuU3CbCKtdtt9tOMH5OIdF3BYZ1+DEiQ2p6TL6s1fRQ
fucY/+PYrXL9crk889rvd56Egl5edg8GyFTKcd+qBycni6G26THYfn52AdPl1baTn9s/PbXAqS8HCVap
uIdx26GE/a8vjccMY/9gtqNjTvkP9lcQLMpndnz9e0x7zdk95/AYHhzkcXHQYHd3+7uSUDgeHbFzDJov
GAzOjgyUu9/f+7nEHx5sdyVKDIhRmXRPT/sBk+tnMhnq9/tKiUejURMO9dEuC8VcTnmr0+nM6zFZMUIh
S2pIrF2BfXwoqEgk4iyt/6pGEw61uB3O75r/7U1QOKzAhsOhHgyyHdRyI2CnbLMeu75WUIZhWLSlVvBC
IcuwQmL5Ld/e3wXd3CioWq22XPAipJDtXAvIsPoRSuQUDx/W0fUwFjZVINu552Dg4mKz3gXffbBXr9cX
NlaWtqGgkHUdw3WaKtyOPadcWwQ6l0K2QyHb4dYFw+biu29RK2qpx/hEiFEJmE6nSY5Go2Hpl/F3yWRy
Ngcnujw8vbRXVwLjBuPxOGHowoxn8n2pVPLU2rTD/gAxvvGUSgVAUAAAAABJRU5ErkJggg==
</value>
</data>
<data name="watermeterPictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIUSURBVFhH7Zgxa8JAFMfTFqSTgoJLJyUgDq5xcXGsEKRr
B2ldHZwL+gnEoaMQx9LVtehguujgUipCwUDpUigItlPb5fXeJSdWTS6nSezQ4W+Gy9373XvvLu8pzedz
cKt2uw2SJHkink2J98Ly+D8YieIWHjsgoTzZUREYDodgGIZtGm0BFiJQsKNmNE8TiQS0Wq2NcHsCYxvD
w5SFZDIJlUrlF6AQWLVaJQt54bFVj/cXJ13XdQpIPCpy/A93DCEvBRSy/hGDRLAGEVLz9OgzGIIby2B3
ARjkeWt5nEYRf/wH07QRpNPvLh0QIFg2O4N+vw/45F83AYIhTLd7T+EKhVcOnANYvT6hi/ilfP7NAW6P
YL2eDtHolw3cHsHi8c/tPMZPUJHjb77LciyTwZvdaX6AyV8qPdN8TaU+/tapbDQeXAAxLwboMbHUWICd
k93UBXYknl/OYOhNtM9EwBRFAZT5aZItfQcI+URtM44Fz2ozYgJizXUbENwlqKq6VsWuFYrj8Rg0TbM8
qPoMd0HtbOrUbCvYZrMJuVyOTIwQXfsAOKFQnU5HDIztQpZlCIUwtFdELx4BmlCDwWC3Lmk0GlmhPfYA
zAwfdkietW/lctkCPN0C8JLMMet5u/At55pQl4QTp9MpxGIxC/CGPFF29xpeOzh+RucUi0XX/5MIg7Fd
1Wo1C865ywqHw6S8iboGYuv/AMJ7ZtVaEL7eAAAAAElFTkSuQmCC
</value>
</data>
<data name="watermeterPictureBox2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIUSURBVFhH7Zgxa8JAFMfTFqSTgoJLJyUgDq5xcXGsEKRr
B2ldHZwL+gnEoaMQx9LVtehguujgUipCwUDpUigItlPb5fXeJSdWTS6nSezQ4W+Gy9373XvvLu8pzedz
cKt2uw2SJHkink2J98Ly+D8YieIWHjsgoTzZUREYDodgGIZtGm0BFiJQsKNmNE8TiQS0Wq2NcHsCYxvD
w5SFZDIJlUrlF6AQWLVaJQt54bFVj/cXJ13XdQpIPCpy/A93DCEvBRSy/hGDRLAGEVLz9OgzGIIby2B3
ARjkeWt5nEYRf/wH07QRpNPvLh0QIFg2O4N+vw/45F83AYIhTLd7T+EKhVcOnANYvT6hi/ilfP7NAW6P
YL2eDtHolw3cHsHi8c/tPMZPUJHjb77LciyTwZvdaX6AyV8qPdN8TaU+/tapbDQeXAAxLwboMbHUWICd
k93UBXYknl/OYOhNtM9EwBRFAZT5aZItfQcI+URtM44Fz2ozYgJizXUbENwlqKq6VsWuFYrj8Rg0TbM8
qPoMd0HtbOrUbCvYZrMJuVyOTIwQXfsAOKFQnU5HDIztQpZlCIUwtFdELx4BmlCDwWC3Lmk0GlmhPfYA
zAwfdkietW/lctkCPN0C8JLMMet5u/At55pQl4QTp9MpxGIxC/CGPFF29xpeOzh+RucUi0XX/5MIg7Fd
1Wo1C865ywqHw6S8iboGYuv/AMJ7ZtVaEL7eAAAAAElFTkSuQmCC
</value>
</data>
<data name="watermeterPictureBox3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIUSURBVFhH7Zgxa8JAFMfTFqSTgoJLJyUgDq5xcXGsEKRr
B2ldHZwL+gnEoaMQx9LVtehguujgUipCwUDpUigItlPb5fXeJSdWTS6nSezQ4W+Gy9373XvvLu8pzedz
cKt2uw2SJHkink2J98Ly+D8YieIWHjsgoTzZUREYDodgGIZtGm0BFiJQsKNmNE8TiQS0Wq2NcHsCYxvD
w5SFZDIJlUrlF6AQWLVaJQt54bFVj/cXJ13XdQpIPCpy/A93DCEvBRSy/hGDRLAGEVLz9OgzGIIby2B3
ARjkeWt5nEYRf/wH07QRpNPvLh0QIFg2O4N+vw/45F83AYIhTLd7T+EKhVcOnANYvT6hi/ilfP7NAW6P
YL2eDtHolw3cHsHi8c/tPMZPUJHjb77LciyTwZvdaX6AyV8qPdN8TaU+/tapbDQeXAAxLwboMbHUWICd
k93UBXYknl/OYOhNtM9EwBRFAZT5aZItfQcI+URtM44Fz2ozYgJizXUbENwlqKq6VsWuFYrj8Rg0TbM8
qPoMd0HtbOrUbCvYZrMJuVyOTIwQXfsAOKFQnU5HDIztQpZlCIUwtFdELx4BmlCDwWC3Lmk0GlmhPfYA
zAwfdkietW/lctkCPN0C8JLMMet5u/At55pQl4QTp9MpxGIxC/CGPFF29xpeOzh+RucUi0XX/5MIg7Fd
1Wo1C865ywqHw6S8iboGYuv/AMJ7ZtVaEL7eAAAAAElFTkSuQmCC
</value>
</data>
<data name="watermeterPictureBox4.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIUSURBVFhH7Zgxa8JAFMfTFqSTgoJLJyUgDq5xcXGsEKRr
B2ldHZwL+gnEoaMQx9LVtehguujgUipCwUDpUigItlPb5fXeJSdWTS6nSezQ4W+Gy9373XvvLu8pzedz
cKt2uw2SJHkink2J98Ly+D8YieIWHjsgoTzZUREYDodgGIZtGm0BFiJQsKNmNE8TiQS0Wq2NcHsCYxvD
w5SFZDIJlUrlF6AQWLVaJQt54bFVj/cXJ13XdQpIPCpy/A93DCEvBRSy/hGDRLAGEVLz9OgzGIIby2B3
ARjkeWt5nEYRf/wH07QRpNPvLh0QIFg2O4N+vw/45F83AYIhTLd7T+EKhVcOnANYvT6hi/ilfP7NAW6P
YL2eDtHolw3cHsHi8c/tPMZPUJHjb77LciyTwZvdaX6AyV8qPdN8TaU+/tapbDQeXAAxLwboMbHUWICd
k93UBXYknl/OYOhNtM9EwBRFAZT5aZItfQcI+URtM44Fz2ozYgJizXUbENwlqKq6VsWuFYrj8Rg0TbM8
qPoMd0HtbOrUbCvYZrMJuVyOTIwQXfsAOKFQnU5HDIztQpZlCIUwtFdELx4BmlCDwWC3Lmk0GlmhPfYA
zAwfdkietW/lctkCPN0C8JLMMet5u/At55pQl4QTp9MpxGIxC/CGPFF29xpeOzh+RucUi0XX/5MIg7Fd
1Wo1C865ywqHw6S8iboGYuv/AMJ7ZtVaEL7eAAAAAElFTkSuQmCC
</value>
</data>
<data name="watermeterPictureBox5.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIUSURBVFhH7Zgxa8JAFMfTFqSTgoJLJyUgDq5xcXGsEKRr
B2ldHZwL+gnEoaMQx9LVtehguujgUipCwUDpUigItlPb5fXeJSdWTS6nSezQ4W+Gy9373XvvLu8pzedz
cKt2uw2SJHkink2J98Ly+D8YieIWHjsgoTzZUREYDodgGIZtGm0BFiJQsKNmNE8TiQS0Wq2NcHsCYxvD
w5SFZDIJlUrlF6AQWLVaJQt54bFVj/cXJ13XdQpIPCpy/A93DCEvBRSy/hGDRLAGEVLz9OgzGIIby2B3
ARjkeWt5nEYRf/wH07QRpNPvLh0QIFg2O4N+vw/45F83AYIhTLd7T+EKhVcOnANYvT6hi/ilfP7NAW6P
YL2eDtHolw3cHsHi8c/tPMZPUJHjb77LciyTwZvdaX6AyV8qPdN8TaU+/tapbDQeXAAxLwboMbHUWICd
k93UBXYknl/OYOhNtM9EwBRFAZT5aZItfQcI+URtM44Fz2ozYgJizXUbENwlqKq6VsWuFYrj8Rg0TbM8
qPoMd0HtbOrUbCvYZrMJuVyOTIwQXfsAOKFQnU5HDIztQpZlCIUwtFdELx4BmlCDwWC3Lmk0GlmhPfYA
zAwfdkietW/lctkCPN0C8JLMMet5u/At55pQl4QTp9MpxGIxC/CGPFF29xpeOzh+RucUi0XX/5MIg7Fd
1Wo1C865ywqHw6S8iboGYuv/AMJ7ZtVaEL7eAAAAAElFTkSuQmCC
</value>
</data>
<data name="watermeterPictureBox6.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIUSURBVFhH7Zgxa8JAFMfTFqSTgoJLJyUgDq5xcXGsEKRr
B2ldHZwL+gnEoaMQx9LVtehguujgUipCwUDpUigItlPb5fXeJSdWTS6nSezQ4W+Gy9373XvvLu8pzedz
cKt2uw2SJHkink2J98Ly+D8YieIWHjsgoTzZUREYDodgGIZtGm0BFiJQsKNmNE8TiQS0Wq2NcHsCYxvD
w5SFZDIJlUrlF6AQWLVaJQt54bFVj/cXJ13XdQpIPCpy/A93DCEvBRSy/hGDRLAGEVLz9OgzGIIby2B3
ARjkeWt5nEYRf/wH07QRpNPvLh0QIFg2O4N+vw/45F83AYIhTLd7T+EKhVcOnANYvT6hi/ilfP7NAW6P
YL2eDtHolw3cHsHi8c/tPMZPUJHjb77LciyTwZvdaX6AyV8qPdN8TaU+/tapbDQeXAAxLwboMbHUWICd
k93UBXYknl/OYOhNtM9EwBRFAZT5aZItfQcI+URtM44Fz2ozYgJizXUbENwlqKq6VsWuFYrj8Rg0TbM8
qPoMd0HtbOrUbCvYZrMJuVyOTIwQXfsAOKFQnU5HDIztQpZlCIUwtFdELx4BmlCDwWC3Lmk0GlmhPfYA
zAwfdkietW/lctkCPN0C8JLMMet5u/At55pQl4QTp9MpxGIxC/CGPFF29xpeOzh+RucUi0XX/5MIg7Fd
1Wo1C865ywqHw6S8iboGYuv/AMJ7ZtVaEL7eAAAAAElFTkSuQmCC
</value>
</data>
<data name="flowMeterPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAOoSURBVFhHtZi/SjtBEMc3JjFBEm0kIaDGTjD+A0ERTSWY
ShDEJmAkWmgUBP+CoGCVl8gL5AFSpLO3VAiYKo/gG+zvvne5vd29vbu9837FNsns7OdmZmdnhvz+/lLd
dXNzQwkhkZffOQcHBxTr+PjY0q8LBbm4wWq1GsVaWFhwf6wO2Pf3N202m5EtZVu5UqnQTqfDPATr2KvV
aon6g8Cur6/dQJOTlGQylLy/+6+lJUtO4f7BYEBHo5G56vW6IJNKpfxduQTFstJGg5K3t2AoHhp7Zmdd
hwPq8PBQ+L1arZqxpoyxfr9PIcCgsllKtrbCwaiseXpKyeqq0oKlUon+/PzQjY0NbzABCm4LclnY/xcX
Bbh8Ps/cCmMgvFwWc7nv/j5+sJUVASyZTPqDCYEOS/0PqJ0dpSuzRrgMh0N2Y5nFkBKEmArrHh15Hmpq
yvIE59Zut+sGE/JUHIEugxo5TLjhz89OiHA3305fzGLCJp2vDyOzve1AwVI8FPTAEGO4u7s7J/iFW4ic
E+bQINndXQfKuH2euiWrmRYrFovWZgT862t8YNLtIy8v3rpPTtgHsHTB3KjzzARZyP5/c1O8TE9P/h98
dsbkl5eXrTzGwHQPDZLb23N0Tk/re2D8rhYKBUpyuVy8YGtr4u0LExpjsEQiAR1c4RdkiaD/jXeO6UOF
8PCgby3oFiuRmMD4R39mJhyQ/cFKsPX1aMqglLcUPBBkWa//Y7WYXMaEdR8PGRsYf/uius8LLHK64PMU
Aj2q+xRgZroQwFBK6xwgZ/THR719frqvriiZmDBvNQObwsOKoNXJ/Pzbh+QZJk/5gXGZv91uWxabm5tz
8o/fI85XCegDdKyrK6N6xD8+PhwwdDMqZbL7gt4+XSDIoSsag6FDEmp+8+G0qdHN8Ir5yhOli1+VEAbI
luU81uv1RDB0yAwM7529SVUORznca8/tLTu3XC67S2vhdsJyhhDxK4fjgEOXP76JMMrX15caDG17Op12
dzGqcvivYAgXLuAbxqXjxxXKTtw1FvgrhLxfmoecn5+7RmEuMHmWYELCrXHBIaY499mdtzzcEcD4qQva
dnTIgvX+0tYhJczPC/ouLi48h4YMjJ9PYcBhfwE6ZJdr0TggUwdZ8fLSklOMoeSYUlrs6OhI2Iypiy2I
th0dsnLEiSfMb0kugw6kBP72ec3nCJt5GpsyxiGfn5+e5t3f31cDas5l7eQZNCwcpy6rtObd57Ux7hms
H+A/sZE2jkXDPvIAAAAASUVORK5CYII=
</value>
</data>
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAjCAYAAAD48HgdAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAN1SURBVFhHxZg5SDNBGIZHiTZBEA9UEESE2ARvJFEiWIlX
FW0UUUFsLQRBm3QWBsHKCBaCkBCIeDQpgoKNRCLYaGXAUrAyWnkU3+8768ZsNrs7u5v4F1NkZ/abZ9/5
rgnLZDKUOyYnJ4kx9l9GLgfLB8Pv+fn5Pwe7vb1VCFQQLJFIcLCVFUZEpRufn4yqqhgtLS0poCBOQTBM
nJ+fc7hAoDRgT0+Su8zNzamgdMEweXl5yV++uSk+HOxWVlYWhDIEwwKXy8Xh3t6KB7e1pQ8lBIZFbreb
KiqKA7axIR1hOp3WVEsYTPa3xkZ7cAgmQPn9fl0oYTAsjMVi3Oj2tnW45mZGExMThlCmwLB4fX2dw+3t
mYP7+GBUXc1odHRUCMo0GF7o6OjgcJmMOJxcSQolc61nmnlMz0hDQwOHe383hjs5YVReXk7X19dZtXZ3
d6mpqYkPh8OhqDKDg4N8nSWwZDLJjTmd+mAHB5Kz39/fq44wHo9/Z/0qDi0rend3l11nCQxfdHp6auhv
2LC3tze72fLyMvX19anq8NraGuFjDYu4qC/Im0SjauXcbkb9/f00MzND09PTCpienh7a3Nzkc4FAwHxJ
EgFsb2/nmx4f/8K5XOq2aWpqihYWFrIQ+Qrl72X5KHMNtba2UleXGgZB4vV6hVNEUY4S/ROGVlMporbe
GtOKhcNhqq2tpbKyMhXU8zOjujpJuT8Bm52dpYGBARUIHDcSiRCOcnj418cAhmd24DQVW1xc5MU2/6gA
EwwGs5vC+YeGlFGJQMB7mLMKpwBDRu7s7FTBjIyM8NDO36SlpYV8vsJJFikEcPv7+5bgFGBy6MuJUa8T
ODs74xuj5GjdC9raJDgkY7PKKcC6u7spFAoZGpH7s2TSuFaibDmdTnp8fDS0aytdRKPRn/pnDAUlUeih
GnKaGdVMpwv4YH09o68vMTDAxWISHFomUThTYB6P5zvSxIFyfS8UkuCguAicMBhqHQzbuQCPjUlwR0dH
hnBCYBcXF9zgzo49MHwULjQilcEQ7OHhgRs6PLQPJavtcDB+JbRcK6+urnhNzG1p7Byl/O7rq6QaLtNa
cLqK+Xw+buDlpXhqyXDBoHQXSKVS5hrF8fFxqqkxlxbMqok/bPDhSNhCjeLq6upPaCO8Szu0gkF1lPIN
SKsBLNVz/FmYq9o/66yHqbdqC6IAAAAASUVORK5CYII=
</value>
</data>
<data name="watermeterPictureBox1z.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIUSURBVFhH7Zgxa8JAFMfTFqSTgoJLJyUgDq5xcXGsEKRr
B2ldHZwL+gnEoaMQx9LVtehguujgUipCwUDpUigItlPb5fXeJSdWTS6nSezQ4W+Gy9373XvvLu8pzedz
cKt2uw2SJHkink2J98Ly+D8YieIWHjsgoTzZUREYDodgGIZtGm0BFiJQsKNmNE8TiQS0Wq2NcHsCYxvD
w5SFZDIJlUrlF6AQWLVaJQt54bFVj/cXJ13XdQpIPCpy/A93DCEvBRSy/hGDRLAGEVLz9OgzGIIby2B3
ARjkeWt5nEYRf/wH07QRpNPvLh0QIFg2O4N+vw/45F83AYIhTLd7T+EKhVcOnANYvT6hi/ilfP7NAW6P
YL2eDtHolw3cHsHi8c/tPMZPUJHjb77LciyTwZvdaX6AyV8qPdN8TaU+/tapbDQeXAAxLwboMbHUWICd
k93UBXYknl/OYOhNtM9EwBRFAZT5aZItfQcI+URtM44Fz2ozYgJizXUbENwlqKq6VsWuFYrj8Rg0TbM8
qPoMd0HtbOrUbCvYZrMJuVyOTIwQXfsAOKFQnU5HDIztQpZlCIUwtFdELx4BmlCDwWC3Lmk0GlmhPfYA
zAwfdkietW/lctkCPN0C8JLMMet5u/At55pQl4QTp9MpxGIxC/CGPFF29xpeOzh+RucUi0XX/5MIg7Fd
1Wo1C865ywqHw6S8iboGYuv/AMJ7ZtVaEL7eAAAAAElFTkSuQmCC
</value>
</data>
<data name="watermeterPictureBox2z.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIUSURBVFhH7Zgxa8JAFMfTFqSTgoJLJyUgDq5xcXGsEKRr
B2ldHZwL+gnEoaMQx9LVtehguujgUipCwUDpUigItlPb5fXeJSdWTS6nSezQ4W+Gy9373XvvLu8pzedz
cKt2uw2SJHkink2J98Ly+D8YieIWHjsgoTzZUREYDodgGIZtGm0BFiJQsKNmNE8TiQS0Wq2NcHsCYxvD
w5SFZDIJlUrlF6AQWLVaJQt54bFVj/cXJ13XdQpIPCpy/A93DCEvBRSy/hGDRLAGEVLz9OgzGIIby2B3
ARjkeWt5nEYRf/wH07QRpNPvLh0QIFg2O4N+vw/45F83AYIhTLd7T+EKhVcOnANYvT6hi/ilfP7NAW6P
YL2eDtHolw3cHsHi8c/tPMZPUJHjb77LciyTwZvdaX6AyV8qPdN8TaU+/tapbDQeXAAxLwboMbHUWICd
k93UBXYknl/OYOhNtM9EwBRFAZT5aZItfQcI+URtM44Fz2ozYgJizXUbENwlqKq6VsWuFYrj8Rg0TbM8
qPoMd0HtbOrUbCvYZrMJuVyOTIwQXfsAOKFQnU5HDIztQpZlCIUwtFdELx4BmlCDwWC3Lmk0GlmhPfYA
zAwfdkietW/lctkCPN0C8JLMMet5u/At55pQl4QTp9MpxGIxC/CGPFF29xpeOzh+RucUi0XX/5MIg7Fd
1Wo1C865ywqHw6S8iboGYuv/AMJ7ZtVaEL7eAAAAAElFTkSuQmCC
</value>
</data>
<data name="watermeterPictureBox3z.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIUSURBVFhH7Zgxa8JAFMfTFqSTgoJLJyUgDq5xcXGsEKRr
B2ldHZwL+gnEoaMQx9LVtehguujgUipCwUDpUigItlPb5fXeJSdWTS6nSezQ4W+Gy9373XvvLu8pzedz
cKt2uw2SJHkink2J98Ly+D8YieIWHjsgoTzZUREYDodgGIZtGm0BFiJQsKNmNE8TiQS0Wq2NcHsCYxvD
w5SFZDIJlUrlF6AQWLVaJQt54bFVj/cXJ13XdQpIPCpy/A93DCEvBRSy/hGDRLAGEVLz9OgzGIIby2B3
ARjkeWt5nEYRf/wH07QRpNPvLh0QIFg2O4N+vw/45F83AYIhTLd7T+EKhVcOnANYvT6hi/ilfP7NAW6P
YL2eDtHolw3cHsHi8c/tPMZPUJHjb77LciyTwZvdaX6AyV8qPdN8TaU+/tapbDQeXAAxLwboMbHUWICd
k93UBXYknl/OYOhNtM9EwBRFAZT5aZItfQcI+URtM44Fz2ozYgJizXUbENwlqKq6VsWuFYrj8Rg0TbM8
qPoMd0HtbOrUbCvYZrMJuVyOTIwQXfsAOKFQnU5HDIztQpZlCIUwtFdELx4BmlCDwWC3Lmk0GlmhPfYA
zAwfdkietW/lctkCPN0C8JLMMet5u/At55pQl4QTp9MpxGIxC/CGPFF29xpeOzh+RucUi0XX/5MIg7Fd
1Wo1C865ywqHw6S8iboGYuv/AMJ7ZtVaEL7eAAAAAElFTkSuQmCC
</value>
</data>
</root>

View File

@ -912,6 +912,12 @@
<Compile Include="Screens\ProcessTabPageCtrl24.Designer.cs">
<DependentUpon>ProcessTabPageCtrl24.cs</DependentUpon>
</Compile>
<Compile Include="Screens\ProcessTabPageCtrl48.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Screens\ProcessTabPageCtrl48.Designer.cs">
<DependentUpon>ProcessTabPageCtrl48.cs</DependentUpon>
</Compile>
<Compile Include="SelectComponentClassDlg.cs">
<SubType>Form</SubType>
</Compile>
@ -1564,6 +1570,9 @@
<EmbeddedResource Include="Screens\ProcessTabPageCtrl24.resx">
<DependentUpon>ProcessTabPageCtrl24.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Screens\ProcessTabPageCtrl48.resx">
<DependentUpon>ProcessTabPageCtrl48.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SelectComponentClassDlg.de.resx">
<DependentUpon>SelectComponentClassDlg.cs</DependentUpon>
</EmbeddedResource>