/// /// Copyright (c) 2013-2022 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Globalization; using System.Windows.Forms; using log4net; using Common; using Common.Forms; using Config.Entities; using TBF.Resources; using TBF.UI.Shared; namespace TBF.UI.Bench.Metrology { public partial class MetrologyDlgBalanceTab : UserControl, IMetrologyDlgTab { static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlgBalanceTab)); public const int SignifDigits = 5; /// /// Component entity that has a list of 'measurement-correction' pairs /// to be updated in the database on OK. /// Component meterEntity; public Component MeterEntity { get { return meterEntity; } set { meterEntity = value; } } /// /// Balance configuration (with buoyancy parameters) /// public Rig.GenericDevices.IScaleCfg BalanceCfg; /// /// A list of 'measurement-correction' pairs to be deleted from the database on OK. /// public IList ToBeRemoved { get { return toBeRemoved; } set { toBeRemoved = value; } } IList toBeRemoved; MetrologyDlg parent; bool unlocked; Control measurementTextBox; Control correctionTextBox; Control errorTextBox; Unit currentUnit; public MetrologyDlgBalanceTab() { InitializeComponent(); calibDateTimePicker.CustomFormat = Constants.DateFormat; calibDateTimePicker.MinDate = Constants.MinDate; calibExpirationDateTimePicker.CustomFormat = Constants.DateFormat; calibExpirationDateTimePicker.MinDate = Constants.MinDate; toBeRemoved = new List(); unlocked = false; } private void MetrologyDlgBalanceTab_Load(object sender, System.EventArgs e) { if (meterEntity == null) return; parent = ParentForm as MetrologyDlg; Localize(); /// Panel1 cmpntNameLabel.Text = meterEntity.Name; for (Unit u = 0; u < Unit.Count; u++) if (Units.IsMass(u)) unitComboBox.Items.Add(u.ToDescription()); /// Panel2 this.Controls.Add(measurementTextBox = new TextBox()); this.Controls.Add(correctionTextBox = new TextBox()); this.Controls.Add(errorTextBox = new TextBox()); currentUnit = TBF.Rig.Sequences.ProcessData.MassUnit; unitComboBox.Text = currentUnit.ToDescription(); InitializeColumns(listViewEx, currentUnit); RefreshAll(); listViewEx.SubItemClicked += new SubItemEventHandler(listViewEx_SubItemClicked); listViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); unitComboBox.SelectedIndexChanged += new System.EventHandler(unitComboBox_SelectedIndexChanged); } void InitializeColumns(ListView lv, Unit unit) { lv.Columns.Clear(); lv.Columns.Add(new ColumnHeader() { Text = Strings.Nr, Width = 40 }); lv.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [{1}]", Strings.Mass, unit.ToDescription()), Width = 120 }); lv.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [{1}]", Strings.Correction, unit.ToDescription()), Width = 150 }); lv.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [%]", Strings.Error), Width = 100 }); measuredLabel.Text = string.Format("{0} [{1}]:", Strings.Measured, unit.ToDescription()); correctedLabel.Text = string.Format("{0} [{1}]:", Strings.Corrected, unit.ToDescription()); measuredTextBox.Text = string.Empty; correctedTextBox.Text = string.Empty; } void Localize() { nameGroupBox.Text = Strings.Component; calibrationGroupBox.Text = Strings.Calibration; calibCertificateNrLabel.Text = Strings.Certificate; calibDateLabel.Text = Strings.Date; calibValidDateLabel.Text = Strings.Valid_until; buoyancyTempLabel.Text = string.Format("{0} [°C]", Strings.Ambient_temperature); buoyancyPressLabel.Text = string.Format("{0} [mbar]", Strings.Ambient_pressure); buoyancyHumiLabel.Text = string.Format("{0} [%]", Strings.Ambient_humidity); airDensityLabel.Text = Strings.Air_density_kg_m3; weightStandardDensityLabel.Text = Strings.Ref_mass_dens_kg_m3; testGroupBox.Text = Strings.Test_measured_corrected; } void RefreshAll() { if (BalanceCfg != null) { calibCertificateNrTextBox.Text = BalanceCfg.CalibCertificateNr; calibDateTimePicker.Value = (BalanceCfg.CalibDate < Constants.MinDate) ? Constants.MinDate : BalanceCfg.CalibDate; calibExpirationDateTimePicker.Value = (BalanceCfg.CalibValidDate < Constants.MinDate) ? Constants.MinDate : BalanceCfg.CalibValidDate; buoyancyTempTextBox.Text = BalanceCfg.BuoyancyTemp.ToString("F2"); buoyancyPressTextBox.Text = BalanceCfg.BuoyancyPress.ToString("F4"); buoyancyHumiTextBox.Text = BalanceCfg.BuoyancyHumi.ToString("F1"); /// airDensityTextBox.Text = //calculate air density weightStandardDensityTextBox.Text = BalanceCfg.WeightStandardDensity.ToString("F1"); } listViewEx.Items.Clear(); foreach (var corr in MeterEntity.Corrections) AddOneLVI(corr); } void AddOneLVI(MeasurementCorrection corr) { int nr = listViewEx.Items.Count + 1; ListViewItem lvi = new ListViewItem(nr.ToString()); lvi.Tag = corr; lvi.SubItems.Add(Units.ConvertTo(currentUnit, corr.Measurement).ToString()); double trueValue = corr.Measurement + corr.Correction; double difference = Units.IsDefaultUnit(currentUnit) ? corr.Correction : Units.ConvertTo(currentUnit, trueValue) - Units.ConvertTo(currentUnit, corr.Measurement); lvi.SubItems.Add(Common.Utils.ToNiceString(difference, SignifDigits)); if (corr.Measurement == 0) { lvi.SubItems.Add(Strings.NaN); } else { double error = Config.Formulas.ErrorFromVolumes(corr.Measurement, trueValue); lvi.SubItems.Add(Common.Utils.ToNiceString(error, SignifDigits)); } listViewEx.Items.Add(lvi); } void listViewEx_SubItemClicked(object sender, SubItemEventArgs e) { if (unlocked && e.SubItem == 1) { listViewEx.StartEditing(measurementTextBox, e.Item, e.SubItem); } else if (unlocked && e.SubItem == 2) { listViewEx.StartEditing(correctionTextBox, e.Item, e.SubItem); } else if (unlocked && e.SubItem == 3) { listViewEx.StartEditing(correctionTextBox, e.Item, e.SubItem); } } void listViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e) { if (ParseItem(e.Item, e.SubItem, e.DisplayText)) return; /// New value is NOK, revert the original text e.DisplayText = e.Item.Text; e.Cancel = true; } /// /// Parse text of a ListViewItem /// /// true = value parsed OK bool ParseItem(ListViewItem item, int subItem, string strValue) { double oriMeasurement; /// Measurement in selected units double measurement; /// Measurement in default units double difference; /// Correction in selected unit double correction; /// Correction in default unit double error = 0; if (subItem == 1 && Utils.TryParseEDouble(strValue, out oriMeasurement) && (measurement = Units.ConvertFrom(currentUnit, oriMeasurement)) >= 0) { (item.Tag as MeasurementCorrection).Measurement = measurement; /// Update error (if possible) if (Utils.TryParseEDouble(item.SubItems[2].Text, out difference) && (measurement != 0)) { correction = Units.IsDefaultUnit(currentUnit) ? difference : Units.ConvertFrom(currentUnit, oriMeasurement + difference) - Units.ConvertFrom(currentUnit, oriMeasurement); error = Config.Formulas.ErrorFromVolumes(measurement, measurement + correction); item.SubItems[3].Text = Common.Utils.ToNiceString(error, SignifDigits); } else { item.SubItems[3].Text = Strings.NaN; } return true; } else if (subItem == 2 && Utils.TryParseEDouble(strValue, out difference)) { if (Utils.TryParseEDouble(item.SubItems[1].Text, out oriMeasurement)) { measurement = Units.ConvertFrom(currentUnit, oriMeasurement); correction = Units.IsDefaultUnit(currentUnit) ? difference : Units.ConvertFrom(currentUnit, oriMeasurement + difference) - Units.ConvertFrom(currentUnit, oriMeasurement); (item.Tag as MeasurementCorrection).Correction = correction; /// Update error (if possible) if (measurement != 0) { error = Config.Formulas.ErrorFromVolumes(measurement, measurement + correction); item.SubItems[3].Text = Common.Utils.ToNiceString(error, SignifDigits); } else { item.SubItems[3].Text = Strings.NaN; } return true; } else { return false; } } else if (subItem == 3 && ((strValue == Strings.NaN) || Utils.TryParseEDouble(strValue, out error))) { if (strValue == Strings.NaN) { } else { if (Utils.TryParseEDouble(item.SubItems[1].Text, out oriMeasurement) && (measurement = Units.ConvertFrom(currentUnit, oriMeasurement)) != 0) { correction = Config.Formulas.CorrectionFromError(measurement, error); (item.Tag as MeasurementCorrection).Correction = correction; difference = Units.IsDefaultUnit(currentUnit) ? correction : Units.ConvertTo(currentUnit, measurement + correction) - oriMeasurement; item.SubItems[2].Text = Common.Utils.ToNiceString(difference, SignifDigits); } } return true; } else { return false; } } public void Unlock() { unlocked = true; calibCertificateNrTextBox.Enabled = true; calibDateTimePicker.Enabled = true; calibExpirationDateTimePicker.Enabled = true; buoyancyTempTextBox.Enabled = true; buoyancyPressTextBox.Enabled = true; buoyancyHumiTextBox.Enabled = true; weightStandardDensityTextBox.Enabled = true; if (listViewEx.SelectedItems.Count == 1) { int ix = listViewEx.SelectedIndices[0]; listViewEx.Focus(); listViewEx.Items[ix].Selected = true; listViewEx.Items[ix].EnsureVisible(); } } public void OkBtnClicked() { if (BalanceCfg != null) { try { BalanceCfg.CalibCertificateNr = calibCertificateNrTextBox.Text; BalanceCfg.CalibDate = calibDateTimePicker.Value.Date; BalanceCfg.CalibValidDate = calibExpirationDateTimePicker.Value.Date; BalanceCfg.BuoyancyTemp = Utils.ParseSFloat(buoyancyTempTextBox.Text); BalanceCfg.BuoyancyPress = Utils.ParseUFloat(buoyancyPressTextBox.Text); BalanceCfg.BuoyancyHumi = Utils.ParseUFloat(buoyancyHumiTextBox.Text); BalanceCfg.WeightStandardDensity = Utils.ParseUFloat(weightStandardDensityTextBox.Text); Component modified = BalanceCfg.CreateDbEntity(); MeterEntity.Parameters = modified.Parameters; } catch { MessageBox.Show(Strings.Invalid_buoyancy_parameter_Correct_pls, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } public void CancelBtnClicked() { } public void AddOne() { MeasurementCorrection corr = new MeasurementCorrection(); MeterEntity.Corrections.Add(corr); AddOneLVI(corr); listViewEx.Focus(); listViewEx.SelectedItems.Clear(); listViewEx.Items[listViewEx.Items.Count - 1].Selected = true; listViewEx.Items[listViewEx.Items.Count - 1].EnsureVisible(); } public void RemoveSelected() { if (listViewEx.SelectedItems.Count != 1) return; int removeItemNr = listViewEx.SelectedIndices[0]; MeasurementCorrection selected = (MeasurementCorrection)listViewEx.SelectedItems[0].Tag; if (selected.Id != 0) toBeRemoved.Add(selected); MeterEntity.Corrections.RemoveAt(removeItemNr); RefreshAll(); if (removeItemNr < listViewEx.Items.Count) { listViewEx.Focus(); listViewEx.Items[removeItemNr].Selected = true; listViewEx.Items[removeItemNr].EnsureVisible(); } else { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); } } public void MoveUpSelected() { } public void MoveDownSelected() { } /// /// Event handler that indicates the selected item position /// and updates 'Remove', 'Up' and 'Down' buttons in the parent dialog. /// private void listViewEx_SelectedIndexChanged(object sender, EventArgs e) { if (listViewEx.SelectedItems.Count != 1) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); } else if (listViewEx.Items.Count == 1) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast); } else if (listViewEx.SelectedIndices[0] == 0) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.First); } else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Last); } else { parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Middle); } } private void measuredTextBox_TextChanged(object sender, EventArgs e) { double measured; if (double.TryParse(measuredTextBox.Text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out measured) || double.TryParse(measuredTextBox.Text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out measured)) { var corrections = new List(); foreach (var c in meterEntity.Corrections) corrections.Add(c); corrections.Sort(); double corrected = MeasurementCorrection.CorrectedValue(Units.ConvertFrom(currentUnit, measured), corrections); correctedTextBox.Text = Units.ConvertTo(currentUnit, corrected).ToString(); } } public string GetWarningsBeforeSaving(ref Dictionary renmInfo) { return string.Empty; } public void UpdateRelatedItems(Dictionary renameInfo) { } public void SaveEntityToDB(NHibernate.ISession session) { session.SaveOrUpdate(MeterEntity); } private void unitComboBox_SelectedIndexChanged(object sender, EventArgs e) { for (Unit u = 0; u < Unit.Count; u++) { if (u.ToDescription() == unitComboBox.Text) { currentUnit = u; break; } } InitializeColumns(listViewEx, currentUnit); RefreshAll(); } } }