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 ProcessTabPageCtrl : UserControl { static readonly ILog log = LogManager.GetLogger(typeof(ProcessTabPageCtrl)); Entities.MetersKind currentMetersKind; bool pumpOn = true; bool diverterToTank = true; /// /// Constructor, initializes anonymous event handlers /// public ProcessTabPageCtrl() { currentMetersKind = Entities.MetersKind.Single; InitializeComponent(); Bridge.ProcedureSelectedHandler += delegate(object sndr, ProcedureSelectedEventArgs args) { if (InvokeRequired) Invoke(new EventHandler(OnProcedureSelected), sndr, args); else OnProcedureSelected(sndr, args); }; Bridge.TestSelectedHandler += delegate(object sender, TestSelectedEventArgs args) { if (InvokeRequired) Invoke(new EventHandler(OnTestSelected), sender, args); else OnTestSelected(sender, args); }; Bridge.TestProgressHandler += delegate(object sender, TestProgressEventArgs args) { if (InvokeRequired) Invoke(new EventHandler(OnTestProgress), sender, args); else OnTestProgress(sender, args); }; Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args) { if (InvokeRequired) Invoke(new EventHandler(OnTestCompleted), sender, args); else OnTestCompleted(sender, args); }; Bridge.ProcedureCompletedHandler += delegate(object sender, ProcedureCompletedEventArgs args) { if (InvokeRequired) Invoke(new EventHandler(OnProcedureCompleted), sender, args); else OnProcedureCompleted(sender, args); }; } private void ProcessTabPageCtrl_Load(object sender, EventArgs e) { Once(); ResetLabelsAndTargetVals(); ResetReadings(); } void Once() { } /// /// Called when a new procedure is selected /// 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) { watermeterPictureBox1z.Visible = false; watermeterPictureBox2z.Visible = false; watermeterPictureBox3z.Visible = false; groupBox1z.Visible = false; groupBox2z.Visible = false; groupBox3z.Visible = false; sensor1Label.Text = "---"; if (Program.WMsCount >= 2) { sensor2Label.Text = "---"; } else { groupBox2.Visible = false; watermeterPictureBox2.Visible = false; } if (Program.WMsCount >= 3) { sensor3Label.Text = "---"; } else { groupBox3.Visible = false; watermeterPictureBox3.Visible = false; } if (Program.WMsCount >= 4) { sensor4Label.Text = "---"; } else { groupBox4.Visible = false; watermeterPictureBox4.Visible = false; } if (Program.WMsCount >= 5) { sensor5Label.Text = "---"; } else { groupBox5.Visible = false; watermeterPictureBox5.Visible = false; } if (Program.WMsCount >= 6) { sensor6Label.Text = "---"; } else { groupBox6.Visible = false; watermeterPictureBox6.Visible = false; } } else if (currentMetersKind == Entities.MetersKind.Combined) { watermeterPictureBox1.Visible = false; watermeterPictureBox3.Visible = false; watermeterPictureBox5.Visible = false; sensor1Label.Text = "---"; sensor2Label.Text = "---"; watermeterPictureBox2.Visible = true; watermeterPictureBox1z.Visible = true; groupBox1z.Visible = true; if (Program.WMsCount >= 4) { watermeterPictureBox4.Visible = true; watermeterPictureBox2z.Visible = true; groupBox3.Visible = true; groupBox4.Visible = true; groupBox2z.Visible = true; sensor3Label.Text = "---"; sensor4Label.Text = "---"; } else { watermeterPictureBox4.Visible = false; watermeterPictureBox2z.Visible = false; groupBox3.Visible = false; groupBox4.Visible = false; groupBox2z.Visible = false; } if (Program.WMsCount >= 6) { watermeterPictureBox6.Visible = true; watermeterPictureBox3z.Visible = true; groupBox5.Visible = true; groupBox6.Visible = true; groupBox3z.Visible = true; sensor5Label.Text = "---"; sensor6Label.Text = "---"; } else { watermeterPictureBox6.Visible = false; watermeterPictureBox3z.Visible = false; groupBox5.Visible = false; groupBox6.Visible = false; groupBox3z.Visible = false; } } } /// /// Called when a new procedure or a new test procedure is selected /// 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 (Program.WMsCount >= 2) { pulses2Label.Text = "---"; refPulses2Label.Text = "---"; volume2Label.Text = "---"; error2Label.Text = "---"; passed2Label.Text = "---"; } if (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 2) { volume1zLabel.Text = "---"; error1zLabel.Text = "---"; passed1zLabel.Text = "---"; } if ((currentMetersKind == Entities.MetersKind.Single && Program.WMsCount >= 3) || (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 4)) { pulses3Label.Text = "---"; refPulses3Label.Text = "---"; volume3Label.Text = "---"; error3Label.Text = "---"; passed3Label.Text = "---"; } if (Program.WMsCount >= 4) { pulses4Label.Text = "---"; refPulses4Label.Text = "---"; volume4Label.Text = "---"; error4Label.Text = "---"; passed4Label.Text = "---"; } if (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 4) { volume2zLabel.Text = "---"; error2zLabel.Text = "---"; passed2zLabel.Text = "---"; } if ((currentMetersKind == Entities.MetersKind.Single && Program.WMsCount >= 5) || (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 6)) { pulses5Label.Text = "---"; refPulses5Label.Text = "---"; volume5Label.Text = "---"; error5Label.Text = "---"; passed5Label.Text = "---"; } if (Program.WMsCount >= 6) { pulses6Label.Text = "---"; refPulses6Label.Text = "---"; volume6Label.Text = "---"; error6Label.Text = "---"; passed6Label.Text = "---"; } if (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 6) { volume3zLabel.Text = "---"; error3zLabel.Text = "---"; passed3zLabel.Text = "---"; } } void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) { currentMetersKind = args.Procedure.MetersKind; 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 prInCmpntLabel.Text = args.BenchPath.PressIn.Cfg.Name; prOutCmpntLabel.Text = args.BenchPath.PressOut.Cfg.Name; tInCmpntLabel.Text = args.BenchPath.TempIn.Cfg.Name; tOutCmpntLabel.Text = args.BenchPath.TempOut.Cfg.Name; tDivCmpntLabel.Text = args.OutputPath.TempDiv.Cfg.Name; refFlowCmpntLabel.Text = args.OutputPath.FlowMeter.Cfg.Name; regValveCmpntLabel.Text = args.OutputPath.RegulValve.Cfg.Name; scaleCmpntLabel.Text = args.OutputPath.Balance.Cfg.Name; sensor1Label.Text = (args.MetersPath.RegisterReaders[0] == null) ? "" : args.MetersPath.RegisterReaders[0].Cfg.Name; if (Program.WMsCount >= 2) { sensor2Label.Text = (args.MetersPath.RegisterReaders[1] == null) ? "" : args.MetersPath.RegisterReaders[1].Cfg.Name; } if (Program.WMsCount >= 3) { sensor3Label.Text = (args.MetersPath.RegisterReaders[2] == null) ? "" : args.MetersPath.RegisterReaders[2].Cfg.Name; } if (Program.WMsCount >= 4) { sensor4Label.Text = (args.MetersPath.RegisterReaders[3] == null) ? "" : args.MetersPath.RegisterReaders[3].Cfg.Name; } if (Program.WMsCount >= 5) { sensor5Label.Text = (args.MetersPath.RegisterReaders[4] == null) ? "" : args.MetersPath.RegisterReaders[4].Cfg.Name; } if (Program.WMsCount >= 6) { sensor6Label.Text = (args.MetersPath.RegisterReaders[5] == null) ? "" : args.MetersPath.RegisterReaders[5].Cfg.Name; } } 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 = args.Flow.ToString(); refVolumeLabel.Text = args.Volume.ToString(); //regValvePosLabel.Text = args.RegValvePos.ToString(); tDivLabel.Text = args.Tdiv.ToString(); /// Bottom part pulses1Label.Text = args.TestResult.Meters[0].PulsesMeter.ToString(); refPulses1Label.Text = args.TestResult.Meters[0].PulsesMaster.ToString(); volume1Label.Text = args.TestResult.Meters[0].VolumeMeter.ToString(); error1Label.Text = args.TestResult.Meters[0].VolumeErrorPct.ToString(); if (Program.WMsCount >= 2) { pulses2Label.Text = args.TestResult.Meters[1].PulsesMeter.ToString(); refPulses2Label.Text = args.TestResult.Meters[1].PulsesMaster.ToString(); volume2Label.Text = args.TestResult.Meters[1].VolumeMeter.ToString(); error2Label.Text = args.TestResult.Meters[1].VolumeErrorPct.ToString(); } if (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 2) { volume1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeMeter.ToString(); error1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeErrorPct.ToString(); } if ((currentMetersKind == Entities.MetersKind.Single && Program.WMsCount >= 3) || (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 4)) { pulses3Label.Text = args.TestResult.Meters[2].PulsesMeter.ToString(); refPulses3Label.Text = args.TestResult.Meters[2].PulsesMaster.ToString(); volume3Label.Text = args.TestResult.Meters[2].VolumeMeter.ToString(); error3Label.Text = args.TestResult.Meters[2].VolumeErrorPct.ToString(); } if (Program.WMsCount >= 4) { pulses4Label.Text = args.TestResult.Meters[3].PulsesMeter.ToString(); refPulses4Label.Text = args.TestResult.Meters[3].PulsesMaster.ToString(); volume4Label.Text = args.TestResult.Meters[3].VolumeMeter.ToString(); error4Label.Text = args.TestResult.Meters[3].VolumeErrorPct.ToString(); } if (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 4) { volume2zLabel.Text = args.TestResult.CombinedMeters[1].VolumeMeter.ToString(); error2zLabel.Text = args.TestResult.CombinedMeters[1].VolumeErrorPct.ToString(); } if ((currentMetersKind == Entities.MetersKind.Single && Program.WMsCount >= 5) || (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 6)) { pulses5Label.Text = args.TestResult.Meters[4].PulsesMeter.ToString(); refPulses5Label.Text = args.TestResult.Meters[4].PulsesMaster.ToString(); volume5Label.Text = args.TestResult.Meters[4].VolumeMeter.ToString(); error5Label.Text = args.TestResult.Meters[4].VolumeErrorPct.ToString(); } if (Program.WMsCount >= 6) { pulses6Label.Text = args.TestResult.Meters[5].PulsesMeter.ToString(); refPulses6Label.Text = args.TestResult.Meters[5].PulsesMaster.ToString(); volume6Label.Text = args.TestResult.Meters[5].VolumeMeter.ToString(); error6Label.Text = args.TestResult.Meters[5].VolumeErrorPct.ToString(); } if (currentMetersKind == Entities.MetersKind.Combined && Program.WMsCount >= 6) { volume3zLabel.Text = args.TestResult.CombinedMeters[2].VolumeMeter.ToString(); error3zLabel.Text = args.TestResult.CombinedMeters[2].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 = (tRes.FlowMass / 1000.0f).ToString("F2"); 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) { pulses1Label.Text = tRes.Meters[0].PulsesMeter.ToString("F0"); refPulses1Label.Text = tRes.Meters[0].PulsesMaster.ToString("F0"); volume1Label.Text = tRes.Meters[0].VolumeMeter.ToString("F2"); error1Label.Text = tRes.Meters[0].VolumeErrorPct.ToString("F2"); passed1Label.Text = tRes.Meters[0].Passed ? Strings.Passed : Strings.Failed; if (Program.WMsCount >= 2) { pulses2Label.Text = tRes.Meters[1].PulsesMeter.ToString("F0"); refPulses2Label.Text = tRes.Meters[1].PulsesMaster.ToString("F0"); volume2Label.Text = tRes.Meters[1].VolumeMeter.ToString("F2"); error2Label.Text = tRes.Meters[1].VolumeErrorPct.ToString("F2"); passed2Label.Text = tRes.Meters[1].Passed ? Strings.Passed : Strings.Failed; } if (Program.WMsCount >= 3) { pulses3Label.Text = tRes.Meters[2].PulsesMeter.ToString("F0"); refPulses3Label.Text = tRes.Meters[2].PulsesMaster.ToString("F0"); volume3Label.Text = tRes.Meters[2].VolumeMeter.ToString("F2"); error3Label.Text = tRes.Meters[2].VolumeErrorPct.ToString("F2"); passed3Label.Text = tRes.Meters[2].Passed ? Strings.Passed : Strings.Failed; } if (Program.WMsCount >= 4) { pulses4Label.Text = tRes.Meters[3].PulsesMeter.ToString("F0"); refPulses4Label.Text = tRes.Meters[3].PulsesMaster.ToString("F0"); volume4Label.Text = tRes.Meters[3].VolumeMeter.ToString("F2"); error4Label.Text = tRes.Meters[3].VolumeErrorPct.ToString("F2"); passed4Label.Text = tRes.Meters[3].Passed ? Strings.Passed : Strings.Failed; } if (Program.WMsCount >= 5) { pulses5Label.Text = tRes.Meters[4].PulsesMeter.ToString("F0"); refPulses5Label.Text = tRes.Meters[4].PulsesMaster.ToString("F0"); volume5Label.Text = tRes.Meters[4].VolumeMeter.ToString("F2"); error5Label.Text = tRes.Meters[4].VolumeErrorPct.ToString("F2"); passed5Label.Text = tRes.Meters[4].Passed ? Strings.Passed : Strings.Failed; } if (Program.WMsCount >= 6) { pulses6Label.Text = tRes.Meters[5].PulsesMeter.ToString("F0"); refPulses6Label.Text = tRes.Meters[5].PulsesMaster.ToString("F0"); volume6Label.Text = tRes.Meters[5].VolumeMeter.ToString("F2"); error6Label.Text = tRes.Meters[5].VolumeErrorPct.ToString("F2"); passed6Label.Text = tRes.Meters[5].Passed ? Strings.Passed : Strings.Failed; } } else if (tRes.MetersKind == Entities.MetersKind.Combined) { if (Program.WMsCount >= 2) { 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; } if (Program.WMsCount >= 4) { pulses3Label.Text = tRes.Meters[2].PulsesMeter.ToString("F0"); pulses4Label.Text = tRes.Meters[3].PulsesMeter.ToString("F0"); //pulses2zLabel.Text = tRes.CombinedMeters[1].PulsesMeter.ToString("F0"); refPulses3Label.Text = tRes.Meters[2].PulsesMaster.ToString("F0"); refPulses4Label.Text = tRes.Meters[3].PulsesMaster.ToString("F0"); //refPulses2zLabel.Text = tRes.CombinedMeters[1].PulsesMaster.ToString("F0"); volume3Label.Text = tRes.Meters[2].VolumeMeter.ToString("F2"); volume4Label.Text = tRes.Meters[3].VolumeMeter.ToString("F2"); volume2zLabel.Text = tRes.CombinedMeters[1].VolumeMeter.ToString("F2"); error3Label.Text = tRes.Meters[2].VolumeErrorPct.ToString("F2"); error4Label.Text = tRes.Meters[3].VolumeErrorPct.ToString("F2"); error2zLabel.Text = tRes.CombinedMeters[1].VolumeErrorPct.ToString("F2"); passed3Label.Text = tRes.Meters[2].Passed ? Strings.Passed : Strings.Failed; passed4Label.Text = tRes.Meters[3].Passed ? Strings.Passed : Strings.Failed; passed2zLabel.Text = tRes.CombinedMeters[1].Passed ? Strings.Passed : Strings.Failed; } if (Program.WMsCount >= 6) { pulses5Label.Text = tRes.Meters[4].PulsesMeter.ToString("F0"); pulses6Label.Text = tRes.Meters[5].PulsesMeter.ToString("F0"); //pulses3zLabel.Text = tRes.CombinedMeters[2].PulsesMeter.ToString("F0"); refPulses5Label.Text = tRes.Meters[4].PulsesMaster.ToString("F0"); refPulses6Label.Text = tRes.Meters[5].PulsesMaster.ToString("F0"); //refPulses3zLabel.Text = tRes.CombinedMeters[2].PulsesMaster.ToString("F0"); volume5Label.Text = tRes.Meters[4].VolumeMeter.ToString("F2"); volume6Label.Text = tRes.Meters[5].VolumeMeter.ToString("F2"); volume3zLabel.Text = tRes.CombinedMeters[2].VolumeMeter.ToString("F2"); error5Label.Text = tRes.Meters[4].VolumeErrorPct.ToString("F2"); error6Label.Text = tRes.Meters[5].VolumeErrorPct.ToString("F2"); error3zLabel.Text = tRes.CombinedMeters[2].VolumeErrorPct.ToString("F2"); passed5Label.Text = tRes.Meters[4].Passed ? Strings.Passed : Strings.Failed; passed6Label.Text = tRes.Meters[5].Passed ? Strings.Passed : Strings.Failed; passed3zLabel.Text = tRes.CombinedMeters[2].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 = 751; int topRight = 841; 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)); } } }