From 900a2d660cde3d0718ff174f14c65bb915194232 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Fri, 18 Aug 2023 12:20:39 +0200 Subject: [PATCH] DataEntry.Uni : Compound meters support. --- TBF/Rig/DataEntry/DEItem.cs | 2 + TBF/Rig/DataEntry/DEUtils.cs | 24 +- TBF/Rig/DataEntry/Uni/CycleBgEnForm.cs | 4 +- TBF/Rig/DataEntry/Uni/EntryFormCfg.cs | 2 + TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs | 11 +- TBF/Rig/DataEntry/Uni/TestStartEndForm.cs | 349 +++++++++++++------ 6 files changed, 278 insertions(+), 114 deletions(-) diff --git a/TBF/Rig/DataEntry/DEItem.cs b/TBF/Rig/DataEntry/DEItem.cs index 151d09ddc..483315a04 100644 --- a/TBF/Rig/DataEntry/DEItem.cs +++ b/TBF/Rig/DataEntry/DEItem.cs @@ -29,7 +29,9 @@ namespace TBF.Rig.DataEntry [Description("Radio address")] RadioAddress, [Description("Year of calibration")] YearOfCalibration, [Description("Start state")] StartState, + [Description("Start state aux")] StartStateAux, [Description("End state")] EndState, + [Description("End state aux")] EndStateAux, [Description("Archive path")] ArchivePath, [Description("WM Order")] WmOrder, [Description("Batch order")] BatchOrder, diff --git a/TBF/Rig/DataEntry/DEUtils.cs b/TBF/Rig/DataEntry/DEUtils.cs index da8a432fe..5baa2b422 100644 --- a/TBF/Rig/DataEntry/DEUtils.cs +++ b/TBF/Rig/DataEntry/DEUtils.cs @@ -15,18 +15,20 @@ namespace TBF.Rig.DataEntry switch (content) { default: - case Ct.None: return string.Empty; - case Ct.SerialNr: return (!wm.Disabled && wm.SerialNr != null) ? wm.SerialNr : string.Empty; - case Ct.SerialNrAux: return (!wm.Disabled && wm.SerialNrAux != null) ? wm.SerialNrAux : string.Empty; - case Ct.RadioAddress: return (!wm.Disabled && wm.RadioAddress != null) ? wm.RadioAddress : string.Empty; + case Ct.None: return string.Empty; + case Ct.SerialNr: return (!wm.Disabled && wm.SerialNr != null) ? wm.SerialNr : string.Empty; + case Ct.SerialNrAux: return (!wm.Disabled && wm.SerialNrAux != null) ? wm.SerialNrAux : string.Empty; + case Ct.RadioAddress: return (!wm.Disabled && wm.RadioAddress != null) ? wm.RadioAddress : string.Empty; case Ct.YearOfCalibration: return (!wm.Disabled) ? wm.YearOfProduction.ToString() : string.Empty; - case Ct.StartState: return (!wm.Disabled && wm.GetStartState() != null) ? wm.GetStartState() : string.Empty; - case Ct.EndState: return (!wm.Disabled && wm.EndState != null) ? wm.EndState : string.Empty; - case Ct.ArchivePath: return (!wm.Disabled && wm.ArchivePath != null) ? wm.ArchivePath : string.Empty; + case Ct.StartState: return (!wm.Disabled && wm.GetStartState() != null) ? wm.GetStartState() : string.Empty; + case Ct.StartStateAux: return string.Empty; + case Ct.EndState: return (!wm.Disabled && wm.EndState != null) ? wm.EndState : string.Empty; + case Ct.EndStateAux: return (!wm.Disabled && wm.GetEndStateAux() != null) ? wm.GetEndStateAux() : string.Empty; + case Ct.ArchivePath: return (!wm.Disabled && wm.ArchivePath != null) ? wm.ArchivePath : string.Empty; - case Ct.WmOrder: return (!wm.Disabled && wm.PurchaseOrder != null) ? wm.PurchaseOrder : string.Empty; - case Ct.BatchOrder: return (wm.Batch != null && wm.Batch.PurchaseOrder != null) ? wm.Batch.PurchaseOrder : string.Empty; - case Ct.BatchAndWmOrder: return (wm.Batch != null && wm.Batch.PurchaseOrder != null) ? wm.Batch.PurchaseOrder : string.Empty; + case Ct.WmOrder: return (!wm.Disabled && wm.PurchaseOrder != null) ? wm.PurchaseOrder : string.Empty; + case Ct.BatchOrder: return (wm.Batch != null && wm.Batch.PurchaseOrder != null) ? wm.Batch.PurchaseOrder : string.Empty; + case Ct.BatchAndWmOrder: return (wm.Batch != null && wm.Batch.PurchaseOrder != null) ? wm.Batch.PurchaseOrder : string.Empty; case Ct.WmRemark: return (!wm.Disabled && wm.Remark != null) ? wm.Remark : string.Empty; case Ct.BatchRemark: return (wm.Batch != null && wm.Batch.Remark != null) ? wm.Batch.Remark : string.Empty; @@ -53,7 +55,9 @@ namespace TBF.Rig.DataEntry case Ct.RadioAddress: wm.RadioAddress = value; return; case Ct.YearOfCalibration: if (int.TryParse(value, out year)) wm.YearOfProduction = year; return; case Ct.StartState: wm.SetStartState(value); return; + case Ct.StartStateAux: return; case Ct.EndState: wm.EndState = value; return; + case Ct.EndStateAux: wm.SetEndStateAux(value); return; case Ct.ArchivePath: wm.ArchivePath = value; return; case Ct.WmOrder: diff --git a/TBF/Rig/DataEntry/Uni/CycleBgEnForm.cs b/TBF/Rig/DataEntry/Uni/CycleBgEnForm.cs index 606c9339a..129a4d195 100644 --- a/TBF/Rig/DataEntry/Uni/CycleBgEnForm.cs +++ b/TBF/Rig/DataEntry/Uni/CycleBgEnForm.cs @@ -82,13 +82,13 @@ namespace TBF.Rig.DataEntry.Uni /// Common items displayed in the upper part of the form /// Water meter items displayed in columns (in the matrix in the main part of the form) /// true = This form is displayed at the end of cycle - public CycleBgEnForm(IList waterMeters, int lineSize, string title, FontSz sz, bool isLrOrder, bool isCameraPicture, + public CycleBgEnForm(IList waterMeters, int _lineSize, string title, FontSz sz, bool isLrOrder, bool isCameraPicture, string formCloseKeys, IList commonItems, IList colItems, bool isEnd = false) : this() { /// Arguments this.WaterMeters = waterMeters; - this.lineSize = lineSize; + this.lineSize = Math.Min(waterMeters.Count, _lineSize); this.Text = !string.IsNullOrEmpty(title) ? title : string.Empty; this.sz = sz; this.isLrOrder = isLrOrder; diff --git a/TBF/Rig/DataEntry/Uni/EntryFormCfg.cs b/TBF/Rig/DataEntry/Uni/EntryFormCfg.cs index 7138dcbc3..37b45f6fb 100644 --- a/TBF/Rig/DataEntry/Uni/EntryFormCfg.cs +++ b/TBF/Rig/DataEntry/Uni/EntryFormCfg.cs @@ -557,7 +557,9 @@ namespace TBF.Rig.DataEntry.Uni Ct.RadioAddress.ToDescription(), Ct.YearOfCalibration.ToDescription(), Ct.StartState.ToDescription(), + Ct.StartStateAux.ToDescription(), Ct.EndState.ToDescription(), + Ct.EndStateAux.ToDescription(), Ct.ArchivePath.ToDescription(), Ct.WmOrder.ToDescription(), Ct.WmRemark.ToDescription(), diff --git a/TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs b/TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs index f1fd2facf..7775ffb26 100644 --- a/TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs +++ b/TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs @@ -281,9 +281,10 @@ namespace TBF.Rig.DataEntry.Uni } } + bool isCompound = waterMeters[0].Batch.Compound; modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize, myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, - DEItem.GetColumns(), volumeUnit, myCfg.TestIsCameraPicture, + DEItem.GetColumns(), isCompound, volumeUnit, myCfg.TestIsCameraPicture, startImages, endImages, ocr, ocrMessage, myRef.OcrStream); modelessDlg.Show(); } @@ -302,9 +303,10 @@ namespace TBF.Rig.DataEntry.Uni } } + bool isCompound = waterMeters[0].Batch.Compound; modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize, myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, DEItem.GetColumns(), - volumeUnit, myCfg.TestIsCameraPicture, startImages, endImages, + isCompound, volumeUnit, myCfg.TestIsCameraPicture, startImages, endImages, ocr, ocrMessage, myRef.OcrStream, wmStartStateStr, refVolume, errLimLo, errLimHi); modelessDlg.Show(); } @@ -323,9 +325,10 @@ namespace TBF.Rig.DataEntry.Uni } } + bool isCompound = waterMeters[0].Batch.Compound; modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize, myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, DEItem.GetColumns(), - volumeUnit, myCfg.TestIsCameraPicture, startImages, endImages, + isCompound, volumeUnit, myCfg.TestIsCameraPicture, startImages, endImages, ocr, ocrMessage, myRef.OcrStream, wmStartStateStr, refVolume, errLimLo, errLimHi); modelessDlg.Show(); } @@ -432,9 +435,9 @@ namespace TBF.Rig.DataEntry.Uni if (!((i < waterMeters.Count && waterMeters[i].Disabled) || (i < regReaders.Length && regReaders[i] == null))) { wmStartState[i] = dlg.WMStartState[i]; - wmStartStateStr[i] = dlg.WMStartStateStr[i]; } } + wmStartStateStr = dlg.WMStartStateStr; } } else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.TestEndStates) diff --git a/TBF/Rig/DataEntry/Uni/TestStartEndForm.cs b/TBF/Rig/DataEntry/Uni/TestStartEndForm.cs index 311ebfb58..2b5b1635e 100644 --- a/TBF/Rig/DataEntry/Uni/TestStartEndForm.cs +++ b/TBF/Rig/DataEntry/Uni/TestStartEndForm.cs @@ -13,6 +13,7 @@ using TBF.Rig.GenericDevices; using TBF.Resources; using System.Threading; using System.IO; +using static System.Net.Mime.MediaTypeNames; namespace TBF.Rig.DataEntry.Uni { @@ -47,6 +48,7 @@ namespace TBF.Rig.DataEntry.Uni readonly bool isStartBoxAlwaysEn; readonly bool isLrOrder; /// true = controls obtain focus after ENTER key in left-right order, false = top-down order readonly IList colItems; + readonly bool isCompound; readonly string formCloseKeys; public readonly string[] WMStartStateStr; readonly bool isCameraPicture; /// true = camera picture displayed on the left side @@ -72,7 +74,9 @@ namespace TBF.Rig.DataEntry.Uni public double[] WMEndState; public Unit VolumeUnit; int startStateColumn; + int startStateColumnAux; int endStateColumn; + int endStateColumnAux; /// Size and layout related values readonly int meterHeight; @@ -131,30 +135,39 @@ namespace TBF.Rig.DataEntry.Uni /// Number of water meters in one (test bencch) line /// Form title /// Font size + /// true = start box enabled at the end of a test /// true = controls obtain focus in left-right order, forls = top-down order /// String containing keys to close this form /// Water meter items displayed in columns (in the matrix in the main part of the form) + /// true = Compound meters: StartStateAux and EndStateAux columns displayed /// Volume unit preset initially + /// true = display camera pictures in this form + /// Images before a standing start/stop test + /// Images after a standing start/stop test + /// Reference to OCR objejct + /// Message to be displayed when OCR was not initialized properly + /// OCR stream selection /// Information entered on test start /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary - public TestStartEndForm(IList waterMeters, IRegReader[] regReaders, int lineSize, string title, FontSz sz, - bool isStartBoxAlwaysEn, bool isLrOrder, string formCloseKeys, IList colItems, + public TestStartEndForm(IList waterMeters, IRegReader[] regReaders, int _lineSize, string title, FontSz sz, + bool isStartBoxAlwaysEn, bool isLrOrder, string formCloseKeys, IList colItems, bool isCompound, Unit initialVolumeUnit, bool isCameraPicture, string[] startImages, string[] endImages, - OcrVidi ocrVidi, string ocrMessage, string streamName, - string[] wmStartStateStr = null, double refVolume = 0, double errLimLo = 0, double errLimHi = 0) + OcrVidi ocrVidi, string ocrMessage, string streamName, string[] wmStartStateStr = null, + double refVolume = 0, double errLimLo = 0, double errLimHi = 0) : this() { this.waterMeters = waterMeters; this.regReaders = regReaders; - this.lineSize = lineSize; + this.lineSize = Math.Min(waterMeters.Count, _lineSize); this.Text = !string.IsNullOrEmpty(title) ? title : string.Empty; this.sz = sz; this.isStartBoxAlwaysEn = isStartBoxAlwaysEn; this.isLrOrder = isLrOrder; this.formCloseKeys = !string.IsNullOrEmpty(formCloseKeys) ? formCloseKeys : string.Empty; this.colItems = colItems; + this.isCompound = isCompound; this.VolumeUnit = initialVolumeUnit; this.isCameraPicture = isCameraPicture; this.startImages = startImages; @@ -168,7 +181,7 @@ namespace TBF.Rig.DataEntry.Uni this.warningLimHi = 2 * errLimHi; if (waterMeters == null || regReaders == null || - (wmStartStateStr != null && wmStartStateStr.Length != waterMeters.Count)) + (wmStartStateStr != null && wmStartStateStr.Length != (isCompound ? 2 : 1) * waterMeters.Count)) { throw new Exception("Invalid argument"); } @@ -179,12 +192,12 @@ namespace TBF.Rig.DataEntry.Uni isEnd = (wmStartStateStr != null); mode = isEnd ? Tst.End : Tst.Start; wmsCount = waterMeters.Count; - if (WMStartStateStr == null) WMStartStateStr = new string[wmsCount]; + if (WMStartStateStr == null) WMStartStateStr = new string[(isCompound ? 2 : 1) * wmsCount]; fixedErrorLimits = (errLimHi > errLimLo); linesCount = (wmsCount + Math.Max(1, lineSize) - 1) / Math.Max(1, lineSize); firstValidWM = waterMeters.FirstOrDefault(x => (x != null && !x.Disabled)); - WMStartState = new double[wmsCount]; - WMEndState = new double[wmsCount]; + WMStartState = new double[(isCompound ? 2 : 1) * wmsCount]; + WMEndState = new double[(isCompound ? 2 : 1) * wmsCount]; /// unitComboBox.Text = VolumeUnit.ToDescription(); for (Unit u = 0; u < Unit.Count; u++) @@ -460,7 +473,9 @@ namespace TBF.Rig.DataEntry.Uni /// Table startStateColumn = -1; + startStateColumnAux = -1; endStateColumn = -1; + endStateColumnAux = -1; for (int k = 0; k < colItems.Count; k++) { if (colItems[k].Content == Ct.StartState) @@ -468,14 +483,32 @@ namespace TBF.Rig.DataEntry.Uni startStateColumn = k; for (int i = 0; i < wmsCount; i++) { + int rrIx = (isCompound ? 2 : 1) * i; textBoxes[k, i].Text = (!isEnd || waterMeters[i] == null || waterMeters[i].Disabled || i >= regReaders.Length || regReaders[i] == null - || string.IsNullOrEmpty(WMStartStateStr[i])) ? string.Empty : WMStartStateStr[i]; + || string.IsNullOrEmpty(WMStartStateStr[i])) ? string.Empty : WMStartStateStr[rrIx]; textBoxes[k, i].Enabled = (isStartBoxAlwaysEn || !isEnd) && waterMeters[i] != null && !waterMeters[i].Disabled - && i < regReaders.Length && regReaders[i] != null; + && rrIx < regReaders.Length && regReaders[rrIx] != null; + } + } + else if (colItems[k].Content == Ct.StartStateAux) + { + startStateColumnAux = k; + for (int i = 0; i < wmsCount; i++) + { + int rrIx = 2 * i + 1; + textBoxes[k, i].Text = (!isEnd || !isCompound + || waterMeters[i] == null + || waterMeters[i].Disabled + || i >= regReaders.Length + || regReaders[i] == null + || string.IsNullOrEmpty(WMStartStateStr[i])) ? string.Empty : WMStartStateStr[rrIx]; + + textBoxes[k, i].Enabled = isCompound && (isStartBoxAlwaysEn || !isEnd) && waterMeters[i] != null && !waterMeters[i].Disabled + && rrIx < regReaders.Length && regReaders[rrIx] != null; } } else if (colItems[k].Content == Ct.EndState) @@ -483,9 +516,21 @@ namespace TBF.Rig.DataEntry.Uni endStateColumn = k; for (int i = 0; i < wmsCount; i++) { + int rrIx = (isCompound ? 2 : 1) * i; textBoxes[k, i].Text = string.Empty; textBoxes[k, i].Enabled = isEnd && waterMeters[i] != null && !waterMeters[i].Disabled - && i < regReaders.Length && regReaders[i] != null; + && rrIx < regReaders.Length && regReaders[rrIx] != null; + } + } + else if (colItems[k].Content == Ct.EndStateAux) + { + endStateColumn = k; + for (int i = 0; i < wmsCount; i++) + { + int rrIx = 2 * i + 1; + textBoxes[k, i].Text = string.Empty; + textBoxes[k, i].Enabled = isEnd && isCompound && waterMeters[i] != null && !waterMeters[i].Disabled + && rrIx < regReaders.Length && regReaders[rrIx] != null; } } else @@ -533,23 +578,37 @@ namespace TBF.Rig.DataEntry.Uni { for (int i = 0; i < wmsCount; i++) { + int rrIx = (isCompound ? 2 : 1) * i; + double volume; + if (colItems[k].Content == Ct.StartState) { - /// Water meter start state - double startVol; - if (textBoxes[k, i].Enabled && Utils.TryParseUDouble(textBoxes[k, i].Text, out startVol)) + if (textBoxes[k, i].Enabled && Utils.TryParseUDouble(textBoxes[k, i].Text, out volume)) { - WMStartStateStr[i] = textBoxes[k, i].Text; - WMStartState[i] = Units.ConvertFrom(VolumeUnit, startVol); + WMStartStateStr[rrIx] = textBoxes[k, i].Text; + WMStartState[rrIx] = Units.ConvertFrom(VolumeUnit, volume); + } + } + else if (colItems[k].Content == Ct.StartStateAux) + { + if (isCompound && textBoxes[k, i].Enabled && Utils.TryParseUDouble(textBoxes[k, i].Text, out volume)) + { + WMStartStateStr[rrIx + 1] = textBoxes[k, i].Text; + WMStartState[rrIx + 1] = Units.ConvertFrom(VolumeUnit, volume); } } else if (colItems[k].Content == Ct.EndState) { - /// Water meter end state - double endVol; - if (textBoxes[k, i].Enabled && Utils.TryParseUDouble(textBoxes[k, i].Text, out endVol)) + if (textBoxes[k, i].Enabled && Utils.TryParseUDouble(textBoxes[k, i].Text, out volume)) { - WMEndState[i] = Units.ConvertFrom(VolumeUnit, endVol); + WMEndState[rrIx] = Units.ConvertFrom(VolumeUnit, volume); + } + } + else if (colItems[k].Content == Ct.EndStateAux) + { + if (isCompound && textBoxes[k, i].Enabled && Utils.TryParseUDouble(textBoxes[k, i].Text, out volume)) + { + WMEndState[rrIx + 1] = Units.ConvertFrom(VolumeUnit, volume); } } else @@ -565,21 +624,39 @@ namespace TBF.Rig.DataEntry.Uni { int count = 0; - /// Count the images + /// Count images for (int i = 0; i < wmsCount; i++) { - if ((mode == Tst.Start || mode == Tst.Both) && - startStateColumn >= 0 && textBoxes[startStateColumn, i].Enabled && - startImages != null && startImages.Length > i && !string.IsNullOrEmpty(startImages[i])) + int rrIx = (isCompound ? 2 : 1) * i; + + if (mode == Tst.Start || mode == Tst.Both) { - count++; + if (startStateColumn >= 0 && textBoxes[startStateColumn, i].Enabled && + startImages != null && startImages.Length > rrIx && !string.IsNullOrEmpty(startImages[rrIx])) + { + count++; + } + + if (startStateColumnAux >= 0 && textBoxes[startStateColumnAux, i].Enabled && + startImages != null && startImages.Length > rrIx + 1 && !string.IsNullOrEmpty(startImages[rrIx + 1])) + { + count++; + } } - - if ((mode == Tst.End || mode == Tst.Both) && - endStateColumn >= 0 && textBoxes[endStateColumn, i].Enabled && - endImages != null && endImages.Length > i && !string.IsNullOrEmpty(endImages[i])) + + if (mode == Tst.End || mode == Tst.Both) { - count++; + if (endStateColumn >= 0 && textBoxes[endStateColumn, i].Enabled && + endImages != null && endImages.Length > rrIx && !string.IsNullOrEmpty(endImages[rrIx])) + { + count++; + } + + if (endStateColumnAux >= 0 && textBoxes[endStateColumnAux, i].Enabled && + endImages != null && endImages.Length > rrIx + 1 && !string.IsNullOrEmpty(endImages[rrIx + 1])) + { + count++; + } } } @@ -593,50 +670,87 @@ namespace TBF.Rig.DataEntry.Uni Thread.Sleep(2000); - bool[] startImgProcessed = new bool[wmsCount]; - bool[] endImgProcessed = new bool[wmsCount]; + bool[] startImgProcessed = new bool[(isCompound ? 2 : 1) * wmsCount]; + bool[] endImgProcessed = new bool[(isCompound ? 2 : 1) * wmsCount]; for (int attempt = 1; attempt <= 3; attempt++) { for (int i = 0; i < wmsCount; i++) { - double pulsesPerLtr = (regReaders != null && regReaders.Length > i && regReaders[i] != null) ? regReaders[i].PulsesPerLtr : 1; - GetOcrParameters(pulsesPerLtr, out denominator, out format); - - if ((mode == Tst.Start || mode == Tst.Both) && - startStateColumn >= 0 && textBoxes[startStateColumn, i].Enabled && - startImages != null && startImages.Length > i && !string.IsNullOrEmpty(startImages[i])) + int rrIx = (isCompound ? 2 : 1) * i; + double pulsesPerLtr = (regReaders != null && regReaders.Length > rrIx && regReaders[rrIx] != null) ? regReaders[rrIx].PulsesPerLtr : 1; + double pulsesPerLtrAux = (regReaders != null && regReaders.Length > rrIx + 1 && regReaders[rrIx + 1] != null) ? regReaders[rrIx + 1].PulsesPerLtr : 1; + + if (mode == Tst.Start || mode == Tst.Both) { - if (!startImgProcessed[i]) + if (startStateColumn >= 0 && textBoxes[startStateColumn, i].Enabled && + startImages != null && startImages.Length > rrIx && !string.IsNullOrEmpty(startImages[rrIx])) { - try + if (!startImgProcessed[rrIx]) { - /// Process a start image - var text = ocrVidi.Recognize(streamName, startImages[i], denominator, format); /// OCR - this.Invoke(ocrTextObtained, new object[] { i, false, text }); - startImgProcessed[i] = true; + try + { + /// Process a start image + GetOcrParameters(pulsesPerLtr, out denominator, out format); + var text = ocrVidi.Recognize(streamName, startImages[rrIx], denominator, format); /// OCR + this.Invoke(ocrTextObtained, new object[] { rrIx, false, text }); + startImgProcessed[rrIx] = true; + } + catch (Exception) { } } - catch (Exception) + } + + if (startStateColumnAux >= 0 && textBoxes[startStateColumnAux, i].Enabled && + startImages != null && startImages.Length > rrIx + 1 && !string.IsNullOrEmpty(startImages[rrIx + 1])) + { + if (!startImgProcessed[rrIx + 1]) { + try + { + /// Process a start image + GetOcrParameters(pulsesPerLtrAux, out denominator, out format); + var text = ocrVidi.Recognize(streamName, startImages[rrIx + 1], denominator, format); /// OCR + this.Invoke(ocrTextObtained, new object[] { rrIx + 1, false, text }); + startImgProcessed[rrIx + 1] = true; + } + catch (Exception) { } } } } - if ((mode == Tst.End || mode == Tst.Both) && - endStateColumn >= 0 && textBoxes[endStateColumn, i].Enabled && - endImages != null && endImages.Length > i && !string.IsNullOrEmpty(endImages[i])) + if (mode == Tst.End || mode == Tst.Both) { - if (!endImgProcessed[i]) + if (endStateColumn >= 0 && textBoxes[endStateColumn, i].Enabled && + endImages != null && endImages.Length > rrIx && !string.IsNullOrEmpty(endImages[rrIx])) { - try + if (!endImgProcessed[rrIx]) { - /// Process an end image - var text = ocrVidi.Recognize(streamName, endImages[i], denominator, format); /// OCR - this.Invoke(ocrTextObtained, new object[] { i, true, text }); - endImgProcessed[i] = true; + try + { + /// Process an end image + GetOcrParameters(pulsesPerLtr, out denominator, out format); + var text = ocrVidi.Recognize(streamName, endImages[rrIx], denominator, format); /// OCR + this.Invoke(ocrTextObtained, new object[] { rrIx, true, text }); + endImgProcessed[rrIx] = true; + } + catch (Exception) { } } - catch (Exception) + } + + if (endStateColumnAux >= 0 && textBoxes[endStateColumnAux, i].Enabled && + endImages != null && endImages.Length > rrIx + 1 && !string.IsNullOrEmpty(endImages[rrIx + 1])) + { + if (!endImgProcessed[rrIx + 1]) { + try + { + /// Process an end image + GetOcrParameters(pulsesPerLtrAux, out denominator, out format); + var text = ocrVidi.Recognize(streamName, endImages[rrIx + 1], denominator, format); /// OCR + this.Invoke(ocrTextObtained, new object[] { rrIx + 1, true, text }); + endImgProcessed[rrIx + 1] = true; + } + catch (Exception) { } } } } @@ -668,24 +782,24 @@ namespace TBF.Rig.DataEntry.Uni } } - public void OnOcrTextObtained(int ix, bool _isEnd, string text) + public void OnOcrTextObtained(int rrIx, bool _isEnd, string text) { if (!isCameraPicture) return; if (_isEnd) { - if (endStateColumn>= 0 && textBoxes[endStateColumn, ix].Enabled) + if (endStateColumn>= 0 && textBoxes[endStateColumn, rrIx].Enabled) { - textBoxes[endStateColumn, ix].Text = text; - LoadImage(null, Tst.End, ix); + textBoxes[endStateColumn, rrIx].Text = text; + LoadImage(null, Tst.End, rrIx); } } else { - if (startStateColumn >= 0 && textBoxes[startStateColumn, ix].Enabled) + if (startStateColumn >= 0 && textBoxes[startStateColumn, rrIx].Enabled) { - textBoxes[endStateColumn, ix].Text = text; - LoadImage(null, Tst.Start, ix); + textBoxes[endStateColumn, rrIx].Text = text; + LoadImage(null, Tst.Start, rrIx); } } @@ -720,19 +834,41 @@ namespace TBF.Rig.DataEntry.Uni { for (int i = 0; i < wmsCount; i++) { - double startVol, endVol; + double startVol, endVol, startVolAux, endVolAux; - if (Utils.TryParseUDouble(textBoxes[startStateColumn, i].Text, out startVol) && - Utils.TryParseUDouble(textBoxes[endStateColumn, i].Text, out endVol)) + if (isCompound && startStateColumnAux >= 0 && endStateColumnAux >= 0) { - double startState = Units.ConvertFrom(VolumeUnit, startVol); - double endState = Units.ConvertFrom(VolumeUnit, endVol); - double err = (refVolume != 0) ? 100.0 * (endState - startState - refVolume) / refVolume : 1000.0; - exclamations[i].Visible = fixedErrorLimits ? ((err < warningLimLo) || (warningLimHi < err)) : ((err < -6) || (+6 < err)); + /// Compound + if (Utils.TryParseUDouble(textBoxes[startStateColumn, i].Text, out startVol) && + Utils.TryParseUDouble(textBoxes[startStateColumnAux, i].Text, out startVolAux) && + Utils.TryParseUDouble(textBoxes[endStateColumn, i].Text, out endVol) && + Utils.TryParseUDouble(textBoxes[endStateColumnAux, i].Text, out endVolAux)) + { + double startState = Units.ConvertFrom(VolumeUnit, startVol + startVolAux); + double endState = Units.ConvertFrom(VolumeUnit, endVol + endVolAux); + double err = (refVolume != 0) ? 100.0 * (endState - startState - refVolume) / refVolume : 1000.0; + exclamations[i].Visible = fixedErrorLimits ? ((err < warningLimLo) || (warningLimHi < err)) : ((err < -6) || (+6 < err)); + } + else + { + exclamations[i].Visible = !string.IsNullOrEmpty(textBoxes[endStateColumn, i].Text); + } } else { - exclamations[i].Visible = !string.IsNullOrEmpty(textBoxes[endStateColumn, i].Text); + /// Single + if (Utils.TryParseUDouble(textBoxes[startStateColumn, i].Text, out startVol) && + Utils.TryParseUDouble(textBoxes[endStateColumn, i].Text, out endVol)) + { + double startState = Units.ConvertFrom(VolumeUnit, startVol); + double endState = Units.ConvertFrom(VolumeUnit, endVol); + double err = (refVolume != 0) ? 100.0 * (endState - startState - refVolume) / refVolume : 1000.0; + exclamations[i].Visible = fixedErrorLimits ? ((err < warningLimLo) || (warningLimHi < err)) : ((err < -6) || (+6 < err)); + } + else + { + exclamations[i].Visible = !string.IsNullOrEmpty(textBoxes[endStateColumn, i].Text); + } } } @@ -776,9 +912,11 @@ namespace TBF.Rig.DataEntry.Uni largeTextBox.Text = string.Format("{0}: {1}", j + 1, textBoxes[k, j].Text); largeExclamationLabel.Visible = false; - if (isCameraPicture && (k == startStateColumn || k == endStateColumn)) + if (isCameraPicture && (k == startStateColumn || k == startStateColumnAux || + k == endStateColumn || k == endStateColumnAux)) { - LoadImage(sender, (k == startStateColumn) ? Tst.Start : Tst.End, j); + int rrIx = (isCompound ? 2 : 1) * j + ((k == startStateColumnAux || k == endStateColumnAux) ? 1 : 0); + LoadImage(sender, (k == startStateColumn || k == startStateColumnAux) ? Tst.Start : Tst.End, rrIx); } textBoxes[k, j].Focus(); @@ -802,24 +940,9 @@ namespace TBF.Rig.DataEntry.Uni largeTextBox.Text = string.Format("{0}: {1}", j + 1, textBoxes[k, j].Text); - if (isEnd && (k == startStateColumn || k == endStateColumn)) + if (isEnd && (k == startStateColumn || k == startStateColumnAux || k == endStateColumn || k == endStateColumnAux)) { - double startVol, endVol; - - if (startStateColumn >= 0 && Utils.TryParseUDouble(textBoxes[startStateColumn, j].Text, out startVol) && - endStateColumn >= 0 && Utils.TryParseUDouble(textBoxes[endStateColumn, j].Text, out endVol)) - { - double startState = Units.ConvertFrom(VolumeUnit, startVol); - double endState = Units.ConvertFrom(VolumeUnit, endVol); - double err = (refVolume != 0) ? 100.0 * (endState - startState - refVolume) / refVolume : 1000.0; - largeExclamationLabel.Visible = - exclamations[j].Visible = fixedErrorLimits ? ((err < warningLimLo) || (warningLimHi < err)) : ((err < -6) || (+6 < err)); - } - else - { - largeExclamationLabel.Visible = - exclamations[j].Visible = !string.IsNullOrEmpty(textBoxes[endStateColumn, j].Text); - } + UpdateExclamation(j); } else { @@ -827,6 +950,36 @@ namespace TBF.Rig.DataEntry.Uni } } + void UpdateExclamation(int j) + { + double startVol, startVolAux, endVol, endVolAux; + + if (isCompound && startStateColumn >= 0 && Utils.TryParseUDouble(textBoxes[startStateColumn, j].Text, out startVol) && + startStateColumnAux >= 0 && Utils.TryParseUDouble(textBoxes[startStateColumnAux, j].Text, out startVolAux) && + endStateColumn >= 0 && Utils.TryParseUDouble(textBoxes[endStateColumn, j].Text, out endVol) && + endStateColumnAux >= 0 && Utils.TryParseUDouble(textBoxes[endStateColumnAux, j].Text, out endVolAux)) + { + double startState = Units.ConvertFrom(VolumeUnit, startVol + startVolAux); + double endState = Units.ConvertFrom(VolumeUnit, endVol + endVolAux); + double err = (refVolume != 0) ? 100.0 * (endState - startState - refVolume) / refVolume : 1000.0; + largeExclamationLabel.Visible = exclamations[j].Visible = + fixedErrorLimits ? ((err < warningLimLo) || (warningLimHi < err)) : ((err < -6) || (+6 < err)); + } + else if (startStateColumn >= 0 && Utils.TryParseUDouble(textBoxes[startStateColumn, j].Text, out startVol) && + endStateColumn >= 0 && Utils.TryParseUDouble(textBoxes[endStateColumn, j].Text, out endVol)) + { + double startState = Units.ConvertFrom(VolumeUnit, startVol); + double endState = Units.ConvertFrom(VolumeUnit, endVol); + double err = (refVolume != 0) ? 100.0 * (endState - startState - refVolume) / refVolume : 1000.0; + largeExclamationLabel.Visible = exclamations[j].Visible = + fixedErrorLimits ? ((err < warningLimLo) || (warningLimHi < err)) : ((err < -6) || (+6 < err)); + } + else + { + largeExclamationLabel.Visible = exclamations[j].Visible = false; + } + } + private void textBox_MouseDown(object sender, MouseEventArgs e) { textBox_AcceptsTabChanged(sender, e); @@ -898,14 +1051,14 @@ namespace TBF.Rig.DataEntry.Uni /// Handles mouse clicks and Tab-changes inside text boxes. /// /// Tst.Start or Tst.End - /// 0-based WM position - void LoadImage(object sender, Tst startOrEnd, int wmNr0) + /// 0-based WM position + void LoadImage(object sender, Tst startOrEnd, int rrIx) { string imageFileName; - if (startOrEnd == Tst.Start && startImages[wmNr0] != null) - imageFileName = startImages[wmNr0]; - else if (startOrEnd == Tst.End && endImages[wmNr0] != null) - imageFileName = endImages[wmNr0]; + if (startOrEnd == Tst.Start && startImages[rrIx] != null) + imageFileName = startImages[rrIx]; + else if (startOrEnd == Tst.End && endImages[rrIx] != null) + imageFileName = endImages[rrIx]; else imageFileName = string.Empty; @@ -915,7 +1068,7 @@ namespace TBF.Rig.DataEntry.Uni } lastImageName = imageFileName; - lastWmNr1 = wmNr0 + 1; + lastWmNr1 = rrIx + 1; if (string.IsNullOrEmpty(imageFileName) || !File.Exists(imageFileName)) { @@ -923,7 +1076,7 @@ namespace TBF.Rig.DataEntry.Uni } else { - using (Bitmap tempBmp = Image.FromFile(imageFileName) as Bitmap) + using (Bitmap tempBmp = System.Drawing.Image.FromFile(imageFileName) as Bitmap) { Rectangle rect; if (tempBmp.Height < tempBmp.Width)